diff --git a/.vs/RimWorld-Animation-Studio/v16/.suo b/.vs/RimWorld-Animation-Studio/v16/.suo index f6edf7aa..2c75330c 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 62cf9a0b..2bf6b987 100644 --- a/Assembly-CSharp.csproj +++ b/Assembly-CSharp.csproj @@ -88,7 +88,7 @@ - + @@ -132,6 +132,7 @@ + @@ -141,7 +142,6 @@ - diff --git a/Assets/Resources/Prefabs/GhostSlider.prefab b/Assets/Resources/Prefabs/GhostSlider.prefab index e76edfe3..d2e766b3 100644 --- a/Assets/Resources/Prefabs/GhostSlider.prefab +++ b/Assets/Resources/Prefabs/GhostSlider.prefab @@ -181,7 +181,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.5, g: 0, b: 0, a: 0.5019608} + m_Color: {r: 0.5, g: 0, b: 0, a: 1} m_RaycastTarget: 0 m_Maskable: 1 m_OnCullStateChanged: diff --git a/Assets/Scenes/MainScene.unity b/Assets/Scenes/MainScene.unity index 285473d1..a6fdb86b 100644 --- a/Assets/Scenes/MainScene.unity +++ b/Assets/Scenes/MainScene.unity @@ -2452,6 +2452,7 @@ GameObject: - component: {fileID: 149299858} - component: {fileID: 149299857} - component: {fileID: 149299856} + - component: {fileID: 149299859} m_Layer: 5 m_Name: ActorAddonButton m_TagString: Untagged @@ -2517,7 +2518,7 @@ MonoBehaviour: m_PressedTrigger: Pressed m_SelectedTrigger: Selected m_DisabledTrigger: Disabled - m_Interactable: 1 + m_Interactable: 0 m_TargetGraphic: {fileID: 149299857} m_OnClick: m_PersistentCalls: @@ -2570,6 +2571,25 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 149299854} m_CullTransparentMesh: 0 +--- !u!114 &149299859 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 149299854} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c05e9ac2a2f311549b12f094d2785a20, type: 3} + m_Name: + m_EditorClassIdentifier: + message: Currently disabled + executedCommand: + delay: 0 + offset: {x: 5, y: -15} + flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &160519906 GameObject: m_ObjectHideFlags: 0 @@ -3511,6 +3531,84 @@ MonoBehaviour: cloneObjects: - {fileID: 8098018029235791166, guid: 860a3bbda6bdfad4791a7fce0c17e672, type: 3} - {fileID: 567861683340653947, guid: 9c09247b9acee3645ad8788eab810b2e, type: 3} +--- !u!1 &250084108 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 250084109} + - component: {fileID: 250084111} + - component: {fileID: 250084110} + m_Layer: 5 + m_Name: StageWindowLengthNormal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &250084109 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250084108} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 665717983} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 110, y: -30} + m_SizeDelta: {x: 110, y: 20} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &250084110 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250084108} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 6000 (100.00 s) +--- !u!222 &250084111 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250084108} + m_CullTransparentMesh: 0 --- !u!1 &252080743 GameObject: m_ObjectHideFlags: 0 @@ -3942,6 +4040,84 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 272322073} m_CullTransparentMesh: 0 +--- !u!1 &279394488 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 279394489} + - component: {fileID: 279394491} + - component: {fileID: 279394490} + m_Layer: 5 + m_Name: AnimationLengthQuickText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &279394489 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279394488} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 665717983} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 220, y: -50} + m_SizeDelta: {x: 110, y: 20} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &279394490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279394488} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 6000 (100.00 s) +--- !u!222 &279394491 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279394488} + m_CullTransparentMesh: 0 --- !u!224 &279689758 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 5792094730711952121, guid: 9070db4f6841de145b1ceb2f217d92f7, @@ -8244,9 +8420,9 @@ MonoBehaviour: onValueChanged: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 1900570406} - m_MethodName: set_isOn - m_Mode: 0 + - m_Target: {fileID: 1335076905} + m_MethodName: StretchKeyframesToggle + m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine @@ -9664,7 +9840,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 5ce34f72fe7ef0c41a7bc163fce97970, type: 3} m_Name: m_EditorClassIdentifier: - isAnimating: 0 animationTimelines: {fileID: 1100016168} actorBodies: {fileID: 1828035561} stageLoopDropdown: {fileID: 429161118} @@ -10230,7 +10405,7 @@ RectTransform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 539052776} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 206.25} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1791478860} @@ -10241,14 +10416,13 @@ RectTransform: - {fileID: 462332575} - {fileID: 1083597498} - {fileID: 429161117} - - {fileID: 665717983} m_Father: {fileID: 1100016168} - m_RootOrder: 1 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 10, y: -22.5} - m_SizeDelta: {x: 1375.8606, y: 45} + m_SizeDelta: {x: 1055, y: 45} m_Pivot: {x: 0, y: 0.5} --- !u!114 &539052778 MonoBehaviour: @@ -10262,10 +10436,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6b414452bfd6c9b4bb99542a51d77468, type: 3} m_Name: m_EditorClassIdentifier: - stageLoopDropdown: {fileID: 429161118} - animationClipTimeField: {fileID: 760297267} - animationClipLengthField: {fileID: 1676585155} - stretchKeyframesToggle: {fileID: 462332576} + currentTimeField: {fileID: 760297267} + stageWindowLengthField: {fileID: 1676585155} playBackSpeedField: {fileID: 1579799916} playToggleButton: {fileID: 79733375} stageTimelineSlider: {fileID: 1289465655} @@ -10412,7 +10584,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 84.999985} + m_AnchoredPosition: {x: 0, y: 84.99999} m_SizeDelta: {x: 0, y: 5} m_Pivot: {x: 0, y: 1} --- !u!114 &542629604 @@ -11443,11 +11615,11 @@ RectTransform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 591894604} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 206.25} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 1100016168} - m_RootOrder: 0 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} @@ -12976,9 +13148,10 @@ GameObject: m_Component: - component: {fileID: 665717983} - component: {fileID: 665717987} - - component: {fileID: 665717986} - - component: {fileID: 665717985} - component: {fileID: 665717984} + - component: {fileID: 665717988} + - component: {fileID: 665717985} + - component: {fileID: 665717986} m_Layer: 5 m_Name: 'StageTimeMetricsLabel ' m_TagString: Untagged @@ -12993,21 +13166,27 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 665717982} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: + - {fileID: 1456872509} + - {fileID: 1662558896} + - {fileID: 2073914479} - {fileID: 1137451984} - - {fileID: 1834285083} + - {fileID: 250084109} + - {fileID: 1062318706} - {fileID: 1293297799} - m_Father: {fileID: 539052777} - m_RootOrder: 8 + - {fileID: 715800481} + - {fileID: 279394489} + m_Father: {fileID: 1100016168} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 1006.86053, y: -35} - m_SizeDelta: {x: 364, y: 25} - m_Pivot: {x: 0, y: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -310, y: 90} + m_SizeDelta: {x: 330, y: 60} + m_Pivot: {x: 1, y: 0} --- !u!114 &665717984 MonoBehaviour: m_ObjectHideFlags: 0 @@ -13031,22 +13210,21 @@ MonoBehaviour: m_GameObject: {fileID: 665717982} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} m_Name: m_EditorClassIdentifier: m_Padding: - m_Left: 20 + m_Left: 0 m_Right: 0 m_Top: 0 m_Bottom: 0 m_ChildAlignment: 0 - m_Spacing: 0 - m_ChildForceExpandWidth: 0 - m_ChildForceExpandHeight: 0 - m_ChildControlWidth: 0 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 1 - m_ChildScaleHeight: 1 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 110, y: 20} + m_Spacing: {x: 0, y: 0} + m_Constraint: 1 + m_ConstraintCount: 3 --- !u!114 &665717986 MonoBehaviour: m_ObjectHideFlags: 0 @@ -13056,30 +13234,14 @@ MonoBehaviour: m_GameObject: {fileID: 665717982} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 11500000, guid: 060e49b40b1097e46b662059e4e29cdf, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: + stageLengthNormalText: {fileID: 250084110} + stageLengthQuickText: {fileID: 1062318707} + animationLengthNormalText: {fileID: 715800482} + animationLengthQuickText: {fileID: 279394490} + spacing: 10 --- !u!222 &665717987 CanvasRenderer: m_ObjectHideFlags: 0 @@ -13088,6 +13250,26 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 665717982} m_CullTransparentMesh: 0 +--- !u!114 &665717988 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 665717982} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 --- !u!1 &675124297 GameObject: m_ObjectHideFlags: 0 @@ -13751,7 +13933,7 @@ GameObject: m_Component: - component: {fileID: 714321235} m_Layer: 5 - m_Name: PreviewTimeline + m_Name: AnimationPreviewTimeline m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -13765,18 +13947,96 @@ RectTransform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 714321234} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 206.25} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 138865804} m_Father: {fileID: 1100016168} - m_RootOrder: 2 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 537.5, y: -55} m_SizeDelta: {x: 1055, y: 20} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &715800480 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 715800481} + - component: {fileID: 715800483} + - component: {fileID: 715800482} + m_Layer: 5 + m_Name: AnimationLengthNormalText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &715800481 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 715800480} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 665717983} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 110, y: -50} + m_SizeDelta: {x: 110, y: 20} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &715800482 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 715800480} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 6000 (100.00 s) +--- !u!222 &715800483 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 715800480} + m_CullTransparentMesh: 0 --- !u!1 &719308825 GameObject: m_ObjectHideFlags: 0 @@ -14701,7 +14961,7 @@ GameObject: - component: {fileID: 760297270} - component: {fileID: 760297271} m_Layer: 5 - m_Name: AnimationClipTimeField + m_Name: CurrentTimeField m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -14779,18 +15039,7 @@ MonoBehaviour: m_CharacterLimit: 0 m_OnEndEdit: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 531246358} - m_MethodName: OnAnimationClipTimeFieldChange - 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: [] @@ -19124,7 +19373,7 @@ RectTransform: m_Children: - {fileID: 1673215398} m_Father: {fileID: 1100016168} - m_RootOrder: 3 + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -19468,6 +19717,84 @@ MonoBehaviour: m_BlockingMask: serializedVersion: 2 m_Bits: 4294967295 +--- !u!1 &1062318705 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1062318706} + - component: {fileID: 1062318708} + - component: {fileID: 1062318707} + m_Layer: 5 + m_Name: StageWindowLengthQuick + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1062318706 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1062318705} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 665717983} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 220, y: -30} + m_SizeDelta: {x: 110, y: 20} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1062318707 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1062318705} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 6000 (100.00 s) +--- !u!222 &1062318708 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1062318705} + m_CullTransparentMesh: 0 --- !u!1 &1068786481 GameObject: m_ObjectHideFlags: 0 @@ -20012,6 +20339,7 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: + - {fileID: 665717983} - {fileID: 591894605} - {fileID: 539052777} - {fileID: 714321235} @@ -20621,7 +20949,7 @@ GameObject: - component: {fileID: 1137451986} - component: {fileID: 1137451985} m_Layer: 5 - m_Name: StageLengthText + m_Name: StageWindowLengthText m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -20639,12 +20967,12 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 665717983} - m_RootOrder: 0 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 20, y: -12.5} - m_SizeDelta: {x: 153, y: 25} + m_AnchoredPosition: {x: 0, y: -30} + m_SizeDelta: {x: 110, y: 20} m_Pivot: {x: 0, y: 0.5} --- !u!114 &1137451985 MonoBehaviour: @@ -20655,11 +20983,17 @@ MonoBehaviour: m_GameObject: {fileID: 1137451983} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: - m_HorizontalFit: 2 - m_VerticalFit: 0 + m_IgnoreLayout: 0 + m_MinWidth: 120 + m_MinHeight: -1 + m_PreferredWidth: 120 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 --- !u!114 &1137451986 MonoBehaviour: m_ObjectHideFlags: 0 @@ -20682,17 +21016,17 @@ MonoBehaviour: m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 14 - m_FontStyle: 0 + m_FontStyle: 1 m_BestFit: 0 m_MinSize: 10 m_MaxSize: 40 - m_Alignment: 5 + m_Alignment: 3 m_AlignByGeometry: 0 m_RichText: 1 m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: 'Stage length: 600 (10 s)' + m_Text: Stage length --- !u!222 &1137451987 CanvasRenderer: m_ObjectHideFlags: 0 @@ -24277,7 +24611,7 @@ GameObject: - component: {fileID: 1289465655} - component: {fileID: 1289465656} m_Layer: 5 - m_Name: AnimTimelineSlider + m_Name: StageTimelineSlider m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -24354,7 +24688,7 @@ MonoBehaviour: m_OnValueChanged: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 531246358} + - m_Target: {fileID: 539052778} m_MethodName: OnStageTimelineSliderChange m_Mode: 1 m_Arguments: @@ -24553,7 +24887,6 @@ GameObject: - component: {fileID: 1293297799} - component: {fileID: 1293297802} - component: {fileID: 1293297801} - - component: {fileID: 1293297800} m_Layer: 5 m_Name: AnimationLengthText m_TagString: Untagged @@ -24573,27 +24906,13 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 665717983} - m_RootOrder: 2 + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 185, y: -12.5} - m_SizeDelta: {x: 179, y: 25} + m_AnchoredPosition: {x: 0, y: -50} + m_SizeDelta: {x: 110, y: 20} m_Pivot: {x: 0, y: 0.5} ---- !u!114 &1293297800 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1293297798} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 2 - m_VerticalFit: 0 --- !u!114 &1293297801 MonoBehaviour: m_ObjectHideFlags: 0 @@ -24616,7 +24935,7 @@ MonoBehaviour: m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 14 - m_FontStyle: 0 + m_FontStyle: 1 m_BestFit: 0 m_MinSize: 10 m_MaxSize: 40 @@ -24626,7 +24945,7 @@ MonoBehaviour: m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: 'Animation length: 600 (10 s)' + m_Text: Total length --- !u!222 &1293297802 CanvasRenderer: m_ObjectHideFlags: 0 @@ -28092,6 +28411,41 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0d0b652f32a2cc243917e4028fa0f046, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &1456872508 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1456872509} + m_Layer: 5 + m_Name: Spacer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1456872509 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1456872508} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 665717983} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 55, y: -10} + m_SizeDelta: {x: 110, y: 20} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1458444068 GameObject: m_ObjectHideFlags: 0 @@ -28484,6 +28838,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 4264bb913f7501844bf60529d6b59b8a, type: 3} m_Name: m_EditorClassIdentifier: + animationTimelines: {fileID: 1100016168} targetDivisions: 30 divisionBands: 0100000002000000050000000a000000190000003200000064000000fa000000f4010000e8030000 linearScaleTickPrefab: {fileID: 5891687054347736455, guid: 229f16c49d39ed446bf8c22c8065cd8a, @@ -31963,6 +32318,84 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1661572514} m_CullTransparentMesh: 0 +--- !u!1 &1662558895 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1662558896} + - component: {fileID: 1662558898} + - component: {fileID: 1662558897} + m_Layer: 5 + m_Name: NormalText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1662558896 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1662558895} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 665717983} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 165, y: -10} + m_SizeDelta: {x: 110, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1662558897 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1662558895} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Normal +--- !u!222 &1662558898 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1662558895} + m_CullTransparentMesh: 0 --- !u!1 &1668270816 GameObject: m_ObjectHideFlags: 0 @@ -32348,7 +32781,7 @@ GameObject: - component: {fileID: 1676585158} - component: {fileID: 1676585159} m_Layer: 5 - m_Name: AnimationClipLengthField + m_Name: StageWindowLengthField m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -32426,18 +32859,7 @@ MonoBehaviour: m_CharacterLimit: 0 m_OnEndEdit: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 531246358} - m_MethodName: OnAnimationClipLengthFieldChange - 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: [] @@ -35316,84 +35738,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1833911027} m_CullTransparentMesh: 0 ---- !u!1 &1834285082 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1834285083} - - component: {fileID: 1834285085} - - component: {fileID: 1834285084} - m_Layer: 5 - m_Name: / - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1834285083 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1834285082} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 665717983} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 179, y: -12.5} - m_SizeDelta: {x: 12, y: 25} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1834285084 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1834285082} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: / ---- !u!222 &1834285085 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1834285082} - m_CullTransparentMesh: 0 --- !u!1 &1845441704 GameObject: m_ObjectHideFlags: 0 @@ -39024,6 +39368,84 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2070462931} m_CullTransparentMesh: 0 +--- !u!1 &2073914478 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2073914479} + - component: {fileID: 2073914481} + - component: {fileID: 2073914480} + m_Layer: 5 + m_Name: QuickText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2073914479 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2073914478} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 665717983} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 275, y: -10} + m_SizeDelta: {x: 110, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2073914480 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2073914478} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Quick +--- !u!222 &2073914481 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2073914478} + m_CullTransparentMesh: 0 --- !u!1 &2076684196 stripped GameObject: m_CorrespondingSourceObject: {fileID: 7715503544683182667, guid: 8b89f6c9e5f696c4997760829c45a505, diff --git a/Assets/Scripts/AnimationComponents/AnimationStage.cs b/Assets/Scripts/AnimationComponents/AnimationStage.cs index 5bb85e4c..9eeffb78 100644 --- a/Assets/Scripts/AnimationComponents/AnimationStage.cs +++ b/Assets/Scripts/AnimationComponents/AnimationStage.cs @@ -98,6 +98,8 @@ namespace RimWorldAnimationStudio clip.BuildSimpleCurves(); } + + EventsManager.OnStageWindowSizeChanged(this); } public void ResizeStageWindow(int newStageWindowSize) @@ -105,6 +107,8 @@ namespace RimWorldAnimationStudio Workspace.GetCurrentAnimationStage().stageWindowSize = newStageWindowSize; Workspace.GetCurrentAnimationStage().PlayTimeTicks = newStageWindowSize * StageLoopsNormal; Workspace.GetCurrentAnimationStage().PlayTimeTicksQuick = newStageWindowSize * StageLoopsQuick; + + EventsManager.OnStageWindowSizeChanged(this); } public void AddAnimationClip(int actorID = -1) diff --git a/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs b/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs index 54575122..999e48bd 100644 --- a/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs +++ b/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs @@ -193,30 +193,27 @@ namespace RimWorldAnimationStudio public void AddPawnKeyframe() { - PawnAnimationClip clip = Workspace.GetCurrentPawnAnimationClip(); - List keyframes = clip?.Keyframes; - - if (clip == null || keyframes == null) + if (Keyframes == null) { Debug.LogWarning("Cannot add pawn keyframe - the AnimationDef is invalid"); return; } - if (keyframes.FirstOrDefault(x => x.atTick == Workspace.StageTick) != null) + if (Keyframes.FirstOrDefault(x => x.atTick == Workspace.StageTick) != null) { Debug.LogWarning("Cannot add pawn keyframe - a keyframe already exists at this tick"); return; } - float clipPercent = (float)(Workspace.StageTick % clip.duration) / clip.duration; + float clipPercent = (float)(Workspace.StageTick % duration) / duration; PawnKeyframe keyframe = new PawnKeyframe(); - keyframe.BodyAngle = clip.BodyAngle.Evaluate(clipPercent); - keyframe.HeadAngle = clip.HeadAngle.Evaluate(clipPercent); - keyframe.HeadBob = clip.HeadBob.Evaluate(clipPercent); - keyframe.BodyOffsetX = clip.BodyOffsetX.Evaluate(clipPercent); - keyframe.BodyOffsetZ = clip.BodyOffsetZ.Evaluate(clipPercent); - keyframe.HeadFacing = (int)clip.HeadFacing.Evaluate(clipPercent); - keyframe.BodyFacing = (int)clip.BodyFacing.Evaluate(clipPercent); - keyframe.GenitalAngle = clip.GenitalAngle.Evaluate(clipPercent); + keyframe.BodyAngle = BodyAngle.Evaluate(clipPercent); + keyframe.HeadAngle = HeadAngle.Evaluate(clipPercent); + keyframe.HeadBob = HeadBob.Evaluate(clipPercent); + keyframe.BodyOffsetX = BodyOffsetX.Evaluate(clipPercent); + keyframe.BodyOffsetZ = BodyOffsetZ.Evaluate(clipPercent); + keyframe.HeadFacing = (int)HeadFacing.Evaluate(clipPercent); + keyframe.BodyFacing = (int)BodyFacing.Evaluate(clipPercent); + keyframe.GenitalAngle = GenitalAngle.Evaluate(clipPercent); keyframe.atTick = Workspace.StageTick; - PawnKeyframe nextKeyframe = keyframes.FirstOrDefault(x => x.atTick > Workspace.StageTick); + PawnKeyframe nextKeyframe = Keyframes.FirstOrDefault(x => x.atTick > Workspace.StageTick); if (nextKeyframe != null) { keyframes.Insert(keyframes.IndexOf(nextKeyframe), keyframe); } @@ -224,41 +221,10 @@ namespace RimWorldAnimationStudio else { keyframes.Add(keyframe); } - clip.BuildSimpleCurves(); + BuildSimpleCurves(); - Workspace.RecordEvent("Keyframe addition"); - } - - public void ClonePawnKeyframe() - { - List keyframesToClone = Workspace.GetPawnKeyframesByID(Workspace.keyframeID); - - foreach (PawnKeyframe keyframe in keyframesToClone) - { - PawnAnimationClip clip = Workspace.GetAnimationClipThatOwnsKeyframe(keyframe.keyframeID); - - if (clip == null) - { Debug.LogWarning("Cannot clone pawn keyframe - no clip owns this keyframe"); continue; } - - if (clip.Keyframes.FirstOrDefault(x => x.atTick == Workspace.StageTick) != null) - { Debug.LogWarning("Cannot clone pawn keyframe - a keyframe already exists at this tick"); return; } - - PawnKeyframe cloneFrame = keyframe.Copy(); - cloneFrame.GenerateKeyframeID(clip.GetOwningActorID()); - cloneFrame.atTick = Workspace.StageTick; - - PawnKeyframe nextKeyframe = clip.Keyframes.FirstOrDefault(x => x.atTick > Workspace.StageTick); - - if (nextKeyframe != null) - { clip.Keyframes.Insert(clip.Keyframes.IndexOf(nextKeyframe), cloneFrame); } - - else - { clip.Keyframes.Add(cloneFrame); } - - clip.BuildSimpleCurves(); - } - - Workspace.RecordEvent("Keyframe clone"); + EventsManager.OnKeyframeCountChanged(this); + Workspace.RecordEvent("Keyframe addition"); } public void CopyPawnKeyframes() @@ -319,6 +285,8 @@ namespace RimWorldAnimationStudio { clip.Keyframes.Add(clonedKeyframe); } clip.BuildSimpleCurves(); + + EventsManager.OnKeyframeCountChanged(clip); } if (originalWindowSize != Workspace.StageWindowSize) @@ -344,6 +312,7 @@ namespace RimWorldAnimationStudio Keyframes.Remove(keyframe); BuildSimpleCurves(); + EventsManager.OnKeyframeCountChanged(this); Workspace.RecordEvent("Keyframe deletion"); } @@ -360,7 +329,10 @@ namespace RimWorldAnimationStudio // Pre-save / post-load public void OnPreSave() { - foreach (ActorAddon addon in Addons) + var temp = Addons.Copy(); + Addons.Clear(); + + foreach (ActorAddon addon in temp) { if (addon.Render) { addons.Add(addon); } diff --git a/Assets/Scripts/AnimationComponents/PawnKeyframe.cs b/Assets/Scripts/AnimationComponents/PawnKeyframe.cs index 08930dce..ef2c64ea 100644 --- a/Assets/Scripts/AnimationComponents/PawnKeyframe.cs +++ b/Assets/Scripts/AnimationComponents/PawnKeyframe.cs @@ -210,14 +210,18 @@ namespace RimWorldAnimationStudio { SoundEffect = DefaultTags.soundDefs.Concat(CustomTags.soundDefs).Contains(SoundEffect) ? SoundEffect : null; - addonKeyframes.Clear(); - - foreach (AddonKeyframe addonKeyframe in AddonKeyframes) + if (addonKeyframes.NotNullOrEmpty()) { - ActorAddon addon = Workspace.GetAnimationClipThatOwnsKeyframe(keyframeID).GetActorAddon(addonKeyframe.AddonName); + var temp = AddonKeyframes.Copy(); + addonKeyframes.Clear(); - if (addon.Render) - { addonKeyframes.Add(addonKeyframe.Copy()); } + foreach (AddonKeyframe addonKeyframe in temp) + { + ActorAddon addon = Workspace.GetAnimationClipThatOwnsKeyframe(keyframeID).GetActorAddon(addonKeyframe.AddonName); + + if (addon.Render) + { addonKeyframes.Add(addonKeyframe.Copy()); } + } } } diff --git a/Assets/Scripts/GUI/Actors/ActorBody.cs b/Assets/Scripts/GUI/Actors/ActorBody.cs index 0ae4ce1c..d1cabcc6 100644 --- a/Assets/Scripts/GUI/Actors/ActorBody.cs +++ b/Assets/Scripts/GUI/Actors/ActorBody.cs @@ -17,6 +17,9 @@ namespace RimWorldAnimationStudio { EventsManager.onActorBodyPartSelected.AddListener(delegate(ActorBodyPart bodyPart) { OnActorBodyPartSelected(bodyPart); }); EventsManager.onActorBodySelected.AddListener(delegate(ActorBody actorBody) { OnActorBodySelected(actorBody); }); + + if (Workspace.ActorID == actorID) + { Activate(); } } public void OnActorBodySelected(ActorBody actorBody) diff --git a/Assets/Scripts/GUI/Actors/ActorBodyPart.cs b/Assets/Scripts/GUI/Actors/ActorBodyPart.cs index bdbfc23e..5da1531c 100644 --- a/Assets/Scripts/GUI/Actors/ActorBodyPart.cs +++ b/Assets/Scripts/GUI/Actors/ActorBodyPart.cs @@ -18,6 +18,9 @@ namespace RimWorldAnimationStudio { EventsManager.onActorBodyPartSelected.AddListener(delegate (ActorBodyPart bodyPart) { OnActorBodyPartSelected(bodyPart); }); EventsManager.onActorBodySelected.AddListener(delegate (ActorBody actorBody) { OnActorBodySelected(actorBody); }); + + if (Workspace.ActorID == parent.actorID) + { parent.Activate(); } } public void OnActorAddonChange(ActorAddon actorAddon) diff --git a/Assets/Scripts/GUI/AnimationLengthDisplay.cs b/Assets/Scripts/GUI/AnimationLengthDisplay.cs deleted file mode 100644 index 7e58ceb0..00000000 --- a/Assets/Scripts/GUI/AnimationLengthDisplay.cs +++ /dev/null @@ -1,35 +0,0 @@ -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/AnimationLengthsCard.cs b/Assets/Scripts/GUI/AnimationLengthsCard.cs new file mode 100644 index 00000000..6df3f063 --- /dev/null +++ b/Assets/Scripts/GUI/AnimationLengthsCard.cs @@ -0,0 +1,39 @@ +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 AnimationLengthsCard : MonoBehaviour + { + public Text stageLengthNormalText; + public Text stageLengthQuickText; + public Text animationLengthNormalText; + public Text animationLengthQuickText; + public float spacing = 10f; + + private RectTransform rect; + + private void Start() + { + rect = GetComponent(); + } + + public void Update() + { + LayoutRebuilder.ForceRebuildLayoutImmediate(transform.parent.GetComponent()); + LayoutRebuilder.ForceRebuildLayoutImmediate(transform.parent.GetComponent()); + rect.localPosition = new Vector3(rect.localPosition.x, spacing + transform.parent.GetComponent().sizeDelta.y, rect.localPosition.z); + + stageLengthNormalText.text = Workspace.GetCurrentAnimationStage().PlayTimeTicks + " (" + string.Format("{0:0.00}", Workspace.GetCurrentAnimationStage().PlayTimeTicks / 60f) + " s)"; + animationLengthNormalText.text = Workspace.animationDef.animationTimeTicks + " (" + string.Format("{0:0.00}", Workspace.animationDef.animationTimeTicks / 60f) + " s)"; + + stageLengthQuickText.text = Workspace.GetCurrentAnimationStage().PlayTimeTicksQuick + " (" + string.Format("{0:0.00}", Workspace.GetCurrentAnimationStage().PlayTimeTicksQuick / 60f) + " s)"; + animationLengthQuickText.text = Workspace.animationDef.animationTimeTicksQuick + " (" + string.Format("{0:0.00}", Workspace.animationDef.animationTimeTicksQuick / 60f) + " s)"; + } + } +} diff --git a/Assets/Scripts/GUI/AnimationLengthDisplay.cs.meta b/Assets/Scripts/GUI/AnimationLengthsCard.cs.meta similarity index 100% rename from Assets/Scripts/GUI/AnimationLengthDisplay.cs.meta rename to Assets/Scripts/GUI/AnimationLengthsCard.cs.meta diff --git a/Assets/Scripts/GUI/AnimationTimeline.cs b/Assets/Scripts/GUI/AnimationTimeline.cs index 217f57ac..8fe5e224 100644 --- a/Assets/Scripts/GUI/AnimationTimeline.cs +++ b/Assets/Scripts/GUI/AnimationTimeline.cs @@ -11,45 +11,50 @@ namespace RimWorldAnimationStudio { public class AnimationTimeline : MonoBehaviour, IPointerClickHandler { - public int actorID; + public int actorID = -1; public KeyframeSlider keyframeSliderPrefab; private Transform anchorTransform; + private void Start() + { + EventsManager.onAnimationTimelinesChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onKeyframeCountChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onActorIDChanged.AddListener(delegate { UpdateTimelineSelection(); }); + + UpdateTimelineSelection(); + UpdateGUI(); + } + public void Initialize(int actorID) { anchorTransform = transform.parent; this.actorID = actorID; + UpdateGUI(); + } + + public void UpdateGUI() + { + if (actorID < 0) return; + PawnAnimationClip clip = Workspace.GetPawnAnimationClip(actorID); + if (clip == null) return; + clip.BuildSimpleCurves(); foreach (KeyframeSlider slider in GetComponentsInChildren()) - { RemovePawnKeyFrame(slider.keyframeID);} + { RemovePawnKeyFrame(slider.keyframeID); } foreach (PawnKeyframe keyframe in clip.Keyframes) { AddPawnKeyFrame(keyframe.keyframeID); } - /*int keyframeCount = clip.keyframes.Count; - int childCount = GetComponentsInChildren().Count(); + InitiateUpdateOfGhostFrames(); + } - for (int i = 0; i < Mathf.Max(keyframeCount, childCount); i++) - { - // Add new keyframe sliders as required - if (i >= childCount) - { AddPawnKeyFrame(clip.keyframes[i].keyframeID); } - - // Get objects to update - KeyframeSlider keyframeSlider = GetComponentsInChildren()[i]; - - // Update values - if (i < keyframeCount) - { keyframeSlider.Initialize(this, actorID, clip.keyframes[i].keyframeID); } - - // Remove excess objects as required - else - { RemovePawnKeyFrame(GetComponentsInChildren()[i].keyframeID); } - }*/ + public void UpdateTimelineSelection() + { + GetComponent().color = (Workspace.ActorID == actorID ? Constants.ColorGoldYellow : Constants.ColorMidGrey); } public void AddPawnKeyFrame(int keyframeID) @@ -64,19 +69,8 @@ namespace RimWorldAnimationStudio Destroy(keyframeSlider?.gameObject); } - public void Update() - { - if (Workspace.ActorID == actorID) - { GetComponent().color = Constants.ColorGoldYellow; } - - else - { GetComponent().color = Constants.ColorMidGrey; } - } - public void InitiateUpdateOfGhostFrames() { - //if (AnimationController.Instance.IsTimelineDirty()) return; - BroadcastMessage("UpdateGhostFrames"); } diff --git a/Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs b/Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs index a2c61b5a..e5d7f7e0 100644 --- a/Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs +++ b/Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs @@ -48,8 +48,9 @@ namespace RimWorldAnimationStudio keyframe.GenitalAngle = float.Parse(appendageRotationField.text); Workspace.GetCurrentPawnAnimationClip().BuildSimpleCurves(); - Workspace.RecordEvent("Actor position / orientation"); + + UpdateGUI(); } public void UpdateGUI() diff --git a/Assets/Scripts/GUI/Cards/AnimationControlCard.cs b/Assets/Scripts/GUI/Cards/AnimationControlCard.cs index 16fe082c..5e190954 100644 --- a/Assets/Scripts/GUI/Cards/AnimationControlCard.cs +++ b/Assets/Scripts/GUI/Cards/AnimationControlCard.cs @@ -8,67 +8,52 @@ namespace RimWorldAnimationStudio { public class AnimationControlCard : MonoBehaviour { - public Dropdown stageLoopDropdown; - public InputField animationClipTimeField; - public InputField animationClipLengthField; - public Toggle stretchKeyframesToggle; + public InputField currentTimeField; + public InputField stageWindowLengthField; 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.onAnimationChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onStageIDChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onStageTickChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onAnimationToggled.AddListener(delegate { playToggleButton.image.color = Workspace.IsAnimating ? Constants.ColorGoldYellow : Constants.ColorWhite; }); - EventsManager.onAnimationToggled.AddListener(delegate - { - playToggleButton.image.color = Workspace.isAnimating ? Constants.ColorGoldYellow : Constants.ColorWhite; - }); + stageTimelineSlider.onValueChanged.AddListener(delegate { OnStageTimelineSliderChange(); }); + currentTimeField.onEndEdit.AddListener(delegate { OnCurrentTimeFieldChange(); }); + stageWindowLengthField.onEndEdit.AddListener(delegate { OnStageWindowLengthFieldChange(); }); + playBackSpeedField.onEndEdit.AddListener(delegate { OnPlayBackSpeedChange(); }); - animationClipLengthField.text = Workspace.StageWindowSize.ToString(); - stageTimelineSlider.maxValue = Workspace.StageWindowSize; - } - - public void ToggleAnimation(bool forceOff = false) - { - Workspace.isAnimating = !Workspace.isAnimating; - if (forceOff) Workspace.isAnimating = false; + UpdateGUI(); } public void OnStageTimelineSliderChange() { - if (Workspace.animationDef == null) return; - - if (Workspace.StageTick != (int)stageTimelineSlider.value) - { - Workspace.StageTick = (int)stageTimelineSlider.value; - animationClipTimeField.text = Workspace.StageTick.ToString(); - } + Workspace.StageTick = (int)stageTimelineSlider.value; } - public void OnAnimationClipTimeFieldChange() + public void OnPlayBackSpeedChange() { - 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; + Workspace.PlayBackSpeed = float.Parse(playBackSpeedField.text); } - public void OnAnimationClipLengthFieldChange() + public void OnCurrentTimeFieldChange() { - if (Workspace.animationDef == null) return; + Workspace.StageTick = Mathf.Clamp(int.Parse(currentTimeField.text), Constants.minTick, Workspace.StageWindowSize); - int.TryParse(animationClipLengthField.text, out int newStageWindowSize); + UpdateGUI(); + } + + public void OnStageWindowLengthFieldChange() + { + int.TryParse(stageWindowLengthField.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) + if (Workspace.stretchKeyframes) { Workspace.GetCurrentAnimationStage().StretchStageWindow(newStageWindowSize); } else @@ -92,11 +77,16 @@ namespace RimWorldAnimationStudio Workspace.GetCurrentAnimationStage().ResizeStageWindow(newStageWindowSize); Workspace.RecordEvent("Stage length"); + + UpdateGUI(); } - public void OnPlayBackSpeedChange() + public void UpdateGUI() { - Workspace.PlayBackSpeed = float.Parse(playBackSpeedField.text); + stageTimelineSlider.maxValue = Workspace.StageWindowSize; + stageTimelineSlider.SetValueWithoutNotify(Workspace.StageTick); + currentTimeField.SetTextWithoutNotify(Workspace.StageTick.ToString()); + stageWindowLengthField.SetTextWithoutNotify(Workspace.StageWindowSize.ToString()); playBackSpeedField.SetTextWithoutNotify(Workspace.PlayBackSpeed.ToString()); } } diff --git a/Assets/Scripts/GUI/Cards/StageLoopsCard.cs b/Assets/Scripts/GUI/Cards/StageLoopsCard.cs index 6b7e7fd0..a36e12c6 100644 --- a/Assets/Scripts/GUI/Cards/StageLoopsCard.cs +++ b/Assets/Scripts/GUI/Cards/StageLoopsCard.cs @@ -15,14 +15,13 @@ namespace RimWorldAnimationStudio public void Start() { - EventsManager.onAnimationChanged.AddListener(delegate { UpdateInputFields(); }); - EventsManager.onStageIDChanged.AddListener(delegate { UpdateInputFields(); }); - EventsManager.onAnimationStageChanged.AddListener(delegate { UpdateInputFields(); }); + EventsManager.onAnimationTimelinesChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onStageWindowSizeChanged.AddListener(delegate { UpdateGUI(); }); stageLoopsNormalField.onEndEdit.AddListener(delegate { OnStageLoopsNormalFieldChange(); }); stageLoopsQuickField.onEndEdit.AddListener(delegate { OnStageLoopsFastFieldChange(); }); - UpdateInputFields(); + UpdateGUI(); } public void OnStageLoopsNormalFieldChange() @@ -33,8 +32,6 @@ namespace RimWorldAnimationStudio EventsManager.OnAnimationStageChanged(Workspace.GetCurrentAnimationStage()); Workspace.RecordEvent("Cycle count (normal)"); - - UpdateInputFields(); } public void OnStageLoopsFastFieldChange() @@ -45,11 +42,9 @@ namespace RimWorldAnimationStudio EventsManager.OnAnimationStageChanged(Workspace.GetCurrentAnimationStage()); Workspace.RecordEvent("Cycle count (fast)"); - - UpdateInputFields(); } - public void UpdateInputFields() + public void UpdateGUI() { stageLoopsNormalField.SetTextWithoutNotify(Workspace.GetCurrentAnimationStage().StageLoopsNormal.ToString()); stageLoopsQuickField.SetTextWithoutNotify(Workspace.GetCurrentAnimationStage().StageLoopsQuick.ToString()); diff --git a/Assets/Scripts/GUI/DialogBoxes/SelectActorAddonsDialog.cs b/Assets/Scripts/GUI/DialogBoxes/SelectActorAddonsDialog.cs index 26058b57..a33a48b3 100644 --- a/Assets/Scripts/GUI/DialogBoxes/SelectActorAddonsDialog.cs +++ b/Assets/Scripts/GUI/DialogBoxes/SelectActorAddonsDialog.cs @@ -10,6 +10,28 @@ namespace RimWorldAnimationStudio { public class SelectActorAddonsDialog : DialogBox { + public class AddonDef + { + public string addonName; + public Toggle toggle; + public Dropdown anchor; + public InputField anchoringPawn; + public Dropdown layer; + public GameObject controls; + + public AddonDef(string addonName, Toggle toggle, Dropdown anchor, InputField anchoringPawn, Dropdown layer, GameObject controls) + { + this.addonName = addonName; + this.toggle = toggle; + this.anchor = anchor; + this.anchoringPawn = anchoringPawn; + this.layer = layer; + this.controls = controls; + } + } + + private List addonDefs = new List(); + public Toggle handLeftToggle; public Toggle handRightToggle; public Toggle sexToyToggle; @@ -30,92 +52,70 @@ namespace RimWorldAnimationStudio public GameObject handRightControls; public GameObject sexToyControls; + private PawnAnimationClip clip { get { return Workspace.GetCurrentPawnAnimationClip(); } } + + private void Start() + { + EventsManager.onAnimationChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onActorIDChanged.AddListener(delegate { UpdateGUI(); }); + + InitializeAddonDefs(); + UpdateGUI(); + } + + // temp code + public void InitializeAddonDefs() + { + if (addonDefs.NotNullOrEmpty()) return; + + addonDefs.Add(new AddonDef("left hand", handLeftToggle, handLeftAnchor, handLeftAnchoringPawn, handLeftLayer, handLeftControls)); + addonDefs.Add(new AddonDef("right hand", handRightToggle, handRightAnchor, handRightAnchoringPawn, handRightLayer, handRightControls)); + addonDefs.Add(new AddonDef("dildo", sexToyToggle, sexToyAnchor, sexToyAnchoringPawn, sexToyLayer, sexToyControls)); + } + public override void Initialize(bool addedNewTag = false) + { + InitializeAddonDefs(); + } + + public void UpdateGUI() { if (Workspace.animationDef == null) return; - PawnAnimationClip clip = Workspace.GetCurrentPawnAnimationClip(); - if (clip?.GetActorAddon("left hand") != null) + Debug.Log("Actor: " + clip.GetOwningActorID()); + + foreach (AddonDef addonDef in addonDefs) { - switch (clip.GetActorAddon("left hand").AnchorName) + if (clip?.GetActorAddon(addonDef.addonName) != null) { - case "torso": handLeftAnchor.value = 1; break; - case "head": handLeftAnchor.value = 2; break; - case "groin": handLeftAnchor.value = 3; break; - case "left breast": handLeftAnchor.value = 4; break; - case "right breast": handLeftAnchor.value = 5; break; - default: handLeftAnchor.value = 0; break; + switch (clip.GetActorAddon(addonDef.addonName).AnchorName) + { + case "torso": addonDef.anchor.SetValueWithoutNotify(1); break; + case "head": addonDef.anchor.SetValueWithoutNotify(2); break; + case "groin": addonDef.anchor.SetValueWithoutNotify(3); break; + case "left breast": addonDef.anchor.SetValueWithoutNotify(4); break; + case "right breast": addonDef.anchor.SetValueWithoutNotify(5); break; + default: addonDef.anchor.SetValueWithoutNotify(0); break; + } + + addonDef.layer.SetValueWithoutNotify(addonDef.layer.options.IndexOf(addonDef.layer.options.First(x => x.text == clip.GetActorAddon(addonDef.addonName).Layer))); + addonDef.anchoringPawn.SetTextWithoutNotify(clip.GetActorAddon(addonDef.addonName).AnchoringActor.ToString()); + addonDef.toggle.SetIsOnWithoutNotify(clip.IsActorAddonVisible(addonDef.addonName)); } } - - if (clip?.GetActorAddon("right hand") != null) - { - switch (clip.GetActorAddon("right hand").AnchorName) - { - case "torso": handRightAnchor.value = 1; break; - case "head": handRightAnchor.value = 2; break; - case "groin": handRightAnchor.value = 3; break; - case "left breast": handRightAnchor.value = 4; break; - case "right breast": handRightAnchor.value = 5; break; - default: handRightAnchor.value = 0; break; - } - } - - if (clip?.GetActorAddon("dildo") != null) - { - switch (clip.GetActorAddon("dildo").AnchorName) - { - case "torso": sexToyAnchor.value = 1; break; - case "head": sexToyAnchor.value = 2; break; - case "groin": sexToyAnchor.value = 3; break; - case "left breast": sexToyAnchor.value = 4; break; - case "right breast": sexToyAnchor.value = 5; break; - default: sexToyAnchor.value = 0; break; - } - } - - if (clip?.GetActorAddon("left hand") != null) - { - handLeftLayer.value = handLeftLayer.options.IndexOf(handLeftLayer.options.First(x => x.text == clip.GetActorAddon("left hand").Layer)); - handLeftAnchoringPawn.text = clip.GetActorAddon("left hand").AnchoringActor.ToString(); - } - - if (clip?.GetActorAddon("right hand") != null) - { - handRightLayer.value = handRightLayer.options.IndexOf(handRightLayer.options.First(x => x.text == clip.GetActorAddon("right hand").Layer)); - handRightAnchoringPawn.text = clip.GetActorAddon("right hand").AnchoringActor.ToString(); - } - - if (clip?.GetActorAddon("dildo") != null) - { - sexToyLayer.value = sexToyLayer.options.IndexOf(sexToyLayer.options.First(x => x.text == clip.GetActorAddon("dildo").Layer)); - sexToyAnchoringPawn.text = clip.GetActorAddon("dildo").AnchoringActor.ToString(); - } - - handLeftToggle.isOn = clip.IsActorAddonVisible("left hand"); - handRightToggle.isOn = clip.IsActorAddonVisible("right hand"); - sexToyToggle.isOn = clip.IsActorAddonVisible("dildo"); - - //handLeftControls.SetActive(handLeftToggle.isOn); - //handRightControls.SetActive(handRightToggle.isOn); - //sexToyControls.SetActive(sexToyToggle.isOn); } public void OnToggleChanged() { - PawnAnimationClip clip = Workspace.GetCurrentPawnAnimationClip(); - clip.ShowOrHideActorAddon("left hand", handLeftToggle.isOn); clip.ShowOrHideActorAddon("right hand", handRightToggle.isOn); clip.ShowOrHideActorAddon("dildo", sexToyToggle.isOn); - //Initialize(); + UpdateGUI(); } public void OnValueChanged() { - PawnAnimationClip clip = Workspace.GetCurrentPawnAnimationClip(); - if (clip?.GetActorAddon("left hand") != null) { switch (handLeftAnchor.value) @@ -155,13 +155,11 @@ namespace RimWorldAnimationStudio } } - //Initialize(); + UpdateGUI(); } public void OnLayerChanged() { - PawnAnimationClip clip = Workspace.GetCurrentPawnAnimationClip(); - if (clip?.GetActorAddon("left hand") != null) { clip.GetActorAddon("left hand").Layer = handLeftLayer.options[handLeftLayer.value].text; } @@ -171,13 +169,11 @@ namespace RimWorldAnimationStudio if (clip?.GetActorAddon("dildo") != null) { clip.GetActorAddon("dildo").Layer = sexToyLayer.options[sexToyLayer.value].text; } - //Initialize(); + UpdateGUI(); } public void OnAnchoringPawnChanged() { - PawnAnimationClip clip = Workspace.GetCurrentPawnAnimationClip(); - if (clip?.GetActorAddon("left hand") != null) { int i = int.Parse(handLeftAnchoringPawn.text); @@ -210,6 +206,8 @@ namespace RimWorldAnimationStudio clip.GetActorAddon("dildo").AnchoringActor = i; sexToyAnchoringPawn.SetTextWithoutNotify(i.ToString()); } + + UpdateGUI(); } } } diff --git a/Assets/Scripts/GUI/KeyframeSlider.cs b/Assets/Scripts/GUI/KeyframeSlider.cs index 403d80cc..0c3cf61c 100644 --- a/Assets/Scripts/GUI/KeyframeSlider.cs +++ b/Assets/Scripts/GUI/KeyframeSlider.cs @@ -11,6 +11,7 @@ namespace RimWorldAnimationStudio { public class KeyframeSlider : Slider, IPointerClickHandler, IBeginDragHandler, IEndDragHandler { + public int keyframeID; public AnimationTimeline timeline; public Transform ghostSliders; public Slider ghostSliderPrefab; @@ -18,33 +19,32 @@ namespace RimWorldAnimationStudio public GameObject soundIcon; public int maxGhosts = 4; - public int actorID; - public int keyframeID; - - private PawnAnimationClip clip; - private PawnKeyframe keyframe; - - private float dragTimeStart = -1f; - private int dragTickStart = -1; - public KeyframeSlider linkedSlider; public PawnKeyframe pivotKeyframe; public int linkedOffset; + private PawnAnimationClip clip { get { return Workspace.GetPawnAnimationClip(actorID); } } + private PawnKeyframe keyframe { get { return Workspace.GetPawnKeyframe(keyframeID); } } + + private int actorID; + private float dragTimeStart = -1f; + private int dragTickStart = -1; + + protected override void Start() + { + base.Start(); + + onValueChanged.AddListener(delegate (float value) { OnValueChanged(); }); + } + public void Initialize(AnimationTimeline timeline, int actorID, int keyframeID) { this.timeline = timeline; - this.clip = Workspace.GetPawnAnimationClip(actorID); - this.keyframe = Workspace.GetPawnKeyframe(keyframeID); - this.actorID = actorID; this.keyframeID = keyframeID; - PawnKeyframe keyframe = Workspace.GetPawnKeyframe(keyframeID); maxValue = Workspace.StageWindowSize; value = keyframe.atTick.Value; - - onValueChanged.AddListener(delegate (float value) { OnValueChanged(); }); } public void OnValueChanged() @@ -119,7 +119,7 @@ namespace RimWorldAnimationStudio List selectedKeyframes = Workspace.GetPawnKeyframesByID(Workspace.keyframeID).Except(new List() { keyframe })?.ToList(); - // Link other slected keyframes to the movement of this one + // Link other selected keyframes to the movement of this one if (selectedKeyframes.NotNullOrEmpty()) { pivotKeyframe = keyframe.atTick <= selectedKeyframes.Min(x => x.atTick) ? @@ -215,6 +215,8 @@ namespace RimWorldAnimationStudio { base.Update(); + if (keyframe == null) return; + // Update outdated values if (Workspace.keyframeID.NullOrEmpty() || Workspace.keyframeID.Contains(keyframeID) == false) { linkedSlider = null; } diff --git a/Assets/Scripts/GUI/LinearScale.cs b/Assets/Scripts/GUI/LinearScale.cs index 7dceb0e7..e8b698c1 100644 --- a/Assets/Scripts/GUI/LinearScale.cs +++ b/Assets/Scripts/GUI/LinearScale.cs @@ -10,6 +10,7 @@ namespace RimWorldAnimationStudio { public class LinearScale : Singleton { + public Transform animationTimelines; public int targetDivisions = 30; public List divisionBands = new List() { 5, 10, 25, 50, 100, 250, 500, 1000 }; public GameObject linearScaleTickPrefab; @@ -19,13 +20,18 @@ namespace RimWorldAnimationStudio public void Start() { + EventsManager.onAnimationChanged.AddListener(delegate { UpdateLinearScale(); }); + EventsManager.onStageIDChanged.AddListener(delegate { UpdateLinearScale(); }); EventsManager.onStageWindowSizeChanged.AddListener(delegate { UpdateLinearScale(); }); + + UpdateLinearScale(); } public void UpdateLinearScale() { if (Workspace.animationDef == null) return; + LayoutRebuilder.ForceRebuildLayoutImmediate(animationTimelines.GetComponent()); minDiff = -1f; foreach (int division in divisionBands) diff --git a/Assets/Scripts/GUI/SelfContained/InactiveDuringAnimationPreview.cs b/Assets/Scripts/GUI/SelfContained/InactiveDuringAnimationPreview.cs index 66817c26..ef7007e0 100644 --- a/Assets/Scripts/GUI/SelfContained/InactiveDuringAnimationPreview.cs +++ b/Assets/Scripts/GUI/SelfContained/InactiveDuringAnimationPreview.cs @@ -16,7 +16,7 @@ namespace RimWorldAnimationStudio private void Update() { - inputfield.interactable = AnimationController.Instance.isAnimating == false; + inputfield.interactable = Workspace.IsAnimating == false; } } } diff --git a/Assets/Scripts/GUI/SelfContained/RequiresAnimationDef.cs b/Assets/Scripts/GUI/SelfContained/RequiresAnimationDef.cs index c2923a7a..bdf985df 100644 --- a/Assets/Scripts/GUI/SelfContained/RequiresAnimationDef.cs +++ b/Assets/Scripts/GUI/SelfContained/RequiresAnimationDef.cs @@ -12,7 +12,7 @@ namespace RimWorldAnimationStudio private List buttonText; private List buttonTextColor = new List(); - public void Start() + private void Start() { button = GetComponent