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); } }