218 lines
5.1 KiB
C#
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;
|
|
}
|
|
}
|
|
} |