示例#1
0
        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);
        }
示例#2
0
        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);
        }