KDTreeEntry CreateNode(Bounds b, int currentDepth) { KDTreeEntry entry = new KDTreeEntry(); if (currentDepth < depth) { float maxValue = 0; for (int i = 0; i < 3; i++) { if (b.size[i] > maxValue && axis[i]) { maxValue = b.size[i]; entry.splittingAxis = i; } } entry.split = b.center[entry.splittingAxis]; Vector3 newExtents = b.extents; newExtents[entry.splittingAxis] *= 0.5f; b.extents = newExtents; Vector3 center = b.center; center[entry.splittingAxis] = b.center[entry.splittingAxis] - newExtents[entry.splittingAxis]; Bounds left = b; left.center = center; center[entry.splittingAxis] = b.center[entry.splittingAxis] + newExtents[entry.splittingAxis]; Bounds right = b; right.center = center; entry.left = CreateNode(left, currentDepth + 1); entry.right = CreateNode(right, currentDepth + 1); } else { entry.values = new List <T>(); } return(entry); }
KDTreeEntry CreateNode(Bounds b, int currentDepth) { KDTreeEntry entry = new KDTreeEntry(); if (currentDepth < depth) { entry.splittingAxis = LargestComponentIndex(b.size); entry.split = b.center[entry.splittingAxis]; Vector3 newExtents = b.extents; newExtents[entry.splittingAxis] *= 0.5f; b.extents = newExtents; Vector3 leftCenter = b.center; Vector3 rightCenter = b.center; leftCenter[entry.splittingAxis] = b.center[entry.splittingAxis] - newExtents[entry.splittingAxis]; rightCenter[entry.splittingAxis] = b.center[entry.splittingAxis] + newExtents[entry.splittingAxis]; Bounds left = b; left.center = leftCenter; Bounds right = b; right.center = rightCenter; entry.left = CreateNode(left, currentDepth + 1); entry.right = CreateNode(right, currentDepth + 1); } else { entry.values = new List <KDTreeValue>(); #if HMDebug entry.bounds = b; #endif } return(entry); }
void CreateTree(Bounds bounds) { node = CreateNode(bounds, 0); }