[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