[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37463] branches/bmesh/blender/source/ blender: =bmesh=
Joseph Eagar
joeedh at gmail.com
Tue Jun 14 05:16:09 CEST 2011
Revision: 37463
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37463
Author: joeedh
Date: 2011-06-14 03:16:08 +0000 (Tue, 14 Jun 2011)
Log Message:
-----------
=bmesh=
Removed the DerivedMesh face iterators (they sucked).
This should make subsurf faster. Also sped up multires
a bit (not sure if it's strictly correct, need to look
at it later).
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/modifiers_bmesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/multires.c
branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
branches/bmesh/blender/source/blender/blenlib/BLI_edgehash.h
branches/bmesh/blender/source/blender/editors/mesh/editface.c
branches/bmesh/blender/source/blender/editors/sculpt_paint/sculpt.c
Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h 2011-06-14 02:26:43 UTC (rev 37462)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h 2011-06-14 03:16:08 UTC (rev 37463)
@@ -104,43 +104,6 @@
Also, the mface origindex layer indexes mpolys, not mfaces.
*/
-/*DM Iterators. For now, first implement face iterators.
- These are read-only, at least for now.*/
-
-typedef struct DMLoopIter {
- void (*step)(void *self);
- int done;
-
- int index, vindex, eindex;
- MVert v; /*copy of the associated vert's data*/
-
- /*note: if layer is -1, then the active layer is retrieved.
- loop refers to per-face-vertex data.*/
- void *(*getLoopCDData)(void *self, int type, int layer);
- void *(*getVertCDData)(void *self, int type, int layer);
-} DMLoopIter;
-
-typedef struct DMFaceIter {
- void (*step)(void *self);
- void (*free)(void *self);
- int done;
-
- int index;
- int len;
-
- /*you can set mat_nr and flags, and the backends
- must detect and update the internal faces*/
- int mat_nr;
- int flags;
-
- /*note: you may only use one
- loop iterator at a time.*/
- DMLoopIter *(*getLoopsIter)(void *self);
-
- /*if layer is -1, returns active layer*/
- void *(*getCDData)(void *self, int type, int layer);
-} DMFaceIter;
-
typedef struct DMGridData {
float co[3];
float no[3];
@@ -170,9 +133,6 @@
/* Misc. Queries */
- /*face iterator. initializes iter.*/
- DMFaceIter *(*newFaceIter)(DerivedMesh *dm);
-
/*recalculates mesh tesselation*/
void (*recalcTesselation)(DerivedMesh *dm);
@@ -199,6 +159,8 @@
struct MVert *(*getVertArray)(DerivedMesh *dm);
struct MEdge *(*getEdgeArray)(DerivedMesh *dm);
struct MFace *(*getTessFaceArray)(DerivedMesh *dm);
+ struct MLoop *(*getLoopArray)(DerivedMesh *dm);
+ struct MPoly *(*getPolyArray)(DerivedMesh *dm);
/* copy all verts/edges/faces from the derived mesh into
* *{vert/edge/face}_r (must point to a buffer large enough)
@@ -206,6 +168,8 @@
void (*copyVertArray)(DerivedMesh *dm, struct MVert *vert_r);
void (*copyEdgeArray)(DerivedMesh *dm, struct MEdge *edge_r);
void (*copyTessFaceArray)(DerivedMesh *dm, struct MFace *face_r);
+ void (*copyLoopArray)(DerivedMesh *dm, struct MLoop *loop_r);
+ void (*copyPolyArray)(DerivedMesh *dm, struct MPoly *poly_r);
/* return a copy of all verts/edges/faces from the derived mesh
* it is the caller's responsibility to free the returned pointer
@@ -213,6 +177,8 @@
struct MVert *(*dupVertArray)(DerivedMesh *dm);
struct MEdge *(*dupEdgeArray)(DerivedMesh *dm);
struct MFace *(*dupTessFaceArray)(DerivedMesh *dm);
+ struct MLoop *(*dupLoopArray)(DerivedMesh *dm);
+ struct MPoly *(*dupPolyArray)(DerivedMesh *dm);
/* return a pointer to a single element of vert/edge/face custom data
* from the derived mesh (this gives a pointer to the actual data, not
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c 2011-06-14 02:26:43 UTC (rev 37462)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c 2011-06-14 03:16:08 UTC (rev 37463)
@@ -125,6 +125,34 @@
return mface;
}
+static MLoop *dm_getLoopArray(DerivedMesh *dm)
+{
+ MLoop *mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
+
+ if (!mloop) {
+ mloop = CustomData_add_layer(&dm->loopData, CD_MLOOP, CD_CALLOC, NULL,
+ dm->numLoopData);
+ CustomData_set_layer_flag(&dm->loopData, CD_MLOOP, CD_FLAG_TEMPORARY);
+ dm->copyLoopArray(dm, mloop);
+ }
+
+ return mloop;
+}
+
+static MPoly *dm_getPolyArray(DerivedMesh *dm)
+{
+ MPoly *mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
+
+ if (!mpoly) {
+ mpoly = CustomData_add_layer(&dm->polyData, CD_MPOLY, CD_CALLOC, NULL,
+ dm->getNumFaces(dm));
+ CustomData_set_layer_flag(&dm->polyData, CD_MPOLY, CD_FLAG_TEMPORARY);
+ dm->copyPolyArray(dm, mpoly);
+ }
+
+ return mpoly;
+}
+
static MVert *dm_dupVertArray(DerivedMesh *dm)
{
MVert *tmp = MEM_callocN(sizeof(*tmp) * dm->getNumVerts(dm),
@@ -155,6 +183,26 @@
return tmp;
}
+static MLoop *dm_dupLoopArray(DerivedMesh *dm)
+{
+ MLoop *tmp = MEM_callocN(sizeof(*tmp) * dm->numLoopData,
+ "dm_dupLoopArray tmp");
+
+ if(tmp) dm->copyLoopArray(dm, tmp);
+
+ return tmp;
+}
+
+static MPoly *dm_dupPolyArray(DerivedMesh *dm)
+{
+ MPoly *tmp = MEM_callocN(sizeof(*tmp) * dm->numFaceData,
+ "dm_dupPolyArray tmp");
+
+ if(tmp) dm->copyPolyArray(dm, tmp);
+
+ return tmp;
+}
+
static CustomData *dm_getVertCData(DerivedMesh *dm)
{
return &dm->vertData;
@@ -186,9 +234,13 @@
dm->getVertArray = dm_getVertArray;
dm->getEdgeArray = dm_getEdgeArray;
dm->getTessFaceArray = dm_getFaceArray;
+ dm->getLoopArray = dm_getLoopArray;
+ dm->getPolyArray = dm_getPolyArray;
dm->dupVertArray = dm_dupVertArray;
dm->dupEdgeArray = dm_dupEdgeArray;
dm->dupTessFaceArray = dm_dupFaceArray;
+ dm->dupLoopArray = dm_dupLoopArray;
+ dm->dupPolyArray = dm_dupPolyArray;
dm->getVertDataLayout = dm_getVertCData;
dm->getEdgeDataLayout = dm_getEdgeCData;
@@ -272,105 +324,29 @@
}
}
-static void dm_add_polys_from_iter(CustomData *ldata, CustomData *pdata, DerivedMesh *dm, int totloop)
+void DM_DupPolys(DerivedMesh *source, DerivedMesh *target)
{
- DMFaceIter *iter = dm->newFaceIter(dm);
- DMLoopIter *liter;
- CustomData *oldata, *opdata;
- MPoly *mpoly;
- MLoop *mloop;
- int p, l, i, j, lasttype;
+ CustomData_copy(&source->loopData, &target->loopData, CD_MASK_DERIVEDMESH, CD_CALLOC, source->numLoopData);
+ CustomData_copy(&source->polyData, &target->polyData, CD_MASK_DERIVEDMESH, CD_CALLOC, source->numPolyData);
- oldata = dm->getLoopDataLayout(dm);
- opdata = dm->getFaceDataLayout(dm);
+ target->numLoopData = source->numLoopData;
+ target->numPolyData = source->numPolyData;
- CustomData_copy(oldata, ldata, CD_MASK_DERIVEDMESH, CD_CALLOC, totloop);
- CustomData_copy(opdata, pdata, CD_MASK_DERIVEDMESH, CD_CALLOC, dm->getNumFaces(dm));
+ if (!CustomData_has_layer(&target->polyData, CD_MPOLY)) {
+ MPoly *mpoly;
+ MLoop *mloop;
- mloop = MEM_callocN(sizeof(MLoop)*totloop, "MLoop from dm_add_polys_from_iter");
- CustomData_add_layer(ldata, CD_MLOOP, CD_ASSIGN, mloop, totloop);
- mpoly = MEM_callocN(sizeof(MPoly)*dm->getNumFaces(dm), "MPoly from dm_add_polys_from_iter");
- CustomData_add_layer(pdata, CD_MPOLY, CD_ASSIGN, mpoly, dm->getNumFaces(dm));
-
- l = 0;
- for (p=0; !iter->done; iter->step(iter), mpoly++, p++) {
- mpoly->flag = iter->flags;
- mpoly->loopstart = l;
- mpoly->totloop = iter->len;
- mpoly->mat_nr = iter->mat_nr;
-
- j = 0;
- lasttype = -1;
- for (i=0; i<opdata->totlayer; i++) {
- void *e1, *e2;
-
- if (opdata->layers[i].type == lasttype)
- j++;
- else
- j = 0;
-
- if (opdata->layers[i].type == CD_MPOLY)
- continue;
-
- e1 = iter->getCDData(iter, opdata->layers[i].type, j);
- e2 = (char*)CustomData_get_n(pdata, opdata->layers[i].type, p, j);
-
- if (!e2)
- continue;
-
- CustomData_copy_elements(opdata->layers[i].type, e1, e2, 1);
-
- lasttype = opdata->layers[i].type;
- }
-
- liter = iter->getLoopsIter(iter);
- for (; !liter->done; liter->step(liter), mloop++, l++) {
- mloop->v = liter->vindex;
- mloop->e = liter->eindex;
-
- j = 0;
- lasttype = -1;
- for (i=0; i<oldata->totlayer; i++) {
- void *e1, *e2;
-
- if (oldata->layers[i].type == CD_MLOOP)
- continue;
-
- if (oldata->layers[i].type == lasttype)
- j++;
- else
- j = 0;
-
- e1 = liter->getLoopCDData(liter, oldata->layers[i].type, j);
- e2 = CustomData_get_n(ldata, oldata->layers[i].type, l, j);
-
- if (!e2)
- continue;
-
- CustomData_copy_elements(oldata->layers[i].type, e1, e2, 1);
- lasttype = oldata->layers[i].type;
- }
- }
+ mloop = source->dupLoopArray(source);
+ mpoly = source->dupPolyArray(source);
+ CustomData_add_layer(&target->loopData, CD_MLOOP, CD_ASSIGN, mloop, source->numLoopData);
+ CustomData_add_layer(&target->polyData, CD_MPOLY, CD_ASSIGN, mpoly, source->numPolyData);
}
- iter->free(iter);
}
-void DM_DupPolys(DerivedMesh *source, DerivedMesh *target)
-{
- DMFaceIter *iter = source->newFaceIter(source);
- int totloop = source->numLoopData;
-
- dm_add_polys_from_iter(&target->loopData, &target->polyData, source, totloop);
-
- target->numLoopData = totloop;
- target->numPolyData = source->getNumFaces(source);
-}
-
void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob)
{
/* dm might depend on me, so we need to do everything with a local copy */
Mesh tmp = *me;
- DMFaceIter *iter;
int totvert, totedge, totface, totloop, totpoly;
int did_shapekeys=0;
@@ -384,14 +360,7 @@
totedge = tmp.totedge = dm->getNumEdges(dm);
totface = tmp.totface = dm->getNumTessFaces(dm);
totpoly = tmp.totpoly = dm->getNumFaces(dm);
-
- totloop = 0;
- for (iter=dm->newFaceIter(dm); !iter->done; iter->step(iter)) {
- totloop += iter->len;
- }
- iter->free(iter);
-
- tmp.totloop = totloop;
+ totloop = tmp.totloop = dm->numLoopData;
CustomData_copy(&dm->vertData, &tmp.vdata, CD_MASK_MESH, CD_DUPLICATE, totvert);
CustomData_copy(&dm->edgeData, &tmp.edata, CD_MASK_MESH, CD_DUPLICATE, totedge);
@@ -432,9 +401,14 @@
CustomData_add_layer(&tmp.edata, CD_MEDGE, CD_ASSIGN, dm->dupEdgeArray(dm), totedge);
if(!CustomData_has_layer(&tmp.fdata, CD_MFACE))
CustomData_add_layer(&tmp.fdata, CD_MFACE, CD_ASSIGN, dm->dupTessFaceArray(dm), totface);
- if(!CustomData_has_layer(&tmp.pdata, CD_MPOLY))
- dm_add_polys_from_iter(&tmp.ldata, &tmp.pdata, dm, totloop);
+ if(!CustomData_has_layer(&tmp.pdata, CD_MPOLY)) {
+ tmp.mloop = dm->dupLoopArray(dm);
+ tmp.mpoly = dm->dupPolyArray(dm);
+ CustomData_add_layer(&tmp.ldata, CD_MLOOP, CD_ASSIGN, tmp.mloop, tmp.totloop);
+ CustomData_add_layer(&tmp.pdata, CD_MPOLY, CD_ASSIGN, tmp.mpoly, tmp.totpoly);
+ }
+
/* object had got displacement layer, should copy this layer to save sculpted data */
/* NOTE: maybe some other layers should be copied? nazgul */
if(CustomData_has_layer(&me->ldata, CD_MDISPS)) {
@@ -455,7 +429,7 @@
/* ok, this should now use new CD shapekey data,
which shouuld be fed through the modifier
stack*/
- if(tmp.totvert != me->totvert && !did_shapekeys) {
+ if(tmp.totvert != me->totvert && !did_shapekeys && me->key) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list