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); }
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(); }
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); } } }
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); }
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(); }