Ejemplo n.º 1
0
        public override IEnumerable Regenerate()
        {
            foreach (object item2 in base.Regenerate())
            {
                yield return(item2);
            }
            LayerSubMesh           subMesh       = GetSubMesh(WorldMaterials.Rivers);
            LayerSubMesh           subMeshBorder = GetSubMesh(WorldMaterials.RiversBorder);
            WorldGrid              grid          = Find.WorldGrid;
            List <OutputDirection> outputs       = new List <OutputDirection>();
            List <OutputDirection> outputsBorder = new List <OutputDirection>();
            int i = 0;

            while (i < grid.TilesCount)
            {
                if (i % 1000 == 0)
                {
                    yield return(null);
                }
                if (subMesh.verts.Count > 60000)
                {
                    subMesh       = GetSubMesh(WorldMaterials.Rivers);
                    subMeshBorder = GetSubMesh(WorldMaterials.RiversBorder);
                }
                Tile tile = grid[i];
                if (tile.potentialRivers != null)
                {
                    outputs.Clear();
                    outputsBorder.Clear();
                    for (int j = 0; j < tile.potentialRivers.Count; j++)
                    {
                        OutputDirection item = new OutputDirection
                        {
                            neighbor = tile.potentialRivers[j].neighbor,
                            width    = tile.potentialRivers[j].river.widthOnWorld - 0.2f
                        };
                        outputs.Add(item);
                        item = new OutputDirection
                        {
                            neighbor = tile.potentialRivers[j].neighbor,
                            width    = tile.potentialRivers[j].river.widthOnWorld
                        };
                        outputsBorder.Add(item);
                    }
                    GeneratePaths(subMesh, i, outputs, riverColor, allowSmoothTransition: true);
                    GeneratePaths(subMeshBorder, i, outputsBorder, riverColor, allowSmoothTransition: true);
                }
                int num = i + 1;
                i = num;
            }
            FinalizeMesh(MeshParts.All);
        }
Ejemplo n.º 2
0
        private void AddPathEndpoint(LayerSubMesh subMesh, List <Vector3> verts, int index, Color32 color, int tileID, OutputDirection data)
        {
            int index2 = (index + 1) % verts.Count;

            Find.WorldGrid.GetTileNeighbors(tileID, lhsID);
            Find.WorldGrid.GetTileNeighbors(data.neighbor, rhsID);
            float   num = lhsID.Intersect(rhsID).Any((int id) => Find.WorldGrid[id].WaterCovered) ? 0.5f : 1f;
            Vector3 a   = FinalizePoint(verts[index], data.distortionFrequency, data.distortionIntensity * num);
            Vector3 b   = FinalizePoint(verts[index2], data.distortionFrequency, data.distortionIntensity * num);

            subMesh.verts.Add(Vector3.LerpUnclamped(a, b, 0.5f - data.width));
            subMesh.colors.Add(color.MutateAlpha(0));
            subMesh.verts.Add(Vector3.LerpUnclamped(a, b, 0.5f));
            subMesh.colors.Add(color);
            subMesh.verts.Add(Vector3.LerpUnclamped(a, b, 0.5f + data.width));
            subMesh.colors.Add(color.MutateAlpha(0));
        }
        public override IEnumerable Regenerate()
        {
            IEnumerator enumerator = base.Regenerate().GetEnumerator();

            try
            {
                if (enumerator.MoveNext())
                {
                    object result = enumerator.Current;
                    yield return(result);

                    /*Error: Unable to find new state assignment for yield return*/;
                }
            }
            finally
            {
                IDisposable disposable;
                IDisposable disposable2 = disposable = (enumerator as IDisposable);
                if (disposable != null)
                {
                    disposable2.Dispose();
                }
            }
            LayerSubMesh             subMesh       = base.GetSubMesh(WorldMaterials.Roads);
            WorldGrid                grid          = Find.WorldGrid;
            List <RoadWorldLayerDef> roadLayerDefs = (from rwld in DefDatabase <RoadWorldLayerDef> .AllDefs
                                                      orderby rwld.order
                                                      select rwld).ToList();

            for (int i = 0; i < grid.TilesCount; i++)
            {
                if (i % 1000 == 0)
                {
                    yield return((object)null);

                    /*Error: Unable to find new state assignment for yield return*/;
                }
                if (subMesh.verts.Count > 60000)
                {
                    subMesh = base.GetSubMesh(WorldMaterials.Roads);
                }
                Tile tile = grid[i];
                if (!tile.WaterCovered)
                {
                    List <OutputDirection> outputs = new List <OutputDirection>();
                    if (tile.roads != null)
                    {
                        bool allowSmoothTransition = true;
                        for (int j = 0; j < tile.roads.Count - 1; j++)
                        {
                            Tile.RoadLink roadLink             = tile.roads[j];
                            string        worldTransitionGroup = roadLink.road.worldTransitionGroup;
                            Tile.RoadLink roadLink2            = tile.roads[j + 1];
                            if (worldTransitionGroup != roadLink2.road.worldTransitionGroup)
                            {
                                allowSmoothTransition = false;
                            }
                        }
                        for (int k = 0; k < roadLayerDefs.Count; k++)
                        {
                            bool flag = false;
                            outputs.Clear();
                            for (int l = 0; l < tile.roads.Count; l++)
                            {
                                Tile.RoadLink roadLink3  = tile.roads[l];
                                RoadDef       road       = roadLink3.road;
                                float         layerWidth = road.GetLayerWidth(roadLayerDefs[k]);
                                if (layerWidth > 0.0)
                                {
                                    flag = true;
                                }
                                List <OutputDirection> list      = outputs;
                                OutputDirection        item      = default(OutputDirection);
                                Tile.RoadLink          roadLink4 = tile.roads[l];
                                item.neighbor            = roadLink4.neighbor;
                                item.width               = layerWidth;
                                item.distortionFrequency = road.distortionFrequency;
                                item.distortionIntensity = road.distortionIntensity;
                                list.Add(item);
                            }
                            if (flag)
                            {
                                base.GeneratePaths(subMesh, i, outputs, roadLayerDefs[k].color, allowSmoothTransition);
                            }
                        }
                    }
                }
            }
            base.FinalizeMesh(MeshParts.All);
            yield break;
IL_03a2:
            /*Error near IL_03a3: Unexpected return in MoveNext()*/;
        }
Ejemplo n.º 4
0
        public void GeneratePaths(LayerSubMesh subMesh, int tileID, List <OutputDirection> nodes, Color32 color, bool allowSmoothTransition)
        {
            WorldGrid worldGrid = Find.WorldGrid;

            worldGrid.GetTileVertices(tileID, tmpVerts);
            worldGrid.GetTileNeighbors(tileID, tmpNeighbors);
            if (nodes.Count == 1 && pointyEnds)
            {
                int             count           = subMesh.verts.Count;
                List <Vector3>  verts           = tmpVerts;
                List <int>      list            = tmpNeighbors;
                OutputDirection outputDirection = nodes[0];
                AddPathEndpoint(subMesh, verts, list.IndexOf(outputDirection.neighbor), color, tileID, nodes[0]);
                List <Vector3>  verts2              = subMesh.verts;
                Vector3         tileCenter          = worldGrid.GetTileCenter(tileID);
                OutputDirection outputDirection2    = nodes[0];
                float           distortionFrequency = outputDirection2.distortionFrequency;
                OutputDirection outputDirection3    = nodes[0];
                verts2.Add(FinalizePoint(tileCenter, distortionFrequency, outputDirection3.distortionIntensity));
                subMesh.colors.Add(color.MutateAlpha(0));
                subMesh.tris.Add(count);
                subMesh.tris.Add(count + 3);
                subMesh.tris.Add(count + 1);
                subMesh.tris.Add(count + 1);
                subMesh.tris.Add(count + 3);
                subMesh.tris.Add(count + 2);
            }
            else
            {
                if (nodes.Count == 2)
                {
                    int             count2           = subMesh.verts.Count;
                    List <int>      list2            = tmpNeighbors;
                    OutputDirection outputDirection4 = nodes[0];
                    int             num              = list2.IndexOf(outputDirection4.neighbor);
                    List <int>      list3            = tmpNeighbors;
                    OutputDirection outputDirection5 = nodes[1];
                    int             num2             = list3.IndexOf(outputDirection5.neighbor);
                    if (allowSmoothTransition && Mathf.Abs(num - num2) > 1 && Mathf.Abs((num - num2 + tmpVerts.Count) % tmpVerts.Count) > 1)
                    {
                        AddPathEndpoint(subMesh, tmpVerts, num, color, tileID, nodes[0]);
                        AddPathEndpoint(subMesh, tmpVerts, num2, color, tileID, nodes[1]);
                        subMesh.tris.Add(count2);
                        subMesh.tris.Add(count2 + 5);
                        subMesh.tris.Add(count2 + 1);
                        subMesh.tris.Add(count2 + 5);
                        subMesh.tris.Add(count2 + 4);
                        subMesh.tris.Add(count2 + 1);
                        subMesh.tris.Add(count2 + 1);
                        subMesh.tris.Add(count2 + 4);
                        subMesh.tris.Add(count2 + 2);
                        subMesh.tris.Add(count2 + 4);
                        subMesh.tris.Add(count2 + 3);
                        subMesh.tris.Add(count2 + 2);
                        return;
                    }
                }
                float num3 = 0f;
                for (int i = 0; i < nodes.Count; i++)
                {
                    float           a = num3;
                    OutputDirection outputDirection6 = nodes[i];
                    num3 = Mathf.Max(a, outputDirection6.width);
                }
                Vector3 tileCenter2 = worldGrid.GetTileCenter(tileID);
                tmpHexVerts.Clear();
                for (int j = 0; j < tmpVerts.Count; j++)
                {
                    tmpHexVerts.Add(FinalizePoint(Vector3.LerpUnclamped(tileCenter2, tmpVerts[j], num3 * 0.5f * 2f), 0f, 0f));
                }
                tileCenter2 = FinalizePoint(tileCenter2, 0f, 0f);
                int count3 = subMesh.verts.Count;
                subMesh.verts.Add(tileCenter2);
                subMesh.colors.Add(color);
                int count4 = subMesh.verts.Count;
                for (int k = 0; k < tmpHexVerts.Count; k++)
                {
                    subMesh.verts.Add(tmpHexVerts[k]);
                    subMesh.colors.Add(color.MutateAlpha(0));
                    subMesh.tris.Add(count3);
                    subMesh.tris.Add(count4 + (k + 1) % tmpHexVerts.Count);
                    subMesh.tris.Add(count4 + k);
                }
                for (int l = 0; l < nodes.Count; l++)
                {
                    OutputDirection outputDirection7 = nodes[l];
                    if (outputDirection7.width != 0f)
                    {
                        int             count5           = subMesh.verts.Count;
                        List <int>      list4            = tmpNeighbors;
                        OutputDirection outputDirection8 = nodes[l];
                        int             num4             = list4.IndexOf(outputDirection8.neighbor);
                        AddPathEndpoint(subMesh, tmpVerts, num4, color, tileID, nodes[l]);
                        subMesh.tris.Add(count5);
                        subMesh.tris.Add(count4 + (num4 + tmpHexVerts.Count - 1) % tmpHexVerts.Count);
                        subMesh.tris.Add(count3);
                        subMesh.tris.Add(count5);
                        subMesh.tris.Add(count3);
                        subMesh.tris.Add(count5 + 1);
                        subMesh.tris.Add(count5 + 1);
                        subMesh.tris.Add(count3);
                        subMesh.tris.Add(count5 + 2);
                        subMesh.tris.Add(count3);
                        subMesh.tris.Add(count4 + (num4 + 2) % tmpHexVerts.Count);
                        subMesh.tris.Add(count5 + 2);
                    }
                }
            }
        }
        public override IEnumerable Regenerate()
        {
            IEnumerator enumerator = base.Regenerate().GetEnumerator();

            try
            {
                if (enumerator.MoveNext())
                {
                    object result = enumerator.Current;
                    yield return(result);

                    /*Error: Unable to find new state assignment for yield return*/;
                }
            }
            finally
            {
                IDisposable disposable;
                IDisposable disposable2 = disposable = (enumerator as IDisposable);
                if (disposable != null)
                {
                    disposable2.Dispose();
                }
            }
            LayerSubMesh           subMesh       = base.GetSubMesh(WorldMaterials.Rivers);
            LayerSubMesh           subMeshBorder = base.GetSubMesh(WorldMaterials.RiversBorder);
            WorldGrid              grid          = Find.WorldGrid;
            List <OutputDirection> outputs       = new List <OutputDirection>();
            List <OutputDirection> outputsBorder = new List <OutputDirection>();

            for (int i = 0; i < grid.TilesCount; i++)
            {
                if (i % 1000 == 0)
                {
                    yield return((object)null);

                    /*Error: Unable to find new state assignment for yield return*/;
                }
                if (subMesh.verts.Count > 60000)
                {
                    subMesh       = base.GetSubMesh(WorldMaterials.Rivers);
                    subMeshBorder = base.GetSubMesh(WorldMaterials.RiversBorder);
                }
                Tile tile = grid[i];
                if (tile.rivers != null)
                {
                    outputs.Clear();
                    outputsBorder.Clear();
                    for (int j = 0; j < tile.rivers.Count; j++)
                    {
                        List <OutputDirection> list      = outputs;
                        OutputDirection        item      = default(OutputDirection);
                        Tile.RiverLink         riverLink = tile.rivers[j];
                        item.neighbor = riverLink.neighbor;
                        Tile.RiverLink riverLink2 = tile.rivers[j];
                        item.width = (float)(riverLink2.river.widthOnWorld - 0.20000000298023224);
                        list.Add(item);
                        List <OutputDirection> list2      = outputsBorder;
                        OutputDirection        item2      = default(OutputDirection);
                        Tile.RiverLink         riverLink3 = tile.rivers[j];
                        item2.neighbor = riverLink3.neighbor;
                        Tile.RiverLink riverLink4 = tile.rivers[j];
                        item2.width = riverLink4.river.widthOnWorld;
                        list2.Add(item2);
                    }
                    base.GeneratePaths(subMesh, i, outputs, this.riverColor, true);
                    base.GeneratePaths(subMeshBorder, i, outputsBorder, this.riverColor, true);
                }
            }
            base.FinalizeMesh(MeshParts.All);
            yield break;
IL_0335:
            /*Error near IL_0336: Unexpected return in MoveNext()*/;
        }
Ejemplo n.º 6
0
        private void AddPathEndpoint(LayerSubMesh subMesh, List <Vector3> verts, int index, Color32 color, OutputDirection data)
        {
            int     index2 = (index + 1) % verts.Count;
            Vector3 a      = this.FinalizePoint(verts[index], data.distortionFrequency, data.distortionIntensity);
            Vector3 b      = this.FinalizePoint(verts[index2], data.distortionFrequency, data.distortionIntensity);

            subMesh.verts.Add(Vector3.LerpUnclamped(a, b, (float)(0.5 - data.width)));
            subMesh.colors.Add(color.MutateAlpha(0));
            subMesh.verts.Add(Vector3.LerpUnclamped(a, b, 0.5f));
            subMesh.colors.Add(color);
            subMesh.verts.Add(Vector3.LerpUnclamped(a, b, (float)(0.5 + data.width)));
            subMesh.colors.Add(color.MutateAlpha(0));
        }