public void EnsureMaxDepth() { if (subQuads.Count > 0) { a.EnsureMaxDepth(); b.EnsureMaxDepth(); c.EnsureMaxDepth(); d.EnsureMaxDepth(); } else { //Work up from here if (parent != null) { parent.Equalise(); } } }
private void Awake() { instance = this; emptyMesh = new Mesh(); parentQuad = new Quad(0, 0, 100, 100); AutoSubdivide(parentQuad); // NeighbourSubdivide(parentQuad); parentQuad.EnsureMaxDepth(); parentQuad.FinaliseGeometry(min, max, transform.position.y); parentQuad.DeleteUnrequired(min, max, transform.position.y); tris.Clear(); parentQuad.RedrawGeometry(min, max, transform.position.y); Vector3 minT = transform.InverseTransformPoint(min); Vector3 maxT = transform.InverseTransformPoint(max); for (int i = 0; i < verts.Count; i++) { Vector3 localPos = verts[i]; //float realXPos = trans.TransformPoint(localPos).x; //float realZPos = trans.TransformPoint(localPos).z; float realXPos = localPos.x; float realZPos = localPos.y; float percX = ((realXPos - minT.x) * 100) / (maxT.x - minT.x); float percY = ((realZPos - minT.y) * 100) / (maxT.y - minT.y); int pixelX = Mathf.Clamp(Mathf.RoundToInt(percX / 100 * testTexture.width), 0, testTexture.width - 1); int pixelY = Mathf.Clamp(Mathf.RoundToInt(percY / 100 * testTexture.height), 0, testTexture.height - 1); float r = testTexture.GetPixel(pixelX, pixelY).r; float val = r; float Fy = (val * maxHeight); localPos = new Vector3(localPos.x, localPos.y, Fy); verts[i] = localPos; } emptyMesh.vertices = verts.ToArray(); emptyMesh.triangles = tris.ToArray(); emptyMesh.uv = UVs.ToArray(); emptyMesh.RecalculateBounds(); emptyMesh.RecalculateNormals(); emptyMesh.RecalculateTangents(); GetComponent <MeshFilter>().mesh = emptyMesh; GetComponent <MeshCollider>().sharedMesh = emptyMesh; string path = "Assets/TerrainChunks/MeshData/"; AssetDatabase.CreateAsset(emptyMesh, path + ID + "_MESH.mesh"); AssetDatabase.SaveAssets(); verts.Clear(); indexFromVector.Clear(); tris.Clear(); UVs.Clear(); }