Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2016-04-26 16:01:11 +0300
committerCampbell Barton <ideasman42@gmail.com>2016-04-26 16:02:44 +0300
commit96392c33ef5fea3e77eedaef9748eb3e8e33095c (patch)
treebe4fb32424294ec84403b0c3c16a55200de05134
parent680b135ec1cf220c7ebd579b88bc5481fc379fc3 (diff)
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.
-rw-r--r--source/blender/editors/transform/transform_snap_object.c45
1 files changed, 26 insertions, 19 deletions
diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index 3e53fc3a2e9..484307d12e2 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);
+ }
}
}