[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15955] branches/soc-2008-jaguarandi/ source/blender/blenlib/intern/BLI_kdopbvh.c: Shrink BVHNode by 16bits

André Pinto andresusanopinto at gmail.com
Mon Aug 4 22:30:57 CEST 2008


Revision: 15955
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15955
Author:   jaguarandi
Date:     2008-08-04 22:30:57 +0200 (Mon, 04 Aug 2008)

Log Message:
-----------
Shrink BVHNode by 16bits

Modified Paths:
--------------
    branches/soc-2008-jaguarandi/source/blender/blenlib/intern/BLI_kdopbvh.c

Modified: branches/soc-2008-jaguarandi/source/blender/blenlib/intern/BLI_kdopbvh.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenlib/intern/BLI_kdopbvh.c	2008-08-04 19:12:42 UTC (rev 15954)
+++ branches/soc-2008-jaguarandi/source/blender/blenlib/intern/BLI_kdopbvh.c	2008-08-04 20:30:57 UTC (rev 15955)
@@ -45,12 +45,10 @@
 
 typedef struct BVHNode
 {
-	struct BVHNode **children; // max 8 children
-	struct BVHNode *parent; // needed for bottom - top update
-	float *bv; // Bounding volume of all nodes, max 13 axis
-	int index; /* face, edge, vertex index */
-	char totnode; // how many nodes are used, used for speedup
-	char traversed;  // how many nodes already traversed until this level?
+	struct BVHNode **children;	// max 8 children
+	float *bv;		// Bounding volume of all nodes, max 13 axis
+	int index;		// face, edge, vertex index
+	char totnode;	// how many nodes are used, used for speedup
 	char main_axis;
 } BVHNode;
 
@@ -554,13 +552,10 @@
 		if(tend-start == 1)	// ok, we have 1 left for this node
 		{
 			node->children[i] = tree->nodes[start];
-			node->children[i]->parent = node;
 		}
 		else
 		{
 			BVHNode *tnode = node->children[i] = tree->nodes[free_node_index] = &(tree->nodearray[free_node_index]);
-//			printf("Used %d (%d)\n", free_node_index, tend-start);
-			tnode->parent = node;
 			
 			if(tend != end)
 				partition_nth_element(tree->nodes, start, end, tend, laxis);
@@ -608,7 +603,6 @@
 		if(tend-start == 1)
 		{
 			node->children[i] = tree->nodes[start];
-			node->children[i]->parent = node;
 		}
 		else
 		{
@@ -905,23 +899,13 @@
 // call BLI_bvhtree_update_node() first for every node/point/triangle
 void BLI_bvhtree_update_tree(BVHTree *tree)
 {
-	BVHNode *leaf, *parent;
-	
-	// reset tree traversing flag
-	for (leaf = tree->nodearray + tree->totleaf; leaf != tree->nodearray + tree->totleaf + tree->totbranch; leaf++)
-		leaf->traversed = 0;
-	
-	for (leaf = tree->nodearray; leaf != tree->nodearray + tree->totleaf; leaf++)
-	{
-		for (parent = leaf->parent; parent; parent = parent->parent)
-		{
-			parent->traversed++;	// we tried to go up in hierarchy 
-			if (parent->traversed < parent->totnode) 
-				break;	// we do not need to check further 
-			else 
-				node_join(tree, parent);
-		}
-	}
+	BVHNode** root  = tree->nodes + tree->totleaf;
+	BVHNode** index = tree->nodes + tree->totleaf + tree->totbranch-1;
+
+	//Update bottom=>top
+	//TRICKY: the way we build the tree the parent of a child has an index < then the child index
+	for (; index != root; index--)
+		node_join(tree, *index);
 }
 
 float BLI_bvhtree_getepsilon(BVHTree *tree)





More information about the Bf-blender-cvs mailing list