summaryrefslogtreecommitdiffstats
path: root/Scripts
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2023-09-01 00:48:20 -0700
committeryum <yum.food.vr@gmail.com>2023-09-01 00:48:20 -0700
commit833ef96f677a60197abb417651ac306820e225f0 (patch)
tree40fe147399558d6452caba158b662902e37ea7c0 /Scripts
parentcb44e4744ac82d1d35547d12254cfea09dc63fae (diff)
Add `Enable phonemes` toggle to radial menu
Also: * Fully scrub AudioSource references from prefab when not using phonemes. * Disable net sync on phoneme params when not using them. When not synced, they don't count against the total memory limit. * Use config file in generate_params.py
Diffstat (limited to 'Scripts')
-rw-r--r--Scripts/generate_params.py26
-rw-r--r--Scripts/generate_utils.py3
-rw-r--r--Scripts/libtastt.py23
-rw-r--r--Scripts/libunity.py10
4 files changed, 44 insertions, 18 deletions
diff --git a/Scripts/generate_params.py b/Scripts/generate_params.py
index 1f635e6..0d47fde 100644
--- a/Scripts/generate_params.py
+++ b/Scripts/generate_params.py
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
+import app_config
import argparse
import generate_utils
import sys
@@ -27,6 +28,7 @@ INT_PARAM = """
valueType: 0
saved: 0
defaultValue: 0
+ networkSynced: %SYNCED%
"""[1:]
BOOL_PARAM = """
@@ -34,6 +36,7 @@ BOOL_PARAM = """
valueType: 2
saved: %SAVED%
defaultValue: 0
+ networkSynced: %SYNCED%
"""[1:]
FLOAT_PARAM = """
@@ -41,9 +44,10 @@ FLOAT_PARAM = """
valueType: 1
saved: 0
defaultValue: %DEFAULT_FLOAT%
+ networkSynced: %SYNCED%
"""[1:]
-def generate():
+def generate(cfg):
result = ""
# We're working with an 84-character board, and each FX layer is responsible
@@ -51,6 +55,7 @@ def generate():
params = {}
params["SAVED"] = "0"
params["DEFAULT_FLOAT"] = "0"
+ params["SYNCED"] = "1"
params["PARAM_NAME"] = generate_utils.getDummyParam()
result += generate_utils.replaceMacros(BOOL_PARAM, params)
@@ -61,9 +66,14 @@ def generate():
params["PARAM_NAME"] = generate_utils.getEllipsisParam()
result += generate_utils.replaceMacros(BOOL_PARAM, params)
+ if not cfg["enable_phonemes"]:
+ params["SYNCED"] = "0"
for i in range(5):
params["PARAM_NAME"] = generate_utils.getSoundParam(i+1)
result += generate_utils.replaceMacros(BOOL_PARAM, params)
+ params["PARAM_NAME"] = generate_utils.getEnablePhonemeParam()
+ result += generate_utils.replaceMacros(BOOL_PARAM, params)
+ params["SYNCED"] = "1"
params["PARAM_NAME"] = generate_utils.getScaleParam()
params["DEFAULT_FLOAT"] = "0.05"
@@ -102,7 +112,7 @@ if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--old_params", type=str, help="The parameters to append to")
parser.add_argument("--new_params", type=str, help="The parameters to create")
- parser.add_argument("--bytes_per_char", type=str, help="The number of bytes to use to represent each character")
+ parser.add_argument("--config", type=str, help="The path to the app config.")
parser.add_argument("--chars_per_sync", type=str, help="The number of characters to send on each sync event")
args = parser.parse_args()
@@ -112,12 +122,10 @@ if __name__ == "__main__":
parser.print_help()
parser.exit(1)
- if not args.bytes_per_char or not args.chars_per_sync:
- print("--bytes_per_char and --chars_per_sync required", file=sys.stderr)
- parser.print_help()
- parser.exit(1)
- generate_utils.config.BYTES_PER_CHAR = int(args.bytes_per_char)
- generate_utils.config.CHARS_PER_SYNC = int(args.chars_per_sync)
+ cfg = app_config.getConfig(args.config)
+
+ generate_utils.config.BYTES_PER_CHAR = int(cfg["bytes_per_char"])
+ generate_utils.config.CHARS_PER_SYNC = int(cfg["chars_per_sync"])
- append(args.old_params, generate(), args.new_params)
+ append(args.old_params, generate(cfg), args.new_params)
diff --git a/Scripts/generate_utils.py b/Scripts/generate_utils.py
index 395eaf7..c486201 100644
--- a/Scripts/generate_utils.py
+++ b/Scripts/generate_utils.py
@@ -42,6 +42,9 @@ def getToggleParam():
def getScaleParam():
return "TaSTT_Scale"
+def getEnablePhonemeParam():
+ return "TaSTT_Enable_Phoneme"
+
# When this is set to true, the board clears.
def getClearBoardParam():
return "TaSTT_Clear_Board"
diff --git a/Scripts/libtastt.py b/Scripts/libtastt.py
index 4cf9357..b05a724 100644
--- a/Scripts/libtastt.py
+++ b/Scripts/libtastt.py
@@ -434,7 +434,7 @@ AnimatorController:
# a letter to change after it has been written.
UNITY_ANIMATION_FUDGE_MARGIN = 0.1
-def generateClearAnimation(anim_dir, guid_map):
+def generateClearAnimation(anim_dir: str, guid_map: typing.Dict[str, str]):
print("Generating board clearing animation", file=sys.stderr)
parser = libunity.UnityParser()
@@ -621,7 +621,7 @@ def generateScaleAnimation(anim_name: str, anim_dir: str,
return meta.guid
-def generateAnimations(anim_dir, guid_map):
+def generateAnimations(anim_dir: str, guid_map: typing.Dict[str, str]):
generateClearAnimation(anim_dir, guid_map)
for chord_bits in range(2**5):
@@ -694,6 +694,7 @@ def generateFXController(anim: libunity.UnityAnimator) -> typing.Dict[int, libun
anim.addParameter(generate_utils.getToggleParam(), bool)
anim.addParameter(generate_utils.getClearBoardParam(), bool)
anim.addParameter(generate_utils.getScaleParam(), float)
+ anim.addParameter(generate_utils.getEnablePhonemeParam(), bool)
for i in range(5):
anim.addParameter(generate_utils.getSoundParam(i+1), bool)
@@ -845,8 +846,12 @@ def generateSoundLayer(anim: libunity.UnityAnimator,
layer = anim.addLayer("TaSTT_Sound")
- # Create `a` state.
- a_state = anim.addAnimatorState(layer, "a", is_default_state=True)
+ idle_state = anim.addAnimatorState(layer, "Idle", is_default_state=True, dy=-100)
+ a_state = anim.addAnimatorState(layer, "a")
+
+ trans = anim.addTransition(a_state)
+ param = generate_utils.getEnablePhonemeParam()
+ anim.addTransitionBooleanCondition(idle_state, trans, param, True)
for a_bool in range(2):
dy = 100
@@ -924,27 +929,27 @@ def generateSoundLayer(anim: libunity.UnityAnimator,
anim.setAnimatorStateAnimation(ax_ex_ix_ox_ux_state, anim_guid)
# Create return-home transitions.
- trans = anim.addTransition(a_state, dur_s = anim_len_s)
+ trans = anim.addTransition(idle_state, dur_s = anim_len_s)
trans.mapping['AnimatorStateTransition'].mapping['m_InterruptionSource'] = '0'
param = generate_utils.getSoundParam(1)
anim.addTransitionBooleanCondition(ax_ex_ix_ox_ux_state, trans, param, 1 - a_bool)
- trans = anim.addTransition(a_state, dur_s = anim_len_s)
+ trans = anim.addTransition(idle_state, dur_s = anim_len_s)
trans.mapping['AnimatorStateTransition'].mapping['m_InterruptionSource'] = '0'
param = generate_utils.getSoundParam(2)
anim.addTransitionBooleanCondition(ax_ex_ix_ox_ux_state, trans, param, 1 - e_bool)
- trans = anim.addTransition(a_state, dur_s = anim_len_s)
+ trans = anim.addTransition(idle_state, dur_s = anim_len_s)
trans.mapping['AnimatorStateTransition'].mapping['m_InterruptionSource'] = '0'
param = generate_utils.getSoundParam(3)
anim.addTransitionBooleanCondition(ax_ex_ix_ox_ux_state, trans, param, 1 - i_bool)
- trans = anim.addTransition(a_state, dur_s = anim_len_s)
+ trans = anim.addTransition(idle_state, dur_s = anim_len_s)
trans.mapping['AnimatorStateTransition'].mapping['m_InterruptionSource'] = '0'
param = generate_utils.getSoundParam(4)
anim.addTransitionBooleanCondition(ax_ex_ix_ox_ux_state, trans, param, 1 - o_bool)
- trans = anim.addTransition(a_state, dur_s = anim_len_s)
+ trans = anim.addTransition(idle_state, dur_s = anim_len_s)
trans.mapping['AnimatorStateTransition'].mapping['m_InterruptionSource'] = '0'
param = generate_utils.getSoundParam(5)
anim.addTransitionBooleanCondition(ax_ex_ix_ox_ux_state, trans, param, 1 - u_bool)
diff --git a/Scripts/libunity.py b/Scripts/libunity.py
index f79cd6f..39348d4 100644
--- a/Scripts/libunity.py
+++ b/Scripts/libunity.py
@@ -1,5 +1,7 @@
#!/usr/bin/env python3
+from functools import partial
+
import argparse
import copy
import enum
@@ -8,6 +10,7 @@ import os
import pickle
import random
import sys
+import typing
# python3 -m pip install pyyaml
# License: MIT.
import yaml
@@ -485,6 +488,13 @@ class UnityAnimator():
if hasattr(node, "forEach"):
node.forEach(self.mergeIterator)
+ # Delete any key-value pairs where the value == the value.
+ def scrubReferencesByValue(self, node, values: typing.Set[str]):
+ if hasattr(node, "mapping"):
+ node.mapping = {k: v for k, v in node.mapping.items() if v not in values}
+ if hasattr(node, "forEach"):
+ node.forEach(partial(self.scrubReferencesByValue, values=values))
+
def peekNodeOfClass(self, classId):
for node in self.nodes:
if node.class_id == classId: