diff options
| -rw-r--r-- | TaSTT.fbx | bin | 18044 -> 18172 bytes | |||
| -rw-r--r-- | TaSTT_Menu.asset | 11 | ||||
| -rw-r--r-- | generate_params.py | 8 | ||||
| -rw-r--r-- | generate_utils.py | 3 | ||||
| -rw-r--r-- | libtastt.py | 68 | ||||
| -rw-r--r-- | libunity.py | 8 |
6 files changed, 95 insertions, 3 deletions
| Binary files differ diff --git a/TaSTT_Menu.asset b/TaSTT_Menu.asset index 3f8eeb5..77628bd 100644 --- a/TaSTT_Menu.asset +++ b/TaSTT_Menu.asset @@ -43,3 +43,14 @@ MonoBehaviour: subMenu: {fileID: 0} subParameters: [] labels: [] + - name: Scale + icon: {fileID: 0} + type: 203 + parameter: + name: + value: 1 + style: 0 + subMenu: {fileID: 0} + subParameters: + - name: TaSTT_Scale + labels: [] diff --git a/generate_params.py b/generate_params.py index 48ee252..323502c 100644 --- a/generate_params.py +++ b/generate_params.py @@ -38,13 +38,14 @@ FLOAT_PARAM = """ - name: %PARAM_NAME% valueType: 1 saved: 0 - defaultValue: 0 + defaultValue: %DEFAULT_FLOAT% """[1:][0:-1] # We're working with an 84-character board, and each FX layer is responsible # for 8 of those characters. params = {} params["SAVED"] = "0" +params["DEFAULT_FLOAT"] = "0" print(generate_utils.replaceMacros(PARAM_HEADER, params)) params["PARAM_NAME"] = generate_utils.getDummyParam() @@ -59,6 +60,11 @@ print(generate_utils.replaceMacros(BOOL_PARAM, params)) params["PARAM_NAME"] = generate_utils.getIndicator1Param() print(generate_utils.replaceMacros(BOOL_PARAM, params)) +params["PARAM_NAME"] = generate_utils.getScaleParam() +params["DEFAULT_FLOAT"] = "0.2" +print(generate_utils.replaceMacros(FLOAT_PARAM, params)) +params["DEFAULT_FLOAT"] = "0" + params["PARAM_NAME"] = generate_utils.getToggleParam() print(generate_utils.replaceMacros(BOOL_PARAM, params)) diff --git a/generate_utils.py b/generate_utils.py index 0758be0..e8c60b8 100644 --- a/generate_utils.py +++ b/generate_utils.py @@ -37,6 +37,9 @@ def getHandToggleParam(): def getToggleParam(): return "TaSTT_Toggle" +def getScaleParam(): + return "TaSTT_Scale" + # When this is set to true, the board will emit a soft beep sound. It's used to # grab attention when speaking. def getSpeechNoiseToggleParam(): diff --git a/libtastt.py b/libtastt.py index 395d339..36ccec7 100644 --- a/libtastt.py +++ b/libtastt.py @@ -232,6 +232,48 @@ def generateToggleAnimations(anim_dir, shader_param, guid_map): guid_map[anim_path] = meta.guid guid_map[meta.guid] = anim_path +# Generate a toggle animation for a shader parameter. +def generateFloatAnimation(anim_name: str, anim_dir: str, + path: str, attribute: str, + value: float, + guid_map: typing.Dict[str, str]) -> str: + print("Generating float toggle animation {}/{}".format(path,attribute), + file=sys.stderr) + + parser = libunity.UnityParser() + parser.parse(LETTER_ANIMATION_TEMPLATE) + + # 0.0 represents false, 1.0 represents true. Don't forget that we add + # `UNITY_ANIMATION_FUDGE_MARGIN` to everything. + anim_node = parser.nodes[0] + anim_clip = anim_node.mapping['AnimationClip'] + curve_template = anim_clip.mapping['m_FloatCurves'].sequence[0] + anim_clip.mapping['m_FloatCurves'].sequence = [] + anim_clip.mapping['m_EditorCurves'].sequence = [] + + curve = curve_template.copy() + for keyframe in curve.mapping['curve'].mapping['m_Curve'].sequence: + keyframe.mapping['value'] = str(value) + curve.mapping['attribute'] = attribute + curve.mapping['path'] = path + # Add curve to animation + anim_clip.mapping['m_FloatCurves'].sequence.append(curve) + anim_clip.mapping['m_EditorCurves'].sequence.append(curve) + + # Serialize animation to file + anim_path = anim_dir + anim_name + ".anim" + with open(anim_path, "w") as f: + f.write(libunity.unityYamlToString([anim_node])) + # Generate metadata + meta = libunity.Metadata() + with open(anim_path + ".meta", "w") as f: + f.write(str(meta)) + # Add metadata to guid map + guid_map[anim_path] = meta.guid + guid_map[meta.guid] = anim_path + + return meta.guid + def generateAnimations(anim_dir, guid_map): generateClearAnimation(args.gen_anim_dir, guid_map) @@ -301,6 +343,7 @@ def generateFXController(anim: libunity.UnityAnimator) -> typing.Dict[int, libun anim.addParameter(generate_utils.getClearBoardParam(), bool) anim.addParameter(generate_utils.getIndicator0Param(), bool) anim.addParameter(generate_utils.getIndicator1Param(), bool) + anim.addParameter(generate_utils.getScaleParam(), float) layers = {} for byte in range(0, generate_utils.BYTES_PER_CHAR): @@ -414,6 +457,30 @@ def generateToggle(layer_name: str, return result +def generateScaleLayer(anim: libunity.UnityAnimator, + gen_anim_dir: str, + guid_map: typing.Dict[str, str]): + + scale_layer = anim.addLayer(generate_utils.getScaleParam()) + + path = "World Constraint/Container/TaSTT" + attribute = "blendShape.Scale" + + guid_lo = generateFloatAnimation("TaSTT_Scale_0", gen_anim_dir, + path, attribute, + 0.0, guid_map) + guid_hi = generateFloatAnimation("TaSTT_Scale_100", gen_anim_dir, + path, attribute, + 100.0, guid_map) + + anim.addAnimatorBlendTree(scale_layer, + generate_utils.getScaleParam(), + generate_utils.getScaleParam(), + guid_lo, guid_hi, + lo_threshold = 0.0, hi_threshold = 1.0); + + pass + def generateFX(guid_map, gen_anim_dir): anim = libunity.UnityAnimator() @@ -464,6 +531,7 @@ def generateFX(guid_map, gen_anim_dir): generate_utils.getIndicator1Param() + "_Off.anim", generate_utils.getIndicator1Param() + "_On.anim", anim) + generateScaleLayer(anim, gen_anim_dir, guid_map) return anim diff --git a/libunity.py b/libunity.py index 9380a6c..94e5ef2 100644 --- a/libunity.py +++ b/libunity.py @@ -674,7 +674,9 @@ class UnityAnimator(): # between anim_lo and anim_hi. Also creates the corresponding animation # state. def addAnimatorBlendTree(self, layer, state_name, param_name, - anim_guid_lo, anim_guid_hi, dx = 0, dy = 0) -> UnityDocument: + anim_guid_lo, anim_guid_hi, dx = 0, dy = 0, + lo_threshold = -1.0, hi_threshold = 1.0, + is_default_state = False) -> UnityDocument: # Create the blend tree. parser = UnityParser() parser.parse(BLEND_TREE_TEMPLATE) @@ -690,9 +692,11 @@ class UnityAnimator(): # Low animation tree.mapping['m_Childs'].sequence[0].mapping['m_Motion'].mapping['guid'] = anim_guid_lo tree.mapping['m_Childs'].sequence[0].mapping['m_DirectBlendParameter'] = param_name + tree.mapping['m_Childs'].sequence[0].mapping['m_Threshold'] = str(lo_threshold) # High animation tree.mapping['m_Childs'].sequence[1].mapping['m_Motion'].mapping['guid'] = anim_guid_hi tree.mapping['m_Childs'].sequence[1].mapping['m_DirectBlendParameter'] = param_name + tree.mapping['m_Childs'].sequence[1].mapping['m_Threshold'] = str(hi_threshold) tree.mapping['m_BlendParameter'] = param_name tree.mapping['m_BlendParameterY'] = param_name @@ -700,7 +704,7 @@ class UnityAnimator(): self.nodes.append(node) # Create the corresponding animation state. - anim_state = self.addAnimatorState(layer, state_name, False, dx = dx, dy = + anim_state = self.addAnimatorState(layer, state_name, is_default_state, dx = dx, dy = dy) anim_state.mapping['AnimatorState'].mapping['m_Motion'].mapping['fileID'] = node.anchor |
