[Bf-blender-cvs] Git Commit [f06c02b] master: Support for symmetrical box masking in sculpt mode.

Antony Riakiotakis noreply at git.blender.org
Fri Nov 15 21:21:15 CET 2013


Commit: f06c02b8dd5b97de68e4f173a43e4f2eaf41993a
Author: Antony Riakiotakis
Date:   Fri Nov 15 22:20:51 2013 +0200
http://developer.blender.org/rBf06c02b8dd5b97de68e4f173a43e4f2eaf41993a

Support for symmetrical box masking in sculpt mode.

Now box masking will take the symmetry options into account.

===================================================================

M	source/blender/editors/sculpt_paint/paint_mask.c

===================================================================

diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c
index 980223e..c563305 100644
--- a/source/blender/editors/sculpt_paint/paint_mask.c
+++ b/source/blender/editors/sculpt_paint/paint_mask.c
@@ -163,14 +163,31 @@ static int is_effected(float planes[4][4], const float co[3])
 	return isect_point_planes_v3(planes, 4, co);
 }
 
+static void flip_plane(float out[4], const float in[4], const char symm)
+{
+	if (symm & SCULPT_SYMM_X)
+		out[0] = -in[0];
+	else
+		out[0] = in[0];
+	if (symm & SCULPT_SYMM_Y)
+		out[1] = -in[1];
+	else
+		out[1] = in[1];
+	if (symm & SCULPT_SYMM_Z)
+		out[2] = -in[2];
+	else
+		out[2] = in[2];
+
+	out[3] = in[3];
+}
+
 int do_sculpt_mask_box_select(ViewContext *vc, rcti *rect, bool select, bool UNUSED(extend))
 {
-#ifdef _OPENMP
 	Sculpt *sd = vc->scene->toolsettings->sculpt;
-#endif
 	BoundBox bb;
 	bglMats mats = {{0}};
 	float clip_planes[4][4];
+	float clip_planes_final[4][4];
 	ARegion *ar = vc->ar;
 	struct Scene *scene = vc->scene;
 	Object *ob = vc->obact;
@@ -180,7 +197,8 @@ int do_sculpt_mask_box_select(ViewContext *vc, rcti *rect, bool select, bool UNU
 	DerivedMesh *dm;
 	PBVH *pbvh;
 	PBVHNode **nodes;
-	int totnode, i;
+	int totnode, i, symmpass;
+	int symm = sd->flags & 7;
 
 	mode = PAINT_MASK_FLOOD_VALUE;
 	value = select ? 1.0 : 0.0;
@@ -196,31 +214,46 @@ int do_sculpt_mask_box_select(ViewContext *vc, rcti *rect, bool select, bool UNU
 	pbvh = dm->getPBVH(ob, dm);
 	ob->sculpt->pbvh = pbvh;
 
-	BKE_pbvh_search_gather(pbvh, BKE_pbvh_node_planes_contain_AABB, clip_planes, &nodes, &totnode);
-
 	sculpt_undo_push_begin("Mask box fill");
 
+	for (symmpass = 0; symmpass <= symm; ++symmpass) {
+		if (symmpass == 0 ||
+			(symm & symmpass &&
+			 (symm != 5 || symmpass != 3) &&
+			 (symm != 6 || (symmpass != 3 && symmpass != 5))))
+		{
+			int j = 0;
+
+			/* flip the planes symmetrically as needed */
+			for (; j < 4; j++) {
+				flip_plane(clip_planes_final[j], clip_planes[j], symmpass);
+			}
+
+			BKE_pbvh_search_gather(pbvh, BKE_pbvh_node_planes_contain_AABB, clip_planes_final, &nodes, &totnode);
+
 #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
-	for (i = 0; i < totnode; i++) {
-		PBVHVertexIter vi;
+			for (i = 0; i < totnode; i++) {
+				PBVHVertexIter vi;
 
-		sculpt_undo_push_node(ob, nodes[i], SCULPT_UNDO_MASK);
+				sculpt_undo_push_node(ob, nodes[i], SCULPT_UNDO_MASK);
 
-		BKE_pbvh_vertex_iter_begin(pbvh, nodes[i], vi, PBVH_ITER_UNIQUE) {
-			if (is_effected(clip_planes, vi.co))
-				mask_flood_fill_set_elem(vi.mask, mode, value);
-		} BKE_pbvh_vertex_iter_end;
+				BKE_pbvh_vertex_iter_begin(pbvh, nodes[i], vi, PBVH_ITER_UNIQUE) {
+					if (is_effected(clip_planes_final, vi.co))
+						mask_flood_fill_set_elem(vi.mask, mode, value);
+				} BKE_pbvh_vertex_iter_end;
 
-		BKE_pbvh_node_mark_update(nodes[i]);
-		if (BKE_pbvh_type(pbvh) == PBVH_GRIDS)
-			multires_mark_as_modified(ob, MULTIRES_COORDS_MODIFIED);
+				BKE_pbvh_node_mark_update(nodes[i]);
+				if (BKE_pbvh_type(pbvh) == PBVH_GRIDS)
+					multires_mark_as_modified(ob, MULTIRES_COORDS_MODIFIED);
+			}
+
+			if (nodes)
+				MEM_freeN(nodes);
+		}
 	}
 
 	sculpt_undo_push_end();
 
-	if (nodes)
-		MEM_freeN(nodes);
-
 	ED_region_tag_redraw(ar);
 
 	return OPERATOR_FINISHED;




More information about the Bf-blender-cvs mailing list