[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33502] trunk/blender/source/gameengine/ Ketsji: bugfix [#24967] bge.KX_GameObject. worldAngularVelocity does not work, breaks mathutils somehow

Campbell Barton ideasman42 at gmail.com
Mon Dec 6 09:29:41 CET 2010


Revision: 33502
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33502
Author:   campbellbarton
Date:     2010-12-06 09:29:41 +0100 (Mon, 06 Dec 2010)

Log Message:
-----------
bugfix [#24967] bge.KX_GameObject.worldAngularVelocity does not work, breaks mathutils somehow
- Exceptions from reading vector values in the game engine where not being caught.
- Also wrote specific KX_GameObject exceptions, without these the errors are quite confusing.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PyMath.h

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2010-12-06 08:28:32 UTC (rev 33501)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2010-12-06 08:29:41 UTC (rev 33502)
@@ -1266,7 +1266,9 @@
 	KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(bmo->cb_user);
 	if(self==NULL)
 		return 0;
-	
+
+#define PHYS_ERR(attr) PyErr_SetString(PyExc_AttributeError, "KX_GameObject." attr ", is missing a physics controller")
+
 	switch(subtype) {
 		case MATHUTILS_VEC_CB_POS_LOCAL:
 			self->NodeGetLocalPosition().getValue(bmo->data);
@@ -1281,31 +1283,33 @@
 			self->NodeGetWorldScaling().getValue(bmo->data);
 			break;
 		case MATHUTILS_VEC_CB_INERTIA_LOCAL:
-			if(!self->GetPhysicsController()) return 0;
+			if(!self->GetPhysicsController()) return PHYS_ERR("localInertia"), 0;
 			self->GetPhysicsController()->GetLocalInertia().getValue(bmo->data);
 			break;
 		case MATHUTILS_VEC_CB_OBJECT_COLOR:
 			self->GetObjectColor().getValue(bmo->data);
 			break;
 		case MATHUTILS_VEC_CB_LINVEL_LOCAL:
-			if(!self->GetPhysicsController()) return 0;
+			if(!self->GetPhysicsController()) return PHYS_ERR("localLinearVelocity"), 0;
 			self->GetLinearVelocity(true).getValue(bmo->data);
 			break;
 		case MATHUTILS_VEC_CB_LINVEL_GLOBAL:
-			if(!self->GetPhysicsController()) return 0;
+			if(!self->GetPhysicsController()) return PHYS_ERR("worldLinearVelocity"), 0;
 			self->GetLinearVelocity(false).getValue(bmo->data);
 			break;
 		case MATHUTILS_VEC_CB_ANGVEL_LOCAL:
-			if(!self->GetPhysicsController()) return 0;
+			if(!self->GetPhysicsController()) return PHYS_ERR("localLinearVelocity"), 0;
 			self->GetAngularVelocity(true).getValue(bmo->data);
 			break;
 		case MATHUTILS_VEC_CB_ANGVEL_GLOBAL:
-			if(!self->GetPhysicsController()) return 0;
+			if(!self->GetPhysicsController()) return PHYS_ERR("worldLinearVelocity"), 0;
 			self->GetAngularVelocity(false).getValue(bmo->data);
 			break;
 			
 	}
 	
+#undef PHYS_ERR
+	
 	return 1;
 }
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_PyMath.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PyMath.h	2010-12-06 08:28:32 UTC (rev 33501)
+++ trunk/blender/source/gameengine/Ketsji/KX_PyMath.h	2010-12-06 08:29:41 UTC (rev 33502)
@@ -110,7 +110,9 @@
 	
 	if(VectorObject_Check(pyval)) {
 		VectorObject *pyvec= (VectorObject *)pyval;
-		BaseMath_ReadCallback(pyvec);
+		if(!BaseMath_ReadCallback(pyvec)) {
+			return false; /* exception raised */
+		}
 		if (pyvec->size != Size(vec)) {
 			PyErr_Format(PyExc_AttributeError, "error setting vector, %d args, should be %d", pyvec->size, Size(vec));
 			return false;
@@ -120,7 +122,9 @@
 	}
 	else if(QuaternionObject_Check(pyval)) {
 		QuaternionObject *pyquat= (QuaternionObject *)pyval;
-		BaseMath_ReadCallback(pyquat);
+		if(!BaseMath_ReadCallback(pyquat)) {
+			return false; /* exception raised */
+		}
 		if (4 != Size(vec)) {
 			PyErr_Format(PyExc_AttributeError, "error setting vector, %d args, should be %d", 4, Size(vec));
 			return false;
@@ -131,7 +135,9 @@
 	}
 	else if(EulerObject_Check(pyval)) {
 		EulerObject *pyeul= (EulerObject *)pyval;
-		BaseMath_ReadCallback(pyeul);
+		if(!BaseMath_ReadCallback(pyeul)) {
+			return false; /* exception raised */
+		}
 		if (3 != Size(vec)) {
 			PyErr_Format(PyExc_AttributeError, "error setting vector, %d args, should be %d", 3, Size(vec));
 			return false;





More information about the Bf-blender-cvs mailing list