[Bf-blender-cvs] [ecd086ac322] master: Fix T62210: endless loop in kd tree lookup

Campbell Barton noreply at git.blender.org
Wed Mar 6 04:54:20 CET 2019


Commit: ecd086ac32241c883689f3522cabc324a8e0064c
Author: Campbell Barton
Date:   Wed Mar 6 14:46:58 2019 +1100
Branches: master
https://developer.blender.org/rBecd086ac32241c883689f3522cabc324a8e0064c

Fix T62210: endless loop in kd tree lookup

Reset nodes after the first balance call.

===================================================================

M	source/blender/blenlib/intern/BLI_kdtree.c

===================================================================

diff --git a/source/blender/blenlib/intern/BLI_kdtree.c b/source/blender/blenlib/intern/BLI_kdtree.c
index 4f12bd0a93f..ce06324ebca 100644
--- a/source/blender/blenlib/intern/BLI_kdtree.c
+++ b/source/blender/blenlib/intern/BLI_kdtree.c
@@ -54,6 +54,9 @@ struct KDTree {
 
 #define KD_NODE_UNSET ((uint)-1)
 
+/** When set we know all values are unbalanced, otherwise clear them when re-balancing: see T62210. */
+#define KD_NODE_ROOT_IS_INIT ((uint)-2)
+
 /**
  * Creates or free a kdtree
  */
@@ -64,7 +67,7 @@ KDTree *BLI_kdtree_new(uint maxsize)
 	tree = MEM_mallocN(sizeof(KDTree), "KDTree");
 	tree->nodes = MEM_mallocN(sizeof(KDTreeNode) * maxsize, "KDTreeNode");
 	tree->totnode = 0;
-	tree->root = KD_NODE_UNSET;
+	tree->root = KD_NODE_ROOT_IS_INIT;
 
 #ifdef DEBUG
 	tree->is_balanced = false;
@@ -156,6 +159,13 @@ static uint kdtree_balance(KDTreeNode *nodes, uint totnode, uint axis, const uin
 
 void BLI_kdtree_balance(KDTree *tree)
 {
+	if (tree->root != KD_NODE_ROOT_IS_INIT) {
+		for (uint i = 0; i < tree->totnode; i++) {
+			tree->nodes[i].left = KD_NODE_UNSET;
+			tree->nodes[i].right = KD_NODE_UNSET;
+		}
+	}
+
 	tree->root = kdtree_balance(tree->nodes, tree->totnode, 0, 0);
 
 #ifdef DEBUG



More information about the Bf-blender-cvs mailing list