diff options
| author | yum <yum.food.vr@gmail.com> | 2022-10-02 17:24:17 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2022-10-02 17:24:17 -0700 |
| commit | 9222e7e9a21704dd6083adf8f53ce4437ba64a74 (patch) | |
| tree | 01edac9c00bfa46200a897ebf0a947006a20f13b | |
| parent | 704fd9a64fb8a8b1e929700c3e7413f8c3aaa2c2 (diff) | |
Add 'Do Nothing' animation
Per the VRC docs, state behaviors may not execute if the total length of
time in the state is < 0.02 seconds. Adding a 2-frame 'Do Nothing'
animation to the top of every layer seems to help with stability.
*shrug*
More cleanup:
* Generate a unique return-home transition for each terminal state
instead of reusing the same one.
* Use globally unique state names in animator.
* All animations are at least 2 frames long.
| -rw-r--r-- | Animations/TaSTT_Backplate_Resize_00_to_50.anim | 9 | ||||
| -rw-r--r-- | Animations/TaSTT_Backplate_Resize_50_to_00.anim | 9 | ||||
| -rw-r--r-- | Animations/TaSTT_Do_Nothing.anim | 116 | ||||
| -rw-r--r-- | TaSTT.shader | 2 | ||||
| -rw-r--r-- | generate_fx.py | 92 | ||||
| -rw-r--r-- | osc_ctrl.py | 16 | ||||
| -rw-r--r-- | template.anim | 20 |
7 files changed, 222 insertions, 42 deletions
diff --git a/Animations/TaSTT_Backplate_Resize_00_to_50.anim b/Animations/TaSTT_Backplate_Resize_00_to_50.anim index cfc9354..c8f2847 100644 --- a/Animations/TaSTT_Backplate_Resize_00_to_50.anim +++ b/Animations/TaSTT_Backplate_Resize_00_to_50.anim @@ -29,6 +29,15 @@ AnimationClip: weightedMode: 0 inWeight: 0 outWeight: 0 + - serializedVersion: 3 + time: 0.5 + value: 1 + inSlope: Infinity + outSlope: Infinity + tangentMode: 103 + weightedMode: 0 + inWeight: 0 + outWeight: 0 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 diff --git a/Animations/TaSTT_Backplate_Resize_50_to_00.anim b/Animations/TaSTT_Backplate_Resize_50_to_00.anim index 35b622e..ddacce5 100644 --- a/Animations/TaSTT_Backplate_Resize_50_to_00.anim +++ b/Animations/TaSTT_Backplate_Resize_50_to_00.anim @@ -38,6 +38,15 @@ AnimationClip: weightedMode: 0 inWeight: 0.33333334 outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.51666665 + value: 0 + inSlope: Infinity + outSlope: Infinity + tangentMode: 103 + weightedMode: 0 + inWeight: 0 + outWeight: 0 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 diff --git a/Animations/TaSTT_Do_Nothing.anim b/Animations/TaSTT_Do_Nothing.anim new file mode 100644 index 0000000..9f6dc02 --- /dev/null +++ b/Animations/TaSTT_Do_Nothing.anim @@ -0,0 +1,116 @@ +%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: TaSTT_Do_Nothing + 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: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.033333335 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: material._Dummy + path: CustomSTT + classID: 137 + 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: 2794480623 + attribute: 2284639795 + script: {fileID: 0} + typeID: 137 + customType: 22 + 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: 0 + 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: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.033333335 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: material._Dummy + path: CustomSTT + classID: 137 + script: {fileID: 0} + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/TaSTT.shader b/TaSTT.shader index fb16779..510db14 100644 --- a/TaSTT.shader +++ b/TaSTT.shader @@ -100,6 +100,8 @@ _Letter_Row05_Col13("_Letter_Row05_Col13", float) = 0
_Letter_Row05_Col14("_Letter_Row05_Col14", float) = 0
_Letter_Row05_Col15("_Letter_Row05_Col15", float) = 0
+ // This does nothing, it's just used by the 'Do Nothing' animation.
+ _Dummy("_Dummy", float) = 0
}
SubShader
{
diff --git a/generate_fx.py b/generate_fx.py index 36779b7..f829174 100644 --- a/generate_fx.py +++ b/generate_fx.py @@ -388,7 +388,7 @@ AnimatorStateTransition: m_Mute: 0 m_IsExit: 0 serializedVersion: 3 - m_TransitionDuration: 0.1 + m_TransitionDuration: 0.03 m_TransitionOffset: 0 m_ExitTime: 0.75 m_HasExitTime: 0 @@ -469,43 +469,45 @@ def getAnimationGuid(anim_meta_filename): if "guid" in line: return line.split()[1] -def getDefaultStateName(): - return "TaSTT_Do_Nothing" +def getDefaultStateName(which_layer): + return "TaSTT_L%02d_Do_Nothing" % which_layer + +def getDefaultStateNameResizeLayer(): + return "TaSTT_Resize_Do_Nothing" def getActiveStateName(which_layer): - return "TaSTT_Active" + return "TaSTT_L%02d_Active" % which_layer def getS0StateName(which_layer, s0): - return "TaSTT_S%02d" % (s0) + return "TaSTT_L%02d_S%02d" % (which_layer, s0) def getS1StateName(which_layer, s0, s1): - return "TaSTT_S%02d_S%02d" % (s0, s1) + return "TaSTT_L%02d_S%02d_S%02d" % (which_layer, s0, s1) def getS2StateName(which_layer, s0, s1, s2): - return "TaSTT_S%02d_S%02d_S%02d" % (s0, s1, s2) + return "TaSTT_L%02d_S%02d_S%02d_S%02d" % (which_layer, s0, s1, s2) def getLetterStateName(which_layer, s0, s1, s2, letter): - return "TaSTT_S%02d_S%02d_S%02d_L%03d" % (s0, s1, s2, letter) + return "TaSTT_L%02d_S%02d_S%02d_S%02d_L%03d" % (which_layer, s0, s1, s2, letter) def getResizeStateName(e0, e1): return "TaSTT_Resize_E%d_E%d" % (e0, e1) -def genTasttLayer(state, which_layer): - # Generate return-home transition - params["TASTT_RETURN_HOME_TRANSITION_%02d_U2" % which_layer] = get_u2("1101", state) - params["TASTT_STATE_TRANSITION_U2"] = params["TASTT_RETURN_HOME_TRANSITION_%02d_U2" % which_layer] - params["BOOL_PARAM"] = getDummyParam() - params["THRESHOLD"] = str(0) - params["MODE"] = str(2) # See comment above TASTT_BOOL_STATE_UNARY_TRANSITION. - params["TASTT_DEFAULT_STATE_U2"] = get_u2("1102", state) - params["DST_STATE_U2"] = params["TASTT_DEFAULT_STATE_U2"] - print(replaceMacros(TASTT_BOOL_STATE_UNARY_TRANSITION, params)) +def getReturnHomeTransitionName(which_layer, s0, s1, s2, letter): + return "TASTT_RETURN_HOME_TRANSITION_L%02d_S%02d_S%02d_S%02d_L%03d" % (which_layer, s0, s1, s2, letter) + +def getReturnHomeTransitionNameResizeLayer(e0, e1): + return "TASTT_RETURN_HOME_TRANSITION_E%d_E%d" % (e0, e1) +def genTasttLayer(state, which_layer): # Default state. + params["TASTT_DEFAULT_STATE_U2"] = get_u2("1102", state) params["TASTT_STATE_U2"] = params["TASTT_DEFAULT_STATE_U2"] - params["TASTT_STATE_NAME"] = getDefaultStateName() + params["TASTT_STATE_NAME"] = getDefaultStateName(which_layer) params["TASTT_STATE_TRANSITION_U2"] = get_u2("1101", state) - print(replaceMacros(TASTT_UNARY_STATE, params)) + anim_meta_filename = "Animations/TaSTT_Do_Nothing.anim.meta" + params["TASTT_ANIM_GUID"] = getAnimationGuid(anim_meta_filename) + print(replaceMacros(TASTT_ANIM_STATE, params)) # Active state transition. params["BOOL_PARAM"] = getEnableParam(which_layer) @@ -610,11 +612,27 @@ def genTasttLayer(state, which_layer): for letter in range(0, CHARS_PER_CELL): params["TASTT_STATE_U2"] = params[getLetterStateName(which_layer, s0, s1, s2, letter) + "_U2"] params["TASTT_STATE_NAME"] = getLetterStateName(which_layer, s0, s1, s2, letter) - params["TASTT_STATE_TRANSITION_U2"] = params["TASTT_RETURN_HOME_TRANSITION_%02d_U2" % which_layer] + transition_name = getReturnHomeTransitionName(which_layer, s0, s1, s2, letter) + "_U2" + params[transition_name] = get_u2("1101", state) + params["TASTT_STATE_TRANSITION_U2"] = params[transition_name] anim_meta_filename = getAnimationPath(getShaderParam(which_layer, s0, s1, s2), letter) + ".meta" params["TASTT_ANIM_GUID"] = getAnimationGuid(anim_meta_filename) print(replaceMacros(TASTT_ANIM_STATE, params)) + # Return-home transitions. + for s0 in range(0,2): + for s1 in range(0,2): + for s2 in range(0,2): + for letter in range(0, CHARS_PER_CELL): + transition_name = getReturnHomeTransitionName(which_layer, s0, s1, s2, letter) + "_U2" + params["TASTT_STATE_TRANSITION_U2"] = params[transition_name] + params["BOOL_PARAM"] = getDummyParam() + params["THRESHOLD"] = str(0) + params["MODE"] = str(2) # See comment above TASTT_BOOL_STATE_UNARY_TRANSITION. + params["DST_STATE_U2"] = params["TASTT_DEFAULT_STATE_U2"] + print(replaceMacros(TASTT_BOOL_STATE_UNARY_TRANSITION, params)) + + # TaSTT layer. params["TASTT_LAYER_U2"] = params[getLayerParam(which_layer) + "_LAYER_U2"] @@ -656,21 +674,14 @@ for i in range(0, NUM_LAYERS): genTasttLayer(state, i) def genTasttResizeLayer(state): - # Generate return-home transition - params["TASTT_RETURN_HOME_TRANSITION_U2"] = get_u2("1101", state) - params["TASTT_STATE_TRANSITION_U2"] = params["TASTT_RETURN_HOME_TRANSITION_U2"] - params["BOOL_PARAM"] = getDummyParam() - params["THRESHOLD"] = str(0) - params["MODE"] = str(2) # See comment above TASTT_BOOL_STATE_UNARY_TRANSITION. - params["TASTT_DEFAULT_STATE_U2"] = get_u2("1102", state) - params["DST_STATE_U2"] = params["TASTT_DEFAULT_STATE_U2"] - print(replaceMacros(TASTT_BOOL_STATE_UNARY_TRANSITION, params)) - # Default state. + params["TASTT_DEFAULT_STATE_U2"] = get_u2("1102", state) params["TASTT_STATE_U2"] = params["TASTT_DEFAULT_STATE_U2"] - params["TASTT_STATE_NAME"] = getDefaultStateName() + params["TASTT_STATE_NAME"] = getDefaultStateNameResizeLayer() + anim_meta_filename = "Animations/TaSTT_Do_Nothing.anim.meta" + params["TASTT_ANIM_GUID"] = getAnimationGuid(anim_meta_filename) params["TASTT_STATE_TRANSITION_U2"] = get_u2("1101", state) - print(replaceMacros(TASTT_UNARY_STATE, params)) + print(replaceMacros(TASTT_ANIM_STATE, params)) # Active state transition. params["BOOL_PARAM"] = generate_utils.getResizeEnableParam() @@ -715,7 +726,9 @@ def genTasttResizeLayer(state): for e1 in range(0, 2): params["TASTT_STATE_NAME"] = getResizeStateName(e0, e1) params["TASTT_STATE_U2"] = params[getResizeStateName(e0, e1) + "_U2"] - params["TASTT_STATE_TRANSITION_U2"] = params["TASTT_RETURN_HOME_TRANSITION_U2"] + transition_name = getReturnHomeTransitionNameResizeLayer(e0, e1) + "_U2" + params[transition_name] = get_u2("1101", state) + params["TASTT_STATE_TRANSITION_U2"] = params[transition_name] anim_meta_filename="Animations/" if e0 == 0 and e1 == 0: anim_meta_filename += "TaSTT_Backplate_Resize_00_to_50.anim.meta" @@ -728,6 +741,17 @@ def genTasttResizeLayer(state): params["TASTT_ANIM_GUID"] = getAnimationGuid(anim_meta_filename) print(replaceMacros(TASTT_ANIM_STATE, params)) + # Generate return-home transitions + for e0 in range(0, 2): + for e1 in range(0, 2): + transition_name = getReturnHomeTransitionNameResizeLayer(e0, e1) + "_U2" + params["TASTT_STATE_TRANSITION_U2"] = params[transition_name] + params["BOOL_PARAM"] = getDummyParam() + params["THRESHOLD"] = str(0) + params["MODE"] = str(2) # See comment above TASTT_BOOL_STATE_UNARY_TRANSITION. + params["DST_STATE_U2"] = params["TASTT_DEFAULT_STATE_U2"] + print(replaceMacros(TASTT_BOOL_STATE_UNARY_TRANSITION, params)) + # Layer params["TASTT_LAYER_U2"] = params["TASTT_RESIZE_LAYER_U2"] params["TASTT_LAYER_NAME"] = params["TASTT_LAYER_NAME"] diff --git a/osc_ctrl.py b/osc_ctrl.py index fcb2445..8a7d41c 100644 --- a/osc_ctrl.py +++ b/osc_ctrl.py @@ -17,8 +17,9 @@ from generate_utils import NUM_LAYERS from generate_utils import BOARD_ROWS from generate_utils import BOARD_COLS -#CELL_TX_TIME_S=1.0 -CELL_TX_TIME_S=0.6 +#CELL_TX_TIME_S=3.0 +CELL_TX_TIME_S=1.0 +#CELL_TX_TIME_S=0.7 def usage(): print("python3 -m pip install python-osc") @@ -181,7 +182,7 @@ def splitMessage(msg): if len(line) + len(" ") + len(word) <= BOARD_COLS: line += " " + word continue - + print("append line {}".format(line)) lines.append(line) line = word @@ -198,7 +199,7 @@ def sendMessage(msg): print("Encoded message: {}".format(msg)) - openBoard() + #openBoard() n_cells = ceil(msg_len / NUM_LAYERS) print("n_cells: {}".format(n_cells)) @@ -209,7 +210,7 @@ def sendMessage(msg): print("Send cell {}".format(cell)) sendMessageCellDiscrete(cell_msg, cell) - closeBoard() + #closeBoard() def sendRawMessage(msg): n_cells = ceil(len(msg) / NUM_LAYERS) @@ -229,12 +230,12 @@ def openBoard(): addr="/avatar/parameters/" + generate_utils.getResize1Param() client.send_message(addr, False) - time.sleep(0.1) + time.sleep(0.3) addr="/avatar/parameters/" + generate_utils.getResizeEnableParam() client.send_message(addr, True) - time.sleep(0.1) + time.sleep(0.3) addr="/avatar/parameters/" + generate_utils.getResizeEnableParam() client.send_message(addr, False) @@ -257,6 +258,7 @@ def closeBoard(): if __name__ == "__main__": generateEncoding(state) + #openBoard() clear() for line in fileinput.input(): diff --git a/template.anim b/template.anim index ee84cea..367f5d3 100644 --- a/template.anim +++ b/template.anim @@ -6,7 +6,7 @@ AnimationClip: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: template + m_Name: %ANIMATION_NAME% serializedVersion: 6 m_Legacy: 0 m_Compressed: 0 @@ -29,6 +29,15 @@ AnimationClip: weightedMode: 0 inWeight: 0 outWeight: 0 + - serializedVersion: 3 + time: 0.033333335 + value: %LETTER_VALUE% + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 @@ -85,6 +94,15 @@ AnimationClip: weightedMode: 0 inWeight: 0 outWeight: 0 + - serializedVersion: 3 + time: 0.033333335 + value: %LETTER_VALUE% + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0 + outWeight: 0 m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 |
