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; } }
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); }
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); }
public void Execute() { BVHAABB startAABB = results[0]; for (int i = 1; i < results.Length; i++) { startAABB = Utils.GetEncompassingAABB(startAABB, results[i]); } results[0] = startAABB; }
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; }
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; } }
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)); }
public static float3 GetAABBCenter(BVHAABB aabb) { return((aabb.Min + aabb.Max) * 0.5f); }