Rasagar/Library/PackageCache/com.unity.terrain-tools/Editor/TerrainTools/BrushControllers/DefaultBrushSmoother.cs

81 lines
3.4 KiB
C#
Raw Normal View History

2024-08-26 13:07:20 -07:00
using UnityEngine;
using UnityEngine.TerrainTools;
namespace UnityEditor.TerrainTools
{
internal class DefaultBrushSmoother : IBrushSmoothController
{
public int kernelSize { get; set; }
Material m_Material = null;
Material GetMaterial() {
if (m_Material == null)
m_Material = new Material(Shader.Find("Hidden/TerrainTools/SmoothHeight"));
return m_Material;
}
public DefaultBrushSmoother(string name)
{
// intentionally blank -- reserved for future customization
}
public bool active { get { return Event.current.shift; } }
public void OnEnterToolMode() {}
public void OnExitToolMode() {}
public void OnSceneGUI(Terrain terrain, IOnSceneGUI editContext)
{
// intentionally blank -- reserved for future customization
}
public void OnInspectorGUI(Terrain terrain, IOnInspectorGUI editContext)
{
// for future customization, to select different blur tools, etc...
}
public bool OnPaint(Terrain terrain, IOnPaint editContext, float brushSize, float brushRotation, float brushStrength, Vector2 uv)
{
if (Event.current != null && Event.current.shift) {
BrushTransform brushXform = TerrainPaintUtility.CalculateBrushTransform(terrain, uv, brushSize, brushRotation);
PaintContext paintContext = TerrainPaintUtility.BeginPaintHeightmap(terrain, brushXform.GetBrushXYBounds());
Material mat = GetMaterial();//TerrainPaintUtility.GetBuiltinPaintMaterial();
float m_direction = 0.0f; //TODO: UI for this
Vector4 brushParams = new Vector4(brushStrength, 0.0f, 0.0f, 0.0f);
mat.SetTexture("_BrushTex", editContext.brushTexture);
mat.SetVector("_BrushParams", brushParams);
Vector4 smoothWeights = new Vector4(
Mathf.Clamp01(1.0f - Mathf.Abs(m_direction)), // centered
Mathf.Clamp01(-m_direction), // min
Mathf.Clamp01(m_direction), // max
0);
mat.SetInt("_KernelSize", (int)Mathf.Max(1, kernelSize)); // kernel size
mat.SetVector("_SmoothWeights", smoothWeights);
var texelCtx = Utility.CollectTexelValidity(paintContext.originTerrain, brushXform.GetBrushXYBounds(), 1);
Utility.SetupMaterialForPaintingWithTexelValidityContext(paintContext, texelCtx, brushXform, mat);
paintContext.sourceRenderTexture.wrapMode = TextureWrapMode.Clamp;
var temp = RTUtils.GetTempHandle( paintContext.destinationRenderTexture.descriptor );
temp.RT.wrapMode = TextureWrapMode.Clamp;
mat.SetVector("_BlurDirection", Vector2.right);
Graphics.Blit(paintContext.sourceRenderTexture, temp, mat);
mat.SetVector("_BlurDirection", Vector2.up);
Graphics.Blit(temp, paintContext.destinationRenderTexture, mat);
TerrainPaintUtility.EndPaintHeightmap(paintContext, "Terrain Paint - Smooth Height");
texelCtx.Cleanup();
RTUtils.Release(temp);
return true;
}
return false;
}
}
}