7#include <G3D/Matrix4.h>
49 -0.5f, 1.5f, -1.5f, 0.5f,
50 1.f, -2.5f, 2.f, -0.5f,
51 -0.5f, 0.f, 0.5f, 0.f,
84 inline void C_Evaluate(
const Vector3* vertice,
float t,
const Matrix4& matr, Vector3& result)
86 Vector4 tvec(t * t * t, t * t, t, 1.f);
87 Vector4 weights(tvec * matr);
89 result = vertice[0] * weights[0] + vertice[1] * weights[1]
90 + vertice[2] * weights[2] + vertice[3] * weights[3];
95 Vector4 tvec(3.f * t * t, 2.f * t, 1.f, 0.f);
96 Vector4 weights(tvec * matr);
98 result = vertice[0] * weights[0] + vertice[1] * weights[1]
99 + vertice[2] * weights[2] + vertice[3] * weights[3];
150 Vector3 curPos, nextPos;
151 const Vector3* p = &
points[index - 1];
152 curPos = nextPos = p[1];
159 length += (nextPos - curPos).length();
171 Vector3 curPos, nextPos;
172 const Vector3* p = &
points[index];
182 length += (nextPos - curPos).length();
208 const int real_size = count + 1;
212 memcpy(&
points[0], controls,
sizeof(Vector3) * count);
217 points[count] = controls[cyclic_point];
219 points[count] = controls[count - 1];
227 const int real_size = count + (
cyclic ? (1 + 2) : (1 + 1));
232 int high_index = lo_index + count - 1;
234 memcpy(&
points[lo_index], controls,
sizeof(Vector3) * count);
240 if (cyclic_point == 0)
241 points[0] = controls[count - 1];
243 points[0] = controls[0].lerp(controls[1], -1);
245 points[high_index + 1] = controls[cyclic_point];
246 points[high_index + 2] = controls[cyclic_point + 1];
250 points[0] = controls[0].lerp(controls[1], -1);
251 points[high_index + 1] = controls[count - 1];
264 memcpy(&
points[0], controls,
sizeof(Vector3) * c);
280 std::stringstream str;
281 const char* mode_str[
ModesEnd] = {
"Linear",
"CatmullRom",
"Bezier3",
"Uninitialized" };
284 str <<
"mode: " << mode_str[
mode()] << std::endl;
285 str <<
"points count: " << count << std::endl;
287 str <<
"point " << i <<
" : " <<
points[i].toString() << std::endl;
float SegLengthLinear(index_type) const
void UninitializedSpline() const
static InitMethtod initializers[ModesEnd]
void EvaluateCatmullRom(index_type, float, Vector3 &) const
void EvaluateDerivativeCatmullRom(index_type, float, Vector3 &) const
void EvaluateBezier3(index_type, float, Vector3 &) const
void(SplineBase::* InitMethtod)(const Vector3 *, index_type, bool, index_type)
float SegLengthBezier3(index_type) const
float SegLengthCatmullRom(index_type) const
void InitLinear(const Vector3 *, index_type, bool, index_type)
void EvaluateDerivativeBezier3(index_type, float, Vector3 &) const
void EvaluateDerivativeLinear(index_type, float, Vector3 &) const
void init_spline(const Vector3 *controls, index_type count, EvaluationMode m)
void(SplineBase::* EvaluationMethtod)(index_type, float, Vector3 &) const
void EvaluateLinear(index_type, float, Vector3 &) const
std::string ToString() const
void InitBezier3(const Vector3 *, index_type, bool, index_type)
float(SplineBase::* SegLenghtMethtod)(index_type) const
void init_cyclic_spline(const Vector3 *controls, index_type count, EvaluationMode m, index_type cyclic_point)
void InitCatmullRom(const Vector3 *, index_type, bool, index_type)
static EvaluationMethtod derivative_evaluators[ModesEnd]
static SegLenghtMethtod seglengths[ModesEnd]
static EvaluationMethtod evaluators[ModesEnd]
EvaluationMode mode() const
void C_Evaluate_Derivative(const Vector3 *vertice, float t, const Matrix4 &matr, Vector3 &result)
void C_Evaluate(const Vector3 *vertice, float t, const Matrix4 &matr, Vector3 &result)
static const Matrix4 s_Bezier3Coeffs(-1.f, 3.f, -3.f, 1.f, 3.f, -6.f, 3.f, 0.f, -3.f, 3.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f)
static const Matrix4 s_catmullRomCoeffs(-0.5f, 1.5f, -1.5f, 0.5f, 1.f, -2.5f, 2.f, -0.5f, -0.5f, 0.f, 0.5f, 0.f, 0.f, 1.f, 0.f, 0.f)