[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21148] branches/blender2.5/blender/source : PyAPI RNA/BGE

Campbell Barton ideasman42 at gmail.com
Thu Jun 25 12:11:37 CEST 2009


Revision: 21148
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21148
Author:   campbellbarton
Date:     2009-06-25 12:11:37 +0200 (Thu, 25 Jun 2009)

Log Message:
-----------
PyAPI RNA/BGE
* all mathutils types now have optional callbacks
* PyRNA returns mathutils quat and euler types automatically when they have the rotation subtype.
* PyRNA, reuse the BPy_StructRNA PyObject rather name making a new one for each function returned.
* use more arithb.c functions for Mathutils quaternion type (less inline cruft).
* BGE Mathutils integration mostly finished- KX_PyMath now converts to Mathutils types rather then lists.
* make all mathutils types share the same header so they can share a number of functions - dealloc, getWrapped, getOwner.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/python/generic/Geometry.c
    branches/blender2.5/blender/source/blender/python/generic/Mathutils.c
    branches/blender2.5/blender/source/blender/python/generic/Mathutils.h
    branches/blender2.5/blender/source/blender/python/generic/euler.c
    branches/blender2.5/blender/source/blender/python/generic/euler.h
    branches/blender2.5/blender/source/blender/python/generic/matrix.c
    branches/blender2.5/blender/source/blender/python/generic/matrix.h
    branches/blender2.5/blender/source/blender/python/generic/quat.c
    branches/blender2.5/blender/source/blender/python/generic/quat.h
    branches/blender2.5/blender/source/blender/python/generic/vector.c
    branches/blender2.5/blender/source/blender/python/generic/vector.h
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
    branches/blender2.5/blender/source/gameengine/Expressions/KX_Python.h
    branches/blender2.5/blender/source/gameengine/Expressions/PyObjectPlus.cpp
    branches/blender2.5/blender/source/gameengine/Expressions/PyObjectPlus.h
    branches/blender2.5/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    branches/blender2.5/blender/source/gameengine/Ketsji/KX_ObjectActuator.cpp
    branches/blender2.5/blender/source/gameengine/Ketsji/KX_ObjectActuator.h
    branches/blender2.5/blender/source/gameengine/Ketsji/KX_PyMath.cpp
    branches/blender2.5/blender/source/gameengine/Ketsji/KX_PyMath.h
    branches/blender2.5/blender/source/gameengine/Ketsji/KX_PythonInitTypes.cpp

Modified: branches/blender2.5/blender/source/blender/python/generic/Geometry.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/generic/Geometry.c	2009-06-25 05:05:35 UTC (rev 21147)
+++ branches/blender2.5/blender/source/blender/python/generic/Geometry.c	2009-06-25 10:11:37 UTC (rev 21148)
@@ -165,7 +165,7 @@
 				polyVec= PySequence_GetItem( polyLine, index );
 				if(VectorObject_Check(polyVec)) {
 					
-					if(!Vector_ReadCallback((VectorObject *)polyVec))
+					if(!BaseMath_ReadCallback((VectorObject *)polyVec))
 						ls_error= 1;
 					
 					fp[0] = ((VectorObject *)polyVec)->vec[0];
@@ -238,7 +238,7 @@
 		return NULL;
 	}
 	
-	if(!Vector_ReadCallback(line_a1) || !Vector_ReadCallback(line_a2) || !Vector_ReadCallback(line_b1) || !Vector_ReadCallback(line_b2))
+	if(!BaseMath_ReadCallback(line_a1) || !BaseMath_ReadCallback(line_a2) || !BaseMath_ReadCallback(line_b1) || !BaseMath_ReadCallback(line_b2))
 		return NULL;
 	
 	a1x= line_a1->vec[0];
@@ -338,7 +338,7 @@
 		return NULL;
 	}
 	
-	if(!Vector_ReadCallback(pt) || !Vector_ReadCallback(line_1) || !Vector_ReadCallback(line_2))
+	if(!BaseMath_ReadCallback(pt) || !BaseMath_ReadCallback(line_1) || !BaseMath_ReadCallback(line_2))
 		return NULL;
 	
 	/* accept 2d verts */
@@ -374,7 +374,7 @@
 		return NULL;
 	}
 	
-	if(!Vector_ReadCallback(pt_vec) || !Vector_ReadCallback(tri_p1) || !Vector_ReadCallback(tri_p2) || !Vector_ReadCallback(tri_p3))
+	if(!BaseMath_ReadCallback(pt_vec) || !BaseMath_ReadCallback(tri_p1) || !BaseMath_ReadCallback(tri_p2) || !BaseMath_ReadCallback(tri_p3))
 		return NULL;
 	
 	return PyLong_FromLong(IsectPT2Df(pt_vec->vec, tri_p1->vec, tri_p2->vec, tri_p3->vec));
@@ -395,7 +395,7 @@
 		return NULL;
 	}
 	
-	if(!Vector_ReadCallback(pt_vec) || !Vector_ReadCallback(quad_p1) || !Vector_ReadCallback(quad_p2) || !Vector_ReadCallback(quad_p3) || !Vector_ReadCallback(quad_p4))
+	if(!BaseMath_ReadCallback(pt_vec) || !BaseMath_ReadCallback(quad_p1) || !BaseMath_ReadCallback(quad_p2) || !BaseMath_ReadCallback(quad_p3) || !BaseMath_ReadCallback(quad_p4))
 		return NULL;
 	
 	return PyLong_FromLong(IsectPQ2Df(pt_vec->vec, quad_p1->vec, quad_p2->vec, quad_p3->vec, quad_p4->vec));
@@ -517,7 +517,7 @@
 		return NULL;
 	}
 	
-	if(!Vector_ReadCallback(vec_k1) || !Vector_ReadCallback(vec_h1) || !Vector_ReadCallback(vec_k2) || !Vector_ReadCallback(vec_h2))
+	if(!BaseMath_ReadCallback(vec_k1) || !BaseMath_ReadCallback(vec_h1) || !BaseMath_ReadCallback(vec_k2) || !BaseMath_ReadCallback(vec_h2))
 		return NULL;
 	
 	dims= MAX4(vec_k1->size, vec_h1->size, vec_h2->size, vec_k2->size);

Modified: branches/blender2.5/blender/source/blender/python/generic/Mathutils.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/generic/Mathutils.c	2009-06-25 05:05:35 UTC (rev 21147)
+++ branches/blender2.5/blender/source/blender/python/generic/Mathutils.c	2009-06-25 10:11:37 UTC (rev 21148)
@@ -155,10 +155,13 @@
 
 	if(QuaternionObject_Check(arg1)){
 		quat = (QuaternionObject*)arg1;
+		if(!BaseMath_ReadCallback(quat))
+			return NULL;
+
 		if(VectorObject_Check(arg2)){
 			vec = (VectorObject*)arg2;
 			
-			if(!Vector_ReadCallback(vec))
+			if(!BaseMath_ReadCallback(vec))
 				return NULL;
 			
 			rot[0] = quat->quat[0]*quat->quat[0]*vec->vec[0] + 2*quat->quat[2]*quat->quat[0]*vec->vec[2] - 
@@ -178,11 +181,14 @@
 	}else if(VectorObject_Check(arg1)){
 		vec = (VectorObject*)arg1;
 		
-		if(!Vector_ReadCallback(vec))
+		if(!BaseMath_ReadCallback(vec))
 			return NULL;
 		
 		if(QuaternionObject_Check(arg2)){
 			quat = (QuaternionObject*)arg2;
+			if(!BaseMath_ReadCallback(quat))
+				return NULL;
+
 			rot[0] = quat->quat[0]*quat->quat[0]*vec->vec[0] + 2*quat->quat[2]*quat->quat[0]*vec->vec[2] - 
 				2*quat->quat[3]*quat->quat[0]*vec->vec[1] + quat->quat[1]*quat->quat[1]*vec->vec[0] + 
 				2*quat->quat[2]*quat->quat[1]*vec->vec[1] + 2*quat->quat[3]*quat->quat[1]*vec->vec[2] - 
@@ -247,7 +253,7 @@
 	if(vec1->size != vec2->size)
 		goto AttributeError1; //bad sizes
 
-	if(!Vector_ReadCallback(vec1) || !Vector_ReadCallback(vec2))
+	if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
 		return NULL;
 	
 	//since size is the same....
@@ -296,7 +302,7 @@
 		return NULL;
 	}
 	
-	if(!Vector_ReadCallback(vec1) || !Vector_ReadCallback(vec2))
+	if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
 		return NULL;
 
 	for(x = 0; x < vec1->size; x++) {
@@ -322,7 +328,7 @@
 		return NULL;
 	}
 
-	if(!Vector_ReadCallback(vec1) || !Vector_ReadCallback(vec2))
+	if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
 		return NULL;
 
 	
@@ -389,7 +395,7 @@
 			return NULL;
 		}
 		
-		if(!Vector_ReadCallback(vec))
+		if(!BaseMath_ReadCallback(vec))
 			return NULL;
 		
 	}
@@ -492,7 +498,7 @@
 		return NULL;
 	}
 	
-	if(!Vector_ReadCallback(vec))
+	if(!BaseMath_ReadCallback(vec))
 		return NULL;
 	
 	//create a identity matrix and add translation
@@ -528,7 +534,7 @@
 			return NULL;
 		}
 		
-		if(!Vector_ReadCallback(vec))
+		if(!BaseMath_ReadCallback(vec))
 			return NULL;
 		
 	}
@@ -607,7 +613,7 @@
 			return NULL;
 		}
 		
-		if(!Vector_ReadCallback(vec))
+		if(!BaseMath_ReadCallback(vec))
 			return NULL;
 		
 	}
@@ -766,6 +772,10 @@
 		PyErr_SetString(PyExc_TypeError, "Mathutils.DifferenceQuats(): expected Quaternion types");
 		return NULL;
 	}
+
+	if(!BaseMath_ReadCallback(quatU) || !BaseMath_ReadCallback(quatV))
+		return NULL;
+
 	tempQuat[0] = quatU->quat[0];
 	tempQuat[1] = -quatU->quat[1];
 	tempQuat[2] = -quatU->quat[2];
@@ -793,6 +803,10 @@
 		PyErr_SetString(PyExc_TypeError, "Mathutils.Slerp(): expected Quaternion types and float");
 		return NULL;
 	}
+
+	if(!BaseMath_ReadCallback(quatU) || !BaseMath_ReadCallback(quatV))
+		return NULL;
+
 	if(param > 1.0f || param < 0.0f) {
 		PyErr_SetString(PyExc_AttributeError, "Mathutils.Slerp(): interpolation factor must be between 0.0 and 1.0");
 		return NULL;
@@ -856,7 +870,7 @@
 		return NULL;
 	}
 
-	if(!Vector_ReadCallback(vec1) || !Vector_ReadCallback(vec2) || !Vector_ReadCallback(vec3) || !Vector_ReadCallback(ray) || !Vector_ReadCallback(ray_off))
+	if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(ray) || !BaseMath_ReadCallback(ray_off))
 		return NULL;
 	
 	VECCOPY(v1, vec1->vec);
@@ -928,7 +942,7 @@
 		return NULL;
 	}
 	
-	if(!Vector_ReadCallback(vec1) || !Vector_ReadCallback(vec2) || !Vector_ReadCallback(vec3) || !Vector_ReadCallback(vec4))
+	if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(vec4))
 		return NULL;
 	
 	if( vec1->size == 3 || vec1->size == 2) {
@@ -1002,7 +1016,7 @@
 		return NULL;
 	}
 	
-	if(!Vector_ReadCallback(vec1) || !Vector_ReadCallback(vec2) || !Vector_ReadCallback(vec3) || !Vector_ReadCallback(vec4))
+	if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(vec4))
 		return NULL;
 	
 	VECCOPY(v1, vec1->vec);
@@ -1050,7 +1064,7 @@
 		return NULL;
 	}
 	
-	if(!Vector_ReadCallback(vec1) || !Vector_ReadCallback(vec2) || !Vector_ReadCallback(vec3))
+	if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3))
 		return NULL;
 
 	VECCOPY(v1, vec1->vec);
@@ -1085,7 +1099,7 @@
 		return NULL;
 	}
 	
-	if(!Vector_ReadCallback(vec1) || !Vector_ReadCallback(vec2) || !Vector_ReadCallback(vec3))
+	if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3))
 		return NULL;
 
 	if (vec1->size == 3) {
@@ -1167,75 +1181,66 @@
 }
 
 /* use macros to check for NULL */
-int _Vector_ReadCallback(VectorObject *self)
+int _BaseMathObject_ReadCallback(BaseMathObject *self)
 {
 	Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
-	if(cb->get(self->cb_user, self->cb_subtype, self->vec)) {
+	if(cb->get(self->cb_user, self->cb_subtype, self->data))
 		return 1;
-	}
-	else {
-		PyErr_SetString(PyExc_SystemError, "Vector user has become invalid");
-		return 0;
-	}
+
+	PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name);
+	return 0;
 }
 
-int _Vector_WriteCallback(VectorObject *self)
+int _BaseMathObject_WriteCallback(BaseMathObject *self)
 {
 	Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
-	if(cb->set(self->cb_user, self->cb_subtype, self->vec)) {
+	if(cb->set(self->cb_user, self->cb_subtype, self->data))
 		return 1;
-	}
-	else {
-		PyErr_SetString(PyExc_SystemError, "Vector user has become invalid");
-		return 0;
-	}
+
+	PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name);
+	return 0;
 }
 
-int _Vector_ReadIndexCallback(VectorObject *self, int index)
+int _BaseMathObject_ReadIndexCallback(BaseMathObject *self, int index)
 {
 	Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
-	if(cb->get_index(self->cb_user, self->cb_subtype, self->vec, index)) {
+	if(cb->get_index(self->cb_user, self->cb_subtype, self->data, index))
 		return 1;
-	}
-	else {
-		PyErr_SetString(PyExc_SystemError, "Vector user has become invalid");
-		return 0;
-	}
+
+	PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name);
+	return 0;
 }
 
-int _Vector_WriteIndexCallback(VectorObject *self, int index)
+int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index)
 {
 	Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
-	if(cb->set_index(self->cb_user, self->cb_subtype, self->vec, index)) {
+	if(cb->set_index(self->cb_user, self->cb_subtype, self->data, index))
 		return 1;
-	}
-	else {
-		PyErr_SetString(PyExc_SystemError, "Vector user has become invalid");
-		return 0;
-	}
+
+	PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name);
+	return 0;
 }
 
-/* matrix callbacks */
-int _Matrix_ReadCallback(MatrixObject *self)
+/* BaseMathObject generic functions for all mathutils types */
+PyObject *BaseMathObject_getOwner( BaseMathObject * self, void *type )
 {
-	Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
-	if(cb->get(self->cb_user, self->cb_subtype, self->contigPtr)) {
-		return 1;
-	}
-	else {
-		PyErr_SetString(PyExc_SystemError, "Matrix user has become invalid");
-		return 0;
-	}
+	PyObject *ret= self->cb_user ? self->cb_user : Py_None;
+	Py_INCREF(ret);
+	return ret;
 }
 
-int _Matrix_WriteCallback(MatrixObject *self)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list