Example #1
0
//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;
}
Example #2
0
//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;
}
Example #3
0
//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;
}
Example #4
0
//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;
}