Пример #1
0
        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;
                }
            }
        }
Пример #2
0
        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());
        }
Пример #3
0
        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");
        }
Пример #4
0
        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();
        }
Пример #5
0
        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);
                    }
                }
            }
        }
Пример #6
0
        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);
                    }
                }
            }
        }
Пример #7
0
        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");
        }