//parses a rotation M4Err Q_DecRotation(BifsDecoder *codec, BitStream *bs, u32 NbBits, void *field_ptr) { u32 i; SFFloat angle, epsil, sin2, comp[4]; M4Err e; e = Q_DecCoordOnUnitSphere(codec, bs, NbBits, 3, comp); if (e) return e; angle = (SFFloat) ( 2 * acos(comp[0]) ); epsil = M4_EPSILON_FLOAT; sin2 = (SFFloat) sin(angle / 2); if (fabs(sin2) <= epsil) { for(i=1; i<4; i++) comp[i] = 0; comp[3] = 1; } else { for(i=1; i<4; i++) comp[i] /= sin2; } ((SFRotation *)field_ptr)->xAxis = comp[1]; ((SFRotation *)field_ptr)->yAxis = comp[2]; ((SFRotation *)field_ptr)->zAxis = comp[3]; ((SFRotation *)field_ptr)->angle = angle; return M4OK; }
//parses a Normal vec GF_Err Q_DecNormal(GF_BifsDecoder *codec, GF_BitStream *bs, u32 NbBits, void *field_ptr) { Fixed comp[3]; SFVec3f v; GF_Err e; e = Q_DecCoordOnUnitSphere(codec, bs, NbBits, 2, comp); if (e) return e; v.x = comp[0]; v.y = comp[1]; v.z = comp[2]; gf_vec_norm(&v); *((SFVec3f *)field_ptr) = v; return GF_OK; }
//parses a Normal vec M4Err Q_DecNormal(BifsDecoder *codec, BitStream *bs, u32 NbBits, void *field_ptr) { SFFloat comp[3]; SFFloat delta; u32 i; M4Err e; e = Q_DecCoordOnUnitSphere(codec, bs, NbBits, 2, comp); if (e) return e; // normalize to avoid round-off problems delta=0; for (i=0; i<3; i++) delta += comp[i]*comp[i]; delta = (SFFloat) sqrt(delta); if(delta > 0) { for (i=0; i<3; i++) comp[i] /= delta; } ((SFVec3f *)field_ptr)->x = comp[0]; ((SFVec3f *)field_ptr)->y = comp[1]; ((SFVec3f *)field_ptr)->z = comp[2]; return M4OK; }
//parses a rotation GF_Err Q_DecRotation(GF_BifsDecoder *codec, GF_BitStream *bs, u32 NbBits, void *field_ptr) { u32 i; Fixed q, sin2, comp[4]; GF_Err e; e = Q_DecCoordOnUnitSphere(codec, bs, NbBits, 3, comp); if (e) return e; q = 2 * gf_acos(comp[0]); sin2 = gf_sin(q / 2); if (ABS(sin2) <= FIX_EPSILON) { for (i=1; i<4; i++) comp[i] = 0; comp[3] = FIX_ONE; } else { for (i=1; i<4; i++) comp[i] = gf_divfix(comp[i], sin2); } ((SFRotation *)field_ptr)->x = comp[1]; ((SFRotation *)field_ptr)->y = comp[2]; ((SFRotation *)field_ptr)->z = comp[3]; ((SFRotation *)field_ptr)->q = q; return GF_OK; }