[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [10906] trunk/blender/source/blender/src/ multires.c: == Multires ==

Nicholas Bishop nicholasbishop at gmail.com
Sun Jun 10 08:00:45 CEST 2007


Revision: 10906
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=10906
Author:   nicholasbishop
Date:     2007-06-10 08:00:42 +0200 (Sun, 10 Jun 2007)

Log Message:
-----------
== Multires ==

Modified the vert_edge_map and vert_face_map arrays in MultiresLevel so that the data is stored only for as long as it is needed -- for adding levels and updating levels. Once the modifications are 
complete, the mapping data is deleted, which provides a large reduction in memory usage for a minor increase in processing time for updating levels.

Modified Paths:
--------------
    trunk/blender/source/blender/src/multires.c

Modified: trunk/blender/source/blender/src/multires.c
===================================================================
--- trunk/blender/source/blender/src/multires.c	2007-06-10 04:10:25 UTC (rev 10905)
+++ trunk/blender/source/blender/src/multires.c	2007-06-10 06:00:42 UTC (rev 10906)
@@ -609,8 +609,6 @@
 
 	multires_load_cols(me);
 
-	multires_calc_level_maps(lvl);
-	
 	allqueue(REDRAWBUTSEDIT, 0);
 
 	BIF_undo_push("Make multires");
@@ -641,7 +639,7 @@
 		lvl->colfaces= MEM_dupallocN(orig->colfaces);
 		lvl->edges= MEM_dupallocN(orig->edges);
 		lvl->vert_edge_map= lvl->vert_face_map= NULL;
-		multires_calc_level_maps(lvl);
+		lvl->map_mem= NULL;
 		
 		return lvl;
 	}
@@ -700,6 +698,19 @@
 	}
 }
 
+/* Free and clear the vert-edge-face maps */
+void multires_free_maps(MultiresLevel *lvl)
+{
+	if(lvl) {
+		if(lvl->vert_edge_map) MEM_freeN(lvl->vert_edge_map);
+		if(lvl->vert_face_map) MEM_freeN(lvl->vert_face_map);
+		if(lvl->map_mem) MEM_freeN(lvl->map_mem);
+
+		lvl->vert_edge_map = lvl->vert_face_map = NULL;
+		lvl->map_mem = NULL;
+	}
+}
+
 /* Does not actually free lvl itself! */
 void multires_free_level(MultiresLevel *lvl)
 {
@@ -708,10 +719,7 @@
 		if(lvl->edges) MEM_freeN(lvl->edges);
 		if(lvl->colfaces) MEM_freeN(lvl->colfaces);
 		
-		/* Free all vertex maps */
-		MEM_freeN(lvl->vert_edge_map);
-		MEM_freeN(lvl->vert_face_map);
-		MEM_freeN(lvl->map_mem);
+		multires_free_maps(lvl);
 	}
 }
 
@@ -880,6 +888,8 @@
 		lvl->prev->faces[i].mid= lvl->prev->totvert + lvl->prev->totedge + i;
 	}
 
+	multires_calc_level_maps(lvl->prev);
+
 	/* Create faces
 	   ============ */
 	/* Allocate all the new faces (each triangle creates three, and
@@ -936,8 +946,6 @@
 		}
 	}
 
-	multires_calc_level_maps(lvl);
-	
 	/* Smooth vertices
 	   =============== */
 	for(i=0; i<lvl->prev->totface; ++i) {
@@ -976,6 +984,7 @@
 		}
 	}
 
+	multires_free_maps(lvl->prev);
 	MEM_freeN(oldverts);
 
 	/* Vertex Colors
@@ -1385,6 +1394,8 @@
 	pr_lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
 	cr_lvl= pr_lvl->next;
 	while(cr_lvl) {
+		multires_calc_level_maps(pr_lvl);
+
 		/* Swap the old/new deltas */
 		swap_deltas= pr_deltas;
 		pr_deltas= cr_deltas;
@@ -1437,6 +1448,8 @@
 				&cr_deltas[i].x);			
 		}
 
+		multires_free_maps(pr_lvl);
+
 		pr_lvl= pr_lvl->next;
 		cr_lvl= cr_lvl->next;
 	}





More information about the Bf-blender-cvs mailing list