diff options
| author | yum <yum.food.vr@gmail.com> | 2022-10-24 22:08:06 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2022-10-24 22:08:06 -0700 |
| commit | 08655f96dc798e3e129058a5e97c5aa7ff96e798 (patch) | |
| tree | b2543852ec52fec22319f562a737e48e95681b37 | |
| parent | 4b0d262f4630538cc04f6e8bda407fe3f3ba213b (diff) | |
STT now beeps when it shows text, and can be locked to world
Empty cells are excluded from the beeping behavior. Note: I have not
checked in the prefab with the audio source yet.
* libtastt gen_fx now adds 3 toggles to FX layer: toggle board, toggle world
lock, toggle beep sound
* libunity guid_map can now append instead of replacing
* TaSTT_Toggle_{On,Off}.anim now use the prefab path, as do generated
animations
| -rw-r--r-- | Animations/TaSTT_Toggle_Off.anim | 4 | ||||
| -rw-r--r-- | Animations/TaSTT_Toggle_On.anim | 4 | ||||
| -rw-r--r-- | Examples/FX_no_write_defaults.controller | 2 | ||||
| -rw-r--r-- | dev_cheatsheat.txt | 2 | ||||
| -rw-r--r-- | generate_params.py | 6 | ||||
| -rw-r--r-- | generate_utils.py | 7 | ||||
| -rw-r--r-- | libtastt.py | 53 | ||||
| -rw-r--r-- | libunity.py | 8 | ||||
| -rw-r--r-- | osc_ctrl.py | 14 |
9 files changed, 93 insertions, 7 deletions
diff --git a/Animations/TaSTT_Toggle_Off.anim b/Animations/TaSTT_Toggle_Off.anim index 7a604bc..644379f 100644 --- a/Animations/TaSTT_Toggle_Off.anim +++ b/Animations/TaSTT_Toggle_Off.anim @@ -42,7 +42,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_IsActive - path: TaSTT + path: World Constraint/Container/TaSTT classID: 1 script: {fileID: 0} m_PPtrCurves: [] @@ -107,7 +107,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_IsActive - path: TaSTT + path: World Constraint/Container/TaSTT classID: 1 script: {fileID: 0} m_EulerEditorCurves: [] diff --git a/Animations/TaSTT_Toggle_On.anim b/Animations/TaSTT_Toggle_On.anim index 667cfdf..97ca5e4 100644 --- a/Animations/TaSTT_Toggle_On.anim +++ b/Animations/TaSTT_Toggle_On.anim @@ -42,7 +42,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_IsActive - path: TaSTT + path: World Constraint/Container/TaSTT classID: 1 script: {fileID: 0} m_PPtrCurves: [] @@ -107,7 +107,7 @@ AnimationClip: m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_IsActive - path: TaSTT + path: World Constraint/Container/TaSTT classID: 1 script: {fileID: 0} m_EulerEditorCurves: [] diff --git a/Examples/FX_no_write_defaults.controller b/Examples/FX_no_write_defaults.controller index 1ee52b8..5136e82 100644 --- a/Examples/FX_no_write_defaults.controller +++ b/Examples/FX_no_write_defaults.controller @@ -6,7 +6,7 @@ AnimatorController: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: FX2 + m_Name: FX_no_write_defaults serializedVersion: 5 m_AnimatorParameters: - m_Name: GestureLeftWeight diff --git a/dev_cheatsheat.txt b/dev_cheatsheat.txt index e23b8cc..db9697f 100644 --- a/dev_cheatsheat.txt +++ b/dev_cheatsheat.txt @@ -10,7 +10,7 @@ Combining TaSTT_fx with a normal animator date rm -rf generated/animations ./libunity.py guid_map --project_root=$(cd ..; pwd) --save_to guid.map -./libtastt.py gen_anims +#./libtastt.py gen_anims ./libtastt.py gen_fx > TaSTT_fx.controller ./libunity.py merge --fx0 ../FXGeneric.controller --fx1 ../FXSpecific.controller > FX0.controller ./libunity.py add_toggle --fx0 FX0.controller > FX1.controller diff --git a/generate_params.py b/generate_params.py index d91e801..782fdb4 100644 --- a/generate_params.py +++ b/generate_params.py @@ -63,6 +63,12 @@ print(generate_utils.replaceMacros(BOOL_PARAM, params)) params["PARAM_NAME"] = generate_utils.getToggleParam() print(generate_utils.replaceMacros(BOOL_PARAM, params)) +params["PARAM_NAME"] = generate_utils.getSpeechNoiseToggleParam() +print(generate_utils.replaceMacros(BOOL_PARAM, params)) + +params["PARAM_NAME"] = generate_utils.getLockWorldParam() +print(generate_utils.replaceMacros(BOOL_PARAM, params)) + for i in range(0, generate_utils.NUM_LAYERS): params["PARAM_NAME"] = generate_utils.getLayerParam(i) print(generate_utils.replaceMacros(INT_PARAM, params)) diff --git a/generate_utils.py b/generate_utils.py index e066eb1..df08953 100644 --- a/generate_utils.py +++ b/generate_utils.py @@ -12,7 +12,6 @@ def replaceMacros(lines, macro_defs): BOARD_ROWS=8 BOARD_COLS=22 INDEX_BITS=4 -#CHARS_PER_CELL=4 CHARS_PER_CELL=80 NUM_LAYERS=ceil((BOARD_ROWS * BOARD_COLS) / (2**INDEX_BITS)) @@ -46,6 +45,12 @@ def getHandToggleParam(): def getToggleParam(): return "TaSTT_Toggle" +def getSpeechNoiseToggleParam(): + return "TaSTT_Speech_Noise_Toggle" + +def getLockWorldParam(): + return "TaSTT_Lock_World" + # Each layer controls a group of cells. There's only one letter per layer, thus # this is also the name of the parameter which sets the letter for a layer. def getLayerParam(which_layer: int) -> str: diff --git a/libtastt.py b/libtastt.py index 9492e35..12c95f0 100644 --- a/libtastt.py +++ b/libtastt.py @@ -170,6 +170,7 @@ def generateAnimations(anim_dir, guid_map): keyframe.mapping['value'] = str(letter + 0.1) # Populate path to letter parameter curve.mapping['attribute'] = "material.{}".format(generate_utils.getShaderParamByRowCol(row, col)) + curve.mapping['path'] = "World Constraint/Container/TaSTT" # Add curve to animation clip.mapping['m_FloatCurves'].sequence.append(curve) clip.mapping['m_EditorCurves'].sequence.append(curve) @@ -332,6 +333,42 @@ def generateFXLayer(which_layer: int, anim: libunity.UnityAnimator, layer: dummy_param = generate_utils.getDummyParam() anim.addTransitionBooleanCondition(state, home_state_transition, dummy_param, False) + pass + +# Generic toggle adding utility. +# Generates the layer and parameter. +def generateToggle(layer_name: str, + gen_anim_dir: str, + off_anim_basename: str, + on_anim_basename: str, + anim: libunity.UnityAnimator): + layer = anim.addLayer(layer_name) + + # For simplicity, use the layer name as the parameter name. + parameter_name = layer_name + anim.addParameter(parameter_name, bool) + + off_state = anim.addAnimatorState(layer, layer_name + "_Off", + is_default_state = True) + on_state = anim.addAnimatorState(layer, layer_name + "_On", dy=100) + + off_anim_path = gen_anim_dir + off_anim_basename + off_anim_meta = libunity.Metadata() + off_anim_meta.load(off_anim_path) + on_anim_path = gen_anim_dir + on_anim_basename + on_anim_meta = libunity.Metadata() + on_anim_meta.load(on_anim_path) + + anim.setAnimatorStateAnimation(off_state, off_anim_meta.guid) + anim.setAnimatorStateAnimation(on_state, on_anim_meta.guid) + + off_to_on_trans = anim.addTransition(on_state) + anim.addTransitionBooleanCondition(off_state, + off_to_on_trans, parameter_name, True) + + on_to_off_trans = anim.addTransition(off_state) + anim.addTransitionBooleanCondition(on_state, + on_to_off_trans, parameter_name, False) pass @@ -345,6 +382,22 @@ def generateFX(guid_map, gen_anim_dir): print("Generating layer {}/{}".format(which_layer, len(layers.items())), file=sys.stderr) generateFXLayer(which_layer, anim, layer, gen_anim_dir) + generateToggle(generate_utils.getSpeechNoiseToggleParam(), + "Animations/", + "TaSTT_Speech_Noise_Off.anim", + "TaSTT_Speech_Noise_On.anim", + anim) + generateToggle(generate_utils.getToggleParam(), + "Animations/", + "TaSTT_Toggle_Off.anim", + "TaSTT_Toggle_On.anim", + anim) + generateToggle(generate_utils.getLockWorldParam(), + "Animations/", + "TaSTT_Lock_World_Disable.anim", + "TaSTT_Lock_World_Enable.anim", + anim) + return anim def parseArgs(): diff --git a/libunity.py b/libunity.py index 486df9f..dcf3b69 100644 --- a/libunity.py +++ b/libunity.py @@ -1120,6 +1120,8 @@ if __name__ == "__main__": "result of the computation") parser.add_argument("--guid_map", type=str, help="Path to guid.map, " + "generated by a previous call to `guid_map`") + parser.add_argument("--guid_map_append", type=bool, help="If set, " + + "append to GUID map instead of overwriting.") args = parser.parse_args() if args.cmd == "merge": @@ -1152,6 +1154,12 @@ if __name__ == "__main__": print("Looking up GUIDs under {}".format(args.project_root), file=sys.stderr) guid_map = getGuidMap(args.project_root) + if args.guid_map_append: + tmp_map = {} + with open(args.save_to, "rb") as f: + tmp_map = pickle.load(f) + # combine guid_map and tmp_map + guid_map = {**guid_map, **tmp_map} print("Saving to {}".format(args.save_to), file=sys.stderr) with open(args.save_to, 'wb') as f: pickle.dump(guid_map, f) diff --git a/osc_ctrl.py b/osc_ctrl.py index 14f4ba5..4ef238e 100644 --- a/osc_ctrl.py +++ b/osc_ctrl.py @@ -99,6 +99,12 @@ def sendMessageCellDiscrete(client, msg_cell, which_cell): # Disable each layer. disable(client) + empty_cell = [state.encoding[' ']] * NUM_LAYERS + if msg_cell != state.encoding[' '] * BOARD_COLS: + addr="/avatar/parameters/" + generate_utils.getSpeechNoiseToggleParam() + client.send_message(addr, False) + print("beep") + time.sleep(CELL_TX_TIME_S / 3.0) # Really long messages just wrap back around. @@ -112,6 +118,14 @@ def sendMessageCellDiscrete(client, msg_cell, which_cell): # Seek each layer to the current cell. for i in range(0, len(msg_cell)): updateCell(client, i, msg_cell[i], s0, s1, s2, s3) + if msg_cell != empty_cell: + addr="/avatar/parameters/" + generate_utils.getSpeechNoiseToggleParam() + client.send_message(addr, False) + + # If we're drawing something, turn the beep on. + if msg_cell != empty_cell: + addr="/avatar/parameters/" + generate_utils.getSpeechNoiseToggleParam() + client.send_message(addr, True) # Wait for convergence. time.sleep(CELL_TX_TIME_S / 3.0) |
