[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