[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44933] trunk/blender/source/blender: Reduce poly map memory usage (used by sculpt smooth brush.)

Nicholas Bishop nicholasbishop at gmail.com
Sat Mar 17 05:41:53 CET 2012


Revision: 44933
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44933
Author:   nicholasbishop
Date:     2012-03-17 04:41:36 +0000 (Sat, 17 Mar 2012)
Log Message:
-----------
Reduce poly map memory usage (used by sculpt smooth brush.)

Changed the create_vert_poly_map function to return a more compact
structure. Memory saved will vary depending on the mesh, but typically
it should be about one third of the old size.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/BKE_paint.h
    trunk/blender/source/blender/blenkernel/BKE_subsurf.h
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenkernel/intern/multires.c
    trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2012-03-16 23:44:08 UTC (rev 44932)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2012-03-17 04:41:36 UTC (rev 44933)
@@ -301,7 +301,7 @@
 
 	/* Get a map of vertices to faces
 	 */
-	struct ListBase *(*getPolyMap)(struct Object *ob, DerivedMesh *dm);
+	const struct MeshElemMap *(*getPolyMap)(struct Object *ob, DerivedMesh *dm);
 
 	/* Get the BVH used for paint modes
 	 */

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2012-03-16 23:44:08 UTC (rev 44932)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2012-03-17 04:41:36 UTC (rev 44933)
@@ -251,13 +251,20 @@
 void free_uv_vert_map(UvVertMap *vmap);
 
 /* Connectivity data */
+typedef struct MeshElemMap {
+	int *indices;
+	int count;
+} MeshElemMap;
+	
 typedef struct IndexNode {
 	struct IndexNode *next, *prev;
 	int index;
 } IndexNode;
-void create_vert_poly_map(struct ListBase **map, IndexNode **mem,
-                          struct MPoly *mface, struct MLoop *mloop,
-                          const int totvert, const int totface, const int totloop);
+
+void create_vert_poly_map(MeshElemMap **map, int **mem,
+                          const struct MPoly *mface, const struct MLoop *mloop,
+                          int totvert, int totface, int totloop);
+	
 void create_vert_edge_map(struct ListBase **map, IndexNode **mem, const struct MEdge *medge,
                           const int totvert, const int totedge);
 

Modified: trunk/blender/source/blender/blenkernel/BKE_paint.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_paint.h	2012-03-16 23:44:08 UTC (rev 44932)
+++ trunk/blender/source/blender/blenkernel/BKE_paint.h	2012-03-17 04:41:36 UTC (rev 44933)
@@ -34,6 +34,7 @@
 
 struct Brush;
 struct MDisps;
+struct MeshElemMap;
 struct MFace;
 struct MultireModifierData;
 struct MVert;
@@ -80,7 +81,7 @@
 	struct KeyBlock *kb;
 	
 	/* Mesh connectivity */
-	struct ListBase *pmap;
+	const struct MeshElemMap *pmap;
 
 	/* PBVH acceleration structure */
 	struct PBVH *pbvh;

Modified: trunk/blender/source/blender/blenkernel/BKE_subsurf.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_subsurf.h	2012-03-16 23:44:08 UTC (rev 44932)
+++ trunk/blender/source/blender/blenkernel/BKE_subsurf.h	2012-03-17 04:41:36 UTC (rev 44933)
@@ -38,8 +38,7 @@
 struct DMGridAdjacency;
 struct DMGridData;
 struct DerivedMesh;
-struct IndexNode;
-struct ListBase;
+struct MeshElemMap;
 struct Mesh;
 struct MPoly;
 struct MultiresSubsurf;
@@ -105,11 +104,9 @@
 	int *reverseFaceMap;
 
 	struct PBVH *pbvh;
-	struct ListBase *fmap;
-	struct IndexNode *fmap_mem;
 
-	struct ListBase *pmap;
-	struct IndexNode *pmap_mem;
+	struct MeshElemMap *pmap;
+	int *pmap_mem;
 
 	struct DMGridData **gridData;
 	struct DMGridAdjacency *gridAdjacency;

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2012-03-16 23:44:08 UTC (rev 44932)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2012-03-17 04:41:36 UTC (rev 44933)
@@ -91,11 +91,8 @@
 	int pbvh_draw;
 
 	/* Mesh connectivity */
-	struct ListBase *fmap;
-	struct IndexNode *fmap_mem;
-
-	struct ListBase *pmap;
-	struct IndexNode *pmap_mem;
+	MeshElemMap *pmap;
+	int *pmap_mem;
 } CDDerivedMesh;
 
 /**************** DerivedMesh interface functions ****************/
@@ -215,7 +212,7 @@
 	normal_short_to_float_v3(no_r, cddm->mvert[index].no);
 }
 
-static ListBase *cdDM_getPolyMap(Object *ob, DerivedMesh *dm)
+const static MeshElemMap *cdDM_getPolyMap(Object *ob, DerivedMesh *dm)
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
 
@@ -1530,9 +1527,6 @@
 
 static void cdDM_free_internal(CDDerivedMesh *cddm)
 {
-	if(cddm->fmap) MEM_freeN(cddm->fmap);
-	if(cddm->fmap_mem) MEM_freeN(cddm->fmap_mem);
-
 	if(cddm->pmap) MEM_freeN(cddm->pmap);
 	if(cddm->pmap_mem) MEM_freeN(cddm->pmap_mem);
 }

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-03-16 23:44:08 UTC (rev 44932)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-03-17 04:41:36 UTC (rev 44933)
@@ -2189,25 +2189,49 @@
 /* Generates a map where the key is the vertex and the value is a list
  * of polys that use that vertex as a corner. The lists are allocated
  * from one memory pool. */
-void create_vert_poly_map(ListBase **map, IndexNode **mem,
-                          MPoly *mpoly, MLoop *mloop,
-                          const int totvert, const int totpoly, const int totloop)
+void create_vert_poly_map(MeshElemMap **map, int **mem,
+                          const MPoly *mpoly, const MLoop *mloop,
+                          int totvert, int totpoly, int totloop)
 {
-	int i,j;
-	IndexNode *node = NULL;
-	MPoly *mp;
-	MLoop *ml;
+	int i, j;
+	int *indices;
 
-	(*map) = MEM_callocN(sizeof(ListBase) * totvert, "vert face map");
-	(*mem) = MEM_callocN(sizeof(IndexNode) * totloop, "vert poly map mem");
-	node = *mem;
+	(*map) = MEM_callocN(sizeof(MeshElemMap) * totvert, "vert poly map");
+	(*mem) = MEM_mallocN(sizeof(int) * totloop, "vert poly map mem");
 
+	printf("pmap old=%f, new=%f\n",
+		   (sizeof(ListBase) * totvert +
+			sizeof(IndexNode) * totloop) / 1024.0f / 1024.0f,
+		   (sizeof(MeshElemMap) * totvert +
+			sizeof(int) * totloop) / 1024.0f / 1024.0f);
+
+	/* Count number of polys for each vertex */
+	for (i = 0; i < totpoly; i++) {
+		const MPoly *p = &mpoly[i];
+		
+		for (j = 0; j < p->totloop; j++)
+			(*map)[mloop[p->loopstart + j].v].count++;
+	}
+
+	/* Assign indices mem */
+	indices = (*mem);
+	for (i = 0; i < totvert; i++) {
+		(*map)[i].indices = indices;
+		indices += (*map)[i].count;
+
+		/* Reset 'count' for use as index in last loop */
+		(*map)[i].count = 0;
+	}
+		
 	/* Find the users */
-	for (i = 0, mp = mpoly; i < totpoly; ++i, ++mp) {
-		ml = &mloop[mp->loopstart];
-		for (j = 0; j < mp->totloop; ++j, ++node, ++ml) {
-			node->index = i;
-			BLI_addtail(&(*map)[ml->v], node);
+	for (i = 0; i < totpoly; i++) {
+		const MPoly *p = &mpoly[i];
+		
+		for (j = 0; j < p->totloop; j++) {
+			int v = mloop[p->loopstart + j].v;
+			
+			(*map)[v].indices[(*map)[v].count] = i;
+			(*map)[v].count++;
 		}
 	}
 }

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2012-03-16 23:44:08 UTC (rev 44932)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2012-03-17 04:41:36 UTC (rev 44933)
@@ -691,9 +691,9 @@
 {
 	DerivedMesh *cddm, *dispdm, *origdm;
 	Mesh *me;
-	ListBase *pmap;
+	const MeshElemMap *pmap;
 	float (*origco)[3];
-	int i, j, offset, totlvl;
+	int i, j, k, offset, totlvl;
 
 	multires_force_update(ob);
 
@@ -727,22 +727,21 @@
 		copy_v3_v3(origco[i], me->mvert[i].co);
 
 	for (i = 0; i < me->totvert; ++i) {
-		IndexNode *n;
 		float avg_no[3] = {0,0,0}, center[3] = {0,0,0}, push[3];
 		float dist;
 		int tot;
 
 		/* don't adjust verts not used by at least one poly */
-		if (!pmap[i].first)
+		if (!pmap[i].count)
 			continue;
 
 		/* find center */
-		for (n = pmap[i].first, tot = 0; n; n = n->next) {
-			const MPoly *p = &me->mpoly[n->index];
+		for (j = 0; j < pmap[i].count; j++) {
+			const MPoly *p = &me->mpoly[pmap[i].indices[j]];
 			
 			/* this double counts, not sure if that's bad or good */
-			for (j = 0; j < p->totloop; ++j) {
-				int vndx = me->mloop[p->loopstart + j].v;
+			for (k = 0; k < p->totloop; ++k) {
+				int vndx = me->mloop[p->loopstart + k].v;
 				if (vndx != i) {
 					add_v3_v3(center, origco[vndx]);
 					++tot;
@@ -752,8 +751,8 @@
 		mul_v3_fl(center, 1.0f / tot);
 
 		/* find normal */
-		for (n = pmap[i].first; n; n = n->next) {
-			const MPoly *p = &me->mpoly[n->index];
+		for (j = 0; j < pmap[i].count; j++) {
+			const MPoly *p = &me->mpoly[pmap[i].indices[j]];
 			MPoly fake_poly;
 			MLoop *fake_loops;
 			float (*fake_co)[3];
@@ -766,15 +765,15 @@
 			fake_loops = MEM_mallocN(sizeof(MLoop) * p->totloop, "fake_loops");
 			fake_co = MEM_mallocN(sizeof(float) * 3 * p->totloop, "fake_co");
 			
-			for (j = 0; j < p->totloop; ++j) {
-				int vndx = me->mloop[p->loopstart + j].v;
+			for (k = 0; k < p->totloop; ++k) {
+				int vndx = me->mloop[p->loopstart + k].v;
 				
-				fake_loops[j].v = j;
+				fake_loops[k].v = k;
 				
 				if (vndx == i)
-					copy_v3_v3(fake_co[j], center);
+					copy_v3_v3(fake_co[k], center);
 				else
-					copy_v3_v3(fake_co[j], origco[vndx]);
+					copy_v3_v3(fake_co[k], origco[vndx]);
 			}
 			
 			mesh_calc_poly_normal_coords(&fake_poly, fake_loops,

Modified: trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2012-03-16 23:44:08 UTC (rev 44932)
+++ trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2012-03-17 04:41:36 UTC (rev 44933)
@@ -2411,8 +2411,6 @@
 			MEM_freeN(ccgdm->gridHidden);
 		}
 		if(ccgdm->freeSS) ccgSubSurf_free(ccgdm->ss);
-		if(ccgdm->fmap) MEM_freeN(ccgdm->fmap);
-		if(ccgdm->fmap_mem) MEM_freeN(ccgdm->fmap_mem);
 		if(ccgdm->pmap) MEM_freeN(ccgdm->pmap);
 		if(ccgdm->pmap_mem) MEM_freeN(ccgdm->pmap_mem);
 		MEM_freeN(ccgdm->edgeFlags);
@@ -2790,7 +2788,7 @@
 	return ccgdm->gridHidden;
 }
 
-static ListBase *ccgDM_getPolyMap(Object *ob, DerivedMesh *dm)
+const static MeshElemMap *ccgDM_getPolyMap(Object *ob, DerivedMesh *dm)
 {
 	CCGDerivedMesh *ccgdm= (CCGDerivedMesh*)dm;
 

Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2012-03-16 23:44:08 UTC (rev 44932)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2012-03-17 04:41:36 UTC (rev 44933)
@@ -904,28 +904,27 @@
  * polygon.) */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list