[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43439] branches/soc-2011-cucumber/source/ gameengine/Ketsji/KX_GameObject.cpp: Changing the worldTransform and localTransform python attributes to use BLI_math to simplify the code .

Daniel Stokes kupomail at gmail.com
Tue Jan 17 04:54:16 CET 2012


Revision: 43439
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43439
Author:   kupoman
Date:     2012-01-17 03:54:08 +0000 (Tue, 17 Jan 2012)
Log Message:
-----------
Changing the worldTransform and localTransform python attributes to use BLI_math to simplify the code.

Modified Paths:
--------------
    branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_GameObject.cpp

Modified: branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_GameObject.cpp	2012-01-17 03:40:37 UTC (rev 43438)
+++ branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_GameObject.cpp	2012-01-17 03:54:08 UTC (rev 43439)
@@ -2200,36 +2200,27 @@
 int KX_GameObject::pyattr_set_localTransform(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
 {
 	KX_GameObject* self = static_cast<KX_GameObject*>(self_v);
-	MT_Matrix4x4 transform;
-	if (!PyMatTo(value, transform))
+	MT_Matrix4x4 temp;
+	if (!PyMatTo(value, temp))
 		return PY_SET_ATTR_FAIL;
 
-	// Decompose translation
-	MT_Point3 translation = MT_Point3();
-	translation.setValue(transform[0][3], transform[1][3], transform[2][3]);
-	self->NodeSetLocalPosition(translation);
+	float transform[4][4];
+	float loc[3], size[3];
+	float rot[3][3];
+	MT_Matrix3x3 orientation;
 
-	// Decompose scale
-	MT_Vector3 x = MT_Vector3(transform[0][0], transform[1][0], transform[2][0]);
-	MT_Vector3 y = MT_Vector3(transform[0][1], transform[1][1], transform[2][1]);
-	MT_Vector3 z = MT_Vector3(transform[0][2], transform[1][2], transform[2][2]);
+	temp.getValue(*transform);
+	mat4_to_loc_rot_size(loc, rot, size, transform);
 
-	MT_Matrix3x3 rot = MT_Matrix3x3(x[0], y[0], z[0], x[1], y[1], z[1], x[2], y[2], z[2]);
-	MT_Vector3 scale = MT_Vector3(x.length(), y.length(), z.length());
+	self->NodeSetLocalPosition(MT_Point3(loc));
 
-	// If the determinant of the 3x3 submatrix is negative, we need to flip an arbitrary axis' scale value
-	// to account for negative scaling
-	if (rot[0][0]*rot[1][1]*rot[2][2] + rot[0][1]*rot[1][2]*rot[2][0] + rot[0][2]*rot[1][0]*rot[2][1] -
-		rot[0][0]*rot[1][2]*rot[2][1] - rot[0][1]*rot[1][0]*rot[2][2] - rot[0][2]*rot[1][1]*rot[2][0] < 0)
-		scale[0] *= -1;
+	//MT_Matrix3x3's constructor expects a 4x4 matrix
+	orientation = MT_Matrix3x3();
+	orientation.setValue3x3(*rot);
+	self->NodeSetLocalOrientation(orientation);
 
-	self->NodeSetLocalScale(scale);
+	self->NodeSetLocalScale(MT_Vector3(size));
 
-	// Decompose rotation
-	MT_Matrix3x3 scale_mat = MT_Matrix3x3(scale[0], 0, 0,   0, scale[1], 0,   0, 0, scale[2]).inverse();
-	rot = rot * scale_mat;
-	self->NodeSetLocalOrientation(rot);
-
 	return PY_SET_ATTR_SUCCESS;
 }
 
@@ -2243,36 +2234,27 @@
 int KX_GameObject::pyattr_set_worldTransform(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
 {
 	KX_GameObject* self = static_cast<KX_GameObject*>(self_v);
-	MT_Matrix4x4 transform;
-	if (!PyMatTo(value, transform))
+	MT_Matrix4x4 temp;
+	if (!PyMatTo(value, temp))
 		return PY_SET_ATTR_FAIL;
 
-	// Decompose translation
-	MT_Point3 translation = MT_Point3();
-	translation.setValue(transform[0][3], transform[1][3], transform[2][3]);
-	self->NodeSetWorldPosition(translation);
+	float transform[4][4];
+	float loc[3], size[3];
+	float rot[3][3];
+	MT_Matrix3x3 orientation;
 
-	// Decompose scale
-	MT_Vector3 x = MT_Vector3(transform[0][0], transform[1][0], transform[2][0]);
-	MT_Vector3 y = MT_Vector3(transform[0][1], transform[1][1], transform[2][1]);
-	MT_Vector3 z = MT_Vector3(transform[0][2], transform[1][2], transform[2][2]);
+	temp.getValue(*transform);
+	mat4_to_loc_rot_size(loc, rot, size, transform);
 
-	MT_Matrix3x3 rot = MT_Matrix3x3(x[0], y[0], z[0], x[1], y[1], z[1], x[2], y[2], z[2]);
-	MT_Vector3 scale = MT_Vector3(x.length(), y.length(), z.length());
+	self->NodeSetWorldPosition(MT_Point3(loc));
 
-	// If the determinant of the 3x3 submatrix is negative, we need to flip an arbitrary axis' scale value
-	// to account for negative scaling
-	if (rot[0][0]*rot[1][1]*rot[2][2] + rot[0][1]*rot[1][2]*rot[2][0] + rot[0][2]*rot[1][0]*rot[2][1] -
-		rot[0][0]*rot[1][2]*rot[2][1] - rot[0][1]*rot[1][0]*rot[2][2] - rot[0][2]*rot[1][1]*rot[2][0] < 0)
-		scale[0] *= -1;
+	//MT_Matrix3x3's constructor expects a 4x4 matrix
+	orientation = MT_Matrix3x3();
+	orientation.setValue3x3(*rot);
+	self->NodeSetGlobalOrientation(orientation);
 
-	self->NodeSetWorldScale(scale);
+	self->NodeSetWorldScale(MT_Vector3(size));
 
-	// Decompose rotation
-	MT_Matrix3x3 scale_mat = MT_Matrix3x3(scale[0], 0, 0,   0, scale[1], 0,   0, 0, scale[2]).inverse();
-	rot = rot * scale_mat;
-	self->NodeSetGlobalOrientation(rot);
-
 	return PY_SET_ATTR_SUCCESS;
 }
 



More information about the Bf-blender-cvs mailing list