summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--GUI/GUI/GUI/PythonWrapper.cpp3
-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
-rw-r--r--UnityAssets/TaSTT_Menu.asset10
6 files changed, 55 insertions, 20 deletions
diff --git a/GUI/GUI/GUI/PythonWrapper.cpp b/GUI/GUI/GUI/PythonWrapper.cpp
index 1b041e3..d98a5d4 100644
--- a/GUI/GUI/GUI/PythonWrapper.cpp
+++ b/GUI/GUI/GUI/PythonWrapper.cpp
@@ -803,8 +803,7 @@ bool PythonWrapper::GenerateAnimator(
if (!InvokeWithArgs({ generate_params_path,
"--old_params", Quote(config.params_path),
"--new_params", Quote(tastt_params_path),
- "--chars_per_sync", std::to_string(config.chars_per_sync),
- "--bytes_per_char", std::to_string(config.bytes_per_char) },
+ "--config", Quote(config_path) },
"Failed to generate avatar parameters", out)) {
return false;
}
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:
diff --git a/UnityAssets/TaSTT_Menu.asset b/UnityAssets/TaSTT_Menu.asset
index dd4de69..ade2f1f 100644
--- a/UnityAssets/TaSTT_Menu.asset
+++ b/UnityAssets/TaSTT_Menu.asset
@@ -44,3 +44,13 @@ MonoBehaviour:
subParameters:
- name: TaSTT_Scale
labels: []
+ - name: Enable phonemes
+ icon: {fileID: 0}
+ type: 102
+ parameter:
+ name: TaSTT_Enable_Phoneme
+ value: 1
+ style: 0
+ subMenu: {fileID: 0}
+ subParameters: []
+ labels: []