[Bf-blender-cvs] [9ccec0a] blender-v2.76-release: Fix T46389: Shrinkwrap fails in editmode

Campbell Barton noreply at git.blender.org
Fri Oct 9 13:32:52 CEST 2015


Commit: 9ccec0a288dbb779424d6f7888633b23071848b6
Author: Campbell Barton
Date:   Tue Oct 6 17:55:15 2015 +1100
Branches: blender-v2.76-release
https://developer.blender.org/rB9ccec0a288dbb779424d6f7888633b23071848b6

Fix T46389: Shrinkwrap fails in editmode

Own regression caused by fix for T46067,
edit-mode bvh only contained unselected faces.

This commit adds support for an edit-mode bvh containing all faces.

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

M	source/blender/blenkernel/BKE_bvhutils.h
M	source/blender/blenkernel/intern/bvhutils.c
M	source/blender/blenkernel/intern/shrinkwrap.c

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

diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h
index 18eda63..749b0db 100644
--- a/source/blender/blenkernel/BKE_bvhutils.h
+++ b/source/blender/blenkernel/BKE_bvhutils.h
@@ -68,7 +68,8 @@ typedef struct BVHTreeFromMesh {
 	float sphere_radius;
 
 	/* Private data */
-	void *em_evil;  /* var only for snapping */
+	void *em_evil;
+	bool  em_evil_all;  /* ignore selection/hidden state, adding all loops to the tree */
 	bool cached;
 
 } BVHTreeFromMesh;
@@ -141,8 +142,11 @@ enum {
 	BVHTREE_FROM_VERTS           = 0,
 	BVHTREE_FROM_EDGES           = 1,
 	BVHTREE_FROM_FACES           = 2,
-	BVHTREE_FROM_FACES_EDITMESH  = 3,
-	BVHTREE_FROM_LOOPTRI         = 4,
+	BVHTREE_FROM_LOOPTRI         = 3,
+	/* all faces */
+	BVHTREE_FROM_FACES_EDITMESH_ALL     = 4,
+	/* visible unselected, only used for transform snapping */
+	BVHTREE_FROM_FACES_EDITMESH_SNAP    = 5,
 };
 
 typedef struct LinkNode *BVHCache;
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index 626be0e..5b904d4 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -646,7 +646,10 @@ static BVHTree *bvhtree_from_mesh_faces_create_tree(
 						insert = insert_prev;
 					}
 					else if (insert) {
-						if (BM_elem_flag_test(f, BM_ELEM_SELECT) || BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
+						if (tree_type == BVHTREE_FROM_FACES_EDITMESH_ALL) {
+							/* pass */
+						}
+						else if (BM_elem_flag_test(f, BM_ELEM_SELECT) || BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
 							/* Don't insert triangles tessellated from faces that are hidden or selected */
 							insert = false;
 						}
@@ -746,7 +749,9 @@ static void bvhtree_from_mesh_faces_setup_data(
 BVHTree *bvhtree_from_mesh_faces(BVHTreeFromMesh *data, DerivedMesh *dm, float epsilon, int tree_type, int axis)
 {
 	BMEditMesh *em = data->em_evil;
-	const int bvhcache_type = em ? BVHTREE_FROM_FACES_EDITMESH : BVHTREE_FROM_FACES;
+	const int bvhcache_type = em ?
+	        (data->em_evil_all ? BVHTREE_FROM_FACES_EDITMESH_ALL : BVHTREE_FROM_FACES_EDITMESH_SNAP) :
+	        BVHTREE_FROM_FACES;
 	BVHTree *tree;
 	MVert *vert = NULL;
 	MFace *face = NULL;
@@ -881,7 +886,10 @@ static BVHTree *bvhtree_from_mesh_looptri_create_tree(
 						insert = insert_prev;
 					}
 					else if (insert) {
-						if (BM_elem_flag_test(f, BM_ELEM_SELECT) || BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
+						if (tree_type == BVHTREE_FROM_FACES_EDITMESH_ALL) {
+							/* pass */
+						}
+						else if (BM_elem_flag_test(f, BM_ELEM_SELECT) || BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
 							/* Don't insert triangles tessellated from faces that are hidden or selected */
 							insert = false;
 						}
@@ -986,7 +994,9 @@ static void bvhtree_from_mesh_looptri_setup_data(
 BVHTree *bvhtree_from_mesh_looptri(BVHTreeFromMesh *data, DerivedMesh *dm, float epsilon, int tree_type, int axis)
 {
 	BMEditMesh *em = data->em_evil;
-	const int bvhcache_type = em ? BVHTREE_FROM_FACES_EDITMESH : BVHTREE_FROM_LOOPTRI;
+	const int bvhcache_type = em ?
+	        (data->em_evil_all ? BVHTREE_FROM_FACES_EDITMESH_ALL : BVHTREE_FROM_FACES_EDITMESH_SNAP) :
+	        BVHTREE_FROM_LOOPTRI;
 	BVHTree *tree;
 	MVert *mvert = NULL;
 	MLoop *mloop = NULL;
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index 7d49258..40c58ce 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -282,9 +282,11 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, bool for
 	/* use editmesh to avoid array allocation */
 	if (calc->smd->target && calc->target->type == DM_TYPE_EDITBMESH) {
 		treeData.em_evil = BKE_editmesh_from_object(calc->smd->target);
+		treeData.em_evil_all = true;
 	}
 	if (calc->smd->auxTarget && auxMesh->type == DM_TYPE_EDITBMESH) {
 		auxData.em_evil = BKE_editmesh_from_object(calc->smd->auxTarget);
+		auxData.em_evil_all = true;
 	}
 
 	/* After sucessufuly build the trees, start projection vertexs */




More information about the Bf-blender-cvs mailing list