[Bf-blender-cvs] [96392c3] master: Correct error in recent snap-context commit

Campbell Barton noreply at git.blender.org
Tue Apr 26 14:59:46 CEST 2016


Commit: 96392c33ef5fea3e77eedaef9748eb3e8e33095c
Author: Campbell Barton
Date:   Tue Apr 26 23:01:11 2016 +1000
Branches: master
https://developer.blender.org/rB96392c33ef5fea3e77eedaef9748eb3e8e33095c

Correct error in recent snap-context commit

Edges currently don't use a BVH-tree,
but would still create and attempt to free the tree.

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

M	source/blender/editors/transform/transform_snap_object.c

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

diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index 3e53fc3..484307d 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -628,7 +628,7 @@ static bool snapDerivedMesh(
 		BVHTreeFromMesh *treedata = NULL, treedata_stack;
 
 		if (sctx->flag & SNAP_OBJECT_USE_CACHE) {
-			int tree_index = 0;
+			int tree_index = -1;
 			switch (snap_to) {
 				case SCE_SNAP_MODE_FACE:
 					tree_index = 1;
@@ -637,34 +637,39 @@ static bool snapDerivedMesh(
 					tree_index = 0;
 					break;
 			}
-			if (sod->bvh_trees[tree_index] == NULL) {
-				sod->bvh_trees[tree_index] = BLI_memarena_alloc(sctx->cache.mem_arena, sizeof(*treedata));
+			if (tree_index != -1) {
+				if (sod->bvh_trees[tree_index] == NULL) {
+					sod->bvh_trees[tree_index] = BLI_memarena_alloc(sctx->cache.mem_arena, sizeof(*treedata));
+				}
+				treedata = sod->bvh_trees[tree_index];
 			}
-			treedata = sod->bvh_trees[tree_index];
 		}
 		else {
-			treedata = &treedata_stack;
-			memset(treedata, 0, sizeof(*treedata));
+			if (ELEM(snap_to, SCE_SNAP_MODE_FACE, SCE_SNAP_MODE_VERTEX)) {
+				treedata = &treedata_stack;
+				memset(treedata, 0, sizeof(*treedata));
+			}
 		}
 
-		treedata->em_evil = em;
-		treedata->em_evil_all = false;
-		switch (snap_to) {
-			case SCE_SNAP_MODE_FACE:
-				bvhtree_from_mesh_looptri(treedata, dm, 0.0f, 4, 6);
-				break;
-			case SCE_SNAP_MODE_VERTEX:
-				bvhtree_from_mesh_verts(treedata, dm, 0.0f, 2, 6);
-				break;
+		if (treedata) {
+			treedata->em_evil = em;
+			treedata->em_evil_all = false;
+			switch (snap_to) {
+				case SCE_SNAP_MODE_FACE:
+					bvhtree_from_mesh_looptri(treedata, dm, 0.0f, 4, 6);
+					break;
+				case SCE_SNAP_MODE_VERTEX:
+					bvhtree_from_mesh_verts(treedata, dm, 0.0f, 2, 6);
+					break;
+			}
 		}
 
 		if (need_ray_start_correction_init) {
 			/* We *need* a reasonably valid len_diff in this case.
 			 * Use BHVTree to find the closest face from ray_start_local.
 			 */
-			BVHTreeNearest nearest;
-
-			if (treedata->tree != NULL) {
+			if (treedata && treedata->tree != NULL) {
+				BVHTreeNearest nearest;
 				nearest.index = -1;
 				nearest.dist_sq = FLT_MAX;
 				/* Compute and store result. */
@@ -804,7 +809,9 @@ static bool snapDerivedMesh(
 		}
 
 		if ((sctx->flag & SNAP_OBJECT_USE_CACHE) == 0) {
-			free_bvhtree_from_mesh(treedata);
+			if (treedata) {
+				free_bvhtree_from_mesh(treedata);
+			}
 		}
 	}




More information about the Bf-blender-cvs mailing list