diff options
| author | yum <yum.food.vr@gmail.com> | 2022-11-01 19:26:53 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2022-11-01 19:26:53 -0700 |
| commit | eb3fecd09f18233ba9e145a9092a7eb38ff965b8 (patch) | |
| tree | 51d4bfb158e5fef63febc9d52ef9926de9366c37 | |
| parent | d0120a858c2fd76bf5b5271ba5275e50565f109d (diff) | |
Combine 4 boolean select parameters into one
Should further improve reliability, especially in laggy environments.
We'll see!
| -rw-r--r-- | generate_params.py | 13 | ||||
| -rw-r--r-- | generate_utils.py | 33 | ||||
| -rw-r--r-- | libtastt.py | 151 | ||||
| -rw-r--r-- | osc_ctrl.py | 18 |
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)): |
