summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2022-11-01 19:26:53 -0700
committeryum <yum.food.vr@gmail.com>2022-11-01 19:26:53 -0700
commiteb3fecd09f18233ba9e145a9092a7eb38ff965b8 (patch)
tree51d4bfb158e5fef63febc9d52ef9926de9366c37
parentd0120a858c2fd76bf5b5271ba5275e50565f109d (diff)
Combine 4 boolean select parameters into one
Should further improve reliability, especially in laggy environments. We'll see!
-rw-r--r--generate_params.py13
-rw-r--r--generate_utils.py33
-rw-r--r--libtastt.py151
-rw-r--r--osc_ctrl.py18
4 files changed, 61 insertions, 154 deletions
diff --git a/generate_params.py b/generate_params.py
index e9b29d5..f1be1dd 100644
--- a/generate_params.py
+++ b/generate_params.py
@@ -72,17 +72,8 @@ print(generate_utils.replaceMacros(BOOL_PARAM, params))
params["PARAM_NAME"] = generate_utils.getClearBoardParam()
print(generate_utils.replaceMacros(BOOL_PARAM, params))
-params["PARAM_NAME"] = generate_utils.getSelectParam(0)
-print(generate_utils.replaceMacros(BOOL_PARAM, params))
-
-params["PARAM_NAME"] = generate_utils.getSelectParam(1)
-print(generate_utils.replaceMacros(BOOL_PARAM, params))
-
-params["PARAM_NAME"] = generate_utils.getSelectParam(2)
-print(generate_utils.replaceMacros(BOOL_PARAM, params))
-
-params["PARAM_NAME"] = generate_utils.getSelectParam(3)
-print(generate_utils.replaceMacros(BOOL_PARAM, params))
+params["PARAM_NAME"] = generate_utils.getSelectParam()
+print(generate_utils.replaceMacros(INT_PARAM, params))
for i in range(0, generate_utils.NUM_LAYERS):
params["PARAM_NAME"] = generate_utils.getLayerParam(i)
diff --git a/generate_utils.py b/generate_utils.py
index 78ff512..2fa2077 100644
--- a/generate_utils.py
+++ b/generate_utils.py
@@ -75,41 +75,32 @@ def getDefaultStateName(which_layer):
def getActiveStateName(which_layer):
return "TaSTT_L%02d_Active" % which_layer
-def getS0StateName(which_layer, s0):
- return "TaSTT_L%02d_S%02d" % (which_layer, s0)
+def getSelectStateName(which_layer, select):
+ return "TaSTT_L%02d_S%02d" % (which_layer, select)
-def getS1StateName(which_layer, s0, s1):
- return "TaSTT_L%02d_S%02d_S%02d" % (which_layer, s0, s1)
+def getLetterStateName(which_layer, select, letter):
+ return "TaSTT_L%02d_S%02d_L%03d" % (which_layer, select, letter)
-def getS2StateName(which_layer, s0, s1, s2):
- return "TaSTT_L%02d_S%02d_S%02d_S%02d" % (which_layer, s0, s1, s2)
-
-def getS3StateName(which_layer, s0, s1, s2, s3):
- return "TaSTT_L%02d_S%02d_S%02d_S%02d_S%02d" % (which_layer, s0, s1, s2, s3)
-
-def getLetterStateName(which_layer, s0, s1, s2, s3, letter):
- return "TaSTT_L%02d_S%02d_S%02d_S%02d_S%02d_L%03d" % (which_layer, s0, s1, s2, s3, letter)
-
-def getSelectParam(which_select: int) -> str:
- return "TaSTT_S%02d" % (which_select)
+def getSelectParam() -> str:
+ return "TaSTT_Select"
def getEnableParam():
return "TaSTT_Enable"
-def getBoardIndex(which_layer, s0, s1, s2, s3):
+def getBoardIndex(which_layer, select):
# Because we divide the board into a multiple of 8 cells, some cells may
# describe animations which don't exist, depending on the size of the board.
# We work around this by simply wrapping those animations back to the top
# of the board, and rely on the OSC controller to simply not reference
# those cells.
- return ((s0 * 8 + s1 * 4 + s2 * 2 + s3) * NUM_LAYERS + which_layer) % (BOARD_ROWS * BOARD_COLS)
+ return (select * NUM_LAYERS + which_layer) % (BOARD_ROWS * BOARD_COLS)
def getShaderParamByRowCol(row, col):
return "_Letter_Row%02d_Col%02d" % (row, col)
# Mapping from layer to shader param.
-def getShaderParam(which_layer, s0, s1, s2, s3):
- index = getBoardIndex(which_layer, s0, s1, s2, s3)
+def getShaderParam(which_layer, select):
+ index = getBoardIndex(which_layer, select)
col = index % BOARD_COLS
row = floor(index / BOARD_COLS)
@@ -125,8 +116,8 @@ def getLetterAnimationName(row, col, letter):
def getClearAnimationName():
return "TaSTT_Clear_Board"
-def getAnimationNameByLayerAndIndex(which_layer, s0, s1, s2, s3, letter):
- index = getBoardIndex(which_layer, s0, s1, s2, s3)
+def getAnimationNameByLayerAndIndex(which_layer, select, letter):
+ index = getBoardIndex(which_layer, select)
col = index % BOARD_COLS
row = floor(index / BOARD_COLS)
diff --git a/libtastt.py b/libtastt.py
index 4fc273b..1ef2837 100644
--- a/libtastt.py
+++ b/libtastt.py
@@ -259,8 +259,7 @@ def generateFXController(anim: libunity.UnityAnimator) -> typing.Dict[int, libun
layer = anim.addLayer(generate_utils.getLayerName(i))
layers[i] = layer
- for i in range(0, generate_utils.INDEX_BITS):
- anim.addParameter(generate_utils.getSelectParam(i), bool)
+ anim.addParameter(generate_utils.getSelectParam(), int)
return layers
@@ -279,113 +278,53 @@ def generateFXLayer(which_layer: int, anim: libunity.UnityAnimator, layer:
anim.addTransitionBooleanCondition(default_state, active_state_transition,
enable_param, True)
- s0_states = {}
- for s0 in range(0,2):
- dx = s0 * 200
+ select_states = {}
+ for i in range(0, 2 ** generate_utils.INDEX_BITS):
+ dx = i * 200
dy = 200
- s0_states[s0] = anim.addAnimatorState(layer,
- generate_utils.getS0StateName(which_layer, s0),
- dx = dx, dy = dy)
- state = s0_states[s0]
-
- s0_state_transition = anim.addTransition(state)
- s0_param = generate_utils.getSelectParam(0)
- anim.addTransitionBooleanCondition(active_state, s0_state_transition,
- s0_param, s0 != 0)
-
- s1_states = {}
- for s0 in range(0,2):
- s1_states[s0] = {}
- for s1 in range(0,2):
- dx = ((s0 << 1) | (s1)) * 200
- dy = 300
- s1_states[s0][s1] = anim.addAnimatorState(layer,
- generate_utils.getS1StateName(which_layer, s0, s1),
- dx = dx, dy = dy)
- state = s1_states[s0][s1]
-
- s1_state_transition = anim.addTransition(state)
- s1_param = generate_utils.getSelectParam(1)
- anim.addTransitionBooleanCondition(s0_states[s0], s1_state_transition,
- s1_param, s1 != 0)
-
- s2_states = {}
- for s0 in range(0,2):
- s2_states[s0] = {}
- for s1 in range(0,2):
- s2_states[s0][s1] = {}
- for s2 in range(0,2):
- dx = ((s0 << 2) | (s1 << 1) | (s2)) * 200
- dy = 400
- s2_states[s0][s1][s2] = anim.addAnimatorState(layer,
- generate_utils.getS2StateName(which_layer, s0, s1, s2),
- dx = dx, dy = dy)
- state = s2_states[s0][s1][s2]
-
- s2_state_transition = anim.addTransition(state)
- s2_param = generate_utils.getSelectParam(2)
- anim.addTransitionBooleanCondition(s1_states[s0][s1], s2_state_transition,
- s2_param, s2 != 0)
-
- s3_states = {}
- for s0 in range(0,2):
- s3_states[s0] = {}
- for s1 in range(0,2):
- s3_states[s0][s1] = {}
- for s2 in range(0,2):
- s3_states[s0][s1][s2] = {}
- for s3 in range(0,2):
- dx = ((s0 << 3) | (s1 << 2) | (s2 << 1) | (s3)) * 200
- dy = 500
- s3_states[s0][s1][s2][s3] = anim.addAnimatorState(layer,
- generate_utils.getS3StateName(which_layer, s0, s1, s2, s3),
- dx = dx, dy = dy)
- state = s3_states[s0][s1][s2][s3]
-
- s3_state_transition = anim.addTransition(state)
- s3_param = generate_utils.getSelectParam(3)
- anim.addTransitionBooleanCondition(s2_states[s0][s1][s2], s3_state_transition,
- s3_param, s3 != 0)
+
+ select_states[i] = anim.addAnimatorState(layer,
+ generate_utils.getSelectStateName(which_layer, i), dx = dx, dy = dy)
+ state = select_states[i]
+
+ select_state_transition = anim.addTransition(state)
+ select_param = generate_utils.getSelectParam()
+ anim.addTransitionIntegerEqualityCondition(active_state,
+ select_state_transition, select_param, i)
l_states = {} # shorthand for `letter_states`
- for s0 in range(0,2):
- l_states[s0] = {}
- for s1 in range(0,2):
- l_states[s0][s1] = {}
- for s2 in range(0,2):
- l_states[s0][s1][s2] = {}
- for s3 in range(0,2):
- l_states[s0][s1][s2][s3] = {}
- for letter in range(0, generate_utils.CHARS_PER_CELL):
- dy = 600
- l_states[s0][s1][s2][s3][letter] = anim.addAnimatorState(layer,
- generate_utils.getLetterStateName(which_layer,
- s0, s1, s2, s3, letter),
- dy = dy)
- state = l_states[s0][s1][s2][s3][letter]
-
- animation_path = gen_anim_dir + \
- generate_utils.getAnimationNameByLayerAndIndex(
- which_layer, s0, s1, s2, s3, letter) + \
- ".anim"
- guid = guid_map[animation_path]
- anim.setAnimatorStateAnimation(state, guid)
-
- # TODO(yum) see if we can get away with reusing the
- # same transition object, but just stitch it into every
- # state.
- l_state_transition = anim.addTransition(state)
- l_param = generate_utils.getLayerParam(which_layer)
- #print("add condition on letter {}".format(letter),
- # file=sys.stderr)
- anim.addTransitionIntegerEqualityCondition(s3_states[s0][s1][s2][s3],
- l_state_transition, l_param, letter)
-
- home_state_transition = anim.addTransition(default_state)
- home_state_transition.mapping['AnimatorStateTransition'].mapping['m_InterruptionSource'] = '0'
- dummy_param = generate_utils.getDummyParam()
- anim.addTransitionBooleanCondition(state,
- home_state_transition, dummy_param, False)
+ for i in range(0, 2 ** generate_utils.INDEX_BITS):
+ l_states[i] = {}
+ for letter in range(0, generate_utils.CHARS_PER_CELL):
+ dy = 300
+ l_states[i][letter] = anim.addAnimatorState(layer,
+ generate_utils.getLetterStateName(which_layer,
+ i, letter),
+ dy = dy)
+ state = l_states[i][letter]
+
+ animation_path = gen_anim_dir + \
+ generate_utils.getAnimationNameByLayerAndIndex(
+ which_layer, i, letter) + \
+ ".anim"
+ guid = guid_map[animation_path]
+ anim.setAnimatorStateAnimation(state, guid)
+
+ # TODO(yum) see if we can get away with reusing the
+ # same transition object, but just stitch it into every
+ # state.
+ l_state_transition = anim.addTransition(state)
+ l_param = generate_utils.getLayerParam(which_layer)
+ #print("add condition on letter {}".format(letter),
+ # file=sys.stderr)
+ anim.addTransitionIntegerEqualityCondition(select_states[i],
+ l_state_transition, l_param, letter)
+
+ home_state_transition = anim.addTransition(default_state)
+ home_state_transition.mapping['AnimatorStateTransition'].mapping['m_InterruptionSource'] = '0'
+ dummy_param = generate_utils.getDummyParam()
+ anim.addTransitionBooleanCondition(state,
+ home_state_transition, dummy_param, False)
pass
# Generic toggle adding utility.
diff --git a/osc_ctrl.py b/osc_ctrl.py
index 4f888c3..8dfe124 100644
--- a/osc_ctrl.py
+++ b/osc_ctrl.py
@@ -101,23 +101,9 @@ def sendMessageCellDiscrete(client, msg_cell, which_cell):
# Really long messages just wrap back around.
which_cell = (which_cell % (2 ** generate_utils.INDEX_BITS))
- s0 = ((floor(which_cell / 8) % 2) == 1)
- s1 = ((floor(which_cell / 4) % 2) == 1)
- s2 = ((floor(which_cell / 2) % 2) == 1)
- s3 = ((floor(which_cell / 1) % 2) == 1)
-
# Seek to the current cell.
- addr="/avatar/parameters/" + getSelectParam(0)
- client.send_message(addr, s0)
-
- addr="/avatar/parameters/" + getSelectParam(1)
- client.send_message(addr, s1)
-
- addr="/avatar/parameters/" + getSelectParam(2)
- client.send_message(addr, s2)
-
- addr="/avatar/parameters/" + getSelectParam(3)
- client.send_message(addr, s3)
+ addr="/avatar/parameters/" + getSelectParam()
+ client.send_message(addr, which_cell)
# Update each letter
for i in range(0, len(msg_cell)):