public static List <Chunk> chunksIntersecting(World world, Vector3 sphereCenter, float radius) { List <Chunk> ret = new List <Chunk>(); //sphere is smaller than a chunk if (radius < (WorldParameters.theChunkSize / 2)) { Chunk chunk = chunkIntersecting(world, sphereCenter); if (chunk != null) { ret.Add(chunk); //no need to check all the sides if the aabb totally contains the sphere AABox bounds = chunk.bounds(); if (Intersections.AABBContainsSphere(sphereCenter, radius, bounds) == true) { return(ret); } ChunkKey.Neighbor getNeighbors = ChunkKey.Neighbor.NONE; if ((sphereCenter.X - radius) < bounds.myMin.X) { getNeighbors |= ChunkKey.Neighbor.LEFT; } if ((sphereCenter.X + radius) > bounds.myMax.X) { getNeighbors |= ChunkKey.Neighbor.RIGHT; } if ((sphereCenter.Y - radius) < bounds.myMin.Y) { getNeighbors |= ChunkKey.Neighbor.BOTTOM; } if ((sphereCenter.Y + radius) > bounds.myMax.Y) { getNeighbors |= ChunkKey.Neighbor.TOP; } if ((sphereCenter.Z - radius) < bounds.myMin.Z) { getNeighbors |= ChunkKey.Neighbor.FRONT; } if ((sphereCenter.Z + radius) > bounds.myMax.Z) { getNeighbors |= ChunkKey.Neighbor.BACK; } ret.AddRange(world.findNeighbors(chunk, getNeighbors)); } } else //sphere could cover several chunks { foreach (Chunk chunk in world.chunks.Values) { if (Intersections.AABoxSphereIntersection(chunk.bounds(), sphereCenter, radius) == true) { ret.Add(chunk); } } } return(ret); }
public List <Chunk> findNeighbors(Chunk chunk, ChunkKey.Neighbor neighbors) { List <Chunk> ret = new List <Chunk>(); ChunkKey k = chunk.chunkKey; if ((neighbors & ChunkKey.Neighbor.LEFT) == ChunkKey.Neighbor.LEFT) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.LEFT))); } if ((neighbors & ChunkKey.Neighbor.RIGHT) == ChunkKey.Neighbor.RIGHT) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.RIGHT))); } if ((neighbors & ChunkKey.Neighbor.BOTTOM) == ChunkKey.Neighbor.BOTTOM) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.BOTTOM))); } if ((neighbors & ChunkKey.Neighbor.TOP) == ChunkKey.Neighbor.TOP) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.TOP))); } if ((neighbors & ChunkKey.Neighbor.FRONT) == ChunkKey.Neighbor.FRONT) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.FRONT))); } if ((neighbors & ChunkKey.Neighbor.BACK) == ChunkKey.Neighbor.BACK) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.BACK))); } if ((neighbors & ChunkKey.Neighbor.LBF) == ChunkKey.Neighbor.LBF) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.LBF))); } if ((neighbors & ChunkKey.Neighbor.LB) == ChunkKey.Neighbor.LB) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.LB))); } if ((neighbors & ChunkKey.Neighbor.LBB) == ChunkKey.Neighbor.LBB) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.LBB))); } if ((neighbors & ChunkKey.Neighbor.BF) == ChunkKey.Neighbor.BF) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.BF))); } if ((neighbors & ChunkKey.Neighbor.BB) == ChunkKey.Neighbor.BB) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.BB))); } if ((neighbors & ChunkKey.Neighbor.RBF) == ChunkKey.Neighbor.RBF) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.RBF))); } if ((neighbors & ChunkKey.Neighbor.RB) == ChunkKey.Neighbor.RB) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.RB))); } if ((neighbors & ChunkKey.Neighbor.RBB) == ChunkKey.Neighbor.RBB) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.RBB))); } if ((neighbors & ChunkKey.Neighbor.LF) == ChunkKey.Neighbor.LF) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.LF))); } if ((neighbors & ChunkKey.Neighbor.BL) == ChunkKey.Neighbor.BL) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.BL))); } if ((neighbors & ChunkKey.Neighbor.RF) == ChunkKey.Neighbor.RF) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.RF))); } if ((neighbors & ChunkKey.Neighbor.BR) == ChunkKey.Neighbor.BR) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.BR))); } if ((neighbors & ChunkKey.Neighbor.LTF) == ChunkKey.Neighbor.LTF) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.LTF))); } if ((neighbors & ChunkKey.Neighbor.LT) == ChunkKey.Neighbor.LT) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.LT))); } if ((neighbors & ChunkKey.Neighbor.LTB) == ChunkKey.Neighbor.LTB) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.LTB))); } if ((neighbors & ChunkKey.Neighbor.TF) == ChunkKey.Neighbor.TF) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.TF))); } if ((neighbors & ChunkKey.Neighbor.TB) == ChunkKey.Neighbor.TB) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.TB))); } if ((neighbors & ChunkKey.Neighbor.RTF) == ChunkKey.Neighbor.RTF) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.RTF))); } if ((neighbors & ChunkKey.Neighbor.RT) == ChunkKey.Neighbor.RT) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.RT))); } if ((neighbors & ChunkKey.Neighbor.RTB) == ChunkKey.Neighbor.RTB) { ret.Add(findChunk(k.neighbor(ChunkKey.Neighbor.RTB))); } return(ret); }