Files

218 lines
5.1 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Serialization;
namespace EPOOutline
{
[Flags]
public enum ColorMask
{
None = 0,
R = 1,
G = 2,
B = 4,
A = 8
}
[System.Serializable]
public class OutlineTarget
{
public bool IsVisible = false;
[SerializeField]
public ColorMask CutoutMask = ColorMask.A;
[SerializeField]
private float edgeDilateAmount = 5.0f;
[SerializeField]
private float frontEdgeDilateAmount = 5.0f;
[SerializeField]
private float backEdgeDilateAmount = 5.0f;
[SerializeField]
[FormerlySerializedAs("Renderer")]
public Renderer renderer;
[SerializeField]
public int SubmeshIndex;
[SerializeField]
public BoundsMode BoundsMode = BoundsMode.Default;
[SerializeField]
public Bounds Bounds = new Bounds(Vector3.zero, Vector3.one);
[SerializeField]
[Range(0.0f, 1.0f)]
public float CutoutThreshold = 0.5f;
[SerializeField]
public CullMode CullMode;
[SerializeField]
private string cutoutTextureName;
[SerializeField]
public DilateRenderMode DilateRenderingMode;
[SerializeField]
private int cutoutTextureIndex;
private int? cutoutTextureId;
public Renderer Renderer
{
get
{
return renderer;
}
}
public bool UsesCutout
{
get
{
return !string.IsNullOrEmpty(cutoutTextureName);
}
}
public int CutoutTextureIndex
{
get
{
return cutoutTextureIndex;
}
set
{
cutoutTextureIndex = value;
if (cutoutTextureIndex < 0)
{
Debug.LogError("Trying to set cutout texture index less than zero");
cutoutTextureIndex = 0;
}
}
}
public int ShiftedSubmeshIndex
{
get
{
return SubmeshIndex;
}
}
public int CutoutTextureId
{
get
{
if (!cutoutTextureId.HasValue)
cutoutTextureId = Shader.PropertyToID(cutoutTextureName);
return cutoutTextureId.Value;
}
}
public string CutoutTextureName
{
get
{
return cutoutTextureName;
}
set
{
cutoutTextureName = value;
cutoutTextureId = null;
}
}
public float EdgeDilateAmount
{
get
{
return edgeDilateAmount;
}
set
{
if (value < 0)
edgeDilateAmount = 0;
else
edgeDilateAmount = value;
}
}
public float FrontEdgeDilateAmount
{
get
{
return frontEdgeDilateAmount;
}
set
{
if (value < 0)
frontEdgeDilateAmount = 0;
else
frontEdgeDilateAmount = value;
}
}
public float BackEdgeDilateAmount
{
get
{
return backEdgeDilateAmount;
}
set
{
if (value < 0)
backEdgeDilateAmount = 0;
else
backEdgeDilateAmount = value;
}
}
public OutlineTarget()
{
}
public OutlineTarget(Renderer renderer, int submesh = 0)
{
SubmeshIndex = submesh;
this.renderer = renderer;
CutoutThreshold = 0.5f;
cutoutTextureId = null;
cutoutTextureName = string.Empty;
CullMode = renderer is SpriteRenderer ? CullMode.Off : CullMode.Back;
DilateRenderingMode = DilateRenderMode.PostProcessing;
frontEdgeDilateAmount = 5.0f;
backEdgeDilateAmount = 5.0f;
edgeDilateAmount = 5.0f;
}
public OutlineTarget(Renderer renderer, string cutoutTextureName, float cutoutThreshold = 0.5f)
{
SubmeshIndex = 0;
this.renderer = renderer;
cutoutTextureId = Shader.PropertyToID(cutoutTextureName);
CutoutThreshold = cutoutThreshold;
this.cutoutTextureName = cutoutTextureName;
CullMode = renderer is SpriteRenderer ? CullMode.Off : CullMode.Back;
DilateRenderingMode = DilateRenderMode.PostProcessing;
frontEdgeDilateAmount = 5.0f;
backEdgeDilateAmount = 5.0f;
edgeDilateAmount = 5.0f;
}
}
}