20#include <G3D/Matrix4.h>
61 -0.5f, 1.5f, -1.5f, 0.5f,
62 1.f, -2.5f, 2.f, -0.5f,
63 -0.5f, 0.f, 0.5f, 0.f,
96inline void C_Evaluate(Vector3
const* vertice,
float t, Matrix4
const& matr, Vector3 &result)
98 Vector4 tvec(t*t*t, t*t, t, 1.f);
99 Vector4 weights(tvec * matr);
101 result = vertice[0] * weights[0] + vertice[1] * weights[1]
102 + vertice[2] * weights[2] + vertice[3] * weights[3];
107 Vector4 tvec(3.f*t*t, 2.f*t, 1.f, 0.f);
108 Vector4 weights(tvec * matr);
110 result = vertice[0] * weights[0] + vertice[1] * weights[1]
111 + vertice[2] * weights[2] + vertice[3] * weights[3];
162 Vector3 curPos, nextPos;
163 const Vector3 * p = &
points[index - 1];
164 curPos = nextPos = p[1];
171 length += (nextPos - curPos).length();
183 Vector3 curPos, nextPos;
184 const Vector3 * p = &
points[index];
194 length += (nextPos - curPos).length();
222 const int real_size = count + 1;
226 memcpy(&
points[0], controls,
sizeof(Vector3) * count);
231 points[count] = controls[cyclic_point];
233 points[count] = controls[count-1];
241 const int real_size = count + (
cyclic ? (1+2) : (1+1));
246 int high_index = lo_index + count - 1;
248 memcpy(&
points[lo_index], controls,
sizeof(Vector3) * count);
254 if (cyclic_point == 0)
255 points[0] = controls[count-1];
259 points[high_index+1] = controls[cyclic_point];
260 points[high_index+2] = controls[cyclic_point+1];
265 points[high_index+1] = controls[count-1];
278 memcpy(&
points[0], controls,
sizeof(Vector3) * c);
300 std::stringstream str;
301 const char * mode_str[
ModesEnd] = {
"Linear",
"CatmullRom",
"Bezier3",
"Uninitialized"};
304 str <<
"mode: " << mode_str[
mode()] << std::endl;
305 str <<
"points count: " << count << std::endl;
307 str <<
"point " << i <<
" : " <<
points[i].toString() << std::endl;
float SegLengthLinear(index_type) 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
float SegLengthBezier3(index_type) const
float UninitializedSplineSegLenghtMethod(index_type) const
float SegLengthCatmullRom(index_type) const
void UninitializedSplineInitMethod(Vector3 const *, index_type, index_type)
void EvaluateDerivativeBezier3(index_type, float, Vector3 &) const
void EvaluateDerivativeLinear(index_type, float, Vector3 &) const
void init_cyclic_spline(const Vector3 *controls, index_type count, EvaluationMode m, index_type cyclic_point, float orientation=0.0f)
void init_spline(const Vector3 *controls, index_type count, EvaluationMode m, float orientation=0.0f)
void InitBezier3(Vector3 const *, index_type, index_type)
void(SplineBase::* EvaluationMethtod)(index_type, float, Vector3 &) const
void(SplineBase::* InitMethtod)(Vector3 const *, index_type, index_type)
index_type stepsPerSegment
void EvaluateLinear(index_type, float, Vector3 &) const
void InitLinear(Vector3 const *, index_type, index_type)
std::string ToString() const
float(SplineBase::* SegLenghtMethtod)(index_type) const
static EvaluationMethtod derivative_evaluators[ModesEnd]
static SegLenghtMethtod seglengths[ModesEnd]
void UninitializedSplineEvaluationMethod(index_type, float, Vector3 &) const
static EvaluationMethtod evaluators[ModesEnd]
EvaluationMode mode() const
void InitCatmullRom(Vector3 const *, index_type, index_type)
void C_Evaluate_Derivative(Vector3 const *vertice, float t, Matrix4 const &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)
void C_Evaluate(Vector3 const *vertice, float t, Matrix4 const &matr, Vector3 &result)
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)