using System;
using UnityEngine;
using Object = UnityEngine.Object;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace StixGames.NatureCore.Utility
{
public static class RenderTextureUtilities
{
///
/// Dilates a texture to prevent black borders. A different texture might be returned.
///
///
/// A temporary rendertexture
///
///
///
public static RenderTexture DilateTexture(string name, RenderTexture texture, int steps, RenderTextureReadWrite colorMode)
{
if (texture.width != texture.height)
{
throw new ArgumentException("Texture has to be square.");
}
var dilateMat = new Material(Shader.Find("Hidden/TextureDilate"));
var backBuffer = RenderTexture.GetTemporary(texture.width, texture.height, texture.depth, texture.format,
colorMode);
dilateMat.SetFloat("_PixelSize", 1.0f / texture.width);
for (int i = 0; i < steps; i++)
{
#if UNITY_EDITOR
var title = string.Format("Texture dilation: {0}", name);
var info = string.Format("Dilating texture, step {0}", i);
var dilationStepSize = 1.0f / steps;
EditorUtility.DisplayProgressBar(title, info, dilationStepSize * i);
#endif
Graphics.Blit(texture, backBuffer, dilateMat);
var tempTexture = texture;
texture = backBuffer;
backBuffer = tempTexture;
}
#if UNITY_EDITOR
EditorUtility.ClearProgressBar();
#endif
try
{
RenderTexture.ReleaseTemporary(backBuffer);
}
catch (Exception)
{
#if UNITY_EDITOR
Object.DestroyImmediate(backBuffer);
#else
Object.Destroy(backBuffer);
#endif
throw;
}
#if UNITY_EDITOR
Object.DestroyImmediate(dilateMat);
#else
Object.Destroy(dilateMat);
#endif
return texture;
}
}
}