diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-06-07 15:13:54 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-06-07 15:13:54 +0200 |
commit | b9353041a6cce58d972b63d5138517274a1bb6d6 (patch) | |
tree | c520192bb0d0f86d10fe3b848bf356fc4f004c9d /src | |
parent | 45f056d574b071bc48c51590f2efcf51190016a2 (diff) |
Core/Movement: Allow overwriting number of steps for spline length calculations
* Also minor cleanup of non-virtual functions in spline derived classes
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Movement/Spline/Spline.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/Spline.h | 45 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/SplineImpl.h | 8 |
3 files changed, 26 insertions, 35 deletions
diff --git a/src/server/game/Movement/Spline/Spline.cpp b/src/server/game/Movement/Spline/Spline.cpp index 851c1634d36..2fb8cca636d 100644 --- a/src/server/game/Movement/Spline/Spline.cpp +++ b/src/server/game/Movement/Spline/Spline.cpp @@ -165,9 +165,9 @@ float SplineBase::SegLengthCatmullRom(index_type index) const index_type i = 1; float length = 0; - while (i <= STEPS_PER_SEGMENT) + while (i <= stepsPerSegment) { - C_Evaluate(p, float(i) / float(STEPS_PER_SEGMENT), s_catmullRomCoeffs, nextPos); + C_Evaluate(p, float(i) / float(stepsPerSegment), s_catmullRomCoeffs, nextPos); length += (nextPos - curPos).length(); curPos = nextPos; ++i; @@ -188,9 +188,9 @@ float SplineBase::SegLengthBezier3(index_type index) const index_type i = 1; float length = 0; - while (i <= STEPS_PER_SEGMENT) + while (i <= stepsPerSegment) { - C_Evaluate(p, float(i) / float(STEPS_PER_SEGMENT), s_Bezier3Coeffs, nextPos); + C_Evaluate(p, float(i) / float(stepsPerSegment), s_Bezier3Coeffs, nextPos); length += (nextPos - curPos).length(); curPos = nextPos; ++i; diff --git a/src/server/game/Movement/Spline/Spline.h b/src/server/game/Movement/Spline/Spline.h index dd328b3ab03..0a755f1b20e 100644 --- a/src/server/game/Movement/Spline/Spline.h +++ b/src/server/game/Movement/Spline/Spline.h @@ -51,14 +51,11 @@ protected: bool cyclic; float initialOrientation; - enum{ - // could be modified, affects segment length evaluation precision - // lesser value saves more performance in cost of lover precision - // minimal value is 1 - // client's value is 20, blizzs use 2-3 steps to compute length - STEPS_PER_SEGMENT = 3 - }; - static_assert(STEPS_PER_SEGMENT > 0, "STEPS_PER_SEGMENT shouldn't be lesser than 1"); + // could be modified, affects segment length evaluation precision + // lesser value saves more performance in cost of lover precision + // minimal value is 1 + // client's value is 20, blizzs use 2-3 steps to compute length + index_type stepsPerSegment = 3; protected: void EvaluateLinear(index_type, float, Vector3&) const; @@ -122,21 +119,24 @@ public: Vector3 const& getPoint(index_type i) const { return points[i]; } /** Initializes spline. Don't call other methods while spline not initialized. */ - void init_spline(const Vector3 * controls, index_type count, EvaluationMode m, float orientation); - void init_cyclic_spline(const Vector3 * controls, index_type count, EvaluationMode m, index_type cyclic_point, float orientation); + void init_spline(const Vector3 * controls, index_type count, EvaluationMode m, float orientation = 0.0f); + void init_cyclic_spline(const Vector3 * controls, index_type count, EvaluationMode m, index_type cyclic_point, float orientation = 0.0f); /** As i can see there are a lot of ways how spline can be initialized would be no harm to have some custom initializers. */ - template<class Init> inline void init_spline_custom(Init& initializer) + template<class Init> + void init_spline_custom(Init& initializer) { initializer(m_mode, cyclic, points, index_lo, index_hi); } - void clear(); + virtual void clear(); /** Calculates distance between [i; i+1] points, assumes that index i is in bounds. */ float SegLength(index_type i) const { return (this->*seglengths[m_mode])(i);} + void set_steps_per_segment(index_type newStepsPerSegment) { stepsPerSegment = newStepsPerSegment; } + std::string ToString() const; }; @@ -159,34 +159,25 @@ public: @param t - percent of spline's length, assumes that t in range [0, 1]. */ void evaluate_percent(float t, Vector3 & c) const; + using SplineBase::evaluate_percent; + /** Calculates derivation for given t @param t - percent of spline's length, assumes that t in range [0, 1]. */ void evaluate_derivative(float t, Vector3& hermite) const; - /** Calculates the position for given segment Idx, and percent of segment length t - @param t = partial_segment_length / whole_segment_length - @param Idx - spline segment index, should be in range [first, last). */ - void evaluate_percent(index_type Idx, float u, Vector3& c) const { SplineBase::evaluate_percent(Idx, u, c);} - - /** Caclulates derivation for index Idx, and percent of segment length t - @param Idx - spline segment index, should be in range [first, last) - @param t - percent of spline segment length, assumes that t in range [0, 1]. */ - void evaluate_derivative(index_type Idx, float u, Vector3& c) const { SplineBase::evaluate_derivative(Idx, u, c);} + using SplineBase::evaluate_derivative; // Assumes that t in range [0, 1] index_type computeIndexInBounds(float t) const; void computeIndex(float t, index_type& out_idx, float& out_u) const; - /** Initializes spline. Don't call other methods while spline not initialized. */ - void init_spline(const Vector3 * controls, index_type count, EvaluationMode m, float orientation = 0) { SplineBase::init_spline(controls, count, m, orientation);} - void init_cyclic_spline(const Vector3 * controls, index_type count, EvaluationMode m, index_type cyclic_point, float orientation = 0) { SplineBase::init_cyclic_spline(controls, count, m, cyclic_point, orientation);} - /** Initializes lengths with SplineBase::SegLength method. */ void initLengths(); /** Initializes lengths in some custom way Note that value returned by cacher must be greater or equal to previous value. */ - template<class T> inline void initLengths(T& cacher) + template<class T> + void initLengths(T& cacher) { index_type i = index_lo; lengths.resize(index_hi+1); @@ -216,7 +207,7 @@ public: length_type length(index_type Idx) const { return lengths[Idx];} void set_length(index_type i, length_type length) { lengths[i] = length;} - void clear(); + void clear() override; }; } diff --git a/src/server/game/Movement/Spline/SplineImpl.h b/src/server/game/Movement/Spline/SplineImpl.h index 4eb7a3f76cd..970b6dd2c35 100644 --- a/src/server/game/Movement/Spline/SplineImpl.h +++ b/src/server/game/Movement/Spline/SplineImpl.h @@ -60,13 +60,13 @@ template<typename length_type> SplineBase::index_type Spline<length_type>::compu return i; } -template<typename length_type> void Spline<length_type>::computeIndex(float t, index_type& index, float& u) const +template<typename length_type> void Spline<length_type>::computeIndex(float t, index_type& out_idx, float& out_u) const { ASSERT(t >= 0.f && t <= 1.f); length_type length_ = t * length(); - index = computeIndexInBounds(length_); - ASSERT(index < index_hi); - u = (length_ - length(index)) / (float)length(index, index+1); + out_idx = computeIndexInBounds(length_); + ASSERT(out_idx < index_hi); + out_u = (length_ - length(out_idx)) / (float)length(out_idx, out_idx+1); } template<typename length_type> SplineBase::index_type Spline<length_type>::computeIndexInBounds( float t ) const |