summaryrefslogtreecommitdiffstats
path: root/Scripts/libtastt.py
diff options
context:
space:
mode:
Diffstat (limited to 'Scripts/libtastt.py')
-rw-r--r--Scripts/libtastt.py137
1 files changed, 137 insertions, 0 deletions
diff --git a/Scripts/libtastt.py b/Scripts/libtastt.py
index f941cee..12f9056 100644
--- a/Scripts/libtastt.py
+++ b/Scripts/libtastt.py
@@ -155,6 +155,88 @@ AnimationClip:
m_Events: []
"""
+SOUND_ANIMATION_TEMPLATE = """
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Sound1_On
+ serializedVersion: 6
+ m_Legacy: 0
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves: []
+ m_ScaleCurves: []
+ m_FloatCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: Infinity
+ outSlope: Infinity
+ tangentMode: 103
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_IsActive
+ path: World Constraint/Container/TaSTT/Audio 1
+ classID: 1
+ script: {fileID: 0}
+ m_PPtrCurves: []
+ m_SampleRate: 60
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings:
+ - serializedVersion: 2
+ path: 2267216663
+ attribute: 2086281974
+ script: {fileID: 0}
+ typeID: 1
+ customType: 0
+ isPPtrCurve: 0
+ pptrCurveMapping: []
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 0
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 1
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves: []
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 0
+ m_HasMotionFloatCurves: 0
+ m_Events: []
+"""
+
LETTER_ANIMATION_TEMPLATE = """
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
@@ -390,6 +472,40 @@ def generateClearAnimation(anim_dir, guid_map):
guid_map[anim_path] = meta.guid
guid_map[meta.guid] = anim_path
+# value: 0 or 1
+def generateSoundAnimation(nth_sound: int, value: int, anim_name: str, anim_dir: str, guid_map: typing.Dict[str, str]):
+ print(f"Generating sound {nth_sound} animation", file=sys.stderr)
+
+ parser = libunity.UnityParser()
+ parser.parse(SOUND_ANIMATION_TEMPLATE)
+
+ 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['path'] = f"World Constraint/Container/TaSTT/Audio {nth_sound}"
+ # 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 = os.path.join(anim_dir, anim_name + ".anim")
+ print("Generating sound animation at {}".format(anim_path), file=sys.stderr)
+ with open(anim_path, "w", encoding="utf-8") as f:
+ f.write(libunity.unityYamlToString([anim_node]))
+ # Generate metadata
+ meta = libunity.Metadata()
+ with open(anim_path + ".meta", "w", encoding="utf-8") as f:
+ f.write(str(meta))
+ # Add metadata to guid map
+ guid_map[anim_path] = meta.guid
+ guid_map[meta.guid] = anim_path
+
# Generate a toggle animation for a shader parameter.
def generateToggleAnimations(anim_dir, shader_param, guid_map):
print("Generating shader toggle animation", file=sys.stderr)
@@ -482,6 +598,12 @@ def generateScaleAnimation(anim_name: str, anim_dir: str,
def generateAnimations(anim_dir, guid_map):
generateClearAnimation(anim_dir, guid_map)
+ for i in range(5):
+ anim_name = generate_utils.getSoundParam(i+1) + "_Off"
+ generateSoundAnimation(i+1, 0, anim_name, anim_dir, guid_map)
+ anim_name = generate_utils.getSoundParam(i+1) + "_On"
+ generateSoundAnimation(i+1, 1, anim_name, anim_dir, guid_map)
+
print("Generating letter animations", file=sys.stderr)
parser = libunity.UnityParser()
@@ -544,6 +666,11 @@ def generateFXController(anim: libunity.UnityAnimator) -> typing.Dict[int, libun
anim.addParameter(generate_utils.getClearBoardParam(), bool)
anim.addParameter(generate_utils.getScaleParam(), float)
+ for i in range(5):
+ anim.addParameter(generate_utils.getSoundParam(i+1), bool)
+
+ anim.addLayer("=== TaSTT ===", weight=0.0)
+
layers = {}
for byte in range(0, generate_utils.config.BYTES_PER_CHAR):
layers[byte] = {}
@@ -724,6 +851,16 @@ def generateFX(guid_map, gen_anim_dir):
"TaSTT_Emerge_000.anim",
"TaSTT_Emerge_100.anim",
anim, guid_map, 0.5)
+
+ for i in range(5):
+ param_name = generate_utils.getSoundParam(i+1)
+ generateToggle(f"TaSTT_Audio{i+1}",
+ param_name,
+ gen_anim_dir,
+ param_name + "_Off.anim",
+ param_name + "_On.anim",
+ anim, guid_map)
+
generateScaleLayer(anim, gen_anim_dir, guid_map)
return anim