protected override bool DrawWizardGUI() { EditorGUI.BeginChangeCheck(); Rect r = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight); m_DetailTexture = EditorGUI.ObjectField(r, "Detail Texture", m_DetailTexture, typeof(Texture2D), !TerrainDataIsPersistent) as Texture2D; m_AlignToGround = EditorGUILayout.Slider(DetailWizardSharedStyles.Instance.alignToGround, m_AlignToGround, 0, 100); m_PositionOrderliness = EditorGUILayout.Slider(DetailWizardSharedStyles.Instance.positionOrderliness, m_PositionOrderliness, 0, 100); m_MinWidth = EditorGUILayout.FloatField("Min Width", m_MinWidth); m_MaxWidth = EditorGUILayout.FloatField("Max Width", m_MaxWidth); m_MinHeight = EditorGUILayout.FloatField("Min Height", m_MinHeight); m_MaxHeight = EditorGUILayout.FloatField("Max Height", m_MaxHeight); m_NoiseSeed = EditorGUILayout.IntField(DetailWizardSharedStyles.Instance.noiseSeed, m_NoiseSeed); m_NoiseSpread = EditorGUILayout.FloatField(DetailWizardSharedStyles.Instance.noiseSpread, m_NoiseSpread); GUI.enabled = terrainData.detailScatterMode == DetailScatterMode.CoverageMode; m_DetailDensity = EditorGUILayout.Slider(DetailWizardSharedStyles.Instance.detailDensity, m_DetailDensity, 0, 5); GUI.enabled = true; m_HoleEdgePadding = EditorGUILayout.Slider(DetailWizardSharedStyles.Instance.holeEdgePadding, m_HoleEdgePadding, 0, 100); m_HealthyColor = EditorGUILayout.ColorField("Healthy Color", m_HealthyColor); m_DryColor = EditorGUILayout.ColorField("Dry Color", m_DryColor); m_Billboard = EditorGUILayout.Toggle("Billboard", m_Billboard); m_UseDensityScaling = EditorGUILayout.Toggle(DetailWizardSharedStyles.Instance.useDensityScaling, m_UseDensityScaling); if (!DetailPrototype.IsModeSupportedByRenderPipeline(ComputeRenderMode(m_Billboard), false, out var message)) { EditorGUILayout.LabelField(EditorGUIUtility.TempContent(message, EditorGUIUtility.GetHelpIcon(MessageType.Error)), DetailWizardSharedStyles.Instance.helpBoxBig); } return(EditorGUI.EndChangeCheck()); }
protected override bool DrawWizardGUI() { EditorGUI.BeginChangeCheck(); m_DetailPrefab = EditorGUILayout.ObjectField("Detail Prefab", m_DetailPrefab, typeof(GameObject), !TerrainDataIsPersistent) as GameObject; GUI.enabled = terrainData.detailScatterMode == DetailScatterMode.CoverageMode; m_DetailDensity = EditorGUILayout.Slider(DetailWizardSharedStyles.Instance.detailDensity, m_DetailDensity, 0, 3); GUI.enabled = true; m_AlignToGround = EditorGUILayout.Slider(DetailWizardSharedStyles.Instance.alignToGround, m_AlignToGround, 0, 100); m_PositionOrderliness = EditorGUILayout.Slider(DetailWizardSharedStyles.Instance.positionOrderliness, m_PositionOrderliness, 0, 100); m_MinWidth = EditorGUILayout.FloatField("Min Width", m_MinWidth); m_MaxWidth = EditorGUILayout.FloatField("Max Width", m_MaxWidth); m_MinHeight = EditorGUILayout.FloatField("Min Height", m_MinHeight); m_MaxHeight = EditorGUILayout.FloatField("Max Height", m_MaxHeight); m_NoiseSeed = EditorGUILayout.IntField(DetailWizardSharedStyles.Instance.noiseSeed, m_NoiseSeed); m_NoiseSpread = EditorGUILayout.FloatField(DetailWizardSharedStyles.Instance.noiseSpread, m_NoiseSpread); m_HoleEdgePadding = EditorGUILayout.Slider(DetailWizardSharedStyles.Instance.holeEdgePadding, m_HoleEdgePadding, 0, 100); GUI.enabled = terrainData.detailScatterMode == DetailScatterMode.CoverageMode; m_DetailDensity = EditorGUILayout.Slider(DetailWizardSharedStyles.Instance.detailDensity, m_DetailDensity, 0, 5); GUI.enabled = true; if (!m_UseInstancing) { m_HealthyColor = EditorGUILayout.ColorField("Healthy Color", m_HealthyColor); m_DryColor = EditorGUILayout.ColorField("Dry Color", m_DryColor); } if (m_UseInstancing) { EditorGUI.BeginDisabled(true); EditorGUILayout.EnumPopup("Render Mode", TerrainDetailMeshRenderMode.VertexLit); EditorGUI.EndDisabled(); } else { m_RenderMode = (TerrainDetailMeshRenderMode)EditorGUILayout.EnumPopup("Render Mode", m_RenderMode); } m_UseInstancing = EditorGUILayout.Toggle("Use GPU Instancing", m_UseInstancing); if (m_UseInstancing) { EditorGUILayout.HelpBox("Using GPU Instancing would enable using the Material you set on the prefab.", MessageType.Info); } m_UseDensityScaling = EditorGUILayout.Toggle(DetailWizardSharedStyles.Instance.useDensityScaling, m_UseDensityScaling); if (!DetailPrototype.IsModeSupportedByRenderPipeline(ComputeRenderMode(), m_UseInstancing, out var message)) { EditorGUILayout.LabelField(EditorGUIUtility.TempContent(message, EditorGUIUtility.GetHelpIcon(MessageType.Error)), DetailWizardSharedStyles.Instance.helpBoxBig); } return(EditorGUI.EndChangeCheck()); }
private void ShowDetailPrototypeMessages(DetailPrototype detailPrototype, Terrain terrain) { if (!DetailPrototype.IsModeSupportedByRenderPipeline(detailPrototype.renderMode, detailPrototype.useInstancing, out var msg) || !detailPrototype.Validate(out msg)) { EditorGUILayout.HelpBox(msg, MessageType.Error); } else if ((detailPrototype.renderMode != DetailRenderMode.VertexLit || !detailPrototype.useInstancing) && detailPrototype.usePrototypeMesh && detailPrototype.prototype != null && detailPrototype.prototype.TryGetComponent <MeshFilter>(out var meshFilter) && meshFilter.sharedMesh != null) { var maxVertCount = meshFilter.sharedMesh.vertexCount * PaintDetailsUtils.GetMaxDetailInstances(terrain.terrainData) * terrain.detailObjectDensity; if (maxVertCount >= 65536) { EditorGUILayout.HelpBox(s_Styles.detailVertexWarning.text, MessageType.Warning); } } }
public override void OnInspectorGUI(Terrain terrain, IOnInspectorGUI editContext) { if (s_Styles == null) { s_Styles = new Styles(); } DetailPrototype[] prototypes = terrain.terrainData.detailPrototypes; var detailIcons = LoadDetailIcons(prototypes); // Detail picker GUILayout.Label(s_Styles.details, EditorStyles.boldLabel); selectedDetail = TerrainInspector.AspectSelectionGridImageAndText(selectedDetail, prototypes.Length, (i, rect, style, controlID) => { bool renderModeSupported = DetailPrototype.IsModeSupportedByRenderPipeline(prototypes[i].renderMode, prototypes[i].useInstancing, out var errorMessage); bool mouseHover = rect.Contains(Event.current.mousePosition); if (Event.current.type == EventType.Repaint) { bool wasEnabled = GUI.enabled; GUI.enabled &= renderModeSupported; style.Draw(rect, detailIcons[i], GUI.enabled && mouseHover && (GUIUtility.hotControl == 0 || GUIUtility.hotControl == controlID), GUI.enabled && GUIUtility.hotControl == controlID, i == selectedDetail, false); GUI.enabled = wasEnabled; } if (!renderModeSupported) { var tmpContent = EditorGUIUtility.TempContent(EditorGUIUtility.GetHelpIcon(MessageType.Error)); tmpContent.tooltip = errorMessage; GUI.Label(new Rect(rect.xMax - 16, rect.yMin + 1, 19, 19), tmpContent); } if (mouseHover) { GUIUtility.mouseUsed = true; GUIStyle.SetMouseTooltip(detailIcons[i].tooltip, rect); } }, 64, s_Styles.noDetailObjectDefined, out var doubleClick); if (doubleClick) { TerrainDetailContextMenus.EditDetail(new MenuCommand(terrain, selectedDetail)); GUIUtility.ExitGUI(); } if (selectedDetail >= 0 && selectedDetail < prototypes.Length) { ShowDetailPrototypeMessages(prototypes[selectedDetail], terrain); } var terrainInspector = TerrainInspector.s_activeTerrainInspectorInstance; GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); TerrainInspector.MenuButton(s_Styles.editDetails, "CONTEXT/TerrainEngineDetails", terrain, selectedDetail); terrainInspector.ShowRefreshPrototypes(); GUILayout.EndHorizontal(); terrainInspector.ShowDetailStats(); EditorGUILayout.Space(); // Brush selector editContext.ShowBrushesGUI(0, BrushGUIEditFlags.Select, 0); // Brush size terrainInspector.brushSize = EditorGUILayout.PowerSlider(s_Styles.brushSize, Mathf.Clamp(terrainInspector.brushSize, 1, 100), 1, 100, 4); detailOpacity = EditorGUILayout.Slider(s_Styles.opacity, detailOpacity, 0, 1); // Strength detailStrength = EditorGUILayout.Slider(s_Styles.detailTargetStrength, detailStrength, 0, 1); // Brush editor editContext.ShowBrushesGUI((int)EditorGUIUtility.singleLineHeight, BrushGUIEditFlags.Inspect); }