From 2160f36fea5ec0f7cd2747f8889f6005a14d9e6c Mon Sep 17 00:00:00 2001 From: Andre Susano Pinto Date: Tue, 4 Aug 2009 18:03:04 +0000 Subject: [PATCH] Fix point-hint --- .../render/intern/raytrace/rayobject_vbvh.cpp | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp index 774a465092d..5c9807baa29 100644 --- a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp +++ b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp @@ -345,24 +345,32 @@ void bvh_dfs_make_hint_push_siblings(Node *node, LCTSHint *hint, int reserve_spa bvh_dfs_make_hint_push_siblings(node->sibling, hint, reserve_space+1, min, max); bvh_dfs_make_hint(node, hint, reserve_space, min, max); - } - - + } } template void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, float *min, float *max) { - assert( hint->size - reserve_space + 1 <= RE_RAY_LCTS_MAX_SIZE ); + assert( hint->size + reserve_space + 1 <= RE_RAY_LCTS_MAX_SIZE ); - if(hint->size - reserve_space + 1 == RE_RAY_LCTS_MAX_SIZE || !RayObject_isAligned(node)) + if(!RayObject_isAligned(node)) + { hint->stack[hint->size++] = (RayObject*)node; + } else { - /* We are 100% sure the ray will be pass inside this node */ - if(bb_fits_inside(node->bb, node->bb+3, min, max) ) + int childs = count_childs(node); + if(hint->size + reserve_space + childs <= RE_RAY_LCTS_MAX_SIZE) { - bvh_dfs_make_hint_push_siblings(node->child, hint, reserve_space, min, max); + /* We are 100% sure the ray will be pass inside this node */ + if(bb_fits_inside(node->bb, node->bb+3, min, max) ) + { + bvh_dfs_make_hint_push_siblings(node->child, hint, reserve_space, min, max); + } + else + { + hint->stack[hint->size++] = (RayObject*)node; + } } else {