예제 #1
0
    public override void OnInspectorGUI()
    {
        MicroSplatBlendableObject bo = (MicroSplatBlendableObject)target;

        if (bo.msObject == null)
        {
            EditorGUILayout.HelpBox("Terrain not detected below object, nothing to blend with", MessageType.Error);
            return;
        }
        if (bo.msObject != null && bo.msObject.blendMat == null)
        {
            EditorGUILayout.HelpBox("Terrain shader is not setup for blending, please enable this on the terrain material in the Shader Generator section", MessageType.Error);
            return;
        }
        if (bo.msObject != null && bo.msObject.terrainDesc == null)
        {
            EditorGUILayout.HelpBox("Terrain does not have blending data, please select the terrain and generate it.", MessageType.Error);
            return;
        }
        MicroSplatTerrain tr = bo.msObject.GetComponent <MicroSplatTerrain>();

        if (bo.msObject != null && tr.sTerrainDirty)
        {
            EditorGUILayout.HelpBox("Terrain has been changed but blending data has not been regenerated.", MessageType.Info);
            if (GUILayout.Button("Regenerate"))
            {
                MicroSplatTerrainEditor.GenerateTerrainBlendData(tr);
            }
        }


        serializedObject.Update();
        var nfo       = serializedObject.FindProperty("normalFromObject");
        var bd        = serializedObject.FindProperty("blendDistance");
        var bc        = serializedObject.FindProperty("blendContrast");
        var bcv       = serializedObject.FindProperty("blendCurve");
        var sf        = serializedObject.FindProperty("slopeFilter");
        var sc        = serializedObject.FindProperty("slopeContrast");
        var sn        = serializedObject.FindProperty("slopeNoise");
        var tbn       = serializedObject.FindProperty("normalBlendDistance");
        var snml      = serializedObject.FindProperty("snowWidth");
        var doSnow    = serializedObject.FindProperty("doSnow");
        var doTerrain = serializedObject.FindProperty("doTerrainBlend");

        Material bmInstance         = bo.msObject.GetBlendMatInstance();
        bool     normalBlendEnabled = (bmInstance != null && bmInstance.IsKeywordEnabled("_TBOBJECTNORMALBLEND"));

        if (nfo.objectReferenceValue == null && normalBlendEnabled)
        {
            Renderer r             = bo.GetComponent <Renderer>();
            var      materials     = r.sharedMaterials;
            int      suitableIndex = -1;
            for (int i = 0; i < materials.Length; ++i)
            {
                if (materials[i] != bmInstance && materials[i].HasProperty("_BumpMap"))
                {
                    suitableIndex = i;
                }
            }

            if (suitableIndex != -1)
            {
                nfo.objectReferenceValue = materials[suitableIndex].GetTexture("_BumpMap");
            }
        }



        EditorGUI.BeginChangeCheck();
        if (bo.msObject.templateMaterial != null && bo.msObject.templateMaterial.IsKeywordEnabled("_TERRAINBLENDING"))
        {
            using (new GUILayout.VerticalScope(GUI.skin.box))
            {
                EditorGUILayout.PropertyField(doTerrain, CTerrainBlending);
                if (doTerrain.boolValue == true)
                {
                    EditorGUILayout.PropertyField(bd, CBlendDistance);
                    EditorGUILayout.PropertyField(tbn, CBlendNormalDistance);
                    EditorGUILayout.PropertyField(bc, CBlendContrast);
                    EditorGUILayout.PropertyField(bcv, CBlendCurve);
                    EditorGUILayout.PropertyField(sf, CSlopeFilter);
                    EditorGUILayout.PropertyField(sc, CSlopeContrast);
                    EditorGUILayout.PropertyField(sn, CSlopeNoise);
                    if (normalBlendEnabled)
                    {
                        EditorGUILayout.PropertyField(nfo, CNormalFromObject);
                    }
                }
            }
        }
        if (bo.msObject.templateMaterial != null && bo.msObject.templateMaterial.IsKeywordEnabled("_SNOW"))
        {
            using (new GUILayout.VerticalScope(GUI.skin.box))
            {
                EditorGUILayout.PropertyField(doSnow, CSnow);
                if (doSnow.boolValue == true)
                {
                    EditorGUILayout.PropertyField(snml, CSnowWidth);
                }
            }
        }


        if (EditorGUI.EndChangeCheck())
        {
            serializedObject.ApplyModifiedProperties();
            for (int i = 0; i < targets.Length; ++i)
            {
                MicroSplatBlendableObject o = (MicroSplatBlendableObject)targets[i];
                if (o != null)
                {
                    o.Sync();
                }
            }
            SceneView.RepaintAll();
        }


        var mf = bo.GetComponent <MeshFilter>();

        if (mf != null && mf.sharedMesh != null && mf.sharedMesh.subMeshCount > 2)
        {
            EditorGUILayout.HelpBox("Sub-Meshes cannot not blend properly, only the first submesh will blend with the terrain.", MessageType.Warning);
        }
    }
    public override void OnInspectorGUI()
    {
        MicroSplatBlendableObject bo = (MicroSplatBlendableObject)target;

        if (bo.msObject == null && bo.msOverrideObject == null)
        {
            EditorGUILayout.HelpBox("Terrain not detected below object, nothing to blend with. You may assign a terrain manually to the Override Blend Target", MessageType.Error);
            serializedObject.Update();
            var over = serializedObject.FindProperty("msOverrideObject");
            EditorGUILayout.PropertyField(over, COverrideObject);
            serializedObject.ApplyModifiedProperties();
            return;
        }
        var msObj = bo.msObject;

        if (msObj == null)
        {
            msObj = bo.msOverrideObject;
        }


        if (msObj.blendMat == null)
        {
            EditorGUILayout.HelpBox("Terrain shader is not setup for blending, please enable this on the terrain material in the Shader Generator section", MessageType.Error);
            return;
        }


        serializedObject.Update();
        var obt        = serializedObject.FindProperty("msOverrideObject");
        var nfo        = serializedObject.FindProperty("normalFromObject");
        var bd         = serializedObject.FindProperty("blendDistance");
        var bc         = serializedObject.FindProperty("blendContrast");
        var bcv        = serializedObject.FindProperty("blendCurve");
        var sf         = serializedObject.FindProperty("slopeFilter");
        var sc         = serializedObject.FindProperty("slopeContrast");
        var sn         = serializedObject.FindProperty("slopeNoise");
        var tbn        = serializedObject.FindProperty("normalBlendDistance");
        var snml       = serializedObject.FindProperty("snowWidth");
        var doSnow     = serializedObject.FindProperty("doSnow");
        var doTerrain  = serializedObject.FindProperty("doTerrainBlend");
        var noiseScale = serializedObject.FindProperty("noiseScale");


        Material bmInstance         = msObj.GetBlendMatInstance();
        bool     normalBlendEnabled = (bmInstance != null && msObj.keywordSO != null && msObj.keywordSO.IsKeywordEnabled("_TBOBJECTNORMALBLEND"));

        if (nfo.objectReferenceValue == null && normalBlendEnabled)
        {
            Renderer r             = bo.GetComponent <Renderer>();
            var      materials     = r.sharedMaterials;
            int      suitableIndex = -1;
            for (int i = 0; i < materials.Length; ++i)
            {
                if (materials[i] != bmInstance && materials[i].HasProperty("_BumpMap"))
                {
                    suitableIndex = i;
                }
            }

            if (suitableIndex != -1)
            {
                nfo.objectReferenceValue = materials[suitableIndex].GetTexture("_BumpMap");
            }
        }



        EditorGUI.BeginChangeCheck();
        if (msObj.keywordSO != null && msObj.keywordSO.IsKeywordEnabled("_TERRAINBLENDING"))
        {
            using (new GUILayout.VerticalScope(GUI.skin.box))
            {
                var old = GUI.enabled;
                GUI.enabled = false;
                EditorGUILayout.ObjectField("Detected Terrain", msObj, typeof(MicroSplatObject), false);
                GUI.enabled = old;
                EditorGUILayout.PropertyField(obt, COverrideObject);
                EditorGUILayout.PropertyField(doTerrain, CTerrainBlending);
                if (doTerrain.boolValue == true)
                {
                    EditorGUILayout.PropertyField(bd, CBlendDistance);
                    EditorGUILayout.PropertyField(tbn, CBlendNormalDistance);
                    EditorGUILayout.PropertyField(bc, CBlendContrast);
                    EditorGUILayout.PropertyField(bcv, CBlendCurve);
                    EditorGUILayout.PropertyField(sf, CSlopeFilter);
                    EditorGUILayout.PropertyField(sc, CSlopeContrast);
                    EditorGUILayout.PropertyField(sn, CSlopeNoise);
                    if (msObj.keywordSO.IsKeywordEnabled("_TBNOISE") || msObj.keywordSO.IsKeywordEnabled("_TBNOISEFBM"))
                    {
                        EditorGUILayout.PropertyField(noiseScale, CNoiseScale);
                    }

                    if (normalBlendEnabled)
                    {
                        EditorGUILayout.PropertyField(nfo, CNormalFromObject);
                    }
                }
            }
        }
        if (msObj.keywordSO != null && msObj.keywordSO.IsKeywordEnabled("_SNOW"))
        {
            using (new GUILayout.VerticalScope(GUI.skin.box))
            {
                EditorGUILayout.PropertyField(doSnow, CSnow);
                if (doSnow.boolValue == true)
                {
                    EditorGUILayout.PropertyField(snml, CSnowWidth);
                }
            }
        }


        if (EditorGUI.EndChangeCheck())
        {
            serializedObject.ApplyModifiedProperties();
            for (int i = 0; i < targets.Length; ++i)
            {
                MicroSplatBlendableObject o = (MicroSplatBlendableObject)targets[i];
                if (o != null)
                {
                    o.Sync();
                }
            }
            SceneView.RepaintAll();
        }


        var mf = bo.GetComponent <MeshFilter>();

        if (mf != null && mf.sharedMesh != null && mf.sharedMesh.subMeshCount > 2)
        {
            EditorGUILayout.HelpBox("Sub-Meshes cannot not blend properly, only the first submesh will blend with the terrain.", MessageType.Warning);
        }
    }