public void DrawMesh(List <MeshData> meshDatas, float meshScale, Material shaderMaterial) { var tempList = terrainParent.transform.Cast <Transform>().ToList(); foreach (Transform child in tempList) { GameObject.DestroyImmediate(child.gameObject); } terrainParent.transform.localScale = new Vector3(1, 1, 1); foreach (MeshData data in meshDatas) { Vector3 offset = Vector3.zero; if (data.chunkCoords.x > 0) { offset.x = NoiseGen.MAX_CHUNK_SIZE * (data.chunkCoords.x - 1) + NoiseGen.MAX_CHUNK_SIZE / 2f + 0.5f * data.dims.x; offset.x -= 0.5f; } if (data.chunkCoords.y > 0) { offset.z = -(NoiseGen.MAX_CHUNK_SIZE * (data.chunkCoords.y - 1) + NoiseGen.MAX_CHUNK_SIZE / 2f + 0.5f * data.dims.y); offset.z += 0.5f; } GameObject mesh = Instantiate(meshPrefab, offset, Quaternion.identity); mesh.transform.parent = terrainParent.transform; MeshFilter meshFilter = mesh.GetComponent <MeshFilter>(); MeshRenderer meshRenderer = mesh.GetComponent <MeshRenderer>(); MeshCollider meshCollider = mesh.GetComponent <MeshCollider>(); MeshFields meshFields = mesh.GetComponent <MeshFields>(); meshFields.MeshData = data; Mesh meshObject = data.CreateMesh(); meshFilter.sharedMesh = meshObject; meshCollider.sharedMesh = meshObject; if (shaderMaterial != null) { meshRenderer.material = shaderMaterial; } else { meshRenderer.material = new Material(Shader.Find("Standard")); meshRenderer.sharedMaterial.SetFloat("_Glossiness", 0f); meshRenderer.sharedMaterial.mainTexture = data.texture; } } terrainParent.transform.localScale = new Vector3(meshScale, 1, meshScale); }
void OnScene(SceneView scene) { if (stampMode == StampMode.Nothing) { return; } HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive)); Event e = Event.current; terrainGenerator = gameObject.GetComponent <TerrainGenerator>(); if (e.type == EventType.MouseDown && e.button == 0) { Vector3 mousePos = e.mousePosition; float ppp = EditorGUIUtility.pixelsPerPoint; mousePos.y = scene.camera.pixelHeight - mousePos.y * ppp; mousePos.x *= ppp; Ray ray = scene.camera.ScreenPointToRay(mousePos); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { Mesh mesh = hit.collider.gameObject.GetComponent <MeshFilter>().sharedMesh; MeshRenderer meshRenderer = hit.collider.gameObject.GetComponent <MeshRenderer>(); MeshFields meshFields = hit.collider.gameObject.GetComponent <MeshFields>(); MeshCollider meshCollider = hit.collider.gameObject.GetComponent <MeshCollider>(); Transform trans = hit.collider.gameObject.transform; Vector3[] verts = mesh.vertices; List <VertexData> verticesToChange = new List <VertexData>(); float nearestDistance = Mathf.Infinity; for (int i = 0; i < verts.Length; i++) { Vector3 worldPt = trans.TransformPoint(verts[i]); float dist = Vector2.Distance(new Vector2(worldPt.x, worldPt.z), new Vector2(hit.point.x, hit.point.z)); if (dist < radius) { if (stampMode == StampMode.Mountain) { verts[i].y += (radius - dist) * heightMultiplier + Random.Range(0, persistance); meshFields.MeshData.colorMap[i] = checkColorFromHeight(verts[i].y, terrainGenerator.regions, terrainGenerator.meshHeightCurve, terrainGenerator.meshHeightMultiplier); } if (stampMode == StampMode.Flatten) { bool nearestToCursor = false; if (dist < nearestDistance) { nearestDistance = dist; nearestToCursor = true; } VertexData vertex = new VertexData(i, verts[i], nearestToCursor); verticesToChange.Add(vertex); } if (stampMode == StampMode.Paint) { meshFields.MeshData.colorMap[i] = paintColor; } } } if (stampMode == StampMode.Flatten) { float referenceY = 0f; foreach (VertexData vertexData in verticesToChange.Where(vertexData => vertexData.closestToCursor)) { referenceY = vertexData.position.y; } foreach (VertexData vertexData in verticesToChange) { float dif = referenceY - verts[vertexData.index].y; if (Math.Abs(dif) < flattenStepSize) { verts[vertexData.index].y = referenceY; } else if (dif < 0) { verts[vertexData.index].y -= flattenStepSize; } else if (dif > 0) { verts[vertexData.index].y += flattenStepSize; } meshFields.MeshData.colorMap[vertexData.index] = checkColorFromHeight(verts[vertexData.index].y, terrainGenerator.regions, terrainGenerator.meshHeightCurve, terrainGenerator.meshHeightMultiplier); } } mesh.vertices = verts; mesh.RecalculateBounds(); mesh.RecalculateNormals(); meshCollider.sharedMesh = mesh; Texture2D meshTexture = TextureGen.TextureFromColorMap(meshFields.MeshData.colorMap, meshFields.MeshData.dims.x, (int)mesh.bounds.size.z); meshRenderer.sharedMaterial.mainTexture = meshTexture; } e.Use(); } HandleUtility.Repaint(); }