Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/python/api2_2x/NMesh.c')
-rw-r--r--source/blender/python/api2_2x/NMesh.c226
1 files changed, 68 insertions, 158 deletions
diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c
index 4733bff2899..6f8bf1eb95a 100644
--- a/source/blender/python/api2_2x/NMesh.c
+++ b/source/blender/python/api2_2x/NMesh.c
@@ -52,14 +52,15 @@
#include "BIF_editview.h"
#include "BIF_space.h"
+#include "BKE_customdata.h"
#include "BKE_deform.h"
#include "BKE_mesh.h"
#include "BKE_material.h"
#include "BKE_main.h"
#include "BKE_global.h"
#include "BKE_library.h"
-#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_displist.h"
#include "BKE_object.h"
#include "BKE_mball.h"
#include "BKE_utildefines.h"
@@ -1272,14 +1273,14 @@ static PyObject *NMesh_getSelectedFaces( PyObject * self, PyObject * args )
Mesh *me = nm->mesh;
int flag = 0;
- TFace *tf;
+ MTFace *tf;
int i;
PyObject *l = PyList_New( 0 );
if( me == NULL )
return NULL;
- tf = me->tface;
+ tf = me->mtface;
if( tf == 0 )
return l;
@@ -1454,8 +1455,8 @@ static PyObject *NMesh_update( PyObject *self, PyObject *a, PyObject *kwd )
}
/* recalculate the derived mesh before trying to use it */
- makeDispListMesh (nmesh->object);
- make_vertexcol();
+ makeDerivedMesh(nmesh->object);
+ make_vertexcol(1);
countall();
}
@@ -1960,7 +1961,7 @@ PyTypeObject NMesh_Type = {
};
static BPy_NMFace *nmface_from_data( BPy_NMesh * mesh, int vidxs[4],
- char mat_nr, char flag, TFace * tface, MCol * col )
+ char mat_nr, char flag, MTFace * tface, MCol * col )
{
BPy_NMFace *newf = PyObject_NEW( BPy_NMFace, &NMFace_Type );
int i, len;
@@ -1994,7 +1995,6 @@ static BPy_NMFace *nmface_from_data( BPy_NMesh * mesh, int vidxs[4],
newf->mode = tface->mode; /* draw mode */
newf->flag = tface->flag; /* select flag */
newf->transp = tface->transp; /* transparency flag */
- col = ( MCol * ) ( tface->col ); /* weird, tface->col is uint[4] */
} else {
newf->mode = TF_DYNAMIC; /* just to initialize it to something meaninful, */
/* since without tfaces there are no tface->mode's, obviously. */
@@ -2062,13 +2062,13 @@ static BPy_NMVert *nmvert_from_data( MVert * vert, MSticky * st, float *co,
static int get_active_faceindex( Mesh * me )
{
- TFace *tf;
+ MTFace *tf;
int i;
if( me == NULL )
return -1;
- tf = me->tface;
+ tf = me->mtface;
if( tf == 0 )
return -1;
@@ -2321,7 +2321,7 @@ static PyObject *new_NMesh_displist(ListBase *lb, Object *ob)
}
static PyObject *new_NMesh_internal( Mesh * oldmesh,
- DispListMesh * dlm )
+ DerivedMesh *dm )
{
BPy_NMesh *me = PyObject_NEW( BPy_NMesh, &NMesh_Type );
me->flags = 0;
@@ -2343,7 +2343,7 @@ static PyObject *new_NMesh_internal( Mesh * oldmesh,
MVert *mverts;
MSticky *msticky;
MFace *mfaces;
- TFace *tfaces;
+ MTFace *tfaces;
MCol *mcols;
MEdge *medges;
int i, totvert, totface, totedge;
@@ -2357,22 +2357,22 @@ static PyObject *new_NMesh_internal( Mesh * oldmesh,
me->sel_face = get_active_faceindex( oldmesh );
- if( dlm ) {
+ if( dm ) {
msticky = NULL;
- mverts = dlm->mvert;
- mfaces = dlm->mface;
- tfaces = dlm->tface;
- mcols = dlm->mcol;
- medges = dlm->medge;
-
- totvert = dlm->totvert;
- totface = dlm->totface;
- totedge = dlm->totedge;
+ mverts = dm->getVertArray(dm);
+ mfaces = dm->getFaceArray(dm);
+ tfaces = dm->getFaceDataArray(dm, CD_MTFACE);
+ mcols = dm->getFaceDataArray(dm, CD_MCOL);
+ medges = dm->getEdgeArray(dm);
+
+ totvert = dm->getNumVerts(dm);
+ totedge = dm->getNumEdges(dm);
+ totface = dm->getNumFaces(dm);;
} else {
msticky = oldmesh->msticky;
mverts = oldmesh->mvert;
mfaces = oldmesh->mface;
- tfaces = oldmesh->tface;
+ tfaces = oldmesh->mtface;
mcols = oldmesh->mcol;
medges = oldmesh->medge;
@@ -2404,7 +2404,7 @@ static PyObject *new_NMesh_internal( Mesh * oldmesh,
me->faces = PyList_New( totface );
for( i = 0; i < totface; i++ ) {
- TFace *oldtf = tfaces ? &tfaces[i] : NULL;
+ MTFace *oldtf = tfaces ? &tfaces[i] : NULL;
MCol *oldmc = mcols ? &mcols[i * 4] : NULL;
MFace *oldmf = &mfaces[i];
int vidxs[4];
@@ -2558,9 +2558,7 @@ static PyObject *M_NMesh_GetRawFromObject( PyObject * self, PyObject * args )
case OB_MESH:
{
DerivedMesh *dm = mesh_create_derived_render( ob );
- DispListMesh *dlm = dm->convertToDispListMesh(dm, 1);
- nmesh = new_NMesh_internal( ob->data, dlm );
- displistmesh_free(dlm);
+ nmesh = new_NMesh_internal( ob->data, dm );
dm->release(dm);
}
break;
@@ -2595,43 +2593,7 @@ static void mvert_from_data( MVert * mv, MSticky * st, BPy_NMVert * from )
}
}
-/*@ TODO: this function is just a added hack. Don't look at the
- * RGBA/BRGA confusion, it just works, but will never work with
- * a restructured Blender */
-
-static void assign_perFaceColors( TFace * tf, BPy_NMFace * from )
-{
- MCol *col;
- int i;
-
- col = ( MCol * ) ( tf->col );
-
- if( col ) {
- int len = PySequence_Length( from->col );
-
- if( len > 4 )
- len = 4;
-
- for( i = 0; i < len; i++, col++ ) {
- BPy_NMCol *mc =
- ( BPy_NMCol * ) PySequence_GetItem( from->col,
- i );
- if( !BPy_NMCol_Check( mc ) ) {
- Py_DECREF( mc );
- continue;
- }
-
- col->r = mc->b;
- col->b = mc->r;
- col->g = mc->g;
- col->a = mc->a;
-
- Py_DECREF( mc );
- }
- }
-}
-
-static int assignFaceUV( TFace * tf, BPy_NMFace * nmface )
+static int assignFaceUV( MTFace * tf, BPy_NMFace * nmface )
{
PyObject *fuv, *tmp;
int i;
@@ -2671,15 +2633,15 @@ static int assignFaceUV( TFace * tf, BPy_NMFace * nmface )
tf->flag = (char)nmface->flag; /* copy flag */
tf->transp = nmface->transp; /* copy transp flag */
- /* assign vertex colours */
- assign_perFaceColors( tf, nmface );
return 1;
}
-static int mface_from_data( MFace * mf, TFace * tf, MCol * col,
+static int mface_from_data( MFace * mf, CustomData *fdata, int findex,
BPy_NMFace * from )
{
BPy_NMVert *nmv;
+ MTFace *tf = CustomData_get(fdata, findex, CD_MTFACE);
+ MCol *col = CustomData_get(fdata, findex, CD_MCOL);
int i = PyList_Size( from->v );
if( i != 3 && i != 4 ) { /* face can only have three or four verts */
@@ -2718,8 +2680,6 @@ static int mface_from_data( MFace * mf, TFace * tf, MCol * col,
if( !assignFaceUV( tf, from ) )
return 0;
- test_index_face(mf, NULL, tf, i );
-
mf->mat_nr = from->mat_nr;
mf->flag = from->mf_flag;
@@ -2746,6 +2706,9 @@ static int mface_from_data( MFace * mf, TFace * tf, MCol * col,
Py_DECREF( mc );
}
}
+
+ test_index_face(mf, fdata, findex, i );
+
return 1;
}
@@ -2798,22 +2761,19 @@ static void EXPP_unlink_mesh( Mesh * me )
static int unlink_existingMeshData( Mesh * mesh )
{
EXPP_unlink_mesh( mesh );
- if( mesh->mvert )
- MEM_freeN( mesh->mvert );
- if( mesh->medge ) {
- MEM_freeN( mesh->medge );
- mesh->totedge = 0;
- }
- if( mesh->mface )
- MEM_freeN( mesh->mface );
- if( mesh->mcol )
- MEM_freeN( mesh->mcol );
- if( mesh->msticky )
- MEM_freeN( mesh->msticky );
- if( mesh->mat )
+
+ CustomData_free( &mesh->vdata, mesh->totvert );
+ CustomData_free( &mesh->edata, mesh->totedge );
+ CustomData_free( &mesh->fdata, mesh->totface );
+ mesh_update_customdata_pointers( mesh );
+
+ mesh->totedge = 0;
+
+ if( mesh->mat ) {
MEM_freeN( mesh->mat );
- if( mesh->tface )
- MEM_freeN( mesh->tface );
+ mesh->mat = NULL;
+ }
+
return 1;
}
@@ -2919,8 +2879,9 @@ static void fill_medge_from_nmesh(Mesh * mesh, BPy_NMesh * nmesh)
tot_faces_edges=mesh->totedge;
tot_valid_faces_edges=tot_faces_edges;
- mesh->medge=NULL;
- mesh->totedge = 0;
+ mesh->medge= CustomData_set_layer(&mesh->edata, CD_MEDGE, NULL);
+ CustomData_free_layer(&mesh->edata, CD_MEDGE, mesh->totedge);
+ mesh->totedge = 0;
/* Flag each edge in faces_edges that is already in nmesh->edges list.
* Flaging an edge means MEdge v1=v2=0.
@@ -2964,7 +2925,7 @@ static void fill_medge_from_nmesh(Mesh * mesh, BPy_NMesh * nmesh)
/* Now we have the total count of valid edges */
mesh->totedge=tot_valid_nmedges+tot_valid_faces_edges;
- mesh->medge=MEM_callocN(mesh->totedge*sizeof(MEdge), "make mesh edges");
+ mesh->medge= CustomData_add_layer(&mesh->edata, CD_MEDGE, 0, NULL, mesh->totedge);
for ( i = 0; i < tot_valid_nmedges; ++i )
{
BPy_NMEdge *edge=valid_nmedges[i];
@@ -3030,21 +2991,11 @@ static void check_dverts(Mesh *me, int old_totvert)
static int convert_NMeshToMesh( Mesh * mesh, BPy_NMesh * nmesh)
{
MFace *newmf;
- TFace *newtf;
MVert *newmv;
MSticky *newst;
- MCol *newmc;
int nmeshtotedges;
int i, j, ok;
- mesh->mvert = NULL;
- mesh->medge = NULL;
- mesh->mface = NULL;
- mesh->mcol = NULL;
- mesh->msticky = NULL;
- mesh->tface = NULL;
- mesh->mat = NULL;
-
/* Minor note: we used 'mode' because 'flag' was already used internally
* by nmesh */
mesh->flag = nmesh->mode;
@@ -3052,21 +3003,15 @@ static int convert_NMeshToMesh( Mesh * mesh, BPy_NMesh * nmesh)
mesh->subdiv = nmesh->subdiv[0];
mesh->subdivr = nmesh->subdiv[1];
-
-
-
-
/*@ material assignment moved to PutRaw */
mesh->totvert = PySequence_Length( nmesh->verts );
if( mesh->totvert ) {
if( nmesh->flags & NMESH_HASVERTUV )
- mesh->msticky =
- MEM_callocN( sizeof( MSticky ) * mesh->totvert,
- "msticky" );
+ mesh->msticky = CustomData_add_layer( &mesh->vdata, CD_MSTICKY, 0,
+ NULL, mesh->totvert );
- mesh->mvert =
- MEM_callocN( sizeof( MVert ) * mesh->totvert,
- "mverts" );
+ mesh->mvert = CustomData_add_layer( &mesh->vdata, CD_MVERT, 0, NULL,
+ mesh->totvert );
}
if( mesh->totvert )
@@ -3075,24 +3020,12 @@ static int convert_NMeshToMesh( Mesh * mesh, BPy_NMesh * nmesh)
mesh->totface = 0;
if( mesh->totface ) {
-/*@ only create vertcol array if mesh has no texture faces */
-
-/*@ TODO: get rid of double storage of vertex colours. In a mesh,
- * vertex colors can be stored the following ways:
- * - per (TFace*)->col
- * - per (Mesh*)->mcol
- * This is stupid, but will reside for the time being -- at least until
- * a redesign of the internal Mesh structure */
-
- if( !( nmesh->flags & NMESH_HASFACEUV )
- && ( nmesh->flags & NMESH_HASMCOL ) )
- mesh->mcol =
- MEM_callocN( 4 * sizeof( MCol ) *
- mesh->totface, "mcol" );
-
- mesh->mface =
- MEM_callocN( sizeof( MFace ) * mesh->totface,
- "mfaces" );
+ if( nmesh->flags & NMESH_HASMCOL )
+ mesh->mcol = CustomData_add_layer( &mesh->fdata, CD_MCOL, 0, NULL,
+ mesh->totface );
+
+ mesh->mface = CustomData_add_layer( &mesh->fdata, CD_MFACE, 0, NULL,
+ mesh->totface );
}
/*@ This stuff here is to tag all the vertices referenced
@@ -3154,41 +3087,18 @@ static int convert_NMeshToMesh( Mesh * mesh, BPy_NMesh * nmesh)
* UV coordinate assigned, if yes, make tfaces */
if( ( nmesh->flags & NMESH_HASFACEUV )
|| ( check_validFaceUV( nmesh ) ) ) {
- make_tfaces( mesh ); /* initialize TFaces */
-
- newmc = mesh->mcol;
- newmf = mesh->mface;
- newtf = mesh->tface;
- for( i = 0; i < mesh->totface; i++ ) {
- PyObject *mf = PySequence_GetItem( nmesh->faces, i );
- ok = mface_from_data( newmf, newtf, newmc,
- ( BPy_NMFace * ) mf );
- Py_DECREF( mf );
- if( !ok )
- return 0;
-
- newtf++;
- newmf++;
- if( newmc )
- newmc += 4;
- }
-
+ make_tfaces( mesh ); /* initialize MTFaces */
nmesh->flags |= NMESH_HASFACEUV;
- } else {
- newmc = mesh->mcol;
- newmf = mesh->mface;
-
- for( i = 0; i < mesh->totface; i++ ) {
- PyObject *mf = PySequence_GetItem( nmesh->faces, i );
- ok = mface_from_data( newmf, 0, newmc,
- ( BPy_NMFace * ) mf );
- Py_DECREF( mf );
- if( !ok )
- return 0;
- newmf++;
- if( newmc )
- newmc += 4; /* there are 4 MCol's per face */
- }
+ }
+
+ newmf = mesh->mface;
+ for( i = 0; i < mesh->totface; i++ ) {
+ PyObject *mf = PySequence_GetItem( nmesh->faces, i );
+ ok = mface_from_data( newmf, &mesh->fdata, i, ( BPy_NMFace * ) mf );
+ Py_DECREF( mf );
+ if( !ok )
+ return 0;
+ newmf++;
}
/* Always do this to ensure no loose edges in faces */