[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21492] branches/soc-2009-jaguarandi/ source/blender/render/intern: *rtbuild now stores BB

André Pinto andresusanopinto at gmail.com
Fri Jul 10 18:42:51 CEST 2009


Revision: 21492
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21492
Author:   jaguarandi
Date:     2009-07-10 18:42:51 +0200 (Fri, 10 Jul 2009)

Log Message:
-----------
*rtbuild now stores BB
*fix in ray/bb hit tests inside instances

Modified Paths:
--------------
    branches/soc-2009-jaguarandi/source/blender/render/intern/include/rayobject_rtbuild.h
    branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_instance.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-10 15:43:59 UTC (rev 21491)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/include/rayobject_rtbuild.h	2009-07-10 16:42:51 UTC (rev 21492)
@@ -54,6 +54,8 @@
 	int child_offset[RTBUILD_MAX_CHILDS+1];
 	
 	int child_sorted_axis; /* -1 if not sorted */
+	
+	float bb[6];
 
 } RTBuilder;
 
@@ -61,6 +63,7 @@
 RTBuilder* rtbuild_create(int size);
 void rtbuild_free(RTBuilder *b);
 void rtbuild_add(RTBuilder *b, RayObject *o);
+void rtbuild_merge_bb(RTBuilder *b, float *min, float *max);
 int rtbuild_size(RTBuilder *b);
 
 /* used during tree reorganization */
@@ -82,5 +85,7 @@
 
 /* bb utils */
 float bb_area(float *min, float *max);
+float bb_volume(float *min, float *max);
+int bb_largest_axis(float *min, float *max);
 
 #endif

Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_instance.c
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_instance.c	2009-07-10 15:43:59 UTC (rev 21491)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_instance.c	2009-07-10 16:42:51 UTC (rev 21492)
@@ -34,9 +34,12 @@
 #include "RE_raytrace.h"
 #include "rayobject.h"
 
+#define RE_COST_INSTANCE (1.0f)
+
 static int  RayObject_instance_intersect(RayObject *o, Isect *isec);
 static void RayObject_instance_free(RayObject *o);
 static void RayObject_instance_bb(RayObject *o, float *min, float *max);
+static float RayObject_instance_cost(RayObject *o);
 
 static RayObjectAPI instance_api =
 {
@@ -44,7 +47,8 @@
 	NULL, //static void RayObject_instance_add(RayObject *o, RayObject *ob);
 	NULL, //static void RayObject_instance_done(RayObject *o);
 	RayObject_instance_free,
-	RayObject_instance_bb
+	RayObject_instance_bb,
+	RayObject_instance_cost
 };
 
 typedef struct InstanceRayObject
@@ -85,7 +89,7 @@
 	InstanceRayObject *obj = (InstanceRayObject*)o;
 	int res;
 	float start[3], vec[3], labda, dist;
-	int changed = 0;
+	int changed = 0, i;
 	
 	//TODO - this is disabling self intersection on instances
 	if(isec->orig.ob == obj->ob && obj->ob)
@@ -111,6 +115,18 @@
 	
 	isec->labda *= isec->dist / dist;
 	
+	//Update idot_axis and bv_index
+	for(i=0; i<3; i++)
+	{
+		isec->idot_axis[i]		= 1.0f / isec->vec[i];
+		
+		isec->bv_index[2*i]		= isec->idot_axis[i] < 0.0 ? 1 : 0;
+		isec->bv_index[2*i+1]	= 1 - isec->bv_index[2*i];
+		
+		isec->bv_index[2*i]		= i+3*isec->bv_index[2*i];
+		isec->bv_index[2*i+1]	= i+3*isec->bv_index[2*i+1];
+	}
+
 	//Raycast
 	res = RE_rayobject_intersect(obj->target, isec);
 
@@ -118,7 +134,6 @@
 	if(res == 0)
 	{
 		isec->labda = labda;
-		
 	}
 	else
 	{
@@ -131,7 +146,19 @@
 	
 	if(changed)
 		isec->orig.ob = obj->ob;
+
+	//Update idot_axis and bv_index
+	for(i=0; i<3; i++)
+	{
+		isec->idot_axis[i]		= 1.0f / isec->vec[i];
 		
+		isec->bv_index[2*i]		= isec->idot_axis[i] < 0.0 ? 1 : 0;
+		isec->bv_index[2*i+1]	= 1 - isec->bv_index[2*i];
+		
+		isec->bv_index[2*i]		= i+3*isec->bv_index[2*i];
+		isec->bv_index[2*i+1]	= i+3*isec->bv_index[2*i+1];
+	}
+		
 	return res;
 }
 
@@ -141,6 +168,12 @@
 	MEM_freeN(obj);
 }
 
+static float RayObject_instance_cost(RayObject *o)
+{
+	InstanceRayObject *obj = (InstanceRayObject*)o;
+	return RE_rayobject_cost(obj->target) + RE_COST_INSTANCE;
+}
+
 static void RayObject_instance_bb(RayObject *o, float *min, float *max)
 {
 	//TODO:

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-10 15:43:59 UTC (rev 21491)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_rtbuild.c	2009-07-10 16:42:51 UTC (rev 21492)
@@ -11,7 +11,6 @@
 static void split_leafs(RTBuilder *b, int *nth, int partitions, int split_axis);
 static int split_leafs_by_plane(RTBuilder *b, int begin, int end, float plane);
 
-
 static void rtbuild_init(RTBuilder *b, RayObject **begin, RayObject **end)
 {
 	int i;
@@ -23,6 +22,8 @@
 	
 	for(i=0; i<RTBUILD_MAX_CHILDS; i++)
 		b->child_offset[i] = 0;
+		
+	INIT_MINMAX(b->bb, b->bb+3);
 }
 
 RTBuilder* rtbuild_create(int size)
@@ -44,66 +45,45 @@
 	*(b->end++) = o;
 }
 
-RTBuilder* rtbuild_get_child(RTBuilder *b, int child, RTBuilder *tmp)
+void rtbuild_calc_bb(RTBuilder *b)
 {
-	rtbuild_init( tmp, b->begin + b->child_offset[child], b->begin + b->child_offset[child+1] );
-	tmp->child_sorted_axis = b->child_sorted_axis;
-	return tmp;
+	if(b->bb[0] == 1.0e30f)
+	{
+		RayObject **index = b->begin;
+		for(; index != b->end; index++)
+			RE_rayobject_merge_bb(*index, b->bb, b->bb+3);
+	}
 }
 
-int rtbuild_size(RTBuilder *b)
+void rtbuild_merge_bb(RTBuilder *b, float *min, float *max)
 {
-	return b->end - b->begin;
+	rtbuild_calc_bb(b);
+	DO_MIN(b->bb, min);
+	DO_MAX(b->bb+3, max);
 }
 
-/* Split methods */
-static void merge_bb(RTBuilder *b, float *min, float *max)
+int rtbuild_get_largest_axis(RTBuilder *b)
 {
-	RayObject **index = b->begin;
-
-	for(; index != b->end; index++)
-		RE_rayobject_merge_bb(*index, min, max);
+	rtbuild_calc_bb(b);
+	return bb_largest_axis(b->bb, b->bb+3);
 }
 
-static int largest_axis(float *min, float *max)
-{
-	float sub[3];
-	
-	sub[0] = max[0]-min[0];
-	sub[1] = max[1]-min[1];
-	sub[2] = max[2]-min[2];
-	if(sub[0] > sub[1])
-	{
-		if(sub[0] > sub[2])
-			return 0;
-		else
-			return 2;
-	}
-	else
-	{
-		if(sub[1] > sub[2])
-			return 1;
-		else
-			return 2;
-	}	
-}
 
-int rtbuild_get_largest_axis(RTBuilder *b)
+int rtbuild_size(RTBuilder *b)
 {
-	float min[3], max[3];
-
-	INIT_MINMAX(min, max);
-	merge_bb( b, min, max);
-
-	return largest_axis(min,max);
+	return b->end - b->begin;
 }
 
 
-/*
-int rtbuild_median_split(RTBuilder *b, int nchilds, int axis)
+RTBuilder* rtbuild_get_child(RTBuilder *b, int child, RTBuilder *tmp)
 {
+	rtbuild_init( tmp, b->begin + b->child_offset[child], b->begin + b->child_offset[child+1] );
+	tmp->child_sorted_axis = b->child_sorted_axis;
+	return tmp;
 }
-*/
+
+
+
 //Left balanced tree
 int rtbuild_mean_split(RTBuilder *b, int nchilds, int axis)
 {
@@ -199,14 +179,12 @@
 {
 	int la, i;
 	float separators[RTBUILD_MAX_CHILDS];
-	float min[3], max[3];
+	
+	rtbuild_calc_bb(b);
 
-	INIT_MINMAX(min, max);
-	merge_bb( b, min, max);
-
-	la = largest_axis(min,max);
+	la = bb_largest_axis(b->bb,b->bb+3);
 	for(i=1; i<nchilds; i++)
-		separators[i-1] = (max[la]-min[la])*i / nchilds;
+		separators[i-1] = (b->bb[la+3]-b->bb[la])*i / nchilds;
 		
 	return rtbuild_median_split(b, separators, nchilds, la);
 }
@@ -250,23 +228,9 @@
 	else if(axis == 5) qsort(begin, end-begin, sizeof(*begin), (int(*)(const void *, const void *)) costobject_cmp(5));
 }
 
-float bb_volume(float *min, float *max)
-{
-	return (max[0]-min[0])*(max[1]-min[1])*(max[2]-min[2]);
-}
 
-float bb_area(float *min, float *max)
-{
-	float sub[3], a;
-	sub[0] = max[0]-min[0];
-	sub[1] = max[1]-min[1];
-	sub[2] = max[2]-min[2];
 
-	a = (sub[0]*sub[1] + sub[0]*sub[2] + sub[1]*sub[2])*2;
-	assert(a >= 0.0);
-	return a;
-}
-
+/* Object Surface Area Heuristic splitter */
 int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
 {
 	int size = rtbuild_size(b);		
@@ -387,78 +351,7 @@
 	}
 }
 
-//Heuristic Area Splitter
-typedef struct CostEvent CostEvent;
-
-struct CostEvent
-{
-	float key;
-	float value;
-};
-
-int costevent_cmp(const CostEvent *a, const CostEvent *b)
-{
-	if(a->key < b->key) return -1;
-	if(a->key > b->key) return  1;
-	if(a->value < b->value) return -1;
-	if(a->value > b->value) return  1;
-	return 0;
-}
-
-void costevent_sort(CostEvent *begin, CostEvent *end)
-{
-	//TODO introsort
-	qsort(begin, sizeof(*begin), end-begin, (int(*)(const void *, const void *)) costevent_cmp);
-}
 /*
-int rtbuild_heuristic_split(RTBuilder *b, int nchilds)
-{
-	int size = rtbuild_size(b);		
-	
-	assert(nchilds == 2);
-	
-	if(size <= nchilds)
-	{
-		return rtbuild_mean_split_largest_axis(b, nchilds);
-	}
-	else
-	{
-		CostEvent *events, *ev;
-		RayObject *index;
-		int a = 0;
-
-		events = MEM_malloc( sizeof(CostEvent)*2*size, "RTBuilder.SweepSplitCostEvent" );
-		for(a = 0; a<3; a++)
-		
-
-		for(index = b->begin; b != b->end; b++)
-		{
-			float min[3], max[3];
-			INIT_MINMAX(min, max);
-			RE_rayobject_merge_bb(index, min, max);
-			for(a = 0; a<3; a++)
-			{
-				ev[a]->key = min[a];
-				ev[a]->value = 1;
-				ev[a]++;
-		
-				ev[a]->key = max[a];
-				ev[a]->value = -1;
-				ev[a]++;
-			}
-		}
-		for(a = 0; a<3; a++)
-			costevent_sort(events[a], ev[a]);
-			
-		
-		
-		for(a = 0; a<3; a++)
-			MEM_freeN(ev[a]);
-	}
-}
-*/
-
-/*
  * Helper code
  * PARTITION code / used on mean-split
  * basicly this a std::nth_element (like on C++ STL algorithm)
@@ -593,3 +486,46 @@
 	}
 	return begin;
 }
+
+/*
+ * Bounding Box utils
+ */
+float bb_volume(float *min, float *max)
+{
+	return (max[0]-min[0])*(max[1]-min[1])*(max[2]-min[2]);
+}
+
+float bb_area(float *min, float *max)
+{
+	float sub[3], a;
+	sub[0] = max[0]-min[0];
+	sub[1] = max[1]-min[1];
+	sub[2] = max[2]-min[2];
+
+	a = (sub[0]*sub[1] + sub[0]*sub[2] + sub[1]*sub[2])*2;
+	assert(a >= 0.0);
+	return a;
+}
+
+int bb_largest_axis(float *min, float *max)
+{
+	float sub[3];
+	
+	sub[0] = max[0]-min[0];
+	sub[1] = max[1]-min[1];
+	sub[2] = max[2]-min[2];
+	if(sub[0] > sub[1])
+	{
+		if(sub[0] > sub[2])
+			return 0;
+		else
+			return 2;
+	}
+	else
+	{
+		if(sub[1] > sub[2])
+			return 1;
+		else
+			return 2;
+	}	
+}





More information about the Bf-blender-cvs mailing list