Core/Movement: Properly calculate the first Catmull-Rom spline point

Port From (https://github.com/TrinityCore/TrinityCore/commit/5db7d25700c12b15c7effa313814e5d874c95419)
This commit is contained in:
hondacrx
2021-11-15 22:28:41 -05:00
parent d87e2cd315
commit 29083fdb38
2 changed files with 9 additions and 7 deletions
+2 -2
View File
@@ -81,11 +81,11 @@ namespace Game.Movement
Spline.EvaluationMode[] modes = new Spline.EvaluationMode[2] { Spline.EvaluationMode.Linear, Spline.EvaluationMode.Catmullrom }; Spline.EvaluationMode[] modes = new Spline.EvaluationMode[2] { Spline.EvaluationMode.Linear, Spline.EvaluationMode.Catmullrom };
if (args.flags.HasFlag(SplineFlag.Cyclic)) 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 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 // init spline timestamps
+7 -5
View File
@@ -79,17 +79,18 @@ namespace Game.Movement
{ {
initializer.Initialize(ref m_mode, ref _cyclic, ref points, ref index_lo, ref index_hi); 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; m_mode = m;
_cyclic = true; _cyclic = true;
InitSpline(controls, count, m); InitSpline(controls, count, m, orientation);
} }
public void InitSpline(Span<Vector3> controls, int count, EvaluationMode m) public void InitSpline(Span<Vector3> controls, int count, EvaluationMode m, float orientation = 0)
{ {
m_mode = m; m_mode = m;
_cyclic = false; _cyclic = false;
initialOrientation = orientation;
switch (m_mode) switch (m_mode)
{ {
@@ -139,14 +140,14 @@ namespace Game.Movement
if (cyclic_point == 0) if (cyclic_point == 0)
points[0] = controls[count - 1]; points[0] = controls[count - 1];
else 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 + 1] = controls[cyclic_point];
points[high_index + 2] = controls[cyclic_point + 1]; points[high_index + 2] = controls[cyclic_point + 1];
} }
else 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]; points[high_index + 1] = controls[count - 1];
} }
@@ -360,6 +361,7 @@ namespace Game.Movement
Vector3[] points = Array.Empty<Vector3>(); Vector3[] points = Array.Empty<Vector3>();
public EvaluationMode m_mode; public EvaluationMode m_mode;
bool _cyclic; bool _cyclic;
float initialOrientation;
int index_lo; int index_lo;
int index_hi; int index_hi;
public enum EvaluationMode public enum EvaluationMode