OutlineTarget.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.Rendering;
  6. using UnityEngine.Serialization;
  7. namespace EPOOutline
  8. {
  9. [Flags]
  10. public enum ColorMask
  11. {
  12. None = 0,
  13. R = 1,
  14. G = 2,
  15. B = 4,
  16. A = 8
  17. }
  18. [System.Serializable]
  19. public class OutlineTarget
  20. {
  21. public bool IsVisible = false;
  22. [SerializeField]
  23. public ColorMask CutoutMask = ColorMask.A;
  24. [SerializeField]
  25. private float edgeDilateAmount = 5.0f;
  26. [SerializeField]
  27. private float frontEdgeDilateAmount = 5.0f;
  28. [SerializeField]
  29. private float backEdgeDilateAmount = 5.0f;
  30. [SerializeField]
  31. [FormerlySerializedAs("Renderer")]
  32. public Renderer renderer;
  33. [SerializeField]
  34. public int SubmeshIndex;
  35. [SerializeField]
  36. public BoundsMode BoundsMode = BoundsMode.Default;
  37. [SerializeField]
  38. public Bounds Bounds = new Bounds(Vector3.zero, Vector3.one);
  39. [SerializeField]
  40. [Range(0.0f, 1.0f)]
  41. public float CutoutThreshold = 0.5f;
  42. [SerializeField]
  43. public CullMode CullMode;
  44. [SerializeField]
  45. private string cutoutTextureName;
  46. [SerializeField]
  47. public DilateRenderMode DilateRenderingMode;
  48. [SerializeField]
  49. private int cutoutTextureIndex;
  50. private int? cutoutTextureId;
  51. public Renderer Renderer
  52. {
  53. get
  54. {
  55. return renderer;
  56. }
  57. }
  58. public bool UsesCutout
  59. {
  60. get
  61. {
  62. return !string.IsNullOrEmpty(cutoutTextureName);
  63. }
  64. }
  65. public int CutoutTextureIndex
  66. {
  67. get
  68. {
  69. return cutoutTextureIndex;
  70. }
  71. set
  72. {
  73. cutoutTextureIndex = value;
  74. if (cutoutTextureIndex < 0)
  75. {
  76. Debug.LogError("Trying to set cutout texture index less than zero");
  77. cutoutTextureIndex = 0;
  78. }
  79. }
  80. }
  81. public int ShiftedSubmeshIndex
  82. {
  83. get
  84. {
  85. return SubmeshIndex;
  86. }
  87. }
  88. public int CutoutTextureId
  89. {
  90. get
  91. {
  92. if (!cutoutTextureId.HasValue)
  93. cutoutTextureId = Shader.PropertyToID(cutoutTextureName);
  94. return cutoutTextureId.Value;
  95. }
  96. }
  97. public string CutoutTextureName
  98. {
  99. get
  100. {
  101. return cutoutTextureName;
  102. }
  103. set
  104. {
  105. cutoutTextureName = value;
  106. cutoutTextureId = null;
  107. }
  108. }
  109. public float EdgeDilateAmount
  110. {
  111. get
  112. {
  113. return edgeDilateAmount;
  114. }
  115. set
  116. {
  117. if (value < 0)
  118. edgeDilateAmount = 0;
  119. else
  120. edgeDilateAmount = value;
  121. }
  122. }
  123. public float FrontEdgeDilateAmount
  124. {
  125. get
  126. {
  127. return frontEdgeDilateAmount;
  128. }
  129. set
  130. {
  131. if (value < 0)
  132. frontEdgeDilateAmount = 0;
  133. else
  134. frontEdgeDilateAmount = value;
  135. }
  136. }
  137. public float BackEdgeDilateAmount
  138. {
  139. get
  140. {
  141. return backEdgeDilateAmount;
  142. }
  143. set
  144. {
  145. if (value < 0)
  146. backEdgeDilateAmount = 0;
  147. else
  148. backEdgeDilateAmount = value;
  149. }
  150. }
  151. public OutlineTarget()
  152. {
  153. }
  154. public OutlineTarget(Renderer renderer, int submesh = 0)
  155. {
  156. SubmeshIndex = submesh;
  157. this.renderer = renderer;
  158. CutoutThreshold = 0.5f;
  159. cutoutTextureId = null;
  160. cutoutTextureName = string.Empty;
  161. CullMode = renderer is SpriteRenderer ? CullMode.Off : CullMode.Back;
  162. DilateRenderingMode = DilateRenderMode.PostProcessing;
  163. frontEdgeDilateAmount = 5.0f;
  164. backEdgeDilateAmount = 5.0f;
  165. edgeDilateAmount = 5.0f;
  166. }
  167. public OutlineTarget(Renderer renderer, string cutoutTextureName, float cutoutThreshold = 0.5f)
  168. {
  169. SubmeshIndex = 0;
  170. this.renderer = renderer;
  171. cutoutTextureId = Shader.PropertyToID(cutoutTextureName);
  172. CutoutThreshold = cutoutThreshold;
  173. this.cutoutTextureName = cutoutTextureName;
  174. CullMode = renderer is SpriteRenderer ? CullMode.Off : CullMode.Back;
  175. DilateRenderingMode = DilateRenderMode.PostProcessing;
  176. frontEdgeDilateAmount = 5.0f;
  177. backEdgeDilateAmount = 5.0f;
  178. edgeDilateAmount = 5.0f;
  179. }
  180. }
  181. }