[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21320] branches/soc-2009-jaguarandi/ source/blender/render/intern: *RTBuilder now supports splitting leafs in N leafs
André Pinto
andresusanopinto at gmail.com
Thu Jul 2 17:45:15 CEST 2009
Revision: 21320
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21320
Author: jaguarandi
Date: 2009-07-02 17:45:15 +0200 (Thu, 02 Jul 2009)
Log Message:
-----------
*RTBuilder now supports splitting leafs in N leafs
something is wrong on rayobject_bvh as it looks slower than BLI_bvh and code is based on it
Modified Paths:
--------------
branches/soc-2009-jaguarandi/source/blender/render/intern/include/rayobject_rtbuild.h
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_rtbuild.c
Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/include/rayobject_rtbuild.h
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/include/rayobject_rtbuild.h 2009-07-02 15:05:46 UTC (rev 21319)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/include/rayobject_rtbuild.h 2009-07-02 15:45:15 UTC (rev 21320)
@@ -41,7 +41,7 @@
* generate with simple calls, and then convert to the theirs
* specific structure on the fly.
*/
-#define MAX_CHILDS 32
+#define RTBUILD_MAX_CHILDS 32
typedef struct RTBuilder
{
/* list to all primitives in this tree */
@@ -51,7 +51,7 @@
int split_axis;
/* child partitions calculated during splitting */
- int child_offset[MAX_CHILDS+1];
+ int child_offset[RTBUILD_MAX_CHILDS+1];
} RTBuilder;
@@ -67,5 +67,6 @@
/* Calculates child partitions and returns number of efectively needed partitions */
int rtbuild_mean_split(RTBuilder *b, int nchilds, int axis);
int rtbuild_mean_split_largest_axis(RTBuilder *b, int nchilds);
+int rtbuild_get_largest_axis(RTBuilder *b);
#endif
Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c 2009-07-02 15:05:46 UTC (rev 21319)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c 2009-07-02 15:45:15 UTC (rev 21320)
@@ -296,6 +296,7 @@
RE_RC_COUNT(isec->count->raycast.test);
/* Setup vars used on raycast */
+ isec->labda *= Normalize(isec->vec);
isec->dist = VecLength(isec->vec);
for(i=0; i<3; i++)
Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c 2009-07-02 15:05:46 UTC (rev 21319)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c 2009-07-02 15:45:15 UTC (rev 21320)
@@ -35,7 +35,7 @@
#include "rayobject_rtbuild.h"
#include "rayobject.h"
-#define BVH_NCHILDS 2
+#define BVH_NCHILDS 4
typedef struct BVHTree BVHTree;
static int bvh_intersect(BVHTree *obj, Isect *isec);
@@ -57,7 +57,7 @@
struct BVHNode
{
BVHNode *child[BVH_NCHILDS];
- float bb[2][3];
+ float *bb; //[6]; //[2][3];
};
struct BVHTree
@@ -65,6 +65,7 @@
RayObject rayobj;
BVHNode *alloc, *next_node, *root;
+ float *bb_alloc, *bb_next;
RTBuilder *builder;
};
@@ -90,6 +91,9 @@
if(obj->alloc)
MEM_freeN(obj->alloc);
+ if(obj->bb_alloc)
+ MEM_freeN(obj->bb_alloc);
+
MEM_freeN(obj);
}
@@ -99,8 +103,8 @@
if(RayObject_isAligned(node))
{
//TODO only half operations needed
- DO_MINMAX(node->bb[0], min, max);
- DO_MINMAX(node->bb[1], min, max);
+ DO_MINMAX(node->bb , min, max);
+ DO_MINMAX(node->bb+3, min, max);
}
else
{
@@ -121,18 +125,40 @@
int hit = 0;
if(RE_rayobject_bb_intersect(isec, (const float*)node->bb) != FLT_MAX)
{
- int i;
- for(i=0; i<BVH_NCHILDS; i++)
- if(RayObject_isAligned(node->child[i]))
- {
- hit |= dfs_raycast(node->child[i], isec);
- if(hit && isec->mode == RE_RAY_SHADOW) return hit;
- }
- else
- {
- hit |= RE_rayobject_intersect( (RayObject*)node->child[i], isec);
- if(hit && isec->mode == RE_RAY_SHADOW) return hit;
- }
+// if(isec->idot_axis[node->split_axis] > 0.0f)
+ {
+ int i;
+ for(i=0; i<BVH_NCHILDS; i++)
+ if(RayObject_isAligned(node->child[i]))
+ {
+ if(node->child[i] == 0) break;
+
+ hit |= dfs_raycast(node->child[i], isec);
+ if(hit && isec->mode == RE_RAY_SHADOW) return hit;
+ }
+ else
+ {
+ hit |= RE_rayobject_intersect( (RayObject*)node->child[i], isec);
+ if(hit && isec->mode == RE_RAY_SHADOW) return hit;
+ }
+ }
+/*
+ else
+ {
+ int i;
+ for(i=BVH_NCHILDS-1; i>=0; i--)
+ if(RayObject_isAligned(node->child[i]))
+ {
+ hit |= dfs_raycast(node->child[i], isec);
+ if(hit && isec->mode == RE_RAY_SHADOW) return hit;
+ }
+ else
+ {
+ hit |= RE_rayobject_intersect( (RayObject*)node->child[i], isec);
+ if(hit && isec->mode == RE_RAY_SHADOW) return hit;
+ }
+ }
+*/
}
return hit;
}
@@ -154,11 +180,36 @@
rtbuild_add( obj->builder, ob );
}
+static BVHNode *bvh_new_node(BVHTree *tree)
+{
+ BVHNode *node = tree->next_node++;
+ node->bb = tree->bb_next;
+ tree->bb_next += 6;
+
+ return node;
+}
+
static BVHNode *bvh_rearrange(BVHTree *tree, RTBuilder *builder)
{
if(rtbuild_size(builder) == 1)
{
- return (BVHNode*)builder->begin[0];
+// return (BVHNode*)builder->begin[0];
+//
+//
+ int i;
+ BVHNode *parent = bvh_new_node(tree);
+
+ INIT_MINMAX(parent->bb, parent->bb+3);
+
+ for(i=0; i<1; i++)
+ {
+ parent->child[i] = (BVHNode*)builder->begin[i];
+ bvh_merge_bb(parent->child[i], parent->bb, parent->bb+3);
+ }
+ for(; i<BVH_NCHILDS; i++)
+ parent->child[i] = 0;
+
+ return parent;
}
else
{
@@ -166,15 +217,17 @@
int nc = rtbuild_mean_split_largest_axis(builder, BVH_NCHILDS);
RTBuilder tmp;
- BVHNode *parent = tree->next_node++;
+ BVHNode *parent = bvh_new_node(tree);
- INIT_MINMAX(parent->bb[0], parent->bb[1]);
+ INIT_MINMAX(parent->bb, parent->bb+3);
// bvh->split_axis = tmp->split_axis;
for(i=0; i<nc; i++)
{
parent->child[i] = bvh_rearrange( tree, rtbuild_get_child(builder, i, &tmp) );
- bvh_merge_bb(parent->child[i], parent->bb[0], parent->bb[1]);
+ bvh_merge_bb(parent->child[i], parent->bb, parent->bb+3);
}
+ for(; i<BVH_NCHILDS; i++)
+ parent->child[i] = 0;
return parent;
}
@@ -189,6 +242,10 @@
assert(needed_nodes > 0);
obj->alloc = (BVHNode*)MEM_mallocN( sizeof(BVHNode)*needed_nodes, "BVHTree.Nodes");
obj->next_node = obj->alloc;
+
+ obj->bb_alloc = (float*)MEM_mallocN( sizeof(float)*6*needed_nodes, "BVHTree.Nodes");
+ obj->bb_next = obj->bb_alloc;
+
obj->root = bvh_rearrange( obj, obj->builder );
assert(obj->alloc+needed_nodes >= obj->next_node);
Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_rtbuild.c
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_rtbuild.c 2009-07-02 15:05:46 UTC (rev 21319)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_rtbuild.c 2009-07-02 15:45:15 UTC (rev 21320)
@@ -1,3 +1,6 @@
+#include <assert.h>
+#include <math.h>
+
#include "rayobject_rtbuild.h"
#include "MEM_guardedalloc.h"
#include "BLI_arithb.h"
@@ -2,3 +5,2 @@
#include "BKE_utildefines.h"
-#include <assert.h>
@@ -16,7 +18,7 @@
b->end = end;
b->split_axis = 0;
- for(i=0; i<MAX_CHILDS; i++)
+ for(i=0; i<RTBUILD_MAX_CHILDS; i++)
b->child_offset[i] = 0;
}
@@ -59,7 +61,7 @@
RE_rayobject_merge_bb(*index, min, max);
}
-static int calc_largest_axis(RTBuilder *b)
+int rtbuild_get_largest_axis(RTBuilder *b)
{
float min[3], max[3], sub[3];
@@ -84,25 +86,44 @@
}
-//Unballanced mean
-//TODO better balance nodes
-//TODO suport for variable number of partitions (its hardcoded in 2)
+//Left balanced tree
int rtbuild_mean_split(RTBuilder *b, int nchilds, int axis)
{
+ int i;
+ int leafs_per_child;
+ int tot_leafs = rtbuild_size(b);
+
+ long long s;
+
+ assert(nchilds <= RTBUILD_MAX_CHILDS);
+
+ //TODO optimize calc of leafs_per_child
+ for(s=nchilds; s<tot_leafs; s*=nchilds);
+ leafs_per_child = s/nchilds;
+
+ assert(leafs_per_child*nchilds >= tot_leafs);
+
b->child_offset[0] = 0;
- b->child_offset[1] = (b->end - b->begin) / 2;
- b->child_offset[2] = (b->end - b->begin);
-
- assert( b->child_offset[0] != b->child_offset[1] && b->child_offset[1] != b->child_offset[2]);
-
- split_leafs(b, b->child_offset, 2, axis);
- return 2;
+ for(i=1; ; i++)
+ {
+ assert(i <= nchilds);
+
+ b->child_offset[i] = b->child_offset[i-1] + leafs_per_child;
+ if(b->child_offset[i] >= tot_leafs)
+ {
+ b->child_offset[i] = tot_leafs;
+ split_leafs(b, b->child_offset, i, axis);
+
+ assert(i > 1);
+ return i;
+ }
+ }
}
int rtbuild_mean_split_largest_axis(RTBuilder *b, int nchilds)
{
- int axis = calc_largest_axis(b);
+ int axis = rtbuild_get_largest_axis(b);
return rtbuild_mean_split(b, nchilds, axis);
}
More information about the Bf-blender-cvs
mailing list