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);
    }
Beispiel #2
0
    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();
    }