Material GenerateMaterial_Basemap()
    {
        //Export basemaps (diffuse and normal)
        Texture2D basemapDiffuse = null;
        Texture2D basemapNormal  = null;

        bool sRGB = QualitySettings.activeColorSpace == ColorSpace.Linear;


        TerrainToMeshConverter.ExtractBasemap(sourceTerrain, out basemapDiffuse, out basemapNormal, 1024, 1024, sRGB);


        Material newMaterial = null;

        if (renderPipeline == RENDER_PIPELINE.Lightweight)
        {
            newMaterial = new Material(Shader.Find("LightweightPipeline/Standard (Physically Based)"));
        }
        else
        {
            newMaterial = new Material(Shader.Find(basemapNormal != null ? "Legacy Shaders/Bumped Diffuse" : "Legacy Shaders/Diffuse"));
        }

        newMaterial.mainTexture = basemapDiffuse;
        newMaterial.color       = Color.white;
        if (basemapNormal != null)
        {
            newMaterial.SetTexture("_BumpMap", basemapNormal);
        }

        return(newMaterial);
    }
Beispiel #2
0
    Material GenerateMaterial_Basemap()
    {
        //Export basemaps (diffuse and normal)
        Texture2D basemapDiffuse = null;
        Texture2D basemapNormal  = null;

        bool sRGB = QualitySettings.activeColorSpace == ColorSpace.Linear;


        TerrainToMeshConverter.ExtractBasemap(sourceTerrain, out basemapDiffuse, out basemapNormal, 1024, 1024, sRGB);


        Material newMaterial = null;

        if (UnityEngine.Rendering.GraphicsSettings.renderPipelineAsset == null)
        {
            newMaterial = new Material(Shader.Find(basemapNormal != null ? "Legacy Shaders/Bumped Diffuse" : "Legacy Shaders/Diffuse"));

            newMaterial.SetTexture("_MainTex", basemapDiffuse);
            newMaterial.SetColor("_Color", Color.white);
            if (basemapNormal != null)
            {
                newMaterial.SetTexture("_BumpMap", basemapNormal);
            }
        }
        else
        {
            Shader srpShader = Shader.Find("Lightweight Render Pipeline/Lit");
            if (srpShader == null)
            {
                srpShader = Shader.Find("VacuumShaders/Terrain To Mesh/SRP Default");
            }

            newMaterial = new Material(srpShader);

            if (newMaterial.HasProperty("_MainTex"))
            {
                newMaterial.SetTexture("_MainTex", basemapDiffuse);
            }
            if (newMaterial.HasProperty("_BaseMap"))
            {
                newMaterial.SetTexture("_BaseMap", basemapDiffuse);
            }


            newMaterial.SetColor("_Color", Color.white);
            if (basemapNormal != null)
            {
                newMaterial.SetTexture("_BumpMap", basemapNormal);
            }
        }


        return(newMaterial);
    }
Beispiel #3
0
    // Use this for initialization
    void Start()
    {
        float time = Time.realtimeSinceStartup;

        //Cointins OBJ data
        string strOBJ = TerrainToMeshConverter.TerrainToOBJ(terrain, vertexCountHorizontal, vertexCountVertical);

        //Debug.Log("OBJ convertion in: " + (Time.realtimeSinceStartup- time) + " sec");



        //Create directory
        if (Directory.Exists(GetGenerateDirectory()) == false)
        {
            Directory.CreateDirectory(GetGenerateDirectory());
        }


        //File path
        string objFilePath = GetGenerateDirectory() + "/" + terrain.name + ".obj";


        //Save OBJ file
        StreamWriter sw = new StreamWriter(objFilePath);

        try
        {
            sw.WriteLine(strOBJ);
        }
        catch (System.Exception err)
        {
            Debug.LogError("Houston, we have a problem: " + err.Message);
        }
        sw.Close();



        //Refresh asset database
        AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);


        //Load OBJ mesh
        gameObject.AddComponent <MeshFilter>().sharedMesh       = (Mesh)AssetDatabase.LoadAssetAtPath(objFilePath, typeof(Mesh));
        gameObject.AddComponent <MeshRenderer>().sharedMaterial = new Material(Shader.Find("Diffuse"));
    }
Beispiel #4
0
    Material GenerateMaterial_Splatmap()
    {
        Material newMaterial = null;

        //Export terrain splatmaps
        Texture2D[] splatMap = TerrainToMeshConverter.ExtractSplatmaps(sourceTerrain);
        if (splatMap == null || splatMap.Length == 0)
            return newMaterial;

        //Export diffuse/normal textures
        Texture2D[] diffuseTextures;
        Texture2D[] normalTextures;
        Vector2[] uvScale;
        Vector2[] uvOffset;
        float[] metalic;
        float[] smoothness;

        int usedTexturesCount = TerrainToMeshConverter.ExtractTexturesInfo(sourceTerrain, out diffuseTextures, out normalTextures, out uvScale, out uvOffset, out metalic, out smoothness);
        if (usedTexturesCount == 0 || diffuseTextures == null)
        {
            //Problems with terrain
            Debug.LogWarning("usedTexturesCount == 0");

            return newMaterial;
        }
        else if (usedTexturesCount == 1)
        {
            //There is no need to use TerrainToMesh shaders with one texture
            Shader shader = null;
            if (UnityEngine.Rendering.GraphicsSettings.renderPipelineAsset == null)
            {
                shader = Shader.Find("Legacy Shaders/Diffuse");

                if (shader != null)
                {
                    newMaterial = new Material(shader);

                    //Texture
                    newMaterial.SetTexture("_MainTex", diffuseTextures[0]);

                    //Scale & Offset
                    newMaterial.SetTextureScale("_MainTex", uvScale[0]);
                    newMaterial.SetTextureOffset("_MainTex", uvOffset[0]);
                }
            }
            else
            {
                shader = Shader.Find("Universal Render Pipeline/Lit");

                if (shader != null)
                {
                    newMaterial = new Material(shader);

                    //Texture
                    newMaterial.SetTexture("_BaseMap", diffuseTextures[0]);

                    //Scale & Offset
                    newMaterial.SetTextureScale("_BaseMap", uvScale[0]);
                    newMaterial.SetTextureOffset("_BaseMap", uvOffset[0]);
                }
            }

            return newMaterial;
        }

        //Terrain To Mesh shaders support max 8 textures blend
        usedTexturesCount = Mathf.Clamp(usedTexturesCount, 2, 8);

        //T2M shaders support only 4 bump maps.
        bool canBeUsedBump = false;
        if(normalTextures != null && usedTexturesCount < 5)
            canBeUsedBump = true;

        //Select proper shader
        string shaderName;
        if (UnityEngine.Rendering.GraphicsSettings.renderPipelineAsset == null)
        {
            shaderName = string.Format("VacuumShaders/Terrain To Mesh/Standard/" + (canBeUsedBump ? "Bumped" : "Diffuse") + "/{0} Textures", usedTexturesCount);
        }
        else
        {
            shaderName = string.Format("VacuumShaders/Terrain To Mesh/Universal Render Pipeline/Lit" + "/{0} Textures", usedTexturesCount);
        }

        Shader ttmShader = Shader.Find(shaderName);
        if (ttmShader == null)
        {
            if (UnityEngine.Rendering.GraphicsSettings.renderPipelineAsset == null)
                Debug.LogWarning("Shader not found: " + shaderName);
            else
                Debug.LogWarning("Shader not found: '" + shaderName + "'.\nUniversal Render Pipeline shaders (http://u3d.as/1jFw) are not installed.\n");

            return newMaterial;
        }

        //Select shader
        newMaterial = new Material(ttmShader);

        //Set up controll textures
        if (splatMap.Length == 1)
        {
            newMaterial.SetTexture("_V_T2M_Control", splatMap[0]);
        }
        else
        {
            if (splatMap.Length > 2)
                Debug.Log("TerrainToMesh shaders support max 2 control textures. Current terrain uses " + splatMap.Length);

            newMaterial.SetTexture("_V_T2M_Control", splatMap[0]);
            newMaterial.SetTexture("_V_T2M_Control2", splatMap[1]);
        }

        //Assign textures
        for (int i = 0; i < usedTexturesCount; i++)
        {
            //Texture
            newMaterial.SetTexture(string.Format("_V_T2M_Splat{0}", i + 1), diffuseTextures[i]);

            //Scale
            newMaterial.SetFloat(string.Format("_V_T2M_Splat{0}_uvScale", i + 1), uvScale[i].x);

            //Metalic & Gloss
            newMaterial.SetFloat(string.Format("_V_T2M_Splat{0}_Metallic", i + 1), 0);// metalic[i]);
            newMaterial.SetFloat(string.Format("_V_T2M_Splat{0}_Glossiness", i + 1), 0);// smoothness[i]);

            //Bumpmap
            if(canBeUsedBump)
                newMaterial.SetTexture(string.Format("_V_T2M_Splat{0}_bumpMap", i + 1), normalTextures[i]);
        }

        return newMaterial;
    }
Beispiel #5
0
    //////////////////////////////////////////////////////////////////////////////
    //                                                                          //
    //Functions                                                                 //
    //                                                                          //
    //////////////////////////////////////////////////////////////////////////////
    void Start()
    {
        if (sourceTerrain != null)
        {
            //Convert Terrain
            Mesh[] generatedMeshes = TerrainToMeshConverter.Convert(sourceTerrain, convertInfo, false);

            //Setup game object
            if (generatedMeshes != null)
            {

                //Create shared material
                Material sharedMat = null;
                if (generateBasemap)
                    sharedMat = GenerateMaterial_Basemap();
                else
                    sharedMat = GenerateMaterial_Splatmap();

                if (generatedMeshes.Length == 1)
                {
                    //Setup MeshFilter
                    MeshFilter mf = gameObject.GetComponent<MeshFilter>();
                    if (mf == null)
                        mf = gameObject.AddComponent<MeshFilter>();
                    mf.sharedMesh = generatedMeshes[0];

                    //Setup MeshRenderer
                    MeshRenderer mr = gameObject.GetComponent<MeshRenderer>();
                    if (mr == null)
                        mr = gameObject.AddComponent<MeshRenderer>();
                    mr.sharedMaterial = sharedMat;

                    //Add MeshCollider and setup collider mesh
                    if(attachMeshCollider)
                    {
                        gameObject.AddComponent<MeshCollider>().sharedMesh = mf.sharedMesh;
                    }
                }
                else
                {
                    //Create full hierarchy
                    for (int i = 0; i < generatedMeshes.Length; i++)
                    {
                        //Create child object
                        GameObject terraMeshObj = new GameObject(generatedMeshes[i].name);
                        terraMeshObj.transform.parent = gameObject.transform;
                        terraMeshObj.transform.localPosition = Vector3.zero;

                        //Add mesh filter
                        MeshFilter mf = terraMeshObj.AddComponent<MeshFilter>();
                        mf.sharedMesh = generatedMeshes[i];

                        //Add mesh renderer
                        MeshRenderer mr = terraMeshObj.AddComponent<MeshRenderer>();
                        mr.sharedMaterial = sharedMat;

                        //Add MeshCollider and setup collider mesh
                        if(attachMeshCollider)
                        {
                            terraMeshObj.AddComponent<MeshCollider>().sharedMesh = mf.sharedMesh;
                        }
                    }
                }
            }
        }
    }