[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53438] trunk/blender/source/blender: Move layer displacements from SculptUndoNode to PBVHNode

Nicholas Bishop nicholasbishop at gmail.com
Sun Dec 30 19:26:12 CET 2012


Revision: 53438
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53438
Author:   nicholasbishop
Date:     2012-12-30 18:26:11 +0000 (Sun, 30 Dec 2012)
Log Message:
-----------
Move layer displacements from SculptUndoNode to PBVHNode

* This doesn't make much difference for regular mesh/multires
  sculpting, but for dynamic topology sculpting the undo stack isn't
  split up by PBVH nodes, so it's more convenient to store the layer
  data in PBVH nodes.

* Note that the life cycle of the layer displacement data is
  unchanged -- it's only valid during a stroke with the layer brush,
  gets free'd when the undo step ends.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_pbvh.h
    trunk/blender/source/blender/blenkernel/intern/pbvh.c
    trunk/blender/source/blender/blenkernel/intern/pbvh_intern.h
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt_intern.h
    trunk/blender/source/blender/editors/sculpt_paint/sculpt_undo.c

Modified: trunk/blender/source/blender/blenkernel/BKE_pbvh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_pbvh.h	2012-12-30 18:25:36 UTC (rev 53437)
+++ trunk/blender/source/blender/blenkernel/BKE_pbvh.h	2012-12-30 18:26:11 UTC (rev 53438)
@@ -156,6 +156,14 @@
                            struct DMGridAdjacency *gridadj, void **gridfaces,
                            struct DMFlagMat *flagmats, unsigned int **grid_hidden);
 
+/* Layer displacement */
+
+/* Get the node's displacement layer, creating it if necessary */
+float *BLI_pbvh_node_layer_disp_get(PBVH *pbvh, PBVHNode *node);
+
+/* If the node has a displacement layer, free it and set to null */
+void BLI_pbvh_node_layer_disp_free(PBVHNode *node);
+
 /* vertex deformer */
 float (*BLI_pbvh_get_vertCos(struct PBVH *pbvh))[3];
 void BLI_pbvh_apply_vertCos(struct PBVH *pbvh, float (*vertCos)[3]);

Modified: trunk/blender/source/blender/blenkernel/intern/pbvh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pbvh.c	2012-12-30 18:25:36 UTC (rev 53437)
+++ trunk/blender/source/blender/blenkernel/intern/pbvh.c	2012-12-30 18:26:11 UTC (rev 53438)
@@ -600,6 +600,7 @@
 				MEM_freeN(node->vert_indices);
 			if (node->face_vert_indices)
 				MEM_freeN(node->face_vert_indices);
+			BLI_pbvh_node_layer_disp_free(node);
 		}
 	}
 
@@ -1611,6 +1612,26 @@
 	}
 }
 
+/* Get the node's displacement layer, creating it if necessary */
+float *BLI_pbvh_node_layer_disp_get(PBVH *bvh, PBVHNode *node)
+{
+	if (!node->layer_disp) {
+		int totvert = 0;
+		BLI_pbvh_node_num_verts(bvh, node, &totvert, NULL);
+		node->layer_disp = MEM_callocN(sizeof(float) * totvert, "layer disp");
+	}
+	return node->layer_disp;
+}
+
+/* If the node has a displacement layer, free it and set to null */
+void BLI_pbvh_node_layer_disp_free(PBVHNode *node)
+{
+	if (node->layer_disp) {
+		MEM_freeN(node->layer_disp);
+		node->layer_disp = NULL;
+	}
+}
+
 float (*BLI_pbvh_get_vertCos(PBVH * pbvh))[3]
 {
 	int a;

Modified: trunk/blender/source/blender/blenkernel/intern/pbvh_intern.h
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pbvh_intern.h	2012-12-30 18:25:36 UTC (rev 53437)
+++ trunk/blender/source/blender/blenkernel/intern/pbvh_intern.h	2012-12-30 18:26:11 UTC (rev 53438)
@@ -91,6 +91,9 @@
 	/* Used for raycasting: how close bb is to the ray point. */
 	float tmin;
 
+	/* Scalar displacements for sculpt mode's layer brush. */
+	float *layer_disp;
+
 	int proxy_count;
 	PBVHProxyNode *proxies;
 };

Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2012-12-30 18:25:36 UTC (rev 53437)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2012-12-30 18:26:11 UTC (rev 53438)
@@ -1908,13 +1908,12 @@
 		
 		unode = sculpt_undo_push_node(ob, nodes[n], SCULPT_UNDO_COORDS);
 		origco = unode->co;
-		if (!unode->layer_disp) {
-			#pragma omp critical 
-			unode->layer_disp = MEM_callocN(sizeof(float) * unode->totvert, "layer disp");
-		}
 
-		layer_disp = unode->layer_disp;
-
+		#pragma omp critical
+		{
+			layer_disp = BLI_pbvh_node_layer_disp_get(ss->pbvh, nodes[n]);
+		}
+		
 		sculpt_brush_test_init(ss, &test);
 
 		BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE)

Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt_intern.h
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt_intern.h	2012-12-30 18:25:36 UTC (rev 53437)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt_intern.h	2012-12-30 18:26:11 UTC (rev 53438)
@@ -101,9 +101,6 @@
 	int *grids;                 /* to restore into right location */
 	BLI_bitmap *grid_hidden;
 
-	/* layer brush */
-	float *layer_disp;
-
 	/* shape keys */
 	char shapeName[sizeof(((KeyBlock *)0))->name];
 } SculptUndoNode;

Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt_undo.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt_undo.c	2012-12-30 18:25:36 UTC (rev 53437)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt_undo.c	2012-12-30 18:26:11 UTC (rev 53438)
@@ -374,8 +374,6 @@
 			MEM_freeN(unode->index);
 		if (unode->grids)
 			MEM_freeN(unode->grids);
-		if (unode->layer_disp)
-			MEM_freeN(unode->layer_disp);
 		if (unode->orig_co)
 			MEM_freeN(unode->orig_co);
 		if (unode->vert_hidden)
@@ -612,10 +610,8 @@
 			unode->no = NULL;
 		}
 
-		if (unode->layer_disp) {
-			MEM_freeN(unode->layer_disp);
-			unode->layer_disp = NULL;
-		}
+		if (unode->node)
+			BLI_pbvh_node_layer_disp_free(unode->node);
 	}
 
 	undo_paint_push_end(UNDO_PAINT_MESH);




More information about the Bf-blender-cvs mailing list