summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--TaSTT.fbxbin18044 -> 18172 bytes
-rw-r--r--TaSTT_Menu.asset11
-rw-r--r--generate_params.py8
-rw-r--r--generate_utils.py3
-rw-r--r--libtastt.py68
-rw-r--r--libunity.py8
6 files changed, 95 insertions, 3 deletions
diff --git a/TaSTT.fbx b/TaSTT.fbx
index 0f7eb4d..d6737d0 100644
--- a/TaSTT.fbx
+++ b/TaSTT.fbx
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