[Bf-python] Transforming a mesh C-, amazing speed increase of exporters.

Jonathan Merritt j.merritt at pgrad.unimelb.edu.au
Sun Feb 6 11:52:24 CET 2005


Does this code currently transform the normal vectors of the mesh as 
well as the mesh vertices?  Unless those are automatically updated 
somehow (which I would suggest is *NOT* a good general solution!), it 
seems to me that this is only doing part of the job.

Yann Vernier wrote:

>Looks good to me, assuming the assumption that verts is a sequence of
>NMVerts holds. If it's known to be a list, PyList_GET_{SIZE,ITEM} can
>give you a quicker way to traverse it; note that the latter returns
>borrowed references so you wouldn't do the decref anymore. (Assuming
>that it's a list doesn't seem that much worse than assuming it
>uniformly contains NMVerts to me.)
>
>On Sun, Feb 06, 2005 at 03:12:05AM +0800, Campbell J Barton wrote:
>  
>
>>+static PyObject *NMesh_transform( PyObject * self, PyObject * args )
>>+{
>>+	BPy_NMesh *nmesh = ( BPy_NMesh * ) self;
>>+	BPy_NMVert *mv;
>>+	PyObject *ob1 = NULL;
>>+	MatrixObject *mat;
>>+	float vx, vy, vz;
>>+	int i;
>>+	
>>+	if( !PyArg_ParseTuple( args, "O!", &matrix_Type, &ob1 ) )
>>+		return ( EXPP_ReturnPyObjError( PyExc_TypeError,
>>+						"expected matrix\n" ) );
>>+	
>>+	mat = ( MatrixObject * ) ob1;
>>+	
>>+	if( mat->colSize != 4 || mat->rowSize != 4 )
>>+		return ( EXPP_ReturnPyObjError( PyExc_AttributeError,
>>+						"matrix must be a 4x4 transformation matrix as returned by object.getMatrix()\n" ) );
>>+	
>>+	/* Loop through all the verts and transform them by the supplied matrix */
>>+	for( i = 0; i < PySequence_Length(nmesh->verts); i++ ) {
>>+		mv = ( BPy_NMVert * ) PySequence_GetItem( nmesh->verts, i );
>>+		vx = mv->co[0];
>>+		vy = mv->co[1];
>>+		vz = mv->co[2];
>>+		mv->co[0] = vx*mat->matrix[0][0] + vy*mat->matrix[1][0] + vz*mat->matrix[2][0] + mat->matrix[3][0];
>>+		mv->co[1] = vx*mat->matrix[0][1] + vy*mat->matrix[1][1] + vz*mat->matrix[2][1] + mat->matrix[3][1];
>>+		mv->co[2] = vx*mat->matrix[0][2] + vy*mat->matrix[1][2] + vz*mat->matrix[2][2] + mat->matrix[3][2];
>>+	}
>>+	
>>+	Py_DECREF( mv );
>>    
>>
>
>This should be in the loop. You're doing a GetItem for each vertex.
>
>  
>
>>+	Py_INCREF( Py_None );
>>+	return Py_None;
>>+}
>>+
>> static PyObject *NMesh_getMode( BPy_NMesh * self )
>> {
>> 	PyObject *attr = PyInt_FromLong( self->mode );
>>@@ -1513,6 +1551,7 @@
>> 	MethodDef( setMode ),
>> 	MethodDef( setMaxSmoothAngle ),
>> 	MethodDef( setSubDivLevels ),
>>+	MethodDef( transform ),
>> 
>> /* METH_NOARGS: function(PyObject *self) */
>> #undef MethodDef
>>    
>>
>_______________________________________________
>Bf-python mailing list
>Bf-python at projects.blender.org
>http://projects.blender.org/mailman/listinfo/bf-python
>
>  
>
-- 
Jonathan Merritt BE(Mech)/BSc
PhD Student - Equine Biomechanics
The University of Melbourne
Veterinary Clinical Centre, Werribee




More information about the Bf-python mailing list