Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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);
    }
Exemplo n.º 3
0
 void CreateTree(Bounds bounds)
 {
     node = CreateNode(bounds, 0);
 }