186 lines
4.4 KiB
C#
186 lines
4.4 KiB
C#
namespace Plugins.Outline
|
|
{
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering.Universal;
|
|
|
|
[DisallowMultipleRendererFeature]
|
|
public sealed class OutlineFeature : ScriptableRendererFeature
|
|
{
|
|
public OutlineResources Resources => _resources;
|
|
|
|
[SerializeField]
|
|
private OutlineResources _resources;
|
|
|
|
private static bool _isInitialized;
|
|
private static OutlinePass[] _outlinePasses;
|
|
|
|
public override void Create()
|
|
{
|
|
if (_isInitialized == true)
|
|
return;
|
|
|
|
List<OutlinePass> outlinePasses = new List<OutlinePass>();
|
|
|
|
foreach (int renderPass in Enum.GetValues(typeof(RenderPassEvent)))
|
|
{
|
|
OutlinePass outlinePass = new OutlinePass(this);
|
|
outlinePass.renderPassEvent = (RenderPassEvent)renderPass;
|
|
|
|
outlinePasses.Add(outlinePass);
|
|
}
|
|
|
|
_outlinePasses = outlinePasses.ToArray();
|
|
|
|
_isInitialized = true;
|
|
}
|
|
|
|
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
|
|
{
|
|
if (_isInitialized == false)
|
|
return;
|
|
|
|
for (int i = 0; i < _outlinePasses.Length; ++i)
|
|
{
|
|
OutlinePass outlinePass = _outlinePasses[i];
|
|
if (outlinePass.IsActive == true)
|
|
{
|
|
outlinePass.Setup(renderer);
|
|
renderer.EnqueuePass(outlinePass);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static bool HasObject(GameObject gameObject, IOutlineSettings settings)
|
|
{
|
|
if (_isInitialized == false)
|
|
return false;
|
|
|
|
for (int i = 0; i < _outlinePasses.Length; ++i)
|
|
{
|
|
OutlinePass outlinePass = _outlinePasses[i];
|
|
if (outlinePass.renderPassEvent == settings.Pass)
|
|
{
|
|
return outlinePass.HasObject(gameObject);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static bool RegisterObject(GameObject gameObject, IOutlineSettings settings)
|
|
{
|
|
if (_isInitialized == false)
|
|
return false;
|
|
if (gameObject == null)
|
|
return false;
|
|
if (settings == null)
|
|
return false;
|
|
|
|
for (int i = 0; i < _outlinePasses.Length; ++i)
|
|
{
|
|
OutlinePass outlinePass = _outlinePasses[i];
|
|
if (outlinePass.renderPassEvent == settings.Pass)
|
|
{
|
|
if (outlinePass.HasObject(gameObject) == true)
|
|
return true;
|
|
|
|
List<Renderer> renderers = new List<Renderer>();
|
|
if (settings.UpdateMode == EOutlineUpdateMode.Self)
|
|
{
|
|
Renderer renderer = gameObject.GetComponent<Renderer>();
|
|
if (renderer != null && gameObject.GetComponentInParent<IgnoreOutline>() == null)
|
|
{
|
|
renderers.Add(renderer);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
gameObject.GetComponentsInChildren<Renderer>(true, renderers);
|
|
|
|
for (int j = renderers.Count - 1; j >= 0; --j)
|
|
{
|
|
if (renderers[j].GetComponentInParent<IgnoreOutline>() != null)
|
|
{
|
|
renderers.RemoveAt(j);
|
|
}
|
|
}
|
|
}
|
|
|
|
outlinePass.RegisterObject(gameObject, renderers, settings, false);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static bool RegisterObject(GameObject gameObject, Renderer renderer, IOutlineSettings settings)
|
|
{
|
|
if (_isInitialized == false)
|
|
return false;
|
|
if (gameObject == null)
|
|
return false;
|
|
if (renderer == null)
|
|
return false;
|
|
if (settings == null)
|
|
return false;
|
|
|
|
for (int i = 0; i < _outlinePasses.Length; ++i)
|
|
{
|
|
OutlinePass outlinePass = _outlinePasses[i];
|
|
if (outlinePass.renderPassEvent == settings.Pass)
|
|
{
|
|
if (outlinePass.HasObject(gameObject) == true)
|
|
return true;
|
|
|
|
List<Renderer> renderers = new List<Renderer>() { renderer };
|
|
|
|
outlinePass.RegisterObject(gameObject, renderers, settings, false);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static bool RegisterObject(GameObject gameObject, List<Renderer> renderers, IOutlineSettings settings)
|
|
{
|
|
if (_isInitialized == false)
|
|
return false;
|
|
if (gameObject == null)
|
|
return false;
|
|
if (renderers == null)
|
|
return false;
|
|
if (settings == null)
|
|
return false;
|
|
|
|
for (int i = 0; i < _outlinePasses.Length; ++i)
|
|
{
|
|
OutlinePass outlinePass = _outlinePasses[i];
|
|
if (outlinePass.renderPassEvent == settings.Pass)
|
|
{
|
|
outlinePass.RegisterObject(gameObject, renderers, settings, true);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static void UnregisterObject(GameObject gameObject)
|
|
{
|
|
if (_isInitialized == false)
|
|
return;
|
|
if (gameObject == null)
|
|
return;
|
|
|
|
for (int i = 0; i < _outlinePasses.Length; ++i)
|
|
{
|
|
_outlinePasses[i].UnregisterObject(gameObject);
|
|
}
|
|
}
|
|
}
|
|
}
|