Advertisement
Guest User

Custom paint texture tool without tree hiding

a guest
May 12th, 2023
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.79 KB | None | 0 0
  1. // Unity C# reference source
  2. // Copyright (c) Unity Technologies. For terms of use, see
  3. // https://unity3d.com/legal/licenses/Unity_Reference_Only_License
  4.  
  5. using UnityEngine;
  6. using UnityEngine.TerrainTools;
  7. using UnityEditor.ShortcutManagement;
  8.  
  9. namespace UnityEditor.TerrainTools
  10. {
  11.     [FilePathAttribute("Library/TerrainTools/PaintTexture", FilePathAttribute.Location.ProjectFolder)]
  12.     internal class CustomPaintTextureTool : TerrainPaintToolWithOverlays<CustomPaintTextureTool>
  13.     {
  14.         internal const string k_ToolName = "Paint Texture Custom";
  15.         public override string OnIcon => "TerrainOverlays/PaintMaterials_On.png";
  16.         public override string OffIcon => "TerrainOverlays/PaintMaterials.png";
  17.  
  18.         Editor m_TemplateMaterialEditor = null;
  19.         Editor m_SelectedTerrainLayerInspector = null;
  20.  
  21.         [SerializeField]
  22.         TerrainLayer m_SelectedTerrainLayer = null;
  23.  
  24.         // Keep this separate from m_SelectedTerrainLayer so that it allows selecting null TerrainLayers (like those deleted from Assets).
  25.         private int m_SelectedTerrainLayerIndex = -1;
  26.  
  27.         [FormerlyPrefKeyAs("Terrain/Texture Paint", "f4")]
  28.         [Shortcut("Terrain/Paint Texture", typeof(TerrainToolShortcutContext), KeyCode.F4)]
  29.         static void SelectShortcut(ShortcutArguments args)
  30.         {
  31.             TerrainToolShortcutContext context = (TerrainToolShortcutContext)args.context;
  32.             context.SelectPaintToolWithOverlays<PaintTextureTool>();
  33.         }
  34.  
  35.         public override int IconIndex
  36.         {
  37.             get { return (int) MaterialIndex.PaintTexture; }
  38.         }
  39.  
  40.         public override TerrainCategory Category
  41.         {
  42.             get { return TerrainCategory.Materials; }
  43.         }
  44.  
  45.         public override string GetName()
  46.         {
  47.             return k_ToolName;
  48.         }
  49.  
  50.         public override string GetDescription()
  51.         {
  52.             return "Paints the selected material layer onto the terrain texture";
  53.         }
  54.  
  55.         public override bool HasToolSettings => true;
  56.         public override bool HasBrushMask => true;
  57.         public override bool HasBrushAttributes => true;
  58.  
  59.         public override void OnEnterToolMode()
  60.         {
  61.             m_SelectedTerrainLayerIndex = -1;
  62.         }
  63.  
  64.         public override bool OnPaint(Terrain terrain, IOnPaint editContext)
  65.         {
  66.             BrushTransform brushXform = TerrainPaintUtility.CalculateBrushTransform(terrain, editContext.uv, editContext.brushSize, 0.0f);
  67.             PaintContext paintContext = TerrainPaintUtility.BeginPaintTexture(terrain, brushXform.GetBrushXYBounds(), m_SelectedTerrainLayer);
  68.             if (paintContext == null)
  69.                 return false;
  70.  
  71.             Material mat = TerrainPaintUtility.GetBuiltinPaintMaterial();
  72.  
  73.             // apply brush
  74.             float targetAlpha = 1.0f;       // always 1.0 now -- no subtractive painting (we assume this in the ScatterAlphaMap)
  75.             Vector4 brushParams = new Vector4(editContext.brushStrength, targetAlpha, 0.0f, 0.0f);
  76.             mat.SetTexture("_BrushTex", editContext.brushTexture);
  77.             mat.SetVector("_BrushParams", brushParams);
  78.  
  79.             TerrainPaintUtility.SetupTerrainToolMaterialProperties(paintContext, brushXform, mat);
  80.  
  81.             Graphics.Blit(paintContext.sourceRenderTexture, paintContext.destinationRenderTexture, mat, (int)TerrainBuiltinPaintMaterialPasses.PaintTexture);
  82.  
  83.             TerrainPaintUtility.EndPaintTexture(paintContext, "Terrain Paint - Texture");
  84.             return false;
  85.         }
  86.  
  87.         public override void OnRenderBrushPreview(Terrain terrain, IOnSceneGUI editContext)
  88.         {
  89.             // We're only doing painting operations, early out if it's not a repaint
  90.             if (Event.current.type != EventType.Repaint)
  91.                 return;
  92.  
  93.             if (editContext.hitValidTerrain)
  94.             {
  95.                 BrushTransform brushXform = TerrainPaintUtility.CalculateBrushTransform(terrain, editContext.raycastHit.textureCoord, editContext.brushSize, 0.0f);
  96.                 PaintContext ctx = TerrainPaintUtility.BeginPaintHeightmap(terrain, brushXform.GetBrushXYBounds(), 1);
  97.                 TerrainPaintUtilityEditor.DrawBrushPreview(ctx, TerrainBrushPreviewMode.SourceRenderTexture, editContext.brushTexture, brushXform, TerrainPaintUtilityEditor.GetDefaultBrushPreviewMaterial(), 0);
  98.                 TerrainPaintUtility.ReleaseContextResources(ctx);
  99.             }
  100.         }
  101.  
  102.         private void TextureToolSettingsGUI(Terrain terrain, IOnInspectorGUI editContext, bool overlays)
  103.         {
  104.             GUILayout.Label("Settings", EditorStyles.boldLabel);
  105.             EditorGUI.BeginChangeCheck();
  106.             if (!overlays)
  107.             {
  108.                 EditorGUILayout.Space();
  109.                 var cacheFieldWidth = EditorGUIUtility.fieldWidth;
  110.                 var cacheLabelWIdth = EditorGUIUtility.labelWidth;
  111.                 Editor.DrawFoldoutInspector(terrain.materialTemplate, ref m_TemplateMaterialEditor); //todo: why doesn't this line work for overlays...?
  112.                 EditorGUIUtility.fieldWidth = cacheFieldWidth;
  113.                 EditorGUIUtility.labelWidth = cacheLabelWIdth;
  114.                 EditorGUILayout.Space();
  115.             }
  116.  
  117.             if (m_SelectedTerrainLayerIndex == -1)
  118.                 m_SelectedTerrainLayerIndex = TerrainPaintUtility.FindTerrainLayerIndex(terrain, m_SelectedTerrainLayer);
  119.  
  120.             m_SelectedTerrainLayerIndex = TerrainLayerUtility.ShowTerrainLayersSelectionHelper(terrain, m_SelectedTerrainLayerIndex);
  121.             EditorGUILayout.Space();
  122.  
  123.             if (EditorGUI.EndChangeCheck())
  124.             {
  125.                 m_SelectedTerrainLayer = m_SelectedTerrainLayerIndex != -1 ? terrain.terrainData.terrainLayers[m_SelectedTerrainLayerIndex] : null;
  126.             }
  127.  
  128.             TerrainLayerUtility.ShowTerrainLayerGUI(terrain, m_SelectedTerrainLayer, ref m_SelectedTerrainLayerInspector,
  129.                 (m_TemplateMaterialEditor as MaterialEditor)?.customShaderGUI as ITerrainLayerCustomUI);
  130.             EditorGUILayout.Space();
  131.  
  132.         }
  133.  
  134.         public override void OnInspectorGUI(Terrain terrain, IOnInspectorGUI editContext)
  135.         {
  136.             TextureToolSettingsGUI(terrain, editContext, false);
  137.             // Texture painting needs to know the largest of the splat map and the height map, as the result goes to
  138.             // the splat map, but the height map is used for previewing.
  139.             int resolution = Mathf.Max(terrain.terrainData.heightmapResolution, terrain.terrainData.alphamapResolution);
  140.             editContext.ShowBrushesGUI(5, BrushGUIEditFlags.All, resolution);
  141.         }
  142.  
  143.         public override void OnToolSettingsGUI(Terrain terrain, IOnInspectorGUI editContext)
  144.         {
  145.             TextureToolSettingsGUI(terrain, editContext, true);
  146.         }
  147.     }
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement