diff --git a/.vs/RimWorld-Animation-Studio/v16/.suo b/.vs/RimWorld-Animation-Studio/v16/.suo index 4407ca6c..f6edf7aa 100644 Binary files a/.vs/RimWorld-Animation-Studio/v16/.suo and b/.vs/RimWorld-Animation-Studio/v16/.suo differ diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj index df8f7e6f..62cf9a0b 100644 --- a/Assembly-CSharp.csproj +++ b/Assembly-CSharp.csproj @@ -75,6 +75,7 @@ + @@ -87,12 +88,15 @@ + - + + + @@ -109,15 +113,16 @@ + + + - - diff --git a/Assets/Resources/Prefabs/ActorBody.prefab b/Assets/Resources/Prefabs/ActorBody.prefab index 5a46c031..bd8f84fe 100644 --- a/Assets/Resources/Prefabs/ActorBody.prefab +++ b/Assets/Resources/Prefabs/ActorBody.prefab @@ -173,9 +173,7 @@ MonoBehaviour: m_EditorClassIdentifier: bodyPartRenderer: {fileID: 3345967395353432914} parent: {fileID: -4411442180840688308} - isHead: 0 - addonName: right hand - isSelected: 0 + bodyPart: right hand --- !u!1 &2846713953308910856 GameObject: m_ObjectHideFlags: 0 @@ -340,9 +338,7 @@ MonoBehaviour: m_EditorClassIdentifier: bodyPartRenderer: {fileID: 4070361490379091543} parent: {fileID: -4411442180840688308} - isHead: 0 - addonName: left hand - isSelected: 0 + bodyPart: left hand --- !u!1 &3158459618386162366 GameObject: m_ObjectHideFlags: 0 @@ -658,9 +654,7 @@ MonoBehaviour: m_EditorClassIdentifier: bodyPartRenderer: {fileID: 7367385255154626542} parent: {fileID: -4411442180840688308} - isHead: 0 - addonName: dildo - isSelected: 0 + bodyPart: dildo --- !u!1 &7929422519883802246 GameObject: m_ObjectHideFlags: 0 @@ -818,9 +812,7 @@ MonoBehaviour: m_EditorClassIdentifier: bodyPartRenderer: {fileID: 7929422519883802244} parent: {fileID: -4411442180840688308} - isHead: 1 - addonName: - isSelected: 0 + bodyPart: head --- !u!1 &7929422520673851210 GameObject: m_ObjectHideFlags: 0 @@ -871,10 +863,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: actorID: 0 - isSelected: 0 bodyRenderer: {fileID: 5996161745621340017} - headRenderer: {fileID: 7929422519883802244} - appendageRenderer: {fileID: 4251726083449519904} --- !u!1 &9122292209377678227 GameObject: m_ObjectHideFlags: 0 @@ -1048,6 +1037,4 @@ MonoBehaviour: m_EditorClassIdentifier: bodyPartRenderer: {fileID: 4251726083449519904} parent: {fileID: -4411442180840688308} - isHead: 0 - addonName: - isSelected: 0 + bodyPart: appendage diff --git a/Assets/Resources/Prefabs/StageCard.prefab b/Assets/Resources/Prefabs/StageCard.prefab index ebaafd48..ca582328 100644 --- a/Assets/Resources/Prefabs/StageCard.prefab +++ b/Assets/Resources/Prefabs/StageCard.prefab @@ -77,7 +77,7 @@ MonoBehaviour: m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: New Stage + m_Text: Empty --- !u!1 &533195464737222177 GameObject: m_ObjectHideFlags: 0 @@ -207,18 +207,7 @@ MonoBehaviour: m_CharacterLimit: 0 m_OnEndEdit: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 2278168916950142456} - m_MethodName: OnNameChange - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 + m_Calls: [] m_OnValueChanged: m_PersistentCalls: m_Calls: [] diff --git a/Assets/Scenes/MainScene.unity b/Assets/Scenes/MainScene.unity index d98b2448..285473d1 100644 --- a/Assets/Scenes/MainScene.unity +++ b/Assets/Scenes/MainScene.unity @@ -133,7 +133,6 @@ GameObject: - component: {fileID: 11575770} - component: {fileID: 11575769} - component: {fileID: 11575768} - - component: {fileID: 11575767} m_Layer: 5 m_Name: SelectRaceDropdown m_TagString: Untagged @@ -163,21 +162,6 @@ RectTransform: m_AnchoredPosition: {x: 10, y: -150} m_SizeDelta: {x: 120, y: 30} m_Pivot: {x: 0, y: 1} ---- !u!114 &11575767 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 11575765} - m_Enabled: 0 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0ba5b69d448f9434ca7d74d4022f3dcd, type: 3} - m_Name: - m_EditorClassIdentifier: - dropdown: {fileID: 0} - label: {fileID: 0} - hashcode: -1 --- !u!114 &11575768 MonoBehaviour: m_ObjectHideFlags: 0 @@ -454,6 +438,7 @@ GameObject: - component: {fileID: 40289126} - component: {fileID: 40289125} - component: {fileID: 40289124} + - component: {fileID: 40289128} m_Layer: 5 m_Name: posOffsetXField m_TagString: Untagged @@ -606,6 +591,18 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 40289122} m_CullTransparentMesh: 0 +--- !u!114 &40289128 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 40289122} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &40775274 GameObject: m_ObjectHideFlags: 0 @@ -3563,6 +3560,7 @@ GameObject: - component: {fileID: 254347859} - component: {fileID: 254347858} - component: {fileID: 254347862} + - component: {fileID: 254347863} m_Layer: 5 m_Name: headBobField m_TagString: Untagged @@ -3622,18 +3620,7 @@ MonoBehaviour: m_CharacterLimit: 0 m_OnEndEdit: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 629081417} - m_MethodName: OnValueChanged - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 + m_Calls: [] m_OnValueChanged: m_PersistentCalls: m_Calls: [] @@ -3715,6 +3702,18 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: valiationType: 2 +--- !u!114 &254347863 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 254347857} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &257134980 GameObject: m_ObjectHideFlags: 0 @@ -7825,6 +7824,7 @@ GameObject: - component: {fileID: 444811204} - component: {fileID: 444811203} - component: {fileID: 444811202} + - component: {fileID: 444811206} m_Layer: 5 m_Name: rotationField m_TagString: Untagged @@ -7977,6 +7977,18 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 444811200} m_CullTransparentMesh: 0 +--- !u!114 &444811206 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 444811200} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &448745871 GameObject: m_ObjectHideFlags: 0 @@ -8253,8 +8265,9 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 468781281} + - component: {fileID: 468781282} m_Layer: 5 - m_Name: StageCycleCard + m_Name: StageLoopsCard m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -8281,6 +8294,20 @@ RectTransform: m_AnchoredPosition: {x: 155, y: -315} m_SizeDelta: {x: 310, y: 70} m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &468781282 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 468781280} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 38691dc973d99734f8f0f2a240df73fe, type: 3} + m_Name: + m_EditorClassIdentifier: + stageLoopsNormalField: {fileID: 74082975} + stageLoopsQuickField: {fileID: 1463915054} --- !u!1 &476324336 GameObject: m_ObjectHideFlags: 0 @@ -9638,23 +9665,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: isAnimating: 0 - stageTimelineSlider: {fileID: 1289465655} - stageLoopDropdown: {fileID: 429161118} - cyclesNormalField: {fileID: 74082975} - cyclesFastField: {fileID: 1463915054} - animationClipTimeField: {fileID: 760297267} - animationClipLengthField: {fileID: 1676585155} - actorCard: {fileID: 0} animationTimelines: {fileID: 1100016168} actorBodies: {fileID: 1828035561} - stretchKeyframesToggle: {fileID: 462332576} - playBackSpeedField: {fileID: 1579799916} - playToggleButton: {fileID: 79733375} - stageLengthText: {fileID: 1137451986} - animationLengthText: {fileID: 1293297801} - handLeftControls: {fileID: 374385281} - handRightControls: {fileID: 613856053} - sexToyControls: {fileID: 2069775739} + stageLoopDropdown: {fileID: 429161118} actorBodyPrefab: {fileID: -4411442180840688308, guid: dc4c8b005322f3b46a2f122a55f38db2, type: 3} animationTimelinePrefab: {fileID: 3541467645058788217, guid: eac2d5e7275f9064facfeb818ee30308, @@ -10201,8 +10214,9 @@ GameObject: - component: {fileID: 539052777} - component: {fileID: 539052779} - component: {fileID: 539052781} + - component: {fileID: 539052778} m_Layer: 5 - m_Name: AnimControlPanel + m_Name: AnimControlCard m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -10236,6 +10250,25 @@ RectTransform: m_AnchoredPosition: {x: 10, y: -22.5} m_SizeDelta: {x: 1375.8606, y: 45} m_Pivot: {x: 0, y: 0.5} +--- !u!114 &539052778 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 539052776} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b414452bfd6c9b4bb99542a51d77468, type: 3} + m_Name: + m_EditorClassIdentifier: + stageLoopDropdown: {fileID: 429161118} + animationClipTimeField: {fileID: 760297267} + animationClipLengthField: {fileID: 1676585155} + stretchKeyframesToggle: {fileID: 462332576} + playBackSpeedField: {fileID: 1579799916} + playToggleButton: {fileID: 79733375} + stageTimelineSlider: {fileID: 1289465655} --- !u!222 &539052779 CanvasRenderer: m_ObjectHideFlags: 0 @@ -10916,8 +10949,8 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 542629604} - m_MethodName: OnNewStage + - m_Target: {fileID: 1335076905} + m_MethodName: AddStage m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} @@ -12096,6 +12129,7 @@ GameObject: - component: {fileID: 619777500} - component: {fileID: 619777499} - component: {fileID: 619777498} + - component: {fileID: 619777502} m_Layer: 5 m_Name: posOffsetZField m_TagString: Untagged @@ -12237,6 +12271,18 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 619777496} m_CullTransparentMesh: 0 +--- !u!114 &619777502 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 619777496} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &620055138 GameObject: m_ObjectHideFlags: 0 @@ -12823,9 +12869,9 @@ RectTransform: m_Father: {fileID: 935483303140078260} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 155, y: -166.98029} m_SizeDelta: {x: 310, y: 65.97644} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &658284331 @@ -14056,6 +14102,7 @@ GameObject: - component: {fileID: 725162533} - component: {fileID: 725162532} - component: {fileID: 725162535} + - component: {fileID: 725162536} m_Layer: 5 m_Name: rotationField m_TagString: Untagged @@ -14135,18 +14182,7 @@ MonoBehaviour: m_CharacterLimit: 0 m_OnEndEdit: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 629081417} - m_MethodName: OnValueChanged - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 + m_Calls: [] m_OnValueChanged: m_PersistentCalls: m_Calls: [] @@ -14208,6 +14244,18 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: valiationType: 2 +--- !u!114 &725162536 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 725162530} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &726027038 GameObject: m_ObjectHideFlags: 0 @@ -14651,6 +14699,7 @@ GameObject: - component: {fileID: 760297268} - component: {fileID: 760297267} - component: {fileID: 760297270} + - component: {fileID: 760297271} m_Layer: 5 m_Name: AnimationClipTimeField m_TagString: Untagged @@ -14803,6 +14852,18 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: valiationType: 1 +--- !u!114 &760297271 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 760297265} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &763620509 GameObject: m_ObjectHideFlags: 0 @@ -16809,6 +16870,7 @@ GameObject: - component: {fileID: 891720216} - component: {fileID: 891720215} - component: {fileID: 891720218} + - component: {fileID: 891720219} m_Layer: 5 m_Name: posOffsetXField m_TagString: Untagged @@ -16888,18 +16950,7 @@ MonoBehaviour: m_CharacterLimit: 0 m_OnEndEdit: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 629081417} - m_MethodName: OnValueChanged - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 + m_Calls: [] m_OnValueChanged: m_PersistentCalls: m_Calls: [] @@ -16961,6 +17012,18 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: valiationType: 2 +--- !u!114 &891720219 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 891720213} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &898059650 GameObject: m_ObjectHideFlags: 0 @@ -17256,6 +17319,7 @@ GameObject: - component: {fileID: 906179602} - component: {fileID: 906179601} - component: {fileID: 906179600} + - component: {fileID: 906179604} m_Layer: 5 m_Name: rotationField m_TagString: Untagged @@ -17408,6 +17472,18 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 906179598} m_CullTransparentMesh: 0 +--- !u!114 &906179604 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906179598} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &911162557 GameObject: m_ObjectHideFlags: 0 @@ -17648,7 +17724,7 @@ RectTransform: m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0.99997056} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} @@ -21067,6 +21143,7 @@ GameObject: - component: {fileID: 1152532962} - component: {fileID: 1152532961} - component: {fileID: 1152532960} + - component: {fileID: 1152532964} m_Layer: 5 m_Name: posOffsetXField m_TagString: Untagged @@ -21219,6 +21296,18 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1152532958} m_CullTransparentMesh: 0 +--- !u!114 &1152532964 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1152532958} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1153227822 GameObject: m_ObjectHideFlags: 0 @@ -21301,7 +21390,7 @@ MonoBehaviour: m_HandleRect: {fileID: 922060209} m_Direction: 2 m_Value: 0 - m_Size: 0.99997056 + m_Size: 1 m_NumberOfSteps: 0 m_OnValueChanged: m_PersistentCalls: @@ -21667,8 +21756,8 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 542629604} - m_MethodName: OnRemoveStage + - m_Target: {fileID: 1335076905} + m_MethodName: RemoveStage m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} @@ -22802,9 +22891,9 @@ RectTransform: m_Father: {fileID: 935483303140078260} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 155, y: -337.8237} m_SizeDelta: {x: 310, y: 275.7104} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1216651061 @@ -23154,12 +23243,12 @@ PrefabInstance: type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[1].m_Target value: - objectReference: {fileID: 1567848590} + objectReference: {fileID: 0} - target: {fileID: 7715503544528335667, guid: 8b89f6c9e5f696c4997760829c45a505, type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[2].m_Target value: - objectReference: {fileID: 11575767} + objectReference: {fileID: 0} - target: {fileID: 7715503544528335667, guid: 8b89f6c9e5f696c4997760829c45a505, type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[1].m_CallState @@ -25222,7 +25311,7 @@ GameObject: - component: {fileID: 1335076900} - component: {fileID: 1335076905} m_Layer: 5 - m_Name: Workspace + m_Name: WorkspaceAndGUI m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -29764,8 +29853,8 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 542629604} - m_MethodName: OnCloneStage + - m_Target: {fileID: 1335076905} + m_MethodName: CloneStage m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} @@ -29825,6 +29914,7 @@ GameObject: - component: {fileID: 1518099309} - component: {fileID: 1518099308} - component: {fileID: 1518099311} + - component: {fileID: 1518099312} m_Layer: 5 m_Name: posOffsetZField m_TagString: Untagged @@ -29904,18 +29994,7 @@ MonoBehaviour: m_CharacterLimit: 0 m_OnEndEdit: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 629081417} - m_MethodName: OnValueChanged - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 + m_Calls: [] m_OnValueChanged: m_PersistentCalls: m_Calls: [] @@ -29977,6 +30056,18 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: valiationType: 2 +--- !u!114 &1518099312 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1518099306} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1522728394 GameObject: m_ObjectHideFlags: 0 @@ -30299,6 +30390,7 @@ GameObject: - component: {fileID: 1560400021} - component: {fileID: 1560400020} - component: {fileID: 1560400019} + - component: {fileID: 1560400023} m_Layer: 5 m_Name: posOffsetZField m_TagString: Untagged @@ -30451,6 +30543,18 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1560400017} m_CullTransparentMesh: 0 +--- !u!114 &1560400023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1560400017} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1561986055 GameObject: m_ObjectHideFlags: 0 @@ -30697,7 +30801,6 @@ GameObject: - component: {fileID: 1567848593} - component: {fileID: 1567848592} - component: {fileID: 1567848591} - - component: {fileID: 1567848590} m_Layer: 5 m_Name: RaceSelectDropdown m_TagString: Untagged @@ -30727,21 +30830,6 @@ RectTransform: m_AnchoredPosition: {x: 178, y: 0} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1567848590 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1567848588} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0ba5b69d448f9434ca7d74d4022f3dcd, type: 3} - m_Name: - m_EditorClassIdentifier: - dropdown: {fileID: 0} - label: {fileID: 0} - hashcode: -1 --- !u!114 &1567848591 MonoBehaviour: m_ObjectHideFlags: 0 @@ -31888,6 +31976,7 @@ GameObject: - component: {fileID: 1668270819} - component: {fileID: 1668270818} - component: {fileID: 1668270821} + - component: {fileID: 1668270822} m_Layer: 5 m_Name: appendageRotationField m_TagString: Untagged @@ -32040,6 +32129,18 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: valiationType: 2 +--- !u!114 &1668270822 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1668270816} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1670013372 GameObject: m_ObjectHideFlags: 0 @@ -32245,6 +32346,7 @@ GameObject: - component: {fileID: 1676585156} - component: {fileID: 1676585155} - component: {fileID: 1676585158} + - component: {fileID: 1676585159} m_Layer: 5 m_Name: AnimationClipLengthField m_TagString: Untagged @@ -32397,6 +32499,18 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: valiationType: 1 +--- !u!114 &1676585159 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1676585153} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1685703671 GameObject: m_ObjectHideFlags: 0 @@ -33698,6 +33812,7 @@ GameObject: - component: {fileID: 1767445798} - component: {fileID: 1767445797} - component: {fileID: 1767445801} + - component: {fileID: 1767445802} m_Layer: 5 m_Name: headRotationField m_TagString: Untagged @@ -33757,18 +33872,7 @@ MonoBehaviour: m_CharacterLimit: 0 m_OnEndEdit: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 629081417} - m_MethodName: OnValueChanged - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 + m_Calls: [] m_OnValueChanged: m_PersistentCalls: m_Calls: [] @@ -33850,6 +33954,18 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: valiationType: 2 +--- !u!114 &1767445802 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1767445796} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1776904761 GameObject: m_ObjectHideFlags: 0 @@ -36271,6 +36387,7 @@ GameObject: - component: {fileID: 1899457113} - component: {fileID: 1899457112} - component: {fileID: 1899457111} + - component: {fileID: 1899457115} m_Layer: 5 m_Name: rotationField m_TagString: Untagged @@ -36412,6 +36529,18 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1899457109} m_CullTransparentMesh: 0 +--- !u!114 &1899457115 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1899457109} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1900570404 GameObject: m_ObjectHideFlags: 0 @@ -36981,6 +37110,7 @@ GameObject: - component: {fileID: 1925610721} - component: {fileID: 1925610720} - component: {fileID: 1925610719} + - component: {fileID: 1925610723} m_Layer: 5 m_Name: posOffsetZField m_TagString: Untagged @@ -37133,6 +37263,18 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1925610717} m_CullTransparentMesh: 0 +--- !u!114 &1925610723 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1925610717} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1928565389 GameObject: m_ObjectHideFlags: 0 @@ -39224,6 +39366,7 @@ GameObject: - component: {fileID: 2114146443} - component: {fileID: 2114146442} - component: {fileID: 2114146441} + - component: {fileID: 2114146445} m_Layer: 5 m_Name: posOffsetXField m_TagString: Untagged @@ -39365,6 +39508,18 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2114146439} m_CullTransparentMesh: 0 +--- !u!114 &2114146445 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2114146439} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 92068b39ed172084296a595f5a09e54b, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &2114503331 GameObject: m_ObjectHideFlags: 0 @@ -39679,9 +39834,9 @@ RectTransform: m_Father: {fileID: 935483303140078260} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 155, y: -66.99603} m_SizeDelta: {x: 310, y: 133.99207} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2130812670 @@ -40435,7 +40590,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!222 &935483303140078262 CanvasRenderer: m_ObjectHideFlags: 0 @@ -42532,7 +42687,7 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 - - m_Target: {fileID: 1567848590} + - m_Target: {fileID: 0} m_MethodName: UpdateDropdown m_Mode: 1 m_Arguments: @@ -42543,7 +42698,7 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 - - m_Target: {fileID: 11575767} + - m_Target: {fileID: 0} m_MethodName: UpdateDropdown m_Mode: 1 m_Arguments: diff --git a/Assets/Scripts/AnimationComponents/Actor.cs b/Assets/Scripts/AnimationComponents/Actor.cs index af479d7c..ad47af99 100644 --- a/Assets/Scripts/AnimationComponents/Actor.cs +++ b/Assets/Scripts/AnimationComponents/Actor.cs @@ -36,60 +36,60 @@ namespace RimWorldAnimationStudio [XmlIgnore] public List DefNames { get { return defNames.NullOrEmpty() ? defNames = new List() : defNames; } - set { defNames = value.NotNullOrEmpty() ? value : null; EventsManager.OnActorChanged(this); } + set { defNames = value.NotNullOrEmpty() ? value : null; } } [XmlIgnore] public List BodyDefTypes { get { return bodyDefTypes.NullOrEmpty() ? bodyDefTypes = new List() : bodyDefTypes; } - set { bodyDefTypes = value.NotNullOrEmpty() ? value : null; EventsManager.OnActorChanged(this); } + set { bodyDefTypes = value.NotNullOrEmpty() ? value : null; } } [XmlIgnore] public List RequiredGenitals { get { return requiredGenitals.NullOrEmpty() ? requiredGenitals = new List() : requiredGenitals; } - set { requiredGenitals = value.NotNullOrEmpty() ? value : null; EventsManager.OnActorChanged(this); } + set { requiredGenitals = value.NotNullOrEmpty() ? value : null; } } [XmlIgnore] public List RaceOffsets { get { return raceOffsets.NullOrEmpty() ? raceOffsets = new List() : raceOffsets; } - set { raceOffsets = value.NotNullOrEmpty() ? value : null; EventsManager.OnActorChanged(this); } + set { raceOffsets = value.NotNullOrEmpty() ? value : null; } } [XmlIgnore] public List Tags { get { return tags.NullOrEmpty() ? tags = new List() : tags; } - set { tags = value.NotNullOrEmpty() ? value : null; EventsManager.OnActorChanged(this); } + set { tags = value.NotNullOrEmpty() ? value : null; } } [XmlIgnore] public BodyTypeOffset BodyTypeOffset { get { return bodyTypeOffset == null ? bodyTypeOffset = new BodyTypeOffset() : bodyTypeOffset; } - set { bodyTypeOffset = value; EventsManager.OnActorChanged(this); } + set { bodyTypeOffset = value; } } [XmlIgnore] public bool Initiator { get { return initiator == true; } - set { if (value) { initiator = true; } else initiator = null; EventsManager.OnActorChanged(this); } + set { if (value) { initiator = true; } else initiator = null; } } [XmlIgnore] public bool ControlGenitalAngle { get { return controlGenitalAngle == true; } - set { if (value) { controlGenitalAngle = true; } else controlGenitalAngle = null; EventsManager.OnActorChanged(this); } + set { if (value) { controlGenitalAngle = true; } else controlGenitalAngle = null; } } [XmlIgnore] public bool IsFucking { get { return isFucking == true; } - set { if (value) { isFucking = true; } else isFucking = null; EventsManager.OnActorChanged(this); } + set { if (value) { isFucking = true; } else isFucking = null; } } [XmlIgnore] public bool IsFucked { get { return isFucked == true; } - set { if (value) { isFucked = true; } else isFucked = null; EventsManager.OnActorChanged(this); } + set { if (value) { isFucked = true; } else isFucked = null; } } // Local data @@ -163,6 +163,16 @@ namespace RimWorldAnimationStudio return Workspace.animationDef.Actors.IndexOf(this); } + public ActorPosition GetCurrentPosition() + { + return GetPositionAtTick(Workspace.StageTick); + } + + public ActorPosition GetPositionAtTick(int atTick) + { + return new ActorPosition(GetActorID(), atTick); + } + // Pre-save / post-load public void OnPreSave() { diff --git a/Assets/Scripts/AnimationComponents/ActorAddon.cs b/Assets/Scripts/AnimationComponents/ActorAddon.cs index 94a4189a..7d8c5a41 100644 --- a/Assets/Scripts/AnimationComponents/ActorAddon.cs +++ b/Assets/Scripts/AnimationComponents/ActorAddon.cs @@ -28,31 +28,31 @@ namespace RimWorldAnimationStudio [XmlIgnore] public int AnchoringActor { get { return anchoringActor.HasValue ? anchoringActor.Value : 0; } - set { anchoringActor = value; EventsManager.OnActorAddonChanged(this); } + set { anchoringActor = value; } } [XmlIgnore] public string AnchorName { get { return anchorName; } - set { anchorName = value; EventsManager.OnActorAddonChanged(this); } + set { anchorName = value; } } [XmlIgnore] public string Layer { get { return layer; } - set { layer = value; EventsManager.OnActorAddonChanged(this); } + set { layer = value; } } [XmlIgnore] public float Scale { get { return scale.HasValue ? scale.Value : 0f; } - set { scale = value; EventsManager.OnActorAddonChanged(this); } + set { scale = value; } } [XmlIgnore] public bool Render { get { return render == true; } - set { render = value; EventsManager.OnActorAddonChanged(this); } + set { render = value; } } // Simple curves diff --git a/Assets/Scripts/AnimationComponents/AddonKeyFrame.cs b/Assets/Scripts/AnimationComponents/AddonKeyFrame.cs index 0a0f2fa0..2ad72b7c 100644 --- a/Assets/Scripts/AnimationComponents/AddonKeyFrame.cs +++ b/Assets/Scripts/AnimationComponents/AddonKeyFrame.cs @@ -23,19 +23,19 @@ namespace RimWorldAnimationStudio [XmlIgnore] public float PosX { get { return posX.HasValue ? posX.Value : 0f; } - set { posX = value; EventsManager.OnAddonKeyframeChanged(this); } + set { posX = value; } } [XmlIgnore] public float PosZ { get { return posZ.HasValue ? posZ.Value : 0f; } - set { posZ = value; EventsManager.OnAddonKeyframeChanged(this); } + set { posZ = value; } } [XmlIgnore] public float Rotation { get { return rotation.HasValue ? rotation.Value : 0f; } - set { rotation = value; EventsManager.OnAddonKeyframeChanged(this); } + set { rotation = value; } } // Constructors diff --git a/Assets/Scripts/AnimationComponents/AnimationDef.cs b/Assets/Scripts/AnimationComponents/AnimationDef.cs index 8ecd4677..f599a556 100644 --- a/Assets/Scripts/AnimationComponents/AnimationDef.cs +++ b/Assets/Scripts/AnimationComponents/AnimationDef.cs @@ -28,37 +28,37 @@ namespace RimWorldAnimationStudio [XmlIgnore] public string DefName { get { return defName != null && defName != "" ? defName : "newAnimation"; } - set { defName = value; EventsManager.OnAnimationDefChanged(); } + set { defName = value; } } [XmlIgnore] public string Label { get { return label != null && label != "" ? label : "newAnimation"; } - set { label = value; EventsManager.OnAnimationDefChanged(); } + set { label = value; } } [XmlIgnore] public List SexTypes { get { return sexTypes.NullOrEmpty() ? sexTypes = new List() : sexTypes; } - set { sexTypes = value.NotNullOrEmpty() ? value : null; EventsManager.OnAnimationDefChanged(); } + set { sexTypes = value.NotNullOrEmpty() ? value : null; } } [XmlIgnore] public List InteractionDefTypes { get { return interactionDefTypes.NullOrEmpty() ? interactionDefTypes = new List() : interactionDefTypes; } - set { interactionDefTypes = value.NotNullOrEmpty() ? value : null; EventsManager.OnAnimationDefChanged(); } + set { interactionDefTypes = value.NotNullOrEmpty() ? value : null; } } [XmlIgnore] public List Actors { get { return actors.NullOrEmpty() ? actors = new List() : actors; } - set { actors = value.NotNullOrEmpty() ? value : null; EventsManager.OnAnimationDefChanged(); } + set { actors = value.NotNullOrEmpty() ? value : null; } } [XmlIgnore] public List AnimationStages { get { if (animationStages.NullOrEmpty()){ animationStages = new List(); } return animationStages; } - set { animationStages = value.NotNullOrEmpty() ? value : null; EventsManager.OnAnimationDefChanged(); } + set { animationStages = value.NotNullOrEmpty() ? value : null; } } // Local data @@ -83,12 +83,13 @@ namespace RimWorldAnimationStudio Actor actor = new Actor(); Actors.Add(actor); + foreach (AnimationStage stage in Workspace.animationDef.AnimationStages) + { stage.AddAnimationClip(Workspace.animationDef.Actors.Count - 1); } + + Initialize(); Workspace.ActorID = Workspace.animationDef.Actors.Count - 1; - foreach (AnimationStage stage in Workspace.animationDef.AnimationStages) - { stage.AddAnimationClip(Workspace.ActorID); } - - EventsManager.OnActorCountChanged(); + EventsManager.OnActorCountChanged(); Workspace.RecordEvent("Actor addition"); } @@ -119,7 +120,9 @@ namespace RimWorldAnimationStudio { stage.AddAnimationClip(actor.GetActorID()); } Initialize(); + Workspace.StageID = Workspace.animationDef.AnimationStages.Count - 1; + EventsManager.OnStageCountChanged(); Workspace.RecordEvent("Stage addition"); } @@ -127,9 +130,11 @@ namespace RimWorldAnimationStudio { AnimationStage stage = Workspace.GetCurrentAnimationStage().Copy(); stage.StageName += " (Clone)"; - stage.Initialize(); Workspace.animationDef.AnimationStages.Insert(Workspace.StageID + 1, stage); + Initialize(); + + EventsManager.OnStageCountChanged(); Workspace.RecordEvent("Stage clone"); } @@ -154,8 +159,9 @@ namespace RimWorldAnimationStudio } AnimationStages.RemoveAt(Workspace.StageID); - Workspace.StageID--; + + EventsManager.OnStageCountChanged(); Workspace.RecordEvent("Stage deletion"); } diff --git a/Assets/Scripts/AnimationComponents/AnimationStage.cs b/Assets/Scripts/AnimationComponents/AnimationStage.cs index 3b966185..5bb85e4c 100644 --- a/Assets/Scripts/AnimationComponents/AnimationStage.cs +++ b/Assets/Scripts/AnimationComponents/AnimationStage.cs @@ -10,11 +10,11 @@ namespace RimWorldAnimationStudio public class AnimationStage { // Data to/from animationDef - [SerializeField] private string stageName; - [SerializeField] private int? playTimeTicks; - [SerializeField] private int? playTimeTicksQuick; - [SerializeField] private bool? isLooping; - [SerializeField, XmlArray("animationClips"), XmlArrayItem("li")] public List animationClips; + public string stageName; + public int? playTimeTicks; + public int? playTimeTicksQuick; + public bool? isLooping; + [XmlArray("animationClips"), XmlArrayItem("li")] public List animationClips; // Data serialization control public bool ShouldSerializeanimationClips() { return animationClips.NotNullOrEmpty(); } @@ -22,32 +22,44 @@ namespace RimWorldAnimationStudio // Data helper functions [XmlIgnore] public string StageName { - get { return stageName != null && stageName != "" ? stageName : "NewStage"; } - set { stageName = value; EventsManager.OnAnimationStageChanged(this); } + get { return string.IsNullOrEmpty(stageName) ? stageName = "NewStage" : stageName; } + set { stageName = value; } } [XmlIgnore] public int PlayTimeTicks { get { return playTimeTicks.HasValue ? playTimeTicks.Value : 0; } - set { playTimeTicks = value; EventsManager.OnAnimationStageChanged(this); } + set { playTimeTicks = value; } } [XmlIgnore] public int PlayTimeTicksQuick { get { return playTimeTicksQuick.HasValue ? playTimeTicksQuick.Value : 0; } - set { playTimeTicksQuick = value; EventsManager.OnAnimationStageChanged(this); } + set { playTimeTicksQuick = value; } } [XmlIgnore] public bool IsLooping { get { return isLooping == true; } - set { isLooping = value; EventsManager.OnAnimationStageChanged(this); } + set { isLooping = value; } } [XmlIgnore] public List AnimationClips { get { return animationClips.NullOrEmpty() ? animationClips = new List() : animationClips; } - set { animationClips = value.NotNullOrEmpty() ? value : null; EventsManager.OnAnimationStageChanged(this); } + set { animationClips = value.NotNullOrEmpty() ? value : null; } + } + + [XmlIgnore] public int StageLoopsNormal + { + get { return Mathf.CeilToInt(PlayTimeTicks / Workspace.StageWindowSize); } + set { value = Math.Max(1, value); PlayTimeTicks = value * Workspace.StageWindowSize; IsLooping = value > 1; } + } + + [XmlIgnore] public int StageLoopsQuick + { + get { return Mathf.CeilToInt(PlayTimeTicksQuick / Workspace.StageWindowSize); } + set { value = Math.Max(0, Math.Min(value, StageLoopsNormal)); PlayTimeTicksQuick = value * Workspace.StageWindowSize; IsLooping = value > 1; } } // Local data @@ -63,8 +75,6 @@ namespace RimWorldAnimationStudio if (clip.duration > PlayTimeTicks) { PlayTimeTicks = clip.duration; } } - - PlayTimeTicksQuick = PlayTimeTicks; } public int GetStageID() @@ -78,7 +88,7 @@ namespace RimWorldAnimationStudio { float scale = (float)newStageWindowSize / Workspace.StageWindowSize; - foreach (PawnAnimationClip clip in Workspace.animationDef.AnimationStages[Workspace.StageID].AnimationClips) + foreach (PawnAnimationClip clip in AnimationClips) { foreach (PawnKeyframe keyframe in clip.Keyframes) { @@ -93,8 +103,8 @@ namespace RimWorldAnimationStudio public void ResizeStageWindow(int newStageWindowSize) { Workspace.GetCurrentAnimationStage().stageWindowSize = newStageWindowSize; - Workspace.GetCurrentAnimationStage().PlayTimeTicks = newStageWindowSize * Workspace.stageLoopsNormal; - Workspace.GetCurrentAnimationStage().PlayTimeTicksQuick = newStageWindowSize * Workspace.stageLoopsQuick; + Workspace.GetCurrentAnimationStage().PlayTimeTicks = newStageWindowSize * StageLoopsNormal; + Workspace.GetCurrentAnimationStage().PlayTimeTicksQuick = newStageWindowSize * StageLoopsQuick; } public void AddAnimationClip(int actorID = -1) @@ -134,7 +144,7 @@ namespace RimWorldAnimationStudio clip.Keyframes.Add(keyframeB); } - clip.BuildSimpleCurves(); + animationClips.Add(clip); } // Pre-save / post-load diff --git a/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs b/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs index 629dee64..54575122 100644 --- a/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs +++ b/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs @@ -31,20 +31,20 @@ namespace RimWorldAnimationStudio [XmlIgnore] public List Addons { get { return addons.NullOrEmpty() ? addons = new List() : addons; } - set { addons = value.NotNullOrEmpty() ? value : null; EventsManager.OnPawnAnimationClipChanged(this); } + set { addons = value.NotNullOrEmpty() ? value : null; } } [XmlIgnore] public List Keyframes { get { return keyframes.NullOrEmpty() ? keyframes = new List() : keyframes; } - set { keyframes = value.NotNullOrEmpty() ? value : null; EventsManager.OnPawnAnimationClipChanged(this); } + set { keyframes = value.NotNullOrEmpty() ? value : null; } } [XmlIgnore] public List Tags { get { return tags.NullOrEmpty() ? tags = new List() : tags; } - set { tags = value.NotNullOrEmpty() ? value : null; EventsManager.OnPawnAnimationClipChanged(this); } + set { tags = value.NotNullOrEmpty() ? value : null; } } // Local data @@ -235,7 +235,7 @@ namespace RimWorldAnimationStudio foreach (PawnKeyframe keyframe in keyframesToClone) { - PawnAnimationClip clip = Workspace.GetAnimationClipThatOwnsKeyframe(keyframe.keyframeID, out int clipID); + PawnAnimationClip clip = Workspace.GetAnimationClipThatOwnsKeyframe(keyframe.keyframeID); if (clip == null) { Debug.LogWarning("Cannot clone pawn keyframe - no clip owns this keyframe"); continue; } @@ -244,7 +244,7 @@ namespace RimWorldAnimationStudio { Debug.LogWarning("Cannot clone pawn keyframe - a keyframe already exists at this tick"); return; } PawnKeyframe cloneFrame = keyframe.Copy(); - cloneFrame.GenerateKeyframeID(clipID); + cloneFrame.GenerateKeyframeID(clip.GetOwningActorID()); cloneFrame.atTick = Workspace.StageTick; PawnKeyframe nextKeyframe = clip.Keyframes.FirstOrDefault(x => x.atTick > Workspace.StageTick); @@ -301,8 +301,8 @@ namespace RimWorldAnimationStudio if (Workspace.DoesPawnKeyframeExistAtTick(Workspace.StageID, targetActorID, tickToPasteAt)) { - PawnKeyframe oldKeyframe = Workspace.animationDef.AnimationStages[Workspace.StageID].AnimationClips[targetActorID].Keyframes.First(x => x.atTick == tickToPasteAt); - RemovePawnKeyframe(targetActorID, oldKeyframe.keyframeID, true); + PawnKeyframe oldKeyframe = Workspace.GetPawnAnimationClip(targetActorID).Keyframes.First(x => x.atTick == tickToPasteAt); + Workspace.GetAnimationClipThatOwnsKeyframe(oldKeyframe.keyframeID).RemovePawnKeyframe(oldKeyframe.keyframeID, true); } PawnKeyframe clonedKeyframe = copiedKeyframe.Copy(); @@ -330,34 +330,28 @@ namespace RimWorldAnimationStudio Workspace.RecordEvent("Keyframe pasted"); } - public void RemovePawnKeyframe() + public void RemovePawnKeyframe(int keyframeID, bool force = false) { - foreach (int keyframeID in Workspace.keyframeID) - { - if (Workspace.GetAnimationClipThatOwnsKeyframe(keyframeID, out int clipID) != null) - { RemovePawnKeyframe(clipID, keyframeID); } - } - } - - public void RemovePawnKeyframe(int actorID, int keyframeID, bool force = false) - { - PawnKeyframe keyframe = Workspace.GetPawnKeyframe(actorID, keyframeID); - PawnAnimationClip clip = Workspace.animationDef.AnimationStages[Workspace.StageID].AnimationClips[actorID]; - - if (keyframe == null || clip == null) return; + PawnKeyframe keyframe = Workspace.GetPawnKeyframe(keyframeID); + if (keyframe == null || IsOwnerOfKeyframe(keyframeID) == false) return; if (keyframe.atTick == Constants.minTick && force == false) { Debug.LogWarning("Cannot delete key frame - the first key frame of an animation clip cannot be deleted"); return; } - if (clip.Keyframes.Count <= 2 && force == false) + if (Keyframes.Count <= 2 && force == false) { Debug.LogWarning("Cannot delete key frame - an animation clip must have two or more keyframes"); return; } - clip.Keyframes.Remove(keyframe); - clip.BuildSimpleCurves(); + Keyframes.Remove(keyframe); + BuildSimpleCurves(); Workspace.RecordEvent("Keyframe deletion"); } + public bool IsOwnerOfKeyframe(int keyframeID) + { + return Keyframes.Any(x => x.keyframeID == keyframeID); + } + public float GetStageTickPercentage() { return (float)(Workspace.StageTick % duration) / duration; diff --git a/Assets/Scripts/AnimationComponents/PawnKeyframe.cs b/Assets/Scripts/AnimationComponents/PawnKeyframe.cs index 67775372..08930dce 100644 --- a/Assets/Scripts/AnimationComponents/PawnKeyframe.cs +++ b/Assets/Scripts/AnimationComponents/PawnKeyframe.cs @@ -40,79 +40,79 @@ namespace RimWorldAnimationStudio [XmlIgnore] public float BodyAngle { get { return bodyAngle.HasValue ? bodyAngle.Value : 0f; } - set { bodyAngle = value; EventsManager.OnPawnKeyframeChanged(this); } + set { bodyAngle = value; } } [XmlIgnore] public float HeadAngle { get { return headAngle.HasValue ? headAngle.Value : (float)(headAngle = 0f); } - set { headAngle = value; EventsManager.OnPawnKeyframeChanged(this); } + set { headAngle = value; } } [XmlIgnore] public float HeadBob { get { return headBob.HasValue ? headBob.Value : (float)(headBob = 0f); } - set { headBob = value; EventsManager.OnPawnKeyframeChanged(this); } + set { headBob = value; } } [XmlIgnore] public float BodyOffsetX { get { return bodyOffsetX.HasValue ? bodyOffsetX.Value : (float)(bodyOffsetX = 0f); } - set { bodyOffsetX = value; EventsManager.OnPawnKeyframeChanged(this); } + set { bodyOffsetX = value; } } [XmlIgnore] public float BodyOffsetZ { get { return bodyOffsetZ.HasValue ? bodyOffsetZ.Value : (float)(bodyOffsetZ = 0f); } - set { bodyOffsetZ = value; EventsManager.OnPawnKeyframeChanged(this); } + set { bodyOffsetZ = value; } } [XmlIgnore] public int HeadFacing { get { return headFacing.HasValue ? headFacing.Value : (int)(headFacing = 2); } - set { headFacing = value; EventsManager.OnPawnKeyframeChanged(this); } + set { headFacing = value; } } [XmlIgnore] public int BodyFacing { get { return bodyFacing.HasValue ? bodyFacing.Value : (int)(bodyFacing = 2); } - set { bodyFacing = value; EventsManager.OnPawnKeyframeChanged(this); } + set { bodyFacing = value; } } [XmlIgnore] public float GenitalAngle { get { return genitalAngle.HasValue ? genitalAngle.Value : (float)(genitalAngle = 0f); } - set { genitalAngle = value; EventsManager.OnPawnKeyframeChanged(this); } + set { genitalAngle = value; } } [XmlIgnore] public bool Quiver { get { return quiver == true; } - set { quiver = value; EventsManager.OnPawnKeyframeChanged(this); } + set { quiver = value; } } [XmlIgnore] public int TickDuration { get { return tickDuration.HasValue ? tickDuration.Value : (int)(tickDuration = 0); } - set { tickDuration = value; EventsManager.OnPawnKeyframeChanged(this); } + set { tickDuration = value; } } [XmlIgnore] public string SoundEffect { get { return soundEffect; } - set { soundEffect = value; EventsManager.OnPawnKeyframeChanged(this); } + set { soundEffect = value; } } [XmlIgnore] public List Tags { get { return tags.NullOrEmpty() ? tags = new List() : tags; } - set { tags = value.NotNullOrEmpty() ? value : null; EventsManager.OnPawnKeyframeChanged(this); } + set { tags = value.NotNullOrEmpty() ? value : null; } } [XmlIgnore] public List AddonKeyframes { get { return addonKeyframes.NullOrEmpty() ? addonKeyframes = new List() : addonKeyframes; } - set { addonKeyframes = value.NotNullOrEmpty()? value : null; EventsManager.OnPawnKeyframeChanged(this); } + set { addonKeyframes = value.NotNullOrEmpty()? value : null; } } // Local data @@ -148,6 +148,63 @@ namespace RimWorldAnimationStudio return AddonKeyframes.FirstOrDefault(x => x.AddonName == addonName); } + public void AdjustActor(Vector2 deltaOffset) + { + float deltaAngle = -deltaOffset.x * 33.3333f + deltaOffset.y * 33.3333f; + int facing = deltaOffset.x < 0 ? 3 : deltaOffset.y < 0 ? 2 : deltaOffset.x > 0 ? 1 : 0; + + switch (Workspace.actorManipulationMode) + { + case ActorManipulationMode.Pan: MoveActor(deltaOffset); break; + case ActorManipulationMode.Rotate: RotateActor(deltaAngle); break; + case ActorManipulationMode.Face: FaceActor(facing); break; + } + } + + public void MoveActor(Vector2 deltaOffset) + { + if (Workspace.selectedBodyPart == null) + { + BodyOffsetX += deltaOffset.x; + BodyOffsetZ += deltaOffset.y; + } + + else if (Workspace.selectedBodyPart.bodyPart.ToLower() == "head") + { HeadBob += deltaOffset.y; } + + Workspace.GetCurrentPawnAnimationClip().BuildSimpleCurves(); + Workspace.RecordEvent("Actor position / orientation"); + } + + public void RotateActor(float deltaAngle) + { + if (Workspace.selectedBodyPart == null) + { BodyAngle += deltaAngle; } + + else if (Workspace.selectedBodyPart.bodyPart.ToLower() == "head") + { HeadAngle += deltaAngle; } + + else if (Workspace.selectedBodyPart.bodyPart.ToLower() == "appendage") + { GenitalAngle -= deltaAngle; } + + Workspace.GetCurrentPawnAnimationClip().BuildSimpleCurves(); + Workspace.RecordEvent("Actor position / orientation"); + } + + public void FaceActor(int facing) + { + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); + + if (Workspace.selectedBodyPart == null) + { keyframe.BodyFacing = facing; } + + else if (Workspace.selectedBodyPart.bodyPart.ToLower() == "head") + { keyframe.HeadFacing = facing; } + + Workspace.GetCurrentPawnAnimationClip().BuildSimpleCurves(); + Workspace.RecordEvent("Actor position / orientation"); + } + // Pre-save / post-load public void OnPreSave() { @@ -157,7 +214,7 @@ namespace RimWorldAnimationStudio foreach (AddonKeyframe addonKeyframe in AddonKeyframes) { - ActorAddon addon = Workspace.GetAnimationClipThatOwnsKeyframe(keyframeID, out int clipID).GetActorAddon(addonKeyframe.AddonName); + ActorAddon addon = Workspace.GetAnimationClipThatOwnsKeyframe(keyframeID).GetActorAddon(addonKeyframe.AddonName); if (addon.Render) { addonKeyframes.Add(addonKeyframe.Copy()); } diff --git a/Assets/Scripts/Data/ActorPosition.cs b/Assets/Scripts/Data/ActorPosition.cs new file mode 100644 index 00000000..7f86b12f --- /dev/null +++ b/Assets/Scripts/Data/ActorPosition.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace RimWorldAnimationStudio +{ + public class ActorPosition + { + public float bodyOffsetX; + public float bodyOffsetZ; + public float bodyAngle; + public float headBob; + public float headAngle; + public float genitalAngle; + + public int bodyFacing; + public int headFacing; + + public ActorPosition(int actorID, int atTick) + { + Actor actor = Workspace.GetActor(actorID); + PawnAnimationClip clip = Workspace.GetPawnAnimationClip(actorID); + + float clipPercent = atTick / Workspace.StageWindowSize; + if (atTick > Constants.minTick && atTick == clip.duration) clipPercent = 1f; + + if (Workspace.GetCurrentAnimationStage().IsLooping == false) + { clipPercent = (float)atTick / clip.duration; } + + bodyOffsetX = clip.BodyOffsetX.Evaluate(clipPercent); + bodyOffsetZ = clip.BodyOffsetZ.Evaluate(clipPercent); + bodyAngle = clip.BodyAngle.Evaluate(clipPercent); + headBob = clip.HeadBob.Evaluate(clipPercent); + headAngle = clip.HeadAngle.Evaluate(clipPercent); + genitalAngle = clip.GenitalAngle.Evaluate(clipPercent); + + bodyFacing = (int)clip.BodyFacing.Evaluate(clipPercent); + headFacing = (int)clip.HeadFacing.Evaluate(clipPercent); + } + } +} diff --git a/Assets/Scripts/Data/ActorPosition.cs.meta b/Assets/Scripts/Data/ActorPosition.cs.meta new file mode 100644 index 00000000..219921a1 --- /dev/null +++ b/Assets/Scripts/Data/ActorPosition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e2a9b0bb71978ea49909b3e1814303a5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Data/Constants.cs b/Assets/Scripts/Data/Constants.cs index 1a24cdb0..727c6daa 100644 --- a/Assets/Scripts/Data/Constants.cs +++ b/Assets/Scripts/Data/Constants.cs @@ -24,6 +24,7 @@ namespace RimWorldAnimationStudio // Colors used public static Color ColorWhite = new Color(1f, 1f, 1f); public static Color ColorGreen = new Color(0f, 1f, 0f); + public static Color ColorLightGreen = new Color(0.75f, 1f, 0.75f); public static Color ColorGoldYellow = new Color(1f, 0.85f, 0f); public static Color ColorDarkGold = new Color(0.75f, 0.64f, 0f); public static Color ColorLightGrey = new Color(0.9f, 0.9f, 0.9f); diff --git a/Assets/Scripts/GUI/Actors/ActorBody.cs b/Assets/Scripts/GUI/Actors/ActorBody.cs index 1eb6558e..0ae4ce1c 100644 --- a/Assets/Scripts/GUI/Actors/ActorBody.cs +++ b/Assets/Scripts/GUI/Actors/ActorBody.cs @@ -9,34 +9,40 @@ namespace RimWorldAnimationStudio public class ActorBody : MonoBehaviour, IPointerClickHandler, IDragHandler, IEndDragHandler { public int actorID; - public bool isSelected = false; - public SpriteRenderer bodyRenderer; - public SpriteRenderer headRenderer; - public SpriteRenderer appendageRenderer; - private Vector3 delta = new Vector3(); + private Vector3 dragDelta = new Vector3(); - public bool actorBodyPartSelected { get { return GetComponentsInChildren().Any(x => x.isSelected); } } - - public void Initialize(int actorID) + private void Start() { - this.actorID = actorID; + EventsManager.onActorBodyPartSelected.AddListener(delegate(ActorBodyPart bodyPart) { OnActorBodyPartSelected(bodyPart); }); + EventsManager.onActorBodySelected.AddListener(delegate(ActorBody actorBody) { OnActorBodySelected(actorBody); }); } - public void Update() + public void OnActorBodySelected(ActorBody actorBody) { - if (Workspace.ActorID == actorID && Workspace.selectedBodyPart == null) + if (actorBody == this) { bodyRenderer.color = Constants.ColorGreen; } else { bodyRenderer.color = Constants.ColorWhite; } + } - foreach (ActorAddon addon in Workspace.GetCurrentAnimationStage().AnimationClips[actorID].Addons) - { - ActorBodyPart bodyPart = GetComponentsInChildren(true).FirstOrDefault(x => x.addonName == addon.AddonName); - bodyPart?.gameObject?.SetActive(addon.Render); - } + public void OnActorBodyPartSelected(ActorBodyPart bodyPart) + { + if (bodyPart.parent == this) + { bodyRenderer.color = Constants.ColorLightGreen; } + + else + { bodyRenderer.color = Constants.ColorWhite; } + } + + public void Initialize(int actorID) + { + this.actorID = actorID; + + if (actorID == Workspace.ActorID) + { Activate(); } } public void OnPointerClick(PointerEventData eventData) @@ -52,19 +58,15 @@ namespace RimWorldAnimationStudio Activate(); PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); - - if (keyframe == null) - { Debug.LogWarning("Cannot alter actor - no keyframe data available"); return; } - Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); - if (delta == Vector3.zero) - { delta = mousePosition - transform.position; } + if (dragDelta == Vector3.zero) + { dragDelta = mousePosition - transform.position; } if (Workspace.actorManipulationMode == ActorManipulationMode.Pan) { - keyframe.BodyOffsetX = mousePosition.x - delta.x - Workspace.animationDef.Actors[actorID].GetFinalTransformOffset().x; - keyframe.BodyOffsetZ = mousePosition.y - delta.y - Workspace.animationDef.Actors[actorID].GetFinalTransformOffset().y; + keyframe.BodyOffsetX = mousePosition.x - dragDelta.x - Workspace.GetActor(actorID).GetFinalTransformOffset().x; + keyframe.BodyOffsetZ = mousePosition.y - dragDelta.y - Workspace.GetActor(actorID).GetFinalTransformOffset().y; } else if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate) @@ -84,18 +86,27 @@ namespace RimWorldAnimationStudio PawnAnimationClip clip = Workspace.GetPawnAnimationClip(actorID); clip.BuildSimpleCurves(); + + EventsManager.OnPawnKeyframeChanged(keyframe); } public void OnEndDrag(PointerEventData eventData) { Workspace.RecordEvent("Actor position / orientation"); - delta = Vector3.zero; + dragDelta = Vector3.zero; + } + + public ActorBodyPart GetBodyPart(string bodyPart) + { + return GetComponentsInChildren(true)?.FirstOrDefault(x => x.bodyPart.ToLower() == bodyPart); } public void Activate() { Workspace.ActorID = actorID; Workspace.selectedBodyPart = null; + + EventsManager.OnActorBodySelected(this); } } } diff --git a/Assets/Scripts/GUI/Actors/ActorBodyPart.cs b/Assets/Scripts/GUI/Actors/ActorBodyPart.cs index 11b57d55..bdbfc23e 100644 --- a/Assets/Scripts/GUI/Actors/ActorBodyPart.cs +++ b/Assets/Scripts/GUI/Actors/ActorBodyPart.cs @@ -10,22 +10,39 @@ namespace RimWorldAnimationStudio { public SpriteRenderer bodyPartRenderer; public ActorBody parent; - public bool isHead = false; - public string addonName; - public bool isSelected = false; + public string bodyPart; - private Vector3 delta = new Vector3(); + private Vector3 dragDelta = new Vector3(); public void Start() { - //Workspace.onActorChanged.AddListener(delegate { }); + EventsManager.onActorBodyPartSelected.AddListener(delegate (ActorBodyPart bodyPart) { OnActorBodyPartSelected(bodyPart); }); + EventsManager.onActorBodySelected.AddListener(delegate (ActorBody actorBody) { OnActorBodySelected(actorBody); }); } - public void Update() + public void OnActorAddonChange(ActorAddon actorAddon) { - if ((Workspace.ActorID == parent.actorID && Workspace.selectedBodyPart == null) || Workspace.selectedBodyPart == this) + if (actorAddon.AddonName == bodyPart) + { gameObject?.SetActive(actorAddon.Render); } + } + + public void OnActorBodySelected(ActorBody actorBody) + { + if (actorBody == parent) + { bodyPartRenderer.color = Constants.ColorLightGreen; } + + else + { bodyPartRenderer.color = Constants.ColorWhite; } + } + + public void OnActorBodyPartSelected(ActorBodyPart bodyPart) + { + if (bodyPart == this) { bodyPartRenderer.color = Constants.ColorGreen; } + else if (bodyPart.parent == parent) + { bodyPartRenderer.color = Constants.ColorLightGreen; } + else { bodyPartRenderer.color = Constants.ColorWhite; } } @@ -43,71 +60,18 @@ namespace RimWorldAnimationStudio Activate(); PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); - - if (keyframe == null) - { Debug.LogWarning("Cannot alter actor - no keyframe data available"); return; } - Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); - if (delta == Vector3.zero) - { delta = mousePosition - transform.position; } + if (dragDelta == Vector3.zero) + { dragDelta = mousePosition - transform.position; } - if (addonName != null && addonName != "") - { - AddonKeyframe addonKeyframe = keyframe.GetAddonKeyframe(addonName); - ActorAddon addon = Workspace.GetCurrentPawnAnimationClip().GetActorAddon(addonName); - - if (Workspace.actorManipulationMode == ActorManipulationMode.Pan) - { - Vector3 anchor; - - ActorBody anchoringActorBody = AnimationController.Instance.actorBodies.GetComponentsInChildren()?.FirstOrDefault(x => x.actorID == addon.AnchoringActor); - Vector3 bodyPos = new Vector3(anchoringActorBody.transform.position.x, anchoringActorBody.transform.position.y, 0); - PawnRaceDef pawnRaceDef = Workspace.animationDef.Actors[addon.AnchoringActor].GetPawnRaceDef(); - Actor anchoringActor = Workspace.animationDef.Actors[addon.AnchoringActor]; - int bodyFacing = (int)Workspace.GetCurrentAnimationStage().AnimationClips[addon.AnchoringActor].BodyFacing.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize); - - switch (addon.AnchorName) - { - case "torso": anchor = bodyPos; break; - case "head": anchor = new Vector3(anchoringActorBody.transform.Find("ActorHead").position.x, anchoringActorBody.transform.Find("ActorHead").position.y, 0); break; - case "groin": anchor = bodyPos + Quaternion.AngleAxis(anchoringActorBody.transform.rotation.eulerAngles.z, Vector3.forward) * PawnUtility.GroinOffsetAt(anchoringActor.bodyType, bodyFacing).FlipAxes(); break; - case "left breast": anchor = bodyPos + Quaternion.AngleAxis(anchoringActorBody.transform.rotation.eulerAngles.z, Vector3.forward) * PawnUtility.BreastLeftOffsetAt(anchoringActor.bodyType, bodyFacing).FlipAxes(); break; - case "right breast": anchor = bodyPos + Quaternion.AngleAxis(anchoringActorBody.transform.rotation.eulerAngles.z, Vector3.forward) * PawnUtility.BreastRightOffsetAt(anchoringActor.bodyType, bodyFacing).FlipAxes(); break; - default: anchor = new Vector3(); break; - } - - transform.position = new Vector3(mousePosition.x, mousePosition.y, 0f); - - addonKeyframe.PosX = transform.position.x - anchor.x; - addonKeyframe.PosZ = transform.position.y - anchor.y; - - ActorKeyframeCard.Instance.transform.GetComponentsInChildren()?.FirstOrDefault(x => x.addonName == addonName)?.OnKeyframeValueChanged(); - } - - else if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate) - { - float angle = -Vector2.SignedAngle(Vector2.down, (Vector2)mousePosition - (Vector2)transform.position); - addonKeyframe.Rotation = angle; - } - - else if (Workspace.actorManipulationMode == ActorManipulationMode.Face) - { - //float angle = Vector2.SignedAngle(Vector2.up, (Vector2)mousePosition - (Vector2)transform.position); - //int facing = -Mathf.RoundToInt(angle / 90f); - //facing = facing < 0 ? facing + 4 : facing; - - //keyframe.headFacing = facing; - } - } - - else if (isHead) + if (bodyPart.ToLower() == "head") { if (Workspace.actorManipulationMode == ActorManipulationMode.Pan) { - // It's stupid but it works + // It's stupid, but it works Vector3 localPosA = transform.localPosition; - transform.position = mousePosition - delta; + transform.position = mousePosition - dragDelta; Vector3 localPosB = transform.localPosition; transform.localPosition = localPosA; @@ -130,31 +94,55 @@ namespace RimWorldAnimationStudio } } - else + else if (bodyPart.ToLower() == "appendage") { if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate) { float angle = -Vector2.SignedAngle(Vector2.up, (Vector2)mousePosition - (Vector2)transform.position); keyframe.GenitalAngle = angle; + } + } - Workspace.GetCurrentActor().ControlGenitalAngle = Workspace.animationDef.AnimationStages.Any(x => x.AnimationClips[Workspace.ActorID].Keyframes.Any(y => y.GenitalAngle != 0)); + else + { + AddonKeyframe addonKeyframe = keyframe.GetAddonKeyframe(bodyPart); + ActorAddon addon = Workspace.GetCurrentPawnAnimationClip().GetActorAddon(bodyPart); + + if (Workspace.actorManipulationMode == ActorManipulationMode.Pan) + { + ActorBody anchoringActorBody = AnimationController.Instance.actorBodies.GetComponentsInChildren()?.FirstOrDefault(x => x.actorID == addon.AnchoringActor); + Vector3 anchor = PawnUtility.GetBodyPartAnchor(anchoringActorBody, addon.addonName); + transform.position = new Vector3(mousePosition.x, mousePosition.y, 0f); + + addonKeyframe.PosX = transform.position.x - anchor.x; + addonKeyframe.PosZ = transform.position.y - anchor.y; + } + + else if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate) + { + float angle = -Vector2.SignedAngle(Vector2.down, (Vector2)mousePosition - (Vector2)transform.position); + addonKeyframe.Rotation = angle; } } PawnAnimationClip clip = Workspace.GetPawnAnimationClip(parent.actorID); clip.BuildSimpleCurves(); + + EventsManager.OnPawnKeyframeChanged(keyframe); } public void OnEndDrag(PointerEventData eventData) { Workspace.RecordEvent("Actor position / orientation"); - delta = Vector3.zero; + dragDelta = Vector3.zero; } public void Activate() { Workspace.ActorID = parent.actorID; Workspace.selectedBodyPart = this; + + EventsManager.OnActorBodyPartSelected(this); } } } diff --git a/Assets/Scripts/GUI/AnimationLengthDisplay.cs b/Assets/Scripts/GUI/AnimationLengthDisplay.cs new file mode 100644 index 00000000..7e58ceb0 --- /dev/null +++ b/Assets/Scripts/GUI/AnimationLengthDisplay.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using UnityEngine.UI; + +namespace RimWorldAnimationStudio +{ + public class AnimationLengthDisplay : MonoBehaviour + { + public Text stageLengthNormalText; + public Text animationLengthNormalText; + public Text stageLengthQuickText; + public Text animationLengthQuickText; + + public void Start() + { + + } + + public void UpdateGUI() + { + stageLengthNormalText.text = "Stage length (normal): " + Workspace.GetCurrentAnimationStage().PlayTimeTicks + " (" + Workspace.GetCurrentAnimationStage().PlayTimeTicks / 60f + " s)"; + animationLengthNormalText.text = "Animation length (normal): " + Workspace.animationDef.animationTimeTicks + " (" + Workspace.animationDef.animationTimeTicks / 60f + " s)"; + + stageLengthQuickText.text = "Stage length (quickie): " + Workspace.GetCurrentAnimationStage().PlayTimeTicksQuick + " (" + Workspace.GetCurrentAnimationStage().PlayTimeTicksQuick / 60f + " s)"; + animationLengthQuickText.text = "Animation length (quickie): " + Workspace.animationDef.animationTimeTicksQuick + " (" + Workspace.animationDef.animationTimeTicksQuick / 60f + " s)"; + + LayoutRebuilder.ForceRebuildLayoutImmediate(stageLengthQuickText.GetComponent()); + LayoutRebuilder.ForceRebuildLayoutImmediate(animationLengthQuickText.GetComponent()); + } + } +} diff --git a/Assets/Scripts/GUI/AnimationLengthDisplay.cs.meta b/Assets/Scripts/GUI/AnimationLengthDisplay.cs.meta new file mode 100644 index 00000000..40d4cd95 --- /dev/null +++ b/Assets/Scripts/GUI/AnimationLengthDisplay.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 060e49b40b1097e46b662059e4e29cdf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/GUI/AnimationTimeline.cs b/Assets/Scripts/GUI/AnimationTimeline.cs index b5724802..217f57ac 100644 --- a/Assets/Scripts/GUI/AnimationTimeline.cs +++ b/Assets/Scripts/GUI/AnimationTimeline.cs @@ -75,7 +75,7 @@ namespace RimWorldAnimationStudio public void InitiateUpdateOfGhostFrames() { - if (AnimationController.Instance.IsTimelineDirty()) return; + //if (AnimationController.Instance.IsTimelineDirty()) return; BroadcastMessage("UpdateGhostFrames"); } @@ -86,7 +86,7 @@ namespace RimWorldAnimationStudio int? siblingCount = anchorTransform.parent.GetComponentsInChildren()?.ToList()?.Count(); if (siblingIndex != null && siblingCount != null && MoveAnimationTimeline(siblingIndex.Value, delta)) - { AnimationController.Instance.InitializeAnimationTimeline(); } + { AnimationController.Instance.Initialize(); } } public bool MoveAnimationTimeline(int startIndex, int delta) diff --git a/Assets/Scripts/GUI/Cards/ActorAddonCard.cs b/Assets/Scripts/GUI/Cards/ActorAddonKeyframeCard.cs similarity index 63% rename from Assets/Scripts/GUI/Cards/ActorAddonCard.cs rename to Assets/Scripts/GUI/Cards/ActorAddonKeyframeCard.cs index 84110297..a79d6ed6 100644 --- a/Assets/Scripts/GUI/Cards/ActorAddonCard.cs +++ b/Assets/Scripts/GUI/Cards/ActorAddonKeyframeCard.cs @@ -8,7 +8,7 @@ using UnityEngine.UI; namespace RimWorldAnimationStudio { - public class ActorAddonCard : MonoBehaviour + public class ActorAddonKeyframeCard : MonoBehaviour { public string addonName; public InputField xOffsetField; @@ -17,30 +17,33 @@ namespace RimWorldAnimationStudio public void Start() { - xOffsetField.onEndEdit.AddListener(delegate { OnFieldValueChanged(); }); - zOffsetField.onEndEdit.AddListener(delegate { OnFieldValueChanged(); }); - rotationField.onEndEdit.AddListener(delegate { OnFieldValueChanged(); }); + EventsManager.onAnimationChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onStageIDChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onActorIDChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onStageTickChanged.AddListener(delegate { Debug.Log("stagetick"); UpdateGUI(); }); - AnimationController.Instance.animationClipTimeField.onValueChanged.AddListener(delegate { OnKeyframeValueChanged(); }); + xOffsetField.onEndEdit.AddListener(delegate { OnValueChanged(); }); + zOffsetField.onEndEdit.AddListener(delegate { OnValueChanged(); }); + rotationField.onEndEdit.AddListener(delegate { OnValueChanged(); }); + + UpdateGUI(); } - public void OnFieldValueChanged() + public void OnValueChanged() { - if (Workspace.animationDef == null) return; - PawnAnimationClip clip = Workspace.GetCurrentPawnAnimationClip(); PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); keyframe.GetAddonKeyframe(addonName).PosX = float.Parse(xOffsetField.text); keyframe.GetAddonKeyframe(addonName).PosZ = float.Parse(zOffsetField.text); keyframe.GetAddonKeyframe(addonName).Rotation = float.Parse(rotationField.text); - clip.BuildSimpleCurves(); + Workspace.GetCurrentPawnAnimationClip().BuildSimpleCurves(); + Workspace.RecordEvent("Actor addon position / orientation"); } - public void OnKeyframeValueChanged() + public void UpdateGUI() { - if (Workspace.animationDef == null) return; PawnAnimationClip clip = Workspace.GetCurrentPawnAnimationClip(); xOffsetField.SetTextWithoutNotify(clip.GetActorAddon(addonName).PosX.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize).ToString()); diff --git a/Assets/Scripts/GUI/Cards/ActorAddonCard.cs.meta b/Assets/Scripts/GUI/Cards/ActorAddonKeyframeCard.cs.meta similarity index 100% rename from Assets/Scripts/GUI/Cards/ActorAddonCard.cs.meta rename to Assets/Scripts/GUI/Cards/ActorAddonKeyframeCard.cs.meta diff --git a/Assets/Scripts/GUI/Cards/ActorCard.cs b/Assets/Scripts/GUI/Cards/ActorCard.cs index 211b9219..9ec1a120 100644 --- a/Assets/Scripts/GUI/Cards/ActorCard.cs +++ b/Assets/Scripts/GUI/Cards/ActorCard.cs @@ -28,7 +28,7 @@ namespace RimWorldAnimationStudio public void Start() { // General events - EventsManager.onAnimationDefChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onAnimationChanged.AddListener(delegate { UpdateGUI(); }); EventsManager.onActorIDChanged.AddListener(delegate { UpdateGUI(); }); EventsManager.onDefNamesChanged.AddListener(delegate { UpdateRaceDropdown(); }); @@ -69,6 +69,8 @@ namespace RimWorldAnimationStudio actor.SetPawnRaceOffset(new Vector2(x, z)); Workspace.RecordEvent("Actor offset"); + + UpdateGUI(); } public void OnDropdownChanged() @@ -107,8 +109,8 @@ namespace RimWorldAnimationStudio string bodyType = actor.bodyType; bodyTypeDropdown.SetValueWithoutNotify(bodyTypeDropdown.options.FindIndex(x => x.text == bodyType)); - bodyOffsetXField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.BodyTypeOffset.GetOffset(bodyType).x.ToString())); - bodyOffsetZField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.BodyTypeOffset.GetOffset(bodyType).z.ToString())); + bodyOffsetXField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.BodyTypeOffset.GetOffset(bodyType).x)); + bodyOffsetZField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.BodyTypeOffset.GetOffset(bodyType).z)); bodyTypeDropdown.interactable = actor.GetPawnRaceDef().isHumanoid; bodyOffsetXField.interactable = actor.GetPawnRaceDef().isHumanoid; @@ -117,8 +119,8 @@ namespace RimWorldAnimationStudio string race = actor.GetPawnRaceDef().defName; raceDropdown.SetValueWithoutNotify(raceDropdown.options.FindIndex(x => x.text == race)); - raceOffsetXField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.GetPawnRaceOffset().x.ToString())); - raceOffsetZField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.GetPawnRaceOffset().z.ToString())); + raceOffsetXField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.GetPawnRaceOffset().x)); + raceOffsetZField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.GetPawnRaceOffset().z)); } } } diff --git a/Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs b/Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs index 98ff43f3..a2c61b5a 100644 --- a/Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs +++ b/Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs @@ -15,17 +15,25 @@ namespace RimWorldAnimationStudio public InputField headRotationField; public InputField appendageRotationField; - public void Update() - { - if (Workspace.animationDef == null) - { return; } + private Actor actor { get { return Workspace.GetCurrentActor(); } } - positionXField.interactable = AnimationController.Instance.isAnimating == false; - positionZField.interactable = AnimationController.Instance.isAnimating == false; - rotationField.interactable = AnimationController.Instance.isAnimating == false; - headBobField.interactable = AnimationController.Instance.isAnimating == false; - headRotationField.interactable = AnimationController.Instance.isAnimating == false; - appendageRotationField.interactable = AnimationController.Instance.isAnimating == false; + private void Start() + { + EventsManager.onAnimationChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onStageIDChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onActorIDChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onStageTickChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onKeyframeCountChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onPawnKeyframeChanged.AddListener(delegate { UpdateGUI(); }); + + positionXField.onEndEdit.AddListener(delegate { OnValueChanged(); }); + positionZField.onEndEdit.AddListener(delegate { OnValueChanged(); }); + rotationField.onEndEdit.AddListener(delegate { OnValueChanged(); }); + headBobField.onEndEdit.AddListener(delegate { OnValueChanged(); }); + headRotationField.onEndEdit.AddListener(delegate { OnValueChanged(); }); + appendageRotationField.onEndEdit.AddListener(delegate { OnValueChanged(); }); + + UpdateGUI(); } public void OnValueChanged() @@ -39,70 +47,21 @@ namespace RimWorldAnimationStudio keyframe.HeadAngle = float.Parse(headRotationField.text); keyframe.GenitalAngle = float.Parse(appendageRotationField.text); - Workspace.animationDef.Actors[Workspace.ActorID].ControlGenitalAngle = keyframe.GenitalAngle != 0; - Workspace.GetPawnAnimationClip(Workspace.ActorID).BuildSimpleCurves(); - Workspace.RecordEvent("Actor position / orientation"); - } - - public void AdjustActor(Vector2 deltaOffset) - { - float deltaAngle = -deltaOffset.x * 33.3333f + deltaOffset.y * 33.3333f; - int facing = deltaOffset.x < 0 ? 3 : deltaOffset.y < 0 ? 2 : deltaOffset.x > 0 ? 1 : 0; - - switch (Workspace.actorManipulationMode) - { - case ActorManipulationMode.Pan: MoveActor(deltaOffset); break; - case ActorManipulationMode.Rotate: RotateActor(deltaAngle); break; - case ActorManipulationMode.Face: FaceActor(facing); break; - } - } - - public void MoveActor(Vector2 deltaOffset) - { - PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); - - if (Workspace.selectedBodyPart == null) - { - keyframe.BodyOffsetX += deltaOffset.x; - keyframe.BodyOffsetZ += deltaOffset.y; - } - - else if (Workspace.selectedBodyPart.isHead) - { keyframe.HeadBob += deltaOffset.y; } - Workspace.GetCurrentPawnAnimationClip().BuildSimpleCurves(); + Workspace.RecordEvent("Actor position / orientation"); } - public void RotateActor(float deltaAngle) + public void UpdateGUI() { - PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); + ActorPosition actorPosition = actor.GetCurrentPosition(); - if (Workspace.selectedBodyPart == null) - { keyframe.BodyAngle += deltaAngle; } - - else if (Workspace.selectedBodyPart.isHead) - { keyframe.HeadAngle += deltaAngle; } - - else - { keyframe.GenitalAngle -= deltaAngle; } - - Workspace.GetCurrentPawnAnimationClip().BuildSimpleCurves(); - Workspace.RecordEvent("Actor position / orientation"); - } - - public void FaceActor(int facing) - { - PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); - - if (Workspace.selectedBodyPart == null) - { keyframe.BodyFacing = facing; } - - else if (Workspace.selectedBodyPart.isHead) - { keyframe.HeadFacing = facing; } - - Workspace.GetCurrentPawnAnimationClip().BuildSimpleCurves(); - Workspace.RecordEvent("Actor position / orientation"); + positionXField.SetTextWithoutNotify(string.Format("{0:0.000}", actorPosition.bodyOffsetX)); + positionZField.SetTextWithoutNotify(string.Format("{0:0.000}", actorPosition.bodyOffsetZ)); + rotationField.SetTextWithoutNotify(string.Format("{0:0.000}", actorPosition.bodyAngle)); + headBobField.SetTextWithoutNotify(string.Format("{0:0.000}", actorPosition.headBob)); + headRotationField.SetTextWithoutNotify(string.Format("{0:0.000}", actorPosition.headAngle)); + appendageRotationField.SetTextWithoutNotify(string.Format("{0:0.000}", actorPosition.genitalAngle)); } } } \ No newline at end of file diff --git a/Assets/Scripts/GUI/Cards/AnimationControlCard.cs b/Assets/Scripts/GUI/Cards/AnimationControlCard.cs new file mode 100644 index 00000000..16fe082c --- /dev/null +++ b/Assets/Scripts/GUI/Cards/AnimationControlCard.cs @@ -0,0 +1,103 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEngine.UI; + +namespace RimWorldAnimationStudio +{ + public class AnimationControlCard : MonoBehaviour + { + public Dropdown stageLoopDropdown; + public InputField animationClipTimeField; + public InputField animationClipLengthField; + public Toggle stretchKeyframesToggle; + public InputField playBackSpeedField; + public Button playToggleButton; + public Slider stageTimelineSlider; + + private void Start() + { + EventsManager.onStageTickChanged.AddListener(delegate + { + animationClipTimeField.SetTextWithoutNotify(Workspace.StageTick.ToString()); + stageTimelineSlider.SetValueWithoutNotify(Workspace.StageTick); + }); + + EventsManager.onAnimationToggled.AddListener(delegate + { + playToggleButton.image.color = Workspace.isAnimating ? Constants.ColorGoldYellow : Constants.ColorWhite; + }); + + animationClipLengthField.text = Workspace.StageWindowSize.ToString(); + stageTimelineSlider.maxValue = Workspace.StageWindowSize; + } + + public void ToggleAnimation(bool forceOff = false) + { + Workspace.isAnimating = !Workspace.isAnimating; + if (forceOff) Workspace.isAnimating = false; + } + + public void OnStageTimelineSliderChange() + { + if (Workspace.animationDef == null) return; + + if (Workspace.StageTick != (int)stageTimelineSlider.value) + { + Workspace.StageTick = (int)stageTimelineSlider.value; + animationClipTimeField.text = Workspace.StageTick.ToString(); + } + } + + public void OnAnimationClipTimeFieldChange() + { + if (Workspace.animationDef == null) return; + + int.TryParse(animationClipTimeField.text, out int newStageTick); + Workspace.StageTick = Mathf.Clamp(newStageTick, Constants.minTick, Workspace.StageWindowSize); + stageTimelineSlider.value = Workspace.StageTick; + } + + public void OnAnimationClipLengthFieldChange() + { + if (Workspace.animationDef == null) return; + + int.TryParse(animationClipLengthField.text, out int newStageWindowSize); + newStageWindowSize = Mathf.Clamp(newStageWindowSize, Constants.minAnimationClipLength, Constants.maxAnimationClipLength); + + Debug.Log("Resizing animation clip length to " + newStageWindowSize.ToString() + " ticks."); + + if (stretchKeyframesToggle.isOn) + { Workspace.GetCurrentAnimationStage().StretchStageWindow(newStageWindowSize); } + + else + { + foreach (PawnAnimationClip clip in Workspace.GetCurrentAnimationStage().AnimationClips) + { + List keyframes = clip.Keyframes.Where(x => x.atTick > newStageWindowSize)?.ToList(); + + if (keyframes.NullOrEmpty()) + { continue; } + + foreach (PawnKeyframe keyframe in keyframes) + { + if (clip.Keyframes.Count <= 2) + { break; } + + clip.RemovePawnKeyframe(keyframe.keyframeID); + } + } + } + + Workspace.GetCurrentAnimationStage().ResizeStageWindow(newStageWindowSize); + Workspace.RecordEvent("Stage length"); + } + + public void OnPlayBackSpeedChange() + { + Workspace.PlayBackSpeed = float.Parse(playBackSpeedField.text); + playBackSpeedField.SetTextWithoutNotify(Workspace.PlayBackSpeed.ToString()); + } + } +} diff --git a/Assets/Scripts/GUI/Cards/AnimationControlCard.cs.meta b/Assets/Scripts/GUI/Cards/AnimationControlCard.cs.meta new file mode 100644 index 00000000..bd32a2f7 --- /dev/null +++ b/Assets/Scripts/GUI/Cards/AnimationControlCard.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b414452bfd6c9b4bb99542a51d77468 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/GUI/Cards/AnimationDefCard.cs b/Assets/Scripts/GUI/Cards/AnimationDefCard.cs index 015eb7b0..c0f05f37 100644 --- a/Assets/Scripts/GUI/Cards/AnimationDefCard.cs +++ b/Assets/Scripts/GUI/Cards/AnimationDefCard.cs @@ -15,7 +15,7 @@ namespace RimWorldAnimationStudio public void Start() { - EventsManager.onAnimationDefChanged.AddListener(delegate { UpdateInputFields(); }); + EventsManager.onAnimationChanged.AddListener(delegate { UpdateInputFields(); }); defNameField.onEndEdit.AddListener(delegate { Workspace.animationDef.DefName = defNameField.text; diff --git a/Assets/Scripts/GUI/Cards/StageCard.cs b/Assets/Scripts/GUI/Cards/StageCard.cs index 10bfe5d2..59923255 100644 --- a/Assets/Scripts/GUI/Cards/StageCard.cs +++ b/Assets/Scripts/GUI/Cards/StageCard.cs @@ -12,6 +12,30 @@ namespace RimWorldAnimationStudio public InputField stageNameField; public Image banner; + private int stageID { get { return transform.GetSiblingIndex(); } } + + public void Start() + { + EventsManager.onStageIDChanged.AddListener(delegate { Initialize(stageName.text); }); + stageNameField.onEndEdit.AddListener(delegate { OnNameChange(); }); + } + + public void Initialize(string stageName) + { + this.stageName.text = stageName; + + if (Workspace.StageID == transform.GetSiblingIndex()) + { + banner.gameObject.SetActive(true); + } + + else + { + banner.gameObject.SetActive(false); + stageNameField.gameObject.SetActive(false); + } + } + public void OnNameChange() { stageName.text = stageNameField.text; @@ -23,27 +47,7 @@ namespace RimWorldAnimationStudio public void OnMoveStage(int delta) { - int siblingCount = transform.parent.childCount; - int index = Mathf.Clamp(transform.GetSiblingIndex() + delta, 0, siblingCount - 1); - - transform.SetSiblingIndex(index); - } - - public void Initialize(string stageName) - { - this.stageName.text = stageName; - } - - public void Update() - { - if (Workspace.StageID == transform.GetSiblingIndex()) - { banner.gameObject.SetActive(true); } - - else - { - banner.gameObject.SetActive(false); - stageNameField.gameObject.SetActive(false); - } + Workspace.animationDef.MoveAnimationStage(stageID, delta); } public void OnPointerClick(PointerEventData eventData) diff --git a/Assets/Scripts/GUI/Cards/StageLoopsCard.cs b/Assets/Scripts/GUI/Cards/StageLoopsCard.cs new file mode 100644 index 00000000..6b7e7fd0 --- /dev/null +++ b/Assets/Scripts/GUI/Cards/StageLoopsCard.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using UnityEngine.UI; + +namespace RimWorldAnimationStudio +{ + public class StageLoopsCard : MonoBehaviour + { + public InputField stageLoopsNormalField; + public InputField stageLoopsQuickField; + + public void Start() + { + EventsManager.onAnimationChanged.AddListener(delegate { UpdateInputFields(); }); + EventsManager.onStageIDChanged.AddListener(delegate { UpdateInputFields(); }); + EventsManager.onAnimationStageChanged.AddListener(delegate { UpdateInputFields(); }); + + stageLoopsNormalField.onEndEdit.AddListener(delegate { OnStageLoopsNormalFieldChange(); }); + stageLoopsQuickField.onEndEdit.AddListener(delegate { OnStageLoopsFastFieldChange(); }); + + UpdateInputFields(); + } + + public void OnStageLoopsNormalFieldChange() + { + if (Workspace.animationDef == null) return; + + Workspace.GetCurrentAnimationStage().StageLoopsNormal = int.Parse(stageLoopsNormalField.text); + + EventsManager.OnAnimationStageChanged(Workspace.GetCurrentAnimationStage()); + Workspace.RecordEvent("Cycle count (normal)"); + + UpdateInputFields(); + } + + public void OnStageLoopsFastFieldChange() + { + if (Workspace.animationDef == null) return; + + Workspace.GetCurrentAnimationStage().StageLoopsQuick = int.Parse(stageLoopsQuickField.text); + + EventsManager.OnAnimationStageChanged(Workspace.GetCurrentAnimationStage()); + Workspace.RecordEvent("Cycle count (fast)"); + + UpdateInputFields(); + } + + public void UpdateInputFields() + { + stageLoopsNormalField.SetTextWithoutNotify(Workspace.GetCurrentAnimationStage().StageLoopsNormal.ToString()); + stageLoopsQuickField.SetTextWithoutNotify(Workspace.GetCurrentAnimationStage().StageLoopsQuick.ToString()); + } + } +} diff --git a/Assets/Scripts/GUI/Cards/StageLoopsCard.cs.meta b/Assets/Scripts/GUI/Cards/StageLoopsCard.cs.meta new file mode 100644 index 00000000..9cdcd40e --- /dev/null +++ b/Assets/Scripts/GUI/Cards/StageLoopsCard.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38691dc973d99734f8f0f2a240df73fe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/GUI/KeyframeSlider.cs b/Assets/Scripts/GUI/KeyframeSlider.cs index 0d28257f..403d80cc 100644 --- a/Assets/Scripts/GUI/KeyframeSlider.cs +++ b/Assets/Scripts/GUI/KeyframeSlider.cs @@ -35,12 +35,12 @@ namespace RimWorldAnimationStudio { this.timeline = timeline; this.clip = Workspace.GetPawnAnimationClip(actorID); - this.keyframe = Workspace.GetPawnKeyframe(actorID, keyframeID); + this.keyframe = Workspace.GetPawnKeyframe(keyframeID); this.actorID = actorID; this.keyframeID = keyframeID; - PawnKeyframe keyframe = Workspace.GetPawnKeyframe(actorID, keyframeID); + PawnKeyframe keyframe = Workspace.GetPawnKeyframe(keyframeID); maxValue = Workspace.StageWindowSize; value = keyframe.atTick.Value; @@ -132,7 +132,7 @@ namespace RimWorldAnimationStudio if (unlinkedSlider != null) { - if (AnimationController.Instance.stretchKeyframesToggle.isOn && unlinkedSlider.keyframe.atTick == pivotKeyframe.atTick) continue; + if (Workspace.stretchKeyframes && unlinkedSlider.keyframe.atTick == pivotKeyframe.atTick) continue; unlinkedSlider.linkedSlider = this; unlinkedSlider.linkedOffset = unlinkedSlider.keyframe.atTick.Value - keyframe.atTick.Value; @@ -176,7 +176,7 @@ namespace RimWorldAnimationStudio foreach (PawnKeyframe _keyframe in keyframesToCheck) { if (_keyframe != keyframe) - { Workspace.GetCurrentPawnAnimationClip().RemovePawnKeyframe(actorID, _keyframe.keyframeID); } + { Workspace.GetAnimationClipThatOwnsKeyframe(_keyframe.keyframeID).RemovePawnKeyframe(_keyframe.keyframeID); } } } @@ -196,7 +196,7 @@ namespace RimWorldAnimationStudio foreach (PawnKeyframe _keyframe in keyframesToCheck) { if (_keyframe.keyframeID != linkedKeyframe.keyframeID) - { Workspace.GetCurrentPawnAnimationClip().RemovePawnKeyframe(actorID, _keyframe.keyframeID); Debug.Log("delete"); } + { Workspace.GetAnimationClipThatOwnsKeyframe(_keyframe.keyframeID).RemovePawnKeyframe(_keyframe.keyframeID); } } } } @@ -219,10 +219,10 @@ namespace RimWorldAnimationStudio if (Workspace.keyframeID.NullOrEmpty() || Workspace.keyframeID.Contains(keyframeID) == false) { linkedSlider = null; } - else if (AnimationController.Instance.stretchKeyframesToggle.isOn && linkedSlider != null) + else if (Workspace.stretchKeyframes && linkedSlider != null) { value = Mathf.CeilToInt(linkedSlider.keyframe.atTick.Value + linkedOffset * linkedSlider.ScaledOffsetFromPivot()); } - else if (AnimationController.Instance.stretchKeyframesToggle.isOn == false && linkedSlider != null) + else if (Workspace.stretchKeyframes == false && linkedSlider != null) { value = Mathf.Clamp(linkedSlider.keyframe.atTick.Value + linkedOffset, Constants.minTick + 1, Workspace.StageWindowSize); } else if (keyframe.atTick.Value != value) @@ -242,7 +242,7 @@ namespace RimWorldAnimationStudio { handleImage.color = Constants.ColorGrey; } // Show sound symbol - string soundDef = Workspace.GetPawnKeyframe(actorID, keyframeID)?.SoundEffect; + string soundDef = Workspace.GetPawnKeyframe(keyframeID)?.SoundEffect; soundIcon.SetActive(soundDef != null && soundDef != "" && soundDef != "None"); } diff --git a/Assets/Scripts/GUI/LinearScale.cs b/Assets/Scripts/GUI/LinearScale.cs index 93d23927..7dceb0e7 100644 --- a/Assets/Scripts/GUI/LinearScale.cs +++ b/Assets/Scripts/GUI/LinearScale.cs @@ -16,21 +16,10 @@ namespace RimWorldAnimationStudio private List divisions = new List(); private float minDiff = -1f; - private RectTransform rect; - private int lastStageWindowSize = -1; - + public void Start() { - rect = GetComponent(); - } - - public void Update() - { - if (lastStageWindowSize != Workspace.StageWindowSize) - { - UpdateLinearScale(); - lastStageWindowSize = Workspace.StageWindowSize; - } + EventsManager.onStageWindowSizeChanged.AddListener(delegate { UpdateLinearScale(); }); } public void UpdateLinearScale() diff --git a/Assets/Scripts/GUI/SexProps.meta b/Assets/Scripts/GUI/Props.meta similarity index 100% rename from Assets/Scripts/GUI/SexProps.meta rename to Assets/Scripts/GUI/Props.meta diff --git a/Assets/Scripts/GUI/SexProps/SexProp.cs b/Assets/Scripts/GUI/Props/SexProp.cs similarity index 100% rename from Assets/Scripts/GUI/SexProps/SexProp.cs rename to Assets/Scripts/GUI/Props/SexProp.cs diff --git a/Assets/Scripts/GUI/SexProps/SexProp.cs.meta b/Assets/Scripts/GUI/Props/SexProp.cs.meta similarity index 100% rename from Assets/Scripts/GUI/SexProps/SexProp.cs.meta rename to Assets/Scripts/GUI/Props/SexProp.cs.meta diff --git a/Assets/Scripts/GUI/SexProps/SexPropManager.cs b/Assets/Scripts/GUI/Props/SexPropManager.cs similarity index 100% rename from Assets/Scripts/GUI/SexProps/SexPropManager.cs rename to Assets/Scripts/GUI/Props/SexPropManager.cs diff --git a/Assets/Scripts/GUI/SexProps/SexPropManager.cs.meta b/Assets/Scripts/GUI/Props/SexPropManager.cs.meta similarity index 100% rename from Assets/Scripts/GUI/SexProps/SexPropManager.cs.meta rename to Assets/Scripts/GUI/Props/SexPropManager.cs.meta diff --git a/Assets/Scripts/GUI/SelfContained/InactiveDuringAnimationPreview.cs b/Assets/Scripts/GUI/SelfContained/InactiveDuringAnimationPreview.cs new file mode 100644 index 00000000..66817c26 --- /dev/null +++ b/Assets/Scripts/GUI/SelfContained/InactiveDuringAnimationPreview.cs @@ -0,0 +1,22 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +namespace RimWorldAnimationStudio +{ + public class InactiveDuringAnimationPreview : MonoBehaviour + { + private InputField inputfield; + + private void Start() + { + inputfield = GetComponent(); + } + + private void Update() + { + inputfield.interactable = AnimationController.Instance.isAnimating == false; + } + } +} diff --git a/Assets/Scripts/GUI/SelfContained/InactiveDuringAnimationPreview.cs.meta b/Assets/Scripts/GUI/SelfContained/InactiveDuringAnimationPreview.cs.meta new file mode 100644 index 00000000..8dd34ed9 --- /dev/null +++ b/Assets/Scripts/GUI/SelfContained/InactiveDuringAnimationPreview.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 92068b39ed172084296a595f5a09e54b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Managers/AnimationController.cs b/Assets/Scripts/Managers/AnimationController.cs index 8e65ab1e..9feba2d8 100644 --- a/Assets/Scripts/Managers/AnimationController.cs +++ b/Assets/Scripts/Managers/AnimationController.cs @@ -14,81 +14,32 @@ namespace RimWorldAnimationStudio [Header("Animation settings")] public bool isAnimating = false; - [Header("Object references")] - public Slider stageTimelineSlider; - public Dropdown stageLoopDropdown; - public InputField cyclesNormalField; - public InputField cyclesFastField; - public InputField animationClipTimeField; - public InputField animationClipLengthField; - public ActorCard actorCard; public Transform animationTimelines; public Transform actorBodies; - public Toggle stretchKeyframesToggle; - public InputField playBackSpeedField; - public Button playToggleButton; - public Text stageLengthText; - public Text animationLengthText; - public GameObject handLeftControls; - public GameObject handRightControls; - public GameObject sexToyControls; + public Dropdown stageLoopDropdown; [Header("Prefabs")] public ActorBody actorBodyPrefab; public GameObject animationTimelinePrefab; // Private timing variables - private int lastStageTick = Constants.minTick; private float timeSinceLastUpdate = 0; - private int cycleIndex = 0; - private bool isDirty = true; - private bool isTimelineDirty = true; + private int loopCount = 0; private float playBackSpeed = 1f; - public void MakeDirty() - { isDirty = true; isTimelineDirty = true; } - - public void MakeTimelineDirty() - { isTimelineDirty = true; } - - public bool IsDirty() - { return isDirty; } - - public bool IsTimelineDirty() - { return isTimelineDirty; } + public void Start() + { + EventsManager.onAnimationChanged.AddListener(delegate{ Initialize(); }); + EventsManager.onStageIDChanged.AddListener(delegate { Initialize(); }); + EventsManager.onActorCountChanged.AddListener(delegate { Initialize(); }); + } public void Update() { - // No animation, exit - if (Workspace.animationDef == null) { return; } - - // Dirty animation, reset - if (Workspace.animationDef != null && isDirty) - { Initialize(); } - - // Update animation lengths - if (stageLoopDropdown.value == 3) - { - stageLengthText.text = "Stage length (quickie): " + Workspace.GetCurrentAnimationStage().PlayTimeTicksQuick + " (" + Workspace.animationDef.AnimationStages[Workspace.StageID].PlayTimeTicksQuick / 60f + " s)"; - animationLengthText.text = "Animation length (quickie): " + Workspace.animationDef.animationTimeTicksQuick + " (" + Workspace.animationDef.animationTimeTicksQuick / 60f + " s)"; - - LayoutRebuilder.ForceRebuildLayoutImmediate(stageLengthText.GetComponent()); - LayoutRebuilder.ForceRebuildLayoutImmediate(animationLengthText.GetComponent()); - } - - else - { - stageLengthText.text = "Stage length (normal): " + Workspace.animationDef.AnimationStages[Workspace.StageID].PlayTimeTicks + " (" + Workspace.animationDef.AnimationStages[Workspace.StageID].PlayTimeTicks / 60f + " s)"; - animationLengthText.text = "Animation length (normal): " + Workspace.animationDef.animationTimeTicks + " (" + Workspace.animationDef.animationTimeTicks / 60f + " s)"; - - LayoutRebuilder.ForceRebuildLayoutImmediate(stageLengthText.GetComponent()); - LayoutRebuilder.ForceRebuildLayoutImmediate(animationLengthText.GetComponent()); - } - - // Update tick if animating - Workspace.StageTick = Mathf.Clamp(Workspace.StageTick, Constants.minTick, Workspace.StageWindowSize); + if (Workspace.animationDef == null) return; + // Update stage tick / loop count if animating if (isAnimating) { timeSinceLastUpdate += Time.deltaTime; @@ -101,204 +52,150 @@ namespace RimWorldAnimationStudio if (Workspace.StageTick > Workspace.StageWindowSize) { - if (stageLoopDropdown.value == 1) - { Workspace.StageTick = Constants.minTick; } - - else if (stageLoopDropdown.value >= 2) + switch (stageLoopDropdown.value) { - ++cycleIndex; - Workspace.StageTick = Constants.minTick; - - if ((stageLoopDropdown.value == 2 && cycleIndex >= int.Parse(cyclesNormalField.text)) || - (stageLoopDropdown.value == 3 && cycleIndex >= int.Parse(cyclesFastField.text))) - { - ++Workspace.StageID; - cycleIndex = 0; - } - - if (Workspace.StageID > Workspace.animationDef.AnimationStages.Count - 1) - { - Workspace.StageID = Workspace.animationDef.AnimationStages.Count - 1; - Workspace.StageTick = Workspace.StageWindowSize; - isAnimating = false; - } - } - - else - { - //stageTick = Workspace.StageWindowSize; - //isAnimating = false; + case 1: Workspace.StageTick = Constants.minTick; break; + case 2: UpdateLoopCount(Workspace.GetCurrentAnimationStage().StageLoopsNormal); break; + case 3: UpdateLoopCount(Workspace.GetCurrentAnimationStage().StageLoopsQuick); break; + default: break; } } } - // Update stage timeline - animationClipTimeField.interactable = isAnimating == false; - animationClipLengthField.interactable = isAnimating == false; - - if (lastStageTick != Workspace.StageTick) - { - stageTimelineSlider.value = Workspace.StageTick; - animationClipTimeField.text = Workspace.StageTick.ToString(); - - lastStageTick = Workspace.StageTick; - } - - playToggleButton.image.color = isAnimating ? Constants.ColorGoldYellow : Constants.ColorWhite; - - // Update animation - UpdateAnimation(); + // Update animation preview + UpdateAnimationPReview(); } - public void UpdateAnimation() + public void UpdateLoopCount(int stageLoops) { - List _actorBodies = actorBodies.GetComponentsInChildren().ToList(); + ++loopCount; + Workspace.StageTick = Constants.minTick; - for (int actorID = 0; actorID < _actorBodies.Count; actorID++) + if (loopCount >= stageLoops) { - if (Workspace.StageID >= Workspace.animationDef?.AnimationStages.Count) return; + ++Workspace.StageID; + loopCount = 0; + } + if (Workspace.StageID >= Workspace.animationDef.AnimationStages.Count - 1) + { + Workspace.StageTick = Workspace.StageWindowSize; + Workspace.isAnimating = false; + } + } + + public void UpdateAnimationPReview() + { + if (Workspace.animationDef == null || Workspace.StageID >= Workspace.animationDef?.AnimationStages.Count) return; + + List actorBodiesList = actorBodies.GetComponentsInChildren().ToList(); + + for (int actorID = 0; actorID < actorBodiesList.Count; actorID++) + { + // Get the current actor and their animation clip Actor actor = Workspace.GetActor(actorID); PawnAnimationClip clip = Workspace.GetPawnAnimationClip(actorID); + // Get flags bool quiver = isAnimating && Workspace.GetCurrentOrPreviousKeyframe(actorID).Quiver == true; bool requiresGenitals = actor.RequiredGenitals.Any(x => x == "Penis") || actor.IsFucking; + // Get clip percentage float clipPercent = clip.GetStageTickPercentage(); if (Workspace.StageTick > Constants.minTick && Workspace.StageTick == clip.duration) clipPercent = 1f; if (Workspace.GetCurrentAnimationStage().IsLooping == false) { clipPercent = (float)Workspace.StageTick / clip.duration; } - PawnRaceDef pawnRaceDef = actor.GetPawnRaceDef(); - ActorBody actorBody = _actorBodies[actorID]; + // Get the actors race and body type + PawnRaceDef pawnRaceDef = actor.GetPawnRaceDef(); string bodyType = pawnRaceDef.isHumanoid ? actor.bodyType : "None"; - Vector3 deltaPos = new Vector3(clip.BodyOffsetX.Evaluate(clipPercent), 0, clip.BodyOffsetZ.Evaluate(clipPercent)); + // Evalute the actor's basic offsets and facing + ActorPosition actorPosition = actor.GetCurrentPosition(); - float bodyAngle = clip.BodyAngle.Evaluate(clipPercent); - bodyAngle += quiver ? UnityEngine.Random.value * 2f - 1f : 0f; - - float headAngle = clip.HeadAngle.Evaluate(clipPercent); - - int bodyFacing = (int)clip.BodyFacing.Evaluate(clipPercent); - int headFacing = (int)clip.HeadFacing.Evaluate(clipPercent); - - float headBob = clip.HeadBob.Evaluate(clipPercent); - Vector3 headOffset = new Vector3(0, 0, headBob) + PawnUtility.BaseHeadOffsetAt(bodyType, bodyFacing); - - Vector3 bodyPos = new Vector3(deltaPos.x, deltaPos.z, 0); - Vector3 headPos = new Vector3(headOffset.x, headOffset.z, 0); + float bodyPosX = actorPosition.bodyOffsetX; + float bodyPosZ = actorPosition.bodyOffsetZ; + float bodyAngle = actorPosition.bodyAngle + (quiver ? UnityEngine.Random.value * 2f - 1f : 0f); + float headBob = actorPosition.headBob; + float headAngle = actorPosition.headAngle; + float genitalAngle = actorPosition.genitalAngle; + int bodyFacing = actorPosition.bodyFacing; + int headFacing = actorPosition.headFacing; + + // Convert values to world coordinates + Vector3 bodyPos = new Vector3(bodyPosX, bodyPosZ, 0f); + Vector3 headPos = new Vector3(0f, headBob, 0f) + PawnUtility.BaseHeadOffsetAt(bodyType, bodyFacing); Vector3 appendagePos = PawnUtility.GroinOffsetAt(bodyType, bodyFacing); - float appendageRotation = clip.GenitalAngle.Evaluate(clipPercent); - actorBody.transform.position = bodyPos + actor.GetFinalTransformOffset(); - actorBody.transform.eulerAngles = new Vector3(0, 0, -bodyAngle); - - actorBody.headRenderer.transform.localPosition = headPos; - actorBody.headRenderer.transform.eulerAngles = new Vector3(0, 0, -headAngle); - - actorBody.appendageRenderer.transform.localPosition = new Vector3(appendagePos.x, appendagePos.z, 0f); - actorBody.appendageRenderer.transform.eulerAngles = new Vector3(0, 0, -appendageRotation); - - actorBody.bodyRenderer.sprite = pawnRaceDef.GetBodyTypeGraphic((CardinalDirection)bodyFacing, bodyType); - actorBody.headRenderer.sprite = pawnRaceDef.isHumanoid ? pawnRaceDef.GetHeadGraphic((CardinalDirection)headFacing) : null; - actorBody.appendageRenderer.sprite = requiresGenitals && pawnRaceDef.isHumanoid && bodyFacing != 0 ? Resources.Load("Textures/Humanlike/Appendages/Appendage" + bodyFacing) : null; - - actorBody.bodyRenderer.gameObject.SetActive(actorBody.bodyRenderer.sprite != null); - actorBody.headRenderer.gameObject.SetActive(actorBody.headRenderer.sprite != null); - actorBody.appendageRenderer.gameObject.SetActive(actorBody.appendageRenderer.sprite != null); - - actorBody.bodyRenderer.sortingLayerName = clip.Layer; - actorBody.headRenderer.sortingLayerName = clip.Layer; - actorBody.headRenderer.sortingOrder = bodyFacing == 0 ? -1 : 1; - actorBody.appendageRenderer.sortingLayerName = clip.Layer; - - actorBody.bodyRenderer.flipX = bodyFacing == 3; - actorBody.headRenderer.flipX = headFacing == 3; - //actorBody.appendageRenderer.flipX = bodyFacing == 3; + // Update actorbody + ActorBody actorBody = actorBodiesList[actorID]; + ActorBodyPart actorBodypart; actorBody.transform.localScale = new Vector3(pawnRaceDef.scale, pawnRaceDef.scale, pawnRaceDef.scale); - // ActorKeyframeCard update - if (actorID != Workspace.ActorID) continue; - if (ActorKeyframeCard.Instance.positionXField.isFocused == false) { ActorKeyframeCard.Instance.positionXField.text = bodyPos.x.ToString("0.000"); } - if (ActorKeyframeCard.Instance.positionZField.isFocused == false) { ActorKeyframeCard.Instance.positionZField.text = bodyPos.y.ToString("0.000"); } - if (ActorKeyframeCard.Instance.rotationField.isFocused == false) { ActorKeyframeCard.Instance.rotationField.text = bodyAngle.ToString("0.000"); } - if (ActorKeyframeCard.Instance.headBobField.isFocused == false) { ActorKeyframeCard.Instance.headBobField.text = headBob.ToString("0.000"); } - if (ActorKeyframeCard.Instance.headRotationField.isFocused == false) { ActorKeyframeCard.Instance.headRotationField.text = headAngle.ToString("0.000"); } - if (ActorKeyframeCard.Instance.appendageRotationField.isFocused == false) { ActorKeyframeCard.Instance.appendageRotationField.text = appendageRotation.ToString("0.000"); } + // Body + actorBody.transform.position = bodyPos + actor.GetFinalTransformOffset(); + actorBody.transform.eulerAngles = new Vector3(0, 0, -bodyAngle); - if (actorID == Workspace.ActorID) - { - //handLeftControls.SetActive(clip.GetActorAddon("left hand").Render); - //handRightControls.SetActive(clip.GetActorAddon("right hand").Render); - //sexToyControls.SetActive(clip.GetActorAddon("dildo").Render); - } + actorBody.bodyRenderer.sortingLayerName = clip.Layer; + actorBody.bodyRenderer.sprite = pawnRaceDef.GetBodyTypeGraphic((CardinalDirection)bodyFacing, bodyType); + actorBody.bodyRenderer.flipX = bodyFacing == 3; + actorBody.bodyRenderer.gameObject.SetActive(actorBody.bodyRenderer.sprite != null); + + // Head + actorBodypart = actorBody.GetBodyPart("head"); + + actorBodypart.transform.localPosition = headPos; + actorBodypart.transform.eulerAngles = new Vector3(0, 0, -headAngle); + + actorBodypart.bodyPartRenderer.sortingLayerName = clip.Layer; + actorBodypart.bodyPartRenderer.sortingOrder = bodyFacing == 0 ? -1 : 1; + actorBodypart.bodyPartRenderer.sprite = pawnRaceDef.isHumanoid ? pawnRaceDef.GetHeadGraphic((CardinalDirection)headFacing) : null; + actorBodypart.bodyPartRenderer.flipX = headFacing == 3; + + actorBodypart.gameObject.SetActive(actorBodypart.bodyPartRenderer.sprite != null); + + // Appendage + actorBodypart = actorBody.GetBodyPart("appendage"); + + actorBodypart.transform.localPosition = new Vector3(appendagePos.x, appendagePos.z, 0f); + actorBodypart.transform.eulerAngles = new Vector3(0, 0, -genitalAngle); + + actorBodypart.bodyPartRenderer.sortingLayerName = clip.Layer; + actorBodypart.bodyPartRenderer.sprite = requiresGenitals && pawnRaceDef.isHumanoid && bodyFacing != 0 ? Resources.Load("Textures/Humanlike/Appendages/Appendage" + bodyFacing) : null; + //actorBody.appendageRenderer.flipX = bodyFacing == 3; + + actorBodypart.gameObject.SetActive(actorBodypart.bodyPartRenderer.sprite != null); + + // Add-ons foreach (ActorAddon addon in clip.Addons) { - ActorBodyPart bodyPart = actorBody.GetComponentsInChildren()?.FirstOrDefault(x => x.addonName == addon.AddonName); - if (bodyPart == null) continue; - - Vector3 anchor; - + actorBodypart = actorBody.GetBodyPart(addon.AddonName); + ActorBody anchoringActorBody = actorBodies.GetComponentsInChildren()?.FirstOrDefault(x => x.actorID == addon.AnchoringActor); - bodyPos = new Vector3(anchoringActorBody.transform.position.x, anchoringActorBody.transform.position.y, 0); - pawnRaceDef = Workspace.animationDef.Actors[addon.AnchoringActor].GetPawnRaceDef(); - Actor anchoringActor = Workspace.animationDef.Actors[addon.AnchoringActor]; - bodyFacing = (int)Workspace.animationDef.AnimationStages[Workspace.StageID].AnimationClips[addon.AnchoringActor].BodyFacing.Evaluate(clipPercent); + Vector3 anchor = PawnUtility.GetBodyPartAnchor(anchoringActorBody, addon.addonName); - switch (addon.AnchorName) - { - case "torso": anchor = bodyPos; break; - case "head": anchor = new Vector3(anchoringActorBody.transform.Find("ActorHead").position.x, anchoringActorBody.transform.Find("ActorHead").position.y, 0); break; - case "groin": anchor = bodyPos + Quaternion.AngleAxis(anchoringActorBody.transform.rotation.eulerAngles.z, Vector3.forward) * PawnUtility.GroinOffsetAt(anchoringActor.bodyType, bodyFacing).FlipAxes(); break; - case "left breast": anchor = bodyPos + Quaternion.AngleAxis(anchoringActorBody.transform.rotation.eulerAngles.z, Vector3.forward) * PawnUtility.BreastLeftOffsetAt(anchoringActor.bodyType, bodyFacing).FlipAxes(); break; - case "right breast": anchor = bodyPos + Quaternion.AngleAxis(anchoringActorBody.transform.rotation.eulerAngles.z, Vector3.forward) * PawnUtility.BreastRightOffsetAt(anchoringActor.bodyType, bodyFacing).FlipAxes(); break; - default: anchor = new Vector3(); break; - } + actorBodypart.transform.position = anchor + new Vector3(addon.PosX.Evaluate(clipPercent), addon.PosZ.Evaluate(clipPercent), 0); + actorBodypart.transform.eulerAngles = new Vector3(0, 0, -addon.Rotation.Evaluate(clipPercent)); - bodyPart.transform.position = anchor + new Vector3(addon.PosX.Evaluate(clipPercent), addon.PosZ.Evaluate(clipPercent), 0); - bodyPart.transform.eulerAngles = new Vector3(0, 0, -addon.Rotation.Evaluate(clipPercent)); - bodyPart.GetComponent().sortingLayerName = addon.Layer; + actorBodypart.bodyPartRenderer.sortingLayerName = addon.Layer; + //actorBodypart.bodyPartRenderer.sprite + + actorBodypart.gameObject.SetActive(addon.Render); } } } public void Initialize() { - isDirty = true; Debug.Log("Initializing animation preview"); foreach (Transform child in transform) { child.gameObject.SetActive(true); } - InitializeAnimationTimeline(); - StageCardManager.Instance.Initialize(); - - isDirty = false; - } - - public void Reset() - { - isAnimating = false; - timeSinceLastUpdate = 0; - cycleIndex = 0; - - MakeDirty(); - } - - public void InitializeAnimationTimeline() - { - isTimelineDirty = true; - - cyclesNormalField.text = Mathf.Max(Mathf.CeilToInt((float)Workspace.animationDef.AnimationStages[Workspace.StageID].PlayTimeTicks / Workspace.StageWindowSize), 1).ToString(); - cyclesFastField.text = Mathf.Max(Mathf.CeilToInt((float)Workspace.animationDef.AnimationStages[Workspace.StageID].PlayTimeTicksQuick / Workspace.StageWindowSize), 0).ToString(); - - Workspace.animationDef.AnimationStages[Workspace.StageID].IsLooping = int.Parse(cyclesNormalField.text) > 1 ? true : false; - int actorCount = Workspace.animationDef.Actors.Count; int childCount = animationTimelines.GetComponentsInChildren().Count(); @@ -306,7 +203,7 @@ namespace RimWorldAnimationStudio { // Add new actors as required if (actorID >= childCount) - { + { Instantiate(animationTimelinePrefab, animationTimelines); Instantiate(actorBodyPrefab, actorBodies.transform); } @@ -324,125 +221,21 @@ namespace RimWorldAnimationStudio // Remove excess objects as required else - { + { Destroy(animationTimeline.transform.parent.gameObject); Destroy(actorBody.gameObject); } } - animationClipLengthField.text = Workspace.StageWindowSize.ToString(); - stageTimelineSlider.maxValue = Workspace.StageWindowSize; - - isTimelineDirty = false; - foreach (AnimationTimeline timeline in animationTimelines.GetComponentsInChildren()) { timeline.InitiateUpdateOfGhostFrames(); } } - public void ToggleAnimation() + public void Reset() { - isAnimating = !isAnimating; - } - - public void OnStageTimelineSliderChange() - { - if (Workspace.animationDef == null) return; - - if (Workspace.StageTick != (int)stageTimelineSlider.value) - { - Workspace.StageTick = (int)stageTimelineSlider.value; - animationClipTimeField.text = Workspace.StageTick.ToString(); - } - } - - public void OnAnimationClipTimeFieldChange() - { - if (Workspace.animationDef == null) return; - - int.TryParse(animationClipTimeField.text, out int newStageTick); - Workspace.StageTick = Mathf.Clamp(newStageTick, Constants.minTick, Workspace.StageWindowSize); - stageTimelineSlider.value = Workspace.StageTick; - } - - public void OnAnimationClipLengthFieldChange() - { - if (Workspace.animationDef == null) return; - - int.TryParse(animationClipLengthField.text, out int newStageWindowSize); - newStageWindowSize = Mathf.Clamp(newStageWindowSize, Constants.minAnimationClipLength, Constants.maxAnimationClipLength); - - Debug.Log("Resizing animation clip length to " + newStageWindowSize.ToString() + " ticks."); - - if (stretchKeyframesToggle.isOn) - { Workspace.GetCurrentAnimationStage().StretchStageWindow(newStageWindowSize); } - - else - { - for (int i = 0; i < Workspace.animationDef.AnimationStages[Workspace.StageID].AnimationClips.Count; i++) - { - PawnAnimationClip clip = Workspace.animationDef.AnimationStages[Workspace.StageID].AnimationClips[i]; - List keyframes = clip.Keyframes.Where(x => x.atTick > newStageWindowSize)?.ToList(); - - if (keyframes.NullOrEmpty()) - { continue; } - - foreach (PawnKeyframe keyframe in keyframes) - { - clip.RemovePawnKeyframe(i, keyframe.keyframeID); - - if (Workspace.animationDef.AnimationStages[Workspace.StageID].AnimationClips[i].Keyframes.Count <= 2) - { break; } - } - } - } - - Workspace.GetCurrentAnimationStage().ResizeStageWindow(newStageWindowSize); - Workspace.RecordEvent("Stage length"); - } - - public void OnCycleNormalFieldChange() - { - if (Workspace.animationDef == null) return; - - if (int.TryParse(cyclesNormalField.text, out int cycles)) - { - cycles = cycles <= 0 ? 1 : cycles; - cyclesNormalField.text = cycles.ToString(); - - Workspace.animationDef.AnimationStages[Workspace.StageID].PlayTimeTicks = cycles * Workspace.StageWindowSize; - Workspace.animationDef.AnimationStages[Workspace.StageID].IsLooping = cycles > 1; - - foreach(AnimationTimeline animationTimeline in animationTimelines.GetComponentsInChildren()) - { animationTimeline.InitiateUpdateOfGhostFrames(); } - } - - Workspace.RecordEvent("Cycle count (normal)"); - } - - public void OnCycleFastFieldChange() - { - if (Workspace.animationDef == null) return; - - if (int.TryParse(cyclesFastField.text, out int fastCycles)) - { - fastCycles = fastCycles < 0 ? 0 : fastCycles; - - int.TryParse(cyclesNormalField.text, out int cycles); - if (fastCycles > cycles) fastCycles = cycles; - cyclesFastField.text = fastCycles.ToString(); - - Workspace.animationDef.AnimationStages[Workspace.StageID].PlayTimeTicksQuick = fastCycles * Workspace.StageWindowSize; - } - - Workspace.RecordEvent("Cycle count (fast)"); - } - - public void OnPlayBackSpeedChange() - { - if (float.TryParse(playBackSpeedField.text, out playBackSpeed)) - { playBackSpeed = Mathf.Clamp(playBackSpeed, 0.01f, 16f); } - - playBackSpeedField.text = playBackSpeed.ToString(); + Workspace.isAnimating = false; + timeSinceLastUpdate = 0; + loopCount = 0; } } } diff --git a/Assets/Scripts/Managers/ApplicationManager.cs b/Assets/Scripts/Managers/ApplicationManager.cs index 061bd0d6..31bee981 100644 --- a/Assets/Scripts/Managers/ApplicationManager.cs +++ b/Assets/Scripts/Managers/ApplicationManager.cs @@ -73,7 +73,7 @@ namespace RimWorldAnimationStudio AnimationController.Instance.Reset(); Workspace.Reset(); - EventsManager.OnAnimationDefChanged(); + EventsManager.OnAnimationChanged(); Workspace.RecordEvent("AnimationDef loaded"); } diff --git a/Assets/Scripts/Managers/InputManager.cs b/Assets/Scripts/Managers/InputManager.cs index 50a37fee..612a393d 100644 --- a/Assets/Scripts/Managers/InputManager.cs +++ b/Assets/Scripts/Managers/InputManager.cs @@ -204,7 +204,7 @@ namespace RimWorldAnimationStudio public void ToggleAnimationPreview() { if (Workspace.animationDef == null) return; - AnimationController.Instance.ToggleAnimation(); + Workspace.isAnimating = !Workspace.isAnimating; } public void AddKeyframe() @@ -228,7 +228,9 @@ namespace RimWorldAnimationStudio public void DeleteKeyframes() { if (Workspace.animationDef == null) return; - Workspace.GetCurrentPawnAnimationClip().RemovePawnKeyframe(); + + foreach (int keyframeID in Workspace.keyframeID) + { Workspace.GetAnimationClipThatOwnsKeyframe(keyframeID).RemovePawnKeyframe(keyframeID); } } public void ActorMovementMode() @@ -249,49 +251,65 @@ namespace RimWorldAnimationStudio public void AdjustActorUpward() { if (Workspace.animationDef == null) return; - ActorKeyframeCard.Instance.AdjustActor(Vector2.up * largeStep); + + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); + keyframe.AdjustActor(Vector2.up * largeStep); } public void AdjustActorDownward() { if (Workspace.animationDef == null) return; - ActorKeyframeCard.Instance.AdjustActor(Vector2.down * largeStep); + + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); + keyframe.AdjustActor(Vector2.down * largeStep); } public void AdjustActorLeftward() { if (Workspace.animationDef == null) return; - ActorKeyframeCard.Instance.AdjustActor(Vector2.left * largeStep); + + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); + keyframe.AdjustActor(Vector2.left * largeStep); } public void AdjustActorRightward() { if (Workspace.animationDef == null) return; - ActorKeyframeCard.Instance.AdjustActor(Vector2.right * largeStep); + + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); + keyframe.AdjustActor(Vector2.right * largeStep); } public void AdjustActorUpwardSmall() { if (Workspace.animationDef == null) return; - ActorKeyframeCard.Instance.AdjustActor(Vector2.up * smallStep); + + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); + keyframe.AdjustActor(Vector2.up * smallStep); } public void AdjustActorDownwardSmall() { if (Workspace.animationDef == null) return; - ActorKeyframeCard.Instance.AdjustActor(Vector2.down * smallStep); + + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); + keyframe.AdjustActor(Vector2.down * smallStep); } public void AdjustActorLeftwardSmall() { if (Workspace.animationDef == null) return; - ActorKeyframeCard.Instance.AdjustActor(Vector2.left * smallStep); + + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); + keyframe.AdjustActor(Vector2.left * smallStep); } public void AdjustActorRightwardSmall() { if (Workspace.animationDef == null) return; - ActorKeyframeCard.Instance.AdjustActor(Vector2.right * smallStep); + + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); + keyframe.AdjustActor(Vector2.right * smallStep); } public void CycleActorBodyPartSelecion() @@ -407,7 +425,7 @@ namespace RimWorldAnimationStudio public void StretchKeyframesToggle() { - AnimationController.Instance.stretchKeyframesToggle.isOn = !AnimationController.Instance.stretchKeyframesToggle.isOn; + Workspace.stretchKeyframes = !Workspace.stretchKeyframes; } public void OpenProjectHome() @@ -435,5 +453,26 @@ namespace RimWorldAnimationStudio Workspace.animationDef.RemoveActor(); } + + public void AddStage() + { + if (Workspace.animationDef == null) return; + + Workspace.animationDef.AddAnimationStage(); + } + + public void CloneStage() + { + if (Workspace.animationDef == null) return; + + Workspace.animationDef.CloneAnimationStage(); + } + + public void RemoveStage() + { + if (Workspace.animationDef == null) return; + + Workspace.animationDef.RemoveAnimationStage(); + } } } diff --git a/Assets/Scripts/Managers/StageCardManager.cs b/Assets/Scripts/Managers/StageCardManager.cs index 7ccddac2..db5c1c30 100644 --- a/Assets/Scripts/Managers/StageCardManager.cs +++ b/Assets/Scripts/Managers/StageCardManager.cs @@ -13,7 +13,11 @@ namespace RimWorldAnimationStudio public void Start() { + EventsManager.onAnimationChanged.AddListener(delegate { Initialize(); }); + EventsManager.onStageIDChanged.AddListener(delegate { Initialize(); }); EventsManager.onStageCountChanged.AddListener(delegate { Initialize(); }); + + Initialize(); } public void Initialize() diff --git a/Assets/Scripts/Utilities/PawnUtility.cs b/Assets/Scripts/Utilities/PawnUtility.cs index 9c4d906e..2616471d 100644 --- a/Assets/Scripts/Utilities/PawnUtility.cs +++ b/Assets/Scripts/Utilities/PawnUtility.cs @@ -24,10 +24,10 @@ namespace RimWorldAnimationStudio switch (rotation) { - case 0: return new Vector3(0f, 0f, headOffset.y); - case 1: return new Vector3(headOffset.x, 0f, headOffset.y); - case 2: return new Vector3(0f, 0f, headOffset.y); - case 3: return new Vector3(-headOffset.x, 0f, headOffset.y); + case 0: return new Vector3(0f, headOffset.y, 0); + case 1: return new Vector3(headOffset.x, headOffset.y, 0); + case 2: return new Vector3(0f, headOffset.y, 0f); + case 3: return new Vector3(-headOffset.x, headOffset.y, 0f); default: return Vector3.zero; } } @@ -161,5 +161,23 @@ namespace RimWorldAnimationStudio } } } + + public static Vector3 GetBodyPartAnchor(ActorBody anchoringActorBody, string anchorName) + { + Actor anchoringActor = Workspace.GetActor(anchoringActorBody.actorID); + Vector3 anchoringActorBodyPos = anchoringActorBody.transform.position; + Quaternion anchoringActorBodyQuad = Quaternion.AngleAxis(anchoringActorBody.transform.rotation.eulerAngles.z, Vector3.forward); + int anchoringActorFacing = anchoringActor.GetCurrentPosition().bodyFacing; + + switch (anchorName) + { + case "torso": return anchoringActorBodyPos; + case "head": return anchoringActorBody.GetComponentsInChildren().FirstOrDefault(x => x.bodyPart.ToLower() == "head").transform.position; + case "groin": return anchoringActorBodyPos + anchoringActorBodyQuad * PawnUtility.GroinOffsetAt(anchoringActor.bodyType, anchoringActorFacing).FlipAxes(); + case "left breast": return anchoringActorBodyPos + anchoringActorBodyQuad * PawnUtility.BreastLeftOffsetAt(anchoringActor.bodyType, anchoringActorFacing).FlipAxes(); + case "right breast": return anchoringActorBodyPos + anchoringActorBodyQuad * PawnUtility.BreastRightOffsetAt(anchoringActor.bodyType, anchoringActorFacing).FlipAxes(); + default: return new Vector3(); + } + } } } diff --git a/Assets/Scripts/Workspace/EventsManager.cs b/Assets/Scripts/Workspace/EventsManager.cs index 14b8de5b..ebd70a10 100644 --- a/Assets/Scripts/Workspace/EventsManager.cs +++ b/Assets/Scripts/Workspace/EventsManager.cs @@ -18,8 +18,12 @@ namespace RimWorldAnimationStudio public class PawnKeyframeEvent : UnityEvent { } public class ActorAddonEvent : UnityEvent { } public class AddonKeyframeEvent : UnityEvent { } + public class ActorBodyEvent : UnityEvent { } + public class ActorBodyPartEvent : UnityEvent { } // Event list + public static UnityEvent onAnimationToggled = new UnityEvent(); + public static UnityEvent onAnimationChanged = new UnityEvent(); public static UnityEvent onAnimationDefChanged = new UnityEvent(); public static WorkspaceIntEvent onActorIDChanged = new WorkspaceIntEvent(); public static WorkspaceIntEvent onStageIDChanged = new WorkspaceIntEvent(); @@ -29,13 +33,18 @@ namespace RimWorldAnimationStudio public static WorkspaceIntEvent onKeyframeCountChanged = new WorkspaceIntEvent(); public static ActorEvent onActorChanged = new ActorEvent(); public static AnimationStageEvent onAnimationStageChanged = new AnimationStageEvent(); + public static AnimationStageEvent onStageWindowSizeChanged = new AnimationStageEvent(); public static PawnAnimationClipEvent onPawnAnimationClipChanged = new PawnAnimationClipEvent(); public static PawnKeyframeEvent onPawnKeyframeChanged = new PawnKeyframeEvent(); public static ActorAddonEvent onActorAddonChanged = new ActorAddonEvent(); public static AddonKeyframeEvent onAddonKeyframeChanged = new AddonKeyframeEvent(); public static UnityEvent onDefNamesChanged = new UnityEvent(); + public static ActorBodyEvent onActorBodySelected = new ActorBodyEvent(); + public static ActorBodyPartEvent onActorBodyPartSelected = new ActorBodyPartEvent(); // Event invoking + public static void OnAnimationToggled() { onAnimationToggled.Invoke(); } + public static void OnAnimationChanged() { onAnimationChanged.Invoke(); } public static void OnAnimationDefChanged() { onAnimationDefChanged.Invoke(); } public static void OnActorIDChanged() { onActorIDChanged.Invoke(Workspace.ActorID); } public static void OnStageIDChanged() { onStageIDChanged.Invoke(Workspace.ActorID); } @@ -45,10 +54,13 @@ namespace RimWorldAnimationStudio public static void OnKeyframeCountChanged(PawnAnimationClip clip) { onKeyframeCountChanged.Invoke(clip.Keyframes.Count); } public static void OnActorChanged(Actor actor) { onActorChanged.Invoke(actor); } public static void OnAnimationStageChanged(AnimationStage stage) { onAnimationStageChanged.Invoke(stage); } + public static void OnStageWindowSizeChanged(AnimationStage stage) { onStageWindowSizeChanged.Invoke(stage); } public static void OnPawnAnimationClipChanged(PawnAnimationClip clip) { onPawnAnimationClipChanged.Invoke(clip); } public static void OnPawnKeyframeChanged(PawnKeyframe keyframe) { onPawnKeyframeChanged.Invoke(keyframe); } public static void OnActorAddonChanged(ActorAddon actorAddon) { onActorAddonChanged.Invoke(actorAddon); } public static void OnAddonKeyframeChanged(AddonKeyframe addonKeyframe) { onAddonKeyframeChanged.Invoke(addonKeyframe); } public static void OnDefNamesChanged() { onDefNamesChanged.Invoke(); } + public static void OnActorBodySelected(ActorBody actorBody) { onActorBodySelected.Invoke(actorBody); } + public static void OnActorBodyPartSelected(ActorBodyPart bodyPart) { onActorBodyPartSelected.Invoke(bodyPart); } } } diff --git a/Assets/Scripts/Workspace/Workspace.cs b/Assets/Scripts/Workspace/Workspace.cs index c782d8eb..c8757e5d 100644 --- a/Assets/Scripts/Workspace/Workspace.cs +++ b/Assets/Scripts/Workspace/Workspace.cs @@ -22,11 +22,7 @@ namespace RimWorldAnimationStudio bool triggerEvent = stageID != value; stageID = value; - if (triggerEvent) - { - StageTick = Constants.minTick; - EventsManager.OnStageIDChanged(); - } + if (triggerEvent) { StageTick = Constants.minTick; EventsManager.OnStageIDChanged(); } } } @@ -78,12 +74,15 @@ namespace RimWorldAnimationStudio // Current save path public static string animationSavePath; - - // Stage loop counts and stretching - public static int stageLoopsNormal = 1; - public static int stageLoopsQuick = 1; + + // Stage controls + private static float playBackSpeed = 1f; + public static bool isAnimating; public static bool stretchKeyframes; + // Stage controls set / get + public static float PlayBackSpeed { get { return playBackSpeed; } set { Mathf.Clamp(Workspace.playBackSpeed, 0.01f, 10f); } } + // Animation indices private static int stageID = 0; private static int actorID = 0; @@ -96,17 +95,17 @@ namespace RimWorldAnimationStudio public static Actor GetCurrentActor() { - return animationDef?.Actors[ActorID]; + return GetActor(ActorID); } public static AnimationStage GetCurrentAnimationStage() { - return animationDef?.AnimationStages[StageID]; + return GetAnimationStage(StageID); } public static PawnAnimationClip GetCurrentPawnAnimationClip() { - return animationDef?.AnimationStages[StageID]?.AnimationClips[ActorID]; + return GetPawnAnimationClip(ActorID); } public static PawnKeyframe GetCurrentPawnKeyframe(bool makeKeyframe = false) @@ -122,28 +121,47 @@ namespace RimWorldAnimationStudio public static Actor GetActor(int actorID) { - return animationDef?.Actors[actorID]; + return animationDef?.Actors.ElementAtOrDefault(actorID); } public static AnimationStage GetAnimationStage(int stageID) { - return animationDef?.AnimationStages[stageID]; + return animationDef?.AnimationStages.ElementAtOrDefault(stageID); } public static PawnAnimationClip GetPawnAnimationClip(int actorID) { - return animationDef?.AnimationStages[StageID]?.AnimationClips[actorID]; + return GetCurrentAnimationStage()?.AnimationClips.ElementAtOrDefault(actorID); } - public static PawnKeyframe GetPawnKeyframe(int actorID, int keyframeID) + public static PawnKeyframe GetPawnKeyframe(int keyframeID) { - if (StageID < 0) return null; - if (actorID < 0) return null; + foreach (AnimationStage stage in animationDef?.AnimationStages) + { + foreach (PawnAnimationClip clip in stage.animationClips) + { + PawnKeyframe keyframe = clip.Keyframes.FirstOrDefault(x => x.keyframeID == keyframeID); - if (StageID >= animationDef.AnimationStages.Count) return null; - if (actorID >= animationDef.AnimationStages[StageID].AnimationClips.Count) return null; + if (keyframe != null) return keyframe; + } + } - return animationDef.AnimationStages[StageID].AnimationClips[actorID].Keyframes.FirstOrDefault(x => x.keyframeID == keyframeID); + return null; + } + + public static PawnAnimationClip GetAnimationClipThatOwnsKeyframe(int keyframeID) + { + foreach (AnimationStage stage in animationDef?.AnimationStages) + { + foreach (PawnAnimationClip clip in stage.animationClips) + { + PawnKeyframe keyframe = clip.Keyframes.FirstOrDefault(x => x.keyframeID == keyframeID); + + if (keyframe != null) return clip; + } + } + + return null; } public static List GetAllPawnKeyframesAtTick(int actorID, int atTick) @@ -167,24 +185,6 @@ namespace RimWorldAnimationStudio return pawnKeyframes; } - public static PawnAnimationClip GetAnimationClipThatOwnsKeyframe(int keyframeID, out int clipID) - { - clipID = -1; - - for (int i = 0; i < animationDef.AnimationStages[StageID].AnimationClips.Count; i++) - { - PawnAnimationClip clip = animationDef.AnimationStages[StageID].AnimationClips[i]; - - if (clip.Keyframes.Any(x => x.keyframeID == keyframeID)) - { - clipID = i; - return clip; - } - } - - return null; - } - public static bool DoesPawnKeyframeExistAtTick(int stageID, int actorID, int atTick) { return animationDef.AnimationStages[stageID].AnimationClips[actorID].Keyframes.Any(x => x.atTick == atTick); @@ -195,11 +195,9 @@ namespace RimWorldAnimationStudio PawnKeyframe pawnKeyframe = null; PawnAnimationClip clip = GetPawnAnimationClip(actorID); - int stageTick = Workspace.StageTick; - foreach (PawnKeyframe keyframe in clip.Keyframes) { - if (keyframe.atTick > stageTick) + if (keyframe.atTick > StageTick) { pawnKeyframe = keyframe; break; } } @@ -211,11 +209,9 @@ namespace RimWorldAnimationStudio PawnKeyframe pawnKeyframe = null; PawnAnimationClip clip = GetPawnAnimationClip(actorID); - int stageTick = Workspace.StageTick; - foreach (PawnKeyframe keyframe in clip.Keyframes) { - if (keyframe.atTick < stageTick) + if (keyframe.atTick < StageTick) { pawnKeyframe = keyframe; } } @@ -227,11 +223,9 @@ namespace RimWorldAnimationStudio PawnKeyframe pawnKeyframe = null; PawnAnimationClip clip = GetPawnAnimationClip(actorID); - int stageTick = Workspace.StageTick; - foreach (PawnKeyframe keyframe in clip.Keyframes) { - if (keyframe.atTick <= stageTick) + if (keyframe.atTick <= StageTick) { pawnKeyframe = keyframe; } } @@ -310,7 +304,6 @@ namespace RimWorldAnimationStudio animationDef = record.animationDef.Copy(); StageID = record.stageID; - AnimationController.Instance.MakeTimelineDirty(); StageCardManager.Instance.Initialize(); } @@ -327,7 +320,7 @@ namespace RimWorldAnimationStudio RestoreToHistoricRecord(recordToRead); Debug.Log("Undoing : " + recordToStore.eventDesc); - EventsManager.OnAnimationDefChanged(); + EventsManager.OnAnimationChanged(); } public static void Redo() @@ -342,7 +335,7 @@ namespace RimWorldAnimationStudio RestoreToHistoricRecord(recordToReadAndStore); Debug.Log("Redoing : " + recordToReadAndStore.eventDesc); - EventsManager.OnAnimationDefChanged(); + EventsManager.OnAnimationChanged(); } public static void ClearHistory() diff --git a/Library/ArtifactDB b/Library/ArtifactDB index ea65b6fd..40eaf917 100644 Binary files a/Library/ArtifactDB and b/Library/ArtifactDB differ diff --git a/Library/Artifacts/00/0027cb53ba0c6636a5ec422fbac2ed82 b/Library/Artifacts/00/0027cb53ba0c6636a5ec422fbac2ed82 deleted file mode 100644 index 46304fb7..00000000 Binary files a/Library/Artifacts/00/0027cb53ba0c6636a5ec422fbac2ed82 and /dev/null differ diff --git a/Library/Artifacts/66/66b122f5842cca4183f0d5009caa1327 b/Library/Artifacts/01/0168a2e695761cb5dcf91d869225bcd3 similarity index 93% rename from Library/Artifacts/66/66b122f5842cca4183f0d5009caa1327 rename to Library/Artifacts/01/0168a2e695761cb5dcf91d869225bcd3 index d7bc2836..c54f0065 100644 Binary files a/Library/Artifacts/66/66b122f5842cca4183f0d5009caa1327 and b/Library/Artifacts/01/0168a2e695761cb5dcf91d869225bcd3 differ diff --git a/Library/Artifacts/05/05ad68c281bd54caa4fa4000f5f9c92d b/Library/Artifacts/05/05ad68c281bd54caa4fa4000f5f9c92d new file mode 100644 index 00000000..5d3c96fc Binary files /dev/null and b/Library/Artifacts/05/05ad68c281bd54caa4fa4000f5f9c92d differ diff --git a/Library/Artifacts/05/05d40869a880f0cdfc62d514be500749 b/Library/Artifacts/05/05d40869a880f0cdfc62d514be500749 new file mode 100644 index 00000000..5608d459 Binary files /dev/null and b/Library/Artifacts/05/05d40869a880f0cdfc62d514be500749 differ diff --git a/Library/Artifacts/50/50a64145390f825ee8b2b9fbc3c69335 b/Library/Artifacts/06/06d5e9f9cadfc67456bdd567dab98fa9 similarity index 89% rename from Library/Artifacts/50/50a64145390f825ee8b2b9fbc3c69335 rename to Library/Artifacts/06/06d5e9f9cadfc67456bdd567dab98fa9 index 49ed042f..60bb97d1 100644 Binary files a/Library/Artifacts/50/50a64145390f825ee8b2b9fbc3c69335 and b/Library/Artifacts/06/06d5e9f9cadfc67456bdd567dab98fa9 differ diff --git a/Library/Artifacts/07/07fde1c2452eb27afe21fbcd8504fc91 b/Library/Artifacts/07/07fde1c2452eb27afe21fbcd8504fc91 deleted file mode 100644 index 0b8b634b..00000000 Binary files a/Library/Artifacts/07/07fde1c2452eb27afe21fbcd8504fc91 and /dev/null differ diff --git a/Library/Artifacts/08/085178422e4479afa28168cfe7de0e16 b/Library/Artifacts/08/085178422e4479afa28168cfe7de0e16 deleted file mode 100644 index 8b722aed..00000000 Binary files a/Library/Artifacts/08/085178422e4479afa28168cfe7de0e16 and /dev/null differ diff --git a/Library/Artifacts/08/08e27f70105584f4d9ab2dc8dc9249d9 b/Library/Artifacts/08/08e27f70105584f4d9ab2dc8dc9249d9 new file mode 100644 index 00000000..fb0035b2 Binary files /dev/null and b/Library/Artifacts/08/08e27f70105584f4d9ab2dc8dc9249d9 differ diff --git a/Library/Artifacts/0a/0a7cc2dbd61b9a1657802bd704f4b7f1 b/Library/Artifacts/0a/0a7cc2dbd61b9a1657802bd704f4b7f1 new file mode 100644 index 00000000..d89a5df4 Binary files /dev/null and b/Library/Artifacts/0a/0a7cc2dbd61b9a1657802bd704f4b7f1 differ diff --git a/Library/Artifacts/0b/0b67a1c17136bd9afa79e057edf21c7c b/Library/Artifacts/0b/0b67a1c17136bd9afa79e057edf21c7c new file mode 100644 index 00000000..9b51ca43 Binary files /dev/null and b/Library/Artifacts/0b/0b67a1c17136bd9afa79e057edf21c7c differ diff --git a/Library/Artifacts/0c/0c7accbfac2bf14bb7674f01e728f3a7 b/Library/Artifacts/0c/0c7accbfac2bf14bb7674f01e728f3a7 deleted file mode 100644 index 5f9523d6..00000000 Binary files a/Library/Artifacts/0c/0c7accbfac2bf14bb7674f01e728f3a7 and /dev/null differ diff --git a/Library/Artifacts/0c/0c8739cd590d104e54c127427a4b6a27 b/Library/Artifacts/0c/0c8739cd590d104e54c127427a4b6a27 deleted file mode 100644 index 1af77f91..00000000 Binary files a/Library/Artifacts/0c/0c8739cd590d104e54c127427a4b6a27 and /dev/null differ diff --git a/Library/Artifacts/0c/0caea0aa396b9c2fb62d0b9bb3b9746f b/Library/Artifacts/0c/0caea0aa396b9c2fb62d0b9bb3b9746f deleted file mode 100644 index 4294807d..00000000 Binary files a/Library/Artifacts/0c/0caea0aa396b9c2fb62d0b9bb3b9746f and /dev/null differ diff --git a/Library/Artifacts/85/858b519f42847f1f0375aad5c12ff9e5 b/Library/Artifacts/0c/0ce712a9cbf8d8a453830731f126d39c similarity index 92% rename from Library/Artifacts/85/858b519f42847f1f0375aad5c12ff9e5 rename to Library/Artifacts/0c/0ce712a9cbf8d8a453830731f126d39c index a00dbbbf..a9f2c682 100644 Binary files a/Library/Artifacts/85/858b519f42847f1f0375aad5c12ff9e5 and b/Library/Artifacts/0c/0ce712a9cbf8d8a453830731f126d39c differ diff --git a/Library/Artifacts/0e/0ed2550ae64a07d9579a63864a809b7d b/Library/Artifacts/0e/0ed2550ae64a07d9579a63864a809b7d new file mode 100644 index 00000000..9573b6ca Binary files /dev/null and b/Library/Artifacts/0e/0ed2550ae64a07d9579a63864a809b7d differ diff --git a/Library/Artifacts/bb/bb489ecbb333b263ea941f2011fcadbe b/Library/Artifacts/0f/0f686fec4e19e48653609a6451ecdc29 similarity index 90% rename from Library/Artifacts/bb/bb489ecbb333b263ea941f2011fcadbe rename to Library/Artifacts/0f/0f686fec4e19e48653609a6451ecdc29 index c80beea0..2bed0fbe 100644 Binary files a/Library/Artifacts/bb/bb489ecbb333b263ea941f2011fcadbe and b/Library/Artifacts/0f/0f686fec4e19e48653609a6451ecdc29 differ diff --git a/Library/Artifacts/0f/0fcf8c0d3cc76769c9837c7b6630f3f3 b/Library/Artifacts/0f/0fcf8c0d3cc76769c9837c7b6630f3f3 new file mode 100644 index 00000000..1864461b Binary files /dev/null and b/Library/Artifacts/0f/0fcf8c0d3cc76769c9837c7b6630f3f3 differ diff --git a/Library/Artifacts/ab/ab3ed0ac05de3443ab38665f5770609b b/Library/Artifacts/11/11526600dfd7ab30f57c2e48e34eb78c similarity index 75% rename from Library/Artifacts/ab/ab3ed0ac05de3443ab38665f5770609b rename to Library/Artifacts/11/11526600dfd7ab30f57c2e48e34eb78c index 2f1de928..722f6c3b 100644 Binary files a/Library/Artifacts/ab/ab3ed0ac05de3443ab38665f5770609b and b/Library/Artifacts/11/11526600dfd7ab30f57c2e48e34eb78c differ diff --git a/Library/Artifacts/80/8077836a8f0f5d082208169cd6d30ea9 b/Library/Artifacts/12/124a2fe5d65c30ce8a1859fc1facc37e similarity index 68% rename from Library/Artifacts/80/8077836a8f0f5d082208169cd6d30ea9 rename to Library/Artifacts/12/124a2fe5d65c30ce8a1859fc1facc37e index 9e3046d7..fe1697b1 100644 Binary files a/Library/Artifacts/80/8077836a8f0f5d082208169cd6d30ea9 and b/Library/Artifacts/12/124a2fe5d65c30ce8a1859fc1facc37e differ diff --git a/Library/Artifacts/13/133c1343c2be5a5ef3fae879ca5bed15 b/Library/Artifacts/13/133c1343c2be5a5ef3fae879ca5bed15 new file mode 100644 index 00000000..2bd2119b Binary files /dev/null and b/Library/Artifacts/13/133c1343c2be5a5ef3fae879ca5bed15 differ diff --git a/Library/Artifacts/14/1488b3d8d5e48285bc90505a763a0772 b/Library/Artifacts/14/1488b3d8d5e48285bc90505a763a0772 new file mode 100644 index 00000000..253b3570 Binary files /dev/null and b/Library/Artifacts/14/1488b3d8d5e48285bc90505a763a0772 differ diff --git a/Library/Artifacts/ed/edd2a71b758d6a6babeab68f11fa61f1 b/Library/Artifacts/16/1687a43cbccb81d83a957abed68b296f similarity index 90% rename from Library/Artifacts/ed/edd2a71b758d6a6babeab68f11fa61f1 rename to Library/Artifacts/16/1687a43cbccb81d83a957abed68b296f index 58ef3196..05486e24 100644 Binary files a/Library/Artifacts/ed/edd2a71b758d6a6babeab68f11fa61f1 and b/Library/Artifacts/16/1687a43cbccb81d83a957abed68b296f differ diff --git a/Library/Artifacts/17/17388a70976ec90c6b6bccd347412218 b/Library/Artifacts/17/17388a70976ec90c6b6bccd347412218 new file mode 100644 index 00000000..4c1e3302 Binary files /dev/null and b/Library/Artifacts/17/17388a70976ec90c6b6bccd347412218 differ diff --git a/Library/Artifacts/1b/1b280738486ca03fb83f4c3d6204b407 b/Library/Artifacts/1b/1b280738486ca03fb83f4c3d6204b407 new file mode 100644 index 00000000..498624c1 Binary files /dev/null and b/Library/Artifacts/1b/1b280738486ca03fb83f4c3d6204b407 differ diff --git a/Library/Artifacts/1b/1b8228a0ec5a49534dc02236522609eb b/Library/Artifacts/1b/1b8228a0ec5a49534dc02236522609eb new file mode 100644 index 00000000..1ea0fae2 Binary files /dev/null and b/Library/Artifacts/1b/1b8228a0ec5a49534dc02236522609eb differ diff --git a/Library/Artifacts/33/3354b778f99cc1e753c7117fe7244bb1 b/Library/Artifacts/1c/1c0611b62fec2abfce4536e5ed15c80e similarity index 87% rename from Library/Artifacts/33/3354b778f99cc1e753c7117fe7244bb1 rename to Library/Artifacts/1c/1c0611b62fec2abfce4536e5ed15c80e index 53b5f931..9a9678a8 100644 Binary files a/Library/Artifacts/33/3354b778f99cc1e753c7117fe7244bb1 and b/Library/Artifacts/1c/1c0611b62fec2abfce4536e5ed15c80e differ diff --git a/Library/Artifacts/20/20946a2fa7004b2e5216c07df5199e71 b/Library/Artifacts/1c/1ce9276bfedf59f68c53be96714279d5 similarity index 68% rename from Library/Artifacts/20/20946a2fa7004b2e5216c07df5199e71 rename to Library/Artifacts/1c/1ce9276bfedf59f68c53be96714279d5 index ed60fc0d..006d1a67 100644 Binary files a/Library/Artifacts/20/20946a2fa7004b2e5216c07df5199e71 and b/Library/Artifacts/1c/1ce9276bfedf59f68c53be96714279d5 differ diff --git a/Library/Artifacts/1e/1e8456072527d971fab7dbd8d841ea75 b/Library/Artifacts/1e/1e8456072527d971fab7dbd8d841ea75 new file mode 100644 index 00000000..54b6caea Binary files /dev/null and b/Library/Artifacts/1e/1e8456072527d971fab7dbd8d841ea75 differ diff --git a/Library/Artifacts/1f/1ff46d39cbf3665262f47411f1d0d2b6 b/Library/Artifacts/1f/1ff46d39cbf3665262f47411f1d0d2b6 new file mode 100644 index 00000000..5ef1e725 Binary files /dev/null and b/Library/Artifacts/1f/1ff46d39cbf3665262f47411f1d0d2b6 differ diff --git a/Library/Artifacts/23/23bc926a0c6b9ba04ea361185c740f21 b/Library/Artifacts/23/23bc926a0c6b9ba04ea361185c740f21 new file mode 100644 index 00000000..82615f1a Binary files /dev/null and b/Library/Artifacts/23/23bc926a0c6b9ba04ea361185c740f21 differ diff --git a/Library/Artifacts/f0/f0371e9af91efd80bd236bafcf284862 b/Library/Artifacts/23/23cda1775f6e6cfe614a6e2311179663 similarity index 79% rename from Library/Artifacts/f0/f0371e9af91efd80bd236bafcf284862 rename to Library/Artifacts/23/23cda1775f6e6cfe614a6e2311179663 index 9b6145c5..93fddbbd 100644 Binary files a/Library/Artifacts/f0/f0371e9af91efd80bd236bafcf284862 and b/Library/Artifacts/23/23cda1775f6e6cfe614a6e2311179663 differ diff --git a/Library/Artifacts/25/25302e2dccc0e213f900291a81c3689c b/Library/Artifacts/25/25302e2dccc0e213f900291a81c3689c new file mode 100644 index 00000000..5f7dceee Binary files /dev/null and b/Library/Artifacts/25/25302e2dccc0e213f900291a81c3689c differ diff --git a/Library/Artifacts/a9/a929d521d0780880c964fd0d3de905f2 b/Library/Artifacts/27/277262088fbc255bc77a1a28d238e23c similarity index 93% rename from Library/Artifacts/a9/a929d521d0780880c964fd0d3de905f2 rename to Library/Artifacts/27/277262088fbc255bc77a1a28d238e23c index 710eaeda..11caf930 100644 Binary files a/Library/Artifacts/a9/a929d521d0780880c964fd0d3de905f2 and b/Library/Artifacts/27/277262088fbc255bc77a1a28d238e23c differ diff --git a/Library/Artifacts/28/28003a33a95100d9956dfbdb10ccdf10 b/Library/Artifacts/28/28003a33a95100d9956dfbdb10ccdf10 new file mode 100644 index 00000000..f0acd520 Binary files /dev/null and b/Library/Artifacts/28/28003a33a95100d9956dfbdb10ccdf10 differ diff --git a/Library/Artifacts/af/af1ba00bcd3b54e607fb4fd6ba862fce b/Library/Artifacts/28/28473a64b7d16278f4fc147d3730f40a similarity index 68% rename from Library/Artifacts/af/af1ba00bcd3b54e607fb4fd6ba862fce rename to Library/Artifacts/28/28473a64b7d16278f4fc147d3730f40a index 1d1335be..edd9aa49 100644 Binary files a/Library/Artifacts/af/af1ba00bcd3b54e607fb4fd6ba862fce and b/Library/Artifacts/28/28473a64b7d16278f4fc147d3730f40a differ diff --git a/Library/Artifacts/ea/eadf674d8304672684a075b7abe0f02e b/Library/Artifacts/28/28c3ceff69864ebf8a58881bf4a7a663 similarity index 93% rename from Library/Artifacts/ea/eadf674d8304672684a075b7abe0f02e rename to Library/Artifacts/28/28c3ceff69864ebf8a58881bf4a7a663 index 9768460a..1fe27e2f 100644 Binary files a/Library/Artifacts/ea/eadf674d8304672684a075b7abe0f02e and b/Library/Artifacts/28/28c3ceff69864ebf8a58881bf4a7a663 differ diff --git a/Library/Artifacts/29/2954690bf6a0166cc4c4250f458a94c4 b/Library/Artifacts/29/2954690bf6a0166cc4c4250f458a94c4 new file mode 100644 index 00000000..cfec5d98 Binary files /dev/null and b/Library/Artifacts/29/2954690bf6a0166cc4c4250f458a94c4 differ diff --git a/Library/Artifacts/29/29d7823a9cabaf3c81afadbec7320985 b/Library/Artifacts/29/29d7823a9cabaf3c81afadbec7320985 new file mode 100644 index 00000000..f2196acf Binary files /dev/null and b/Library/Artifacts/29/29d7823a9cabaf3c81afadbec7320985 differ diff --git a/Library/Artifacts/2d/2d6d6d28932733e02697cded1902cc67 b/Library/Artifacts/2d/2d6d6d28932733e02697cded1902cc67 new file mode 100644 index 00000000..837d6733 Binary files /dev/null and b/Library/Artifacts/2d/2d6d6d28932733e02697cded1902cc67 differ diff --git a/Library/Artifacts/2f/2f91f2435e3fa541a93a827e35f7f3a2 b/Library/Artifacts/2f/2f91f2435e3fa541a93a827e35f7f3a2 new file mode 100644 index 00000000..5ba23c19 Binary files /dev/null and b/Library/Artifacts/2f/2f91f2435e3fa541a93a827e35f7f3a2 differ diff --git a/Library/Artifacts/32/32db8c8b40211c54a7a3d64afdf5f1ff b/Library/Artifacts/32/32db8c8b40211c54a7a3d64afdf5f1ff new file mode 100644 index 00000000..7c94f381 Binary files /dev/null and b/Library/Artifacts/32/32db8c8b40211c54a7a3d64afdf5f1ff differ diff --git a/Library/Artifacts/35/35e203d048e16e9e759001f0069f891a b/Library/Artifacts/35/35e203d048e16e9e759001f0069f891a new file mode 100644 index 00000000..2f7badaa Binary files /dev/null and b/Library/Artifacts/35/35e203d048e16e9e759001f0069f891a differ diff --git a/Library/Artifacts/38/38b774042e0ea1ef3fda8c679d1a26d6 b/Library/Artifacts/38/38b774042e0ea1ef3fda8c679d1a26d6 new file mode 100644 index 00000000..27730808 Binary files /dev/null and b/Library/Artifacts/38/38b774042e0ea1ef3fda8c679d1a26d6 differ diff --git a/Library/Artifacts/38/38f747d653db8eef1519541af3cd2306 b/Library/Artifacts/38/38f747d653db8eef1519541af3cd2306 deleted file mode 100644 index 0410c488..00000000 Binary files a/Library/Artifacts/38/38f747d653db8eef1519541af3cd2306 and /dev/null differ diff --git a/Library/Artifacts/39/39699d27989ae7571067707c63c95428 b/Library/Artifacts/39/39699d27989ae7571067707c63c95428 new file mode 100644 index 00000000..e71c4d95 Binary files /dev/null and b/Library/Artifacts/39/39699d27989ae7571067707c63c95428 differ diff --git a/Library/Artifacts/0d/0df543ee31ea4d33fc0c82c39a05f492 b/Library/Artifacts/39/39c1a10ff1acdbaa6546285a4cd9a61b similarity index 91% rename from Library/Artifacts/0d/0df543ee31ea4d33fc0c82c39a05f492 rename to Library/Artifacts/39/39c1a10ff1acdbaa6546285a4cd9a61b index 78f46b27..c56a3613 100644 Binary files a/Library/Artifacts/0d/0df543ee31ea4d33fc0c82c39a05f492 and b/Library/Artifacts/39/39c1a10ff1acdbaa6546285a4cd9a61b differ diff --git a/Library/Artifacts/3e/3e8f5bc95adea8eb7dc938a3a840b9b4 b/Library/Artifacts/3e/3e8f5bc95adea8eb7dc938a3a840b9b4 new file mode 100644 index 00000000..30d0ef4d Binary files /dev/null and b/Library/Artifacts/3e/3e8f5bc95adea8eb7dc938a3a840b9b4 differ diff --git a/Library/Artifacts/3e/3ec17e71dc4a75090372b92b617b45ea b/Library/Artifacts/3e/3ec17e71dc4a75090372b92b617b45ea new file mode 100644 index 00000000..1a3b64d8 Binary files /dev/null and b/Library/Artifacts/3e/3ec17e71dc4a75090372b92b617b45ea differ diff --git a/Library/Artifacts/3e/3ee67d544fcb265af9b8322b49eee6f5 b/Library/Artifacts/3e/3ee67d544fcb265af9b8322b49eee6f5 deleted file mode 100644 index 634663cf..00000000 Binary files a/Library/Artifacts/3e/3ee67d544fcb265af9b8322b49eee6f5 and /dev/null differ diff --git a/Library/Artifacts/41/419ded9da1895da224cf4f7a6c9ee227 b/Library/Artifacts/41/419ded9da1895da224cf4f7a6c9ee227 new file mode 100644 index 00000000..7d6b6c0f Binary files /dev/null and b/Library/Artifacts/41/419ded9da1895da224cf4f7a6c9ee227 differ diff --git a/Library/Artifacts/41/41a31b67d9d9f20452c18241f45660ad b/Library/Artifacts/41/41a31b67d9d9f20452c18241f45660ad new file mode 100644 index 00000000..0f3851b3 Binary files /dev/null and b/Library/Artifacts/41/41a31b67d9d9f20452c18241f45660ad differ diff --git a/Library/Artifacts/42/42921da555d0fc8eb7495f8e0a710cf1 b/Library/Artifacts/42/42921da555d0fc8eb7495f8e0a710cf1 new file mode 100644 index 00000000..8d01492c Binary files /dev/null and b/Library/Artifacts/42/42921da555d0fc8eb7495f8e0a710cf1 differ diff --git a/Library/Artifacts/42/42e27dc25a9bb827b9bb7edd679a1d80 b/Library/Artifacts/42/42e27dc25a9bb827b9bb7edd679a1d80 new file mode 100644 index 00000000..45a2ec53 Binary files /dev/null and b/Library/Artifacts/42/42e27dc25a9bb827b9bb7edd679a1d80 differ diff --git a/Library/Artifacts/45/450f76bae16098d55d150195f57d2c50 b/Library/Artifacts/45/450f76bae16098d55d150195f57d2c50 new file mode 100644 index 00000000..94c02aef Binary files /dev/null and b/Library/Artifacts/45/450f76bae16098d55d150195f57d2c50 differ diff --git a/Library/Artifacts/84/84d53ed6f63721723ac2dcada6a05241 b/Library/Artifacts/46/46f07913f84998d7f3668c50f2ec7f03 similarity index 52% rename from Library/Artifacts/84/84d53ed6f63721723ac2dcada6a05241 rename to Library/Artifacts/46/46f07913f84998d7f3668c50f2ec7f03 index 32635de8..f6a3de27 100644 Binary files a/Library/Artifacts/84/84d53ed6f63721723ac2dcada6a05241 and b/Library/Artifacts/46/46f07913f84998d7f3668c50f2ec7f03 differ diff --git a/Library/Artifacts/4a/4a14f9a83fadbe66de22e4715dbc3e93 b/Library/Artifacts/4a/4a14f9a83fadbe66de22e4715dbc3e93 deleted file mode 100644 index a31ed2b4..00000000 Binary files a/Library/Artifacts/4a/4a14f9a83fadbe66de22e4715dbc3e93 and /dev/null differ diff --git a/Library/Artifacts/4a/4a67f0723df38fef31a03efc9b8cba8d b/Library/Artifacts/4a/4a67f0723df38fef31a03efc9b8cba8d new file mode 100644 index 00000000..76ff9fad Binary files /dev/null and b/Library/Artifacts/4a/4a67f0723df38fef31a03efc9b8cba8d differ diff --git a/Library/Artifacts/31/31d2f0b77d3a470410e1cf13e5a42652 b/Library/Artifacts/4c/4c067678f767cdeef6792c26af139aa2 similarity index 98% rename from Library/Artifacts/31/31d2f0b77d3a470410e1cf13e5a42652 rename to Library/Artifacts/4c/4c067678f767cdeef6792c26af139aa2 index a7cdb2bd..db610dcc 100644 Binary files a/Library/Artifacts/31/31d2f0b77d3a470410e1cf13e5a42652 and b/Library/Artifacts/4c/4c067678f767cdeef6792c26af139aa2 differ diff --git a/Library/Artifacts/4c/4caae8653baf67ecf2d83e6559a82828 b/Library/Artifacts/4c/4caae8653baf67ecf2d83e6559a82828 new file mode 100644 index 00000000..5cb67ee2 Binary files /dev/null and b/Library/Artifacts/4c/4caae8653baf67ecf2d83e6559a82828 differ diff --git a/Library/Artifacts/4d/4de547e45f62ed384c2ec1465e00db3f b/Library/Artifacts/4d/4de547e45f62ed384c2ec1465e00db3f new file mode 100644 index 00000000..0247af70 Binary files /dev/null and b/Library/Artifacts/4d/4de547e45f62ed384c2ec1465e00db3f differ diff --git a/Library/Artifacts/db/dbf3ec5c8bf66a6c0438cb5b5d3c85ce b/Library/Artifacts/50/5060228b11eb43a196ea4eb9f71c02eb similarity index 97% rename from Library/Artifacts/db/dbf3ec5c8bf66a6c0438cb5b5d3c85ce rename to Library/Artifacts/50/5060228b11eb43a196ea4eb9f71c02eb index 0e1471e9..785f4263 100644 Binary files a/Library/Artifacts/db/dbf3ec5c8bf66a6c0438cb5b5d3c85ce and b/Library/Artifacts/50/5060228b11eb43a196ea4eb9f71c02eb differ diff --git a/Library/Artifacts/50/50bdb3ba0f2272b9330bad100d377959 b/Library/Artifacts/50/50bdb3ba0f2272b9330bad100d377959 deleted file mode 100644 index 87c6dd29..00000000 Binary files a/Library/Artifacts/50/50bdb3ba0f2272b9330bad100d377959 and /dev/null differ diff --git a/Library/Artifacts/51/512c5c83207dd9de86e7e5c28bfa4431 b/Library/Artifacts/51/512c5c83207dd9de86e7e5c28bfa4431 new file mode 100644 index 00000000..ea5dca12 Binary files /dev/null and b/Library/Artifacts/51/512c5c83207dd9de86e7e5c28bfa4431 differ diff --git a/Library/Artifacts/52/52557b52ce59bc7394de4806ab52faf1 b/Library/Artifacts/52/52557b52ce59bc7394de4806ab52faf1 new file mode 100644 index 00000000..2e90542c Binary files /dev/null and b/Library/Artifacts/52/52557b52ce59bc7394de4806ab52faf1 differ diff --git a/Library/Artifacts/54/54534aac997566aa9d8e104ab5cec8da b/Library/Artifacts/54/54534aac997566aa9d8e104ab5cec8da new file mode 100644 index 00000000..bd691329 Binary files /dev/null and b/Library/Artifacts/54/54534aac997566aa9d8e104ab5cec8da differ diff --git a/Library/Artifacts/5d/5d1489e74deecc1b0b55462cf2d44def b/Library/Artifacts/56/561ff4992e8978116bac283968c9f98c similarity index 95% rename from Library/Artifacts/5d/5d1489e74deecc1b0b55462cf2d44def rename to Library/Artifacts/56/561ff4992e8978116bac283968c9f98c index b0cf2822..e2b2e26e 100644 Binary files a/Library/Artifacts/5d/5d1489e74deecc1b0b55462cf2d44def and b/Library/Artifacts/56/561ff4992e8978116bac283968c9f98c differ diff --git a/Library/Artifacts/57/572b149842bb1e9d787fba352b25debb b/Library/Artifacts/57/572b149842bb1e9d787fba352b25debb deleted file mode 100644 index 0e7e5d15..00000000 Binary files a/Library/Artifacts/57/572b149842bb1e9d787fba352b25debb and /dev/null differ diff --git a/Library/Artifacts/57/5781cff7f6d8d859501a9ca7c20623f3 b/Library/Artifacts/57/5781cff7f6d8d859501a9ca7c20623f3 new file mode 100644 index 00000000..10cdec74 Binary files /dev/null and b/Library/Artifacts/57/5781cff7f6d8d859501a9ca7c20623f3 differ diff --git a/Library/Artifacts/59/59324be8e013b81f3671c3513df71d2d b/Library/Artifacts/59/59324be8e013b81f3671c3513df71d2d new file mode 100644 index 00000000..d6a9ee91 Binary files /dev/null and b/Library/Artifacts/59/59324be8e013b81f3671c3513df71d2d differ diff --git a/Library/Artifacts/59/597eb5765ebdcdbe4c11579f3aa0a4b6 b/Library/Artifacts/59/597eb5765ebdcdbe4c11579f3aa0a4b6 new file mode 100644 index 00000000..670ee1ed Binary files /dev/null and b/Library/Artifacts/59/597eb5765ebdcdbe4c11579f3aa0a4b6 differ diff --git a/Library/Artifacts/5c/5cacadb257b4fb225da711da76bb1212 b/Library/Artifacts/5c/5cacadb257b4fb225da711da76bb1212 new file mode 100644 index 00000000..48dd90a8 Binary files /dev/null and b/Library/Artifacts/5c/5cacadb257b4fb225da711da76bb1212 differ diff --git a/Library/Artifacts/5d/5d8924bb952a95b9388212f7c1fd0c85 b/Library/Artifacts/5d/5d8924bb952a95b9388212f7c1fd0c85 new file mode 100644 index 00000000..f2e88ccd Binary files /dev/null and b/Library/Artifacts/5d/5d8924bb952a95b9388212f7c1fd0c85 differ diff --git a/Library/Artifacts/5e/5e9ce2b94d57ae495179d7a7fae9ce48 b/Library/Artifacts/5e/5e9ce2b94d57ae495179d7a7fae9ce48 new file mode 100644 index 00000000..a44e33c4 Binary files /dev/null and b/Library/Artifacts/5e/5e9ce2b94d57ae495179d7a7fae9ce48 differ diff --git a/Library/Artifacts/5e/5ea692c7ad5a0c7771e31bd8cebfc8a6 b/Library/Artifacts/5e/5ea692c7ad5a0c7771e31bd8cebfc8a6 deleted file mode 100644 index c631e6b7..00000000 Binary files a/Library/Artifacts/5e/5ea692c7ad5a0c7771e31bd8cebfc8a6 and /dev/null differ diff --git a/Library/Artifacts/61/612b4c3566e379d40d2305f11ec17025 b/Library/Artifacts/61/612b4c3566e379d40d2305f11ec17025 new file mode 100644 index 00000000..7c65d40a Binary files /dev/null and b/Library/Artifacts/61/612b4c3566e379d40d2305f11ec17025 differ diff --git a/Library/Artifacts/61/615e3795ca9bcb55000f294a769d8f4c b/Library/Artifacts/61/615e3795ca9bcb55000f294a769d8f4c new file mode 100644 index 00000000..3ab550a3 Binary files /dev/null and b/Library/Artifacts/61/615e3795ca9bcb55000f294a769d8f4c differ diff --git a/Library/Artifacts/62/62c4fa679f42a53182621822ec59bf1c b/Library/Artifacts/62/62c4fa679f42a53182621822ec59bf1c new file mode 100644 index 00000000..dd910968 Binary files /dev/null and b/Library/Artifacts/62/62c4fa679f42a53182621822ec59bf1c differ diff --git a/Library/Artifacts/62/62dd0f7b6ddaa9efd4249151ec13e012 b/Library/Artifacts/62/62dd0f7b6ddaa9efd4249151ec13e012 deleted file mode 100644 index da0273e3..00000000 Binary files a/Library/Artifacts/62/62dd0f7b6ddaa9efd4249151ec13e012 and /dev/null differ diff --git a/Library/Artifacts/63/636c156ec8f9222892f2956bd39403b4 b/Library/Artifacts/63/636c156ec8f9222892f2956bd39403b4 new file mode 100644 index 00000000..93017d3f Binary files /dev/null and b/Library/Artifacts/63/636c156ec8f9222892f2956bd39403b4 differ diff --git a/Library/Artifacts/64/64ecb5ea5c65bdca7f3477d50981ab92 b/Library/Artifacts/64/64ecb5ea5c65bdca7f3477d50981ab92 deleted file mode 100644 index 70371933..00000000 Binary files a/Library/Artifacts/64/64ecb5ea5c65bdca7f3477d50981ab92 and /dev/null differ diff --git a/Library/Artifacts/99/99002924e8668972c17697fb65a198a8 b/Library/Artifacts/65/65abfb605629a4847fbf8bd2f7704b5f similarity index 53% rename from Library/Artifacts/99/99002924e8668972c17697fb65a198a8 rename to Library/Artifacts/65/65abfb605629a4847fbf8bd2f7704b5f index 017383da..37baeb8a 100644 Binary files a/Library/Artifacts/99/99002924e8668972c17697fb65a198a8 and b/Library/Artifacts/65/65abfb605629a4847fbf8bd2f7704b5f differ diff --git a/Library/Artifacts/69/694040adaa7d7dfa92cb3759459f0688 b/Library/Artifacts/69/694040adaa7d7dfa92cb3759459f0688 new file mode 100644 index 00000000..9103f0d0 Binary files /dev/null and b/Library/Artifacts/69/694040adaa7d7dfa92cb3759459f0688 differ diff --git a/Library/Artifacts/5a/5a73eba595fc7798a349f35671da608b b/Library/Artifacts/69/6995137658d32078cffe108d53e799d8 similarity index 96% rename from Library/Artifacts/5a/5a73eba595fc7798a349f35671da608b rename to Library/Artifacts/69/6995137658d32078cffe108d53e799d8 index cd169be3..b8ffadd3 100644 Binary files a/Library/Artifacts/5a/5a73eba595fc7798a349f35671da608b and b/Library/Artifacts/69/6995137658d32078cffe108d53e799d8 differ diff --git a/Library/Artifacts/6b/6b8219dc2b0561f78e49c194d47e7aad b/Library/Artifacts/6b/6b8219dc2b0561f78e49c194d47e7aad new file mode 100644 index 00000000..35d113c4 Binary files /dev/null and b/Library/Artifacts/6b/6b8219dc2b0561f78e49c194d47e7aad differ diff --git a/Library/Artifacts/6b/6bb8cf60a399c5da4980704ed847541f b/Library/Artifacts/6b/6bb8cf60a399c5da4980704ed847541f new file mode 100644 index 00000000..d5a38e20 Binary files /dev/null and b/Library/Artifacts/6b/6bb8cf60a399c5da4980704ed847541f differ diff --git a/Library/Artifacts/6d/6d8e7e960088816160bfd15026b0bdf6 b/Library/Artifacts/6d/6d8e7e960088816160bfd15026b0bdf6 deleted file mode 100644 index 1445b48f..00000000 Binary files a/Library/Artifacts/6d/6d8e7e960088816160bfd15026b0bdf6 and /dev/null differ diff --git a/Library/Artifacts/72/72a148dcaa45bcd9dbe58a164ad10ed9 b/Library/Artifacts/72/72a148dcaa45bcd9dbe58a164ad10ed9 new file mode 100644 index 00000000..6c161da7 Binary files /dev/null and b/Library/Artifacts/72/72a148dcaa45bcd9dbe58a164ad10ed9 differ diff --git a/Library/Artifacts/11/11095d5db6184bfa9d4cf6c0a29f157a b/Library/Artifacts/73/73f2b1d09594bc6bc445de2644f27e79 similarity index 91% rename from Library/Artifacts/11/11095d5db6184bfa9d4cf6c0a29f157a rename to Library/Artifacts/73/73f2b1d09594bc6bc445de2644f27e79 index 418fa126..9760b851 100644 Binary files a/Library/Artifacts/11/11095d5db6184bfa9d4cf6c0a29f157a and b/Library/Artifacts/73/73f2b1d09594bc6bc445de2644f27e79 differ diff --git a/Library/Artifacts/77/7752e033620bc32d292327afd7b05288 b/Library/Artifacts/77/7752e033620bc32d292327afd7b05288 new file mode 100644 index 00000000..bfe0ca33 Binary files /dev/null and b/Library/Artifacts/77/7752e033620bc32d292327afd7b05288 differ diff --git a/Library/Artifacts/78/789fca5305ac019829ee4312f61af7af b/Library/Artifacts/78/789fca5305ac019829ee4312f61af7af new file mode 100644 index 00000000..1567836f Binary files /dev/null and b/Library/Artifacts/78/789fca5305ac019829ee4312f61af7af differ diff --git a/Library/Artifacts/79/7903532e0815ca4c99f98b372089ab47 b/Library/Artifacts/79/7903532e0815ca4c99f98b372089ab47 deleted file mode 100644 index a81db7c2..00000000 Binary files a/Library/Artifacts/79/7903532e0815ca4c99f98b372089ab47 and /dev/null differ diff --git a/Library/Artifacts/ae/ae5ce04d6c18d23f396e95d1592db174 b/Library/Artifacts/7a/7a0c7e3c977b0d24a79fb6e367ea824b similarity index 87% rename from Library/Artifacts/ae/ae5ce04d6c18d23f396e95d1592db174 rename to Library/Artifacts/7a/7a0c7e3c977b0d24a79fb6e367ea824b index b4ca8630..b557c410 100644 Binary files a/Library/Artifacts/ae/ae5ce04d6c18d23f396e95d1592db174 and b/Library/Artifacts/7a/7a0c7e3c977b0d24a79fb6e367ea824b differ diff --git a/Library/Artifacts/7b/7b105e072ce99610d36ad170d4451ffd b/Library/Artifacts/7b/7b105e072ce99610d36ad170d4451ffd new file mode 100644 index 00000000..f6847a79 Binary files /dev/null and b/Library/Artifacts/7b/7b105e072ce99610d36ad170d4451ffd differ diff --git a/Library/Artifacts/16/1610538f1ce9097e63824d7c77e72906 b/Library/Artifacts/7f/7f15ecd6e02045fa0f777d0e21b6c0fb similarity index 90% rename from Library/Artifacts/16/1610538f1ce9097e63824d7c77e72906 rename to Library/Artifacts/7f/7f15ecd6e02045fa0f777d0e21b6c0fb index 47467871..5a82514f 100644 Binary files a/Library/Artifacts/16/1610538f1ce9097e63824d7c77e72906 and b/Library/Artifacts/7f/7f15ecd6e02045fa0f777d0e21b6c0fb differ diff --git a/Library/Artifacts/99/9991dcdb93b7af9c923288d50af3a59f b/Library/Artifacts/7f/7ffda39d138755ccd1dd229a1918e7f7 similarity index 75% rename from Library/Artifacts/99/9991dcdb93b7af9c923288d50af3a59f rename to Library/Artifacts/7f/7ffda39d138755ccd1dd229a1918e7f7 index 64e2bb57..940bc5b8 100644 Binary files a/Library/Artifacts/99/9991dcdb93b7af9c923288d50af3a59f and b/Library/Artifacts/7f/7ffda39d138755ccd1dd229a1918e7f7 differ diff --git a/Library/Artifacts/b1/b1e2361ab9906f719638ba0256aa0c99 b/Library/Artifacts/80/804337ebaddfa117b0c29bcf8cb7ad01 similarity index 97% rename from Library/Artifacts/b1/b1e2361ab9906f719638ba0256aa0c99 rename to Library/Artifacts/80/804337ebaddfa117b0c29bcf8cb7ad01 index e87716e1..0cdb8c9a 100644 Binary files a/Library/Artifacts/b1/b1e2361ab9906f719638ba0256aa0c99 and b/Library/Artifacts/80/804337ebaddfa117b0c29bcf8cb7ad01 differ diff --git a/Library/Artifacts/80/80f482ef6133f069ea357e1a17da773f b/Library/Artifacts/80/80f482ef6133f069ea357e1a17da773f new file mode 100644 index 00000000..37ba82ac Binary files /dev/null and b/Library/Artifacts/80/80f482ef6133f069ea357e1a17da773f differ diff --git a/Library/Artifacts/82/8277e75a78383b68c3be7d8b404e868c b/Library/Artifacts/82/8277e75a78383b68c3be7d8b404e868c new file mode 100644 index 00000000..b96697a1 Binary files /dev/null and b/Library/Artifacts/82/8277e75a78383b68c3be7d8b404e868c differ diff --git a/Library/Artifacts/82/829608b656e7c833da7bd5410701b5ca b/Library/Artifacts/82/829608b656e7c833da7bd5410701b5ca new file mode 100644 index 00000000..4f4fae8e Binary files /dev/null and b/Library/Artifacts/82/829608b656e7c833da7bd5410701b5ca differ diff --git a/Library/Artifacts/83/83fd4c0041987eb7128e4339550dcdb2 b/Library/Artifacts/83/83fd4c0041987eb7128e4339550dcdb2 new file mode 100644 index 00000000..81ad82ba Binary files /dev/null and b/Library/Artifacts/83/83fd4c0041987eb7128e4339550dcdb2 differ diff --git a/Library/Artifacts/86/866fcd5df1d742d4013fb8e7a53dd141 b/Library/Artifacts/86/866fcd5df1d742d4013fb8e7a53dd141 new file mode 100644 index 00000000..e4f4ff82 Binary files /dev/null and b/Library/Artifacts/86/866fcd5df1d742d4013fb8e7a53dd141 differ diff --git a/Library/Artifacts/87/878244047ed1bef113475ffea8d4017c b/Library/Artifacts/87/878244047ed1bef113475ffea8d4017c new file mode 100644 index 00000000..aaaf9d5b Binary files /dev/null and b/Library/Artifacts/87/878244047ed1bef113475ffea8d4017c differ diff --git a/Library/Artifacts/88/88737adbe8a0db2c88fcf5fa426c9852 b/Library/Artifacts/88/88737adbe8a0db2c88fcf5fa426c9852 new file mode 100644 index 00000000..2a3d76ad Binary files /dev/null and b/Library/Artifacts/88/88737adbe8a0db2c88fcf5fa426c9852 differ diff --git a/Library/Artifacts/8d/8de93a9da2a311240a6af4646a3bc46f b/Library/Artifacts/8d/8de93a9da2a311240a6af4646a3bc46f new file mode 100644 index 00000000..3e25c54f Binary files /dev/null and b/Library/Artifacts/8d/8de93a9da2a311240a6af4646a3bc46f differ diff --git a/Library/Artifacts/91/91c0c84843c9518a47b1ab83781c9969 b/Library/Artifacts/91/91c0c84843c9518a47b1ab83781c9969 new file mode 100644 index 00000000..4076ccdc Binary files /dev/null and b/Library/Artifacts/91/91c0c84843c9518a47b1ab83781c9969 differ diff --git a/Library/Artifacts/93/93105f762dbb794bc691ebb09bee2a96 b/Library/Artifacts/93/93105f762dbb794bc691ebb09bee2a96 deleted file mode 100644 index 2cea25ed..00000000 Binary files a/Library/Artifacts/93/93105f762dbb794bc691ebb09bee2a96 and /dev/null differ diff --git a/Library/Artifacts/99/99232e726b70fac26a01638e3751b75f b/Library/Artifacts/99/99232e726b70fac26a01638e3751b75f deleted file mode 100644 index 3f5cc6f5..00000000 Binary files a/Library/Artifacts/99/99232e726b70fac26a01638e3751b75f and /dev/null differ diff --git a/Library/Artifacts/aa/aa8f8df0cfe247e9a168c4fa63b7f919 b/Library/Artifacts/9a/9a68d44afa2400fe0dadb18f2284a274 similarity index 55% rename from Library/Artifacts/aa/aa8f8df0cfe247e9a168c4fa63b7f919 rename to Library/Artifacts/9a/9a68d44afa2400fe0dadb18f2284a274 index c1fef6af..5651384f 100644 Binary files a/Library/Artifacts/aa/aa8f8df0cfe247e9a168c4fa63b7f919 and b/Library/Artifacts/9a/9a68d44afa2400fe0dadb18f2284a274 differ diff --git a/Library/Artifacts/4e/4e037fe46697280cde9c905749385e72 b/Library/Artifacts/9b/9b9ef59f2d0682c31ad66e3a618f235c similarity index 92% rename from Library/Artifacts/4e/4e037fe46697280cde9c905749385e72 rename to Library/Artifacts/9b/9b9ef59f2d0682c31ad66e3a618f235c index 587f623f..0cc267e3 100644 Binary files a/Library/Artifacts/4e/4e037fe46697280cde9c905749385e72 and b/Library/Artifacts/9b/9b9ef59f2d0682c31ad66e3a618f235c differ diff --git a/Library/Artifacts/9c/9c16d981db7cfc0a1902353678fa1c18 b/Library/Artifacts/9c/9c16d981db7cfc0a1902353678fa1c18 new file mode 100644 index 00000000..fda9a1b9 Binary files /dev/null and b/Library/Artifacts/9c/9c16d981db7cfc0a1902353678fa1c18 differ diff --git a/Library/Artifacts/9c/9c6b491d61d526896ee3dc015955a210 b/Library/Artifacts/9c/9c6b491d61d526896ee3dc015955a210 new file mode 100644 index 00000000..899ddbe8 Binary files /dev/null and b/Library/Artifacts/9c/9c6b491d61d526896ee3dc015955a210 differ diff --git a/Library/Artifacts/9c/9cf63e226eb8cf486c358ec7e309445e b/Library/Artifacts/9c/9cf63e226eb8cf486c358ec7e309445e new file mode 100644 index 00000000..e6fc95a9 Binary files /dev/null and b/Library/Artifacts/9c/9cf63e226eb8cf486c358ec7e309445e differ diff --git a/Library/Artifacts/9f/9f9128583ad095fbb2d1d76d32d29e5b b/Library/Artifacts/9f/9f9128583ad095fbb2d1d76d32d29e5b new file mode 100644 index 00000000..1c545c92 Binary files /dev/null and b/Library/Artifacts/9f/9f9128583ad095fbb2d1d76d32d29e5b differ diff --git a/Library/Artifacts/a0/a0c704042d112c29a4680f55638b916c b/Library/Artifacts/a0/a0c704042d112c29a4680f55638b916c deleted file mode 100644 index 8f72cbf6..00000000 Binary files a/Library/Artifacts/a0/a0c704042d112c29a4680f55638b916c and /dev/null differ diff --git a/Library/Artifacts/b2/b28b812b1c4b059bdbe08ec197b67b1b b/Library/Artifacts/a1/a11fab3425907a51c66f7baef23ea228 similarity index 94% rename from Library/Artifacts/b2/b28b812b1c4b059bdbe08ec197b67b1b rename to Library/Artifacts/a1/a11fab3425907a51c66f7baef23ea228 index 3e0f01f6..1e6f0968 100644 Binary files a/Library/Artifacts/b2/b28b812b1c4b059bdbe08ec197b67b1b and b/Library/Artifacts/a1/a11fab3425907a51c66f7baef23ea228 differ diff --git a/Library/Artifacts/a3/a36ca1076aa2facbef00ba5b6f4c8922 b/Library/Artifacts/a3/a36ca1076aa2facbef00ba5b6f4c8922 new file mode 100644 index 00000000..d82929c4 Binary files /dev/null and b/Library/Artifacts/a3/a36ca1076aa2facbef00ba5b6f4c8922 differ diff --git a/Library/Artifacts/a7/a75a1f402798cd684c34aab987edb6d9 b/Library/Artifacts/a7/a75a1f402798cd684c34aab987edb6d9 new file mode 100644 index 00000000..04b35ffa Binary files /dev/null and b/Library/Artifacts/a7/a75a1f402798cd684c34aab987edb6d9 differ diff --git a/Library/Artifacts/a8/a89f4f979a5b85b16f58d61d89c7b64e b/Library/Artifacts/a8/a89f4f979a5b85b16f58d61d89c7b64e new file mode 100644 index 00000000..852a354b Binary files /dev/null and b/Library/Artifacts/a8/a89f4f979a5b85b16f58d61d89c7b64e differ diff --git a/Library/Artifacts/ef/ef628c714be4e202be07b343637c67e8 b/Library/Artifacts/a8/a8a9b05043ad37f2fcf37c9de134125d similarity index 88% rename from Library/Artifacts/ef/ef628c714be4e202be07b343637c67e8 rename to Library/Artifacts/a8/a8a9b05043ad37f2fcf37c9de134125d index 2319a5b6..2b29ddda 100644 Binary files a/Library/Artifacts/ef/ef628c714be4e202be07b343637c67e8 and b/Library/Artifacts/a8/a8a9b05043ad37f2fcf37c9de134125d differ diff --git a/Library/Artifacts/ac/ac8125046b2297f6d29fd17abd6406f7 b/Library/Artifacts/ac/ac8125046b2297f6d29fd17abd6406f7 new file mode 100644 index 00000000..95db37d7 Binary files /dev/null and b/Library/Artifacts/ac/ac8125046b2297f6d29fd17abd6406f7 differ diff --git a/Library/Artifacts/ad/add16aa1419ea8f0d89bf0d4d1e16d09 b/Library/Artifacts/ad/add16aa1419ea8f0d89bf0d4d1e16d09 deleted file mode 100644 index 407de746..00000000 Binary files a/Library/Artifacts/ad/add16aa1419ea8f0d89bf0d4d1e16d09 and /dev/null differ diff --git a/Library/Artifacts/ae/ae5d2dd88fbb253b7b893d9c0b714f31 b/Library/Artifacts/ae/ae5d2dd88fbb253b7b893d9c0b714f31 deleted file mode 100644 index c3442b1c..00000000 Binary files a/Library/Artifacts/ae/ae5d2dd88fbb253b7b893d9c0b714f31 and /dev/null differ diff --git a/Library/Artifacts/af/afcff917c72f5e956a6893f48ed45c70 b/Library/Artifacts/af/afcff917c72f5e956a6893f48ed45c70 deleted file mode 100644 index 0cdce846..00000000 Binary files a/Library/Artifacts/af/afcff917c72f5e956a6893f48ed45c70 and /dev/null differ diff --git a/Library/Artifacts/b0/b017c56197d00a8f72cd19af788b3c40 b/Library/Artifacts/b0/b017c56197d00a8f72cd19af788b3c40 deleted file mode 100644 index 97c430d6..00000000 Binary files a/Library/Artifacts/b0/b017c56197d00a8f72cd19af788b3c40 and /dev/null differ diff --git a/Library/Artifacts/b1/b10b3a334a3db14d6be5efdc30e4ee28 b/Library/Artifacts/b1/b10b3a334a3db14d6be5efdc30e4ee28 new file mode 100644 index 00000000..45d0018a Binary files /dev/null and b/Library/Artifacts/b1/b10b3a334a3db14d6be5efdc30e4ee28 differ diff --git a/Library/Artifacts/7f/7f9e219f61afdd285073fda21bbf1ffd b/Library/Artifacts/b2/b2559869a75185d08e577ec2625e0d37 similarity index 50% rename from Library/Artifacts/7f/7f9e219f61afdd285073fda21bbf1ffd rename to Library/Artifacts/b2/b2559869a75185d08e577ec2625e0d37 index b9d466df..6443b738 100644 Binary files a/Library/Artifacts/7f/7f9e219f61afdd285073fda21bbf1ffd and b/Library/Artifacts/b2/b2559869a75185d08e577ec2625e0d37 differ diff --git a/Library/Artifacts/03/03cd127bb37f089a0d02d1dbb56f8835 b/Library/Artifacts/b6/b6f546df35b4ded7cf68a4bc8408285c similarity index 90% rename from Library/Artifacts/03/03cd127bb37f089a0d02d1dbb56f8835 rename to Library/Artifacts/b6/b6f546df35b4ded7cf68a4bc8408285c index f670e438..89dea527 100644 Binary files a/Library/Artifacts/03/03cd127bb37f089a0d02d1dbb56f8835 and b/Library/Artifacts/b6/b6f546df35b4ded7cf68a4bc8408285c differ diff --git a/Library/Artifacts/b7/b77440d8fcf94ceb192fcffdc4102f8b b/Library/Artifacts/b7/b77440d8fcf94ceb192fcffdc4102f8b deleted file mode 100644 index bbbb766f..00000000 Binary files a/Library/Artifacts/b7/b77440d8fcf94ceb192fcffdc4102f8b and /dev/null differ diff --git a/Library/Artifacts/b9/b91d85ca85cbc6c076f9bcbf409652a7 b/Library/Artifacts/b9/b91d85ca85cbc6c076f9bcbf409652a7 new file mode 100644 index 00000000..6c34051e Binary files /dev/null and b/Library/Artifacts/b9/b91d85ca85cbc6c076f9bcbf409652a7 differ diff --git a/Library/Artifacts/79/796c3bb3a7dae077404194e6a3dcb1e7 b/Library/Artifacts/b9/b92c07ccb57f4eaf09492c9d3d3ef181 similarity index 79% rename from Library/Artifacts/79/796c3bb3a7dae077404194e6a3dcb1e7 rename to Library/Artifacts/b9/b92c07ccb57f4eaf09492c9d3d3ef181 index 1cee7e28..d448f2c5 100644 Binary files a/Library/Artifacts/79/796c3bb3a7dae077404194e6a3dcb1e7 and b/Library/Artifacts/b9/b92c07ccb57f4eaf09492c9d3d3ef181 differ diff --git a/Library/Artifacts/bb/bb6f1bf895bb8b2ea872153ec8501d72 b/Library/Artifacts/bb/bb6f1bf895bb8b2ea872153ec8501d72 new file mode 100644 index 00000000..51fda048 Binary files /dev/null and b/Library/Artifacts/bb/bb6f1bf895bb8b2ea872153ec8501d72 differ diff --git a/Library/Artifacts/bd/bdbb2c03378096c53dec52a21a548fbe b/Library/Artifacts/bd/bdbb2c03378096c53dec52a21a548fbe deleted file mode 100644 index e5741737..00000000 Binary files a/Library/Artifacts/bd/bdbb2c03378096c53dec52a21a548fbe and /dev/null differ diff --git a/Library/Artifacts/be/bee0c8629c7583e44e0760927610bf6a b/Library/Artifacts/be/bee0c8629c7583e44e0760927610bf6a new file mode 100644 index 00000000..c5a76289 Binary files /dev/null and b/Library/Artifacts/be/bee0c8629c7583e44e0760927610bf6a differ diff --git a/Library/Artifacts/c1/c1c3898f354e5030e728ed6a34843661 b/Library/Artifacts/c1/c1c3898f354e5030e728ed6a34843661 new file mode 100644 index 00000000..41aa2c97 Binary files /dev/null and b/Library/Artifacts/c1/c1c3898f354e5030e728ed6a34843661 differ diff --git a/Library/Artifacts/bf/bf7c4c76693fb5bdfd8bef94ac466d07 b/Library/Artifacts/c4/c48f88ed327f0215ea2ff4da25f7b5b3 similarity index 93% rename from Library/Artifacts/bf/bf7c4c76693fb5bdfd8bef94ac466d07 rename to Library/Artifacts/c4/c48f88ed327f0215ea2ff4da25f7b5b3 index 36cd7bf1..d1d1e0c8 100644 Binary files a/Library/Artifacts/bf/bf7c4c76693fb5bdfd8bef94ac466d07 and b/Library/Artifacts/c4/c48f88ed327f0215ea2ff4da25f7b5b3 differ diff --git a/Library/Artifacts/c6/c618fa74c6fae8ec18b71cea9b908bf7 b/Library/Artifacts/c6/c618fa74c6fae8ec18b71cea9b908bf7 new file mode 100644 index 00000000..352fe691 Binary files /dev/null and b/Library/Artifacts/c6/c618fa74c6fae8ec18b71cea9b908bf7 differ diff --git a/Library/Artifacts/c6/c6c9684c2498ec4134afe766017f2805 b/Library/Artifacts/c6/c6c9684c2498ec4134afe766017f2805 new file mode 100644 index 00000000..ff8e32f8 Binary files /dev/null and b/Library/Artifacts/c6/c6c9684c2498ec4134afe766017f2805 differ diff --git a/Library/Artifacts/c8/c85465427dbcaf9f7bc9d0aa8e0df43f b/Library/Artifacts/c8/c85465427dbcaf9f7bc9d0aa8e0df43f new file mode 100644 index 00000000..e13332e1 Binary files /dev/null and b/Library/Artifacts/c8/c85465427dbcaf9f7bc9d0aa8e0df43f differ diff --git a/Library/Artifacts/cb/cb980a6d53391356616508510af0e8ab b/Library/Artifacts/cb/cb980a6d53391356616508510af0e8ab new file mode 100644 index 00000000..572469e3 Binary files /dev/null and b/Library/Artifacts/cb/cb980a6d53391356616508510af0e8ab differ diff --git a/Library/Artifacts/dd/dd7a0ae85f5306ba339e21264b49b390 b/Library/Artifacts/cd/cd0524fe2647a80a2660d2f809be7a04 similarity index 51% rename from Library/Artifacts/dd/dd7a0ae85f5306ba339e21264b49b390 rename to Library/Artifacts/cd/cd0524fe2647a80a2660d2f809be7a04 index baf2ecd9..b24c5bb6 100644 Binary files a/Library/Artifacts/dd/dd7a0ae85f5306ba339e21264b49b390 and b/Library/Artifacts/cd/cd0524fe2647a80a2660d2f809be7a04 differ diff --git a/Library/Artifacts/48/489a9a7c06f87b88abb6a024635b717b b/Library/Artifacts/d0/d0cb3ddfd742ee17094c148cd4a84baf similarity index 53% rename from Library/Artifacts/48/489a9a7c06f87b88abb6a024635b717b rename to Library/Artifacts/d0/d0cb3ddfd742ee17094c148cd4a84baf index ffd7cbe4..2b4918e0 100644 Binary files a/Library/Artifacts/48/489a9a7c06f87b88abb6a024635b717b and b/Library/Artifacts/d0/d0cb3ddfd742ee17094c148cd4a84baf differ diff --git a/Library/Artifacts/d1/d1b02ca39be02c9294339eba51dbe8f4 b/Library/Artifacts/d1/d1b02ca39be02c9294339eba51dbe8f4 deleted file mode 100644 index 8d301cd0..00000000 Binary files a/Library/Artifacts/d1/d1b02ca39be02c9294339eba51dbe8f4 and /dev/null differ diff --git a/Library/Artifacts/55/55ea23367855499bc59f3527e033f960 b/Library/Artifacts/d1/d1ff0feddb866031fe0b83edb78750cd similarity index 89% rename from Library/Artifacts/55/55ea23367855499bc59f3527e033f960 rename to Library/Artifacts/d1/d1ff0feddb866031fe0b83edb78750cd index 8159fef5..0f63c95f 100644 Binary files a/Library/Artifacts/55/55ea23367855499bc59f3527e033f960 and b/Library/Artifacts/d1/d1ff0feddb866031fe0b83edb78750cd differ diff --git a/Library/Artifacts/d2/d2bc4ef22ffbcbbf2d424639b658bee4 b/Library/Artifacts/d2/d2bc4ef22ffbcbbf2d424639b658bee4 new file mode 100644 index 00000000..07629ff4 Binary files /dev/null and b/Library/Artifacts/d2/d2bc4ef22ffbcbbf2d424639b658bee4 differ diff --git a/Library/Artifacts/d4/d435474bf7ea3beb0cc797cebe2f50c1 b/Library/Artifacts/d4/d435474bf7ea3beb0cc797cebe2f50c1 deleted file mode 100644 index 86ab73e3..00000000 Binary files a/Library/Artifacts/d4/d435474bf7ea3beb0cc797cebe2f50c1 and /dev/null differ diff --git a/Library/Artifacts/5b/5b68c6c0aad55e9ebe9c091bfa4539ba b/Library/Artifacts/d6/d69fb17a91612c624770ca249bf85806 similarity index 92% rename from Library/Artifacts/5b/5b68c6c0aad55e9ebe9c091bfa4539ba rename to Library/Artifacts/d6/d69fb17a91612c624770ca249bf85806 index 621d5d90..470b713d 100644 Binary files a/Library/Artifacts/5b/5b68c6c0aad55e9ebe9c091bfa4539ba and b/Library/Artifacts/d6/d69fb17a91612c624770ca249bf85806 differ diff --git a/Library/Artifacts/d7/d711a7fe542b3e10ee8dd9befb3e815a b/Library/Artifacts/d7/d711a7fe542b3e10ee8dd9befb3e815a new file mode 100644 index 00000000..99fe68c3 Binary files /dev/null and b/Library/Artifacts/d7/d711a7fe542b3e10ee8dd9befb3e815a differ diff --git a/Library/Artifacts/d7/d75a6a4488699b3a51d3714df39b89c7 b/Library/Artifacts/d7/d75a6a4488699b3a51d3714df39b89c7 deleted file mode 100644 index ad1c8f40..00000000 Binary files a/Library/Artifacts/d7/d75a6a4488699b3a51d3714df39b89c7 and /dev/null differ diff --git a/Library/Artifacts/d9/d91a31db4314aa6f37f97af2f0879e99 b/Library/Artifacts/d9/d91a31db4314aa6f37f97af2f0879e99 new file mode 100644 index 00000000..43568603 Binary files /dev/null and b/Library/Artifacts/d9/d91a31db4314aa6f37f97af2f0879e99 differ diff --git a/Library/Artifacts/d9/d93f50d6dde2152fdc829462e3623ba7 b/Library/Artifacts/d9/d93f50d6dde2152fdc829462e3623ba7 deleted file mode 100644 index 292cef0d..00000000 Binary files a/Library/Artifacts/d9/d93f50d6dde2152fdc829462e3623ba7 and /dev/null differ diff --git a/Library/Artifacts/dc/dcac788eab5dfa5125ce88d827454ab3 b/Library/Artifacts/dc/dcac788eab5dfa5125ce88d827454ab3 new file mode 100644 index 00000000..d8b38f86 Binary files /dev/null and b/Library/Artifacts/dc/dcac788eab5dfa5125ce88d827454ab3 differ diff --git a/Library/Artifacts/dd/ddeab847a3840aa9d1632e1cc36ddd2e b/Library/Artifacts/dd/ddeab847a3840aa9d1632e1cc36ddd2e new file mode 100644 index 00000000..d1e13892 Binary files /dev/null and b/Library/Artifacts/dd/ddeab847a3840aa9d1632e1cc36ddd2e differ diff --git a/Library/Artifacts/de/dedc0ce59033c1e8670a06ebdcc7f2c9 b/Library/Artifacts/de/dedc0ce59033c1e8670a06ebdcc7f2c9 deleted file mode 100644 index bac35ea3..00000000 Binary files a/Library/Artifacts/de/dedc0ce59033c1e8670a06ebdcc7f2c9 and /dev/null differ diff --git a/Library/Artifacts/de/dee5d8c16ed5173fb1aac990c044d722 b/Library/Artifacts/de/dee5d8c16ed5173fb1aac990c044d722 deleted file mode 100644 index 696ea4a7..00000000 Binary files a/Library/Artifacts/de/dee5d8c16ed5173fb1aac990c044d722 and /dev/null differ diff --git a/Library/Artifacts/e1/e16e1969806c8e9634376ed271357bcc b/Library/Artifacts/e1/e16e1969806c8e9634376ed271357bcc deleted file mode 100644 index 873c7c92..00000000 Binary files a/Library/Artifacts/e1/e16e1969806c8e9634376ed271357bcc and /dev/null differ diff --git a/Library/Artifacts/e3/e3ba062b7b2b1469cd72d5e659a62e33 b/Library/Artifacts/e3/e3ba062b7b2b1469cd72d5e659a62e33 new file mode 100644 index 00000000..c43fdd03 Binary files /dev/null and b/Library/Artifacts/e3/e3ba062b7b2b1469cd72d5e659a62e33 differ diff --git a/Library/Artifacts/e3/e3dd43f8ed577ebd9a448a47c5c0ffbe b/Library/Artifacts/e3/e3dd43f8ed577ebd9a448a47c5c0ffbe new file mode 100644 index 00000000..a80238f7 Binary files /dev/null and b/Library/Artifacts/e3/e3dd43f8ed577ebd9a448a47c5c0ffbe differ diff --git a/Library/Artifacts/e8/e8e9043726365905a05e1887e64a5188 b/Library/Artifacts/e8/e8e9043726365905a05e1887e64a5188 new file mode 100644 index 00000000..1edd1a26 Binary files /dev/null and b/Library/Artifacts/e8/e8e9043726365905a05e1887e64a5188 differ diff --git a/Library/Artifacts/b1/b146b1cbdb4c0a1f9fff54cdbc612210 b/Library/Artifacts/eb/eb6bdb3325d88f79df2f0b269fe11127 similarity index 68% rename from Library/Artifacts/b1/b146b1cbdb4c0a1f9fff54cdbc612210 rename to Library/Artifacts/eb/eb6bdb3325d88f79df2f0b269fe11127 index e8314037..a0256bfd 100644 Binary files a/Library/Artifacts/b1/b146b1cbdb4c0a1f9fff54cdbc612210 and b/Library/Artifacts/eb/eb6bdb3325d88f79df2f0b269fe11127 differ diff --git a/Library/Artifacts/ec/ec3b358b957f4ed45e0b7b0105fc3c2e b/Library/Artifacts/ec/ec3b358b957f4ed45e0b7b0105fc3c2e new file mode 100644 index 00000000..b8746500 Binary files /dev/null and b/Library/Artifacts/ec/ec3b358b957f4ed45e0b7b0105fc3c2e differ diff --git a/Library/Artifacts/71/713958508c0bd9ae305238513e8d9452 b/Library/Artifacts/ee/eeaa5acc354fe3c324aa19740637306f similarity index 96% rename from Library/Artifacts/71/713958508c0bd9ae305238513e8d9452 rename to Library/Artifacts/ee/eeaa5acc354fe3c324aa19740637306f index 0b407641..a3d0b01b 100644 Binary files a/Library/Artifacts/71/713958508c0bd9ae305238513e8d9452 and b/Library/Artifacts/ee/eeaa5acc354fe3c324aa19740637306f differ diff --git a/Library/Artifacts/ef/effd29a30595768a39967ded9dc15a98 b/Library/Artifacts/ef/effd29a30595768a39967ded9dc15a98 new file mode 100644 index 00000000..7a5c73d7 Binary files /dev/null and b/Library/Artifacts/ef/effd29a30595768a39967ded9dc15a98 differ diff --git a/Library/Artifacts/f0/f0f3cc2669a8817a8648b1f2a4d15a9b b/Library/Artifacts/f0/f0f3cc2669a8817a8648b1f2a4d15a9b new file mode 100644 index 00000000..b05fa570 Binary files /dev/null and b/Library/Artifacts/f0/f0f3cc2669a8817a8648b1f2a4d15a9b differ diff --git a/Library/Artifacts/f1/f19669b97ef07a092404eb3b45936080 b/Library/Artifacts/f1/f19669b97ef07a092404eb3b45936080 new file mode 100644 index 00000000..2fc7f8c3 Binary files /dev/null and b/Library/Artifacts/f1/f19669b97ef07a092404eb3b45936080 differ diff --git a/Library/Artifacts/f2/f2e807404654f9c597524d67f667be72 b/Library/Artifacts/f2/f2e807404654f9c597524d67f667be72 new file mode 100644 index 00000000..62634880 Binary files /dev/null and b/Library/Artifacts/f2/f2e807404654f9c597524d67f667be72 differ diff --git a/Library/Artifacts/f4/f475ac3f65ce6bfe8584f1e4c43530f2 b/Library/Artifacts/f4/f475ac3f65ce6bfe8584f1e4c43530f2 deleted file mode 100644 index 09768a15..00000000 Binary files a/Library/Artifacts/f4/f475ac3f65ce6bfe8584f1e4c43530f2 and /dev/null differ diff --git a/Library/Artifacts/2b/2b4995803d77205ea0104d4a22d185b4 b/Library/Artifacts/f5/f552e4e2cf861a4930dbbc532377abc6 similarity index 98% rename from Library/Artifacts/2b/2b4995803d77205ea0104d4a22d185b4 rename to Library/Artifacts/f5/f552e4e2cf861a4930dbbc532377abc6 index caefc11f..2b5e5e0e 100644 Binary files a/Library/Artifacts/2b/2b4995803d77205ea0104d4a22d185b4 and b/Library/Artifacts/f5/f552e4e2cf861a4930dbbc532377abc6 differ diff --git a/Library/Artifacts/f6/f67a6e831458419c89daf5f46d0c98c6 b/Library/Artifacts/f6/f67a6e831458419c89daf5f46d0c98c6 new file mode 100644 index 00000000..cd5c35d8 Binary files /dev/null and b/Library/Artifacts/f6/f67a6e831458419c89daf5f46d0c98c6 differ diff --git a/Library/Artifacts/f6/f6a40951d47d6df7995330e584c9b950 b/Library/Artifacts/f6/f6a40951d47d6df7995330e584c9b950 new file mode 100644 index 00000000..b4929015 Binary files /dev/null and b/Library/Artifacts/f6/f6a40951d47d6df7995330e584c9b950 differ diff --git a/Library/Artifacts/f7/f70985f948a184ef7965383a126bd396 b/Library/Artifacts/f7/f70985f948a184ef7965383a126bd396 new file mode 100644 index 00000000..87a19b8e Binary files /dev/null and b/Library/Artifacts/f7/f70985f948a184ef7965383a126bd396 differ diff --git a/Library/Artifacts/f7/f76226e6aa0f869ffc574b7a8185a7b9 b/Library/Artifacts/f7/f76226e6aa0f869ffc574b7a8185a7b9 new file mode 100644 index 00000000..5296c5c4 Binary files /dev/null and b/Library/Artifacts/f7/f76226e6aa0f869ffc574b7a8185a7b9 differ diff --git a/Library/Artifacts/f8/f800a4ba9b1481092c25626ff9433644 b/Library/Artifacts/f8/f800a4ba9b1481092c25626ff9433644 new file mode 100644 index 00000000..8b6efc3a Binary files /dev/null and b/Library/Artifacts/f8/f800a4ba9b1481092c25626ff9433644 differ diff --git a/Library/Artifacts/fe/fe5a0eae7926d4756dc1e241800de17a b/Library/Artifacts/fe/fe5a0eae7926d4756dc1e241800de17a new file mode 100644 index 00000000..c426d413 Binary files /dev/null and b/Library/Artifacts/fe/fe5a0eae7926d4756dc1e241800de17a differ diff --git a/Library/Artifacts/ff/ffda3c1f6abf175c7c73dfe7ec7cde25 b/Library/Artifacts/ff/ffda3c1f6abf175c7c73dfe7ec7cde25 deleted file mode 100644 index d1cabe90..00000000 Binary files a/Library/Artifacts/ff/ffda3c1f6abf175c7c73dfe7ec7cde25 and /dev/null differ diff --git a/Library/CurrentLayout-default.dwlt b/Library/CurrentLayout-default.dwlt index 9d2caa2b..9c27cf74 100644 --- a/Library/CurrentLayout-default.dwlt +++ b/Library/CurrentLayout-default.dwlt @@ -21,7 +21,7 @@ MonoBehaviour: m_ShowMode: 4 m_Title: m_RootView: {fileID: 2} - m_MinSize: {x: 875, y: 371} + m_MinSize: {x: 875, y: 300} m_MaxSize: {x: 10000, y: 10000} m_Maximized: 1 --- !u!114 &2 @@ -46,7 +46,7 @@ MonoBehaviour: y: 0 width: 1920 height: 997 - m_MinSize: {x: 875, y: 371} + m_MinSize: {x: 875, y: 300} m_MaxSize: {x: 10000, y: 10000} --- !u!114 &3 MonoBehaviour: @@ -112,10 +112,10 @@ MonoBehaviour: y: 30 width: 1920 height: 947 - m_MinSize: {x: 678, y: 321} - m_MaxSize: {x: 12003, y: 8021} + m_MinSize: {x: 679, y: 492} + m_MaxSize: {x: 14002, y: 14042} vertical: 0 - controlID: 19216 + controlID: 28175 --- !u!114 &6 MonoBehaviour: m_ObjectHideFlags: 52 @@ -137,10 +137,10 @@ MonoBehaviour: y: 0 width: 1414 height: 947 - m_MinSize: {x: 402, y: 321} - m_MaxSize: {x: 8002, y: 8021} + m_MinSize: {x: 403, y: 492} + m_MaxSize: {x: 10001, y: 14042} vertical: 1 - controlID: 19217 + controlID: 28176 --- !u!114 &7 MonoBehaviour: m_ObjectHideFlags: 52 @@ -162,10 +162,10 @@ MonoBehaviour: y: 0 width: 1414 height: 671 - m_MinSize: {x: 402, y: 221} - m_MaxSize: {x: 8002, y: 4021} + m_MinSize: {x: 403, y: 221} + m_MaxSize: {x: 8003, y: 4021} vertical: 0 - controlID: 19218 + controlID: 28177 --- !u!114 &8 MonoBehaviour: m_ObjectHideFlags: 52 @@ -231,7 +231,7 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 1 m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} - m_Name: ConsoleWindow + m_Name: ProjectBrowser m_EditorClassIdentifier: m_Children: [] m_Position: @@ -240,15 +240,15 @@ MonoBehaviour: y: 671 width: 1414 height: 276 - m_MinSize: {x: 101, y: 121} - m_MaxSize: {x: 4001, y: 4021} - m_ActualView: {fileID: 18} + m_MinSize: {x: 231, y: 271} + m_MaxSize: {x: 10001, y: 10021} + m_ActualView: {fileID: 17} m_Panes: - {fileID: 17} - {fileID: 18} - {fileID: 19} - m_Selected: 1 - m_LastSelected: 0 + m_Selected: 0 + m_LastSelected: 1 --- !u!114 &11 MonoBehaviour: m_ObjectHideFlags: 52 @@ -268,8 +268,8 @@ MonoBehaviour: y: 0 width: 506 height: 947 - m_MinSize: {x: 276, y: 71} - m_MaxSize: {x: 4001, y: 4021} + m_MinSize: {x: 275, y: 50} + m_MaxSize: {x: 4000, y: 4000} m_ActualView: {fileID: 20} m_Panes: - {fileID: 20} @@ -324,10 +324,10 @@ MonoBehaviour: m_VRangeLocked: 0 hZoomLockedByDefault: 0 vZoomLockedByDefault: 0 - m_HBaseRangeMin: -960 - m_HBaseRangeMax: 960 - m_VBaseRangeMin: -453.5 - m_VBaseRangeMax: 453.5 + m_HBaseRangeMin: -537.5 + m_HBaseRangeMax: 537.5 + m_VBaseRangeMin: -314.5 + m_VBaseRangeMax: 314.5 m_HAllowExceedBaseRangeMin: 1 m_HAllowExceedBaseRangeMax: 1 m_VAllowExceedBaseRangeMin: 1 @@ -345,23 +345,23 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 21 - width: 1920 - height: 907 + width: 1075 + height: 629 m_Scale: {x: 1, y: 1} - m_Translation: {x: 960, y: 453.5} + m_Translation: {x: 537.5, y: 314.5} m_MarginLeft: 0 m_MarginRight: 0 m_MarginTop: 0 m_MarginBottom: 0 m_LastShownAreaInsideMargins: serializedVersion: 2 - x: -960 - y: -453.5 - width: 1920 - height: 907 + x: -537.5 + y: -314.5 + width: 1075 + height: 629 m_MinimalGUI: 1 m_defaultScale: 1 - m_LastWindowPixelSize: {x: 1920, y: 928} + m_LastWindowPixelSize: {x: 1075, y: 650} m_ClearInEditMode: 1 m_NoCameraWarning: 1 m_LowResolutionForAspectRatios: 01000000000000000000 @@ -395,10 +395,10 @@ MonoBehaviour: m_ViewDataDictionary: {fileID: 0} m_SceneHierarchy: m_TreeViewState: - scrollPos: {x: 0, y: 0} - m_SelectedIDs: - m_LastClickedID: 0 - m_ExpandedIDs: 62fbffffe23c00005e3d0000123e00004e410000e64200003a480000 + scrollPos: {x: 0, y: 300} + m_SelectedIDs: 923d0000 + m_LastClickedID: 15762 + m_ExpandedIDs: f668fdff7878fdff62fbffffc43a00005c3d0000923d0000583e0000623e0000ac3e0000de3e0000283f00001a410000584200008c420000ee42000028440000ec45000024460000b647000042480000ee480000 m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -458,9 +458,9 @@ MonoBehaviour: m_PlayAudio: 0 m_AudioPlay: 0 m_Position: - m_Target: {x: 305.976, y: 305.10596, z: -38.525288} + m_Target: {x: 558.63934, y: 208.42484, z: -38.5} speed: 2 - m_Value: {x: 310.36136, y: 298.19485, z: -36.78535} + m_Value: {x: 558.63934, y: 208.42484, z: -38.5} m_RenderMode: 0 m_CameraMode: drawMode: 0 @@ -512,7 +512,7 @@ MonoBehaviour: m_Size: m_Target: 404.12747 speed: 2 - m_Value: 386.72485 + m_Value: 404.12747 m_Ortho: m_Target: 1 speed: 2 @@ -1104,20 +1104,20 @@ MonoBehaviour: m_SkipHidden: 0 m_SearchArea: 1 m_Folders: - - Assets/StreamingAssets + - Assets/Resources/Prefabs m_ViewMode: 1 m_StartGridSize: 67 m_LastFolders: - - Assets/StreamingAssets + - Assets/Resources/Prefabs m_LastFoldersGridSize: 67 m_LastProjectPath: C:\UnityDev\rimworld-animation-studio m_LockTracker: m_IsLocked: 0 m_FolderTreeState: scrollPos: {x: 0, y: 41} - m_SelectedIDs: c64e0000 - m_LastClickedID: 20166 - m_ExpandedIDs: 00000000984e00009a4e00009c4e00009e4e0000a04e0000a24e0000a44e0000 + m_SelectedIDs: ae4e0000 + m_LastClickedID: 20142 + m_ExpandedIDs: 00000000a24e0000a44e0000a64e0000a84e0000aa4e0000ac4e0000ae4e000000ca9a3b m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -1145,7 +1145,7 @@ MonoBehaviour: scrollPos: {x: 0, y: 0} m_SelectedIDs: m_LastClickedID: 0 - m_ExpandedIDs: 00000000984e00009a4e00009c4e00009e4e0000a04e0000a24e0000a44e0000 + m_ExpandedIDs: 00000000a24e0000a44e0000a64e0000a84e0000aa4e0000ac4e0000ae4e000000ca9a3b m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -1170,8 +1170,8 @@ MonoBehaviour: m_Icon: {fileID: 0} m_ResourceFile: m_ListAreaState: - m_SelectedInstanceIDs: 524f0000 - m_LastClickedInstanceID: 20306 + m_SelectedInstanceIDs: + m_LastClickedInstanceID: 0 m_HadKeyboardFocusLastEvent: 0 m_ExpandedInstanceIDs: c6230000303a0000063a0000a83d00005c66000000870000f8860000004a00004a4600000c430000004900007e9800000249000086980000000000007a140100 m_RenameOverlay: diff --git a/Library/CurrentMaximizeLayout.dwlt b/Library/CurrentMaximizeLayout.dwlt index 23c68877..34bc550e 100644 --- a/Library/CurrentMaximizeLayout.dwlt +++ b/Library/CurrentMaximizeLayout.dwlt @@ -21,10 +21,10 @@ MonoBehaviour: y: 30 width: 1920 height: 947 - m_MinSize: {x: 678, y: 321} - m_MaxSize: {x: 12003, y: 8021} + m_MinSize: {x: 679, y: 492} + m_MaxSize: {x: 14002, y: 14042} vertical: 0 - controlID: 19046 + controlID: 28002 --- !u!114 &2 MonoBehaviour: m_ObjectHideFlags: 52 @@ -138,10 +138,10 @@ MonoBehaviour: y: 0 width: 1414 height: 947 - m_MinSize: {x: 402, y: 321} - m_MaxSize: {x: 8002, y: 8021} + m_MinSize: {x: 403, y: 492} + m_MaxSize: {x: 10001, y: 14042} vertical: 1 - controlID: 19001 + controlID: 28003 --- !u!114 &4 MonoBehaviour: m_ObjectHideFlags: 52 @@ -163,10 +163,10 @@ MonoBehaviour: y: 0 width: 1414 height: 671 - m_MinSize: {x: 402, y: 221} - m_MaxSize: {x: 8002, y: 4021} + m_MinSize: {x: 403, y: 221} + m_MaxSize: {x: 8003, y: 4021} vertical: 0 - controlID: 19002 + controlID: 28004 --- !u!114 &5 MonoBehaviour: m_ObjectHideFlags: 52 @@ -221,10 +221,10 @@ MonoBehaviour: m_ViewDataDictionary: {fileID: 0} m_SceneHierarchy: m_TreeViewState: - scrollPos: {x: 0, y: 0} + scrollPos: {x: 0, y: 300} m_SelectedIDs: m_LastClickedID: 0 - m_ExpandedIDs: 62fbffffe23c00005e3d0000123e0000e64200003a480000 + m_ExpandedIDs: f668fdff7878fdff62fbffffc43a00005c3d0000923d0000583e0000623e0000ac3e0000de3e0000283f00001a410000584200008c420000ee42000028440000ec45000024460000b647000042480000ee480000 m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -313,9 +313,9 @@ MonoBehaviour: m_PlayAudio: 0 m_AudioPlay: 0 m_Position: - m_Target: {x: 458.48782, y: 305.65033, z: 0} + m_Target: {x: 558.63934, y: 208.42484, z: -38.5} speed: 2 - m_Value: {x: 458.48782, y: 305.65033, z: 0} + m_Value: {x: 558.63934, y: 208.42484, z: -38.5} m_RenderMode: 0 m_CameraMode: drawMode: 0 @@ -365,9 +365,9 @@ MonoBehaviour: speed: 2 m_Value: {x: 0, y: 0, z: 0, w: 1} m_Size: - m_Target: 348.6405 + m_Target: 404.12747 speed: 2 - m_Value: 348.6405 + m_Value: 404.12747 m_Ortho: m_Target: 1 speed: 2 @@ -930,7 +930,7 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 1 m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} - m_Name: ConsoleWindow + m_Name: ProjectBrowser m_EditorClassIdentifier: m_Children: [] m_Position: @@ -939,15 +939,15 @@ MonoBehaviour: y: 671 width: 1414 height: 276 - m_MinSize: {x: 100, y: 100} - m_MaxSize: {x: 4000, y: 4000} - m_ActualView: {fileID: 13} + m_MinSize: {x: 230, y: 250} + m_MaxSize: {x: 10000, y: 10000} + m_ActualView: {fileID: 12} m_Panes: - {fileID: 12} - {fileID: 13} - {fileID: 14} - m_Selected: 1 - m_LastSelected: 0 + m_Selected: 0 + m_LastSelected: 1 --- !u!114 &12 MonoBehaviour: m_ObjectHideFlags: 52 @@ -987,20 +987,20 @@ MonoBehaviour: m_SkipHidden: 0 m_SearchArea: 1 m_Folders: - - Assets/StreamingAssets + - Assets/Resources/Prefabs m_ViewMode: 1 m_StartGridSize: 67 m_LastFolders: - - Assets/StreamingAssets + - Assets/Resources/Prefabs m_LastFoldersGridSize: 67 m_LastProjectPath: C:\UnityDev\rimworld-animation-studio m_LockTracker: m_IsLocked: 0 m_FolderTreeState: scrollPos: {x: 0, y: 41} - m_SelectedIDs: c64e0000 - m_LastClickedID: 20166 - m_ExpandedIDs: 00000000984e00009a4e00009c4e00009e4e0000a04e0000a24e0000a44e0000 + m_SelectedIDs: ae4e0000 + m_LastClickedID: 20142 + m_ExpandedIDs: 00000000a24e0000a44e0000a64e0000a84e0000aa4e0000ac4e0000ae4e000000ca9a3b m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -1028,7 +1028,7 @@ MonoBehaviour: scrollPos: {x: 0, y: 0} m_SelectedIDs: m_LastClickedID: 0 - m_ExpandedIDs: 00000000984e00009a4e00009c4e00009e4e0000a04e0000a24e0000a44e0000 + m_ExpandedIDs: 00000000a24e0000a44e0000a64e0000a84e0000aa4e0000ac4e0000ae4e000000ca9a3b m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -1053,8 +1053,8 @@ MonoBehaviour: m_Icon: {fileID: 0} m_ResourceFile: m_ListAreaState: - m_SelectedInstanceIDs: 524f0000 - m_LastClickedInstanceID: 20306 + m_SelectedInstanceIDs: 923d0000 + m_LastClickedInstanceID: 15762 m_HadKeyboardFocusLastEvent: 0 m_ExpandedInstanceIDs: c6230000303a0000063a0000a83d00005c66000000870000f8860000004a00004a4600000c430000004900007e9800000249000086980000000000007a140100 m_RenameOverlay: @@ -1203,5 +1203,5 @@ MonoBehaviour: m_ControlHash: -371814159 m_PrefName: Preview_InspectorPreview m_PreviewWindow: {fileID: 0} - m_LastInspectedObjectInstanceID: 18490 + m_LastInspectedObjectInstanceID: 15762 m_LastVerticalScrollValue: 0 diff --git a/Library/InspectorExpandedItems.asset b/Library/InspectorExpandedItems.asset index 4fada9e7..e6fdabf3 100644 Binary files a/Library/InspectorExpandedItems.asset and b/Library/InspectorExpandedItems.asset differ diff --git a/Library/ScriptAssemblies/Assembly-CSharp-Editor.dll b/Library/ScriptAssemblies/Assembly-CSharp-Editor.dll index 988d6f50..44675b9c 100644 Binary files a/Library/ScriptAssemblies/Assembly-CSharp-Editor.dll and b/Library/ScriptAssemblies/Assembly-CSharp-Editor.dll differ diff --git a/Library/ScriptAssemblies/Assembly-CSharp.dll b/Library/ScriptAssemblies/Assembly-CSharp.dll index c01e9093..035b927f 100644 Binary files a/Library/ScriptAssemblies/Assembly-CSharp.dll and b/Library/ScriptAssemblies/Assembly-CSharp.dll differ diff --git a/Library/ScriptAssemblies/Assembly-CSharp.pdb b/Library/ScriptAssemblies/Assembly-CSharp.pdb index c5b5b5f7..4ce1ef0d 100644 Binary files a/Library/ScriptAssemblies/Assembly-CSharp.pdb and b/Library/ScriptAssemblies/Assembly-CSharp.pdb differ diff --git a/Library/SourceAssetDB b/Library/SourceAssetDB index fb4ffd67..dad58907 100644 Binary files a/Library/SourceAssetDB and b/Library/SourceAssetDB differ diff --git a/Library/StateCache/Hierarchy/8cbfdc-378b361fe27c31b458.json b/Library/StateCache/Hierarchy/8cbfdc-378b361fe27c31b458.json index 5bace9fc..bd3748b0 100644 --- a/Library/StateCache/Hierarchy/8cbfdc-378b361fe27c31b458.json +++ b/Library/StateCache/Hierarchy/8cbfdc-378b361fe27c31b458.json @@ -1 +1 @@ -{"m_ExpandedPrefabGameObjectFileIDs":[4855549260496161365],"m_ExpandedSceneGameObjectInstanceIDs":[],"m_ScrollY":0.0,"m_LastClickedFileID":4855549260496161365,"m_LastClickedInstanceID":0} \ No newline at end of file +{"m_ExpandedPrefabGameObjectFileIDs":[4855549260496161365],"m_ExpandedSceneGameObjectInstanceIDs":[],"m_ScrollY":0.0,"m_LastClickedFileID":6116381454766586175,"m_LastClickedInstanceID":0} \ No newline at end of file diff --git a/Library/StateCache/Hierarchy/8cbfdc-dc4c8b005322f3b46a.json b/Library/StateCache/Hierarchy/8cbfdc-dc4c8b005322f3b46a.json index b77f0e7e..0b5f8edd 100644 --- a/Library/StateCache/Hierarchy/8cbfdc-dc4c8b005322f3b46a.json +++ b/Library/StateCache/Hierarchy/8cbfdc-dc4c8b005322f3b46a.json @@ -1 +1 @@ -{"m_ExpandedPrefabGameObjectFileIDs":[7929422520673851210],"m_ExpandedSceneGameObjectInstanceIDs":[],"m_ScrollY":0.0,"m_LastClickedFileID":111030959124096607,"m_LastClickedInstanceID":0} \ No newline at end of file +{"m_ExpandedPrefabGameObjectFileIDs":[7929422520673851210],"m_ExpandedSceneGameObjectInstanceIDs":[],"m_ScrollY":0.0,"m_LastClickedFileID":9122292209377678227,"m_LastClickedInstanceID":0} \ No newline at end of file diff --git a/Library/StateCache/SceneView/352ee9-mainStage.json b/Library/StateCache/SceneView/352ee9-mainStage.json index 11ab059a..940005e5 100644 --- a/Library/StateCache/SceneView/352ee9-mainStage.json +++ b/Library/StateCache/SceneView/352ee9-mainStage.json @@ -1 +1 @@ -{"cameraMode":{"drawMode":0,"name":"Shaded","section":"Shading Mode"},"sceneLighting":true,"audioPlay":false,"sceneViewState":{"showFog":true,"showMaterialUpdate":false,"showSkybox":true,"showFlares":true,"showImageEffects":true,"showParticleSystems":true},"in2DMode":true,"pivot":{"x":305.97601318359377,"y":305.10595703125,"z":-38.52528762817383},"rotation":{"x":0.0,"y":0.0,"z":0.0,"w":1.0},"size":404.1274719238281,"orthographic":true} \ No newline at end of file +{"cameraMode":{"drawMode":0,"name":"Shaded","section":"Shading Mode"},"sceneLighting":true,"audioPlay":false,"sceneViewState":{"showFog":true,"showMaterialUpdate":false,"showSkybox":true,"showFlares":true,"showImageEffects":true,"showParticleSystems":true},"in2DMode":true,"pivot":{"x":558.6393432617188,"y":208.42483520507813,"z":-38.5},"rotation":{"x":0.0,"y":0.0,"z":0.0,"w":1.0},"size":404.1274719238281,"orthographic":true} \ No newline at end of file diff --git a/obj/Debug/Assembly-CSharp.csprojAssemblyReference.cache b/obj/Debug/Assembly-CSharp.csprojAssemblyReference.cache index c1d0c890..da9220b0 100644 Binary files a/obj/Debug/Assembly-CSharp.csprojAssemblyReference.cache and b/obj/Debug/Assembly-CSharp.csprojAssemblyReference.cache differ