Exemplo n.º 1
0
        private void GetChunksIntersecting(BoundingFrustum Frustum, HashSet <VoxelChunk> chunks)
        {
            chunks.Clear();
            var frustumBox = MathFunctions.GetBoundingBox(Frustum.GetCorners());
            var minChunk   = ChunkData.ConfineToBounds(GlobalVoxelCoordinate.FromVector3(frustumBox.Min).GetGlobalChunkCoordinate());
            var maxChunk   = ChunkData.ConfineToBounds(GlobalVoxelCoordinate.FromVector3(frustumBox.Max).GetGlobalChunkCoordinate());


            for (var x = minChunk.X; x <= maxChunk.X; ++x)
            {
                for (var y = minChunk.Y; y <= maxChunk.Y; ++y)
                {
                    for (var z = minChunk.Z; z <= maxChunk.Z; ++z)
                    {
                        var chunkCoord = new GlobalChunkCoordinate(x, y, z);
                        var min        = new GlobalVoxelCoordinate(chunkCoord, new LocalVoxelCoordinate(0, 0, 0));
                        var box        = new BoundingBox(min.ToVector3(), min.ToVector3() + new Vector3(VoxelConstants.ChunkSizeX, VoxelConstants.ChunkSizeY, VoxelConstants.ChunkSizeZ));
                        if (Frustum.Contains(box) != ContainmentType.Disjoint)
                        {
                            chunks.Add(ChunkData.GetChunk(chunkCoord));
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
 public IEnumerable <VoxelChunk> EnumerateChunksInBounds(BoundingFrustum Frustum)
 {
     return(EnumerateChunksInBounds(MathFunctions.GetBoundingBox(Frustum.GetCorners()))
            .Where(c =>
     {
         var min = new GlobalVoxelCoordinate(c.ID, new LocalVoxelCoordinate(0, 0, 0));
         var box = new BoundingBox(min.ToVector3(), min.ToVector3() + new Vector3(VoxelConstants.ChunkSizeX, VoxelConstants.ChunkSizeY, VoxelConstants.ChunkSizeZ));
         var r = Frustum.Contains(box) != ContainmentType.Disjoint;
         return r;
     }));
 }
Exemplo n.º 3
0
        public BoundingBox GetBoundingBox()
        {
            if (!m_boundingBoxCreated)
            {
                Vector3 max = new Vector3(VoxelConstants.ChunkSizeX, VoxelConstants.ChunkSizeY, VoxelConstants.ChunkSizeZ) + Origin.ToVector3();
                m_boundingBox        = new BoundingBox(Origin.ToVector3(), max);
                m_boundingBoxCreated = true;
            }

            return(m_boundingBox);
        }
Exemplo n.º 4
0
        public static IEnumerable <GlobalVoxelCoordinate> BreadthFirstSearchNonBlocking(
            ChunkManager Data,
            GlobalVoxelCoordinate Start,
            float Radius,
            Func <GlobalVoxelCoordinate, bool> IsGoal)
        {
            var queue         = new Queue <GlobalVoxelCoordinate>();
            var visited       = new HashSet <GlobalVoxelCoordinate>();
            var radiusSquared = Radius * Radius;

            queue.Enqueue(Start);
            visited.Add(Start);

            while (queue.Count > 0)
            {
                var current = queue.Dequeue();

                if (IsGoal(current))
                {
                    yield return(current);

                    yield break;
                }

                var delta = current.ToVector3() - Start.ToVector3();
                if (delta.LengthSquared() < radiusSquared)
                {
                    foreach (var neighbor in VoxelHelpers.EnumerateManhattanNeighbors(current))
                    {
                        var v = new VoxelHandle(Data, neighbor);
                        if (!visited.Contains(neighbor) && v.IsValid && v.IsEmpty)
                        {
                            if (Debugger.Switches.DrawPaths)
                            {
                                Drawer3D.DrawBox(v.GetBoundingBox(), Color.Red, 0.1f, true);
                            }
                            visited.Add(neighbor);
                            queue.Enqueue(neighbor);
                        }
                    }
                }
                yield return(new GlobalVoxelCoordinate(-9999, -9999, -9999));
            }
        }
Exemplo n.º 5
0
        public static bool BreadthFirstSearch(
            ChunkData Data,
            GlobalVoxelCoordinate Start,
            float Radius,
            Func <GlobalVoxelCoordinate, bool> IsGoal,
            out GlobalVoxelCoordinate Result)
        {
            var queue         = new Queue <GlobalVoxelCoordinate>();
            var visited       = new HashSet <GlobalVoxelCoordinate>();
            var radiusSquared = Radius * Radius;

            queue.Enqueue(Start);
            visited.Add(Start);

            while (queue.Count > 0)
            {
                var current = queue.Dequeue();

                if (IsGoal(current))
                {
                    Result = current;
                    return(true);
                }

                var delta = current.ToVector3() - Start.ToVector3();
                if (delta.LengthSquared() < radiusSquared)
                {
                    foreach (var neighbor in VoxelHelpers.EnumerateManhattanNeighbors(current))
                    {
                        if (!visited.Contains(neighbor))
                        {
                            visited.Add(neighbor);
                            queue.Enqueue(neighbor);
                        }
                    }
                }
            }

            Result = new GlobalVoxelCoordinate(0, 0, 0);
            return(false);
        }
Exemplo n.º 6
0
        public BoundingBox GetBoundingBox()
        {
            var pos = Coordinate.ToVector3();

            return(new BoundingBox(pos, pos + Vector3.One));
        }