Version: 2023.2
LanguageEnglish
  • C#

TerrainPaintToolWithOverlays<T0>

class in UnityEditor.TerrainTools

/

Inherits from:TerrainTools.TerrainPaintToolWithOverlaysBase

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Description

Base class for Terrain painting tools, which inherit from Editor Tools.

Derive from this class to implement your own terrain painting tools, which also appear in the Terrain Tools overlay.

using UnityEngine;
using UnityEditor;
using UnityEditor.TerrainTools;

class CustomTerrainToolWithOverlays : TerrainPaintToolWithOverlays<CustomTerrainToolWithOverlays> { private float m_BrushRotation; // Return true for this property to show the brush selector overlay public override bool HasBrushMask => true;

// Return true for this property to show the tool settings overlay public override bool HasToolSettings => true; // Return true for this property to display the brush attributes overlay public override bool HasBrushAttributes => true; // File names of the light theme icons - prepending d_ to the file name generates dark theme variants. // public override string OnIcon => "Assets/Icon_on.png"; // public override string OffIcon => "Assets/Icon_off.png";

// The toolbar category the icon appears under public override TerrainCategory Category => TerrainCategory.CustomBrushes;

// Where in the icon list the icon appears public override int IconIndex => 100; // Name of the Terrain Tool. This appears in the tool UI public override string GetName() { return "Examples/Basic Custom Terrain Tool"; }

// Description for the Terrain Tool. This appears in the tool UI public override string GetDescription() { return "This Terrain Tool shows how to add custom UI to a tool and paint height."; }

// Override this function to add UI elements to the inspector public override void OnInspectorGUI(Terrain terrain, IOnInspectorGUI editContext) { EditorGUILayout.HelpBox("In Terrain Inspector", MessageType.None); editContext.ShowBrushesGUI(5, BrushGUIEditFlags.All); m_BrushRotation = EditorGUILayout.Slider("Rotation", m_BrushRotation, 0, 360); }

// Override this function to add UI elements to the tool settings overlay public override void OnToolSettingsGUI(Terrain terrain, IOnInspectorGUI editContext) { EditorGUILayout.HelpBox("In Overlays", MessageType.None); m_BrushRotation = EditorGUILayout.Slider("Rotation", m_BrushRotation, 0, 360); }

// Ease of use function for rendering modified Terrain Texture data into a PaintContext. Both OnRenderBrushPreview and OnPaint use this. private void RenderIntoPaintContext(UnityEngine.TerrainTools.PaintContext paintContext, Texture brushTexture, float brushOpacity, UnityEngine.TerrainTools.BrushTransform brushXform) { // Get the built-in painting Material reference Material mat = UnityEngine.TerrainTools.TerrainPaintUtility.GetBuiltinPaintMaterial(); // Bind the current brush texture mat.SetTexture("_BrushTex", brushTexture); // Bind the tool-specific shader properties var opacity = Event.current.control ? -brushOpacity : brushOpacity; mat.SetVector("_BrushParams", new Vector4(opacity, 0.0f, 0.0f, 0.0f)); // Set up the material for reading from/writing into the PaintContext texture data. This step is necessary to set up the correct shader properties for appropriately transforming UVs and sampling textures within the shader UnityEngine.TerrainTools.TerrainPaintUtility.SetupTerrainToolMaterialProperties(paintContext, brushXform, mat); // Render into the PaintContext's destinationRenderTexture using the built-in painting Material. The ID for the Raise/Lower pass is 0 Graphics.Blit(paintContext.sourceRenderTexture, paintContext.destinationRenderTexture, mat, 0); } // Render Tool previews in the Scene view public override void OnRenderBrushPreview(Terrain terrain, IOnSceneGUI editContext) { // Don't render preview if this isn't a Repaint if (Event.current.type != EventType.Repaint) return;

// Only do the rest if user mouse hits valid terrain if (!editContext.hitValidTerrain) return;

// Get the current BrushTransform under the mouse position relative to the Terrain UnityEngine.TerrainTools.BrushTransform brushXform = UnityEngine.TerrainTools.TerrainPaintUtility.CalculateBrushTransform(terrain, editContext.raycastHit.textureCoord, editContext.brushSize, m_BrushRotation); // Get the PaintContext for the current BrushTransform. This has a sourceRenderTexture from which to read existing Terrain texture data. UnityEngine.TerrainTools.PaintContext paintContext = UnityEngine.TerrainTools.TerrainPaintUtility.BeginPaintHeightmap(terrain, brushXform.GetBrushXYBounds(), 1); // Get the built-in Material for rendering Brush Previews Material previewMaterial = TerrainPaintUtilityEditor.GetDefaultBrushPreviewMaterial(); // Render the brush preview for the sourceRenderTexture. This shows up as a projected brush mesh rendered on top of the Terrain TerrainPaintUtilityEditor.DrawBrushPreview(paintContext, TerrainBrushPreviewMode.SourceRenderTexture, editContext.brushTexture, brushXform, previewMaterial, 0); // Render changes into the PaintContext destinationRenderTexture RenderIntoPaintContext(paintContext, editContext.brushTexture, editContext.brushStrength, brushXform); // Restore old render target RenderTexture.active = paintContext.oldRenderTexture; // Bind the sourceRenderTexture to the preview Material. This is used to compute deltas in height previewMaterial.SetTexture("_HeightmapOrig", paintContext.sourceRenderTexture); // Render a procedural mesh displaying the delta/displacement in height from the source Terrain texture data. When you modify Terrain height, this shows how much the next paint operation alters the Terrain height TerrainPaintUtilityEditor.DrawBrushPreview(paintContext, TerrainBrushPreviewMode.DestinationRenderTexture, editContext.brushTexture, brushXform, previewMaterial, 1); // Cleanup resources UnityEngine.TerrainTools.TerrainPaintUtility.ReleaseContextResources(paintContext); } // Perform painting operations that modify the Terrain texture data public override bool OnPaint(Terrain terrain, IOnPaint editContext) { // Get the current BrushTransform under the mouse position relative to the Terrain UnityEngine.TerrainTools.BrushTransform brushXform = UnityEngine.TerrainTools.TerrainPaintUtility.CalculateBrushTransform(terrain, editContext.uv, editContext.brushSize, m_BrushRotation); // Get the PaintContext for the current BrushTransform. This has a sourceRenderTexture from which to read existing Terrain texture data // and a destinationRenderTexture into which to write new Terrain texture data UnityEngine.TerrainTools.PaintContext paintContext = UnityEngine.TerrainTools.TerrainPaintUtility.BeginPaintHeightmap(terrain, brushXform.GetBrushXYBounds()); // Call the common rendering function that OnRenderBrushPreview and OnPaint use RenderIntoPaintContext(paintContext, editContext.brushTexture, editContext.brushStrength, brushXform); // Commit the modified PaintContext with a provided string for tracking Undo operations. This function handles Undo and resource cleanup for you UnityEngine.TerrainTools.TerrainPaintUtility.EndPaintHeightmap(paintContext, "Terrain Paint - Raise or Lower Height");

// Return whether Trees and Details should be hidden while you paint with this Terrain Tool return true; } }

Inherited Members

Properties

gridSnapEnabledUse this property to allow the current EditorTool to enable/disable grid snapping.
targetThe object being inspected.
targetsAn array of the objects being inspected.
toolbarIconThe icon and tooltip for this custom editor tool. If this function is not implemented, the toolbar displays the Inspector icon for the target type. If no target type is defined, the toolbar displays the Tool Mode icon.
hideFlagsShould the object be hidden, saved with the Scene or modifiable by the user?
nameThe name of the object.
CategoryThe TerrainCategory that the Terrain Tool belongs to.
HasBrushAttributesTrue if the Terrain Tool has brush attributes, false otherwise.
HasBrushMaskTrue if Terrain Tool has brush masks, false otherwise.
HasToolSettingsTrue if Terrain Tool has custom settings, false otherwise.
IconIndexThe index at which you should place the Terrain Tool in the Terrain Tools overlay.
OffIconThe icon displayed in the Terrain Tools overlay when the Terrain Tool isn't selected.
OnIconThe icon displayed in the Terrain Tools overlay when the terrain tool is selected.
TerrainThe last hit terrain or the last active instance of a terrain object.

Public Methods

IsAvailableChecks whether the custom editor tool is available based on the state of the editor.
OnActivatedInvoked after this EditorTool becomes the active tool.
OnToolGUIUse this method to implement a custom editor tool.
OnWillBeDeactivatedInvoked before this EditorTool stops being the active tool.
PopulateMenuAdds menu items to Scene view context menu.
GetInstanceIDGets the instance ID of the object.
ToStringReturns the name of the object.
GetDescriptionDescription of the Terrain Tool.
GetNameName of the Terrain Tool.
OnActivatedThis function is called when the tool is activated.
OnDisableCalled when the tool is destroyed.
OnEnableCalled when the tool is created.
OnEnterToolModeThis function is called when the Terrain Tool is activated.
OnExitToolModeThis function is called when the Terrain Tool becomes inactive.
OnInspectorGUICustom Terrain Tool OnInspectorGUI callback.
OnPaintCustom Terrain Tool paint callback.
OnRenderBrushPreviewUse this method to implement custom tool preview and UI behavior that only renders while the mouse is within the SceneView bounds or while you're actively using this tool.
OnSceneGUICustom Terrain Tool OnSceneGUI callback.
OnToolGUIThis method is used to implement the custom terrain editor paint tool.
OnToolSettingsGUIContains the IMGUI code for custom settings beyond the common settings.
OnWillBeDeactivatedInvoked before the terrain paint tool with overlays stops being the active tool.

Static Methods

DestroyRemoves a GameObject, component or asset.
DestroyImmediateDestroys the object obj immediately. You are strongly recommended to use Destroy instead.
DontDestroyOnLoadDo not destroy the target Object when loading a new Scene.
FindAnyObjectByTypeRetrieves any active loaded object of Type type.
FindFirstObjectByTypeRetrieves the first active loaded object of Type type.
FindObjectsByTypeRetrieves a list of all loaded objects of Type type.
InstantiateClones the object original and returns the clone.
CreateInstanceCreates an instance of a scriptable object.

Operators

boolDoes the object exist?
operator !=Compares if two objects refer to a different object.
operator ==Compares two object references to see if they refer to the same object.

Messages

AwakeCalled when an instance of ScriptableObject is created.
OnDestroyThis function is called when the scriptable object will be destroyed.
OnDisableThis function is called when the scriptable object goes out of scope.
OnEnableThis function is called when the object is loaded.
OnValidateEditor-only function that Unity calls when the script is loaded or a value changes in the Inspector.
ResetReset to default values.