public static void Calculate3(IntVector3 viewerLocation, int visionRange, VisionMap visibilityMap, IntSize3 mapSize, Func<IntVector3, bool> blockerDelegate) { visibilityMap.Clear(); if (blockerDelegate(viewerLocation) == true) return; var g = new IntGrid3(new IntVector3(), mapSize); g = g.Offset(-viewerLocation.X, -viewerLocation.Y, -viewerLocation.Z); var vr = new IntVector3(visionRange, visionRange, visionRange); g = g.Intersect(new IntGrid3(vr, -vr)); int visionRangeSquared = (visionRange + 1) * (visionRange + 1); // +1 to get a bit bigger view area foreach (var dst in g.Range()) { if (dst.LengthSquared > visionRangeSquared) continue; bool vis = FindLos3(viewerLocation, dst, blockerDelegate); visibilityMap[dst] = vis; // XXX Cheat a bit so that the floor will be visible if (vis && dst.Z == 0 && viewerLocation.Z > 1) { visibilityMap[dst.SetZ(dst.Z - 1)] = true; } } }
IEnumerable <IntVector3> GetVisibleLocationsSimpleFOV() { var g = new IntGrid3(this.Location - this.VisionRange, this.Location + this.VisionRange); g = g.Intersect(new IntGrid3(this.Environment.Size)); return(g.Range()); }
public void SetTarget(EnvironmentObject env, IntGrid3 box) { if (env == m_environment && m_box == box) { return; } if (env != m_environment) { if (m_environment != null) { m_environment.MapTileTerrainChanged -= OnMapTerrainChanged; m_environment.MapTileObjectChanged -= OnMapObjectChanged; } m_environment = env; if (m_environment != null) { m_environment.MapTileTerrainChanged += OnMapTerrainChanged; m_environment.MapTileObjectChanged += OnMapObjectChanged; } Notify("Environment"); NotifyTileObjectChanges(); } if (box != m_box) { var old = m_box; m_box = box; if (m_box.IsNull || m_environment == null) { m_adjustedBox = m_box; } else { m_adjustedBox = m_box.Intersect(new IntGrid3(m_environment.Size)); } Notify("Box"); NotifyTileObjectChanges(old, m_box); } NotifyTileTerrainChanges(); Notify("IsNotEmpty"); }
IEnumerable<IntVector3> GetVisibleLocationsSimpleFOV() { var g = new IntGrid3(this.Location - this.VisionRange, this.Location + this.VisionRange); g = g.Intersect(new IntGrid3(this.Environment.Size)); return g.Range(); }
void GenerateVertices(ref IntGrid3 viewGrid, Direction visibleChunkFaces, VertexList<TerrainVertex> terrainVertexList, VertexList<SceneryVertex> sceneryVertexList) { IntGrid3 chunkGrid = viewGrid.Intersect(new IntGrid3(this.ChunkOffset, Chunk.ChunkSize)); // is the chunk inside frustum, but outside the viewgrid? if (chunkGrid.IsNull) return; if (m_scanned == false) ScanForAllEmptyOrUndefined(); if (this.IsAllEmpty) return; if (this.IsAllUndefined) { CreateUndefinedChunk(ref viewGrid, ref chunkGrid, terrainVertexList, visibleChunkFaces); return; } if (m_voxelMap == null) FillVoxelMap(); // Draw from up to down to avoid overdraw for (int z = chunkGrid.Z2; z >= chunkGrid.Z1; --z) { for (int y = chunkGrid.Y1; y <= chunkGrid.Y2; ++y) { for (int x = chunkGrid.X1; x <= chunkGrid.X2; ++x) { var p = new IntVector3(x, y, z); var td = m_map.GetTileData(p); if (td.WaterLevel == 0) { if (td.IsEmpty) continue; } var pos = p - this.ChunkOffset; if (td.HasTree) { // Add tree as scenery vertex HandleTree(sceneryVertexList, td, ref pos); continue; } if (td.IsGreen) // XXX continue; var vox = m_voxelMap.Grid[pos.Z, pos.Y, pos.X]; HandleVoxel(p, ref vox, ref viewGrid, visibleChunkFaces, terrainVertexList); } } } }
void GenerateVertices(ref IntGrid3 viewGrid, Direction visibleChunkFaces, VertexList <TerrainVertex> terrainVertexList, VertexList <SceneryVertex> sceneryVertexList) { IntGrid3 chunkGrid = viewGrid.Intersect(new IntGrid3(this.ChunkOffset, Chunk.ChunkSize)); // is the chunk inside frustum, but outside the viewgrid? if (chunkGrid.IsNull) { return; } if (m_scanned == false) { ScanForAllEmptyOrUndefined(); } if (this.IsAllEmpty) { return; } if (this.IsAllUndefined) { CreateUndefinedChunk(ref viewGrid, ref chunkGrid, terrainVertexList, visibleChunkFaces); return; } if (m_voxelMap == null) { FillVoxelMap(); } // Draw from up to down to avoid overdraw for (int z = chunkGrid.Z2; z >= chunkGrid.Z1; --z) { for (int y = chunkGrid.Y1; y <= chunkGrid.Y2; ++y) { for (int x = chunkGrid.X1; x <= chunkGrid.X2; ++x) { var p = new IntVector3(x, y, z); var td = m_map.GetTileData(p); if (td.WaterLevel == 0) { if (td.IsEmpty) { continue; } } var pos = p - this.ChunkOffset; if (td.HasTree) { // Add tree as scenery vertex HandleTree(sceneryVertexList, td, ref pos); continue; } if (td.IsGreen) // XXX { continue; } var vox = m_voxelMap.Grid[pos.Z, pos.Y, pos.X]; HandleVoxel(p, ref vox, ref viewGrid, visibleChunkFaces, terrainVertexList); } } } }
public void SetTarget(EnvironmentObject env, IntGrid3 box) { if (env == m_environment && m_box == box) return; if (env != m_environment) { if (m_environment != null) { m_environment.MapTileTerrainChanged -= OnMapTerrainChanged; m_environment.MapTileObjectChanged -= OnMapObjectChanged; } m_environment = env; if (m_environment != null) { m_environment.MapTileTerrainChanged += OnMapTerrainChanged; m_environment.MapTileObjectChanged += OnMapObjectChanged; } Notify("Environment"); NotifyTileObjectChanges(); } if (box != m_box) { var old = m_box; m_box = box; if (m_box.IsNull || m_environment == null) m_adjustedBox = m_box; else m_adjustedBox = m_box.Intersect(new IntGrid3(m_environment.Size)); Notify("Box"); NotifyTileObjectChanges(old, m_box); } NotifyTileTerrainChanges(); Notify("IsNotEmpty"); }