[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41797] branches/bmesh/blender/source/ blender: Add CD_POLYINDEX layer to reduce need for retesselations
Andrew Wiggin
ender79bl at gmail.com
Sun Nov 13 16:13:59 CET 2011
Revision: 41797
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41797
Author: ender79
Date: 2011-11-13 15:13:59 +0000 (Sun, 13 Nov 2011)
Log Message:
-----------
Add CD_POLYINDEX layer to reduce need for retesselations
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.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/customdata.c
branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
branches/bmesh/blender/source/blender/blenloader/intern/readfile.c
branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
branches/bmesh/blender/source/blender/editors/mesh/editface.c
branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c
branches/bmesh/blender/source/blender/editors/object/object_add.c
branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_image.c
branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_vertex.c
branches/bmesh/blender/source/blender/editors/space_view3d/drawmesh.c
branches/bmesh/blender/source/blender/makesdna/DNA_customdata_types.h
branches/bmesh/blender/source/blender/modifiers/intern/MOD_mirror.c
branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c
Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h 2011-11-13 15:10:54 UTC (rev 41796)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h 2011-11-13 15:13:59 UTC (rev 41797)
@@ -129,11 +129,14 @@
struct GPUDrawObject *drawObject;
DerivedMeshType type;
- /* Misc. Queries */
-
- /*recalculates mesh tesselation*/
+ /* calculate vert and face normals */
+ void (*calcNormals)(DerivedMesh *dm);
+
+ /* recalculates mesh tesselation */
void (*recalcTesselation)(DerivedMesh *dm);
+ /* Misc. Queries */
+
/* Also called in Editmode */
int (*getNumVerts)(DerivedMesh *dm);
int (*getNumEdges)(DerivedMesh *dm);
@@ -166,8 +169,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);
+ 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
@@ -175,8 +178,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);
+ 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/BKE_cdderivedmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h 2011-11-13 15:10:54 UTC (rev 41796)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h 2011-11-13 15:13:59 UTC (rev 41797)
@@ -111,11 +111,8 @@
faces*/
void CDDM_calc_edges_poly(struct DerivedMesh *dm);
-/*reconstitute face triangulation. if orig_use_polyorig is nonzero, sets
- the mface origindex layer to copy to the origindex values of the
- parent mpolys; otherwise the mface origindex will point to the index of
- the parent mpoly*/
-void CDDM_recalc_tesselation(struct DerivedMesh *dm, int orig_use_polyorig);
+/* reconstitute face triangulation */
+void CDDM_recalc_tesselation(struct DerivedMesh *dm);
/* lowers the number of vertices/edges/faces in a CDDerivedMesh
* the layer data stays the same size
Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h 2011-11-13 15:10:54 UTC (rev 41796)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h 2011-11-13 15:13:59 UTC (rev 41797)
@@ -75,7 +75,7 @@
*/
int mesh_recalcTesselation(struct CustomData *fdata, struct CustomData *ldata,
struct CustomData *pdata, struct MVert *mvert, int totface,
- int totloop, int totpoly, int use_poly_origindex, int use_face_origindex);
+ int totloop, int totpoly);
/*calculates a face normal.*/
void mesh_calc_poly_normal(struct MPoly *mpoly, struct MLoop *loopstart,
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c 2011-11-13 15:10:54 UTC (rev 41796)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c 2011-11-13 15:13:59 UTC (rev 41797)
@@ -365,13 +365,11 @@
totvert = tmp.totvert = dm->getNumVerts(dm);
totedge = tmp.totedge = dm->getNumEdges(dm);
- totface = tmp.totface = dm->getNumTessFaces(dm);
totpoly = tmp.totpoly = dm->getNumFaces(dm);
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);
- CustomData_copy(&dm->faceData, &tmp.fdata, CD_MASK_MESH, CD_DUPLICATE, totface);
CustomData_copy(&dm->loopData, &tmp.ldata, CD_MASK_MESH, CD_DUPLICATE, totloop);
CustomData_copy(&dm->polyData, &tmp.pdata, CD_MASK_MESH, CD_DUPLICATE, totpoly);
@@ -406,8 +404,6 @@
CustomData_add_layer(&tmp.vdata, CD_MVERT, CD_ASSIGN, dm->dupVertArray(dm), totvert);
if(!CustomData_has_layer(&tmp.edata, CD_MEDGE))
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)) {
tmp.mloop = dm->dupLoopArray(dm);
tmp.mpoly = dm->dupPolyArray(dm);
@@ -425,6 +421,7 @@
}
}
+ tmp.totface = mesh_recalcTesselation(&tmp.fdata, &tmp.ldata, &tmp.pdata, tmp.mvert, tmp.totface, tmp.totloop, tmp.totpoly);
mesh_update_customdata_pointers(&tmp);
CustomData_free(&me->vdata, me->totvert);
@@ -530,7 +527,7 @@
void *DM_get_tessface_data_layer(DerivedMesh *dm, int type)
{
- if(type == CD_MFACE)
+ if (type == CD_MFACE)
return dm->getTessFaceArray(dm);
return CustomData_get_layer(&dm->faceData, type);
@@ -1457,6 +1454,8 @@
}
#endif /* WITH_GAMEENGINE */
+ finaldm->calcNormals(finaldm);
+
*final_r = finaldm;
if(orcodm)
@@ -1508,7 +1507,7 @@
ModifierData *md;
float (*deformedVerts)[3] = NULL;
CustomDataMask mask;
- DerivedMesh *dm = NULL, *orcodm = NULL;
+ DerivedMesh *dm = NULL, *orcodm = NULL, *finaldm = NULL;
int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
LinkNode *datamasks, *curr;
int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
@@ -1660,21 +1659,24 @@
* then we need to build one.
*/
if(dm && deformedVerts) {
- *final_r = CDDM_copy(dm, 0);
+ finaldm = CDDM_copy(dm, 0);
if(!(cage_r && dm == *cage_r)) dm->release(dm);
CDDM_apply_vert_coords(*final_r, deformedVerts);
- CDDM_calc_normals(*final_r);
} else if (dm) {
- *final_r = dm;
+ finaldm = dm;
} else if (!deformedVerts && cage_r && *cage_r) {
- *final_r = *cage_r;
+ finaldm = *cage_r;
} else {
- *final_r = getEditDerivedBMesh(em, ob, deformedVerts);
+ finaldm = getEditDerivedBMesh(em, ob, deformedVerts);
deformedVerts = NULL;
}
+ finaldm->calcNormals(finaldm);
+
+ *final_r = finaldm;
+
/* add an orco layer if needed */
if(dataMask & CD_MASK_ORCO)
add_orco_dm(ob, em, *final_r, orcodm, CD_ORCO);
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2011-11-13 15:10:54 UTC (rev 41796)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2011-11-13 15:13:59 UTC (rev 41797)
@@ -1580,37 +1580,17 @@
}
-static void cdDM_recalcTesselation(DerivedMesh *dm)
+void CDDM_recalc_tesselation(DerivedMesh *dm)
{
CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
dm->numFaceData = mesh_recalcTesselation(&dm->faceData, &dm->loopData,
&dm->polyData, cddm->mvert, dm->numFaceData, dm->numLoopData,
- dm->numPolyData, 1, 0);
+ dm->numPolyData);
cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
}
-/*ignores original poly origindex layer*/
-static void cdDM_recalcTesselation2(DerivedMesh *dm)
-{
- CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
-
- dm->numFaceData = mesh_recalcTesselation(&dm->faceData, &dm->loopData,
- &dm->polyData, cddm->mvert, dm->numFaceData, dm->numLoopData,
- dm->numPolyData, 0, 0);
-
- cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
-}
-
-void CDDM_recalc_tesselation(DerivedMesh *dm, int orig_use_polyorig)
-{
- if (orig_use_polyorig)
- cdDM_recalcTesselation(dm);
- else
- cdDM_recalcTesselation2(dm);
-}
-
static void cdDM_free_internal(CDDerivedMesh *cddm)
{
if(cddm->fmap) MEM_freeN(cddm->fmap);
@@ -1662,9 +1642,10 @@
dm->getVertDataArray = DM_get_vert_data_layer;
dm->getEdgeDataArray = DM_get_edge_data_layer;
dm->getTessFaceDataArray = DM_get_tessface_data_layer;
-
+
+ dm->calcNormals = CDDM_calc_normals;
//doesn't work yet for all cases
- //dm->recalcTesselation = cdDM_recalcTesselation;
+ //dm->recalcTesselation = CDDM_recalc_tesselation;
dm->getVertCos = cdDM_getVertCos;
dm->getVertCo = cdDM_getVertCo;
@@ -1708,6 +1689,7 @@
CustomData_add_layer(&dm->vertData, CD_ORIGINDEX, CD_CALLOC, NULL, numVerts);
CustomData_add_layer(&dm->edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges);
CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_CALLOC, NULL, numFaces);
+ CustomData_add_layer(&dm->faceData, CD_POLYINDEX, CD_CALLOC, NULL, numFaces);
CustomData_add_layer(&dm->polyData, CD_ORIGINDEX, CD_CALLOC, NULL, numPolys);
CustomData_add_layer(&dm->vertData, CD_MVERT, CD_CALLOC, NULL, numVerts);
@@ -1731,6 +1713,7 @@
DerivedMesh *dm = &cddm->dm;
CustomDataMask mask = CD_MASK_MESH & (~CD_MASK_MDISPS);
int alloctype;
+ int *polyindex = NULL;
/* this does a referenced copy, with an exception for fluidsim */
@@ -1745,7 +1728,7 @@
mesh->totvert);
CustomData_merge(&mesh->edata, &dm->edgeData, mask, alloctype,
mesh->totedge);
- CustomData_merge(&mesh->fdata, &dm->faceData, mask|CD_MASK_ORIGINDEX, alloctype,
+ CustomData_merge(&mesh->fdata, &dm->faceData, mask|CD_MASK_POLYINDEX, alloctype,
mesh->totface);
CustomData_merge(&mesh->ldata, &dm->loopData, mask, alloctype,
mesh->totloop);
@@ -1758,9 +1741,13 @@
cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
- if (!CustomData_has_layer(&cddm->dm.faceData, CD_ORIGINDEX))
- CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totface);
+ BLI_assert(CustomData_has_layer(&cddm->dm.faceData, CD_POLYINDEX));
+ polyindex = CustomData_get_layer(&dm->faceData, CD_POLYINDEX);
+ if (!CustomData_has_layer(&cddm->dm.faceData, CD_ORIGINDEX)) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list