Variant Spline::GetPoint(float f) const { if (knots_.Size() < 2) return knots_.Size() == 1 ? knots_[0] : Variant::EMPTY; if (f > 1.f) f = 1.f; else if (f < 0.f) f = 0.f; switch (interpolationMode_) { case BEZIER_CURVE: return BezierInterpolation(knots_, f); case CATMULL_ROM_CURVE: return CatmullRomInterpolation(knots_, f); case LINEAR_CURVE: return LinearInterpolation(knots_, f); case CATMULL_ROM_FULL_CURVE: { /// \todo Do not allocate a new vector each time Vector<Variant> fullKnots; if (knots_.Size() > 1) { // Non-cyclic case: duplicate start and end if (knots_.Front() != knots_.Back()) { fullKnots.Push(knots_.Front()); fullKnots.Push(knots_); fullKnots.Push(knots_.Back()); } // Cyclic case: smooth the tangents else { fullKnots.Push(knots_[knots_.Size() - 2]); fullKnots.Push(knots_); fullKnots.Push(knots_[1]); } } return CatmullRomInterpolation(fullKnots, f); } default: URHO3D_LOGERROR("Unsupported interpolation mode"); return Variant::EMPTY; } }
Variant Spline::GetPoint(float f) const { if (knots_.Size() < 2) return knots_.Size() == 1 ? knots_[0] : Variant::EMPTY; if (f > 1.f) f = 1.f; else if (f < 0.f) f = 0.f; switch (interpolationMode_) { case BEZIER_CURVE: return BezierInterpolation(knots_, f); default: LOGERROR("Unsupported interpolation mode"); return Variant::EMPTY; } }
Variant Spline::BezierInterpolation(const Vector<Variant>& knots, float t) const { if (knots.Size() == 2) { switch (knots[0].GetType()) { case VAR_FLOAT: case VAR_VECTOR2: case VAR_VECTOR3: case VAR_VECTOR4: case VAR_COLOR: case VAR_DOUBLE: return LinearInterpolation(knots[0], knots[1], t); default: return Variant::EMPTY; } } else { /// \todo Do not allocate a new vector each time Vector<Variant> interpolatedKnots; for (unsigned i = 1; i < knots.Size(); i++) { switch (knots[0].GetType()) { case VAR_FLOAT: case VAR_VECTOR2: case VAR_VECTOR3: case VAR_VECTOR4: case VAR_COLOR: case VAR_DOUBLE: interpolatedKnots.Push(LinearInterpolation(knots[i - 1], knots[i], t)); break; default: return Variant::EMPTY; } } return BezierInterpolation(interpolatedKnots, t); } }