diff --git a/Source/Game/Movement/MoveSpline.cs b/Source/Game/Movement/MoveSpline.cs index 8c9d25f4c..154386493 100644 --- a/Source/Game/Movement/MoveSpline.cs +++ b/Source/Game/Movement/MoveSpline.cs @@ -81,11 +81,11 @@ namespace Game.Movement Spline.EvaluationMode[] modes = new Spline.EvaluationMode[2] { Spline.EvaluationMode.Linear, Spline.EvaluationMode.Catmullrom }; if (args.flags.HasFlag(SplineFlag.Cyclic)) { - spline.InitCyclicSpline(args.path, args.path.Length, modes[Convert.ToInt32(args.flags.IsSmooth())], 0); + spline.InitCyclicSpline(args.path, args.path.Length, modes[Convert.ToInt32(args.flags.IsSmooth())], 0, args.initialOrientation); } else { - spline.InitSpline(args.path, args.path.Length, modes[Convert.ToInt32(args.flags.IsSmooth())]); + spline.InitSpline(args.path, args.path.Length, modes[Convert.ToInt32(args.flags.IsSmooth())], args.initialOrientation); } // init spline timestamps diff --git a/Source/Game/Movement/Spline.cs b/Source/Game/Movement/Spline.cs index 7a9b1aae2..5254e0a36 100644 --- a/Source/Game/Movement/Spline.cs +++ b/Source/Game/Movement/Spline.cs @@ -79,17 +79,18 @@ namespace Game.Movement { initializer.Initialize(ref m_mode, ref _cyclic, ref points, ref index_lo, ref index_hi); } - public void InitCyclicSpline(Vector3[] controls, int count, EvaluationMode m, int cyclic_point) + public void InitCyclicSpline(Vector3[] controls, int count, EvaluationMode m, int cyclic_point, float orientation) { m_mode = m; _cyclic = true; - InitSpline(controls, count, m); + InitSpline(controls, count, m, orientation); } - public void InitSpline(Span controls, int count, EvaluationMode m) + public void InitSpline(Span controls, int count, EvaluationMode m, float orientation = 0) { m_mode = m; _cyclic = false; + initialOrientation = orientation; switch (m_mode) { @@ -139,14 +140,14 @@ namespace Game.Movement if (cyclic_point == 0) points[0] = controls[count - 1]; else - points[0] = Vector3.Lerp(controls[0], controls[1], -1); + points[0] = controls[0] - new Vector3(MathF.Cos(initialOrientation), MathF.Sin(initialOrientation), 0.0f); points[high_index + 1] = controls[cyclic_point]; points[high_index + 2] = controls[cyclic_point + 1]; } else { - points[0] = Vector3.Lerp(controls[0], controls[1], -1); + points[0] = controls[0] - new Vector3(MathF.Cos(initialOrientation), MathF.Sin(initialOrientation), 0.0f); points[high_index + 1] = controls[count - 1]; } @@ -360,6 +361,7 @@ namespace Game.Movement Vector3[] points = Array.Empty(); public EvaluationMode m_mode; bool _cyclic; + float initialOrientation; int index_lo; int index_hi; public enum EvaluationMode