Ejemplo n.º 1
0
        public void Execute(int i)
        {
            int     halfLength   = BVHArray.Length / 2;
            int     leafNodeId   = halfLength + i;
            BVHAABB leafNodeAABB = BVHArray[leafNodeId].aabb;
            int     parentIndex  = BVHArray[leafNodeId].ParentNodeIndex;

            while (parentIndex != -1)
            {
                //todo locks!
                BVHNode parent = BVHArray[parentIndex];
                if (parent.IsValid < 1)
                {
                    parent.aabb           = leafNodeAABB;
                    parent.IsValid        = 1;
                    BVHArray[parentIndex] = parent;
                    break;
                }
                else
                {
                    parent.aabb           = Utils.GetEncompassingAABB(parent.aabb, leafNodeAABB);
                    parent.IsValid        = 2;
                    BVHArray[parentIndex] = parent;
                }
                leafNodeAABB = parent.aabb;
                parentIndex  = parent.ParentNodeIndex;
            }
        }
Ejemplo n.º 2
0
        public static BVHAABB GetEncompassingAABB(BVHAABB a, BVHAABB b)
        {
            BVHAABB returnAABB = new BVHAABB();

            returnAABB.Min = math.min(a.Min, b.Min);
            returnAABB.Max = math.max(a.Max, b.Max);

            return(returnAABB);
        }
Ejemplo n.º 3
0
 public static void GrowAABB(ref BVHAABB sourceAABB, float3 includePoint)
 {
     sourceAABB.Min.x = math.min(sourceAABB.Min.x, includePoint.x);
     sourceAABB.Min.y = math.min(sourceAABB.Min.y, includePoint.y);
     sourceAABB.Min.z = math.min(sourceAABB.Min.z, includePoint.z);
     sourceAABB.Max.x = math.max(sourceAABB.Max.x, includePoint.x);
     sourceAABB.Max.y = math.max(sourceAABB.Max.y, includePoint.y);
     sourceAABB.Max.z = math.max(sourceAABB.Max.z, includePoint.z);
 }
Ejemplo n.º 4
0
        public void Execute()
        {
            BVHAABB startAABB = results[0];

            for (int i = 1; i < results.Length; i++)
            {
                startAABB = Utils.GetEncompassingAABB(startAABB, results[i]);
            }

            results[0] = startAABB;
        }
Ejemplo n.º 5
0
        public void Execute(int i)
        {
            int     start     = i * batchSize;
            int     end       = (i + 1) * batchSize > AABB.Length ? AABB.Length : (i + 1) * batchSize;
            BVHAABB startAABB = AABB[start];

            for (int k = start + 1; k < end; k++)
            {
                startAABB = Utils.GetEncompassingAABB(startAABB, AABB[k]);
            }
            results[i] = startAABB;
        }
Ejemplo n.º 6
0
        public void SerialExecute(int i)
        {
            int     halfLength   = BVHArray.Length / 2;
            int     leafNodeId   = halfLength + i;
            BVHAABB leafNodeAABB = BVHArray[leafNodeId].aabb;
            int     parentIndex  = BVHArray[leafNodeId].ParentNodeIndex;

            while (parentIndex != -1)
            {
                BVHNode parent = BVHArray[parentIndex];
                if (parent.IsValid == 0)
                {
                    parent.aabb           = leafNodeAABB;
                    parent.IsValid        = 1;
                    BVHArray[parentIndex] = parent;
                }
                parent.aabb           = Utils.GetEncompassingAABB(parent.aabb, leafNodeAABB);
                parent.IsValid        = 2;
                BVHArray[parentIndex] = parent;
                leafNodeAABB          = parent.aabb;
                parentIndex           = parent.ParentNodeIndex;
            }
        }
Ejemplo n.º 7
0
 public static bool AABBToAABBOverlap(BVHAABB a, BVHAABB b)
 {
     return((a.Min.x <= b.Max.x && a.Max.x >= b.Min.x) &&
            (a.Min.z <= b.Max.z && a.Max.z >= b.Min.z) &&
            (a.Min.y <= b.Max.y && a.Max.y >= b.Min.y));
 }
Ejemplo n.º 8
0
 public static float3 GetAABBCenter(BVHAABB aabb)
 {
     return((aabb.Min + aabb.Max) * 0.5f);
 }