public void Execute(int index) { var chunk = Chunks[index]; var instanceBounds = chunk.GetNativeArray(WorldMeshRenderBoundsType); if (instanceBounds.Length == 0) { return; } // TODO: Improve this approach // See: https://www.inf.ethz.ch/personal/emo/DoctThesisFiles/fischer05.pdf var chunkBounds = new WorldMeshRenderBounds(); for (int j = 0; j < instanceBounds.Length; j++) { chunkBounds.Center += instanceBounds[j].Center; } chunkBounds.Center /= instanceBounds.Length; for (int j = 0; j < instanceBounds.Length; j++) { float r = math.distance(chunkBounds.Center, instanceBounds[j].Center) + instanceBounds[j].Radius; chunkBounds.Radius = math.select(chunkBounds.Radius, r, r > chunkBounds.Radius); } ChunkBounds[index] = chunkBounds; }
public InsideResult Inside(WorldMeshRenderBounds bounds) { var center = new float4(bounds.Center.x, bounds.Center.y, bounds.Center.z, 1.0f); var leftDistance = math.dot(Left, center); var rightDistance = math.dot(Right, center); var downDistance = math.dot(Down, center); var upDistance = math.dot(Up, center); var nearDistance = math.dot(Near, center); var farDistance = math.dot(Far, center); var leftOut = leftDistance < -bounds.Radius; var rightOut = rightDistance < -bounds.Radius; var downOut = downDistance < -bounds.Radius; var upOut = upDistance < -bounds.Radius; var nearOut = nearDistance < -bounds.Radius; var farOut = farDistance < -bounds.Radius; var anyOut = leftOut || rightOut || downOut || upOut || nearOut || farOut; var leftIn = leftDistance > bounds.Radius; var rightIn = rightDistance > bounds.Radius; var downIn = downDistance > bounds.Radius; var upIn = upDistance > bounds.Radius; var nearIn = nearDistance > bounds.Radius; var farIn = farDistance > bounds.Radius; var allIn = leftIn && rightIn && downIn && upIn && nearIn && farIn; if (anyOut) { return(InsideResult.Out); } if (allIn) { return(InsideResult.In); } return(InsideResult.Partial); }