[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