From 1e6fa59e4f4447bfeecd5abb868361ae1b7ab9ab Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 24 Apr 2014 03:06:02 +1000 Subject: Fix T39852: Crash (Blender internal) large objects Add check when bounds reached inf --- source/blender/render/intern/raytrace/reorganize.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'source/blender') diff --git a/source/blender/render/intern/raytrace/reorganize.h b/source/blender/render/intern/raytrace/reorganize.h index 33b5258dd94..e25538cd584 100644 --- a/source/blender/render/intern/raytrace/reorganize.h +++ b/source/blender/render/intern/raytrace/reorganize.h @@ -288,6 +288,7 @@ static float bvh_refit(Node *node) #define MAX_OPTIMIZE_CHILDS MAX_CUT_SIZE #define CUT_SIZE_IS_VALID(cut_size) ((cut_size) < MAX_CUT_SIZE && (cut_size) >= 0) +#define CUT_SIZE_INVALID -1 struct OVBVHNode { @@ -348,9 +349,9 @@ struct OVBVHNode { { if (RE_rayobject_isAligned(this->child)) { //Calc new childs - { + if (this->best_cutsize != CUT_SIZE_INVALID) { OVBVHNode **cut = &(this->child); - set_cut(best_cutsize, &cut); + set_cut(this->best_cutsize, &cut); *cut = NULL; } @@ -473,12 +474,17 @@ struct VBVH_optimalPackSIMD { } } } - assert(node->cut_cost[0] != INFINITY); + + if (node->cut_cost[0] == INFINITY) { + node->best_cutsize = CUT_SIZE_INVALID; + } } else { node->cut_cost[0] = 1.0f; for (int i = 1; i < MAX_CUT_SIZE; i++) node->cut_cost[i] = INFINITY; + + /* node->best_cutsize can remain unset here */ } } -- cgit v1.2.3