Ejemplo n.º 1
0
        private void PostRefresh(TerrainRefreshType type, int x, int y)
        {
            var request = new KeyValuePair <TerrainRefreshType, Vector2Int>(type, new Vector2Int(x, y));

            if (!refresh.Contains(request))
            {
                refresh.Add(request);
            }
        }
Ejemplo n.º 2
0
        private void OnCellShapeChanged(HexPropertyChangedData <CellShape> data)
        {
            TerrainRefreshType refreshFlags = TerrainRefreshType.Heightmap | TerrainRefreshType.Features;

            if ((data.OldValue == CellShape.Mountains) != (data.NewValue == CellShape.Mountains))
            {
                refreshFlags |= TerrainRefreshType.Alphamap;
            }

            foreach (var chunk in GetAffectedChunks(data.Cell))
            {
                chunk.Refresh(refreshFlags);
            }
        }
Ejemplo n.º 3
0
        public void Refresh(TerrainRefreshType refreshTypes)
        {
            if (RefreshCoroutine == null)
            {
                RefreshCoroutine = StartCoroutine(Refresh_Perform());
            }

            if (((refreshTypes & TerrainRefreshType.Rivers) == TerrainRefreshType.Rivers))
            {
                FullMapRefresher.RefreshRivers();
            }

            if (((refreshTypes & TerrainRefreshType.Farmland) == TerrainRefreshType.Farmland))
            {
                FullMapRefresher.RefreshFarmland();
            }

            RefreshFlags |= refreshTypes;
        }
Ejemplo n.º 4
0
        private void OnCellImprovementsChanged(Tuple <IImprovement, IHexCell> data)
        {
            TerrainRefreshType refreshFlags = TerrainRefreshType.Features;

            if (data.Item1.Template.ProducesFarmland)
            {
                refreshFlags |= TerrainRefreshType.Farmland;
            }

            if (data.Item1.Template.OverridesTerrain)
            {
                refreshFlags |= TerrainRefreshType.Alphamap;
            }

            foreach (var chunk in GetAffectedChunks(data.Item2))
            {
                chunk.Refresh(refreshFlags);
            }
        }
Ejemplo n.º 5
0
        private void OnCellTerrainChanged(HexPropertyChangedData <CellTerrain> data)
        {
            TerrainRefreshType refreshFlags = TerrainRefreshType.Alphamap | TerrainRefreshType.Features;

            if (data.OldValue.IsWater() != data.NewValue.IsWater())
            {
                refreshFlags |= TerrainRefreshType.Water | TerrainRefreshType.Heightmap;
            }

            if (data.NewValue.IsWater())
            {
                refreshFlags |= TerrainRefreshType.Water;
            }

            foreach (var chunk in GetAffectedChunks(data.Cell))
            {
                chunk.Refresh(refreshFlags);
            }
        }
Ejemplo n.º 6
0
        private IEnumerator Refresh_Perform()
        {
            MapRenderingSignals.ChunkStartingToRefresh.OnNext(this);

            yield return(SkipFrame);

            while (FullMapRefresher.IsRefreshingRivers)
            {
                yield return(SkipFrame);
            }

            yield return(SkipFrame);

            bool flushTerrain = false;

            if ((RefreshFlags & TerrainRefreshType.RequiresOrientation) != 0)
            {
                ChunkOrientationData orientationData = OrientationBaker.MakeOrientationRequestForChunk(this);

                while (!orientationData.IsReady)
                {
                    yield return(SkipFrame);
                }

                if (((RefreshFlags & TerrainRefreshType.Alphamap) == TerrainRefreshType.Alphamap))
                {
                    yield return(StartCoroutine(RefreshAlphamap(orientationData)));

                    flushTerrain = true;
                }

                if (((RefreshFlags & TerrainRefreshType.Heightmap) == TerrainRefreshType.Heightmap))
                {
                    yield return(StartCoroutine(RefreshHeightmap(orientationData)));

                    flushTerrain = true;
                }

                OrientationBaker.ReleaseOrientationData(orientationData);
            }

            if (((RefreshFlags & TerrainRefreshType.Water) == TerrainRefreshType.Water))
            {
                RefreshWater();
            }

            if (flushTerrain)
            {
                Terrain.Flush();

                if (Terrain.topNeighbor != null)
                {
                    Terrain.topNeighbor.Flush();
                }
                if (Terrain.rightNeighbor != null)
                {
                    Terrain.rightNeighbor.Flush();
                }
                if (Terrain.bottomNeighbor != null)
                {
                    Terrain.bottomNeighbor.Flush();
                }
                if (Terrain.leftNeighbor != null)
                {
                    Terrain.leftNeighbor.Flush();
                }

                yield return(SkipFrame);
            }

            if (((RefreshFlags & TerrainRefreshType.Culture) == TerrainRefreshType.Culture))
            {
                RefreshCulture();
            }

            if (((RefreshFlags & TerrainRefreshType.Features) == TerrainRefreshType.Features))
            {
                RefreshFeatures();
            }

            if (((RefreshFlags & TerrainRefreshType.Roads) == TerrainRefreshType.Roads))
            {
                RefreshRoads();
            }

            if (((RefreshFlags & TerrainRefreshType.Marshes) == TerrainRefreshType.Marshes))
            {
                RefreshMarshes();
            }

            if (((RefreshFlags & TerrainRefreshType.Oases) == TerrainRefreshType.Oases))
            {
                RefreshOases();
            }

            if (((RefreshFlags & TerrainRefreshType.Visibility) == TerrainRefreshType.Visibility))
            {
                RefreshVisibility();
            }

            RefreshFlags = TerrainRefreshType.None;

            RefreshCoroutine = null;

            MapRenderingSignals.ChunkFinishedRefreshing.OnNext(this);
        }