[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22864] branches/soc-2009-jaguarandi/ source/blender/render: Code reorganization

Andre Susano Pinto andresusanopinto at gmail.com
Sat Aug 29 19:24:45 CEST 2009


Revision: 22864
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22864
Author:   jaguarandi
Date:     2009-08-29 19:24:45 +0200 (Sat, 29 Aug 2009)

Log Message:
-----------
Code reorganization
-separated vbvh, svbvh, qbvh in diferent files (before the only way to switch between them was at compile time)

Modified Paths:
--------------
    branches/soc-2009-jaguarandi/source/blender/render/extern/include/RE_raytrace.h
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/bvh.h
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_hint.h
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/reorganize.h
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/svbvh.h
    branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c

Added Paths:
-----------
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/qbvh.h
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
    branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/vbvh.h

Modified: branches/soc-2009-jaguarandi/source/blender/render/extern/include/RE_raytrace.h
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/extern/include/RE_raytrace.h	2009-08-29 17:13:06 UTC (rev 22863)
+++ branches/soc-2009-jaguarandi/source/blender/render/extern/include/RE_raytrace.h	2009-08-29 17:24:45 UTC (rev 22864)
@@ -102,6 +102,8 @@
 RayObject* RE_rayobject_blibvh_create(int size);	/* BLI_kdopbvh.c   */
 RayObject* RE_rayobject_bvh_create(int size);		/* raytrace/rayobject_bvh.c */
 RayObject* RE_rayobject_vbvh_create(int size);		/* raytrace/rayobject_vbvh.c */
+RayObject* RE_rayobject_qbvh_create(int size);		/* raytrace/rayobject_vbvh.c */
+RayObject* RE_rayobject_svbvh_create(int size);		/* raytrace/rayobject_vbvh.c */
 RayObject* RE_rayobject_bih_create(int size);		/* rayobject_bih.c */
 
 typedef struct LCTSHint LCTSHint;

Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/bvh.h
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/bvh.h	2009-08-29 17:13:06 UTC (rev 22863)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/bvh.h	2009-08-29 17:24:45 UTC (rev 22864)
@@ -26,6 +26,12 @@
  *
  * ***** END GPL LICENSE BLOCK *****
  */
+#include "rayobject.h"
+#include "MEM_guardedalloc.h"
+#include "rayobject_rtbuild.h"
+#include "rayobject_hint.h"
+
+#include <assert.h>
 #include <xmmintrin.h>
 
 #ifndef RE_RAYTRACE_BVH_H
@@ -285,7 +291,6 @@
 	return hit;
 }
 
-
 /*
  * recursively transverse a BVH looking for a rayhit using system stack
  */
@@ -336,4 +341,56 @@
 }
 */
 
+template<class Node,class HintObject>
+void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, HintObject *hintObject)
+{
+	assert( hint->size + reserve_space + 1 <= RE_RAY_LCTS_MAX_SIZE );
+	
+	if(is_leaf(node))
+	{
+		hint->stack[hint->size++] = (RayObject*)node;
+	}
+	else
+	{
+		int childs = count_childs(node);
+		if(hint->size + reserve_space + childs <= RE_RAY_LCTS_MAX_SIZE)
+		{
+			int result = hint_test_bb(hintObject, node->bb, node->bb+3);
+			if(result == HINT_RECURSE)
+			{
+				/* We are 100% sure the ray will be pass inside this node */
+				bvh_dfs_make_hint_push_siblings(node->child, hint, reserve_space, hintObject);
+			}
+			else if(result == HINT_ACCEPT)
+			{
+				hint->stack[hint->size++] = (RayObject*)node;
+			}
+		}
+		else
+		{
+			hint->stack[hint->size++] = (RayObject*)node;
+		}
+	}
+}
+
+
+template<class Tree>
+static RayObjectAPI* bvh_get_api(int maxstacksize);
+
+
+template<class Tree, int DFS_STACK_SIZE>
+static inline RayObject *bvh_create_tree(int size)
+{
+	Tree *obj= (Tree*)MEM_callocN(sizeof(Tree), "BVHTree" );
+	assert( RE_rayobject_isAligned(obj) ); /* RayObject API assumes real data to be 4-byte aligned */	
+	
+	obj->rayobj.api = bvh_get_api<Tree>(DFS_STACK_SIZE);
+	obj->root = NULL;
+	
+	obj->node_arena = NULL;
+	obj->builder    = rtbuild_create( size );
+	
+	return RE_rayobject_unalignRayAPI((RayObject*) obj);
+}
+
 #endif

Added: branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/qbvh.h
===================================================================


Property changes on: branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/qbvh.h
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_hint.h
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_hint.h	2009-08-29 17:13:06 UTC (rev 22863)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_hint.h	2009-08-29 17:24:45 UTC (rev 22864)
@@ -26,6 +26,9 @@
  *
  * ***** END GPL LICENSE BLOCK *****
  */
+#ifndef RE_RAYTRACE_RAYOBJECT_HINT_H
+#define RE_RAYTRACE_RAYOBJECT_HINT_H
+
 #define HINT_RECURSE	 1
 #define HINT_ACCEPT		 0
 #define HINT_DISCARD	-1
@@ -63,3 +66,5 @@
 	return HINT_ACCEPT;
 }
 */
+
+#endif

Added: branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_qbvh.cpp	                        (rev 0)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_qbvh.cpp	2009-08-29 17:24:45 UTC (rev 22864)
@@ -0,0 +1,100 @@
+#include "vbvh.h"
+#include "svbvh.h"
+#include "qbvh.h"
+#include "reorganize.h"
+
+#define DFS_STACK_SIZE	256
+
+struct QBVHTree
+{
+	RayObject rayobj;
+
+	SVBVHNode *root;
+	MemArena *node_arena;
+
+	float cost;
+	RTBuilder *builder;
+};
+
+
+template<>
+void bvh_done<QBVHTree>(QBVHTree *obj)
+{
+	rtbuild_done(obj->builder);
+	
+	//TODO find a away to exactly calculate the needed memory
+	MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
+					   BLI_memarena_use_malloc(arena1);
+
+	MemArena *arena2 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
+					   BLI_memarena_use_malloc(arena2);
+					   BLI_memarena_use_align(arena2, 16);
+
+	//Build and optimize the tree
+	VBVHNode *root = BuildBinaryVBVH(arena1).transform(obj->builder);	
+	pushup_simd<VBVHNode,4>(root);					   
+	obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
+	
+	//Cleanup
+	BLI_memarena_free(arena1);	
+	
+	rtbuild_free( obj->builder );
+	obj->builder = NULL;
+
+	obj->node_arena = arena2;
+	obj->cost = 1.0;	
+}
+
+
+template<int StackSize>
+int intersect(QBVHTree *obj, Isect* isec)
+{
+	//TODO renable hint support
+	if(RE_rayobject_isAligned(obj->root))
+		return bvh_node_stack_raycast<SVBVHNode,StackSize,false>( obj->root, isec);
+	else
+		return RE_rayobject_intersect( (RayObject*) obj->root, isec );
+}
+
+template<class Tree>
+void bvh_hint_bb(Tree *tree, LCTSHint *hint, float *min, float *max)
+{
+	//TODO renable hint support
+	{
+	 	hint->size = 0;
+	 	hint->stack[hint->size++] = (RayObject*)tree->root;
+	}
+}
+/* the cast to pointer function is needed to workarround gcc bug: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11407 */
+template<class Tree, int STACK_SIZE>
+RayObjectAPI make_api()
+{
+	static RayObjectAPI api = 
+	{
+		(RE_rayobject_raycast_callback) ((int(*)(Tree*,Isect*)) &intersect<STACK_SIZE>),
+		(RE_rayobject_add_callback)     ((void(*)(Tree*,RayObject*)) &bvh_add<Tree>),
+		(RE_rayobject_done_callback)    ((void(*)(Tree*))       &bvh_done<Tree>),
+		(RE_rayobject_free_callback)    ((void(*)(Tree*))       &bvh_free<Tree>),
+		(RE_rayobject_merge_bb_callback)((void(*)(Tree*,float*,float*)) &bvh_bb<Tree>),
+		(RE_rayobject_cost_callback)	((float(*)(Tree*))      &bvh_cost<Tree>),
+		(RE_rayobject_hint_bb_callback)	((void(*)(Tree*,LCTSHint*,float*,float*)) &bvh_hint_bb<Tree>)
+	};
+	
+	return api;
+}
+
+template<class Tree>
+RayObjectAPI* bvh_get_api(int maxstacksize)
+{
+	static RayObjectAPI bvh_api256 = make_api<Tree,1024>();
+	
+	if(maxstacksize <= 1024) return &bvh_api256;
+	assert(maxstacksize <= 256);
+	return 0;
+}
+
+
+RayObject *RE_rayobject_qbvh_create(int size)
+{
+	return bvh_create_tree<QBVHTree,DFS_STACK_SIZE>(size);
+}


Property changes on: branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_svbvh.cpp	                        (rev 0)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/raytrace/rayobject_svbvh.cpp	2009-08-29 17:24:45 UTC (rev 22864)
@@ -0,0 +1,104 @@
+#include "vbvh.h"
+#include "svbvh.h"
+#include "reorganize.h"
+
+#define DFS_STACK_SIZE	256
+
+struct SVBVHTree
+{
+	RayObject rayobj;
+
+	SVBVHNode *root;
+	MemArena *node_arena;
+
+	float cost;
+	RTBuilder *builder;
+};
+
+
+template<>
+void bvh_done<SVBVHTree>(SVBVHTree *obj)
+{
+	rtbuild_done(obj->builder);
+	
+	//TODO find a away to exactly calculate the needed memory
+	MemArena *arena1 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
+					   BLI_memarena_use_malloc(arena1);
+
+	//Build and optimize the tree
+	VBVHNode *root = BuildBinaryVBVH(arena1).transform(obj->builder);
+
+	reorganize(root);
+	remove_useless(root, &root);
+	bvh_refit(root);
+	
+	pushup(root);
+	pushdown(root);
+	pushup_simd<VBVHNode,4>(root);
+
+	MemArena *arena2 = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
+	BLI_memarena_use_malloc(arena2);
+	BLI_memarena_use_align(arena2, 16);
+	obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
+	
+	BLI_memarena_free(arena1);
+	
+	obj->node_arena = arena2;
+	obj->cost = 1.0;
+	
+	
+	rtbuild_free( obj->builder );
+	obj->builder = NULL;
+}
+
+template<int StackSize>
+int intersect(SVBVHTree *obj, Isect* isec)
+{
+	//TODO renable hint support
+	if(RE_rayobject_isAligned(obj->root))
+		return bvh_node_stack_raycast<SVBVHNode,StackSize,false>( obj->root, isec);
+	else
+		return RE_rayobject_intersect( (RayObject*) obj->root, isec );
+}
+
+template<class Tree>
+void bvh_hint_bb(Tree *tree, LCTSHint *hint, float *min, float *max)
+{
+	//TODO renable hint support
+	{
+	 	hint->size = 0;
+	 	hint->stack[hint->size++] = (RayObject*)tree->root;
+	}
+}
+/* the cast to pointer function is needed to workarround gcc bug: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11407 */
+template<class Tree, int STACK_SIZE>
+RayObjectAPI make_api()
+{
+	static RayObjectAPI api = 
+	{
+		(RE_rayobject_raycast_callback) ((int(*)(Tree*,Isect*)) &intersect<STACK_SIZE>),
+		(RE_rayobject_add_callback)     ((void(*)(Tree*,RayObject*)) &bvh_add<Tree>),
+		(RE_rayobject_done_callback)    ((void(*)(Tree*))       &bvh_done<Tree>),
+		(RE_rayobject_free_callback)    ((void(*)(Tree*))       &bvh_free<Tree>),
+		(RE_rayobject_merge_bb_callback)((void(*)(Tree*,float*,float*)) &bvh_bb<Tree>),
+		(RE_rayobject_cost_callback)	((float(*)(Tree*))      &bvh_cost<Tree>),
+		(RE_rayobject_hint_bb_callback)	((void(*)(Tree*,LCTSHint*,float*,float*)) &bvh_hint_bb<Tree>)
+	};
+	
+	return api;
+}
+
+template<class Tree>
+RayObjectAPI* bvh_get_api(int maxstacksize)
+{
+	static RayObjectAPI bvh_api256 = make_api<Tree,1024>();
+	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list