X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fanimation.cpp;h=b1d639e7c957dbffb3ce73f43256be5e0ba52c8a;hb=fa5b232a16e11d7950e80764497f0167ec9e3b41;hp=255e63cc8102128299076d345cb99dd8904ca6ed;hpb=8b9d1625ac367114612b57a83901033ffc2bc7e0;p=libs%2Fgl.git diff --git a/source/animation.cpp b/source/animation.cpp index 255e63cc..b1d639e7 100644 --- a/source/animation.cpp +++ b/source/animation.cpp @@ -59,12 +59,12 @@ Animation::AxisInterpolation::AxisInterpolation(): scale(0) { } -Animation::AxisInterpolation::AxisInterpolation(const double *axis1, const double *axis2) +Animation::AxisInterpolation::AxisInterpolation(const float *axis1, const float *axis2) { // Compute a normalized vector halfway between the two endpoints - double half[3]; - double a1_len = 0; - double h_len = 0; + float half[3]; + float a1_len = 0; + float h_len = 0; for(unsigned i=0; i<3; ++i) { half[i] = (axis1[i]+axis2[i])/2; @@ -73,8 +73,8 @@ Animation::AxisInterpolation::AxisInterpolation(const double *axis1, const doubl } // Compute correction factors for smooth interpolation - double cos_half = (axis1[0]*half[0]+axis1[1]*half[1]+axis1[2]*half[2])/sqrt(a1_len*h_len); - double angle = acos(cos_half); + float cos_half = (axis1[0]*half[0]+axis1[1]*half[1]+axis1[2]*half[2])/sqrt(a1_len*h_len); + float angle = acos(cos_half); slope = (angle ? angle/tan(angle) : 1); scale = cos_half; } @@ -89,8 +89,8 @@ Animation::MatrixInterpolation::MatrixInterpolation(const Matrix &m1, const Matr matrix1(&m1), matrix2(&m2) { - const double *m1_data = matrix1->data(); - const double *m2_data = matrix2->data(); + const float *m1_data = matrix1->data(); + const float *m2_data = matrix2->data(); for(unsigned i=0; i<3; ++i) axes[i] = AxisInterpolation(m1_data+i*4, m2_data+i*4); } @@ -99,12 +99,12 @@ Matrix Animation::MatrixInterpolation::get(float t) const { float u = t*2.0f-1.0f; - double matrix[16]; + float matrix[16]; for(unsigned i=0; i<4; ++i) { - const double *m1_col = matrix1->data()+i*4; - const double *m2_col = matrix2->data()+i*4; - double *out_col = matrix+i*4; + const float *m1_col = matrix1->data()+i*4; + const float *m2_col = matrix2->data()+i*4; + float *out_col = matrix+i*4; if(i<3) { @@ -223,10 +223,11 @@ Matrix Animation::Iterator::get_pose_matrix(unsigned link) const } // We must redo the base point correction since interpolation throws if off + // XXX This should probably be done on local matrices Matrix result = iter->pose_matrices[link].get(time_since_keyframe/iter->delta_t); const Vector3 &base = animation.armature->get_link(link).get_base(); Vector3 new_base = result*base; - result = Matrix::translation(base.x-new_base.x, base.y-new_base.y, base.z-new_base.z)*result; + result = Matrix::translation(base-new_base)*result; return result; }