public Mesh GetTerrainInnerMesh(TerrainViewFeature feature) { Mesh mesh; if (innerDictionary.TryGetValue(feature, out mesh)) { return(mesh); } mesh = generateInnerMesh(feature); innerDictionary.Add(feature, mesh); return(mesh); }
public Mesh GetTerrainSurfaceMesh(TerrainViewFeature feature) { Mesh mesh; if (surfaceDictionary.TryGetValue(feature, out mesh)) { return(mesh); } mesh = generateSurfaceMesh(feature); surfaceDictionary.Add(feature, mesh); return(mesh); }
public Texture2D GetTerrainTexture(TerrainViewFeature feature) { Texture2D texture; if (textureDictionary.TryGetValue(feature, out texture)) { return(texture); } texture = generateTerrain(feature); textureDictionary.Add(feature, texture); return(texture); }
private Mesh generateSurfaceMesh(TerrainViewFeature feature) { Mesh mesh = new Mesh(); mesh.vertices = surfaceVertices; mesh.normals = surfaceNormals; mesh.uv = surfaceUVs; List <int> triangleList = new List <int>(); if (!feature.WaterCenter) { triangleList.AddRange(surfaceTriangles[4]); } if (!feature.WaterF) { triangleList.AddRange(surfaceTriangles[7]); } if (!feature.WaterL) { triangleList.AddRange(surfaceTriangles[3]); } if (!feature.WaterB) { triangleList.AddRange(surfaceTriangles[1]); } if (!feature.WaterR) { triangleList.AddRange(surfaceTriangles[5]); } if (!feature.WaterFL) { triangleList.AddRange(surfaceTriangles[6]); } if (!feature.WaterBL) { triangleList.AddRange(surfaceTriangles[0]); } if (!feature.WaterBR) { triangleList.AddRange(surfaceTriangles[2]); } if (!feature.WaterFR) { triangleList.AddRange(surfaceTriangles[8]); } mesh.triangles = triangleList.ToArray(); return(mesh); }
public void SetFeature(TerrainViewFeature viewFeature, TerrainTallFeature tallFeature) { this.viewFeature = viewFeature; this.tallFeature = tallFeature; Vector3 position = transform.position; position.y = (this.tallFeature.Tall - 1) * TALL_HEIGHT; transform.position = position; tallFeature.Tall = 0; mfSurface.sharedMesh = TerrainMeshGenerator.Instance.GetTerrainSurfaceMesh(viewFeature); mfInner.sharedMesh = TerrainMeshGenerator.Instance.GetTerrainInnerMesh(viewFeature); mfOutter.sharedMesh = TerrainMeshGenerator.Instance.GetTerrainOutterMesh(tallFeature); }
private void terrainViewFeatureOfPosition(Vector2Int position, out TerrainViewFeature terrainViewFeature, out TerrainTallFeature terrainTallFeature) { int x = position.x; int y = position.y; terrainViewFeature = new TerrainViewFeature(false, false, false, false, false, false, false, false, false); terrainTallFeature = new TerrainTallFeature(0, false, false, false, false); bool waterCenter = island.TerrainTypeOfCell(position) == TerrainType.Water; if (waterCenter) { bool waterFront = island.TerrainTypeOfCell(new Vector2Int(x, y - 1)) == TerrainType.Water; bool waterLeft = island.TerrainTypeOfCell(new Vector2Int(x - 1, y)) == TerrainType.Water; bool waterBack = island.TerrainTypeOfCell(new Vector2Int(x, y + 1)) == TerrainType.Water; bool waterRight = island.TerrainTypeOfCell(new Vector2Int(x + 1, y)) == TerrainType.Water; bool waterFrontLeft = island.TerrainTypeOfCell(new Vector2Int(x - 1, y - 1)) == TerrainType.Water; bool waterBackLeft = island.TerrainTypeOfCell(new Vector2Int(x - 1, y + 1)) == TerrainType.Water; bool waterBackRight = island.TerrainTypeOfCell(new Vector2Int(x + 1, y + 1)) == TerrainType.Water; bool waterFrontRight = island.TerrainTypeOfCell(new Vector2Int(x + 1, y - 1)) == TerrainType.Water; terrainViewFeature.WaterCenter = waterCenter; terrainViewFeature.WaterF = waterFront; terrainViewFeature.WaterL = waterLeft; terrainViewFeature.WaterB = waterBack; terrainViewFeature.WaterR = waterRight; terrainViewFeature.WaterFL = waterFront && waterLeft && waterFrontLeft; terrainViewFeature.WaterBL = waterBack && waterLeft && waterBackLeft; terrainViewFeature.WaterBR = waterBack && waterRight && waterBackRight; terrainViewFeature.WaterFR = waterFront && waterRight && waterFrontRight; } TerrainTall tall = island.TerrainTallOfCell(position); bool tallFront = island.TerrainTallOfCell(new Vector2Int(x, y - 1)) < tall; bool tallLeft = island.TerrainTallOfCell(new Vector2Int(x - 1, y)) < tall; bool tallBack = island.TerrainTallOfCell(new Vector2Int(x, y + 1)) < tall; bool tallRight = island.TerrainTallOfCell(new Vector2Int(x + 1, y)) < tall; terrainTallFeature.Front = tallFront; terrainTallFeature.Left = tallLeft; terrainTallFeature.Back = tallBack; terrainTallFeature.Right = tallRight; terrainTallFeature.Tall = (int)tall; return; }
private Texture2D generateTerrain(TerrainViewFeature feature) { Texture2D texture = new Texture2D(width, width); int p0 = 0; int p1 = edge; int p2 = width - edge; int p3 = width; // Top setPixel(texture, p1, p2, p2, p3, feature.WaterF ? WaterColor : GrassColor); // Down setPixel(texture, p1, p2, p0, p1, feature.WaterB ? WaterColor : GrassColor); // Left setPixel(texture, p0, p1, p1, p2, feature.WaterL ? WaterColor : GrassColor); // Right setPixel(texture, p2, p3, p1, p2, feature.WaterR ? WaterColor : GrassColor); // TopLeft setPixel(texture, p0, p1, p2, p3, feature.WaterFL ? WaterColor : GrassColor); // TopRight setPixel(texture, p2, p3, p2, p3, feature.WaterFR ? WaterColor : GrassColor); // DownLeft setPixel(texture, p0, p1, p0, p1, feature.WaterBL ? WaterColor : GrassColor); // DownRight setPixel(texture, p2, p3, p0, p1, feature.WaterBR ? WaterColor : GrassColor); // Center setPixel(texture, p1, p2, p1, p2, feature.WaterCenter ? WaterColor : GrassColor); texture.Apply(); return(texture); }
private Mesh generateInnerMesh(TerrainViewFeature feature) { if (!feature.WaterCenter) { return(null); } Mesh mesh = new Mesh(); mesh.vertices = innerVertices; Vector3[] normals = new Vector3[32]; System.Array.Copy(innerNormals, normals, 32); List <int> triangleList = new List <int>(); if (!feature.WaterF) { triangleList.AddRange(innerTriangles[11]); } if (!feature.WaterL) { triangleList.AddRange(innerTriangles[8]); } if (!feature.WaterB) { triangleList.AddRange(innerTriangles[9]); } if (!feature.WaterR) { triangleList.AddRange(innerTriangles[10]); } if (!feature.WaterFL && feature.WaterF) { triangleList.AddRange(innerTriangles[6]); } if (!feature.WaterFL && feature.WaterL) { triangleList.AddRange(innerTriangles[7]); } if (!feature.WaterBL && feature.WaterB) { triangleList.AddRange(innerTriangles[1]); } if (!feature.WaterBL && feature.WaterL) { triangleList.AddRange(innerTriangles[0]); } if (!feature.WaterBR && feature.WaterB) { triangleList.AddRange(innerTriangles[2]); } if (!feature.WaterBR && feature.WaterR) { triangleList.AddRange(innerTriangles[3]); } if (!feature.WaterFR && feature.WaterF) { triangleList.AddRange(innerTriangles[5]); } if (!feature.WaterFR && feature.WaterR) { triangleList.AddRange(innerTriangles[4]); } if (!feature.WaterF) { normals[10] = normals[13] = normals[26] = normals[29] = normalBack; } if (!feature.WaterL) { normals[1] = normals[14] = normals[17] = normals[30] = normalRight; } if (!feature.WaterB) { normals[2] = normals[5] = normals[18] = normals[21] = normalFront; } if (!feature.WaterR) { normals[6] = normals[9] = normals[22] = normals[25] = normalLeft; } mesh.triangles = triangleList.ToArray(); mesh.normals = normals; return(mesh); }
public void SetTerrainFeature(Vector2Int position, TerrainViewFeature viewFeature, TerrainTallFeature tallFeature) { TerrainCellView terrainCellView = getCellView(position); terrainCellView.SetFeature(viewFeature, tallFeature); }
private void init() { TerrainViewFeature feature = new TerrainViewFeature(false, false, false, false, false, false, false, false, false); textureDictionary.Add(feature, generateTerrain(feature)); }