Пример #1
0
    List <Vector3> ApplyHeight(MeshRegion meshReg, float altitude, AnimationCurve curve, NoiseData noiseData, int seed)
    {
        List <Vector3> newVertices = new List <Vector3> ();

        // Get the rectangle region of the island
        Rect lot = meshReg.GetRectContainingVertices();

        float[,] noiseMap = Noise.GenerateNoiseMap(Mathf.RoundToInt(lot.width + 2), Mathf.RoundToInt(lot.height + 2), noiseData, seed);

        for (int i = 0; i < meshReg.Vertices.Count; i++)
        {
            Vector3 vertexPos = meshReg.Vertices[i];

            int mapX = Mathf.RoundToInt(Mathf.InverseLerp(lot.xMin, lot.xMax, vertexPos.x) * lot.width);
            int mapY = Mathf.RoundToInt(Mathf.InverseLerp(lot.yMin, lot.yMax, vertexPos.z) * lot.height);

            if (meshReg.gradientMap.ContainsKey(i))
            {
                vertexPos.y = curve.Evaluate(meshReg.gradientMap[i]) * altitude;
            }
            else
            {
                vertexPos.y = 0;
            }

            vertexPos.y *= noiseMap[mapX, mapY];

            newVertices.Add(vertexPos);
        }

        return(newVertices);
    }
Пример #2
0
        private void BuildBackground(Rule rule, TerrainMeshData meshData, MeshRegion meshRegion, RenderMode renderMode)
        {
            if (meshRegion.Mesh == null)
            {
                return;
            }
            var gradient = rule.GetBackgroundLayerGradient(_customizationService);

            float eleNoiseFreq   = rule.GetBackgroundLayerEleNoiseFreq();
            float colorNoiseFreq = renderMode == RenderMode.Scene ? rule.GetBackgroundLayerColorNoiseFreq() : 0;

            foreach (var triangle in meshRegion.Mesh.Triangles)
            {
                AddTriangle(rule, meshData, triangle, gradient, eleNoiseFreq, colorNoiseFreq);
            }

            meshRegion.Dispose();
        }
Пример #3
0
        private void BuildOffsetShape(TerrainMeshData meshData, MeshRegion region, GradientWrapper gradient,
                                      Rectangle2d rect, float colorNoiseFreq, float deepLevel)
        {
            foreach (var contour in region.Contours)
            {
                var length = contour.Count;
                for (int i = 0; i < length; i++)
                {
                    var v2DIndex = i == (length - 1) ? 0 : i + 1;
                    var p1       = new Vector2d((float)contour[i].X, (float)contour[i].Y);
                    var p2       = new Vector2d((float)contour[v2DIndex].X, (float)contour[v2DIndex].Y);

                    // check whether two points are on cell rect
                    if (rect.IsOnBorder(p1) && rect.IsOnBorder(p2))
                    {
                        continue;
                    }

                    var ele1 = _elevationProvider.GetElevation(p1);
                    var ele2 = _elevationProvider.GetElevation(p2);

                    var firstColor = GradientUtils.GetColor(gradient,
                                                            new Vector3((float)p1.X, ele1, (float)p1.Y), colorNoiseFreq);

                    var secondColor = GradientUtils.GetColor(gradient,
                                                             new Vector3((float)p2.X, ele1 - deepLevel, (float)p2.Y), colorNoiseFreq);

                    meshData.AddTriangle(
                        new Vector3((float)p1.X, ele1, (float)p1.Y),
                        new Vector3((float)p2.X, ele2 - deepLevel, (float)p2.Y),
                        new Vector3((float)p2.X, ele2, (float)p2.Y),
                        firstColor);

                    meshData.AddTriangle(
                        new Vector3((float)p1.X, ele1 - deepLevel, (float)p1.Y),
                        new Vector3((float)p2.X, ele2 - deepLevel, (float)p2.Y),
                        new Vector3((float)p1.X, ele1, (float)p1.Y),
                        secondColor);
                }
            }
        }
Пример #4
0
    public List <Mesh> GenerateMesh(MapRegion region, IsleInfo info, float squareSize, float depth)
    {
        squareGrid = new SquareGrid(region, squareSize);
        vertices.Clear();
        triangles.Clear();

        meshRegion = new MeshRegion();

        for (int x = 0; x < squareGrid.squares.GetLength(0); x++)
        {
            for (int y = 0; y < squareGrid.squares.GetLength(1); y++)
            {
                TriangulateSquare(squareGrid.squares[x, y]);
            }
        }

        List <Mesh> meshList = new List <Mesh> ();

        Mesh surfaceMesh = new Mesh();

        surfaceMesh.vertices  = vertices.ToArray();
        surfaceMesh.triangles = triangles.ToArray();
        surfaceMesh.RecalculateNormals();

        Mesh undersideMesh = new Mesh();

        triangles.Reverse();
        undersideMesh.vertices  = vertices.ToArray();
        undersideMesh.triangles = triangles.ToArray();
        undersideMesh.RecalculateNormals();

        meshList.Add(surfaceMesh);
        meshList.Add(CreateWallMesh(depth));
        meshList.Add(undersideMesh);

        info.surfaceMeshRegion = meshRegion;
        return(meshList);
    }
Пример #5
0
        private void BuildSurface(Rule rule, TerrainMeshData meshData, MeshRegion meshRegion, RenderMode renderMode)
        {
            if (meshRegion.Mesh == null)
            {
                return;
            }

            float colorNoiseFreq = renderMode == RenderMode.Scene ? meshRegion.ColorNoiseFreq : 0;
            float eleNoiseFreq   = renderMode == RenderMode.Scene ? meshRegion.ElevationNoiseFreq : 0;
            var   gradient       = _customizationService.GetGradient(meshRegion.GradientKey);

            if (meshRegion.ModifyMeshAction != null)
            {
                meshRegion.ModifyMeshAction(meshRegion.Mesh);
            }

            foreach (var triangle in meshRegion.Mesh.Triangles)
            {
                AddTriangle(rule, meshData, triangle, gradient, eleNoiseFreq, colorNoiseFreq);
            }

            meshRegion.Dispose();
        }