diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1cea2e8..120defc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,25 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/); this project adheres to [Semantic Versioning](http://semver.org/).
+## [0.8.3] - 2021.01.25
+
+Misc improvements and bugfixes.
+
+### Added
+- Added possibility to set custom shader tags for URP outlines.
+- Added support for filtering URP outline renderers by [rendering layer mask](https://docs.unity3d.com/ScriptReference/Renderer-renderingLayerMask.html) ([#22](https://github.com/Arvtesh/UnityFx.Outline/issues/22)).
+
+### Fixed
+- Fixed URP outlines rendering issue when both depth-testing and MSAA are enabled ([#23](https://github.com/Arvtesh/UnityFx.Outline/issues/23)).
+- Fixed `OutlineBehaviour` not working in edit mode after disabling and enabling it again.
+
+### Changed
+- `OutlineEffect` now works in edit-mode.
+- `OutlineEffect` now exposes `OutlineLayerCollection` instead of `IList`.
+- `OutlineEffect` now uses `OnPreRender` to update its command buffer.
+- Moved `MergeLayerObjects` flag to `OutlineLayer` from `OutlineLayerCollection`.
+- Multiple `OutlineEffect` component instances can now be added to a camera.
+
## [0.8.2] - 2020.11.10
[URP](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@8.1/manual/index.html) per-layer outlines and misc improvements.
diff --git a/Outline.Core/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset b/Outline.Core/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset
index 3707e2e..8ceb008 100644
--- a/Outline.Core/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset
+++ b/Outline.Core/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset
@@ -18,24 +18,30 @@ MonoBehaviour:
type: 2}
_outlineColor: {r: 1, g: 0, b: 0, a: 1}
_outlineWidth: 5
- _outlineIntensity: 2
+ _outlineIntensity: 1
+ _outlineAlphaCutoff: 0.9
_outlineMode: 0
_name: My pretty layer
_enabled: 1
+ _mergeLayerObjects: 0
- _settings:
_outlineSettings: {fileID: 0}
_outlineColor: {r: 1, g: 1, b: 0, a: 1}
_outlineWidth: 15
_outlineIntensity: 2
+ _outlineAlphaCutoff: 0.9
_outlineMode: 1
_name: The second layer
_enabled: 1
+ _mergeLayerObjects: 0
- _settings:
_outlineSettings: {fileID: 0}
_outlineColor: {r: 1, g: 0, b: 1, a: 1}
_outlineWidth: 4
_outlineIntensity: 2
+ _outlineAlphaCutoff: 0.9
_outlineMode: 4
_name: The best layer
_enabled: 1
+ _mergeLayerObjects: 0
_layerMask: 2
diff --git a/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md b/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md
index ecfee66..c07ff3e 100644
--- a/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md
+++ b/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md
@@ -3,6 +3,20 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/); this project adheres to [Semantic Versioning](http://semver.org/).
+## [0.8.3] - 2021.01.25
+
+Misc improvements and bugfixes.
+
+### Fixed
+- Fixed `OutlineBehaviour` not working in edit mode after disabling and enabling it again.
+
+### Changed
+- `OutlineEffect` now works in edit-mode.
+- `OutlineEffect` now exposes `OutlineLayerCollection` instead of `IList`.
+- `OutlineEffect` now uses `OnPreRender` to update its command buffer.
+- Moved `MergeLayerObjects` flag to `OutlineLayer` from `OutlineLayerCollection`.
+- Multiple `OutlineEffect` component instances can now be added to a camera.
+
## [0.8.2] - 2020.11.10
Misc improvements.
diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs
index fd4c904..d32c1ec 100644
--- a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs
+++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs
@@ -45,13 +45,16 @@ public override void OnInspectorGUI()
}
}
- if (_effect.OutlineLayers.Count > 0)
+ if (_effect.OutlineLayers)
{
- _previewOpened = EditorGUILayout.Foldout(_previewOpened, "Preview", true);
-
- if (_previewOpened)
+ if (_effect.OutlineLayers.Count > 0)
{
- OutlineEditorUtility.RenderPreview(_effect.OutlineLayers, true);
+ _previewOpened = EditorGUILayout.Foldout(_previewOpened, "Preview", true);
+
+ if (_previewOpened)
+ {
+ OutlineEditorUtility.RenderPreview(_effect.OutlineLayers, true);
+ }
}
}
}
diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs
index 207abc6..969c46b 100644
--- a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs
+++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs
@@ -38,13 +38,11 @@ public override void OnInspectorGUI()
EditorGUI.BeginChangeCheck();
var mask = EditorGUILayout.MaskField("Ignore layers", _layers.IgnoreLayerMask, InternalEditorUtility.layers);
- var merge = EditorGUILayout.Toggle("Merge Layer Objects", _layers.MergeLayerObjects);
if (EditorGUI.EndChangeCheck())
{
- Undo.RecordObject(_layers, "Change layer collection");
+ Undo.RecordObject(_layers, "Change ignore mask");
_layers.IgnoreLayerMask = mask;
- _layers.MergeLayerObjects = merge;
}
EditorGUILayout.Space();
@@ -89,6 +87,7 @@ private void OnDrawLayer(Rect rect, int index, bool isActive, bool isFocused)
var layer = _layers[index];
var obj = layer.OutlineSettings;
+ var merge = layer.MergeLayerObjects;
var enabled = layer.Enabled;
var name = layer.NameTag;
var color = layer.OutlineColor;
@@ -120,6 +119,9 @@ private void OnDrawLayer(Rect rect, int index, bool isActive, bool isFocused)
{
name = EditorGUI.TextField(new Rect(rect.x, y, rect.width, lineHeight), "Name", name);
y += lineOffset;
+
+ merge = EditorGUI.Toggle(new Rect(rect.x, y, rect.width, lineHeight), "Merge Layer Objects", merge);
+ y += lineOffset;
}
// Outline settings
@@ -157,6 +159,7 @@ private void OnDrawLayer(Rect rect, int index, bool isActive, bool isFocused)
layer.OutlineSettings = obj;
layer.Enabled = enabled;
layer.NameTag = name;
+ layer.MergeLayerObjects = merge;
layer.OutlineWidth = width;
layer.OutlineColor = color;
layer.OutlineRenderMode = renderMode;
@@ -172,7 +175,7 @@ private void OnDrawHeader(Rect rect)
private float OnGetElementHeight(int index)
{
- var numberOfLines = 5;
+ var numberOfLines = 6;
if ((_layers[index].OutlineRenderMode & OutlineRenderFlags.Blurred) != 0)
{
diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs
index 2ccb069..10497c3 100644
--- a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs
+++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs
@@ -12,7 +12,9 @@ namespace UnityFx.Outline
[CustomEditor(typeof(OutlineSettings))]
public class OutlineSettingsEditor : Editor
{
- private const string _layerMaskPropName = "_outlineLayerMask";
+ private const string _filterModePropName = "_filterMode";
+ private const string _layerMaskPropName = "_layerMask";
+ private const string _renderingLayerMaskPropName = "_renderingLayerMask";
private const string _settingsPropName = "_outlineSettings";
private const string _colorPropName = "_outlineColor";
private const string _widthPropName = "_outlineWidth";
@@ -20,7 +22,9 @@ public class OutlineSettingsEditor : Editor
private const string _cutoffPropName = "_outlineAlphaCutoff";
private const string _renderModePropName = "_outlineMode";
- private static readonly GUIContent _layerMaskContent = new GUIContent("Outline Layer Mask", OutlineResources.OutlineLayerMaskTooltip);
+ private static readonly GUIContent _filterModeContent = new GUIContent("Outline Filter Settings", "");
+ private static readonly GUIContent _layerMaskContent = new GUIContent("Layer Mask", OutlineResources.OutlineLayerMaskTooltip);
+ private static readonly GUIContent _renderingLayerMaskContent = new GUIContent("Rendering Layer Mask", OutlineResources.OutlineRenderingLayerMaskTooltip);
private static readonly GUIContent _colorContent = new GUIContent("Color", "Outline color.");
private static readonly GUIContent _widthContent = new GUIContent("Width", "Outline width in pixels.");
private static readonly GUIContent _renderModeContent = new GUIContent("Render Flags", "Outline render flags. Multiple values can be selected at the same time.");
@@ -80,13 +84,25 @@ internal static float GetSettingsInstanceHeight(SerializedProperty property)
internal static float GetSettingsWithMaskHeight(SerializedProperty property)
{
var lineCy = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
- var layerMaskProp = property.FindPropertyRelative(_layerMaskPropName);
+ var filterModeProp = property.FindPropertyRelative(_filterModePropName);
+ var renderOutlineSettings = false;
- if (layerMaskProp.intValue != 0)
+ if (filterModeProp.intValue == (int)OutlineFilterMode.UseLayerMask)
+ {
+ var layerMaskProp = property.FindPropertyRelative(_layerMaskPropName);
+ renderOutlineSettings = true;
+ }
+ else if (filterModeProp.intValue == (int)OutlineFilterMode.UseRenderingLayerMask)
+ {
+ var renderingLayerMaskProp = property.FindPropertyRelative(_renderingLayerMaskPropName);
+ renderOutlineSettings = true;
+ }
+
+ if (renderOutlineSettings)
{
var renderModeProp = property.FindPropertyRelative(_renderModePropName);
var renderMode = (OutlineRenderFlags)renderModeProp.intValue;
- var result = lineCy * 5;
+ var result = lineCy * 6;
if ((renderMode & OutlineRenderFlags.Blurred) != 0)
{
@@ -140,14 +156,30 @@ internal static void DrawSettingsInstance(Rect rc, SerializedProperty property)
internal static void DrawSettingsWithMask(Rect rc, SerializedProperty property)
{
- var layerMaskProp = property.FindPropertyRelative(_layerMaskPropName);
+ var lineCy = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
+ var filterModeProp = property.FindPropertyRelative(_filterModePropName);
- EditorGUI.PropertyField(new Rect(rc.x, rc.y, rc.width, EditorGUIUtility.singleLineHeight), layerMaskProp, _layerMaskContent);
+ EditorGUI.PropertyField(new Rect(rc.x, rc.y, rc.width, EditorGUIUtility.singleLineHeight), filterModeProp, _filterModeContent);
- if (layerMaskProp.intValue != 0)
+ if (filterModeProp.intValue == (int)OutlineFilterMode.UseLayerMask)
{
- var lineCy = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
- DrawSettingsInstance(new Rect(rc.x, rc.y + lineCy, rc.width, rc.height - lineCy), property);
+ var layerMaskProp = property.FindPropertyRelative(_layerMaskPropName);
+
+ EditorGUI.indentLevel += 1;
+ EditorGUI.PropertyField(new Rect(rc.x, rc.y + lineCy, rc.width, EditorGUIUtility.singleLineHeight), layerMaskProp, _layerMaskContent);
+ EditorGUI.indentLevel -= 1;
+
+ DrawSettingsInstance(new Rect(rc.x, rc.y + lineCy * 2, rc.width, rc.height - lineCy), property);
+ }
+ else if (filterModeProp.intValue == (int)OutlineFilterMode.UseRenderingLayerMask)
+ {
+ var renderingLayerMaskProp = property.FindPropertyRelative(_renderingLayerMaskPropName);
+
+ EditorGUI.indentLevel += 1;
+ EditorGUI.PropertyField(new Rect(rc.x, rc.y + lineCy, rc.width, EditorGUIUtility.singleLineHeight), renderingLayerMaskProp, _renderingLayerMaskContent);
+ EditorGUI.indentLevel -= 1;
+
+ DrawSettingsInstance(new Rect(rc.x, rc.y + lineCy * 2, rc.width, rc.height - lineCy), property);
}
}
diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs
index 8a1622e..13f6485 100644
--- a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs
+++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs
@@ -26,7 +26,7 @@ public sealed class OutlineBehaviour : MonoBehaviour, IOutlineSettings
[SerializeField, HideInInspector]
private OutlineSettingsInstance _outlineSettings;
[SerializeField, HideInInspector]
- private int _layerMask;
+ private int _ignoreLayerMask;
[SerializeField, HideInInspector]
private CameraEvent _cameraEvent = OutlineRenderer.RenderEvent;
[SerializeField, HideInInspector]
@@ -99,13 +99,13 @@ public int IgnoreLayerMask
{
get
{
- return _layerMask;
+ return _ignoreLayerMask;
}
set
{
- if (_layerMask != value)
+ if (_ignoreLayerMask != value)
{
- _layerMask = value;
+ _ignoreLayerMask = value;
_renderers?.Reset(false, value);
}
}
@@ -203,7 +203,7 @@ public Camera Camera
///
public void UpdateRenderers()
{
- _renderers?.Reset(false, _layerMask);
+ _renderers?.Reset(false, _ignoreLayerMask);
}
#endregion
@@ -212,14 +212,8 @@ public void UpdateRenderers()
private void Awake()
{
- if (GraphicsSettings.renderPipelineAsset)
- {
- Debug.LogWarningFormat(this, OutlineResources.SrpNotSupported, GetType().Name);
- }
-
-#if UNITY_POST_PROCESSING_STACK_V2
- Debug.LogWarningFormat(this, OutlineResources.PpNotSupported, GetType().Name);
-#endif
+ OutlineResources.LogSrpNotSupported(this);
+ OutlineResources.LogPpNotSupported(this);
CreateRenderersIfNeeded();
CreateSettingsIfNeeded();
@@ -255,7 +249,7 @@ private void Update()
if (_updateRenderers)
{
- _renderers.Reset(false, _layerMask);
+ _renderers.Reset(false, _ignoreLayerMask);
}
foreach (var kvp in _cameraMap)
@@ -266,14 +260,7 @@ private void Update()
if (camera)
{
cmdBuffer.Clear();
-
- if (_renderers.Count > 0)
- {
- using (var renderer = new OutlineRenderer(cmdBuffer, _outlineResources, camera.actualRenderingPath))
- {
- renderer.Render(_renderers.GetList(), _outlineSettings, name);
- }
- }
+ FillCommandBuffer(camera, cmdBuffer);
}
else
{
@@ -301,7 +288,7 @@ private void Reset()
{
if (_renderers != null)
{
- _renderers.Reset(false, _layerMask);
+ _renderers.Reset(false, _ignoreLayerMask);
}
}
@@ -416,6 +403,20 @@ private void OnCameraPreRender(Camera camera)
camera.AddCommandBuffer(_cameraEvent, cmdBuf);
_cameraMap.Add(camera, cmdBuf);
+#if UNITY_EDITOR
+ FillCommandBuffer(camera, cmdBuf);
+#endif
+ }
+ }
+ }
+
+ private void FillCommandBuffer(Camera camera, CommandBuffer cmdBuffer)
+ {
+ if (_renderers.Count > 0)
+ {
+ using (var renderer = new OutlineRenderer(cmdBuffer, _outlineResources, camera.actualRenderingPath))
+ {
+ renderer.Render(_renderers.GetList(), _outlineSettings, name);
}
}
}
@@ -433,7 +434,7 @@ private void CreateRenderersIfNeeded()
if (_renderers == null)
{
_renderers = new OutlineRendererCollection(gameObject);
- _renderers.Reset(false, _layerMask);
+ _renderers.Reset(false, _ignoreLayerMask);
}
}
diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs
index 7de6c04..bc9cd3f 100644
--- a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs
+++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs
@@ -15,7 +15,7 @@ namespace UnityFx.Outline
///
///
///
- [DisallowMultipleComponent]
+ [ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public sealed partial class OutlineEffect : MonoBehaviour
{
@@ -60,14 +60,16 @@ public OutlineResources OutlineResources
///
/// Gets collection of outline layers.
///
- ///
- public IList OutlineLayers
+ public OutlineLayerCollection OutlineLayers
{
get
{
- CreateLayersIfNeeded();
return _outlineLayers;
}
+ set
+ {
+ _outlineLayers = value;
+ }
}
///
@@ -148,72 +150,29 @@ public void RemoveGameObject(GameObject go)
}
}
- ///
- /// Shares with another instance.
- ///
- /// Effect to share with.
- ///
- public void ShareLayersWith(OutlineEffect other)
- {
- if (other)
- {
- CreateLayersIfNeeded();
- other._outlineLayers = _outlineLayers;
- }
- }
-
#endregion
#region MonoBehaviour
private void Awake()
{
- if (GraphicsSettings.renderPipelineAsset)
- {
- Debug.LogWarningFormat(this, OutlineResources.SrpNotSupported, GetType().Name);
- }
-
-#if UNITY_POST_PROCESSING_STACK_V2
- Debug.LogWarningFormat(this, OutlineResources.PpNotSupported, GetType().Name);
-#endif
+ OutlineResources.LogSrpNotSupported(this);
+ OutlineResources.LogPpNotSupported(this);
}
private void OnEnable()
{
- _camera = GetComponent();
-
- if (_camera)
- {
- _commandBuffer = new CommandBuffer
- {
- name = string.Format("{0} - {1}", GetType().Name, name)
- };
-
- _camera.depthTextureMode |= DepthTextureMode.Depth;
- _camera.AddCommandBuffer(_cameraEvent, _commandBuffer);
- }
+ InitCameraAndCommandBuffer();
}
private void OnDisable()
{
- if (_camera)
- {
- _camera.RemoveCommandBuffer(_cameraEvent, _commandBuffer);
- }
-
- if (_commandBuffer != null)
- {
- _commandBuffer.Dispose();
- _commandBuffer = null;
- }
+ ReleaseCameraAndCommandBuffer();
}
- private void Update()
+ private void OnPreRender()
{
- if (_camera && _outlineLayers)
- {
- FillCommandBuffer();
- }
+ FillCommandBuffer();
}
private void OnDestroy()
@@ -227,6 +186,12 @@ private void OnDestroy()
#if UNITY_EDITOR
+ //private void OnValidate()
+ //{
+ // InitCameraAndCommandBuffer();
+ // FillCommandBuffer();
+ //}
+
private void Reset()
{
_outlineLayers = null;
@@ -238,20 +203,55 @@ private void Reset()
#region implementation
- private void FillCommandBuffer()
+ private void InitCameraAndCommandBuffer()
{
- _commandBuffer.Clear();
+ _camera = GetComponent();
- if (_outlineResources && _outlineResources.IsValid)
+ if (_camera && _commandBuffer is null)
{
- using (var renderer = new OutlineRenderer(_commandBuffer, _outlineResources, _camera.actualRenderingPath))
+ _commandBuffer = new CommandBuffer
{
- _renderObjects.Clear();
- _outlineLayers.GetRenderObjects(_renderObjects);
+ name = string.Format("{0} - {1}", GetType().Name, name)
+ };
- foreach (var renderObject in _renderObjects)
+ _camera.depthTextureMode |= DepthTextureMode.Depth;
+ _camera.AddCommandBuffer(_cameraEvent, _commandBuffer);
+ }
+ }
+
+ private void ReleaseCameraAndCommandBuffer()
+ {
+ if (_commandBuffer != null)
+ {
+ if (_camera)
+ {
+ _camera.RemoveCommandBuffer(_cameraEvent, _commandBuffer);
+ }
+
+ _commandBuffer.Dispose();
+ _commandBuffer = null;
+ }
+
+ _camera = null;
+ }
+
+ private void FillCommandBuffer()
+ {
+ if (_camera && _outlineLayers && _commandBuffer != null)
+ {
+ _commandBuffer.Clear();
+
+ if (_outlineResources && _outlineResources.IsValid)
+ {
+ using (var renderer = new OutlineRenderer(_commandBuffer, _outlineResources, _camera.actualRenderingPath))
{
- renderer.Render(renderObject);
+ _renderObjects.Clear();
+ _outlineLayers.GetRenderObjects(_renderObjects);
+
+ foreach (var renderObject in _renderObjects)
+ {
+ renderer.Render(renderObject);
+ }
}
}
}
diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineFilterMode.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineFilterMode.cs
new file mode 100644
index 0000000..c234a9f
--- /dev/null
+++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineFilterMode.cs
@@ -0,0 +1,15 @@
+// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved.
+// See the LICENSE.md file in the project root for more information.
+
+using System;
+using UnityEngine;
+
+namespace UnityFx.Outline
+{
+ internal enum OutlineFilterMode
+ {
+ None,
+ UseLayerMask,
+ UseRenderingLayerMask,
+ }
+}
diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineFilterMode.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineFilterMode.cs.meta
new file mode 100644
index 0000000..cd45e8d
--- /dev/null
+++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineFilterMode.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 82c9d42cc303be24d852b8db7c4b650f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs
index ea9264c..53543ce 100644
--- a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs
+++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs
@@ -26,6 +26,8 @@ public sealed class OutlineLayer : ICollection, IReadOnlyCollection<
private string _name;
[SerializeField, HideInInspector]
private bool _enabled = true;
+ [SerializeField, HideInInspector]
+ private bool _mergeLayerObjects;
private OutlineLayerCollection _parentCollection;
private Dictionary _outlineObjects = new Dictionary();
@@ -67,6 +69,21 @@ public bool Enabled
}
}
+ ///
+ /// Gets or sets a value indicating whether layer game objects should be trated as one.
+ ///
+ public bool MergeLayerObjects
+ {
+ get
+ {
+ return _mergeLayerObjects;
+ }
+ set
+ {
+ _mergeLayerObjects = value;
+ }
+ }
+
///
/// Gets index of the layer in parent collection.
///
@@ -178,13 +195,20 @@ public void GetRenderObjects(IList renderObjects)
{
if (_enabled)
{
- foreach (var kvp in _outlineObjects)
+ if (_mergeLayerObjects)
{
- var go = kvp.Key;
-
- if (go && go.activeInHierarchy)
+ renderObjects.Add(new OutlineRenderObject(GetRenderers(), this, Name));
+ }
+ else
+ {
+ foreach (var kvp in _outlineObjects)
{
- renderObjects.Add(new OutlineRenderObject(kvp.Value.GetList(), _settings, go.name));
+ var go = kvp.Key;
+
+ if (go && go.activeInHierarchy)
+ {
+ renderObjects.Add(new OutlineRenderObject(kvp.Value.GetList(), _settings, go.name));
+ }
}
}
}
diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs
index 160bb83..0e4c483 100644
--- a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs
+++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs
@@ -22,9 +22,7 @@ public sealed class OutlineLayerCollection : ScriptableObject, IList _layers = new List();
[SerializeField, HideInInspector]
- private int _layerMask;
- [SerializeField, HideInInspector]
- private bool _mergeLayerObjects;
+ private int _ignoreLayerMask;
#endregion
@@ -37,13 +35,13 @@ public int IgnoreLayerMask
{
get
{
- return _layerMask;
+ return _ignoreLayerMask;
}
set
{
- if (_layerMask != value)
+ if (_ignoreLayerMask != value)
{
- _layerMask = value;
+ _ignoreLayerMask = value;
foreach (var layer in _layers)
{
@@ -53,21 +51,6 @@ public int IgnoreLayerMask
}
}
- ///
- /// Gets or sets a value indicating whether layer game objects should be trated as one.
- ///
- public bool MergeLayerObjects
- {
- get
- {
- return _mergeLayerObjects;
- }
- set
- {
- _mergeLayerObjects = value;
- }
- }
-
///
/// Gets number of game objects in the layers.
///
@@ -119,19 +102,9 @@ public OutlineLayer AddLayer()
///
public void GetRenderObjects(IList renderObjects)
{
- if (_mergeLayerObjects)
- {
- foreach (var layer in _layers)
- {
- renderObjects.Add(new OutlineRenderObject(layer.GetRenderers(), layer, layer.Name));
- }
- }
- else
+ foreach (var layer in _layers)
{
- foreach (var layer in _layers)
- {
- layer.GetRenderObjects(renderObjects);
- }
+ layer.GetRenderObjects(renderObjects);
}
}
diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs
index 3ca4413..ef6a672 100644
--- a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs
+++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs
@@ -203,6 +203,7 @@ public OutlineRenderer(CommandBuffer cmd, OutlineResources resources, RenderTarg
rtDesc.shadowSamplingMode = ShadowSamplingMode.None;
rtDesc.depthBufferBits = 0;
rtDesc.colorFormat = RtFormat;
+ rtDesc.msaaSamples = 1;
cmd.GetTemporaryRT(resources.MaskTexId, rtDesc, FilterMode.Bilinear);
cmd.GetTemporaryRT(resources.TempTexId, rtDesc, FilterMode.Bilinear);
@@ -311,14 +312,6 @@ public static RenderTargetIdentifier GetBuiltinDepth(RenderingPath renderingPath
return (renderingPath == RenderingPath.DeferredShading || renderingPath == RenderingPath.DeferredLighting) ? BuiltinRenderTextureType.ResolvedDepth : BuiltinRenderTextureType.Depth;
}
- ///
- /// Creates a default instance or .
- ///
- public static RenderTextureDescriptor GetDefaultRtDesc()
- {
- return new RenderTextureDescriptor(-1, -1, RenderTextureFormat.R8, 0);
- }
-
///
/// Specialized render target setup. Do not use if not sure.
///
@@ -350,7 +343,6 @@ public void RenderObjectClear(OutlineRenderFlags flags)
}
}
- //_commandBuffer.SetSinglePassStereo(SinglePassStereoMode.Instancing);
_commandBuffer.ClearRenderTarget(false, true, Color.clear);
}
diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs
index 0d8d261..587462e 100644
--- a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs
+++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
@@ -144,6 +145,11 @@ public sealed class OutlineResources : ScriptableObject
///
public const string OutlineLayerMaskTooltip = "Layer mask for outined objects.";
+ ///
+ /// Tooltip text for outline field.
+ ///
+ public const string OutlineRenderingLayerMaskTooltip = "Rendering layer mask for outined objects.";
+
///
/// Index of the HPass in .
///
@@ -467,6 +473,26 @@ public static float[] GetGaussSamples(int width, float[] samples)
return samples;
}
+ ///
+ /// Writes a console warning if SRP is detected.
+ ///
+ public static void LogSrpNotSupported(UnityEngine.Object obj)
+ {
+ if (GraphicsSettings.renderPipelineAsset)
+ {
+ UnityEngine.Debug.LogWarningFormat(obj, SrpNotSupported, obj.GetType().Name);
+ }
+ }
+
+ ///
+ /// Writes a console warning if Post Processing Stack v2 is detected.
+ ///
+ [Conditional("UNITY_POST_PROCESSING_STACK_V2")]
+ public static void LogPpNotSupported(UnityEngine.Object obj)
+ {
+ UnityEngine.Debug.LogWarningFormat(obj, PpNotSupported, obj.GetType().Name);
+ }
+
#endregion
#region ScriptableObject
diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsWithLayerMask.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsWithLayerMask.cs
index 1336ffc..819bc6a 100644
--- a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsWithLayerMask.cs
+++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsWithLayerMask.cs
@@ -15,7 +15,11 @@ internal class OutlineSettingsWithLayerMask : OutlineSettingsInstance
// NOTE: There are custom editors for public components, so no need to show these in default inspector.
[SerializeField, HideInInspector]
- private LayerMask _outlineLayerMask;
+ private OutlineFilterMode _filterMode;
+ [SerializeField, HideInInspector]
+ private LayerMask _layerMask;
+ [SerializeField, HideInInspector]
+ private uint _renderingLayerMask = 1;
#pragma warning restore 0649
@@ -23,7 +27,41 @@ internal class OutlineSettingsWithLayerMask : OutlineSettingsInstance
#region interface
- public int OutlineLayerMask => _outlineLayerMask;
+ public int OutlineLayerMask
+ {
+ get
+ {
+ if (_filterMode == OutlineFilterMode.UseLayerMask)
+ {
+ return _layerMask;
+ }
+
+ if (_filterMode == OutlineFilterMode.UseRenderingLayerMask)
+ {
+ return -1;
+ }
+
+ return 0;
+ }
+ }
+
+ public uint OutlineRenderingLayerMask
+ {
+ get
+ {
+ if (_filterMode == OutlineFilterMode.UseLayerMask)
+ {
+ return uint.MaxValue;
+ }
+
+ if (_filterMode == OutlineFilterMode.UseRenderingLayerMask)
+ {
+ return _renderingLayerMask;
+ }
+
+ return 0;
+ }
+ }
#endregion
diff --git a/Outline.Core/Packages/UnityFx.Outline/package.json b/Outline.Core/Packages/UnityFx.Outline/package.json
index 5ffda80..da53368 100644
--- a/Outline.Core/Packages/UnityFx.Outline/package.json
+++ b/Outline.Core/Packages/UnityFx.Outline/package.json
@@ -1,6 +1,6 @@
{
"name": "com.unityfx.outline",
- "version": "0.8.2",
+ "version": "0.8.3",
"displayName": "Outline toolkit",
"description": "This package contains configurable per-object and per-camera outline effect implementation for built-in render pipeline. Both solid and blurred outline modes are supported (Gauss blur), as well as depth testing. Reusable and extensible API.",
"unity": "2018.4",
diff --git a/Outline.Core/Packages/packages-lock.json b/Outline.Core/Packages/packages-lock.json
new file mode 100644
index 0000000..fdc7641
--- /dev/null
+++ b/Outline.Core/Packages/packages-lock.json
@@ -0,0 +1,312 @@
+{
+ "dependencies": {
+ "com.unity.ext.nunit": {
+ "version": "1.0.0",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.subsystemregistration": {
+ "version": "1.0.6",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.test-framework": {
+ "version": "1.1.18",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.ext.nunit": "1.0.0",
+ "com.unity.modules.imgui": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.ugui": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.ui": "1.0.0",
+ "com.unity.modules.imgui": "1.0.0"
+ }
+ },
+ "com.unity.xr.legacyinputhelpers": {
+ "version": "2.1.4",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.xr.management": {
+ "version": "3.2.16",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.xr.legacyinputhelpers": "2.1.2",
+ "com.unity.subsystemregistration": "1.0.6"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.xr.mock-hmd": {
+ "version": "1.2.0-preview.1",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.xr.management": "3.0.6"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unityfx.outline": {
+ "version": "file:UnityFx.Outline",
+ "depth": 0,
+ "source": "embedded",
+ "dependencies": {}
+ },
+ "com.unity.modules.ai": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.androidjni": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.animation": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.assetbundle": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.audio": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.cloth": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics": "1.0.0"
+ }
+ },
+ "com.unity.modules.director": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.animation": "1.0.0"
+ }
+ },
+ "com.unity.modules.imageconversion": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.imgui": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.jsonserialize": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.particlesystem": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.physics": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.physics2d": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.screencapture": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.imageconversion": "1.0.0"
+ }
+ },
+ "com.unity.modules.subsystems": {
+ "version": "1.0.0",
+ "depth": 1,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.jsonserialize": "1.0.0"
+ }
+ },
+ "com.unity.modules.terrain": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.terrainphysics": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics": "1.0.0",
+ "com.unity.modules.terrain": "1.0.0"
+ }
+ },
+ "com.unity.modules.tilemap": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics2d": "1.0.0"
+ }
+ },
+ "com.unity.modules.ui": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.uielements": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.imgui": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0"
+ }
+ },
+ "com.unity.modules.umbra": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.unityanalytics": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0"
+ }
+ },
+ "com.unity.modules.unitywebrequest": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.unitywebrequestassetbundle": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.assetbundle": "1.0.0",
+ "com.unity.modules.unitywebrequest": "1.0.0"
+ }
+ },
+ "com.unity.modules.unitywebrequestaudio": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.audio": "1.0.0"
+ }
+ },
+ "com.unity.modules.unitywebrequesttexture": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.imageconversion": "1.0.0"
+ }
+ },
+ "com.unity.modules.unitywebrequestwww": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
+ "com.unity.modules.unitywebrequestaudio": "1.0.0",
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.assetbundle": "1.0.0",
+ "com.unity.modules.imageconversion": "1.0.0"
+ }
+ },
+ "com.unity.modules.vehicles": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics": "1.0.0"
+ }
+ },
+ "com.unity.modules.video": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.ui": "1.0.0",
+ "com.unity.modules.unitywebrequest": "1.0.0"
+ }
+ },
+ "com.unity.modules.vr": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.jsonserialize": "1.0.0",
+ "com.unity.modules.physics": "1.0.0",
+ "com.unity.modules.xr": "1.0.0"
+ }
+ },
+ "com.unity.modules.wind": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.xr": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0",
+ "com.unity.modules.subsystems": "1.0.0"
+ }
+ }
+ }
+}
diff --git a/Outline.URP/Assets/URP/UniversalRenderPipelineAsset_Renderer.asset b/Outline.URP/Assets/URP/UniversalRenderPipelineAsset_Renderer.asset
index dfe5a30..6b87fd8 100644
--- a/Outline.URP/Assets/URP/UniversalRenderPipelineAsset_Renderer.asset
+++ b/Outline.URP/Assets/URP/UniversalRenderPipelineAsset_Renderer.asset
@@ -21,11 +21,14 @@ MonoBehaviour:
_outlineWidth: 11
_outlineIntensity: 2
_outlineAlphaCutoff: 0.9
- _outlineMode: 1
- _outlineLayerMask:
+ _outlineMode: 3
+ _filterMode: 1
+ _layerMask:
serializedVersion: 2
m_Bits: 256
+ _renderingLayerMask: 1
_renderPassEvent: 400
+ _shaderPassNames: []
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -41,7 +44,7 @@ MonoBehaviour:
m_RendererFeatures:
- {fileID: -2278397774415627597}
- {fileID: 7677070003599340959}
- m_RendererFeatureMap: 9f7558507e6e8a6a
+ m_RendererFeatureMap: 9f7558507e6e8a6acd610d4e1a0787b3
postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2}
shaders:
blitPS: {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3}
@@ -86,7 +89,10 @@ MonoBehaviour:
_outlineIntensity: 2
_outlineAlphaCutoff: 0.9
_outlineMode: 0
- _outlineLayerMask:
+ _filterMode: 1
+ _layerMask:
serializedVersion: 2
m_Bits: 512
+ _renderingLayerMask: 1
_renderPassEvent: 400
+ _shaderPassNames: []
diff --git a/Outline.URP/Packages/UnityFx.Outline.URP/CHANGELOG.md b/Outline.URP/Packages/UnityFx.Outline.URP/CHANGELOG.md
index 1be9d9f..1e5cf11 100644
--- a/Outline.URP/Packages/UnityFx.Outline.URP/CHANGELOG.md
+++ b/Outline.URP/Packages/UnityFx.Outline.URP/CHANGELOG.md
@@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/); this project adheres to [Semantic Versioning](http://semver.org/).
+## [0.3.0] - 2021.01.25
+
+Misc improvements and bugfixes.
+
+### Added
+- Added possibility to set custom shader tags for URP outlines.
+- Added support for filtering URP outline renderers by [rendering layer mask](https://docs.unity3d.com/ScriptReference/Renderer-renderingLayerMask.html) ([#22](https://github.com/Arvtesh/UnityFx.Outline/issues/22)).
+
+### Fixed
+- Fixed URP outlines rendering issue when both depth-testing and MSAA are enabled ([#23](https://github.com/Arvtesh/UnityFx.Outline/issues/23)).
+
## [0.2.0] - 2020.11.10
### Added
diff --git a/Outline.URP/Packages/UnityFx.Outline.URP/Runtime/Scripts/OutlineFeature.cs b/Outline.URP/Packages/UnityFx.Outline.URP/Runtime/Scripts/OutlineFeature.cs
index 39954df..4664c02 100644
--- a/Outline.URP/Packages/UnityFx.Outline.URP/Runtime/Scripts/OutlineFeature.cs
+++ b/Outline.URP/Packages/UnityFx.Outline.URP/Runtime/Scripts/OutlineFeature.cs
@@ -30,11 +30,12 @@ public class OutlineFeature : ScriptableRendererFeature
private OutlineSettingsWithLayerMask _outlineSettings;
[SerializeField]
private RenderPassEvent _renderPassEvent = RenderPassEvent.AfterRenderingSkybox;
+ [SerializeField]
+ public string[] _shaderPassNames;
#pragma warning restore 0649
private OutlinePass _outlinePass;
-
private string _featureName;
#endregion
@@ -49,6 +50,8 @@ public class OutlineFeature : ScriptableRendererFeature
internal int OutlineLayerMask => _outlineSettings.OutlineLayerMask;
+ internal uint OutlineRenderingLayerMask => _outlineSettings.OutlineRenderingLayerMask;
+
internal string FeatureName => _featureName;
#endregion
@@ -67,7 +70,7 @@ public override void Create()
_featureName = OutlineResources.EffectName;
}
- _outlinePass = new OutlinePass(this)
+ _outlinePass = new OutlinePass(this, _shaderPassNames)
{
renderPassEvent = _renderPassEvent
};
diff --git a/Outline.URP/Packages/UnityFx.Outline.URP/Runtime/Scripts/OutlinePass.cs b/Outline.URP/Packages/UnityFx.Outline.URP/Runtime/Scripts/OutlinePass.cs
index 977f49f..3bbebfd 100644
--- a/Outline.URP/Packages/UnityFx.Outline.URP/Runtime/Scripts/OutlinePass.cs
+++ b/Outline.URP/Packages/UnityFx.Outline.URP/Runtime/Scripts/OutlinePass.cs
@@ -14,13 +14,27 @@ internal class OutlinePass : ScriptableRenderPass
{
private readonly OutlineFeature _feature;
private readonly List _renderObjects = new List();
- private readonly List _shaderTagIdList = new List() { new ShaderTagId("UniversalForward") };
+ private readonly List _shaderTagIdList = new List();
private ScriptableRenderer _renderer;
- public OutlinePass(OutlineFeature feature)
+ public OutlinePass(OutlineFeature feature, string[] shaderTags)
{
_feature = feature;
+
+ if (shaderTags != null && shaderTags.Length > 0)
+ {
+ foreach (var passName in shaderTags)
+ {
+ _shaderTagIdList.Add(new ShaderTagId(passName));
+ }
+ }
+ else
+ {
+ _shaderTagIdList.Add(new ShaderTagId("UniversalForward"));
+ _shaderTagIdList.Add(new ShaderTagId("LightweightForward"));
+ _shaderTagIdList.Add(new ShaderTagId("SRPDefaultUnlit"));
+ }
}
public void Setup(ScriptableRenderer renderer)
@@ -32,19 +46,21 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData
{
var outlineResources = _feature.OutlineResources;
var outlineSettings = _feature.OutlineSettings;
+ var camData = renderingData.cameraData;
if (_feature.OutlineLayerMask != 0)
{
var cmd = CommandBufferPool.Get(_feature.FeatureName);
- var filteringSettings = new FilteringSettings(RenderQueueRange.all, _feature.OutlineLayerMask);
+ var filteringSettings = new FilteringSettings(RenderQueueRange.all, _feature.OutlineLayerMask, _feature.OutlineRenderingLayerMask);
var renderStateBlock = new RenderStateBlock(RenderStateMask.Nothing);
- var sortingCriteria = renderingData.cameraData.defaultOpaqueSortFlags;
+ var sortingCriteria = camData.defaultOpaqueSortFlags;
var drawingSettings = CreateDrawingSettings(_shaderTagIdList, ref renderingData, sortingCriteria);
+ var depthTexture = new RenderTargetIdentifier("_CameraDepthTexture");
drawingSettings.enableDynamicBatching = false;
drawingSettings.overrideMaterial = outlineResources.RenderMaterial;
- using (var renderer = new OutlineRenderer(cmd, outlineResources, _renderer.cameraColorTarget, _renderer.cameraDepth, renderingData.cameraData.cameraTargetDescriptor))
+ using (var renderer = new OutlineRenderer(cmd, outlineResources, _renderer.cameraColorTarget, depthTexture/*_renderer.cameraDepth*/, camData.cameraTargetDescriptor))
{
renderer.RenderObjectClear(outlineSettings.OutlineRenderMode);
context.ExecuteCommandBuffer(cmd);
@@ -62,7 +78,7 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData
{
var cmd = CommandBufferPool.Get(OutlineResources.EffectName);
- using (var renderer = new OutlineRenderer(cmd, outlineResources, _renderer.cameraColorTarget, _renderer.cameraDepth, renderingData.cameraData.cameraTargetDescriptor))
+ using (var renderer = new OutlineRenderer(cmd, outlineResources, _renderer.cameraColorTarget, _renderer.cameraDepth, camData.cameraTargetDescriptor))
{
_renderObjects.Clear();
_feature.OutlineLayers.GetRenderObjects(_renderObjects);
diff --git a/Outline.URP/Packages/UnityFx.Outline.URP/package.json b/Outline.URP/Packages/UnityFx.Outline.URP/package.json
index c6e50c4..aa401f3 100644
--- a/Outline.URP/Packages/UnityFx.Outline.URP/package.json
+++ b/Outline.URP/Packages/UnityFx.Outline.URP/package.json
@@ -1,11 +1,11 @@
{
"name": "com.unityfx.outline.urp",
- "version": "0.2.0",
+ "version": "0.3.0",
"displayName": "Outline toolkit (URP)",
"description": "This package contains configurable outline implementation for Universal Render Pipeline.",
"unity": "2019.4",
"dependencies": {
- "com.unityfx.outline": "0.8.2",
+ "com.unityfx.outline": "0.8.3",
"com.unity.render-pipelines.universal": "7.0.0"
},
"keywords": [
diff --git a/Outline.URP/Packages/packages-lock.json b/Outline.URP/Packages/packages-lock.json
new file mode 100644
index 0000000..b22aedb
--- /dev/null
+++ b/Outline.URP/Packages/packages-lock.json
@@ -0,0 +1,331 @@
+{
+ "dependencies": {
+ "com.unity.render-pipelines.core": {
+ "version": "7.3.1",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.ugui": "1.0.0"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.render-pipelines.universal": {
+ "version": "7.3.1",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.render-pipelines.core": "7.3.1",
+ "com.unity.shadergraph": "7.3.1"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.shadergraph": {
+ "version": "7.3.1",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.render-pipelines.core": "7.3.1"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.subsystemregistration": {
+ "version": "1.0.6",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.ugui": {
+ "version": "1.0.0",
+ "depth": 2,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.ui": "1.0.0",
+ "com.unity.modules.imgui": "1.0.0"
+ }
+ },
+ "com.unity.xr.legacyinputhelpers": {
+ "version": "2.1.4",
+ "depth": 1,
+ "source": "registry",
+ "dependencies": {},
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.xr.management": {
+ "version": "3.2.16",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.xr.legacyinputhelpers": "2.1.2",
+ "com.unity.subsystemregistration": "1.0.6"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unity.xr.mock-hmd": {
+ "version": "1.2.0-preview.1",
+ "depth": 0,
+ "source": "registry",
+ "dependencies": {
+ "com.unity.xr.management": "3.0.6"
+ },
+ "url": "https://packages.unity.com"
+ },
+ "com.unityfx.outline": {
+ "version": "file:../../Outline.Core/Packages/UnityFx.Outline",
+ "depth": 0,
+ "source": "local",
+ "dependencies": {}
+ },
+ "com.unityfx.outline.urp": {
+ "version": "file:UnityFx.Outline.URP",
+ "depth": 0,
+ "source": "embedded",
+ "dependencies": {
+ "com.unityfx.outline": "0.8.2",
+ "com.unity.render-pipelines.universal": "7.0.0"
+ }
+ },
+ "com.unity.modules.ai": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.androidjni": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.animation": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.assetbundle": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.audio": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.cloth": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics": "1.0.0"
+ }
+ },
+ "com.unity.modules.director": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.animation": "1.0.0"
+ }
+ },
+ "com.unity.modules.imageconversion": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.imgui": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.jsonserialize": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.particlesystem": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.physics": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.physics2d": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.screencapture": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.imageconversion": "1.0.0"
+ }
+ },
+ "com.unity.modules.subsystems": {
+ "version": "1.0.0",
+ "depth": 1,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.jsonserialize": "1.0.0"
+ }
+ },
+ "com.unity.modules.terrain": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.terrainphysics": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics": "1.0.0",
+ "com.unity.modules.terrain": "1.0.0"
+ }
+ },
+ "com.unity.modules.tilemap": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics2d": "1.0.0"
+ }
+ },
+ "com.unity.modules.ui": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.uielements": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.imgui": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0"
+ }
+ },
+ "com.unity.modules.umbra": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.unityanalytics": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0"
+ }
+ },
+ "com.unity.modules.unitywebrequest": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.unitywebrequestassetbundle": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.assetbundle": "1.0.0",
+ "com.unity.modules.unitywebrequest": "1.0.0"
+ }
+ },
+ "com.unity.modules.unitywebrequestaudio": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.audio": "1.0.0"
+ }
+ },
+ "com.unity.modules.unitywebrequesttexture": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.imageconversion": "1.0.0"
+ }
+ },
+ "com.unity.modules.unitywebrequestwww": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.unitywebrequest": "1.0.0",
+ "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
+ "com.unity.modules.unitywebrequestaudio": "1.0.0",
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.assetbundle": "1.0.0",
+ "com.unity.modules.imageconversion": "1.0.0"
+ }
+ },
+ "com.unity.modules.vehicles": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics": "1.0.0"
+ }
+ },
+ "com.unity.modules.video": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.ui": "1.0.0",
+ "com.unity.modules.unitywebrequest": "1.0.0"
+ }
+ },
+ "com.unity.modules.vr": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.jsonserialize": "1.0.0",
+ "com.unity.modules.physics": "1.0.0",
+ "com.unity.modules.xr": "1.0.0"
+ }
+ },
+ "com.unity.modules.wind": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {}
+ },
+ "com.unity.modules.xr": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physics": "1.0.0",
+ "com.unity.modules.jsonserialize": "1.0.0",
+ "com.unity.modules.subsystems": "1.0.0"
+ }
+ }
+ }
+}
diff --git a/README.md b/README.md
index 1a4c9c4..75c76a7 100644
--- a/README.md
+++ b/README.md
@@ -68,8 +68,8 @@ Npm core package is available at [npmjs.com](https://www.npmjs.com/package/com.u
}
],
"dependencies": {
- "com.unityfx.outline": "0.8.2",
- "com.unityfx.outline.urp": "0.2.0",
+ "com.unityfx.outline": "0.8.3",
+ "com.unityfx.outline.urp": "0.3.0",
}
}
```