using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Dreamteck.Splines; using Ichni.RhythmGame.Beatmap; using Lean.Pool; using Unity.Mathematics; using Unity.VisualScripting; using UnityEngine; namespace Ichni.RhythmGame { public partial class Displacement : AnimationBase { private TransformSubmodule targetTransformSubmodule; public FlexibleFloat positionX, positionY, positionZ; public static Displacement GenerateElement(string elementName, Guid id, List tags, bool isFirstGenerated, GameElement animatedObject, FlexibleFloat positionX, FlexibleFloat positionY, FlexibleFloat positionZ) { Displacement displacement = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); displacement.Initialize(elementName, id, tags, isFirstGenerated, animatedObject); displacement.animatedObject = animatedObject; displacement.positionX = positionX; displacement.positionY = positionY; displacement.positionZ = positionZ; displacement.animationReturnType = FlexibleReturnType.Before; displacement.targetTransformSubmodule = (animatedObject as IHaveTransformSubmodule).transformSubmodule; //displacement.timeDurationSubmodule.SetDuration(positionX, positionY, positionZ); return displacement; } protected override void UpdateAnimation(float songTime) { positionX.UpdateFlexibleFloat(songTime); positionY.UpdateFlexibleFloat(songTime); positionZ.UpdateFlexibleFloat(songTime); if (positionX.returnType is FlexibleReturnType.MiddleExecuting or FlexibleReturnType.After or FlexibleReturnType.Before || positionY.returnType is FlexibleReturnType.MiddleExecuting or FlexibleReturnType.After or FlexibleReturnType.Before || positionZ.returnType is FlexibleReturnType.MiddleExecuting or FlexibleReturnType.After or FlexibleReturnType.Before) { animationReturnType = FlexibleReturnType.MiddleExecuting; Vector3 currentPosition = new Vector3(positionX.value, positionY.value, positionZ.value); targetTransformSubmodule.positionOffset.Add(currentPosition); targetTransformSubmodule.positionDirtyMark = true; } else { animationReturnType = FlexibleReturnType.MiddleInterval; } } } public partial class Displacement { public override void SaveBM() { matchedBM = new Beatmap.Displacement_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM, positionX.ConvertToBM(), positionY.ConvertToBM(), positionZ.ConvertToBM()); } public override void SetUpInspector() { base.SetUpInspector(); var container = inspector.GenerateContainer("Displacement"); var positionXButton = inspector.GenerateButton(this, container, "Position X", () => { inspector.GenerateCompositeParameterWindow(this, "Position X", nameof(positionX)).SetAsFlexibleFloat(); }); var positionYButton = inspector.GenerateButton(this, container, "Position Y", () => { inspector.GenerateCompositeParameterWindow(this, "Position Y", nameof(positionY)).SetAsFlexibleFloat(); }); var positionZButton = inspector.GenerateButton(this, container, "Position Z", () => { inspector.GenerateCompositeParameterWindow(this, "Position Z", nameof(positionZ)).SetAsFlexibleFloat(); }); } } namespace Beatmap { public class Displacement_BM : AnimationBase_BM { public FlexibleFloat_BM positionX, positionY, positionZ; public Displacement_BM() { } public Displacement_BM(string elementName, Guid elementGuid, List tags, GameElement_BM attachedElement, FlexibleFloat_BM positionX, FlexibleFloat_BM positionY, FlexibleFloat_BM positionZ) : base(elementName, elementGuid, tags, attachedElement) { this.positionX = positionX; this.positionY = positionY; this.positionZ = positionZ; } public override void ExecuteBM() { matchedElement = Displacement.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid), positionX.ConvertToGameType(), positionY.ConvertToGameType(), positionZ.ConvertToGameType()); } public override GameElement DuplicateBM(GameElement parent) { return Displacement.GenerateElement(elementName, elementGuid, tags, false, parent, positionX.ConvertToGameType(), positionY.ConvertToGameType(), positionZ.ConvertToGameType()); } } } }