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)); } } } } }
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; })); }
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); }
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)); } }
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); }
public BoundingBox GetBoundingBox() { var pos = Coordinate.ToVector3(); return(new BoundingBox(pos, pos + Vector3.One)); }