From bb07f2ac91f3a1049f99b21e22829a3a7b104d33 Mon Sep 17 00:00:00 2001 From: Arvtesh <22732458+Arvtesh@users.noreply.github.com> Date: Thu, 27 Feb 2020 21:19:52 +0200 Subject: [PATCH 01/39] README update (added forum link) --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 15725b4..7e8c121 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ Npm | [![Npm release](https://img.shields.io/npm/v/com.unityfx.outline.svg)](htt **Requires Unity 2017 or higher.**
**Compatible with [Unity Post-processing Stack v2](https://github.com/Unity-Technologies/PostProcessing/tree/v2).** +**Please ask any questions and leave feedback at the [Unity forums](https://forum.unity.com/threads/screen-space-outline-effect-for-unity-free.836908/).** + ## Synopsis ![Outline demo](Docs/OutlineSamples.png "Outline demo") ![Outline demo](Docs/MotusOutline.png "Outline demo") @@ -177,7 +179,7 @@ The project was initially created to help author with his [Unity3d](https://unit ## Documentation Please see the links below for extended information on the product: -- [Unity forums](https://forum.unity.com/threads/TODO/). +- [Unity forums](https://forum.unity.com/threads/screen-space-outline-effect-for-unity-free.836908/). - [CHANGELOG](CHANGELOG.md). - [SUPPORT](.github/SUPPORT.md). From f57ca80833bdc8cfda1b3f0c8f3aabf40e26c7fc Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Wed, 18 Mar 2020 11:01:47 +0200 Subject: [PATCH 02/39] Removed unused packages and upgraded post-processing to v2.3.0 --- Packages/manifest.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Packages/manifest.json b/Packages/manifest.json index 2fb6ccc..ca7d94d 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,12 +1,7 @@ { "dependencies": { - "com.unity.ads": "2.0.8", - "com.unity.analytics": "3.2.2", - "com.unity.collab-proxy": "1.2.15", "com.unity.package-manager-ui": "2.0.8", - "com.unity.postprocessing": "2.2.2", - "com.unity.purchasing": "2.0.3", - "com.unity.textmeshpro": "1.4.1", + "com.unity.postprocessing": "2.3.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.animation": "1.0.0", "com.unity.modules.assetbundle": "1.0.0", From 62935e94e998c21bc6b7cfb05c53f3fac6443bed Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Wed, 18 Mar 2020 11:04:46 +0200 Subject: [PATCH 03/39] Fixed compiler warning --- .../UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs b/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs index b8cbd52..e7ef71d 100644 --- a/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs +++ b/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs @@ -11,9 +11,13 @@ namespace UnityFx.Outline.PostProcessing [PostProcess(typeof(OutlineEffectRenderer), PostProcessEvent.BeforeStack, "UnityFx/Outline", false)] public sealed class Outline : PostProcessEffectSettings { +#pragma warning disable 0649 + [SerializeField] private OutlineResources _defaultResources; +#pragma warning restore 0649 + [Serializable] public class OutlineResourcesParameter : ParameterOverride { From 985d1ab17ef12d508793a32c2aa88fffcd5b8b25 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Wed, 18 Mar 2020 11:16:42 +0200 Subject: [PATCH 04/39] Added DepthTestEnabled outline settings (interface only) --- .../Editor/Scripts/OutlineEditorUtility.cs | 8 +++++++ .../Runtime/Scripts/IOutlineSettings.cs | 5 +++++ .../Runtime/Scripts/OutlineBehaviour.cs | 15 +++++++++++++ .../Runtime/Scripts/OutlineLayer.cs | 13 +++++++++++ .../Runtime/Scripts/OutlineSettings.cs | 16 ++++++++++++++ .../Scripts/OutlineSettingsInstance.cs | 22 +++++++++++++++++++ 6 files changed, 79 insertions(+) diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs b/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs index ff0934c..81dd745 100644 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs +++ b/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs @@ -93,6 +93,14 @@ public static void Render(IOutlineSettings settings, UnityEngine.Object undoCont Undo.RecordObject(undoContext, "Blur"); settings.OutlineMode = blurred ? OutlineMode.Blurred : OutlineMode.Solid; } + + var depthTestEnabled = EditorGUILayout.Toggle("Depth Test", settings.DepthTestEnabled); + + if (depthTestEnabled != settings.DepthTestEnabled) + { + Undo.RecordObject(undoContext, "Depth Test"); + settings.DepthTestEnabled = depthTestEnabled; + } } public static void RenderPreview(OutlineLayer layer, int layerIndex, bool showObjects) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs b/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs index cef4b6c..138be37 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs @@ -36,5 +36,10 @@ public interface IOutlineSettings : IEquatable /// /// OutlineMode OutlineMode { get; set; } + + /// + /// Gets or sets a value indicating whether depth-testing is enabled. + /// + bool DepthTestEnabled { get; set; } } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs index 9c6249f..69d38eb 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs @@ -335,6 +335,21 @@ public OutlineMode OutlineMode } } + /// + public bool DepthTestEnabled + { + get + { + CreateSettingsIfNeeded(); + return _outlineSettings.DepthTestEnabled; + } + set + { + CreateSettingsIfNeeded(); + _outlineSettings.DepthTestEnabled = value; + } + } + #endregion #region IEquatable diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs index a31b3dd..c0530d0 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs @@ -351,6 +351,19 @@ public OutlineMode OutlineMode } } + /// + public bool DepthTestEnabled + { + get + { + return _settings.DepthTestEnabled; + } + set + { + _settings.DepthTestEnabled = value; + } + } + #endregion #region ICollection diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs index be81f4a..fe6d411 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs @@ -23,6 +23,8 @@ public sealed class OutlineSettings : ScriptableObject, IOutlineSettings private float _outlineIntensity = 2; [SerializeField, HideInInspector] private OutlineMode _outlineMode; + [SerializeField, HideInInspector] + private bool _depthTestEnabled; #endregion @@ -38,6 +40,7 @@ public static bool Equals(IOutlineSettings lhs, IOutlineSettings rhs) return lhs.OutlineColor == rhs.OutlineColor && lhs.OutlineWidth == rhs.OutlineWidth && lhs.OutlineMode == rhs.OutlineMode && + lhs.DepthTestEnabled == rhs.DepthTestEnabled && Mathf.Approximately(lhs.OutlineIntensity, rhs.OutlineIntensity); } @@ -97,6 +100,19 @@ public OutlineMode OutlineMode } } + /// + public bool DepthTestEnabled + { + get + { + return _depthTestEnabled; + } + set + { + _depthTestEnabled = value; + } + } + #endregion #region IEquatable diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs index b581145..73c460b 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs @@ -25,6 +25,8 @@ internal class OutlineSettingsInstance : IOutlineSettingsEx, IChangeTracking private float _outlineIntensity = 2; [SerializeField, HideInInspector] private OutlineMode _outlineMode; + [SerializeField, HideInInspector] + private bool _depthTestEnabled; #pragma warning restore 0649 @@ -101,6 +103,7 @@ public OutlineSettings OutlineSettings _outlineWidth = _outlineSettings.OutlineWidth; _outlineIntensity = _outlineSettings.OutlineIntensity; _outlineMode = _outlineSettings.OutlineMode; + _depthTestEnabled = _outlineSettings.DepthTestEnabled; _changed = true; } } @@ -191,6 +194,25 @@ public OutlineMode OutlineMode } } + /// + public bool DepthTestEnabled + { + get + { + return _depthTestEnabled; + } + set + { + ThrowIfSettingsAssigned(); + + if (_depthTestEnabled != value) + { + _depthTestEnabled = value; + _changed = true; + } + } + } + #endregion #region IChangeTracking From 58aad7a97d6eadb6819d2e3c28f5803df9bc7e12 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Wed, 18 Mar 2020 16:31:40 +0200 Subject: [PATCH 05/39] Pilot version of depth testing implemented (#1) --- Assets/Examples/SimplePerCamera/Outline.unity | 155 +++++++++++------- .../SimplePerObject/TestOutlineSettings.asset | 1 + .../Runtime/Scripts/OutlineEffect.cs | 1 + .../Runtime/Scripts/OutlineRenderer.cs | 39 +++-- .../Scripts/OutlineSettingsInstance.cs | 4 +- .../Runtime/Shaders/OutlineRenderColor.shader | 2 +- 6 files changed, 128 insertions(+), 74 deletions(-) diff --git a/Assets/Examples/SimplePerCamera/Outline.unity b/Assets/Examples/SimplePerCamera/Outline.unity index 63a292e..c172ec7 100644 --- a/Assets/Examples/SimplePerCamera/Outline.unity +++ b/Assets/Examples/SimplePerCamera/Outline.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 8 + serializedVersion: 9 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -39,6 +39,7 @@ RenderSettings: m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} m_IndirectSpecularColor: {r: 0.44657844, g: 0.49641222, b: 0.57481694, a: 1} + m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 @@ -49,16 +50,14 @@ LightmapSettings: m_BounceScale: 1 m_IndirectOutputScale: 1 m_AlbedoBoost: 1 - m_TemporalCoherenceThreshold: 1 m_EnvironmentLightingMode: 0 m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 1 m_LightmapEditorSettings: - serializedVersion: 9 + serializedVersion: 10 m_Resolution: 2 m_BakeResolution: 40 - m_TextureWidth: 1024 - m_TextureHeight: 1024 + m_AtlasSize: 1024 m_AO: 0 m_AOMaxDistance: 1 m_CompAOExponent: 1 @@ -116,9 +115,10 @@ NavMeshSettings: --- !u!1 &167171210 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 m_Component: - component: {fileID: 167171212} - component: {fileID: 167171211} @@ -132,8 +132,9 @@ GameObject: --- !u!108 &167171211 Light: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 167171210} m_Enabled: 1 serializedVersion: 8 @@ -159,6 +160,7 @@ Light: serializedVersion: 2 m_Bits: 4294967295 m_Lightmapping: 4 + m_LightShadowCasterMode: 0 m_AreaSize: {x: 1, y: 1} m_BounceIntensity: 1 m_ColorTemperature: 6570 @@ -168,8 +170,9 @@ Light: --- !u!4 &167171212 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 167171210} m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} m_LocalPosition: {x: 0, y: 3, z: 0} @@ -181,9 +184,10 @@ Transform: --- !u!1 &692811812 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 m_Component: - component: {fileID: 692811816} - component: {fileID: 692811815} @@ -199,13 +203,19 @@ GameObject: --- !u!20 &692811815 Camera: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 692811812} m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 1 m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -235,8 +245,9 @@ Camera: --- !u!4 &692811816 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 692811812} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 1, z: -10} @@ -251,8 +262,9 @@ Transform: --- !u!114 &692811817 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 692811812} m_Enabled: 1 m_EditorHideFlags: 0 @@ -265,8 +277,9 @@ MonoBehaviour: --- !u!114 &692811818 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 692811812} m_Enabled: 1 m_EditorHideFlags: 0 @@ -275,12 +288,14 @@ MonoBehaviour: m_EditorClassIdentifier: _outlineResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, type: 2} _outlineLayers: {fileID: 11400000, guid: 3a6c3b3c5f6e3ad4ab8e09fc219865bd, type: 2} + _cameraEvent: 18 --- !u!1 &748173439 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 m_Component: - component: {fileID: 748173443} - component: {fileID: 748173442} @@ -296,8 +311,9 @@ GameObject: --- !u!23 &748173440 MeshRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 748173439} m_Enabled: 1 m_CastShadows: 1 @@ -306,6 +322,8 @@ MeshRenderer: m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 m_Materials: - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} m_StaticBatchInfo: @@ -330,8 +348,9 @@ MeshRenderer: --- !u!65 &748173441 BoxCollider: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 748173439} m_Material: {fileID: 0} m_IsTrigger: 0 @@ -342,18 +361,20 @@ BoxCollider: --- !u!33 &748173442 MeshFilter: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 748173439} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!4 &748173443 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 748173439} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -1.51, y: 0, z: 4} + m_LocalPosition: {x: -1, y: 0, z: 5.58} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 692811816} @@ -362,9 +383,10 @@ Transform: --- !u!1 &1579373802 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 m_Component: - component: {fileID: 1579373806} - component: {fileID: 1579373805} @@ -380,8 +402,9 @@ GameObject: --- !u!23 &1579373803 MeshRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1579373802} m_Enabled: 1 m_CastShadows: 1 @@ -390,6 +413,8 @@ MeshRenderer: m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 m_Materials: - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} m_StaticBatchInfo: @@ -414,8 +439,9 @@ MeshRenderer: --- !u!135 &1579373804 SphereCollider: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1579373802} m_Material: {fileID: 0} m_IsTrigger: 0 @@ -426,15 +452,17 @@ SphereCollider: --- !u!33 &1579373805 MeshFilter: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1579373802} m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} --- !u!4 &1579373806 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1579373802} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 4} @@ -446,9 +474,10 @@ Transform: --- !u!1 &1789341920 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 m_Component: - component: {fileID: 1789341921} - component: {fileID: 1789341925} @@ -465,8 +494,9 @@ GameObject: --- !u!4 &1789341921 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1789341920} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 1.5, y: 0, z: 4} @@ -478,8 +508,9 @@ Transform: --- !u!114 &1789341922 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1789341920} m_Enabled: 1 m_EditorHideFlags: 0 @@ -493,11 +524,13 @@ MonoBehaviour: _outlineWidth: 15 _outlineIntensity: 2 _outlineMode: 1 + _depthTestEnabled: 0 --- !u!23 &1789341923 MeshRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1789341920} m_Enabled: 1 m_CastShadows: 1 @@ -506,6 +539,8 @@ MeshRenderer: m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 m_Materials: - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} m_StaticBatchInfo: @@ -530,8 +565,9 @@ MeshRenderer: --- !u!136 &1789341924 CapsuleCollider: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1789341920} m_Material: {fileID: 0} m_IsTrigger: 0 @@ -543,7 +579,8 @@ CapsuleCollider: --- !u!33 &1789341925 MeshFilter: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1789341920} m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Examples/SimplePerObject/TestOutlineSettings.asset b/Assets/Examples/SimplePerObject/TestOutlineSettings.asset index d94ff6a..fdd954a 100644 --- a/Assets/Examples/SimplePerObject/TestOutlineSettings.asset +++ b/Assets/Examples/SimplePerObject/TestOutlineSettings.asset @@ -16,3 +16,4 @@ MonoBehaviour: _outlineWidth: 5 _outlineIntensity: 2 _outlineMode: 0 + _depthTestEnabled: 1 diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs index cab15bf..cbe3ca9 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs @@ -192,6 +192,7 @@ private void OnEnable() #endif camera.AddCommandBuffer(_cameraEvent, _commandBuffer); + camera.depthTextureMode |= DepthTextureMode.Depth; } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs index 2d33e1b..5293a43 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs @@ -59,7 +59,7 @@ namespace UnityFx.Outline /// } /// /// - public struct OutlineRenderer : IDisposable + public readonly struct OutlineRenderer : IDisposable { #region data @@ -207,7 +207,7 @@ public void Render(IEnumerable renderers, OutlineResources resources, } Init(resources, settings); - RenderObject(renderers, resources.RenderMaterial); + RenderObject(renderers, settings, resources.RenderMaterial); RenderHPass(resources, settings); RenderVPassBlend(resources, settings); } @@ -237,7 +237,7 @@ public void Render(Renderer renderer, OutlineResources resources, IOutlineSettin } Init(resources, settings); - RenderObject(renderer, resources.RenderMaterial); + RenderObject(renderer, settings, resources.RenderMaterial); RenderHPass(resources, settings); RenderVPassBlend(resources, settings); } @@ -302,14 +302,32 @@ private void Init(OutlineResources resources, IOutlineSettings settings) _commandBuffer.SetGlobalFloatArray(resources.GaussSamplesId, resources.GetGaussSamples(settings.OutlineWidth)); } - private void RenderObject(IEnumerable renderers, Material mat) + private void RenderObjectClear(bool depthTestEnabled) { + if (depthTestEnabled) + { + // NOTE: Use the camera depth buffer when rendering the mask. Shader only reads from the depth buffer (ZWrite Off). +#if UNITY_2018_2_OR_NEWER + _commandBuffer.SetRenderTarget(_maskRtId, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, BuiltinRenderTextureType.Depth, RenderBufferLoadAction.Load, RenderBufferStoreAction.DontCare); +#else + _commandBuffer.SetRenderTarget(_maskRtId, BuiltinRenderTextureType.Depth); +#endif + } + else + { #if UNITY_2018_2_OR_NEWER - _commandBuffer.SetRenderTarget(_maskRtId, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store); + _commandBuffer.SetRenderTarget(_maskRtId, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store); #else - _commandBuffer.SetRenderTarget(_maskRtId); + _commandBuffer.SetRenderTarget(_maskRtId); #endif + } + _commandBuffer.ClearRenderTarget(false, true, Color.clear); + } + + private void RenderObject(IEnumerable renderers, IOutlineSettings settings, Material mat) + { + RenderObjectClear(settings.DepthTestEnabled); foreach (var r in renderers) { @@ -323,14 +341,9 @@ private void RenderObject(IEnumerable renderers, Material mat) } } - private void RenderObject(Renderer renderer, Material mat) + private void RenderObject(Renderer renderer, IOutlineSettings settings, Material mat) { -#if UNITY_2018_2_OR_NEWER - _commandBuffer.SetRenderTarget(_maskRtId, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store); -#else - _commandBuffer.SetRenderTarget(_maskRtId); -#endif - _commandBuffer.ClearRenderTarget(false, true, Color.clear); + RenderObjectClear(settings.DepthTestEnabled); if (renderer && renderer.gameObject.activeInHierarchy && renderer.enabled) { diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs index 73c460b..375515c 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs @@ -70,12 +70,14 @@ internal void UpdateChanged() if (_outlineColor != _outlineSettings.OutlineColor || _outlineWidth != _outlineSettings.OutlineWidth || _outlineIntensity != _outlineSettings.OutlineIntensity || - _outlineMode != _outlineSettings.OutlineMode) + _outlineMode != _outlineSettings.OutlineMode || + _depthTestEnabled != _outlineSettings.DepthTestEnabled) { _outlineColor = _outlineSettings.OutlineColor; _outlineWidth = _outlineSettings.OutlineWidth; _outlineIntensity = _outlineSettings.OutlineIntensity; _outlineMode = _outlineSettings.OutlineMode; + _depthTestEnabled = _outlineSettings.DepthTestEnabled; _changed = true; } } diff --git a/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader b/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader index ab3f9a6..bf53276 100644 --- a/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader +++ b/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader @@ -9,7 +9,7 @@ Shader "UnityFx/Outline/RenderColor" { Cull Off ZWrite Off - ZTest Always + ZTest LEqual Lighting Off Pass From 1f6550fd885aca6dbb16badf0be935bf836715e4 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Wed, 18 Mar 2020 16:36:37 +0200 Subject: [PATCH 06/39] Removed unnecessary camera requirement to render depth texture --- Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs index cbe3ca9..cab15bf 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs @@ -192,7 +192,6 @@ private void OnEnable() #endif camera.AddCommandBuffer(_cameraEvent, _commandBuffer); - camera.depthTextureMode |= DepthTextureMode.Depth; } } From 3e6304d6c4c18a278b0a34db38fb8ec5ea4d31a5 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Thu, 26 Mar 2020 15:13:22 +0200 Subject: [PATCH 07/39] Changed IOutlineSettings to use OutlineRenderFlags value, removed DepthTestEnabled property (#1) --- .../Editor/Scripts/OutlineEditorUtility.cs | 32 +++++++++++++---- .../Runtime/Scripts/IOutlineSettings.cs | 20 +++++------ .../Runtime/Scripts/OutlineBehaviour.cs | 21 ++---------- .../Runtime/Scripts/OutlineLayer.cs | 19 ++--------- .../{OutlineMode.cs => OutlineRenderFlags.cs} | 14 +++++--- ...ode.cs.meta => OutlineRenderFlags.cs.meta} | 0 .../Runtime/Scripts/OutlineRenderer.cs | 10 +++--- .../Runtime/Scripts/OutlineSettings.cs | 22 ++---------- .../Scripts/OutlineSettingsInstance.cs | 34 +++---------------- .../Helpers/IOutlineSettingsExTests.cs | 2 +- .../Scripts/Helpers/IOutlineSettingsTests.cs | 12 +++---- 11 files changed, 71 insertions(+), 115 deletions(-) rename Packages/UnityFx.Outline/Runtime/Scripts/{OutlineMode.cs => OutlineRenderFlags.cs} (56%) rename Packages/UnityFx.Outline/Runtime/Scripts/{OutlineMode.cs.meta => OutlineRenderFlags.cs.meta} (100%) diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs b/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs index 81dd745..3f82a55 100644 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs +++ b/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs @@ -71,7 +71,8 @@ public static void Render(IOutlineSettings settings, UnityEngine.Object undoCont settings.OutlineWidth = width; } - var blurred = EditorGUILayout.Toggle("Blurred", settings.OutlineMode == OutlineMode.Blurred); + var prevBlurred = (settings.OutlineRenderMode & OutlineRenderFlags.Blurred) != 0; + var blurred = EditorGUILayout.Toggle("Blurred", prevBlurred); if (blurred) { @@ -88,18 +89,35 @@ public static void Render(IOutlineSettings settings, UnityEngine.Object undoCont EditorGUI.indentLevel -= 1; } - if (blurred != (settings.OutlineMode == OutlineMode.Blurred)) + if (blurred != prevBlurred) { Undo.RecordObject(undoContext, "Blur"); - settings.OutlineMode = blurred ? OutlineMode.Blurred : OutlineMode.Solid; + + if (blurred) + { + settings.OutlineRenderMode |= OutlineRenderFlags.Blurred; + } + else + { + settings.OutlineRenderMode &= ~OutlineRenderFlags.Blurred; + } } - var depthTestEnabled = EditorGUILayout.Toggle("Depth Test", settings.DepthTestEnabled); + var prevDepthTestEnabled = (settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0; + var depthTestEnabled = EditorGUILayout.Toggle("Depth Test", prevDepthTestEnabled); - if (depthTestEnabled != settings.DepthTestEnabled) + if (depthTestEnabled != prevDepthTestEnabled) { Undo.RecordObject(undoContext, "Depth Test"); - settings.DepthTestEnabled = depthTestEnabled; + + if (depthTestEnabled) + { + settings.OutlineRenderMode |= OutlineRenderFlags.EnableDepthTesting; + } + else + { + settings.OutlineRenderMode &= ~OutlineRenderFlags.EnableDepthTesting; + } } } @@ -116,7 +134,7 @@ public static void RenderPreview(OutlineLayer layer, int layerIndex, bool showOb if (layer.Enabled) { - EditorGUILayout.LabelField(layer.OutlineMode == OutlineMode.Solid ? layer.OutlineMode.ToString() : string.Format("Blurred ({0})", layer.OutlineIntensity), GUILayout.MaxWidth(70)); + EditorGUILayout.LabelField(layer.OutlineRenderMode == OutlineRenderFlags.Solid ? layer.OutlineRenderMode.ToString() : string.Format("Blurred ({0})", layer.OutlineIntensity), GUILayout.MaxWidth(70)); EditorGUILayout.IntField(layer.OutlineWidth, GUILayout.MaxWidth(100)); EditorGUILayout.ColorField(layer.OutlineColor, GUILayout.MinWidth(100)); } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs b/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs index 138be37..c822837 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs @@ -7,7 +7,7 @@ namespace UnityFx.Outline { /// - /// Defines outline settings. + /// Generic outline settings. /// public interface IOutlineSettings : IEquatable { @@ -15,31 +15,31 @@ public interface IOutlineSettings : IEquatable /// Gets or sets outline color. /// /// - /// + /// Color OutlineColor { get; set; } /// /// Gets or sets outline width in pixels. Allowed range is [, ]. /// /// - /// + /// int OutlineWidth { get; set; } /// /// Gets or sets outline intensity value. Allowed range is [, ]. + /// This is used for blurred oulines only (i.e. is set to ). /// + /// + /// + /// float OutlineIntensity { get; set; } /// - /// Gets or sets outline mode. + /// Gets or sets outline render mode. /// /// /// - OutlineMode OutlineMode { get; set; } - - /// - /// Gets or sets a value indicating whether depth-testing is enabled. - /// - bool DepthTestEnabled { get; set; } + /// + OutlineRenderFlags OutlineRenderMode { get; set; } } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs index 69d38eb..f40c17f 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs @@ -321,32 +321,17 @@ public float OutlineIntensity } /// - public OutlineMode OutlineMode + public OutlineRenderFlags OutlineRenderMode { get { CreateSettingsIfNeeded(); - return _outlineSettings.OutlineMode; + return _outlineSettings.OutlineRenderMode; } set { CreateSettingsIfNeeded(); - _outlineSettings.OutlineMode = value; - } - } - - /// - public bool DepthTestEnabled - { - get - { - CreateSettingsIfNeeded(); - return _outlineSettings.DepthTestEnabled; - } - set - { - CreateSettingsIfNeeded(); - _outlineSettings.DepthTestEnabled = value; + _outlineSettings.OutlineRenderMode = value; } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs index c0530d0..caf4959 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs @@ -339,28 +339,15 @@ public float OutlineIntensity } /// - public OutlineMode OutlineMode + public OutlineRenderFlags OutlineRenderMode { get { - return _settings.OutlineMode; + return _settings.OutlineRenderMode; } set { - _settings.OutlineMode = value; - } - } - - /// - public bool DepthTestEnabled - { - get - { - return _settings.DepthTestEnabled; - } - set - { - _settings.DepthTestEnabled = value; + _settings.OutlineRenderMode = value; } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineMode.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs similarity index 56% rename from Packages/UnityFx.Outline/Runtime/Scripts/OutlineMode.cs rename to Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs index b628af7..c911c0d 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineMode.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs @@ -6,18 +6,24 @@ namespace UnityFx.Outline { /// - /// Enumerates outline modes. + /// Enumerates outline render modes. /// - public enum OutlineMode + [Flags] + public enum OutlineRenderFlags { /// /// Outline frame is a solid line. /// - Solid, + Solid = 0, /// /// Outline frame is blurred. /// - Blurred + Blurred = 1, + + /// + /// Enabled depth testing when rendering object outlines. Only visible parts of objects are outlined. + /// + EnableDepthTesting = 0x100 } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineMode.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs.meta similarity index 100% rename from Packages/UnityFx.Outline/Runtime/Scripts/OutlineMode.cs.meta rename to Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs.meta diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs index 5293a43..8cb5a1f 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs @@ -327,7 +327,7 @@ private void RenderObjectClear(bool depthTestEnabled) private void RenderObject(IEnumerable renderers, IOutlineSettings settings, Material mat) { - RenderObjectClear(settings.DepthTestEnabled); + RenderObjectClear((settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0); foreach (var r in renderers) { @@ -343,7 +343,7 @@ private void RenderObject(IEnumerable renderers, IOutlineSettings sett private void RenderObject(Renderer renderer, IOutlineSettings settings, Material mat) { - RenderObjectClear(settings.DepthTestEnabled); + RenderObjectClear((settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0); if (renderer && renderer.gameObject.activeInHierarchy && renderer.enabled) { @@ -382,13 +382,13 @@ private void RenderVPassBlend(OutlineResources resources, IOutlineSettings setti props.SetFloat(resources.WidthId, settings.OutlineWidth); props.SetColor(resources.ColorId, settings.OutlineColor); - if (settings.OutlineMode == OutlineMode.Solid) + if ((settings.OutlineRenderMode & OutlineRenderFlags.Blurred) != 0) { - props.SetFloat(resources.IntensityId, SolidIntensity); + props.SetFloat(resources.IntensityId, settings.OutlineIntensity); } else { - props.SetFloat(resources.IntensityId, settings.OutlineIntensity); + props.SetFloat(resources.IntensityId, SolidIntensity); } // Set source texture as _MainTex to match Blit behavior. diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs index fe6d411..2535031 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs @@ -22,9 +22,7 @@ public sealed class OutlineSettings : ScriptableObject, IOutlineSettings [SerializeField, HideInInspector] private float _outlineIntensity = 2; [SerializeField, HideInInspector] - private OutlineMode _outlineMode; - [SerializeField, HideInInspector] - private bool _depthTestEnabled; + private OutlineRenderFlags _outlineMode; #endregion @@ -39,8 +37,7 @@ public static bool Equals(IOutlineSettings lhs, IOutlineSettings rhs) return lhs.OutlineColor == rhs.OutlineColor && lhs.OutlineWidth == rhs.OutlineWidth && - lhs.OutlineMode == rhs.OutlineMode && - lhs.DepthTestEnabled == rhs.DepthTestEnabled && + lhs.OutlineRenderMode == rhs.OutlineRenderMode && Mathf.Approximately(lhs.OutlineIntensity, rhs.OutlineIntensity); } @@ -88,7 +85,7 @@ public float OutlineIntensity } /// - public OutlineMode OutlineMode + public OutlineRenderFlags OutlineRenderMode { get { @@ -100,19 +97,6 @@ public OutlineMode OutlineMode } } - /// - public bool DepthTestEnabled - { - get - { - return _depthTestEnabled; - } - set - { - _depthTestEnabled = value; - } - } - #endregion #region IEquatable diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs index 375515c..b9fdff7 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs @@ -24,9 +24,7 @@ internal class OutlineSettingsInstance : IOutlineSettingsEx, IChangeTracking [SerializeField, HideInInspector] private float _outlineIntensity = 2; [SerializeField, HideInInspector] - private OutlineMode _outlineMode; - [SerializeField, HideInInspector] - private bool _depthTestEnabled; + private OutlineRenderFlags _outlineMode; #pragma warning restore 0649 @@ -70,14 +68,12 @@ internal void UpdateChanged() if (_outlineColor != _outlineSettings.OutlineColor || _outlineWidth != _outlineSettings.OutlineWidth || _outlineIntensity != _outlineSettings.OutlineIntensity || - _outlineMode != _outlineSettings.OutlineMode || - _depthTestEnabled != _outlineSettings.DepthTestEnabled) + _outlineMode != _outlineSettings.OutlineRenderMode) { _outlineColor = _outlineSettings.OutlineColor; _outlineWidth = _outlineSettings.OutlineWidth; _outlineIntensity = _outlineSettings.OutlineIntensity; - _outlineMode = _outlineSettings.OutlineMode; - _depthTestEnabled = _outlineSettings.DepthTestEnabled; + _outlineMode = _outlineSettings.OutlineRenderMode; _changed = true; } } @@ -104,8 +100,7 @@ public OutlineSettings OutlineSettings _outlineColor = _outlineSettings.OutlineColor; _outlineWidth = _outlineSettings.OutlineWidth; _outlineIntensity = _outlineSettings.OutlineIntensity; - _outlineMode = _outlineSettings.OutlineMode; - _depthTestEnabled = _outlineSettings.DepthTestEnabled; + _outlineMode = _outlineSettings.OutlineRenderMode; _changed = true; } } @@ -178,7 +173,7 @@ public float OutlineIntensity } /// - public OutlineMode OutlineMode + public OutlineRenderFlags OutlineRenderMode { get { @@ -196,25 +191,6 @@ public OutlineMode OutlineMode } } - /// - public bool DepthTestEnabled - { - get - { - return _depthTestEnabled; - } - set - { - ThrowIfSettingsAssigned(); - - if (_depthTestEnabled != value) - { - _depthTestEnabled = value; - _changed = true; - } - } - } - #endregion #region IChangeTracking diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs b/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs index b2b32d1..af05396 100644 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs +++ b/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs @@ -86,7 +86,7 @@ public void OutlineSettings_MakesOtherSettersThrow() Assert.Throws(() => _settings.OutlineColor = Color.blue); Assert.Throws(() => _settings.OutlineWidth = 12); - Assert.Throws(() => _settings.OutlineMode = OutlineMode.Blurred); + Assert.Throws(() => _settings.OutlineRenderMode = OutlineRenderFlags.Blurred); Assert.Throws(() => _settings.OutlineIntensity = 17); } finally diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs b/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs index a93b909..55a2687 100644 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs +++ b/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs @@ -108,11 +108,11 @@ public void OutlineWidth_DoesNotSetsChangedOnSameValue() [Test] public void OutlineMode_SetsValue() { - _settings.OutlineMode = OutlineMode.Blurred; - Assert.AreEqual(OutlineMode.Blurred, _settings.OutlineMode); + _settings.OutlineRenderMode = OutlineRenderFlags.Blurred; + Assert.AreEqual(OutlineRenderFlags.Blurred, _settings.OutlineRenderMode); - _settings.OutlineMode = OutlineMode.Solid; - Assert.AreEqual(OutlineMode.Solid, _settings.OutlineMode); + _settings.OutlineRenderMode = OutlineRenderFlags.Solid; + Assert.AreEqual(OutlineRenderFlags.Solid, _settings.OutlineRenderMode); } [Test] @@ -121,7 +121,7 @@ public void OutlineMode_SetsChanged() if (_changeTracking != null) { _changeTracking.AcceptChanges(); - _settings.OutlineMode = OutlineMode.Blurred; + _settings.OutlineRenderMode = OutlineRenderFlags.Blurred; Assert.IsTrue(_changeTracking.IsChanged); } @@ -133,7 +133,7 @@ public void OutlineMode_DoesNotSetsChangedOnSameValue() if (_changeTracking != null) { _changeTracking.AcceptChanges(); - _settings.OutlineMode = _settings.OutlineMode; + _settings.OutlineRenderMode = _settings.OutlineRenderMode; Assert.IsFalse(_changeTracking.IsChanged); } From 1df1410d54e032a405ab50186ce3096cad30d2ee Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Thu, 26 Mar 2020 16:28:55 +0200 Subject: [PATCH 08/39] Get rid of GC allocations during command buffer updates (#2) --- .../Scripts/OutlineBehaviour.Renderers.cs | 5 ++ .../Runtime/Scripts/OutlineBehaviour.cs | 2 +- .../Runtime/Scripts/OutlineLayer.Renderers.cs | 5 ++ .../Runtime/Scripts/OutlineLayer.cs | 2 +- .../Runtime/Scripts/OutlineRenderer.cs | 83 +++++++++++++++++-- .../Runtime/Scripts/OutlineResources.cs | 18 ++-- 6 files changed, 99 insertions(+), 16 deletions(-) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs index 553e553..8b0f627 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs @@ -55,6 +55,11 @@ internal RendererCollection(OutlineBehaviour parent) _go = parent.gameObject; } + internal List GetList() + { + return _renderers; + } + public void Reset() { foreach (var r in _renderers) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs index f40c17f..bcbcbc9 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs @@ -186,7 +186,7 @@ private void Update() using (var renderer = new OutlineRenderer(_commandBuffer, BuiltinRenderTextureType.CameraTarget)) { - renderer.Render(_renderers, _outlineSettings.OutlineResources, _outlineSettings); + renderer.Render(_renderers.GetList(), _outlineSettings.OutlineResources, _outlineSettings); } _outlineSettings.AcceptChanges(); diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.Renderers.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.Renderers.cs index 881ce33..bcc32d9 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.Renderers.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.Renderers.cs @@ -41,6 +41,11 @@ internal RendererCollection(GameObject parent, int ignoreMask) Reset(ignoreMask); } + internal List GetList() + { + return _renderers; + } + public void Reset(int ignoreLayerMask) { _renderers.Clear(); diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs index caf4959..6dc03b5 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs @@ -223,7 +223,7 @@ public void Render(OutlineRenderer renderer, OutlineResources resources) { if (kvp.Key && kvp.Key.activeInHierarchy) { - renderer.Render(kvp.Value, _settings.OutlineResources, _settings); + renderer.Render(kvp.Value.GetList(), _settings.OutlineResources, _settings); } } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs index 8cb5a1f..8686abe 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs @@ -182,6 +182,38 @@ public OutlineRenderer(CommandBuffer commandBuffer, RenderTargetIdentifier src, } } + /// + /// Renders outline around a single object. This version allows enumeration of with no GC allocations. + /// + /// One or more renderers representing a single object to be outlined. + /// Outline resources. + /// Outline settings. + /// Thrown if any of the arguments is . + /// + /// + public void Render(IList renderers, OutlineResources resources, IOutlineSettings settings) + { + if (renderers == null) + { + throw new ArgumentNullException("renderers"); + } + + if (resources == null) + { + throw new ArgumentNullException("resources"); + } + + if (settings == null) + { + throw new ArgumentNullException("settings"); + } + + Init(resources, settings); + RenderObject(resources, settings, renderers); + RenderHPass(resources, settings); + RenderVPassBlend(resources, settings); + } + /// /// Renders outline around a single object. /// @@ -189,6 +221,8 @@ public OutlineRenderer(CommandBuffer commandBuffer, RenderTargetIdentifier src, /// Outline resources. /// Outline settings. /// Thrown if any of the arguments is . + /// + /// public void Render(IEnumerable renderers, OutlineResources resources, IOutlineSettings settings) { if (renderers == null) @@ -207,7 +241,7 @@ public void Render(IEnumerable renderers, OutlineResources resources, } Init(resources, settings); - RenderObject(renderers, settings, resources.RenderMaterial); + RenderObject(resources, settings, renderers); RenderHPass(resources, settings); RenderVPassBlend(resources, settings); } @@ -219,6 +253,8 @@ public void Render(IEnumerable renderers, OutlineResources resources, /// Outline resources. /// Outline settings. /// Thrown if any of the arguments is . + /// + /// public void Render(Renderer renderer, OutlineResources resources, IOutlineSettings settings) { if (renderer == null) @@ -237,7 +273,7 @@ public void Render(Renderer renderer, OutlineResources resources, IOutlineSettin } Init(resources, settings); - RenderObject(renderer, settings, resources.RenderMaterial); + RenderObject(resources, settings, renderer); RenderHPass(resources, settings); RenderVPassBlend(resources, settings); } @@ -325,31 +361,62 @@ private void RenderObjectClear(bool depthTestEnabled) _commandBuffer.ClearRenderTarget(false, true, Color.clear); } - private void RenderObject(IEnumerable renderers, IOutlineSettings settings, Material mat) + private void RenderObject(OutlineResources resources, IOutlineSettings settings, IList renderers) { RenderObjectClear((settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0); + for (var i = 0; i < renderers.Count; ++i) + { + var r = renderers[i]; + + if (r && r.enabled && r.gameObject.activeInHierarchy) + { + // NOTE: Accessing Renderer.sharedMaterials triggers GC.Alloc. That's why we use a temporary + // list of materials, cached with the outline resources. + r.GetMaterials(resources.TmpMaterials); + + for (var j = 0; j < resources.TmpMaterials.Count; ++j) + { + _commandBuffer.DrawRenderer(r, resources.RenderMaterial, j); + } + } + } + } + + private void RenderObject(OutlineResources resources, IOutlineSettings settings, IEnumerable renderers) + { + RenderObjectClear((settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0); + + // NOTE: Calling IEnumerable.GetEnumerator() triggers GC.Alloc. foreach (var r in renderers) { if (r && r.enabled && r.gameObject.activeInHierarchy) { - for (var j = 0; j < r.sharedMaterials.Length; ++j) + // NOTE: Accessing Renderer.sharedMaterials triggers GC.Alloc. That's why we use a temporary + // list of materials, cached with the outline resources. + r.GetMaterials(resources.TmpMaterials); + + for (var j = 0; j < resources.TmpMaterials.Count; ++j) { - _commandBuffer.DrawRenderer(r, mat, j); + _commandBuffer.DrawRenderer(r, resources.RenderMaterial, j); } } } } - private void RenderObject(Renderer renderer, IOutlineSettings settings, Material mat) + private void RenderObject(OutlineResources resources, IOutlineSettings settings, Renderer renderer) { RenderObjectClear((settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0); if (renderer && renderer.gameObject.activeInHierarchy && renderer.enabled) { - for (var i = 0; i < renderer.sharedMaterials.Length; ++i) + // NOTE: Accessing Renderer.sharedMaterials triggers GC.Alloc. That's why we use a temporary + // list of materials, cached with the outline resources. + renderer.GetMaterials(resources.TmpMaterials); + + for (var i = 0; i < resources.TmpMaterials.Count; ++i) { - _commandBuffer.DrawRenderer(renderer, mat, i); + _commandBuffer.DrawRenderer(renderer, resources.RenderMaterial, i); } } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs index 945e013..88ec434 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs @@ -2,6 +2,7 @@ // See the LICENSE.md file in the project root for more information. using System; +using System.Collections.Generic; using UnityEngine; namespace UnityFx.Outline @@ -21,7 +22,7 @@ public sealed class OutlineResources : ScriptableObject private MaterialPropertyBlock _hPassProperties; private MaterialPropertyBlock _vPassProperties; private Mesh _fullscreenTriangleMesh; - private float[][] _gaussSmples; + private float[][] _gaussSamples; #endregion @@ -47,6 +48,11 @@ public sealed class OutlineResources : ScriptableObject /// public readonly int GaussSamplesId = Shader.PropertyToID("_GaussSamples"); + /// + /// Temp materials list. Used by to avoid GC allocations. + /// + public readonly List TmpMaterials = new List(); + /// /// Gets or sets a that renders objects outlined with a solid while color. /// @@ -198,17 +204,17 @@ public bool IsValid /// public float[] GetGaussSamples(int width) { - if (_gaussSmples == null) + if (_gaussSamples == null) { - _gaussSmples = new float[OutlineRenderer.MaxWidth][]; + _gaussSamples = new float[OutlineRenderer.MaxWidth][]; } - if (_gaussSmples[width] == null) + if (_gaussSamples[width] == null) { - _gaussSmples[width] = OutlineRenderer.GetGaussSamples(width, null); + _gaussSamples[width] = OutlineRenderer.GetGaussSamples(width, null); } - return _gaussSmples[width]; + return _gaussSamples[width]; } /// From c157803b72cb66e7f223f8383057adca36656ac1 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Thu, 26 Mar 2020 16:39:00 +0200 Subject: [PATCH 09/39] CHANGELOG update --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7d442d..74ca888 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,16 @@ 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.0] - unreleased + +Added depth testing support and performance optimizations. + +### Added +- Added support for depth testing when rendering outlines. When enabled, outlines are only rendered around the visible object parts. + +### Fixed +- Get rid of GC allocatinos during command buffer updates. + ## [0.7.1] - 2020.01.28 Bugfixes and project layout changes. From baf43c824e385be49f14518286bdf959b99a21e3 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Thu, 26 Mar 2020 16:40:06 +0200 Subject: [PATCH 10/39] Package version updated --- Assets/Examples/SimplePerObject/TestOutlineSettings.asset | 3 +-- Packages/UnityFx.Outline/package.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Assets/Examples/SimplePerObject/TestOutlineSettings.asset b/Assets/Examples/SimplePerObject/TestOutlineSettings.asset index fdd954a..a32e433 100644 --- a/Assets/Examples/SimplePerObject/TestOutlineSettings.asset +++ b/Assets/Examples/SimplePerObject/TestOutlineSettings.asset @@ -14,6 +14,5 @@ MonoBehaviour: m_EditorClassIdentifier: _outlineColor: {r: 1, g: 0, b: 0, a: 1} _outlineWidth: 5 - _outlineIntensity: 2 + _outlineIntensity: 1 _outlineMode: 0 - _depthTestEnabled: 1 diff --git a/Packages/UnityFx.Outline/package.json b/Packages/UnityFx.Outline/package.json index 1a5ff20..0dfd31d 100644 --- a/Packages/UnityFx.Outline/package.json +++ b/Packages/UnityFx.Outline/package.json @@ -1,6 +1,6 @@ { "name": "com.unityfx.outline", - "version": "0.7.1", + "version": "0.8.0", "displayName": "Screen-space outline", "description": "Configurable per-object and per-camera outlines. Both solid and blurred outline modes are supported (Gauss blur). The outlines can be easily customized either through scripts or with Unity editor (both in edit-time or runtime).", "unity": "2017.2", From 8bfa5e8ad30f0c4298e1ad540c1ef959aa39e1fd Mon Sep 17 00:00:00 2001 From: Arvtesh <22732458+Arvtesh@users.noreply.github.com> Date: Fri, 27 Mar 2020 21:37:38 +0200 Subject: [PATCH 11/39] Misc renderer fixes --- .../UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs index 8686abe..eeced3e 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs @@ -59,7 +59,7 @@ namespace UnityFx.Outline /// } /// /// - public readonly struct OutlineRenderer : IDisposable + public struct OutlineRenderer : IDisposable { #region data @@ -373,7 +373,7 @@ private void RenderObject(OutlineResources resources, IOutlineSettings settings, { // NOTE: Accessing Renderer.sharedMaterials triggers GC.Alloc. That's why we use a temporary // list of materials, cached with the outline resources. - r.GetMaterials(resources.TmpMaterials); + r.GetSharedMaterials(resources.TmpMaterials); for (var j = 0; j < resources.TmpMaterials.Count; ++j) { @@ -394,7 +394,7 @@ private void RenderObject(OutlineResources resources, IOutlineSettings settings, { // NOTE: Accessing Renderer.sharedMaterials triggers GC.Alloc. That's why we use a temporary // list of materials, cached with the outline resources. - r.GetMaterials(resources.TmpMaterials); + r.GetSharedMaterials(resources.TmpMaterials); for (var j = 0; j < resources.TmpMaterials.Count; ++j) { @@ -412,7 +412,7 @@ private void RenderObject(OutlineResources resources, IOutlineSettings settings, { // NOTE: Accessing Renderer.sharedMaterials triggers GC.Alloc. That's why we use a temporary // list of materials, cached with the outline resources. - renderer.GetMaterials(resources.TmpMaterials); + renderer.GetSharedMaterials(resources.TmpMaterials); for (var i = 0; i < resources.TmpMaterials.Count; ++i) { From 190501df51cd072c3aa434daec7c9c839a9a4b77 Mon Sep 17 00:00:00 2001 From: Arvtesh <22732458+Arvtesh@users.noreply.github.com> Date: Fri, 27 Mar 2020 22:10:01 +0200 Subject: [PATCH 12/39] Removed change tracking support (#2) --- .../Runtime/Scripts/OutlineBehaviour.cs | 31 +--- .../Runtime/Scripts/OutlineEffect.cs | 52 +----- .../Runtime/Scripts/OutlineLayer.cs | 54 +----- .../Runtime/Scripts/OutlineLayerCollection.cs | 57 +------ .../Scripts/OutlineSettingsInstance.cs | 133 ++++----------- .../Scripts/OutlineLayerCollectionTests.cs | 155 ------------------ .../Tests/Editor/Scripts/OutlineLayerTests.cs | 116 ------------- 7 files changed, 48 insertions(+), 550 deletions(-) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs index bcbcbc9..76c1bf3 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs @@ -81,7 +81,7 @@ public OutlineResources OutlineResources CreateSettingsIfNeeded(); _outlineResources = value; - _outlineSettings.SetResources(_outlineResources); + _outlineSettings.OutlineResources = _outlineResources; } } } @@ -109,17 +109,6 @@ public ICollection Cameras } } - /// - /// Detects changes in nested assets and updates outline if needed. The actual update might not be invoked until the next frame. - /// - public void UpdateChanged() - { - if (_outlineSettings != null) - { - _outlineSettings.UpdateChanged(); - } - } - #endregion #region MonoBehaviour @@ -129,14 +118,14 @@ private void Awake() CreateRenderersIfNeeded(); CreateSettingsIfNeeded(); - _outlineSettings.SetResources(_outlineResources); + _outlineSettings.OutlineResources = _outlineResources; } private void OnDestroy() { if (_outlineSettings != null) { - _outlineSettings.SetResources(null); + _outlineSettings.OutlineResources = null; } } @@ -174,13 +163,7 @@ private void Update() _cameraMapUpdateTimer = 0; } -#if UNITY_EDITOR - - UpdateChanged(); - -#endif - - if (_outlineResources != null && _renderers != null && (_outlineSettings.IsChanged || _commandBuffer.sizeInBytes == 0)) + if (_outlineResources != null && _renderers != null) { _commandBuffer.Clear(); @@ -189,8 +172,6 @@ private void Update() renderer.Render(_renderers.GetList(), _outlineSettings.OutlineResources, _outlineSettings); } - _outlineSettings.AcceptChanges(); - #if UNITY_EDITOR _commandBufferUpdateCounter++; @@ -224,14 +205,14 @@ private void OnValidate() CreateCommandBufferIfNeeded(); CreateSettingsIfNeeded(); - _outlineSettings.SetResources(_outlineResources); + _outlineSettings.OutlineResources = _outlineResources; } private void Reset() { if (_outlineSettings != null) { - _outlineSettings.SetResources(_outlineResources); + _outlineSettings.OutlineResources = _outlineResources; } if (_renderers != null) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs index cab15bf..d08cedc 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs @@ -29,7 +29,6 @@ public sealed partial class OutlineEffect : MonoBehaviour private CameraEvent _cameraEvent = OutlineRenderer.RenderEvent; private CommandBuffer _commandBuffer; - private bool _changed; #if UNITY_EDITOR @@ -73,11 +72,7 @@ public OutlineResources OutlineResources throw new ArgumentNullException("OutlineResources"); } - if (_outlineResources != value) - { - _outlineResources = value; - _changed = true; - } + _outlineResources = value; } } @@ -100,11 +95,7 @@ public OutlineLayerCollection OutlineLayers throw new ArgumentNullException("OutlineLayers"); } - if (_outlineLayers != value) - { - _outlineLayers = value; - _changed = true; - } + _outlineLayers = value; } } @@ -149,18 +140,6 @@ public void ShareLayersWith(OutlineEffect other) CreateLayersIfNeeded(); other._outlineLayers = _outlineLayers; - other._changed = true; - } - } - - /// - /// Detects changes in nested assets and updates outline if needed. The actual update might not be invoked until the next frame. - /// - public void UpdateChanged() - { - if (_outlineLayers) - { - _outlineLayers.UpdateChanged(); } } @@ -183,8 +162,6 @@ private void OnEnable() name = string.Format("{0} - {1}", GetType().Name, name) }; - _changed = true; - #if UNITY_EDITOR _commandBufferUpdateCounter = 0; @@ -213,24 +190,9 @@ private void OnDisable() private void Update() { -#if UNITY_EDITOR - - UpdateChanged(); - -#endif - - if (_outlineLayers && (_changed || _outlineLayers.IsChanged)) - { - FillCommandBuffer(); - } - } - - private void LateUpdate() - { - // TODO: Find a way to do this once per OutlineLayerCollection instance. if (_outlineLayers) { - _outlineLayers.AcceptChanges(); + FillCommandBuffer(); } } @@ -245,15 +207,9 @@ private void OnDestroy() #if UNITY_EDITOR - private void OnValidate() - { - _changed = true; - } - private void Reset() { _outlineLayers = null; - _changed = true; } #endif @@ -274,8 +230,6 @@ private void FillCommandBuffer() } } - _changed = false; - #if UNITY_EDITOR _commandBufferUpdateCounter++; diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs index 6dc03b5..c5c3147 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs @@ -4,7 +4,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.ComponentModel; using System.Text; using UnityEngine; @@ -17,7 +16,7 @@ namespace UnityFx.Outline /// /// [Serializable] - public sealed partial class OutlineLayer : ICollection, IOutlineSettingsEx, IChangeTracking + public sealed partial class OutlineLayer : ICollection, IOutlineSettingsEx { #region data @@ -32,7 +31,6 @@ public sealed partial class OutlineLayer : ICollection, IOutlineSett private OutlineLayerCollection _parentCollection; private Dictionary _outlineObjects = new Dictionary(); - private bool _changed; #endregion @@ -66,11 +64,7 @@ public bool Enabled } set { - if (_enabled != value) - { - _enabled = value; - _changed = true; - } + _enabled = value; } } @@ -95,7 +89,6 @@ public int Priority } _zOrder = value; - _changed = true; } } } @@ -174,7 +167,6 @@ public void Add(GameObject go, int ignoreLayerMask) if (!_outlineObjects.ContainsKey(go)) { _outlineObjects.Add(go, new RendererCollection(go, ignoreLayerMask)); - _changed = true; } } @@ -217,13 +209,13 @@ public void Render(OutlineRenderer renderer, OutlineResources resources) { if (_enabled) { - _settings.SetResources(resources); + _settings.OutlineResources = resources; foreach (var kvp in _outlineObjects) { if (kvp.Key && kvp.Key.activeInHierarchy) { - renderer.Render(kvp.Value.GetList(), _settings.OutlineResources, _settings); + renderer.Render(kvp.Value.GetList(), resources, _settings); } } } @@ -255,15 +247,10 @@ internal OutlineLayerCollection ParentCollection internal void Reset() { - _settings.SetResources(null); + _settings.OutlineResources = null; _outlineObjects.Clear(); } - internal void UpdateChanged() - { - _settings.UpdateChanged(); - } - internal void SetCollection(OutlineLayerCollection collection) { if (_parentCollection == null || collection == null || _parentCollection == collection) @@ -382,10 +369,9 @@ public void Add(GameObject go) /// public bool Remove(GameObject go) { - if (go != null && _outlineObjects.Remove(go)) + if (!ReferenceEquals(go, null)) { - _changed = true; - return true; + return _outlineObjects.Remove(go); } return false; @@ -405,11 +391,7 @@ public bool Contains(GameObject go) /// public void Clear() { - if (_outlineObjects.Count > 0) - { - _outlineObjects.Clear(); - _changed = true; - } + _outlineObjects.Clear(); } /// @@ -435,26 +417,6 @@ IEnumerator IEnumerable.GetEnumerator() #endregion - #region IChangeTracking - - /// - public bool IsChanged - { - get - { - return _changed || _settings.IsChanged; - } - } - - /// - public void AcceptChanges() - { - _settings.AcceptChanges(); - _changed = false; - } - - #endregion - #region IEquatable /// diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs index 84895ed..d28f982 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs @@ -4,7 +4,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.ComponentModel; using UnityEngine; namespace UnityFx.Outline @@ -16,7 +15,7 @@ namespace UnityFx.Outline /// /// [CreateAssetMenu(fileName = "OutlineLayerCollection", menuName = "UnityFx/Outline/Outline Layer Collection")] - public sealed class OutlineLayerCollection : ScriptableObject, IList, IChangeTracking + public sealed class OutlineLayerCollection : ScriptableObject, IList { #region data @@ -34,7 +33,6 @@ public int Compare(OutlineLayer x, OutlineLayer y) private List _sortedLayers = new List(); private OutlineLayerComparer _sortComparer = new OutlineLayerComparer(); private bool _orderChanged = true; - private bool _changed = true; #endregion @@ -72,7 +70,6 @@ public void Render(OutlineRenderer renderer, OutlineResources resources) internal void SetOrderChanged() { _orderChanged = true; - _changed = true; } internal void Reset() @@ -83,14 +80,6 @@ internal void Reset() } } - internal void UpdateChanged() - { - foreach (var layer in _layers) - { - layer.UpdateChanged(); - } - } - #endregion #region ScriptableObject @@ -136,7 +125,6 @@ public OutlineLayer this[int layerIndex] _layers[layerIndex] = value; _orderChanged = true; - _changed = true; } } } @@ -167,7 +155,6 @@ public void Insert(int index, OutlineLayer layer) _layers.Insert(index, layer); _orderChanged = true; - _changed = true; } } @@ -180,7 +167,6 @@ public void RemoveAt(int index) _layers.RemoveAt(index); _orderChanged = true; - _changed = true; } } @@ -219,9 +205,7 @@ public void Add(OutlineLayer layer) layer.SetCollection(this); _layers.Add(layer); - _orderChanged = true; - _changed = true; } } @@ -233,7 +217,6 @@ public bool Remove(OutlineLayer layer) layer.SetCollection(null); _sortedLayers.Remove(layer); - _changed = true; return true; } @@ -253,7 +236,6 @@ public void Clear() _layers.Clear(); _sortedLayers.Clear(); - _changed = true; } } @@ -291,43 +273,6 @@ IEnumerator IEnumerable.GetEnumerator() #endregion - #region IChangeTracking - - /// - public bool IsChanged - { - get - { - if (_changed) - { - return true; - } - - foreach (var layer in _layers) - { - if (layer.IsChanged) - { - return true; - } - } - - return false; - } - } - - /// - public void AcceptChanges() - { - foreach (var layer in _layers) - { - layer.AcceptChanges(); - } - - _changed = false; - } - - #endregion - #region implementation private void UpdateSortedLayersIfNeeded() diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs index b9fdff7..2a66d69 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs @@ -2,13 +2,12 @@ // See the LICENSE.md file in the project root for more information. using System; -using System.ComponentModel; using UnityEngine; namespace UnityFx.Outline { [Serializable] - internal class OutlineSettingsInstance : IOutlineSettingsEx, IChangeTracking + internal class OutlineSettingsInstance : IOutlineSettingsEx { #region data @@ -29,7 +28,6 @@ internal class OutlineSettingsInstance : IOutlineSettingsEx, IChangeTracking #pragma warning restore 0649 private OutlineResources _resources; - private bool _changed = true; #endregion @@ -41,6 +39,10 @@ public OutlineResources OutlineResources { return _resources; } + set + { + _resources = value; + } } internal OutlineSettingsInstance() @@ -52,33 +54,6 @@ internal OutlineSettingsInstance(OutlineResources resources) _resources = resources; } - internal void SetResources(OutlineResources resources) - { - if (resources != _resources) - { - _resources = resources; - _changed = true; - } - } - - internal void UpdateChanged() - { - if (_outlineSettings != null) - { - if (_outlineColor != _outlineSettings.OutlineColor || - _outlineWidth != _outlineSettings.OutlineWidth || - _outlineIntensity != _outlineSettings.OutlineIntensity || - _outlineMode != _outlineSettings.OutlineRenderMode) - { - _outlineColor = _outlineSettings.OutlineColor; - _outlineWidth = _outlineSettings.OutlineWidth; - _outlineIntensity = _outlineSettings.OutlineIntensity; - _outlineMode = _outlineSettings.OutlineRenderMode; - _changed = true; - } - } - } - #endregion #region IOutlineSettingsEx @@ -91,19 +66,7 @@ public OutlineSettings OutlineSettings } set { - if (_outlineSettings != value) - { - _outlineSettings = value; - - if (_outlineSettings != null) - { - _outlineColor = _outlineSettings.OutlineColor; - _outlineWidth = _outlineSettings.OutlineWidth; - _outlineIntensity = _outlineSettings.OutlineIntensity; - _outlineMode = _outlineSettings.OutlineRenderMode; - _changed = true; - } - } + _outlineSettings = value; } } @@ -116,17 +79,16 @@ public Color OutlineColor { get { + if (!ReferenceEquals(_outlineSettings, null)) + { + return _outlineSettings.OutlineColor; + } + return _outlineColor; } set { - ThrowIfSettingsAssigned(); - - if (_outlineColor != value) - { - _outlineColor = value; - _changed = true; - } + _outlineColor = value; } } @@ -135,19 +97,16 @@ public int OutlineWidth { get { + if (!ReferenceEquals(_outlineSettings, null)) + { + return _outlineSettings.OutlineWidth; + } + return _outlineWidth; } set { - ThrowIfSettingsAssigned(); - - value = Mathf.Clamp(value, OutlineRenderer.MinWidth, OutlineRenderer.MaxWidth); - - if (_outlineWidth != value) - { - _outlineWidth = value; - _changed = true; - } + _outlineWidth = Mathf.Clamp(value, OutlineRenderer.MinWidth, OutlineRenderer.MaxWidth); } } @@ -156,19 +115,16 @@ public float OutlineIntensity { get { + if (!ReferenceEquals(_outlineSettings, null)) + { + return _outlineSettings.OutlineIntensity; + } + return _outlineIntensity; } set { - ThrowIfSettingsAssigned(); - - value = Mathf.Clamp(value, OutlineRenderer.MinIntensity, OutlineRenderer.MaxIntensity); - - if (_outlineIntensity != value) - { - _outlineIntensity = value; - _changed = true; - } + _outlineIntensity = Mathf.Clamp(value, OutlineRenderer.MinIntensity, OutlineRenderer.MaxIntensity); } } @@ -177,39 +133,19 @@ public OutlineRenderFlags OutlineRenderMode { get { - return _outlineMode; - } - set - { - ThrowIfSettingsAssigned(); - - if (_outlineMode != value) + if (!ReferenceEquals(_outlineSettings, null)) { - _outlineMode = value; - _changed = true; + return _outlineSettings.OutlineRenderMode; } - } - } - #endregion - - #region IChangeTracking - - /// - public bool IsChanged - { - get + return _outlineMode; + } + set { - return _changed; + _outlineMode = value; } } - /// - public void AcceptChanges() - { - _changed = false; - } - #endregion #region IEquatable @@ -222,15 +158,6 @@ public bool Equals(IOutlineSettings other) #endregion #region implementation - - private void ThrowIfSettingsAssigned() - { - if (_outlineSettings) - { - throw new InvalidOperationException("The outline parameters cannot be altered when OutlineSettings is set."); - } - } - #endregion } } diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs index 8e46e4f..fc19adb 100644 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs +++ b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs @@ -30,7 +30,6 @@ public void Dispose() [Test] public void DefaultStateIsValid() { - Assert.IsTrue(_layerCollection.IsChanged); Assert.IsFalse(_layerCollection.IsReadOnly); Assert.IsEmpty(_layerCollection); Assert.Zero(_layerCollection.Count); @@ -59,22 +58,6 @@ public void Add_ThrowsIfLayerBelongsToAnotherCollection() } } - [Test] - public void Add_DoesNotSetChangedOnError() - { - _layerCollection.AcceptChanges(); - - try - { - _layerCollection.Add(null); - } - catch - { - } - - Assert.IsFalse(_layerCollection.IsChanged); - } - [Test] public void Add_SetsCount() { @@ -83,15 +66,6 @@ public void Add_SetsCount() Assert.AreEqual(1, _layerCollection.Count); } - [Test] - public void Add_SetsChanged() - { - _layerCollection.AcceptChanges(); - _layerCollection.Add(new OutlineLayer()); - - Assert.IsTrue(_layerCollection.IsChanged); - } - [Test] public void Insert_ThrowsIfArgumentIsNull() { @@ -115,22 +89,6 @@ public void Insert_ThrowsIfLayerBelongsToAnotherCollection() } } - [Test] - public void Insert_DoesNotSetChangedOnError() - { - _layerCollection.AcceptChanges(); - - try - { - _layerCollection.Insert(0, null); - } - catch - { - } - - Assert.IsFalse(_layerCollection.IsChanged); - } - [Test] public void Insert_SetsCount() { @@ -139,51 +97,12 @@ public void Insert_SetsCount() Assert.AreEqual(1, _layerCollection.Count); } - [Test] - public void Insert_SetsChanged() - { - _layerCollection.AcceptChanges(); - _layerCollection.Insert(0, new OutlineLayer()); - - Assert.IsTrue(_layerCollection.IsChanged); - } - [Test] public void Remove_DoesNotThrowOnNullArgument() { Assert.DoesNotThrow(() => _layerCollection.Remove(null)); } - [Test] - public void Remove_DoesNotSetChangedOnError() - { - _layerCollection.AcceptChanges(); - _layerCollection.Remove(null); - - Assert.IsFalse(_layerCollection.IsChanged); - } - - [Test] - public void Remove_DoesNotSetChangedIfNotfound() - { - _layerCollection.AcceptChanges(); - _layerCollection.Remove(new OutlineLayer()); - - Assert.IsFalse(_layerCollection.IsChanged); - } - - [Test] - public void Remove_SetsChanged() - { - var layer = new OutlineLayer(); - - _layerCollection.Add(layer); - _layerCollection.AcceptChanges(); - _layerCollection.Remove(layer); - - Assert.IsTrue(_layerCollection.IsChanged); - } - [Test] public void Remove_SetsCount() { @@ -204,47 +123,12 @@ public void Clear_ResetsCount() Assert.Zero(_layerCollection.Count); } - [Test] - public void Clear_SetsChanged() - { - _layerCollection.Add(new OutlineLayer()); - _layerCollection.AcceptChanges(); - _layerCollection.Clear(); - - Assert.IsTrue(_layerCollection.IsChanged); - } - - [Test] - public void Clear_DoesNotSetChangedIfEmpty() - { - _layerCollection.AcceptChanges(); - _layerCollection.Clear(); - - Assert.IsFalse(_layerCollection.IsChanged); - } - [Test] public void Contains_DoesNotThrowIfArgumentIsNull() { _layerCollection.Contains(null); } - [Test] - public void Contains_DoesNotSetChangedOnError() - { - _layerCollection.AcceptChanges(); - - try - { - _layerCollection.Contains(null); - } - catch - { - } - - Assert.IsFalse(_layerCollection.IsChanged); - } - [Test] public void Contains_SearchesArgument() { @@ -257,45 +141,6 @@ public void Contains_SearchesArgument() Assert.IsTrue(_layerCollection.Contains(layer)); } - [Test] - public void Contains_DoesNotSetChanged() - { - var layer = new OutlineLayer(); - - _layerCollection.AcceptChanges(); - _layerCollection.Contains(layer); - - Assert.IsFalse(_layerCollection.IsChanged); - - _layerCollection.Add(layer); - _layerCollection.AcceptChanges(); - _layerCollection.Contains(layer); - - Assert.IsFalse(_layerCollection.IsChanged); - } - - [Test] - public void IsChanged_TracksLayerChanges() - { - var layer = new OutlineLayer(); - - _layerCollection.Add(layer); - _layerCollection.AcceptChanges(); - - layer.OutlineWidth = 17; - - Assert.IsTrue(_layerCollection.IsChanged); - } - - [Test] - public void AcceptChanges_ResetsChanged() - { - _layerCollection.Add(new OutlineLayer()); - _layerCollection.AcceptChanges(); - - Assert.IsFalse(_layerCollection.IsChanged); - } - [Test] public void SortedLayers_IsSortedByPriority() { diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerTests.cs b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerTests.cs index 58c202e..df639c6 100644 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerTests.cs +++ b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerTests.cs @@ -30,7 +30,6 @@ public void Dispose() [Test] public void DefaultStateIsValid() { - Assert.IsTrue(_layer.IsChanged); Assert.IsFalse(_layer.IsReadOnly); Assert.IsEmpty(_layer); Assert.Zero(_layer.Count); @@ -44,22 +43,6 @@ public void Add_ThrowsIfArgumentIsNull() Assert.Throws(() => _layer.Add(null)); } - [Test] - public void Add_DoesNotSetChangedOnError() - { - _layer.AcceptChanges(); - - try - { - _layer.Add(null); - } - catch - { - } - - Assert.IsFalse(_layer.IsChanged); - } - [Test] public void Add_SetsCount() { @@ -68,15 +51,6 @@ public void Add_SetsCount() Assert.AreEqual(1, _layer.Count); } - [Test] - public void Add_SetsChanged() - { - _layer.AcceptChanges(); - _layer.Add(new GameObject()); - - Assert.IsTrue(_layer.IsChanged); - } - [Test] public void Add_FiltersRenderesByLayer() { @@ -102,36 +76,6 @@ public void Remove_DoesNotThrowOnNullArgument() Assert.DoesNotThrow(() => _layer.Remove(null)); } - [Test] - public void Remove_DoesNotSetChangedOnError() - { - _layer.AcceptChanges(); - _layer.Remove(null); - - Assert.IsFalse(_layer.IsChanged); - } - - [Test] - public void Remove_DoesNotSetChangedIfNotfound() - { - _layer.AcceptChanges(); - _layer.Remove(new GameObject()); - - Assert.IsFalse(_layer.IsChanged); - } - - [Test] - public void Remove_SetsChanged() - { - var go = new GameObject(); - - _layer.Add(go); - _layer.AcceptChanges(); - _layer.Remove(go); - - Assert.IsTrue(_layer.IsChanged); - } - [Test] public void Remove_SetsCount() { @@ -152,47 +96,12 @@ public void Clear_ResetsCount() Assert.Zero(_layer.Count); } - [Test] - public void Clear_SetsChanged() - { - _layer.Add(new GameObject()); - _layer.AcceptChanges(); - _layer.Clear(); - - Assert.IsTrue(_layer.IsChanged); - } - - [Test] - public void Clear_DoesNotSetChangedIfEmpty() - { - _layer.AcceptChanges(); - _layer.Clear(); - - Assert.IsFalse(_layer.IsChanged); - } - [Test] public void Contains_DoesNotThrowIfArgumentIsNull() { _layer.Contains(null); } - [Test] - public void Contains_DoesNotSetChangedOnError() - { - _layer.AcceptChanges(); - - try - { - _layer.Contains(null); - } - catch - { - } - - Assert.IsFalse(_layer.IsChanged); - } - [Test] public void Contains_SearchesArgument() { @@ -204,30 +113,5 @@ public void Contains_SearchesArgument() Assert.IsTrue(_layer.Contains(go)); } - - [Test] - public void Contains_DoesNotSetChanged() - { - var go = new GameObject(); - - _layer.AcceptChanges(); - _layer.Contains(go); - - Assert.IsFalse(_layer.IsChanged); - - _layer.Add(go); - _layer.AcceptChanges(); - _layer.Contains(go); - - Assert.IsFalse(_layer.IsChanged); - } - - [Test] - public void AcceptChanges_ResetsChanged() - { - _layer.AcceptChanges(); - - Assert.IsFalse(_layer.IsChanged); - } } } From 56f4f1a2fe756f3f7d9de03cdb0decac6816fa1e Mon Sep 17 00:00:00 2001 From: Arvtesh <22732458+Arvtesh@users.noreply.github.com> Date: Fri, 27 Mar 2020 22:27:02 +0200 Subject: [PATCH 13/39] CHANGELOG update --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74ca888..3b7334f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,14 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/); this proj Added depth testing support and performance optimizations. ### Added -- Added support for depth testing when rendering outlines. When enabled, outlines are only rendered around the visible object parts. +- Added support for depth testing when rendering outlines. When enabled, outlines are only rendered around the visible object parts ([#1](https://github.com/Arvtesh/UnityFx.Outline/issues/1)). ### Fixed - Get rid of GC allocatinos during command buffer updates. +- Fixed compiler warning in post-processing compatibility package (0649). + +### Removed +- Removed change tracking support in package entities ([#2](https://github.com/Arvtesh/UnityFx.Outline/issues/2)). ## [0.7.1] - 2020.01.28 From 0244743a5c066a1fbfb63d7f7c2904b712add053 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Mon, 30 Mar 2020 19:27:53 +0300 Subject: [PATCH 14/39] Get rid of per-renderer behavior for Outlinebehaviour + force depthTextureMode for camera --- .../Editor/Scripts/OutlineBehaviourEditor.cs | 12 --- .../Scripts/OutlineBehaviour.Renderers.cs | 81 +------------------ .../Runtime/Scripts/OutlineBehaviour.cs | 76 ++++++----------- .../Runtime/Scripts/OutlineEffect.cs | 2 + 4 files changed, 31 insertions(+), 140 deletions(-) diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs b/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs index 459340c..492498a 100644 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs +++ b/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs @@ -79,18 +79,6 @@ public override void OnInspectorGUI() EditorGUI.indentLevel -= 1; EditorGUI.EndDisabledGroup(); } - - // 4) Debug info. - _debugOpened = EditorGUILayout.Foldout(_debugOpened, "Debug", true); - - if (_debugOpened) - { - EditorGUI.BeginDisabledGroup(true); - EditorGUI.indentLevel += 1; - EditorGUILayout.IntField("Command buffer updates", _effect.NumberOfCommandBufferUpdates); - EditorGUI.indentLevel -= 1; - EditorGUI.EndDisabledGroup(); - } } } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs index 8b0f627..a6bec9c 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs @@ -15,32 +15,11 @@ partial class OutlineBehaviour #region implementation - [ExecuteInEditMode] - [DisallowMultipleComponent] - private class OutlineRendererHelper : MonoBehaviour - { - private OutlineBehaviour _parent; - - public void SetParent(OutlineBehaviour parent) - { - _parent = parent; - } - - private void OnWillRenderObject() - { - if (isActiveAndEnabled && _parent) - { - _parent.OnWillRenderObject(); - } - } - } - private sealed class RendererCollection : ICollection { #region data private readonly List _renderers = new List(); - private readonly OutlineBehaviour _parent; private readonly GameObject _go; #endregion @@ -51,7 +30,6 @@ internal RendererCollection(OutlineBehaviour parent) { Debug.Assert(parent); - _parent = parent; _go = parent.gameObject; } @@ -60,20 +38,9 @@ internal List GetList() return _renderers; } - public void Reset() + internal void Reset(bool includeInactive) { - foreach (var r in _renderers) - { - Release(r); - } - - _renderers.Clear(); - _parent.GetComponentsInChildren(true, _renderers); - - foreach (var r in _renderers) - { - Init(r); - } + _go.GetComponentsInChildren(includeInactive, _renderers); } #endregion @@ -99,29 +66,17 @@ public bool IsReadOnly public void Add(Renderer renderer) { Validate(renderer); - Init(renderer); _renderers.Add(renderer); } public bool Remove(Renderer renderer) { - if (_renderers.Remove(renderer)) - { - Release(renderer); - return true; - } - - return false; + return _renderers.Remove(renderer); } public void Clear() { - foreach (var r in _renderers) - { - Release(r); - } - _renderers.Clear(); } @@ -166,34 +121,6 @@ private void Validate(Renderer renderer) } } - private void Init(Renderer r) - { - if (r && r.gameObject != _go) - { - var c = r.GetComponent(); - - if (c == null) - { - c = r.gameObject.AddComponent(); - } - - c.SetParent(_parent); - } - } - - private void Release(Renderer r) - { - if (r) - { - var c = r.GetComponent(); - - if (c) - { - DestroyImmediate(c); - } - } - } - #endregion } @@ -202,7 +129,7 @@ private void CreateRenderersIfNeeded() if (_renderers == null) { _renderers = new RendererCollection(this); - _renderers.Reset(); + _renderers.Reset(true); } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs index 76c1bf3..6e9c955 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs @@ -25,6 +25,8 @@ public sealed partial class OutlineBehaviour : MonoBehaviour, IOutlineSettingsEx private OutlineResources _outlineResources; [SerializeField, HideInInspector] private OutlineSettingsInstance _outlineSettings; + [SerializeField] + private bool _updateRenderers; #pragma warning restore 0649 @@ -34,31 +36,10 @@ public sealed partial class OutlineBehaviour : MonoBehaviour, IOutlineSettingsEx private Dictionary _cameraMap = new Dictionary(); private float _cameraMapUpdateTimer; -#if UNITY_EDITOR - - private int _commandBufferUpdateCounter; - -#endif - #endregion #region interface -#if UNITY_EDITOR - - /// - /// Gets number of the command buffer updates since its creation. Only available in editor. - /// - public int NumberOfCommandBufferUpdates - { - get - { - return _commandBufferUpdateCounter; - } - } - -#endif - /// /// Gets or sets resources used by the effect implementation. /// @@ -132,10 +113,13 @@ private void OnDestroy() private void OnEnable() { CreateCommandBufferIfNeeded(); + Camera.onPreRender += OnCameraPreRender; } private void OnDisable() { + Camera.onPreRender -= OnCameraPreRender; + foreach (var kvp in _cameraMap) { if (kvp.Key) @@ -165,34 +149,16 @@ private void Update() if (_outlineResources != null && _renderers != null) { - _commandBuffer.Clear(); - - using (var renderer = new OutlineRenderer(_commandBuffer, BuiltinRenderTextureType.CameraTarget)) + if (_updateRenderers) { - renderer.Render(_renderers.GetList(), _outlineSettings.OutlineResources, _outlineSettings); + _renderers.Reset(false); } -#if UNITY_EDITOR - - _commandBufferUpdateCounter++; - -#endif - } - } - - private void OnWillRenderObject() - { - if (gameObject.activeInHierarchy && enabled) - { - var camera = Camera.current; + _commandBuffer.Clear(); - if (camera) + using (var renderer = new OutlineRenderer(_commandBuffer, BuiltinRenderTextureType.CameraTarget)) { - if (!_cameraMap.ContainsKey(camera)) - { - camera.AddCommandBuffer(OutlineRenderer.RenderEvent, _commandBuffer); - _cameraMap.Add(camera, _commandBuffer); - } + renderer.Render(_renderers.GetList(), _outlineSettings.OutlineResources, _outlineSettings); } } } @@ -217,7 +183,7 @@ private void Reset() if (_renderers != null) { - _renderers.Reset(); + _renderers.Reset(true); } } @@ -330,6 +296,20 @@ public bool Equals(IOutlineSettings other) #region implementation + private void OnCameraPreRender(Camera camera) + { + if (camera) + { + camera.depthTextureMode |= DepthTextureMode.Depth; + + if (!_cameraMap.ContainsKey(camera)) + { + camera.AddCommandBuffer(OutlineRenderer.RenderEvent, _commandBuffer); + _cameraMap.Add(camera, _commandBuffer); + } + } + } + private void RemoveDestroyedCameras() { List camerasToRemove = null; @@ -364,12 +344,6 @@ private void CreateCommandBufferIfNeeded() { _commandBuffer = new CommandBuffer(); _commandBuffer.name = string.Format("{0} - {1}", GetType().Name, name); - -#if UNITY_EDITOR - - _commandBufferUpdateCounter = 0; - -#endif } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs index d08cedc..b462434 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs @@ -162,6 +162,8 @@ private void OnEnable() name = string.Format("{0} - {1}", GetType().Name, name) }; + camera.depthTextureMode |= DepthTextureMode.Depth; + #if UNITY_EDITOR _commandBufferUpdateCounter = 0; From b79a83dcfc3d5a30a79d19bc4804ba52dea6d159 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Mon, 30 Mar 2020 19:37:17 +0300 Subject: [PATCH 15/39] Added a few editor tooltips --- Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs | 4 ++-- Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs index 6e9c955..68ca543 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs @@ -21,11 +21,11 @@ public sealed partial class OutlineBehaviour : MonoBehaviour, IOutlineSettingsEx #pragma warning disable 0649 - [SerializeField] + [SerializeField, Tooltip("Sets outline resources to use. Do not change the defaults unless you know what you're doing.")] private OutlineResources _outlineResources; [SerializeField, HideInInspector] private OutlineSettingsInstance _outlineSettings; - [SerializeField] + [SerializeField, Tooltip("If set, list of object renderers is updated on each frame. Enable if the object has child renderers which are enabled/disabled frequently.")] private bool _updateRenderers; #pragma warning restore 0649 diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs index b462434..d7ae252 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs @@ -21,9 +21,9 @@ public sealed partial class OutlineEffect : MonoBehaviour { #region data - [SerializeField] + [SerializeField, Tooltip("Sets outline resources to use. Do not change the defaults unless you know what you're doing.")] private OutlineResources _outlineResources; - [SerializeField] + [SerializeField, Tooltip("Collection of outline layers to use. This can be used to share outline settings between multiple cameras.")] private OutlineLayerCollection _outlineLayers; [SerializeField, HideInInspector] private CameraEvent _cameraEvent = OutlineRenderer.RenderEvent; From 821a7e58464825a4873e7f302b3f378b2a4bba8f Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Mon, 30 Mar 2020 19:40:00 +0300 Subject: [PATCH 16/39] Removed command buffer update counters --- .../Editor/Scripts/OutlineEffectEditor.cs | 11 ------ .../Runtime/Scripts/OutlineEffect.cs | 34 ------------------- 2 files changed, 45 deletions(-) diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs b/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs index bd8c508..fd4c904 100644 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs +++ b/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs @@ -54,17 +54,6 @@ public override void OnInspectorGUI() OutlineEditorUtility.RenderPreview(_effect.OutlineLayers, true); } } - - _debugOpened = EditorGUILayout.Foldout(_debugOpened, "Debug", true); - - if (_debugOpened) - { - EditorGUI.BeginDisabledGroup(true); - EditorGUI.indentLevel += 1; - EditorGUILayout.IntField("Command buffer updates", _effect.NumberOfCommandBufferUpdates); - EditorGUI.indentLevel -= 1; - EditorGUI.EndDisabledGroup(); - } } } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs index d7ae252..900d92a 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs @@ -30,31 +30,10 @@ public sealed partial class OutlineEffect : MonoBehaviour private CommandBuffer _commandBuffer; -#if UNITY_EDITOR - - private int _commandBufferUpdateCounter; - -#endif - #endregion #region interface -#if UNITY_EDITOR - - /// - /// Gets number of the command buffer updates since its creation. Only available in editor. - /// - public int NumberOfCommandBufferUpdates - { - get - { - return _commandBufferUpdateCounter; - } - } - -#endif - /// /// Gets or sets resources used by the effect implementation. /// @@ -163,13 +142,6 @@ private void OnEnable() }; camera.depthTextureMode |= DepthTextureMode.Depth; - -#if UNITY_EDITOR - - _commandBufferUpdateCounter = 0; - -#endif - camera.AddCommandBuffer(_cameraEvent, _commandBuffer); } } @@ -231,12 +203,6 @@ private void FillCommandBuffer() _outlineLayers.Render(renderer, _outlineResources); } } - -#if UNITY_EDITOR - - _commandBufferUpdateCounter++; - -#endif } private void CreateLayersIfNeeded() From 9a9f57b9e6b2fb00ba7c3d991342cf1fd2edd6f2 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Mon, 30 Mar 2020 20:08:47 +0300 Subject: [PATCH 17/39] Do not force DepthTextureMode for camera if it is not required for OutlineBehaviour --- .../Runtime/Scripts/OutlineBehaviour.cs | 5 ++++- .../Runtime/Scripts/OutlineSettingsInstance.cs | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs index 68ca543..fa115a2 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs @@ -300,7 +300,10 @@ private void OnCameraPreRender(Camera camera) { if (camera) { - camera.depthTextureMode |= DepthTextureMode.Depth; + if (_outlineSettings.RequiresCameraDepth) + { + camera.depthTextureMode |= DepthTextureMode.Depth; + } if (!_cameraMap.ContainsKey(camera)) { diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs index 2a66d69..a39ef7e 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs @@ -45,6 +45,21 @@ public OutlineResources OutlineResources } } + public bool RequiresCameraDepth + { + get + { + var renderMode = _outlineMode; + + if (!ReferenceEquals(_outlineSettings, null)) + { + renderMode = _outlineSettings.OutlineRenderMode; + } + + return (renderMode & OutlineRenderFlags.EnableDepthTesting) != 0; + } + } + internal OutlineSettingsInstance() { } From 84c0c1db74fe5306626dcc70b71ab25dd5a1b1d9 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Mon, 30 Mar 2020 20:11:48 +0300 Subject: [PATCH 18/39] Assembly properties updated --- Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs b/Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs index 4e069a1..d7b9f2c 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs @@ -17,7 +17,7 @@ [assembly: AssemblyConfiguration("Release")] #endif [assembly: AssemblyCompany("")] -[assembly: AssemblyCopyright("Copyright © Alexander Bogarsukov 2019")] +[assembly: AssemblyCopyright("Copyright © Alexander Bogarsukov 2019-2020")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible @@ -25,8 +25,5 @@ // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] -// The following GUID is for the ID of the typelib if this project is exposed to COM. -[assembly: Guid("1ace8625-97c5-4d37-a649-03975d187542")] - // Make internals visible to the editor assembly. [assembly: InternalsVisibleTo("UnityFx.Outline.Editor")] From 48a562278da3dae1439c68070299a83e02d1e4f0 Mon Sep 17 00:00:00 2001 From: Arvtesh <22732458+Arvtesh@users.noreply.github.com> Date: Mon, 30 Mar 2020 22:16:43 +0300 Subject: [PATCH 19/39] Added OutlineRendererCollection, removed specific collections for OutlineBehaviour and OutlineLayer --- .../Scripts/OutlineBehaviour.Renderers.cs | 138 --------------- .../Runtime/Scripts/OutlineBehaviour.cs | 13 +- .../Runtime/Scripts/OutlineEffect.cs | 2 +- .../Runtime/Scripts/OutlineLayer.Renderers.cs | 160 ------------------ .../Scripts/OutlineLayer.Renderers.cs.meta | 11 -- .../Runtime/Scripts/OutlineLayer.cs | 8 +- .../Scripts/OutlineRendererCollection.cs | 146 ++++++++++++++++ ...meta => OutlineRendererCollection.cs.meta} | 2 +- 8 files changed, 164 insertions(+), 316 deletions(-) delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.Renderers.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.Renderers.cs.meta create mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs rename Packages/UnityFx.Outline/Runtime/Scripts/{OutlineBehaviour.Renderers.cs.meta => OutlineRendererCollection.cs.meta} (83%) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs deleted file mode 100644 index a6bec9c..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace UnityFx.Outline -{ - partial class OutlineBehaviour - { - #region interface - #endregion - - #region implementation - - private sealed class RendererCollection : ICollection - { - #region data - - private readonly List _renderers = new List(); - private readonly GameObject _go; - - #endregion - - #region interface - - internal RendererCollection(OutlineBehaviour parent) - { - Debug.Assert(parent); - - _go = parent.gameObject; - } - - internal List GetList() - { - return _renderers; - } - - internal void Reset(bool includeInactive) - { - _go.GetComponentsInChildren(includeInactive, _renderers); - } - - #endregion - - #region ICollection - - public int Count - { - get - { - return _renderers.Count; - } - } - - public bool IsReadOnly - { - get - { - return false; - } - } - - public void Add(Renderer renderer) - { - Validate(renderer); - - _renderers.Add(renderer); - } - - public bool Remove(Renderer renderer) - { - return _renderers.Remove(renderer); - } - - public void Clear() - { - _renderers.Clear(); - } - - public bool Contains(Renderer renderer) - { - return _renderers.Contains(renderer); - } - - public void CopyTo(Renderer[] array, int arrayIndex) - { - _renderers.CopyTo(array, arrayIndex); - } - - #endregion - - #region IEnumerable - - public IEnumerator GetEnumerator() - { - return _renderers.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return _renderers.GetEnumerator(); - } - - #endregion - - #region implementation - - private void Validate(Renderer renderer) - { - if (renderer == null) - { - throw new ArgumentNullException("renderer"); - } - - if (!renderer.transform.IsChildOf(_go.transform)) - { - throw new ArgumentException(string.Format("Only children of the {0} are allowed.", _go.name), "renderer"); - } - } - - #endregion - } - - private void CreateRenderersIfNeeded() - { - if (_renderers == null) - { - _renderers = new RendererCollection(this); - _renderers.Reset(true); - } - } - - #endregion - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs index fa115a2..325b329 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs @@ -15,7 +15,7 @@ namespace UnityFx.Outline /// [ExecuteInEditMode] [DisallowMultipleComponent] - public sealed partial class OutlineBehaviour : MonoBehaviour, IOutlineSettingsEx + public sealed class OutlineBehaviour : MonoBehaviour, IOutlineSettingsEx { #region data @@ -30,7 +30,7 @@ public sealed partial class OutlineBehaviour : MonoBehaviour, IOutlineSettingsEx #pragma warning restore 0649 - private RendererCollection _renderers; + private OutlineRendererCollection _renderers; private CommandBuffer _commandBuffer; private Dictionary _cameraMap = new Dictionary(); @@ -358,6 +358,15 @@ private void CreateSettingsIfNeeded() } } + private void CreateRenderersIfNeeded() + { + if (_renderers == null) + { + _renderers = new OutlineRendererCollection(gameObject); + _renderers.Reset(true); + } + } + #endregion } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs index 900d92a..8945e5d 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs @@ -14,7 +14,7 @@ namespace UnityFx.Outline /// /// /// - /// + /// [DisallowMultipleComponent] [RequireComponent(typeof(Camera))] public sealed partial class OutlineEffect : MonoBehaviour diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.Renderers.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.Renderers.cs deleted file mode 100644 index bcc32d9..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.Renderers.cs +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; -using UnityEngine; - -namespace UnityFx.Outline -{ - partial class OutlineLayer - { - #region interface - #endregion - - #region implementation - - private sealed class RendererCollection : ICollection - { - #region data - - private readonly List _renderers = new List(); - private readonly GameObject _go; - - #endregion - - #region interface - - internal RendererCollection(GameObject parent) - { - Debug.Assert(parent); - _go = parent; - } - - internal RendererCollection(GameObject parent, int ignoreMask) - { - Debug.Assert(parent); - - _go = parent; - Reset(ignoreMask); - } - - internal List GetList() - { - return _renderers; - } - - public void Reset(int ignoreLayerMask) - { - _renderers.Clear(); - - var renderers = _go.GetComponentsInChildren(); - - if (renderers != null) - { - if (ignoreLayerMask != 0) - { - foreach (var renderer in renderers) - { - if (((1 << renderer.gameObject.layer) & ignoreLayerMask) == 0) - { - _renderers.Add(renderer); - } - } - } - else - { - foreach (var renderer in renderers) - { - _renderers.Add(renderer); - } - } - } - } - - #endregion - - #region ICollection - - public int Count - { - get - { - return _renderers.Count; - } - } - - public bool IsReadOnly - { - get - { - return false; - } - } - - public void Add(Renderer renderer) - { - Validate(renderer); - - _renderers.Add(renderer); - } - - public bool Remove(Renderer renderer) - { - return _renderers.Remove(renderer); - } - - public void Clear() - { - _renderers.Clear(); - } - - public bool Contains(Renderer renderer) - { - return _renderers.Contains(renderer); - } - - public void CopyTo(Renderer[] array, int arrayIndex) - { - _renderers.CopyTo(array, arrayIndex); - } - - #endregion - - #region IEnumerable - - public IEnumerator GetEnumerator() - { - return _renderers.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return _renderers.GetEnumerator(); - } - - #endregion - - #region implementation - - private void Validate(Renderer renderer) - { - if (renderer == null) - { - throw new ArgumentNullException("renderer"); - } - - if (!renderer.transform.IsChildOf(_go.transform)) - { - throw new ArgumentException(string.Format("Only children of the {0} are allowed.", _go.name), "renderer"); - } - } - - #endregion - } - - #endregion - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.Renderers.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.Renderers.cs.meta deleted file mode 100644 index a2ecbf0..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.Renderers.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f98c44e515873c54180f1d3b1037f999 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs index c5c3147..8217cab 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs @@ -30,7 +30,7 @@ public sealed partial class OutlineLayer : ICollection, IOutlineSett private bool _enabled = true; private OutlineLayerCollection _parentCollection; - private Dictionary _outlineObjects = new Dictionary(); + private Dictionary _outlineObjects = new Dictionary(); #endregion @@ -166,7 +166,9 @@ public void Add(GameObject go, int ignoreLayerMask) if (!_outlineObjects.ContainsKey(go)) { - _outlineObjects.Add(go, new RendererCollection(go, ignoreLayerMask)); + var renderers = new OutlineRendererCollection(go); + renderers.Reset(false, ignoreLayerMask); + _outlineObjects.Add(go, renderers); } } @@ -190,7 +192,7 @@ public bool TryGetRenderers(GameObject go, out ICollection renderers) throw new ArgumentNullException("go"); } - RendererCollection result; + OutlineRendererCollection result; if (_outlineObjects.TryGetValue(go, out result)) { diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs new file mode 100644 index 0000000..730e6dd --- /dev/null +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs @@ -0,0 +1,146 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace UnityFx.Outline +{ + internal class OutlineRendererCollection : ICollection + { + #region data + + private readonly List _renderers = new List(); + private readonly GameObject _go; + + #endregion + + #region interface + + internal OutlineRendererCollection(GameObject go) + { + Debug.Assert(go); + _go = go; + } + + internal List GetList() + { + return _renderers; + } + + internal void Reset(bool includeInactive) + { + _go.GetComponentsInChildren(includeInactive, _renderers); + } + + internal void Reset(bool includeInactive, int ignoreLayerMask) + { + _renderers.Clear(); + + var renderers = _go.GetComponentsInChildren(includeInactive); + + if (renderers != null) + { + if (ignoreLayerMask != 0) + { + foreach (var renderer in renderers) + { + if (((1 << renderer.gameObject.layer) & ignoreLayerMask) == 0) + { + _renderers.Add(renderer); + } + } + } + else + { + foreach (var renderer in renderers) + { + _renderers.Add(renderer); + } + } + } + } + + #endregion + + #region ICollection + + public int Count + { + get + { + return _renderers.Count; + } + } + + public bool IsReadOnly + { + get + { + return false; + } + } + + public void Add(Renderer renderer) + { + Validate(renderer); + + _renderers.Add(renderer); + } + + public bool Remove(Renderer renderer) + { + return _renderers.Remove(renderer); + } + + public void Clear() + { + _renderers.Clear(); + } + + public bool Contains(Renderer renderer) + { + return _renderers.Contains(renderer); + } + + public void CopyTo(Renderer[] array, int arrayIndex) + { + _renderers.CopyTo(array, arrayIndex); + } + + #endregion + + #region IEnumerable + + public IEnumerator GetEnumerator() + { + return _renderers.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _renderers.GetEnumerator(); + } + + #endregion + + #region implementation + + private void Validate(Renderer renderer) + { + if (renderer == null) + { + throw new ArgumentNullException("renderer"); + } + + if (!renderer.transform.IsChildOf(_go.transform)) + { + throw new ArgumentException(string.Format("Only children of the {0} are allowed.", _go.name), "renderer"); + } + } + + #endregion + } +} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs.meta similarity index 83% rename from Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs.meta rename to Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs.meta index 02f6567..f582b73 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.Renderers.cs.meta +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e24c24bdabda57c45a4a803464696afc +guid: 89621a3cc73c4e6498a00b2d180ed462 MonoImporter: externalObjects: {} serializedVersion: 2 From 6e5c144c075229dd1f317c54a69c95b1cda71078 Mon Sep 17 00:00:00 2001 From: Arvtesh <22732458+Arvtesh@users.noreply.github.com> Date: Mon, 30 Mar 2020 22:53:50 +0300 Subject: [PATCH 20/39] Added UnityFx.Outline.HDRP package --- Packages/UnityFx.Outline.HDRP/CHANGELOG.md | 9 +++ .../UnityFx.Outline.HDRP/CHANGELOG.md.meta | 7 +++ Packages/UnityFx.Outline.HDRP/README.md | 11 ++++ Packages/UnityFx.Outline.HDRP/README.md.meta | 7 +++ Packages/UnityFx.Outline.HDRP/Runtime.meta | 8 +++ .../UnityFx.Outline.HDRP/Runtime/Scripts.meta | 8 +++ .../Runtime/Scripts/Outline.cs | 55 +++++++++++++++++++ .../Runtime/Scripts/Outline.cs.meta | 11 ++++ .../Runtime/UnityFx.Outline.HDRP.asmdef | 14 +++++ .../Runtime/UnityFx.Outline.HDRP.asmdef.meta | 7 +++ Packages/UnityFx.Outline.HDRP/package.json | 33 +++++++++++ .../UnityFx.Outline.HDRP/package.json.meta | 7 +++ .../package.json | 4 +- 13 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 Packages/UnityFx.Outline.HDRP/CHANGELOG.md create mode 100644 Packages/UnityFx.Outline.HDRP/CHANGELOG.md.meta create mode 100644 Packages/UnityFx.Outline.HDRP/README.md create mode 100644 Packages/UnityFx.Outline.HDRP/README.md.meta create mode 100644 Packages/UnityFx.Outline.HDRP/Runtime.meta create mode 100644 Packages/UnityFx.Outline.HDRP/Runtime/Scripts.meta create mode 100644 Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs create mode 100644 Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta create mode 100644 Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef create mode 100644 Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef.meta create mode 100644 Packages/UnityFx.Outline.HDRP/package.json create mode 100644 Packages/UnityFx.Outline.HDRP/package.json.meta diff --git a/Packages/UnityFx.Outline.HDRP/CHANGELOG.md b/Packages/UnityFx.Outline.HDRP/CHANGELOG.md new file mode 100644 index 0000000..1cf7420 --- /dev/null +++ b/Packages/UnityFx.Outline.HDRP/CHANGELOG.md @@ -0,0 +1,9 @@ +# UnityFx.Outline.HDRP changelog +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.1.0] - unreleased + +### Added +- Initial release. diff --git a/Packages/UnityFx.Outline.HDRP/CHANGELOG.md.meta b/Packages/UnityFx.Outline.HDRP/CHANGELOG.md.meta new file mode 100644 index 0000000..f3ea157 --- /dev/null +++ b/Packages/UnityFx.Outline.HDRP/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d2731cfdae865ee439fd0fef782fa994 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/UnityFx.Outline.HDRP/README.md b/Packages/UnityFx.Outline.HDRP/README.md new file mode 100644 index 0000000..7149507 --- /dev/null +++ b/Packages/UnityFx.Outline.HDRP/README.md @@ -0,0 +1,11 @@ +# UnityFx.Outline.HDRP + +## SUMMARY +Screen-space outline effects for HDRP. + +## USEFUL LINKS +* [Github project](https://github.com/Arvtesh/UnityFx.Outline) +* [npm package](https://www.npmjs.com/package/com.unityfx.outline.hdrp) +* [Documentation](https://github.com/Arvtesh/UnityFx.Outline/blob/master/README.md) +* [License](https://github.com/Arvtesh/UnityFx.Outline/blob/master/LICENSE.md) +* [Support](mailto:arvtesh@gmail.com) diff --git a/Packages/UnityFx.Outline.HDRP/README.md.meta b/Packages/UnityFx.Outline.HDRP/README.md.meta new file mode 100644 index 0000000..39c522c --- /dev/null +++ b/Packages/UnityFx.Outline.HDRP/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3db1fff9dd9ae804888eebc4382e1fb8 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/UnityFx.Outline.HDRP/Runtime.meta b/Packages/UnityFx.Outline.HDRP/Runtime.meta new file mode 100644 index 0000000..5ef6e3e --- /dev/null +++ b/Packages/UnityFx.Outline.HDRP/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 58d8c6c8330ffc042ade41ba15f8da23 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/Scripts.meta b/Packages/UnityFx.Outline.HDRP/Runtime/Scripts.meta new file mode 100644 index 0000000..100ae09 --- /dev/null +++ b/Packages/UnityFx.Outline.HDRP/Runtime/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 85518f862b075044bbd76d57354f8f3e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs b/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs new file mode 100644 index 0000000..9e8af01 --- /dev/null +++ b/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs @@ -0,0 +1,55 @@ +// 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; +using UnityEngine.Rendering; +using UnityEngine.Rendering.HighDefinition; + +namespace UnityFx.Outline.HDRP +{ + [Serializable] + [VolumeComponentMenu("Post-processing/UnityFx/Outline")] + public sealed class Outline : CustomPostProcessVolumeComponent, IPostProcessComponent + { + #region data + #endregion + + #region interface + #endregion + + #region CustomPostProcessVolumeComponent + + public override CustomPostProcessInjectionPoint injectionPoint + { + get + { + return CustomPostProcessInjectionPoint.AfterPostProcess; + } + } + + public override void Setup() + { + } + + public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination) + { + } + + public override void Cleanup() + { + } + + #endregion + + #region IPostProcessComponent + + public bool IsActive() + { + // TODO + return true; + } + + #endregion + } +} diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta b/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta new file mode 100644 index 0000000..d40b498 --- /dev/null +++ b/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dcdde7b7f13f9c745ae31e38f089fdf8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef b/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef new file mode 100644 index 0000000..e737640 --- /dev/null +++ b/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef @@ -0,0 +1,14 @@ +{ + "name": "UnityFx.Outline.HDRP", + "references": [ + "UnityFx.Outline" + ], + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef.meta b/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef.meta new file mode 100644 index 0000000..418ae3e --- /dev/null +++ b/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8130e23c3199afb43ae1c34b3e328d00 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/UnityFx.Outline.HDRP/package.json b/Packages/UnityFx.Outline.HDRP/package.json new file mode 100644 index 0000000..7c29a0a --- /dev/null +++ b/Packages/UnityFx.Outline.HDRP/package.json @@ -0,0 +1,33 @@ +{ + "name": "com.unityfx.outline.hdrp", + "version": "0.1.0", + "displayName": "Screen-space outline (HDRP)", + "description": "Configurable outline for HDRP.", + "unity": "2019.3", + "dependencies": { + "com.unityfx.outline": "0.8.0", + "com.unity.render-pipelines.high-definition": "7.0.0" + }, + "keywords": [ + "UnityFx", + "UnityFx.Outline", + "UnityFx.Outline.HDRP", + "Outline", + "Post-processing", + "HDRP" + ], + "category": "UnityFx", + "author": { + "name": "Arvtesh", + "email": "arvtesh@gmail.com" + }, + "license": "MIT", + "homepage": "https://github.com/Arvtesh/UnityFx.Outline", + "repository": { + "type": "git", + "url": "https://github.com/Arvtesh/UnityFx.Outline.git" + }, + "bugs": { + "url": "https://github.com/Arvtesh/UnityFx.Outline/issues" + } +} diff --git a/Packages/UnityFx.Outline.HDRP/package.json.meta b/Packages/UnityFx.Outline.HDRP/package.json.meta new file mode 100644 index 0000000..3132f4f --- /dev/null +++ b/Packages/UnityFx.Outline.HDRP/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 761dcd9f6f741bd4b9a86aa1fc1f11b7 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/UnityFx.Outline.PostProcessing/package.json b/Packages/UnityFx.Outline.PostProcessing/package.json index 2da098a..49d5161 100644 --- a/Packages/UnityFx.Outline.PostProcessing/package.json +++ b/Packages/UnityFx.Outline.PostProcessing/package.json @@ -3,9 +3,9 @@ "version": "0.1.0", "displayName": "Screen-space outline (Post-processing v2)", "description": "Configurable outline for Unity post-processing stack (v2). Both solid and blurred modes supported (Gauss blur).", - "unity": "2018.1", + "unity": "2018.4", "dependencies": { - "com.unityfx.outline": "0.7.1", + "com.unityfx.outline": "0.8.0", "com.unity.postprocessing": "2.2.2" }, "keywords": [ From 4ed2cea7ec2826a1892daf1c71bd5ee6634f1a4a Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Tue, 31 Mar 2020 12:50:07 +0300 Subject: [PATCH 21/39] HDRP package pilot (untested) --- .../Runtime/Scripts/Outline.cs | 52 ++++++++++++++++++- .../Runtime/Scripts/Outline.cs.meta | 4 +- .../Runtime/UnityFx.Outline.HDRP.asmdef | 7 ++- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs b/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs index 9e8af01..959edb0 100644 --- a/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs +++ b/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs @@ -13,9 +13,22 @@ namespace UnityFx.Outline.HDRP public sealed class Outline : CustomPostProcessVolumeComponent, IPostProcessComponent { #region data + +#pragma warning disable 0649 + + [SerializeField, HideInInspector] + private OutlineResources _defaultResources; + [SerializeField] + private VolumeParameter _resources = new VolumeParameter(); + [SerializeField] + private VolumeParameter _layers = new VolumeParameter(); + +#pragma warning restore 0649 + #endregion #region interface + #endregion #region CustomPostProcessVolumeComponent @@ -34,6 +47,10 @@ public override void Setup() public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination) { + using (var renderer = new OutlineRenderer(cmd, source, destination)) + { + _layers.value.Render(renderer, _resources.value); + } } public override void Cleanup() @@ -42,11 +59,44 @@ public override void Cleanup() #endregion + #region ScriptableObject + + protected override void OnEnable() + { + // NOTE: This should go before base.OnEnable(). + if (!_resources.value) + { + _resources.value = _defaultResources; + } + + base.OnEnable(); + } + + #endregion + #region IPostProcessComponent public bool IsActive() { - // TODO + if (_resources == null || _layers == null) + { + return false; + } + + var r = _resources.value; + + if (r == null || !r.IsValid) + { + return false; + } + + var l = _layers.value; + + if (l == null || l.Count == 0) + { + return false; + } + return true; } diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta b/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta index d40b498..fd81fd9 100644 --- a/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta +++ b/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta @@ -3,7 +3,9 @@ guid: dcdde7b7f13f9c745ae31e38f089fdf8 MonoImporter: externalObjects: {} serializedVersion: 2 - defaultReferences: [] + defaultReferences: + - _defaultResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, + type: 2} executionOrder: 0 icon: {instanceID: 0} userData: diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef b/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef index e737640..3017f1e 100644 --- a/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef +++ b/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef @@ -1,14 +1,17 @@ { "name": "UnityFx.Outline.HDRP", "references": [ + "Unity.RenderPipelines.Core.Runtime", + "Unity.RenderPipelines.HighDefinition.Runtime", "UnityFx.Outline" ], - "optionalUnityReferences": [], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, "overrideReferences": false, "precompiledReferences": [], "autoReferenced": true, - "defineConstraints": [] + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file From f31fd29984ee71973f1e2d9a8eafb4bb91c6c1e7 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Tue, 31 Mar 2020 14:35:04 +0300 Subject: [PATCH 22/39] Added OutlineEffect convenience methods --- .../Runtime/Scripts/OutlineEffect.cs | 51 +++++++++++++------ .../Runtime/Scripts/OutlineLayer.cs | 8 +-- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs index 8945e5d..a4bacb8 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs @@ -2,7 +2,7 @@ // See the LICENSE.md file in the project root for more information. using System; -using System.Runtime.CompilerServices; +using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; @@ -46,7 +46,7 @@ public OutlineResources OutlineResources } set { - if (value == null) + if (ReferenceEquals(value, null)) { throw new ArgumentNullException("OutlineResources"); } @@ -56,26 +56,16 @@ public OutlineResources OutlineResources } /// - /// Gets or sets outline layers. + /// Gets collection of outline layers. /// - /// Thrown if setter argument is . /// - public OutlineLayerCollection OutlineLayers + public IList OutlineLayers { get { CreateLayersIfNeeded(); return _outlineLayers; } - set - { - if (value == null) - { - throw new ArgumentNullException("OutlineLayers"); - } - - _outlineLayers = value; - } } /// @@ -107,6 +97,38 @@ public CameraEvent RenderEvent } } + /// + /// Adds the passed to the first outline layer. Creates the layer if needed. + /// + /// The to add and render outline for. + /// + public void AddGameObject(GameObject go) + { + AddGameObject(go, 0); + } + + /// + /// Adds the passed to the specified outline layer. Creates the layer if needed. + /// + /// The to add and render outline for. + /// + public void AddGameObject(GameObject go, int layerIndex) + { + if (layerIndex < 0) + { + throw new ArgumentOutOfRangeException("layerIndex"); + } + + CreateLayersIfNeeded(); + + while (_outlineLayers.Count <= layerIndex) + { + _outlineLayers.Add(new OutlineLayer()); + } + + _outlineLayers[layerIndex].Add(go); + } + /// /// Shares with another instance. /// @@ -117,7 +139,6 @@ public void ShareLayersWith(OutlineEffect other) if (other) { CreateLayersIfNeeded(); - other._outlineLayers = _outlineLayers; } } diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs index 8217cab..eac4774 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs @@ -130,7 +130,7 @@ public OutlineLayer(string name) /// Thrown if is . public OutlineLayer(OutlineSettings settings) { - if (settings == null) + if (ReferenceEquals(settings, null)) { throw new ArgumentNullException("settings"); } @@ -144,7 +144,7 @@ public OutlineLayer(OutlineSettings settings) /// Thrown if is . public OutlineLayer(string name, OutlineSettings settings) { - if (settings == null) + if (ReferenceEquals(settings, null)) { throw new ArgumentNullException("settings"); } @@ -159,7 +159,7 @@ public OutlineLayer(string name, OutlineSettings settings) /// Thrown if is . public void Add(GameObject go, int ignoreLayerMask) { - if (go == null) + if (ReferenceEquals(go, null)) { throw new ArgumentNullException("go"); } @@ -187,7 +187,7 @@ public void Add(GameObject go, string ignoreLayer) /// Thrown if is . public bool TryGetRenderers(GameObject go, out ICollection renderers) { - if (go == null) + if (ReferenceEquals(go, null)) { throw new ArgumentNullException("go"); } From f42313b1e2e79825f54450d40eaa5e1ea8948784 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Tue, 31 Mar 2020 15:27:43 +0300 Subject: [PATCH 23/39] README update --- README.md | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 7e8c121..2619c06 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,10 @@ Channel | UnityFx.Outline | ---------|---------------| Github | [![GitHub release](https://img.shields.io/github/release/Arvtesh/UnityFx.Outline.svg?logo=github)](https://github.com/Arvtesh/UnityFx.Outline/releases) -Npm | [![Npm release](https://img.shields.io/npm/v/com.unityfx.outline.svg)](https://www.npmjs.com/package/com.unityfx.outline) ![npm](https://img.shields.io/npm/dt/com.unityfx.outline) +Npm (core + built-in RP) | [![Npm release](https://img.shields.io/npm/v/com.unityfx.outline.svg)](https://www.npmjs.com/package/com.unityfx.outline) ![npm](https://img.shields.io/npm/dt/com.unityfx.outline) +Npm (Post-processing v2) | [![Npm release](https://img.shields.io/npm/v/com.unityfx.outline.postprocessing.svg)](https://www.npmjs.com/package/com.unityfx.outline.postprocessing) ![npm](https://img.shields.io/npm/dt/com.unityfx.outline.postprocessing) +Npm (URP) | [![Npm release](https://img.shields.io/npm/v/com.unityfx.outline.urp.svg)](https://www.npmjs.com/package/com.unityfx.outline.urp) ![npm](https://img.shields.io/npm/dt/com.unityfx.outline.urp) +Npm (HDRP) | [![Npm release](https://img.shields.io/npm/v/com.unityfx.outline.hdrp.svg)](https://www.npmjs.com/package/com.unityfx.outline.hdrp) ![npm](https://img.shields.io/npm/dt/com.unityfx.outline.hdrp) **Requires Unity 2017 or higher.**
**Compatible with [Unity Post-processing Stack v2](https://github.com/Unity-Technologies/PostProcessing/tree/v2).** @@ -42,10 +45,13 @@ You can get the code by cloning the github repository using your preffered git c git clone https://github.com/Arvtesh/UnityFx.Outline.git ``` -### Npm package -[![NPM](https://nodei.co/npm/com.unityfx.outline.png)](https://www.npmjs.com/package/com.unityfx.outline) +### Npm packages +[![NPM](https://nodei.co/npm/com.unityfx.outline.png)](https://www.npmjs.com/package/com.unityfx.outline)
+[![NPM](https://nodei.co/npm/com.unityfx.outline.postprocessing.png)](https://www.npmjs.com/package/com.unityfx.outline.postprocessing)
+[![NPM](https://nodei.co/npm/com.unityfx.outline.urp.png)](https://www.npmjs.com/package/com.unityfx.outline.urp)
+[![NPM](https://nodei.co/npm/com.unityfx.outline.hdrp.png)](https://www.npmjs.com/package/com.unityfx.outline.hdrp)
-Npm package is available at [npmjs.com](https://www.npmjs.com/package/com.unityfx.outline). To use it, add the following line to dependencies section of your `manifest.json`. Unity should download and link the package automatically: +Npm core package is available at [npmjs.com](https://www.npmjs.com/package/com.unityfx.outline). There are dedicated packages for [Post-processing Stack v2](https://github.com/Unity-Technologies/PostProcessing/tree/v2), [Universal Render Pipeline](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@8.0/manual/index.html) and [High Definition Render Pipeline](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@8.0/manual/index.html). To use the packages, add the following line to dependencies section of your `manifest.json`. Unity should download and link the package automatically: ```json { "scopedRegistries": [ @@ -58,7 +64,10 @@ Npm package is available at [npmjs.com](https://www.npmjs.com/package/com.unityf } ], "dependencies": { - "com.unityfx.outline": "0.7.0" + "com.unityfx.outline": "0.8.0", + "com.unityfx.outline.postprocessing": "0.1.0", + "com.unityfx.outline.urp": "0.1.0", + "com.unityfx.outline.hdrp": "0.1.0", } } ``` @@ -69,7 +78,7 @@ Install the package and import the namespace: using UnityFx.Outline; ``` -### Per-camera outlines +### Per-camera outlines (built-in RP) ![Outline demo](Docs/OutlineEffectInspector.png "OutlineEffect Inspector") Add `OutlineEffect` script to a camera that should render outlines. Then add and configure as many layers as you need: @@ -84,6 +93,21 @@ layer.Add(myGo); outlineEffect.OutlineLayers.Add(layer); ``` +or +```csharp +var outlineEffect = Camera.main.GetComponent(); + +// This adds layer 0 (if it is not there) and then adds myGo. +outlineEffect.AddGameObject(myGo); + +// Now setup the layer. +var layer = outlineEffect[0]; + +layer.OutlineColor = Color.red; +layer.OutlineWidth = 7; +layer.OutlineMode = OutlineMode.Blurred; +layer.Add(myGo); +``` This can be done at runtime or while editing a scene. If you choose to assign the script in runtime make sure `OutlineEffect.OutlineResources` is initialized. Disabling `OutlineEffect` script disables outlining for the camera (and frees all resources used). @@ -97,7 +121,7 @@ var effect2 = camera2.GetComponent(); effect1.ShareLayersWith(effect2); ``` -### Per-object outlines +### Per-object outlines (built-in RP) ![Outline demo](Docs/OutlineBehaviourInspector.png "OutlineBehaviour Inspector") Add `OutlineBehaviour` script to objects that should be outlined (in edit mode or in runtime). Make sure `OutlineBehaviour.OutlineResources` is initialized. You can customize outline settings either via Unity inspector or via script. Objects with `OutlineBehaviour` assigned render outlines in all cameras. @@ -143,6 +167,7 @@ myCamera.AddCommandBuffer(OutlineRenderer.RenderEvent, commandBuffer); ``` ### Integration with Unity post-processing. +[![NPM](https://nodei.co/npm/com.unityfx.outline.postprocessing.png)](https://www.npmjs.com/package/com.unityfx.outline.postprocessing) The outline effect can easily be added to [Post-processing Stack v2](https://github.com/Unity-Technologies/PostProcessing/tree/v2). A minimal integration example is shown below: ```csharp @@ -174,6 +199,12 @@ For the sake of simplicity the sample does not include any kind of error checkin More info on writing custom post processing effects can be found [here](https://docs.unity3d.com/Packages/com.unity.postprocessing@2.2/manual/Writing-Custom-Effects.html). +### Integration with Universal Render Pipeline (URP). +[![NPM](https://nodei.co/npm/com.unityfx.outline.urp.png)](https://www.npmjs.com/package/com.unityfx.outline.urp) + +### Integration with High Definition Render Pipeline (HDRP). +[![NPM](https://nodei.co/npm/com.unityfx.outline.hdrp.png)](https://www.npmjs.com/package/com.unityfx.outline.hdrp) + ## Motivation The project was initially created to help author with his [Unity3d](https://unity3d.com) projects. There are not many reusable open-source examples of it, so here it is. Hope it will be useful for someone. From a5d47371f940690a69d4655a2cd53db437536972 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Tue, 31 Mar 2020 15:32:31 +0300 Subject: [PATCH 24/39] Github actions script update --- .github/workflows/npmpublish.yml | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/.github/workflows/npmpublish.yml b/.github/workflows/npmpublish.yml index 2dfef20..b31fac2 100644 --- a/.github/workflows/npmpublish.yml +++ b/.github/workflows/npmpublish.yml @@ -14,18 +14,9 @@ jobs: with: node-version: 12 registry-url: https://registry.npmjs.org/ - - run: npm publish Packages/UnityFx.Outline + - run: | + npm publish Packages/UnityFx.Outline + npm publish Packages/UnityFx.Outline.PostProcessing + npm publish Packages/UnityFx.Outline.HDRP env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - - publish-gpr: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 - with: - node-version: 12 - registry-url: https://npm.pkg.github.com/ - - run: npm publish Packages/UnityFx.Outline - env: - NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} From fb90f27b23db774dcdde6ec266753f2fd06f2734 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Tue, 31 Mar 2020 15:41:50 +0300 Subject: [PATCH 25/39] Fixed IndexOutOfRangeException when settings outline width to max value (fixes #4) --- .../UnityFx.Outline/Runtime/Scripts/OutlineResources.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs index 88ec434..8d8f169 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs @@ -204,17 +204,19 @@ public bool IsValid ///
public float[] GetGaussSamples(int width) { + var index = Mathf.Clamp(width, 1, OutlineRenderer.MaxWidth) - 1; + if (_gaussSamples == null) { _gaussSamples = new float[OutlineRenderer.MaxWidth][]; } - if (_gaussSamples[width] == null) + if (_gaussSamples[index] == null) { - _gaussSamples[width] = OutlineRenderer.GetGaussSamples(width, null); + _gaussSamples[index] = OutlineRenderer.GetGaussSamples(width, null); } - return _gaussSamples[width]; + return _gaussSamples[index]; } /// From ddeac474f229610800dcab97f67c4c8c30a68ff5 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Tue, 31 Mar 2020 15:44:49 +0300 Subject: [PATCH 26/39] Misc changes --- .../UnityFx.Outline/Runtime/Scripts/OutlineResources.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs index 8d8f169..05017f8 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs @@ -75,7 +75,7 @@ public Material RenderMaterial { get { - if (_renderMaterial == null) + if (ReferenceEquals(_renderMaterial, null)) { _renderMaterial = new Material(RenderShader) { @@ -95,7 +95,7 @@ public Material HPassMaterial { get { - if (_hPassMaterial == null) + if (ReferenceEquals(_hPassMaterial, null)) { _hPassMaterial = new Material(HPassShader) { @@ -115,7 +115,7 @@ public Material VPassBlendMaterial { get { - if (_vPassMaterial == null) + if (ReferenceEquals(_vPassMaterial, null)) { _vPassMaterial = new Material(VPassBlendShader) { @@ -167,7 +167,7 @@ public Mesh FullscreenTriangleMesh { get { - if (_fullscreenTriangleMesh == null) + if (ReferenceEquals(_fullscreenTriangleMesh, null)) { _fullscreenTriangleMesh = new Mesh() { From 52a5df0bcf1a64516b31b9425a048eee9febf6ba Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Tue, 31 Mar 2020 15:49:29 +0300 Subject: [PATCH 27/39] CHANGELOG update --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b7334f..540f611 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,14 +5,17 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/); this proj ## [0.8.0] - unreleased -Added depth testing support and performance optimizations. +Added depth testing support, SRP support and performance optimizations. ### Added - Added support for depth testing when rendering outlines. When enabled, outlines are only rendered around the visible object parts ([#1](https://github.com/Arvtesh/UnityFx.Outline/issues/1)). +- Added a few convenience methods to `OutlineEffect`. +- Added editor tooltips for outline component fileds. ### Fixed - Get rid of GC allocatinos during command buffer updates. - Fixed compiler warning in post-processing compatibility package (0649). +- Fixed `IndexOutOfRangeException` when setting outline width to max value ([#4](https://github.com/Arvtesh/UnityFx.Outline/issues/4)). ### Removed - Removed change tracking support in package entities ([#2](https://github.com/Arvtesh/UnityFx.Outline/issues/2)). From 6a2f3579120cb1ec222df4641c28677f5928e978 Mon Sep 17 00:00:00 2001 From: Arvtesh <22732458+Arvtesh@users.noreply.github.com> Date: Tue, 31 Mar 2020 23:41:31 +0300 Subject: [PATCH 28/39] Make shaders SRP-compatible --- .../UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader | 5 ++++- .../UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader | 9 ++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader b/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader index 8c3b7a4..2febb62 100644 --- a/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader +++ b/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader @@ -25,9 +25,12 @@ Shader "UnityFx/Outline/HPass" #pragma fragment Frag #include "UnityCG.cginc" + CBUFFER_START(UnityPerMaterial) + int _Width; + CBUFFER_END + UNITY_DECLARE_TEX2D(_MaskTex); float2 _MaskTex_TexelSize; - int _Width; float _GaussSamples[32]; struct v2f diff --git a/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader b/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader index c8be4b7..dbf1a18 100644 --- a/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader +++ b/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader @@ -29,13 +29,16 @@ Shader "UnityFx/Outline/VPassBlend" #pragma fragment Frag #include "UnityCG.cginc" + CBUFFER_START(UnityPerMaterial) + float _Intensity; + int _Width; + float4 _Color; + CBUFFER_END + UNITY_DECLARE_TEX2D(_MaskTex); float2 _MaskTex_TexelSize; UNITY_DECLARE_TEX2D(_HPassTex); float2 _HPassTex_TexelSize; - float4 _Color; - float _Intensity; - int _Width; float _GaussSamples[32]; struct v2f From b370e786482ee51496c3a092e51ac855d2e45465 Mon Sep 17 00:00:00 2001 From: Arvtesh <22732458+Arvtesh@users.noreply.github.com> Date: Wed, 1 Apr 2020 23:57:50 +0300 Subject: [PATCH 29/39] Misc HDRP-related fixes --- .../Runtime/Scripts/Outline.cs | 29 ++++++++++++++++--- .../Runtime/Scripts/OutlineRenderer.cs | 24 ++++++++++++--- .../Runtime/Scripts/OutlineResources.cs | 8 ++--- 3 files changed, 49 insertions(+), 12 deletions(-) diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs b/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs index 959edb0..c788934 100644 --- a/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs +++ b/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs @@ -2,6 +2,7 @@ // See the LICENSE.md file in the project root for more information. using System; +using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; @@ -16,12 +17,22 @@ public sealed class Outline : CustomPostProcessVolumeComponent, IPostProcessComp #pragma warning disable 0649 + [Serializable] + private class OutlineResourcesParameter : VolumeParameter + { + } + + [Serializable] + private class OutlineLayersParameter : VolumeParameter + { + } + [SerializeField, HideInInspector] private OutlineResources _defaultResources; [SerializeField] - private VolumeParameter _resources = new VolumeParameter(); + private OutlineResourcesParameter _resources = new OutlineResourcesParameter(); [SerializeField] - private VolumeParameter _layers = new VolumeParameter(); + private OutlineLayersParameter _layers = new OutlineLayersParameter(); #pragma warning restore 0649 @@ -29,6 +40,14 @@ public sealed class Outline : CustomPostProcessVolumeComponent, IPostProcessComp #region interface + public IList OutlineLayers + { + get + { + return _layers.value; + } + } + #endregion #region CustomPostProcessVolumeComponent @@ -37,17 +56,18 @@ public override CustomPostProcessInjectionPoint injectionPoint { get { - return CustomPostProcessInjectionPoint.AfterPostProcess; + return CustomPostProcessInjectionPoint.BeforePostProcess; } } public override void Setup() { + base.Setup(); } public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination) { - using (var renderer = new OutlineRenderer(cmd, source, destination)) + using (var renderer = new OutlineRenderer(cmd, source, destination, destination.referenceSize)) { _layers.value.Render(renderer, _resources.value); } @@ -55,6 +75,7 @@ public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, public override void Cleanup() { + base.Cleanup(); } #endregion diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs index eeced3e..3569cf7 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs @@ -125,7 +125,7 @@ public struct OutlineRenderer : IDisposable /// Render target. /// Thrown if is . public OutlineRenderer(CommandBuffer commandBuffer, BuiltinRenderTextureType rt) - : this(commandBuffer, rt, rt) + : this(commandBuffer, rt, rt, Vector2Int.zero) { } @@ -136,7 +136,7 @@ public OutlineRenderer(CommandBuffer commandBuffer, BuiltinRenderTextureType rt) /// Render target. /// Thrown if is . public OutlineRenderer(CommandBuffer commandBuffer, RenderTargetIdentifier rt) - : this(commandBuffer, rt, rt) + : this(commandBuffer, rt, rt, Vector2Int.zero) { } @@ -148,19 +148,35 @@ public OutlineRenderer(CommandBuffer commandBuffer, RenderTargetIdentifier rt) /// Render target. /// Thrown if is . public OutlineRenderer(CommandBuffer commandBuffer, RenderTargetIdentifier src, RenderTargetIdentifier dst) + : this(commandBuffer, src, dst, Vector2Int.zero) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// A to render the effect to. It should be cleared manually (if needed) before passing to this method. + /// Source image. Can be the same as . + /// Render target. + /// Size of the temporaty render textures. + /// Thrown if is . + public OutlineRenderer(CommandBuffer commandBuffer, RenderTargetIdentifier src, RenderTargetIdentifier dst, Vector2Int rtSize) { if (commandBuffer == null) { throw new ArgumentNullException("commandBuffer"); } + var cx = rtSize.x > 0 ? rtSize.x : -1; + var cy = rtSize.y > 0 ? rtSize.y : -1; + _source = src; _destination = dst; _commandBuffer = commandBuffer; _commandBuffer.BeginSample(EffectName); - _commandBuffer.GetTemporaryRT(_maskRtId, -1, -1, 0, FilterMode.Bilinear, RenderTextureFormat.R8); - _commandBuffer.GetTemporaryRT(_hPassRtId, -1, -1, 0, FilterMode.Bilinear, RenderTextureFormat.R8); + _commandBuffer.GetTemporaryRT(_maskRtId, cx, cy, 0, FilterMode.Bilinear, RenderTextureFormat.R8); + _commandBuffer.GetTemporaryRT(_hPassRtId, cx, cy, 0, FilterMode.Bilinear, RenderTextureFormat.R8); // Need to copy src content into dst if they are not the same. For instance this is the case when rendering // the outline effect as part of Unity Post Processing stack. diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs index 05017f8..8d8f169 100644 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs +++ b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs @@ -75,7 +75,7 @@ public Material RenderMaterial { get { - if (ReferenceEquals(_renderMaterial, null)) + if (_renderMaterial == null) { _renderMaterial = new Material(RenderShader) { @@ -95,7 +95,7 @@ public Material HPassMaterial { get { - if (ReferenceEquals(_hPassMaterial, null)) + if (_hPassMaterial == null) { _hPassMaterial = new Material(HPassShader) { @@ -115,7 +115,7 @@ public Material VPassBlendMaterial { get { - if (ReferenceEquals(_vPassMaterial, null)) + if (_vPassMaterial == null) { _vPassMaterial = new Material(VPassBlendShader) { @@ -167,7 +167,7 @@ public Mesh FullscreenTriangleMesh { get { - if (ReferenceEquals(_fullscreenTriangleMesh, null)) + if (_fullscreenTriangleMesh == null) { _fullscreenTriangleMesh = new Mesh() { From 1bf922770ed6ae9427b9ef10df5217f2381c00cc Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Thu, 2 Apr 2020 13:58:35 +0300 Subject: [PATCH 30/39] Added outline core specific project --- Outline.Core/Assets/Examples.meta | 8 + .../Assets/Examples/SimplePerCamera.meta | 8 + .../Examples/SimplePerCamera/Outline.unity | 586 ++++++++++++++++++ .../SimplePerCamera/Outline.unity.meta | 9 + .../SimplePerCamera/OutlineEffectBuilder.cs | 88 +++ .../OutlineEffectBuilder.cs.meta | 13 + .../SimplePerCamera/TestOutlineLayers.asset | 43 ++ .../TestOutlineLayers.asset.meta | 10 + .../Assets/Examples/SimplePerObject.meta | 8 + .../SimplePerObject/TestOutlineSettings.asset | 18 + .../TestOutlineSettings.asset.meta | 8 + Outline.Core/Assets/Tests.meta | 8 + Outline.Core/Assets/Tests/Editor.meta | 8 + Outline.Core/Assets/Tests/Editor/Scripts.meta | 8 + .../Assets/Tests/Editor/Scripts/Helpers.meta | 8 + .../Helpers/IOutlineSettingsExTests.cs | 98 +++ .../Helpers/IOutlineSettingsExTests.cs.meta | 11 + .../Scripts/Helpers/IOutlineSettingsTests.cs | 195 ++++++ .../Helpers/IOutlineSettingsTests.cs.meta | 11 + .../Editor/Scripts/OutlineBehaviourTests.cs | 33 + .../Scripts/OutlineBehaviourTests.cs.meta | 11 + .../Scripts/OutlineLayerCollectionTests.cs | 164 +++++ .../OutlineLayerCollectionTests.cs.meta | 11 + .../Tests/Editor/Scripts/OutlineLayerTests.cs | 117 ++++ .../Editor/Scripts/OutlineLayerTests.cs.meta | 11 + .../Editor/Scripts/OutlineRendererTests.cs | 47 ++ .../Scripts/OutlineRendererTests.cs.meta | 11 + .../Editor/Scripts/OutlineSettingsTests.cs | 32 + .../Scripts/OutlineSettingsTests.cs.meta | 11 + .../Packages/UnityFx.Outline/CHANGELOG.md | 106 ++++ .../UnityFx.Outline/CHANGELOG.md.meta | 7 + .../Packages/UnityFx.Outline/Editor.meta | 10 + .../UnityFx.Outline/Editor/Scripts.meta | 10 + .../Editor/Scripts/OutlineBehaviourEditor.cs | 84 +++ .../Scripts/OutlineBehaviourEditor.cs.meta | 13 + .../Editor/Scripts/OutlineEditorUtility.cs | 201 ++++++ .../Scripts/OutlineEditorUtility.cs.meta | 11 + .../Editor/Scripts/OutlineEffectEditor.cs | 59 ++ .../Scripts/OutlineEffectEditor.cs.meta | 13 + .../Scripts/OutlineLayerCollectionEditor.cs | 121 ++++ .../OutlineLayerCollectionEditor.cs.meta | 11 + .../Editor/Scripts/OutlineSettingsEditor.cs | 33 + .../Scripts/OutlineSettingsEditor.cs.meta | 11 + .../Editor/UnityFx.Outline.Editor.asmdef | 16 + .../Editor/UnityFx.Outline.Editor.asmdef.meta | 9 + .../Packages/UnityFx.Outline/README.md | 11 + .../Packages/UnityFx.Outline/README.md.meta | 9 + .../Packages/UnityFx.Outline/Runtime.meta | 10 + .../UnityFx.Outline/Runtime/Prefabs.meta | 8 + .../Runtime/Prefabs/OutlineResources.asset | 16 + .../Prefabs/OutlineResources.asset.meta | 10 + .../UnityFx.Outline/Runtime/Scripts.meta | 8 + .../Runtime/Scripts/IOutlineSettings.cs | 45 ++ .../Runtime/Scripts/IOutlineSettings.cs.meta | 11 + .../Runtime/Scripts/IOutlineSettingsEx.cs | 19 + .../Scripts/IOutlineSettingsEx.cs.meta | 11 + .../Runtime/Scripts/OutlineBehaviour.cs | 372 +++++++++++ .../Runtime/Scripts/OutlineBehaviour.cs.meta | 15 + .../Runtime/Scripts/OutlineEffect.cs | 240 +++++++ .../Runtime/Scripts/OutlineEffect.cs.meta | 15 + .../Runtime/Scripts/OutlineLayer.cs | 494 +++++++++++++++ .../Runtime/Scripts/OutlineLayer.cs.meta | 13 + .../Runtime/Scripts/OutlineLayerCollection.cs | 291 +++++++++ .../Scripts/OutlineLayerCollection.cs.meta | 13 + .../Runtime/Scripts/OutlineRenderFlags.cs | 29 + .../Scripts/OutlineRenderFlags.cs.meta | 11 + .../Runtime/Scripts/OutlineRenderer.cs | 493 +++++++++++++++ .../Runtime/Scripts/OutlineRenderer.cs.meta | 13 + .../Scripts/OutlineRendererCollection.cs | 146 +++++ .../Scripts/OutlineRendererCollection.cs.meta | 11 + .../Runtime/Scripts/OutlineResources.cs | 234 +++++++ .../Runtime/Scripts/OutlineResources.cs.meta | 14 + .../Runtime/Scripts/OutlineSettings.cs | 128 ++++ .../Runtime/Scripts/OutlineSettings.cs.meta | 11 + .../Scripts/OutlineSettingsInstance.cs | 178 ++++++ .../Scripts/OutlineSettingsInstance.cs.meta | 11 + .../Runtime/Scripts/Properties.meta | 8 + .../Scripts/Properties/AssemblyInfo.cs | 29 + .../Scripts/Properties/AssemblyInfo.cs.meta | 11 + .../UnityFx.Outline/Runtime/Shaders.meta | 10 + .../Runtime/Shaders/OutlinePass1.shader | 69 +++ .../Runtime/Shaders/OutlinePass1.shader.meta | 10 + .../Runtime/Shaders/OutlinePass2.shader | 83 +++ .../Runtime/Shaders/OutlinePass2.shader.meta | 8 + .../Runtime/Shaders/OutlineRenderColor.shader | 43 ++ .../Shaders/OutlineRenderColor.shader.meta | 10 + .../Runtime/UnityFx.Outline.asmdef | 3 + .../Runtime/UnityFx.Outline.asmdef.meta | 9 + .../Packages/UnityFx.Outline/package.json | 27 + .../UnityFx.Outline/package.json.meta | 9 + Outline.Core/Packages/manifest.json | 35 ++ 91 files changed, 5563 insertions(+) create mode 100644 Outline.Core/Assets/Examples.meta create mode 100644 Outline.Core/Assets/Examples/SimplePerCamera.meta create mode 100644 Outline.Core/Assets/Examples/SimplePerCamera/Outline.unity create mode 100644 Outline.Core/Assets/Examples/SimplePerCamera/Outline.unity.meta create mode 100644 Outline.Core/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs create mode 100644 Outline.Core/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs.meta create mode 100644 Outline.Core/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset create mode 100644 Outline.Core/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset.meta create mode 100644 Outline.Core/Assets/Examples/SimplePerObject.meta create mode 100644 Outline.Core/Assets/Examples/SimplePerObject/TestOutlineSettings.asset create mode 100644 Outline.Core/Assets/Examples/SimplePerObject/TestOutlineSettings.asset.meta create mode 100644 Outline.Core/Assets/Tests.meta create mode 100644 Outline.Core/Assets/Tests/Editor.meta create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts.meta create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/Helpers.meta create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs.meta create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs.meta create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/OutlineBehaviourTests.cs create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/OutlineBehaviourTests.cs.meta create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs.meta create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerTests.cs create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerTests.cs.meta create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/OutlineRendererTests.cs create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/OutlineRendererTests.cs.meta create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/OutlineSettingsTests.cs create mode 100644 Outline.Core/Assets/Tests/Editor/Scripts/OutlineSettingsTests.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md create mode 100644 Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/Scripts.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef create mode 100644 Outline.Core/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/README.md create mode 100644 Outline.Core/Packages/UnityFx.Outline/README.md.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Prefabs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/Properties.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/Properties/AssemblyInfo.cs create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/Properties/AssemblyInfo.cs.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef create mode 100644 Outline.Core/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef.meta create mode 100644 Outline.Core/Packages/UnityFx.Outline/package.json create mode 100644 Outline.Core/Packages/UnityFx.Outline/package.json.meta create mode 100644 Outline.Core/Packages/manifest.json diff --git a/Outline.Core/Assets/Examples.meta b/Outline.Core/Assets/Examples.meta new file mode 100644 index 0000000..040f581 --- /dev/null +++ b/Outline.Core/Assets/Examples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cd9a1f8eda7b3ae4da8c3a27817dae4e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Examples/SimplePerCamera.meta b/Outline.Core/Assets/Examples/SimplePerCamera.meta new file mode 100644 index 0000000..31b3630 --- /dev/null +++ b/Outline.Core/Assets/Examples/SimplePerCamera.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 874c6e35dd593604d9dc8bf919bc94d7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Examples/SimplePerCamera/Outline.unity b/Outline.Core/Assets/Examples/SimplePerCamera/Outline.unity new file mode 100644 index 0000000..c172ec7 --- /dev/null +++ b/Outline.Core/Assets/Examples/SimplePerCamera/Outline.unity @@ -0,0 +1,586 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44657844, g: 0.49641222, b: 0.57481694, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 10 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &167171210 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 167171212} + - component: {fileID: 167171211} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &167171211 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167171210} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 0.5 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &167171212 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167171210} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &692811812 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 692811816} + - component: {fileID: 692811815} + - component: {fileID: 692811818} + - component: {fileID: 692811817} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!20 &692811815 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 692811812} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &692811816 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 692811812} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1579373806} + - {fileID: 748173443} + - {fileID: 1789341921} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &692811817 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 692811812} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5a318c96b1bc1614683eccf7abd717a1, type: 3} + m_Name: + m_EditorClassIdentifier: + _outlineGos: + - {fileID: 1579373802} + - {fileID: 748173439} +--- !u!114 &692811818 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 692811812} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 270d3185d159bf54fb4cddbb42235437, type: 3} + m_Name: + m_EditorClassIdentifier: + _outlineResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, type: 2} + _outlineLayers: {fileID: 11400000, guid: 3a6c3b3c5f6e3ad4ab8e09fc219865bd, type: 2} + _cameraEvent: 18 +--- !u!1 &748173439 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 748173443} + - component: {fileID: 748173442} + - component: {fileID: 748173441} + - component: {fileID: 748173440} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &748173440 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748173439} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &748173441 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748173439} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &748173442 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748173439} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &748173443 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748173439} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 0, z: 5.58} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 692811816} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1579373802 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1579373806} + - component: {fileID: 1579373805} + - component: {fileID: 1579373804} + - component: {fileID: 1579373803} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &1579373803 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1579373802} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!135 &1579373804 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1579373802} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1579373805 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1579373802} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1579373806 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1579373802} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 4} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 692811816} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1789341920 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1789341921} + - component: {fileID: 1789341925} + - component: {fileID: 1789341924} + - component: {fileID: 1789341923} + - component: {fileID: 1789341922} + m_Layer: 0 + m_Name: Cylinder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1789341921 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1789341920} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.5, y: 0, z: 4} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 692811816} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1789341922 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1789341920} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 271c580db5fd384429cdac899152e9e0, type: 3} + m_Name: + m_EditorClassIdentifier: + _outlineResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, type: 2} + _outlineSettings: + _outlineSettings: {fileID: 0} + _outlineColor: {r: 0, g: 1, b: 0, a: 1} + _outlineWidth: 15 + _outlineIntensity: 2 + _outlineMode: 1 + _depthTestEnabled: 0 +--- !u!23 &1789341923 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1789341920} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!136 &1789341924 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1789341920} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1789341925 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1789341920} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Outline.Core/Assets/Examples/SimplePerCamera/Outline.unity.meta b/Outline.Core/Assets/Examples/SimplePerCamera/Outline.unity.meta new file mode 100644 index 0000000..bb769c6 --- /dev/null +++ b/Outline.Core/Assets/Examples/SimplePerCamera/Outline.unity.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e1f1f5e7ceb61b746b9f2016f0e53a93 +timeCreated: 1566127107 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs b/Outline.Core/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs new file mode 100644 index 0000000..444b39c --- /dev/null +++ b/Outline.Core/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs @@ -0,0 +1,88 @@ +// 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.Examples +{ + /// + /// Helperr class for managing outlines from editor. + /// + [RequireComponent(typeof(OutlineEffect))] + public class OutlineEffectBuilder : MonoBehaviour + { + #region data + +#pragma warning disable 0649 + + [SerializeField] + private GameObject[] _outlineGos; + +#pragma warning restore 0649 + + private OutlineEffect _outlineEffect; + private OutlineLayer _outlineLayer; + + #endregion + + #region MonoBehaviour + + private void Awake() + { + if (_outlineEffect == null) + { + _outlineEffect = GetComponent(); + } + + if (_outlineLayer == null) + { + if (_outlineEffect.OutlineLayers.Count > 0) + { + _outlineLayer = _outlineEffect.OutlineLayers[0]; + } + else + { + _outlineLayer = new OutlineLayer(); + _outlineEffect.OutlineLayers.Add(_outlineLayer); + } + } + + foreach (var go in _outlineGos) + { + if (go) + { + _outlineLayer.Add(go); + } + } + } + + private void OnValidate() + { + if (_outlineEffect == null) + { + _outlineEffect = GetComponent(); + } + + if (_outlineEffect.OutlineLayers.Count > 0) + { + _outlineLayer = _outlineEffect.OutlineLayers[0]; + } + else + { + _outlineLayer = new OutlineLayer(); + _outlineEffect.OutlineLayers.Add(_outlineLayer); + } + + foreach (var go in _outlineGos) + { + if (go) + { + _outlineLayer.Add(go); + } + } + } + + #endregion + } +} diff --git a/Outline.Core/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs.meta b/Outline.Core/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs.meta new file mode 100644 index 0000000..7150935 --- /dev/null +++ b/Outline.Core/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 5a318c96b1bc1614683eccf7abd717a1 +timeCreated: 1566138009 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset b/Outline.Core/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset new file mode 100644 index 0000000..3de703c --- /dev/null +++ b/Outline.Core/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 57d0c11168277cf4eb3b4b89706e6aa5, type: 3} + m_Name: TestOutlineLayers + m_EditorClassIdentifier: + _layers: + - _settings: + _outlineSettings: {fileID: 11400000, guid: 45705bbb29366194eb01ca517d80967c, + type: 2} + _outlineColor: {r: 1, g: 0, b: 0, a: 1} + _outlineWidth: 5 + _outlineIntensity: 2 + _outlineMode: 0 + _name: + _zOrder: 0 + _enabled: 1 + - _settings: + _outlineSettings: {fileID: 0} + _outlineColor: {r: 1, g: 1, b: 0, a: 1} + _outlineWidth: 15 + _outlineIntensity: 2 + _outlineMode: 1 + _name: + _zOrder: 0 + _enabled: 1 + - _settings: + _outlineSettings: {fileID: 0} + _outlineColor: {r: 1, g: 0, b: 1, a: 1} + _outlineWidth: 4 + _outlineIntensity: 2 + _outlineMode: 0 + _name: + _zOrder: 0 + _enabled: 1 diff --git a/Outline.Core/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset.meta b/Outline.Core/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset.meta new file mode 100644 index 0000000..354a62d --- /dev/null +++ b/Outline.Core/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 3a6c3b3c5f6e3ad4ab8e09fc219865bd +timeCreated: 1566565181 +licenseType: Pro +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Examples/SimplePerObject.meta b/Outline.Core/Assets/Examples/SimplePerObject.meta new file mode 100644 index 0000000..9c27014 --- /dev/null +++ b/Outline.Core/Assets/Examples/SimplePerObject.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dc9211a2b55b6d44098fcc852d15936c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Examples/SimplePerObject/TestOutlineSettings.asset b/Outline.Core/Assets/Examples/SimplePerObject/TestOutlineSettings.asset new file mode 100644 index 0000000..a32e433 --- /dev/null +++ b/Outline.Core/Assets/Examples/SimplePerObject/TestOutlineSettings.asset @@ -0,0 +1,18 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b579424fd3338724cba3155ee4d53475, type: 3} + m_Name: TestOutlineSettings + m_EditorClassIdentifier: + _outlineColor: {r: 1, g: 0, b: 0, a: 1} + _outlineWidth: 5 + _outlineIntensity: 1 + _outlineMode: 0 diff --git a/Outline.Core/Assets/Examples/SimplePerObject/TestOutlineSettings.asset.meta b/Outline.Core/Assets/Examples/SimplePerObject/TestOutlineSettings.asset.meta new file mode 100644 index 0000000..253e14e --- /dev/null +++ b/Outline.Core/Assets/Examples/SimplePerObject/TestOutlineSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 45705bbb29366194eb01ca517d80967c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Tests.meta b/Outline.Core/Assets/Tests.meta new file mode 100644 index 0000000..ac6bd9e --- /dev/null +++ b/Outline.Core/Assets/Tests.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9c2f662256b33974c94b1b56640a7397 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Tests/Editor.meta b/Outline.Core/Assets/Tests/Editor.meta new file mode 100644 index 0000000..f2ff48e --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f2ad07e44abb5204aa73321dbeb58ddd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Tests/Editor/Scripts.meta b/Outline.Core/Assets/Tests/Editor/Scripts.meta new file mode 100644 index 0000000..f055344 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0678297c303e4104896b2beec616a514 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/Helpers.meta b/Outline.Core/Assets/Tests/Editor/Scripts/Helpers.meta new file mode 100644 index 0000000..75cfe48 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/Helpers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ecd2c4203d2dee74389ff168d633fe3a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs b/Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs new file mode 100644 index 0000000..af05396 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs @@ -0,0 +1,98 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.ComponentModel; +using UnityEngine; +using UnityEngine.TestTools; +using NUnit.Framework; + +namespace UnityFx.Outline +{ + public abstract class IOutlineSettingsExTests : IOutlineSettingsTests + { + private IOutlineSettingsEx _settings; + private IChangeTracking _changeTracking; + + protected void Init(IOutlineSettingsEx settings) + { + _settings = settings; + _changeTracking = settings as IChangeTracking; + base.Init(settings); + } + + [Test] + public void OutlineSettings_SetsValue() + { + var settings = ScriptableObject.CreateInstance(); + + try + { + _settings.OutlineSettings = settings; + + Assert.AreEqual(settings, _settings.OutlineSettings); + + _settings.OutlineSettings = null; + + Assert.IsNull(_settings.OutlineSettings); + } + finally + { + UnityEngine.Object.DestroyImmediate(settings); + } + } + + [Test] + public void OutlineSettings_SetsChanged() + { + if (_changeTracking != null) + { + var settings = ScriptableObject.CreateInstance(); + + try + { + _changeTracking.AcceptChanges(); + _settings.OutlineSettings = settings; + + Assert.IsTrue(_changeTracking.IsChanged); + } + finally + { + UnityEngine.Object.DestroyImmediate(settings); + } + } + } + + [Test] + public void OutlineSettings_DoesNotSetsChangedOnSameValue() + { + if (_changeTracking != null) + { + _changeTracking.AcceptChanges(); + _settings.OutlineSettings = _settings.OutlineSettings; + + Assert.IsFalse(_changeTracking.IsChanged); + } + } + + [Test] + public void OutlineSettings_MakesOtherSettersThrow() + { + var settings = ScriptableObject.CreateInstance(); + + try + { + _settings.OutlineSettings = settings; + + Assert.Throws(() => _settings.OutlineColor = Color.blue); + Assert.Throws(() => _settings.OutlineWidth = 12); + Assert.Throws(() => _settings.OutlineRenderMode = OutlineRenderFlags.Blurred); + Assert.Throws(() => _settings.OutlineIntensity = 17); + } + finally + { + UnityEngine.Object.DestroyImmediate(settings); + } + } + } +} diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs.meta b/Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs.meta new file mode 100644 index 0000000..eacde42 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7d2cd56d59228e40917059e616e5ee9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs b/Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs new file mode 100644 index 0000000..55a2687 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs @@ -0,0 +1,195 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.ComponentModel; +using UnityEngine; +using UnityEngine.TestTools; +using NUnit.Framework; + +namespace UnityFx.Outline +{ + public abstract class IOutlineSettingsTests + { + private IOutlineSettings _settings; + private IChangeTracking _changeTracking; + + protected void Init(IOutlineSettings settings) + { + _settings = settings; + _changeTracking = settings as IChangeTracking; + } + + [Test] + public void OutlineColor_SetsValue() + { + var color = Color.blue; + _settings.OutlineColor = color; + + Assert.AreEqual(color, _settings.OutlineColor); + } + + [Test] + public void OutlineColor_SetsChanged() + { + if (_changeTracking != null) + { + _changeTracking.AcceptChanges(); + _settings.OutlineColor = Color.blue; + + Assert.IsTrue(_changeTracking.IsChanged); + } + } + + [Test] + public void OutlineColor_DoesNotSetsChangedOnSameValue() + { + if (_changeTracking != null) + { + _changeTracking.AcceptChanges(); + _settings.OutlineColor = _settings.OutlineColor; + + Assert.IsFalse(_changeTracking.IsChanged); + } + } + + [Test] + public void OutlineWidth_DefaultValueIsValid() + { + Assert.LessOrEqual(OutlineRenderer.MinWidth, _settings.OutlineWidth); + Assert.GreaterOrEqual(OutlineRenderer.MaxWidth, _settings.OutlineWidth); + } + + [Test] + public void OutlineWidth_SetsValue() + { + var width = UnityEngine.Random.Range(OutlineRenderer.MinWidth, OutlineRenderer.MaxWidth); + _settings.OutlineWidth = width; + + Assert.AreEqual(width, _settings.OutlineWidth); + } + + [Test] + public void OutlineWidth_ClampsValue() + { + _settings.OutlineWidth = 1000; + + Assert.AreEqual(OutlineRenderer.MaxWidth, _settings.OutlineWidth); + + _settings.OutlineWidth = -1000; + + Assert.AreEqual(OutlineRenderer.MinWidth, _settings.OutlineWidth); + } + + [Test] + public void OutlineWidth_SetsChanged() + { + if (_changeTracking != null) + { + _changeTracking.AcceptChanges(); + _settings.OutlineWidth = 10; + + Assert.IsTrue(_changeTracking.IsChanged); + } + } + + [Test] + public void OutlineWidth_DoesNotSetsChangedOnSameValue() + { + if (_changeTracking != null) + { + _changeTracking.AcceptChanges(); + _settings.OutlineWidth = _settings.OutlineWidth; + + Assert.IsFalse(_changeTracking.IsChanged); + } + } + + [Test] + public void OutlineMode_SetsValue() + { + _settings.OutlineRenderMode = OutlineRenderFlags.Blurred; + Assert.AreEqual(OutlineRenderFlags.Blurred, _settings.OutlineRenderMode); + + _settings.OutlineRenderMode = OutlineRenderFlags.Solid; + Assert.AreEqual(OutlineRenderFlags.Solid, _settings.OutlineRenderMode); + } + + [Test] + public void OutlineMode_SetsChanged() + { + if (_changeTracking != null) + { + _changeTracking.AcceptChanges(); + _settings.OutlineRenderMode = OutlineRenderFlags.Blurred; + + Assert.IsTrue(_changeTracking.IsChanged); + } + } + + [Test] + public void OutlineMode_DoesNotSetsChangedOnSameValue() + { + if (_changeTracking != null) + { + _changeTracking.AcceptChanges(); + _settings.OutlineRenderMode = _settings.OutlineRenderMode; + + Assert.IsFalse(_changeTracking.IsChanged); + } + } + + [Test] + public void OutlineIntensity_DefaultValueIsValid() + { + Assert.LessOrEqual(OutlineRenderer.MinIntensity, _settings.OutlineIntensity); + Assert.GreaterOrEqual(OutlineRenderer.MaxIntensity, _settings.OutlineIntensity); + } + + [Test] + public void OutlineIntensity_SetsValue() + { + var intensity = UnityEngine.Random.Range(OutlineRenderer.MinIntensity, OutlineRenderer.MaxIntensity); + + _settings.OutlineIntensity = intensity; + + Assert.AreEqual(intensity, _settings.OutlineIntensity); + } + + [Test] + public void OutlineIntensity_ClampsValue() + { + _settings.OutlineIntensity = 1000; + + Assert.AreEqual(OutlineRenderer.MaxIntensity, _settings.OutlineIntensity); + + _settings.OutlineIntensity = -1000; + + Assert.AreEqual(OutlineRenderer.MinIntensity, _settings.OutlineIntensity); + } + + [Test] + public void OutlineIntensity_SetsChanged() + { + if (_changeTracking != null) + { + _changeTracking.AcceptChanges(); + _settings.OutlineIntensity = 21; + + Assert.IsTrue(_changeTracking.IsChanged); + } + } + + [Test] + public void OutlineIntensity_DoesNotSetsChangedOnSameValue() + { + if (_changeTracking != null) + { + _changeTracking.AcceptChanges(); + _settings.OutlineIntensity = _settings.OutlineIntensity; + + Assert.IsFalse(_changeTracking.IsChanged); + } + } + } +} diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs.meta b/Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs.meta new file mode 100644 index 0000000..57016ed --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 504f7cf5606c25a4a8eeea06598d8cd0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/OutlineBehaviourTests.cs b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineBehaviourTests.cs new file mode 100644 index 0000000..02c4202 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineBehaviourTests.cs @@ -0,0 +1,33 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.TestTools; +using NUnit.Framework; + +namespace UnityFx.Outline +{ + [Category("OutlineBehaviour"), TestOf(typeof(OutlineBehaviour))] + public class OutlineBehaviourTests : IOutlineSettingsExTests, IDisposable + { + private GameObject _go; + private OutlineBehaviour _outlineEffect; + + [SetUp] + public void Init() + { + _go = new GameObject(); + _outlineEffect = _go.AddComponent(); + Init(_outlineEffect); + } + + [TearDown] + public void Dispose() + { + UnityEngine.Object.DestroyImmediate(_go); + } + } +} diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/OutlineBehaviourTests.cs.meta b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineBehaviourTests.cs.meta new file mode 100644 index 0000000..34a74f0 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineBehaviourTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f7ff33caf6306d649ab2176f29f193d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs new file mode 100644 index 0000000..fc19adb --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs @@ -0,0 +1,164 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.TestTools; +using NUnit.Framework; + +namespace UnityFx.Outline +{ + [Category("OutlineLayerCollection"), TestOf(typeof(OutlineLayerCollection))] + public class OutlineLayerCollectionTests : IDisposable + { + private OutlineLayerCollection _layerCollection; + + [SetUp] + public void Init() + { + _layerCollection = ScriptableObject.CreateInstance(); + } + + [TearDown] + public void Dispose() + { + UnityEngine.Object.DestroyImmediate(_layerCollection); + } + + [Test] + public void DefaultStateIsValid() + { + Assert.IsFalse(_layerCollection.IsReadOnly); + Assert.IsEmpty(_layerCollection); + Assert.Zero(_layerCollection.Count); + } + + [Test] + public void Add_ThrowsIfArgumentIsNull() + { + Assert.Throws(() => _layerCollection.Add(null)); + } + + [Test] + public void Add_ThrowsIfLayerBelongsToAnotherCollection() + { + var anotherLayerCollection = ScriptableObject.CreateInstance(); + var layer = new OutlineLayer(); + + try + { + anotherLayerCollection.Add(layer); + Assert.Throws(() => _layerCollection.Add(layer)); + } + finally + { + UnityEngine.Object.DestroyImmediate(anotherLayerCollection); + } + } + + [Test] + public void Add_SetsCount() + { + _layerCollection.Add(new OutlineLayer()); + + Assert.AreEqual(1, _layerCollection.Count); + } + + [Test] + public void Insert_ThrowsIfArgumentIsNull() + { + Assert.Throws(() => _layerCollection.Insert(0, null)); + } + + [Test] + public void Insert_ThrowsIfLayerBelongsToAnotherCollection() + { + var anotherLayerCollection = ScriptableObject.CreateInstance(); + var layer = new OutlineLayer(); + + try + { + anotherLayerCollection.Add(layer); + Assert.Throws(() => _layerCollection.Insert(0, layer)); + } + finally + { + UnityEngine.Object.DestroyImmediate(anotherLayerCollection); + } + } + + [Test] + public void Insert_SetsCount() + { + _layerCollection.Insert(0, new OutlineLayer()); + + Assert.AreEqual(1, _layerCollection.Count); + } + + [Test] + public void Remove_DoesNotThrowOnNullArgument() + { + Assert.DoesNotThrow(() => _layerCollection.Remove(null)); + } + + [Test] + public void Remove_SetsCount() + { + var layer = new OutlineLayer(); + + _layerCollection.Add(layer); + _layerCollection.Remove(layer); + + Assert.Zero(_layerCollection.Count); + } + + [Test] + public void Clear_ResetsCount() + { + _layerCollection.Add(new OutlineLayer()); + _layerCollection.Clear(); + + Assert.Zero(_layerCollection.Count); + } + + [Test] + public void Contains_DoesNotThrowIfArgumentIsNull() + { + _layerCollection.Contains(null); + } + + [Test] + public void Contains_SearchesArgument() + { + var layer = new OutlineLayer(); + + Assert.IsFalse(_layerCollection.Contains(layer)); + + _layerCollection.Add(layer); + + Assert.IsTrue(_layerCollection.Contains(layer)); + } + + [Test] + public void SortedLayers_IsSortedByPriority() + { + var layer1 = new OutlineLayer() + { + Priority = 2 + }; + + var layer2 = new OutlineLayer(); + var layer3 = new OutlineLayer(); + + _layerCollection.Add(layer1); + _layerCollection.Add(layer2); + _layerCollection.Add(layer3); + + Assert.AreEqual(layer2, _layerCollection.SortedLayers[0]); + Assert.AreEqual(layer3, _layerCollection.SortedLayers[1]); + Assert.AreEqual(layer1, _layerCollection.SortedLayers[2]); + } + } +} diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs.meta b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs.meta new file mode 100644 index 0000000..d67e736 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4a6e8c8f29227c2469990a6168c53b3f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerTests.cs b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerTests.cs new file mode 100644 index 0000000..df639c6 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerTests.cs @@ -0,0 +1,117 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.TestTools; +using NUnit.Framework; + +namespace UnityFx.Outline +{ + [Category("OutlineLayer"), TestOf(typeof(OutlineLayer))] + public class OutlineLayerTests : IOutlineSettingsExTests, IDisposable + { + private OutlineLayer _layer; + + [SetUp] + public void Init() + { + _layer = new OutlineLayer("TestLayer"); + Init(_layer); + } + + [TearDown] + public void Dispose() + { + } + + [Test] + public void DefaultStateIsValid() + { + Assert.IsFalse(_layer.IsReadOnly); + Assert.IsEmpty(_layer); + Assert.Zero(_layer.Count); + Assert.AreEqual("TestLayer", _layer.Name); + Assert.AreEqual(-1, _layer.Index); + } + + [Test] + public void Add_ThrowsIfArgumentIsNull() + { + Assert.Throws(() => _layer.Add(null)); + } + + [Test] + public void Add_SetsCount() + { + _layer.Add(new GameObject()); + + Assert.AreEqual(1, _layer.Count); + } + + [Test] + public void Add_FiltersRenderesByLayer() + { + var go = new GameObject("r1", typeof(MeshRenderer)); + var go2 = new GameObject("r2", typeof(MeshRenderer)); + + go2.layer = LayerMask.NameToLayer("TransparentFX"); + go2.transform.SetParent(go.transform, false); + + ICollection r; + + _layer.Add(go, "TransparentFX"); + _layer.TryGetRenderers(go, out r); + + Assert.AreEqual(1, r.Count); + Assert.IsTrue(r.Contains(go.GetComponent())); + Assert.IsFalse(r.Contains(go2.GetComponent())); + } + + [Test] + public void Remove_DoesNotThrowOnNullArgument() + { + Assert.DoesNotThrow(() => _layer.Remove(null)); + } + + [Test] + public void Remove_SetsCount() + { + var go = new GameObject(); + + _layer.Add(go); + _layer.Remove(go); + + Assert.Zero(_layer.Count); + } + + [Test] + public void Clear_ResetsCount() + { + _layer.Add(new GameObject()); + _layer.Clear(); + + Assert.Zero(_layer.Count); + } + + [Test] + public void Contains_DoesNotThrowIfArgumentIsNull() + { + _layer.Contains(null); + } + + [Test] + public void Contains_SearchesArgument() + { + var go = new GameObject(); + + Assert.IsFalse(_layer.Contains(go)); + + _layer.Add(go); + + Assert.IsTrue(_layer.Contains(go)); + } + } +} diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerTests.cs.meta b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerTests.cs.meta new file mode 100644 index 0000000..5f35914 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineLayerTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6372b061875e8a54bb7ca0dbf1bb3e4b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/OutlineRendererTests.cs b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineRendererTests.cs new file mode 100644 index 0000000..e4c83b0 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineRendererTests.cs @@ -0,0 +1,47 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.TestTools; +using NUnit.Framework; + +namespace UnityFx.Outline +{ + [Category("OutlineRenderer"), TestOf(typeof(OutlineRenderer))] + public class OutlineRendererTests : IDisposable + { + private CommandBuffer _commandBuffer; + private OutlineRenderer _renderer; + + [SetUp] + public void Init() + { + _commandBuffer = new CommandBuffer(); + _renderer = new OutlineRenderer(_commandBuffer, BuiltinRenderTextureType.CameraTarget); + } + + [TearDown] + public void Dispose() + { + _commandBuffer.Dispose(); + } + + [Test] + public void Dispose_CanBeCalledMultipleTimes() + { + _renderer.Dispose(); + _renderer.Dispose(); + } + + [Test] + public void RenderSingleObject_ThrowsIfNullArguments() + { + Assert.Throws(() => _renderer.Render(default(IList), null, null)); + Assert.Throws(() => _renderer.Render(default(Renderer), null, null)); + } + } +} diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/OutlineRendererTests.cs.meta b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineRendererTests.cs.meta new file mode 100644 index 0000000..dce56a7 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineRendererTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0c4dcc61e824b6f4f8805dbe543d2997 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/OutlineSettingsTests.cs b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineSettingsTests.cs new file mode 100644 index 0000000..e47efbe --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineSettingsTests.cs @@ -0,0 +1,32 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using UnityEngine.TestTools; +using NUnit.Framework; + +namespace UnityFx.Outline +{ + [Category("OutlineSettings"), TestOf(typeof(OutlineSettings))] + public class OutlineSettingsTests : IOutlineSettingsTests, IDisposable + { + private OutlineSettings _settings; + + [SetUp] + public void Init() + { + _settings = ScriptableObject.CreateInstance(); + Init(_settings); + } + + [TearDown] + public void Dispose() + { + UnityEngine.Object.DestroyImmediate(_settings); + } + } +} diff --git a/Outline.Core/Assets/Tests/Editor/Scripts/OutlineSettingsTests.cs.meta b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineSettingsTests.cs.meta new file mode 100644 index 0000000..297e458 --- /dev/null +++ b/Outline.Core/Assets/Tests/Editor/Scripts/OutlineSettingsTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ee681c20e65b7a34085cd5f07a0c03a5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md b/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md new file mode 100644 index 0000000..c7d442d --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md @@ -0,0 +1,106 @@ +# UnityFx.Outline changelog +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.7.1] - 2020.01.28 + +Bugfixes and project layout changes. + +### Fixed +- Fixed `OutlineBehaviour` to allow changing its state while its `GameObject` is inactive. + +## [0.7.0] - 2019.11.26 + +`MaterialPropertyBlock`-based rendering and [Unity Post-processing Stack v2](https://github.com/Unity-Technologies/PostProcessing/tree/v2) compatibility. + +### Added +- Moved to for `MaterialPropertyBlock`-based rendering. This is in-line with Unity post-processing Stack and is more performant approach. +- Significant optimizations made to `OutlineRenderer`. + +### Changed +- `IOutlineSettings` now implements `IEquatable`. +- Changed all outline shaders to use HLSL-based macros. +- Modified all shaders to ignore MVP vertex transform to be compatible with the new rendering model. +- Exposed rendering APIs for `OutlineLayer` and `OutlineLayerCollection`. + +### Fixed +- Fixed `TiledGPUPerformanceWarning` on mobile targets. + +### Removed +- Removed `OutlineMaterialSet` class. It is not used in `MaterialPropertyBlock`-based effect rendering. + +## [0.6.0] - 2019.09.26 + +Quality of life improvements. + +### Added +- Added `OutlineLayer.Enabled`. +- Added `OutlineLayer.Name`. +- Added possibility to change render order of layers via `OutlineLayer.Priority`. +- Added possibility to edit renderers of an `OutlineLayer`. +- Added possibility to alter `CameraEvent` used to render `OutlineEffect`. +- Added more info to the `OutlineLayer` preview inspector. + +### Changed +- `IOutilneSettings` setters now throw if overriden. + +### Fixed +- Fixed `OutlineLayer.Add` not filtering renderers by the mask passed. + +## [0.5.0] - 2019.09.09 + +Editor UI improvements and unit tests. + +### Added +- Added `OutlineSettings`, that can be shared between dfferent `OutlineLayer` and `OutlineBehaviour` instances. +- Added custom inspectors for `OutlineSettings`, `OutlineLayerCollection`. +- Added undo/redo support to all custom inspectors. +- Added unit-tests. + +### Changed +- Improved inspectors for `OutlineBehaviour` and `OutlineEffect`. + +## [0.4.0] - 2019.08.31 + +Blurred outlines. + +### Added +- Added Gauss blurring to outlines. +- Added outline mode parameter (possible values are `Solid` and `Blurred`). +- Added outline intensity parameter (for blurred outlines only). +- Added `IOutlineSettings` interface to make outline settings the same for `OutlineBehaviour` and `OutlineLayer`. +- Added `OutlineMaterialSet` helper. + +### Changed +- Changed solid outline to use Gauss sampling (to achieve smoother outlines). +- Changed outline implementation to use different passed for horizontal and vertical sampling (to make algorithm complexity linear instead of quadric). + +### Fixed +- Fixed an issue with `OutlineBehaviour` not rendering outlines if attached to a `GameObject` with no renderers. + +### Removed +- Removed `OutlineResourceCache` class. + +## [0.3.0] - 2019.08.27 + +### Added +- Added support for sharing outline layers between `OutlineEffect` instances. +- Added custom editors for `OutlineEffect` and `OutlineBehaviour`. +- Added possibility to setup outline layers as `ScriptableObject` asset. + +### Fixed +- Fixed profiler error 'BeginSample and EndSample count must match'. + +## [0.2.0] - 2019.08.19 + +### Added +- Added `OutlineBehaviour` for rendering per-object outlines. +- Added `OutlineResources` to help initialize outline effects in runtime. +- Added `OutlineRenderer` as low-level helper for outline rendering. + +## [0.1.0] - 2019.08.18 + +### Added +- Initial release. + diff --git a/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md.meta b/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md.meta new file mode 100644 index 0000000..b191c07 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a0afeafc656ad714fbfb0e40dc4587e1 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor.meta b/Outline.Core/Packages/UnityFx.Outline/Editor.meta new file mode 100644 index 0000000..c29e17b --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 155cf68da709a7a4da2ba665007263f2 +folderAsset: yes +timeCreated: 1566558257 +licenseType: Pro +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts.meta b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts.meta new file mode 100644 index 0000000..7da429c --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 15c9c665be3d06048bebd0e20ec2b173 +folderAsset: yes +timeCreated: 1566558344 +licenseType: Pro +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs new file mode 100644 index 0000000..492498a --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs @@ -0,0 +1,84 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; + +namespace UnityFx.Outline +{ + [CustomEditor(typeof(OutlineBehaviour))] + public class OutlineBehaviourEditor : Editor + { + private OutlineBehaviour _effect; + private bool _debugOpened; + private bool _renderersOpened; + private bool _camerasOpened; + + private void OnEnable() + { + _effect = (OutlineBehaviour)target; + } + + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + // 1) Outline settings. + EditorGUI.BeginChangeCheck(); + + OutlineEditorUtility.Render(_effect, _effect); + + if (EditorGUI.EndChangeCheck()) + { + EditorUtility.SetDirty(_effect.gameObject); + + if (!EditorApplication.isPlayingOrWillChangePlaymode) + { + EditorSceneManager.MarkSceneDirty(_effect.gameObject.scene); + } + } + + // 2) Renderers (read-only). + _renderersOpened = EditorGUILayout.Foldout(_renderersOpened, "Renderers", true); + + if (_renderersOpened) + { + EditorGUI.BeginDisabledGroup(true); + EditorGUI.indentLevel += 1; + + var rendererNumber = 1; + + foreach (var renderer in _effect.OutlineRenderers) + { + EditorGUILayout.ObjectField("#" + rendererNumber.ToString(), renderer, typeof(Renderer), true); + rendererNumber++; + } + + EditorGUI.indentLevel -= 1; + EditorGUI.EndDisabledGroup(); + } + + // 3) Cameras (read-only). + _camerasOpened = EditorGUILayout.Foldout(_camerasOpened, "Cameras", true); + + if (_camerasOpened) + { + EditorGUI.BeginDisabledGroup(true); + EditorGUI.indentLevel += 1; + + var cameraNumber = 1; + + foreach (var camera in _effect.Cameras) + { + EditorGUILayout.ObjectField("#" + cameraNumber.ToString(), camera, typeof(Camera), true); + cameraNumber++; + } + + EditorGUI.indentLevel -= 1; + EditorGUI.EndDisabledGroup(); + } + } + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs.meta new file mode 100644 index 0000000..1c3d375 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: a6e77a9d499a86e4fbdc52a2977e774f +timeCreated: 1566572433 +licenseType: Pro +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs new file mode 100644 index 0000000..3f82a55 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs @@ -0,0 +1,201 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace UnityFx.Outline +{ + public static class OutlineEditorUtility + { + public static void RenderDivider(Color color, int thickness = 1, int padding = 5) + { + var r = EditorGUILayout.GetControlRect(GUILayout.Height(padding + thickness)); + + r.height = thickness; + r.y += padding / 2; + r.x -= 2; + + EditorGUI.DrawRect(r, color); + } + + public static void Render(IOutlineSettingsEx settings, UnityEngine.Object undoContext) + { + var obj = (OutlineSettings)EditorGUILayout.ObjectField("Outline Settings", settings.OutlineSettings, typeof(OutlineSettings), true); + + if (settings.OutlineSettings != obj) + { + Undo.RecordObject(undoContext, "Settings"); + settings.OutlineSettings = obj; + } + + if (obj) + { + EditorGUI.BeginDisabledGroup(true); + EditorGUI.indentLevel += 1; + + Render((IOutlineSettings)settings, undoContext); + + EditorGUILayout.HelpBox(string.Format("Outline settings are overriden with values from {0}.", obj.name), MessageType.Info, true); + EditorGUI.indentLevel -= 1; + EditorGUI.EndDisabledGroup(); + } + else + { + EditorGUI.indentLevel += 1; + + Render((IOutlineSettings)settings, undoContext); + + EditorGUI.indentLevel -= 1; + } + } + + public static void Render(IOutlineSettings settings, UnityEngine.Object undoContext) + { + var color = EditorGUILayout.ColorField("Color", settings.OutlineColor); + + if (settings.OutlineColor != color) + { + Undo.RecordObject(undoContext, "Color"); + settings.OutlineColor = color; + } + + var width = EditorGUILayout.IntSlider("Width", settings.OutlineWidth, OutlineRenderer.MinWidth, OutlineRenderer.MaxWidth); + + if (settings.OutlineWidth != width) + { + Undo.RecordObject(undoContext, "Width"); + settings.OutlineWidth = width; + } + + var prevBlurred = (settings.OutlineRenderMode & OutlineRenderFlags.Blurred) != 0; + var blurred = EditorGUILayout.Toggle("Blurred", prevBlurred); + + if (blurred) + { + EditorGUI.indentLevel += 1; + + var i = EditorGUILayout.Slider("Blur Intensity", settings.OutlineIntensity, OutlineRenderer.MinIntensity, OutlineRenderer.MaxIntensity); + + if (!Mathf.Approximately(settings.OutlineIntensity, i)) + { + Undo.RecordObject(undoContext, "Blur Intensity"); + settings.OutlineIntensity = i; + } + + EditorGUI.indentLevel -= 1; + } + + if (blurred != prevBlurred) + { + Undo.RecordObject(undoContext, "Blur"); + + if (blurred) + { + settings.OutlineRenderMode |= OutlineRenderFlags.Blurred; + } + else + { + settings.OutlineRenderMode &= ~OutlineRenderFlags.Blurred; + } + } + + var prevDepthTestEnabled = (settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0; + var depthTestEnabled = EditorGUILayout.Toggle("Depth Test", prevDepthTestEnabled); + + if (depthTestEnabled != prevDepthTestEnabled) + { + Undo.RecordObject(undoContext, "Depth Test"); + + if (depthTestEnabled) + { + settings.OutlineRenderMode |= OutlineRenderFlags.EnableDepthTesting; + } + else + { + settings.OutlineRenderMode &= ~OutlineRenderFlags.EnableDepthTesting; + } + } + } + + public static void RenderPreview(OutlineLayer layer, int layerIndex, bool showObjects) + { + if (layer != null) + { + var goIndex = 1; + + EditorGUILayout.BeginHorizontal(); + EditorGUI.indentLevel += 1; + EditorGUILayout.PrefixLabel("Layer #" + layerIndex.ToString()); + EditorGUI.indentLevel -= 1; + + if (layer.Enabled) + { + EditorGUILayout.LabelField(layer.OutlineRenderMode == OutlineRenderFlags.Solid ? layer.OutlineRenderMode.ToString() : string.Format("Blurred ({0})", layer.OutlineIntensity), GUILayout.MaxWidth(70)); + EditorGUILayout.IntField(layer.OutlineWidth, GUILayout.MaxWidth(100)); + EditorGUILayout.ColorField(layer.OutlineColor, GUILayout.MinWidth(100)); + } + else + { + EditorGUILayout.LabelField("Disabled."); + } + + EditorGUILayout.EndHorizontal(); + + if (showObjects) + { + if (layer.Count > 0) + { + foreach (var go in layer) + { + EditorGUI.indentLevel += 2; + EditorGUILayout.ObjectField("#" + goIndex.ToString(), go, typeof(GameObject), true); + EditorGUI.indentLevel -= 2; + + goIndex++; + } + } + else + { + EditorGUI.indentLevel += 2; + EditorGUILayout.LabelField("No objects."); + EditorGUI.indentLevel -= 2; + } + } + } + else + { + EditorGUILayout.BeginHorizontal(); + EditorGUI.indentLevel += 1; + EditorGUILayout.PrefixLabel("Layer #" + layerIndex.ToString()); + EditorGUI.indentLevel -= 1; + EditorGUILayout.LabelField("Null"); + EditorGUILayout.EndHorizontal(); + } + } + + public static void RenderPreview(IList layers, bool showObjects) + { + EditorGUI.BeginDisabledGroup(true); + + if (layers.Count > 0) + { + for (var i = 0; i < layers.Count; ++i) + { + RenderPreview(layers[i], i, showObjects); + } + } + else + { + EditorGUI.indentLevel += 1; + EditorGUILayout.LabelField("No layers."); + EditorGUI.indentLevel -= 1; + } + + EditorGUI.EndDisabledGroup(); + } + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs.meta new file mode 100644 index 0000000..28953ac --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ba087138029b59d4bbdf0783db0e2606 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs new file mode 100644 index 0000000..fd4c904 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs @@ -0,0 +1,59 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine.Rendering; + +namespace UnityFx.Outline +{ + [CustomEditor(typeof(OutlineEffect))] + public class OutlineEffectEditor : Editor + { + private OutlineEffect _effect; + private bool _debugOpened; + private bool _previewOpened; + + private void OnEnable() + { + _effect = (OutlineEffect)target; + } + + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + EditorGUI.BeginChangeCheck(); + var e = (CameraEvent)EditorGUILayout.EnumPopup("Render Event", _effect.RenderEvent); + + if (e != _effect.RenderEvent) + { + Undo.RecordObject(_effect, "Set Render Event"); + _effect.RenderEvent = e; + } + + if (EditorGUI.EndChangeCheck()) + { + EditorUtility.SetDirty(_effect.gameObject); + + if (!EditorApplication.isPlayingOrWillChangePlaymode) + { + EditorSceneManager.MarkSceneDirty(_effect.gameObject.scene); + } + } + + if (_effect.OutlineLayers.Count > 0) + { + _previewOpened = EditorGUILayout.Foldout(_previewOpened, "Preview", true); + + if (_previewOpened) + { + OutlineEditorUtility.RenderPreview(_effect.OutlineLayers, true); + } + } + } + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs.meta new file mode 100644 index 0000000..4b3f6af --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 03c2e35bb52d2ba44882b92d7cde45bf +timeCreated: 1566558360 +licenseType: Pro +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs new file mode 100644 index 0000000..f0c57e0 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs @@ -0,0 +1,121 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace UnityFx.Outline +{ + [CustomEditor(typeof(OutlineLayerCollection))] + public class OutlineLayerCollectionEditor : Editor + { + private readonly GUILayoutOption _layerButtonStyle = GUILayout.ExpandWidth(false); + private OutlineLayerCollection _layers; + + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + EditorGUI.BeginChangeCheck(); + + var removeLayer = -1; + + // 1) Layers list. + if (_layers.Count > 0) + { + for (var i = 0; i < _layers.Count; i++) + { + EditorGUILayout.Space(); + OutlineEditorUtility.RenderDivider(Color.gray); + + EditorGUILayout.BeginHorizontal(); + var enabled = EditorGUILayout.ToggleLeft("Layer #" + i.ToString(), _layers[i].Enabled, EditorStyles.boldLabel); + + if (enabled != _layers[i].Enabled) + { + if (enabled) + { + Undo.RecordObject(_layers, "Enable Layer"); + } + else + { + Undo.RecordObject(_layers, "Disable Layer"); + } + + _layers[i].Enabled = enabled; + } + + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("Remove", _layerButtonStyle)) + { + removeLayer = i; + } + + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Space(); + + var name = EditorGUILayout.TextField("Layer Name", _layers[i].NameTag); + + if (name != _layers[i].NameTag) + { + Undo.RecordObject(_layers, "Set Layer Name"); + _layers[i].NameTag = name; + } + + var priority = EditorGUILayout.IntField("Layer Priority", _layers[i].Priority); + + if (priority != _layers[i].Priority) + { + Undo.RecordObject(_layers, "Set Layer Priority"); + _layers[i].Priority = priority; + } + + OutlineEditorUtility.Render(_layers[i], _layers); + } + } + else + { + EditorGUILayout.HelpBox("The layer collection is empty.", MessageType.Info, true); + } + + // Add/remove processing. + OutlineEditorUtility.RenderDivider(Color.gray); + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("Add New", _layerButtonStyle)) + { + Undo.RecordObject(_layers, "Add Layer"); + _layers.Add(new OutlineLayer()); + } + + if (GUILayout.Button("Remove All", _layerButtonStyle)) + { + Undo.RecordObject(_layers, "Remove All Layers"); + _layers.Clear(); + } + + if (removeLayer >= 0) + { + Undo.RecordObject(_layers, "Remove Layer"); + _layers.RemoveAt(removeLayer); + } + + EditorGUILayout.EndHorizontal(); + + if (EditorGUI.EndChangeCheck()) + { + EditorUtility.SetDirty(_layers); + } + } + + private void OnEnable() + { + _layers = (OutlineLayerCollection)target; + } + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs.meta new file mode 100644 index 0000000..528a02e --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5f4ec5de59e58794b8e34f2ca3c00199 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs new file mode 100644 index 0000000..efa43c4 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs @@ -0,0 +1,33 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace UnityFx.Outline +{ + [CustomEditor(typeof(OutlineSettings))] + public class OutlineSettingsEditor : Editor + { + private OutlineSettings _settings; + + public override void OnInspectorGUI() + { + EditorGUI.BeginChangeCheck(); + OutlineEditorUtility.Render(_settings, _settings); + + if (EditorGUI.EndChangeCheck()) + { + EditorUtility.SetDirty(_settings); + } + } + + private void OnEnable() + { + _settings = (OutlineSettings)target; + } + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs.meta new file mode 100644 index 0000000..2569298 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 28f2a32d8600f8045a4b9a9916ff8801 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef b/Outline.Core/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef new file mode 100644 index 0000000..04858cc --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef @@ -0,0 +1,16 @@ +{ + "name": "UnityFx.Outline.Editor", + "references": [ + "UnityFx.Outline" + ], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Outline.Core/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef.meta b/Outline.Core/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef.meta new file mode 100644 index 0000000..ec90eb8 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9ce6758f27194b64fadf06ac518b5196 +timeCreated: 1566558329 +licenseType: Pro +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/README.md b/Outline.Core/Packages/UnityFx.Outline/README.md new file mode 100644 index 0000000..2bb00b7 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/README.md @@ -0,0 +1,11 @@ +# UnityFx.Outline + +## SUMMARY +Screen-space outline effects for Unity. + +## USEFUL LINKS +* [Github project](https://github.com/Arvtesh/UnityFx.Outline) +* [npm package](https://www.npmjs.com/package/com.unityfx.outline) +* [Documentation](https://github.com/Arvtesh/UnityFx.Outline/blob/master/README.md) +* [License](https://github.com/Arvtesh/UnityFx.Outline/blob/master/LICENSE.md) +* [Support](mailto:arvtesh@gmail.com) diff --git a/Outline.Core/Packages/UnityFx.Outline/README.md.meta b/Outline.Core/Packages/UnityFx.Outline/README.md.meta new file mode 100644 index 0000000..eb46e78 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/README.md.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4b1c4eed7166ed4429494dc10c2a3d6c +timeCreated: 1566148623 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime.meta new file mode 100644 index 0000000..d5034b4 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: bc6bfa143e596d949867e28985573575 +folderAsset: yes +timeCreated: 1566126961 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Prefabs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Prefabs.meta new file mode 100644 index 0000000..88c5e98 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 82099d138ba6a5c40a5915c4ca5211fe +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset b/Outline.Core/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset new file mode 100644 index 0000000..5b0a0c7 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b503341e0a514e3489c4851727e68257, type: 3} + m_Name: OutlineResources + m_EditorClassIdentifier: + RenderShader: {fileID: 4800000, guid: ac20fbf75bafe454aba5ef3c098349df, type: 3} + HPassShader: {fileID: 4800000, guid: 41c9acbf41c8245498ac9beab378de12, type: 3} + VPassBlendShader: {fileID: 4800000, guid: 1df0cb1700e142f4ca3b28297d3957da, type: 3} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset.meta new file mode 100644 index 0000000..d66452d --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: d28e70f030b1a634db9a6a6d5478ef19 +timeCreated: 1566149572 +licenseType: Free +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts.meta new file mode 100644 index 0000000..fdf3731 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5474ddc00e5e1574cba82c3dbad68ded +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs new file mode 100644 index 0000000..c822837 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs @@ -0,0 +1,45 @@ +// 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 +{ + /// + /// Generic outline settings. + /// + public interface IOutlineSettings : IEquatable + { + /// + /// Gets or sets outline color. + /// + /// + /// + Color OutlineColor { get; set; } + + /// + /// Gets or sets outline width in pixels. Allowed range is [, ]. + /// + /// + /// + int OutlineWidth { get; set; } + + /// + /// Gets or sets outline intensity value. Allowed range is [, ]. + /// This is used for blurred oulines only (i.e. is set to ). + /// + /// + /// + /// + float OutlineIntensity { get; set; } + + /// + /// Gets or sets outline render mode. + /// + /// + /// + /// + OutlineRenderFlags OutlineRenderMode { get; set; } + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs.meta new file mode 100644 index 0000000..688fd30 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: efc18f75d5206f14a80e9306650c858a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs new file mode 100644 index 0000000..0939a90 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs @@ -0,0 +1,19 @@ +// 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 +{ + /// + /// Extended outline settings. + /// + public interface IOutlineSettingsEx : IOutlineSettings + { + /// + /// Gets or sets serializable outline settings. Set this to non- value to share settings with other components. + /// + OutlineSettings OutlineSettings { get; set; } + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs.meta new file mode 100644 index 0000000..73a20da --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d3517d0fef6af540b0b046d3b2421dd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs new file mode 100644 index 0000000..325b329 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs @@ -0,0 +1,372 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; + +namespace UnityFx.Outline +{ + /// + /// Attach this script to a to add outline effect. It can be configured in edit-time or in runtime via scripts. + /// + /// + [ExecuteInEditMode] + [DisallowMultipleComponent] + public sealed class OutlineBehaviour : MonoBehaviour, IOutlineSettingsEx + { + #region data + +#pragma warning disable 0649 + + [SerializeField, Tooltip("Sets outline resources to use. Do not change the defaults unless you know what you're doing.")] + private OutlineResources _outlineResources; + [SerializeField, HideInInspector] + private OutlineSettingsInstance _outlineSettings; + [SerializeField, Tooltip("If set, list of object renderers is updated on each frame. Enable if the object has child renderers which are enabled/disabled frequently.")] + private bool _updateRenderers; + +#pragma warning restore 0649 + + private OutlineRendererCollection _renderers; + private CommandBuffer _commandBuffer; + + private Dictionary _cameraMap = new Dictionary(); + private float _cameraMapUpdateTimer; + + #endregion + + #region interface + + /// + /// Gets or sets resources used by the effect implementation. + /// + /// Thrown if setter argument is . + public OutlineResources OutlineResources + { + get + { + return _outlineResources; + } + set + { + if (value == null) + { + throw new ArgumentNullException("OutlineResources"); + } + + if (_outlineResources != value) + { + CreateSettingsIfNeeded(); + + _outlineResources = value; + _outlineSettings.OutlineResources = _outlineResources; + } + } + } + + /// + /// Gets outline renderers. By default all child components are used for outlining. + /// + public ICollection OutlineRenderers + { + get + { + CreateRenderersIfNeeded(); + return _renderers; + } + } + + /// + /// Gets all cameras outline data is rendered to. + /// + public ICollection Cameras + { + get + { + return _cameraMap.Keys; + } + } + + #endregion + + #region MonoBehaviour + + private void Awake() + { + CreateRenderersIfNeeded(); + CreateSettingsIfNeeded(); + + _outlineSettings.OutlineResources = _outlineResources; + } + + private void OnDestroy() + { + if (_outlineSettings != null) + { + _outlineSettings.OutlineResources = null; + } + } + + private void OnEnable() + { + CreateCommandBufferIfNeeded(); + Camera.onPreRender += OnCameraPreRender; + } + + private void OnDisable() + { + Camera.onPreRender -= OnCameraPreRender; + + foreach (var kvp in _cameraMap) + { + if (kvp.Key) + { + kvp.Key.RemoveCommandBuffer(OutlineRenderer.RenderEvent, kvp.Value); + } + } + + _cameraMap.Clear(); + + if (_commandBuffer != null) + { + _commandBuffer.Dispose(); + _commandBuffer = null; + } + } + + private void Update() + { + _cameraMapUpdateTimer += Time.deltaTime; + + if (_cameraMapUpdateTimer > 16) + { + RemoveDestroyedCameras(); + _cameraMapUpdateTimer = 0; + } + + if (_outlineResources != null && _renderers != null) + { + if (_updateRenderers) + { + _renderers.Reset(false); + } + + _commandBuffer.Clear(); + + using (var renderer = new OutlineRenderer(_commandBuffer, BuiltinRenderTextureType.CameraTarget)) + { + renderer.Render(_renderers.GetList(), _outlineSettings.OutlineResources, _outlineSettings); + } + } + } + +#if UNITY_EDITOR + + private void OnValidate() + { + CreateRenderersIfNeeded(); + CreateCommandBufferIfNeeded(); + CreateSettingsIfNeeded(); + + _outlineSettings.OutlineResources = _outlineResources; + } + + private void Reset() + { + if (_outlineSettings != null) + { + _outlineSettings.OutlineResources = _outlineResources; + } + + if (_renderers != null) + { + _renderers.Reset(true); + } + } + +#endif + + #endregion + + #region IOutlineSettingsEx + + /// + /// Gets or sets outline settings. Set this to non- value to share settings with other components. + /// + public OutlineSettings OutlineSettings + { + get + { + if (_outlineSettings == null) + { + _outlineSettings = new OutlineSettingsInstance(); + } + + return _outlineSettings.OutlineSettings; + } + set + { + if (_outlineSettings == null) + { + _outlineSettings = new OutlineSettingsInstance(); + } + + _outlineSettings.OutlineSettings = value; + } + } + + #endregion + + #region IOutlineSettings + + /// + public Color OutlineColor + { + get + { + CreateSettingsIfNeeded(); + return _outlineSettings.OutlineColor; + } + set + { + CreateSettingsIfNeeded(); + _outlineSettings.OutlineColor = value; + } + } + + /// + public int OutlineWidth + { + get + { + CreateSettingsIfNeeded(); + return _outlineSettings.OutlineWidth; + } + set + { + CreateSettingsIfNeeded(); + _outlineSettings.OutlineWidth = value; + } + } + + /// + public float OutlineIntensity + { + get + { + CreateSettingsIfNeeded(); + return _outlineSettings.OutlineIntensity; + } + set + { + CreateSettingsIfNeeded(); + _outlineSettings.OutlineIntensity = value; + } + } + + /// + public OutlineRenderFlags OutlineRenderMode + { + get + { + CreateSettingsIfNeeded(); + return _outlineSettings.OutlineRenderMode; + } + set + { + CreateSettingsIfNeeded(); + _outlineSettings.OutlineRenderMode = value; + } + } + + #endregion + + #region IEquatable + + /// + public bool Equals(IOutlineSettings other) + { + return OutlineSettings.Equals(_outlineSettings, other); + } + + #endregion + + #region implementation + + private void OnCameraPreRender(Camera camera) + { + if (camera) + { + if (_outlineSettings.RequiresCameraDepth) + { + camera.depthTextureMode |= DepthTextureMode.Depth; + } + + if (!_cameraMap.ContainsKey(camera)) + { + camera.AddCommandBuffer(OutlineRenderer.RenderEvent, _commandBuffer); + _cameraMap.Add(camera, _commandBuffer); + } + } + } + + private void RemoveDestroyedCameras() + { + List camerasToRemove = null; + + foreach (var camera in _cameraMap.Keys) + { + if (camera == null) + { + if (camerasToRemove != null) + { + camerasToRemove.Add(camera); + } + else + { + camerasToRemove = new List() { camera }; + } + } + } + + if (camerasToRemove != null) + { + foreach (var camera in camerasToRemove) + { + _cameraMap.Remove(camera); + } + } + } + + private void CreateCommandBufferIfNeeded() + { + if (_commandBuffer == null) + { + _commandBuffer = new CommandBuffer(); + _commandBuffer.name = string.Format("{0} - {1}", GetType().Name, name); + } + } + + private void CreateSettingsIfNeeded() + { + if (_outlineSettings == null) + { + _outlineSettings = new OutlineSettingsInstance(_outlineResources); + } + } + + private void CreateRenderersIfNeeded() + { + if (_renderers == null) + { + _renderers = new OutlineRendererCollection(gameObject); + _renderers.Reset(true); + } + } + + #endregion + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs.meta new file mode 100644 index 0000000..a9c85ed --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 271c580db5fd384429cdac899152e9e0 +timeCreated: 1566149857 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: + - _outlineResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, + type: 2} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs new file mode 100644 index 0000000..a4bacb8 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs @@ -0,0 +1,240 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; + +namespace UnityFx.Outline +{ + /// + /// Renders outlines at specific camera. Should be attached to camera to function. + /// + /// + /// + /// + /// + [DisallowMultipleComponent] + [RequireComponent(typeof(Camera))] + public sealed partial class OutlineEffect : MonoBehaviour + { + #region data + + [SerializeField, Tooltip("Sets outline resources to use. Do not change the defaults unless you know what you're doing.")] + private OutlineResources _outlineResources; + [SerializeField, Tooltip("Collection of outline layers to use. This can be used to share outline settings between multiple cameras.")] + private OutlineLayerCollection _outlineLayers; + [SerializeField, HideInInspector] + private CameraEvent _cameraEvent = OutlineRenderer.RenderEvent; + + private CommandBuffer _commandBuffer; + + #endregion + + #region interface + + /// + /// Gets or sets resources used by the effect implementation. + /// + /// Thrown if setter argument is . + public OutlineResources OutlineResources + { + get + { + return _outlineResources; + } + set + { + if (ReferenceEquals(value, null)) + { + throw new ArgumentNullException("OutlineResources"); + } + + _outlineResources = value; + } + } + + /// + /// Gets collection of outline layers. + /// + /// + public IList OutlineLayers + { + get + { + CreateLayersIfNeeded(); + return _outlineLayers; + } + } + + /// + /// Gets or sets used to render the outlines. + /// + public CameraEvent RenderEvent + { + get + { + return _cameraEvent; + } + set + { + if (_cameraEvent != value) + { + if (_commandBuffer != null) + { + var camera = GetComponent(); + + if (camera) + { + camera.RemoveCommandBuffer(_cameraEvent, _commandBuffer); + camera.AddCommandBuffer(value, _commandBuffer); + } + } + + _cameraEvent = value; + } + } + } + + /// + /// Adds the passed to the first outline layer. Creates the layer if needed. + /// + /// The to add and render outline for. + /// + public void AddGameObject(GameObject go) + { + AddGameObject(go, 0); + } + + /// + /// Adds the passed to the specified outline layer. Creates the layer if needed. + /// + /// The to add and render outline for. + /// + public void AddGameObject(GameObject go, int layerIndex) + { + if (layerIndex < 0) + { + throw new ArgumentOutOfRangeException("layerIndex"); + } + + CreateLayersIfNeeded(); + + while (_outlineLayers.Count <= layerIndex) + { + _outlineLayers.Add(new OutlineLayer()); + } + + _outlineLayers[layerIndex].Add(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() + { + } + + private void OnEnable() + { + var camera = GetComponent(); + + if (camera) + { + _commandBuffer = new CommandBuffer + { + name = string.Format("{0} - {1}", GetType().Name, name) + }; + + camera.depthTextureMode |= DepthTextureMode.Depth; + camera.AddCommandBuffer(_cameraEvent, _commandBuffer); + } + } + + private void OnDisable() + { + var camera = GetComponent(); + + if (camera) + { + camera.RemoveCommandBuffer(_cameraEvent, _commandBuffer); + } + + if (_commandBuffer != null) + { + _commandBuffer.Dispose(); + _commandBuffer = null; + } + } + + private void Update() + { + if (_outlineLayers) + { + FillCommandBuffer(); + } + } + + private void OnDestroy() + { + // TODO: Find a way to do this once per OutlineLayerCollection instance. + if (_outlineLayers) + { + _outlineLayers.Reset(); + } + } + +#if UNITY_EDITOR + + private void Reset() + { + _outlineLayers = null; + } + +#endif + + #endregion + + #region implementation + + private void FillCommandBuffer() + { + _commandBuffer.Clear(); + + if (_outlineResources && _outlineResources.IsValid) + { + using (var renderer = new OutlineRenderer(_commandBuffer, BuiltinRenderTextureType.CameraTarget)) + { + _outlineLayers.Render(renderer, _outlineResources); + } + } + } + + private void CreateLayersIfNeeded() + { + if (ReferenceEquals(_outlineLayers, null)) + { + _outlineLayers = ScriptableObject.CreateInstance(); + _outlineLayers.name = "OutlineLayers"; + } + } + + #endregion + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs.meta new file mode 100644 index 0000000..1044087 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 270d3185d159bf54fb4cddbb42235437 +timeCreated: 1566149591 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: + - _outlineResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, + type: 2} + 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 new file mode 100644 index 0000000..eac4774 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs @@ -0,0 +1,494 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using UnityEngine; + +namespace UnityFx.Outline +{ + /// + /// A collection of instances that share outline settings. An + /// can only belong to one at time. + /// + /// + /// + [Serializable] + public sealed partial class OutlineLayer : ICollection, IOutlineSettingsEx + { + #region data + + [SerializeField, HideInInspector] + private OutlineSettingsInstance _settings = new OutlineSettingsInstance(); + [SerializeField, HideInInspector] + private string _name; + [SerializeField, HideInInspector] + private int _zOrder; + [SerializeField, HideInInspector] + private bool _enabled = true; + + private OutlineLayerCollection _parentCollection; + private Dictionary _outlineObjects = new Dictionary(); + + #endregion + + #region interface + + /// + /// Gets the layer name. + /// + public string Name + { + get + { + if (string.IsNullOrEmpty(_name)) + { + return "OutlineLayer #" + Index.ToString(); + } + + return _name; + } + } + + /// + /// Gets or sets a value indicating whether the layer is enabled. + /// + /// + public bool Enabled + { + get + { + return _enabled; + } + set + { + _enabled = value; + } + } + + /// + /// Gets or sets the layer priority. Layers with greater values are rendered on top of layers with lower priority. + /// Layers with equal priorities are rendered according to index in parent collection. + /// + /// + public int Priority + { + get + { + return _zOrder; + } + set + { + if (_zOrder != value) + { + if (_parentCollection != null) + { + _parentCollection.SetOrderChanged(); + } + + _zOrder = value; + } + } + } + + /// + /// Gets index of the layer in parent collection. + /// + public int Index + { + get + { + if (_parentCollection != null) + { + return _parentCollection.IndexOf(this); + } + + return -1; + } + } + + /// + /// Initializes a new instance of the class. + /// + public OutlineLayer() + { + } + + /// + /// Initializes a new instance of the class. + /// + public OutlineLayer(string name) + { + _name = name; + } + + /// + /// Initializes a new instance of the class. + /// + /// Thrown if is . + public OutlineLayer(OutlineSettings settings) + { + if (ReferenceEquals(settings, null)) + { + throw new ArgumentNullException("settings"); + } + + _settings.OutlineSettings = settings; + } + + /// + /// Initializes a new instance of the class. + /// + /// Thrown if is . + public OutlineLayer(string name, OutlineSettings settings) + { + if (ReferenceEquals(settings, null)) + { + throw new ArgumentNullException("settings"); + } + + _name = name; + _settings.OutlineSettings = settings; + } + + /// + /// Adds a new object to the layer. + /// + /// Thrown if is . + public void Add(GameObject go, int ignoreLayerMask) + { + if (ReferenceEquals(go, null)) + { + throw new ArgumentNullException("go"); + } + + if (!_outlineObjects.ContainsKey(go)) + { + var renderers = new OutlineRendererCollection(go); + renderers.Reset(false, ignoreLayerMask); + _outlineObjects.Add(go, renderers); + } + } + + /// + /// Adds a new object to the layer. + /// + /// Thrown if is . + public void Add(GameObject go, string ignoreLayer) + { + Add(go, 1 << LayerMask.NameToLayer(ignoreLayer)); + } + + /// + /// Attempts to get renderers assosiated with the specified . + /// + /// Thrown if is . + public bool TryGetRenderers(GameObject go, out ICollection renderers) + { + if (ReferenceEquals(go, null)) + { + throw new ArgumentNullException("go"); + } + + OutlineRendererCollection result; + + if (_outlineObjects.TryGetValue(go, out result)) + { + renderers = result; + return true; + } + + renderers = null; + return false; + } + + /// + /// Renders the layers. + /// + public void Render(OutlineRenderer renderer, OutlineResources resources) + { + if (_enabled) + { + _settings.OutlineResources = resources; + + foreach (var kvp in _outlineObjects) + { + if (kvp.Key && kvp.Key.activeInHierarchy) + { + renderer.Render(kvp.Value.GetList(), resources, _settings); + } + } + } + } + + #endregion + + #region internals + + internal string NameTag + { + get + { + return _name; + } + set + { + _name = value; + } + } + + internal OutlineLayerCollection ParentCollection + { + get + { + return _parentCollection; + } + } + + internal void Reset() + { + _settings.OutlineResources = null; + _outlineObjects.Clear(); + } + + internal void SetCollection(OutlineLayerCollection collection) + { + if (_parentCollection == null || collection == null || _parentCollection == collection) + { + _parentCollection = collection; + } + else + { + throw new InvalidOperationException("OutlineLayer can only belong to a single OutlineLayerCollection."); + } + } + + #endregion + + #region IOutlineSettingsEx + + /// + /// Gets or sets outline settings. Set this to non- value to share settings with other components. + /// + public OutlineSettings OutlineSettings + { + get + { + return _settings.OutlineSettings; + } + set + { + _settings.OutlineSettings = value; + } + } + + #endregion + + #region IOutlineSettings + + /// + public Color OutlineColor + { + get + { + return _settings.OutlineColor; + } + set + { + _settings.OutlineColor = value; + } + } + + /// + public int OutlineWidth + { + get + { + return _settings.OutlineWidth; + } + set + { + _settings.OutlineWidth = value; + } + } + + /// + public float OutlineIntensity + { + get + { + return _settings.OutlineIntensity; + } + set + { + _settings.OutlineIntensity = value; + } + } + + /// + public OutlineRenderFlags OutlineRenderMode + { + get + { + return _settings.OutlineRenderMode; + } + set + { + _settings.OutlineRenderMode = value; + } + } + + #endregion + + #region ICollection + + /// + public int Count + { + get + { + return _outlineObjects.Count; + } + } + + /// + public bool IsReadOnly + { + get + { + return false; + } + } + + /// + public void Add(GameObject go) + { + Add(go, 0); + } + + /// + public bool Remove(GameObject go) + { + if (!ReferenceEquals(go, null)) + { + return _outlineObjects.Remove(go); + } + + return false; + } + + /// + public bool Contains(GameObject go) + { + if (ReferenceEquals(go, null)) + { + return false; + } + + return _outlineObjects.ContainsKey(go); + } + + /// + public void Clear() + { + _outlineObjects.Clear(); + } + + /// + public void CopyTo(GameObject[] array, int arrayIndex) + { + _outlineObjects.Keys.CopyTo(array, arrayIndex); + } + + #endregion + + #region IEnumerable + + /// + public IEnumerator GetEnumerator() + { + return _outlineObjects.Keys.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _outlineObjects.Keys.GetEnumerator(); + } + + #endregion + + #region IEquatable + + /// + public bool Equals(IOutlineSettings other) + { + return OutlineSettings.Equals(this, other); + } + + #endregion + + #region Object + + /// + public override string ToString() + { + var text = new StringBuilder(); + + if (string.IsNullOrEmpty(_name)) + { + text.Append("OutlineLayer"); + } + else + { + text.Append(_name); + } + + if (_parentCollection != null) + { + text.Append(" #"); + text.Append(_parentCollection.IndexOf(this)); + } + + if (_zOrder > 0) + { + text.Append(" z"); + text.Append(_zOrder); + } + + if (_outlineObjects.Count > 0) + { + text.Append(" ("); + + foreach (var go in _outlineObjects.Keys) + { + text.Append(go.name); + text.Append(", "); + } + + text.Remove(text.Length - 2, 2); + text.Append(")"); + } + + return string.Format("{0}", text); + } + + /// + public override bool Equals(object other) + { + return OutlineSettings.Equals(this, other as IOutlineSettings); + } + + /// + public override int GetHashCode() + { + return base.GetHashCode(); + } + + #endregion + + #region implementation + #endregion + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs.meta new file mode 100644 index 0000000..f199256 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 1360e19784ddfac45a7dcb6ba39595ed +timeCreated: 1566130871 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs new file mode 100644 index 0000000..d28f982 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs @@ -0,0 +1,291 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace UnityFx.Outline +{ + /// + /// A serializable collection of outline layers. + /// + /// + /// + /// + [CreateAssetMenu(fileName = "OutlineLayerCollection", menuName = "UnityFx/Outline/Outline Layer Collection")] + public sealed class OutlineLayerCollection : ScriptableObject, IList + { + #region data + + private class OutlineLayerComparer : IComparer + { + public int Compare(OutlineLayer x, OutlineLayer y) + { + return x.Priority - y.Priority; + } + } + + [SerializeField, HideInInspector] + private List _layers = new List(); + + private List _sortedLayers = new List(); + private OutlineLayerComparer _sortComparer = new OutlineLayerComparer(); + private bool _orderChanged = true; + + #endregion + + #region interface + + /// + /// Gets layers ordered by . + /// + public OutlineLayer[] SortedLayers + { + get + { + UpdateSortedLayersIfNeeded(); + return _sortedLayers.ToArray(); + } + } + + /// + /// Renders all layers. + /// + public void Render(OutlineRenderer renderer, OutlineResources resources) + { + UpdateSortedLayersIfNeeded(); + + foreach (var layer in _sortedLayers) + { + layer.Render(renderer, resources); + } + } + + #endregion + + #region internals + + internal void SetOrderChanged() + { + _orderChanged = true; + } + + internal void Reset() + { + foreach (var layer in _layers) + { + layer.Reset(); + } + } + + #endregion + + #region ScriptableObject + + private void OnEnable() + { + foreach (var layer in _layers) + { + layer.SetCollection(this); + } + + _orderChanged = true; + } + + #endregion + + #region IList + + /// + public OutlineLayer this[int layerIndex] + { + get + { + return _layers[layerIndex]; + } + set + { + if (value == null) + { + throw new ArgumentNullException("layer"); + } + + if (layerIndex < 0 || layerIndex >= _layers.Count) + { + throw new ArgumentOutOfRangeException("layerIndex"); + } + + if (_layers[layerIndex] != value) + { + value.SetCollection(this); + + _layers[layerIndex].SetCollection(null); + _layers[layerIndex] = value; + + _orderChanged = true; + } + } + } + + /// + public int IndexOf(OutlineLayer layer) + { + if (layer != null) + { + return _layers.IndexOf(layer); + } + + return -1; + } + + /// + public void Insert(int index, OutlineLayer layer) + { + if (layer == null) + { + throw new ArgumentNullException("layer"); + } + + if (layer.ParentCollection != this) + { + layer.SetCollection(this); + + _layers.Insert(index, layer); + + _orderChanged = true; + } + } + + /// + public void RemoveAt(int index) + { + if (index >= 0 && index < _layers.Count) + { + _layers[index].SetCollection(null); + _layers.RemoveAt(index); + + _orderChanged = true; + } + } + + #endregion + + #region ICollection + + /// + public int Count + { + get + { + return _layers.Count; + } + } + + /// + public bool IsReadOnly + { + get + { + return false; + } + } + + /// + public void Add(OutlineLayer layer) + { + if (layer == null) + { + throw new ArgumentNullException("layer"); + } + + if (layer.ParentCollection != this) + { + layer.SetCollection(this); + + _layers.Add(layer); + _orderChanged = true; + } + } + + /// + public bool Remove(OutlineLayer layer) + { + if (_layers.Remove(layer)) + { + layer.SetCollection(null); + + _sortedLayers.Remove(layer); + + return true; + } + + return false; + } + + /// + public void Clear() + { + if (_layers.Count > 0) + { + foreach (var layer in _layers) + { + layer.SetCollection(null); + } + + _layers.Clear(); + _sortedLayers.Clear(); + } + } + + /// + public bool Contains(OutlineLayer layer) + { + if (layer == null) + { + return false; + } + + return _layers.Contains(layer); + } + + /// + public void CopyTo(OutlineLayer[] array, int arrayIndex) + { + _layers.CopyTo(array, arrayIndex); + } + + #endregion + + #region IEnumerable + + /// + public IEnumerator GetEnumerator() + { + return _layers.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _layers.GetEnumerator(); + } + + #endregion + + #region implementation + + private void UpdateSortedLayersIfNeeded() + { + if (_orderChanged) + { + _sortedLayers.Clear(); + _sortedLayers.AddRange(_layers); + _sortedLayers.Sort(_sortComparer); + _orderChanged = false; + } + } + + #endregion + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs.meta new file mode 100644 index 0000000..3b46761 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 57d0c11168277cf4eb3b4b89706e6aa5 +timeCreated: 1566560091 +licenseType: Pro +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs new file mode 100644 index 0000000..c911c0d --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs @@ -0,0 +1,29 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; + +namespace UnityFx.Outline +{ + /// + /// Enumerates outline render modes. + /// + [Flags] + public enum OutlineRenderFlags + { + /// + /// Outline frame is a solid line. + /// + Solid = 0, + + /// + /// Outline frame is blurred. + /// + Blurred = 1, + + /// + /// Enabled depth testing when rendering object outlines. Only visible parts of objects are outlined. + /// + EnableDepthTesting = 0x100 + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs.meta new file mode 100644 index 0000000..8c8d06c --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 836bd13bd33c59246b1cebab92f8e62a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs new file mode 100644 index 0000000..3569cf7 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs @@ -0,0 +1,493 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; + +namespace UnityFx.Outline +{ + /// + /// Helper class for outline rendering with . + /// + /// + /// The class can be used on its own or as part of a higher level systems. It is used + /// by higher level outline implementations ( and + /// ). It is fully compatible with Unity post processing stack as well. + /// The class implements to be used inside + /// block as shown in the code samples. Disposing does not dispose + /// the corresponding . + /// Command buffer is not cleared before rendering. It is user responsibility to do so if needed. + /// + /// + /// var commandBuffer = new CommandBuffer(); + /// + /// using (var renderer = new OutlineRenderer(commandBuffer, BuiltinRenderTextureType.CameraTarget)) + /// { + /// renderer.Render(renderers, resources, settings); + /// } + /// + /// camera.AddCommandBuffer(CameraEvent.BeforeImageEffects, commandBuffer); + /// + /// + /// [Preserve] + /// public class OutlineEffectRenderer : PostProcessEffectRenderer + /// { + /// public override void Init() + /// { + /// base.Init(); + /// + /// // Reuse fullscreen triangle mesh from PostProcessing (do not create own). + /// settings.OutlineResources.FullscreenTriangleMesh = RuntimeUtilities.fullscreenTriangle; + /// } + /// + /// public override void Render(PostProcessRenderContext context) + /// { + /// var resources = settings.OutlineResources; + /// var layers = settings.OutlineLayers; + /// + /// if (resources && resources.IsValid && layers) + /// { + /// // No need to setup property sheet parameters, all the rendering staff is handled by the OutlineRenderer. + /// using (var renderer = new OutlineRenderer(context.command, context.source, context.destination)) + /// { + /// layers.Render(renderer, resources); + /// } + /// } + /// } + /// } + /// + /// + public struct OutlineRenderer : IDisposable + { + #region data + + private static readonly int _mainRtId = Shader.PropertyToID("_MainTex"); + private static readonly int _maskRtId = Shader.PropertyToID("_MaskTex"); + private static readonly int _hPassRtId = Shader.PropertyToID("_HPassTex"); + + private readonly RenderTargetIdentifier _source; + private readonly RenderTargetIdentifier _destination; + private readonly CommandBuffer _commandBuffer; + + #endregion + + #region interface + + /// + /// A default outline rendering should be assosiated with. + /// + public const CameraEvent RenderEvent = CameraEvent.BeforeImageEffects; + + /// + /// Name of the outline effect. + /// + public const string EffectName = "Outline"; + + /// + /// Minimum value of outline width parameter. + /// + /// + public const int MinWidth = 1; + + /// + /// Maximum value of outline width parameter. + /// + /// + public const int MaxWidth = 32; + + /// + /// Minimum value of outline intensity parameter. + /// + /// + /// + public const int MinIntensity = 1; + + /// + /// Maximum value of outline intensity parameter. + /// + /// + /// + public const int MaxIntensity = 64; + + /// + /// Value of outline intensity parameter that is treated as solid fill. + /// + /// + /// + public const int SolidIntensity = 100; + + /// + /// Initializes a new instance of the struct. + /// + /// A to render the effect to. It should be cleared manually (if needed) before passing to this method. + /// Render target. + /// Thrown if is . + public OutlineRenderer(CommandBuffer commandBuffer, BuiltinRenderTextureType rt) + : this(commandBuffer, rt, rt, Vector2Int.zero) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// A to render the effect to. It should be cleared manually (if needed) before passing to this method. + /// Render target. + /// Thrown if is . + public OutlineRenderer(CommandBuffer commandBuffer, RenderTargetIdentifier rt) + : this(commandBuffer, rt, rt, Vector2Int.zero) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// A to render the effect to. It should be cleared manually (if needed) before passing to this method. + /// Source image. Can be the same as . + /// Render target. + /// Thrown if is . + public OutlineRenderer(CommandBuffer commandBuffer, RenderTargetIdentifier src, RenderTargetIdentifier dst) + : this(commandBuffer, src, dst, Vector2Int.zero) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// A to render the effect to. It should be cleared manually (if needed) before passing to this method. + /// Source image. Can be the same as . + /// Render target. + /// Size of the temporaty render textures. + /// Thrown if is . + public OutlineRenderer(CommandBuffer commandBuffer, RenderTargetIdentifier src, RenderTargetIdentifier dst, Vector2Int rtSize) + { + if (commandBuffer == null) + { + throw new ArgumentNullException("commandBuffer"); + } + + var cx = rtSize.x > 0 ? rtSize.x : -1; + var cy = rtSize.y > 0 ? rtSize.y : -1; + + _source = src; + _destination = dst; + + _commandBuffer = commandBuffer; + _commandBuffer.BeginSample(EffectName); + _commandBuffer.GetTemporaryRT(_maskRtId, cx, cy, 0, FilterMode.Bilinear, RenderTextureFormat.R8); + _commandBuffer.GetTemporaryRT(_hPassRtId, cx, cy, 0, FilterMode.Bilinear, RenderTextureFormat.R8); + + // Need to copy src content into dst if they are not the same. For instance this is the case when rendering + // the outline effect as part of Unity Post Processing stack. + if (!src.Equals(dst)) + { + if (SystemInfo.copyTextureSupport > CopyTextureSupport.None) + { + _commandBuffer.CopyTexture(src, dst); + } + else + { +#if UNITY_2018_2_OR_NEWER + _commandBuffer.SetRenderTarget(dst, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store); +#else + _commandBuffer.SetRenderTarget(dst); +#endif + _commandBuffer.Blit(src, BuiltinRenderTextureType.CurrentActive); + } + } + } + + /// + /// Renders outline around a single object. This version allows enumeration of with no GC allocations. + /// + /// One or more renderers representing a single object to be outlined. + /// Outline resources. + /// Outline settings. + /// Thrown if any of the arguments is . + /// + /// + public void Render(IList renderers, OutlineResources resources, IOutlineSettings settings) + { + if (renderers == null) + { + throw new ArgumentNullException("renderers"); + } + + if (resources == null) + { + throw new ArgumentNullException("resources"); + } + + if (settings == null) + { + throw new ArgumentNullException("settings"); + } + + Init(resources, settings); + RenderObject(resources, settings, renderers); + RenderHPass(resources, settings); + RenderVPassBlend(resources, settings); + } + + /// + /// Renders outline around a single object. + /// + /// One or more renderers representing a single object to be outlined. + /// Outline resources. + /// Outline settings. + /// Thrown if any of the arguments is . + /// + /// + public void Render(IEnumerable renderers, OutlineResources resources, IOutlineSettings settings) + { + if (renderers == null) + { + throw new ArgumentNullException("renderers"); + } + + if (resources == null) + { + throw new ArgumentNullException("resources"); + } + + if (settings == null) + { + throw new ArgumentNullException("settings"); + } + + Init(resources, settings); + RenderObject(resources, settings, renderers); + RenderHPass(resources, settings); + RenderVPassBlend(resources, settings); + } + + /// + /// Renders outline around a single object. + /// + /// A representing an object to be outlined. + /// Outline resources. + /// Outline settings. + /// Thrown if any of the arguments is . + /// + /// + public void Render(Renderer renderer, OutlineResources resources, IOutlineSettings settings) + { + if (renderer == null) + { + throw new ArgumentNullException("renderers"); + } + + if (resources == null) + { + throw new ArgumentNullException("resources"); + } + + if (settings == null) + { + throw new ArgumentNullException("settings"); + } + + Init(resources, settings); + RenderObject(resources, settings, renderer); + RenderHPass(resources, settings); + RenderVPassBlend(resources, settings); + } + + /// + /// Calculates value of Gauss function for the specified and values. + /// + /// + /// + public static float Gauss(float x, float stdDev) + { + var stdDev2 = stdDev * stdDev * 2; + var a = 1 / Mathf.Sqrt((float)Math.PI * stdDev2); + var gauss = a * Mathf.Pow((float)Math.E, -x * x / stdDev2); + + return gauss; + } + + /// + /// Samples Gauss function for the specified . + /// + /// + public static float[] GetGaussSamples(int width, float[] samples) + { + // NOTE: According to '3 sigma' rule there is no reason to have StdDev less then width / 3. + // In practice blur looks best when StdDev is within range [width / 3, width / 2]. + var stdDev = width * 0.5f; + + if (samples == null) + { + samples = new float[MaxWidth]; + } + + for (var i = 0; i < width; i++) + { + samples[i] = Gauss(i, stdDev); + } + + return samples; + } + + #endregion + + #region IDisposable + + /// + /// Finalizes the effect rendering and releases temporary textures used. Should only be called once. + /// + public void Dispose() + { + _commandBuffer.ReleaseTemporaryRT(_hPassRtId); + _commandBuffer.ReleaseTemporaryRT(_maskRtId); + _commandBuffer.EndSample(EffectName); + } + + #endregion + + #region implementation + + private void Init(OutlineResources resources, IOutlineSettings settings) + { + _commandBuffer.SetGlobalFloatArray(resources.GaussSamplesId, resources.GetGaussSamples(settings.OutlineWidth)); + } + + private void RenderObjectClear(bool depthTestEnabled) + { + if (depthTestEnabled) + { + // NOTE: Use the camera depth buffer when rendering the mask. Shader only reads from the depth buffer (ZWrite Off). +#if UNITY_2018_2_OR_NEWER + _commandBuffer.SetRenderTarget(_maskRtId, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, BuiltinRenderTextureType.Depth, RenderBufferLoadAction.Load, RenderBufferStoreAction.DontCare); +#else + _commandBuffer.SetRenderTarget(_maskRtId, BuiltinRenderTextureType.Depth); +#endif + } + else + { +#if UNITY_2018_2_OR_NEWER + _commandBuffer.SetRenderTarget(_maskRtId, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store); +#else + _commandBuffer.SetRenderTarget(_maskRtId); +#endif + } + + _commandBuffer.ClearRenderTarget(false, true, Color.clear); + } + + private void RenderObject(OutlineResources resources, IOutlineSettings settings, IList renderers) + { + RenderObjectClear((settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0); + + for (var i = 0; i < renderers.Count; ++i) + { + var r = renderers[i]; + + if (r && r.enabled && r.gameObject.activeInHierarchy) + { + // NOTE: Accessing Renderer.sharedMaterials triggers GC.Alloc. That's why we use a temporary + // list of materials, cached with the outline resources. + r.GetSharedMaterials(resources.TmpMaterials); + + for (var j = 0; j < resources.TmpMaterials.Count; ++j) + { + _commandBuffer.DrawRenderer(r, resources.RenderMaterial, j); + } + } + } + } + + private void RenderObject(OutlineResources resources, IOutlineSettings settings, IEnumerable renderers) + { + RenderObjectClear((settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0); + + // NOTE: Calling IEnumerable.GetEnumerator() triggers GC.Alloc. + foreach (var r in renderers) + { + if (r && r.enabled && r.gameObject.activeInHierarchy) + { + // NOTE: Accessing Renderer.sharedMaterials triggers GC.Alloc. That's why we use a temporary + // list of materials, cached with the outline resources. + r.GetSharedMaterials(resources.TmpMaterials); + + for (var j = 0; j < resources.TmpMaterials.Count; ++j) + { + _commandBuffer.DrawRenderer(r, resources.RenderMaterial, j); + } + } + } + } + + private void RenderObject(OutlineResources resources, IOutlineSettings settings, Renderer renderer) + { + RenderObjectClear((settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0); + + if (renderer && renderer.gameObject.activeInHierarchy && renderer.enabled) + { + // NOTE: Accessing Renderer.sharedMaterials triggers GC.Alloc. That's why we use a temporary + // list of materials, cached with the outline resources. + renderer.GetSharedMaterials(resources.TmpMaterials); + + for (var i = 0; i < resources.TmpMaterials.Count; ++i) + { + _commandBuffer.DrawRenderer(renderer, resources.RenderMaterial, i); + } + } + } + + private void RenderHPass(OutlineResources resources, IOutlineSettings settings) + { + // Setup shader parameter overrides. + var props = resources.HPassProperties; + props.SetFloat(resources.WidthId, settings.OutlineWidth); + + // Set source texture as _MainTex to match Blit behavior. + _commandBuffer.SetGlobalTexture(_mainRtId, _maskRtId); + + // Set destination texture as render target. +#if UNITY_2018_2_OR_NEWER + _commandBuffer.SetRenderTarget(_hPassRtId, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store); +#else + _commandBuffer.SetRenderTarget(_hPassRtId); +#endif + + // Blit fullscreen triangle. + _commandBuffer.DrawMesh(resources.FullscreenTriangleMesh, Matrix4x4.identity, resources.HPassMaterial, 0, 0, props); + } + + private void RenderVPassBlend(OutlineResources resources, IOutlineSettings settings) + { + // Setup shader parameter overrides. + var props = resources.VPassBlendProperties; + + props.SetFloat(resources.WidthId, settings.OutlineWidth); + props.SetColor(resources.ColorId, settings.OutlineColor); + + if ((settings.OutlineRenderMode & OutlineRenderFlags.Blurred) != 0) + { + props.SetFloat(resources.IntensityId, settings.OutlineIntensity); + } + else + { + props.SetFloat(resources.IntensityId, SolidIntensity); + } + + // Set source texture as _MainTex to match Blit behavior. + _commandBuffer.SetGlobalTexture(_mainRtId, _source); + + // Set destination texture as render target. +#if UNITY_2018_2_OR_NEWER + _commandBuffer.SetRenderTarget(_destination, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store); +#else + _commandBuffer.SetRenderTarget(_destination); +#endif + + // Blit fullscreen triangle. + _commandBuffer.DrawMesh(resources.FullscreenTriangleMesh, Matrix4x4.identity, resources.VPassBlendMaterial, 0, 0, props); + } + + #endregion + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs.meta new file mode 100644 index 0000000..90c49ef --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 4271470bd9f5d5041a4a8881d8457a55 +timeCreated: 1566150038 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs new file mode 100644 index 0000000..730e6dd --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs @@ -0,0 +1,146 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace UnityFx.Outline +{ + internal class OutlineRendererCollection : ICollection + { + #region data + + private readonly List _renderers = new List(); + private readonly GameObject _go; + + #endregion + + #region interface + + internal OutlineRendererCollection(GameObject go) + { + Debug.Assert(go); + _go = go; + } + + internal List GetList() + { + return _renderers; + } + + internal void Reset(bool includeInactive) + { + _go.GetComponentsInChildren(includeInactive, _renderers); + } + + internal void Reset(bool includeInactive, int ignoreLayerMask) + { + _renderers.Clear(); + + var renderers = _go.GetComponentsInChildren(includeInactive); + + if (renderers != null) + { + if (ignoreLayerMask != 0) + { + foreach (var renderer in renderers) + { + if (((1 << renderer.gameObject.layer) & ignoreLayerMask) == 0) + { + _renderers.Add(renderer); + } + } + } + else + { + foreach (var renderer in renderers) + { + _renderers.Add(renderer); + } + } + } + } + + #endregion + + #region ICollection + + public int Count + { + get + { + return _renderers.Count; + } + } + + public bool IsReadOnly + { + get + { + return false; + } + } + + public void Add(Renderer renderer) + { + Validate(renderer); + + _renderers.Add(renderer); + } + + public bool Remove(Renderer renderer) + { + return _renderers.Remove(renderer); + } + + public void Clear() + { + _renderers.Clear(); + } + + public bool Contains(Renderer renderer) + { + return _renderers.Contains(renderer); + } + + public void CopyTo(Renderer[] array, int arrayIndex) + { + _renderers.CopyTo(array, arrayIndex); + } + + #endregion + + #region IEnumerable + + public IEnumerator GetEnumerator() + { + return _renderers.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _renderers.GetEnumerator(); + } + + #endregion + + #region implementation + + private void Validate(Renderer renderer) + { + if (renderer == null) + { + throw new ArgumentNullException("renderer"); + } + + if (!renderer.transform.IsChildOf(_go.transform)) + { + throw new ArgumentException(string.Format("Only children of the {0} are allowed.", _go.name), "renderer"); + } + } + + #endregion + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs.meta new file mode 100644 index 0000000..f582b73 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89621a3cc73c4e6498a00b2d180ed462 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs new file mode 100644 index 0000000..8d8f169 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs @@ -0,0 +1,234 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace UnityFx.Outline +{ + /// + /// This asset is used to store references to shaders and other resources needed at runtime without having to use a Resources folder. + /// + /// + [CreateAssetMenu(fileName = "OutlineResources", menuName = "UnityFx/Outline/Outline Resources")] + public sealed class OutlineResources : ScriptableObject + { + #region data + + private Material _renderMaterial; + private Material _hPassMaterial; + private Material _vPassMaterial; + private MaterialPropertyBlock _hPassProperties; + private MaterialPropertyBlock _vPassProperties; + private Mesh _fullscreenTriangleMesh; + private float[][] _gaussSamples; + + #endregion + + #region interface + + /// + /// Hashed name of _Color shader parameter. + /// + public readonly int ColorId = Shader.PropertyToID("_Color"); + + /// + /// Hashed name of _Width shader parameter. + /// + public readonly int WidthId = Shader.PropertyToID("_Width"); + + /// + /// Hashed name of _Intensity shader parameter. + /// + public readonly int IntensityId = Shader.PropertyToID("_Intensity"); + + /// + /// Hashed name of _GaussSamples shader parameter. + /// + public readonly int GaussSamplesId = Shader.PropertyToID("_GaussSamples"); + + /// + /// Temp materials list. Used by to avoid GC allocations. + /// + public readonly List TmpMaterials = new List(); + + /// + /// Gets or sets a that renders objects outlined with a solid while color. + /// + public Shader RenderShader; + + /// + /// Gets or sets a that renders outline around the mask, that was generated with (pass 1). + /// + public Shader HPassShader; + + /// + /// Gets or sets a that renders outline around the mask, that was generated with and (pass 2). + /// + public Shader VPassBlendShader; + + /// + /// Gets a -based material. + /// + public Material RenderMaterial + { + get + { + if (_renderMaterial == null) + { + _renderMaterial = new Material(RenderShader) + { + name = "Outline - SimpleRender", + hideFlags = HideFlags.HideAndDontSave + }; + } + + return _renderMaterial; + } + } + + /// + /// Gets a -based material. + /// + public Material HPassMaterial + { + get + { + if (_hPassMaterial == null) + { + _hPassMaterial = new Material(HPassShader) + { + name = "Outline - HPassRender", + hideFlags = HideFlags.HideAndDontSave + }; + } + + return _hPassMaterial; + } + } + + /// + /// Gets a -based material. + /// + public Material VPassBlendMaterial + { + get + { + if (_vPassMaterial == null) + { + _vPassMaterial = new Material(VPassBlendShader) + { + name = "Outline - VPassBlendRender", + hideFlags = HideFlags.HideAndDontSave + }; + } + + return _vPassMaterial; + } + } + + /// + /// Gets a for . + /// + public MaterialPropertyBlock HPassProperties + { + get + { + if (_hPassProperties == null) + { + _hPassProperties = new MaterialPropertyBlock(); + } + + return _hPassProperties; + } + } + + /// + /// Gets a for . + /// + public MaterialPropertyBlock VPassBlendProperties + { + get + { + if (_vPassProperties == null) + { + _vPassProperties = new MaterialPropertyBlock(); + } + + return _vPassProperties; + } + } + + /// + /// Gets or sets a fullscreen triangle mesh. + /// + public Mesh FullscreenTriangleMesh + { + get + { + if (_fullscreenTriangleMesh == null) + { + _fullscreenTriangleMesh = new Mesh() + { + name = "Outline - FullscreenTriangle", + hideFlags = HideFlags.HideAndDontSave, + vertices = new Vector3[] { new Vector3(-1f, -1f, 0f), new Vector3(-1f, 3f, 0f), new Vector3( 3f, -1f, 0f) }, + triangles = new int[] {0, 1, 2 } + }; + + _fullscreenTriangleMesh.UploadMeshData(true); + } + + return _fullscreenTriangleMesh; + } + set + { + _fullscreenTriangleMesh = value; + } + } + + /// + /// Gets a value indicating whether the instance is in valid state. + /// + public bool IsValid + { + get + { + return RenderShader && HPassShader && VPassBlendShader; + } + } + + /// + /// Gets cached gauss samples for the specified outline . + /// + public float[] GetGaussSamples(int width) + { + var index = Mathf.Clamp(width, 1, OutlineRenderer.MaxWidth) - 1; + + if (_gaussSamples == null) + { + _gaussSamples = new float[OutlineRenderer.MaxWidth][]; + } + + if (_gaussSamples[index] == null) + { + _gaussSamples[index] = OutlineRenderer.GetGaussSamples(width, null); + } + + return _gaussSamples[index]; + } + + /// + /// Resets the resources to defaults. + /// + public void ResetToDefaults() + { + RenderShader = Shader.Find("UnityFx/Outline/RenderColor"); + HPassShader = Shader.Find("UnityFx/Outline/HPass"); + VPassBlendShader = Shader.Find("UnityFx/Outline/VPassBlend"); + } + + #endregion + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs.meta new file mode 100644 index 0000000..0f1aca3 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: b503341e0a514e3489c4851727e68257 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: + - RenderShader: {fileID: 4800000, guid: ac20fbf75bafe454aba5ef3c098349df, type: 3} + - HPassShader: {fileID: 4800000, guid: 41c9acbf41c8245498ac9beab378de12, type: 3} + - VPassBlendShader: {fileID: 4800000, guid: 1df0cb1700e142f4ca3b28297d3957da, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs new file mode 100644 index 0000000..2535031 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs @@ -0,0 +1,128 @@ +// 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 +{ + /// + /// Outline settings. + /// + [CreateAssetMenu(fileName = "OutlineSettings", menuName = "UnityFx/Outline/Outline Settings")] + public sealed class OutlineSettings : ScriptableObject, IOutlineSettings + { + #region data + + // NOTE: There is a custom editor for OutlineSettings, so no need to show these in default inspector. + [SerializeField, HideInInspector] + private Color _outlineColor = Color.red; + [SerializeField, HideInInspector] + private int _outlineWidth = 4; + [SerializeField, HideInInspector] + private float _outlineIntensity = 2; + [SerializeField, HideInInspector] + private OutlineRenderFlags _outlineMode; + + #endregion + + #region interface + + public static bool Equals(IOutlineSettings lhs, IOutlineSettings rhs) + { + if (lhs == null || rhs == null) + { + return false; + } + + return lhs.OutlineColor == rhs.OutlineColor && + lhs.OutlineWidth == rhs.OutlineWidth && + lhs.OutlineRenderMode == rhs.OutlineRenderMode && + Mathf.Approximately(lhs.OutlineIntensity, rhs.OutlineIntensity); + } + + #endregion + + #region IOutlineSettings + + /// + public Color OutlineColor + { + get + { + return _outlineColor; + } + set + { + _outlineColor = value; + } + } + + /// + public int OutlineWidth + { + get + { + return _outlineWidth; + } + set + { + _outlineWidth = Mathf.Clamp(value, OutlineRenderer.MinWidth, OutlineRenderer.MaxWidth); + } + } + + /// + public float OutlineIntensity + { + get + { + return _outlineIntensity; + } + set + { + _outlineIntensity = Mathf.Clamp(value, OutlineRenderer.MinIntensity, OutlineRenderer.MaxIntensity); + } + } + + /// + public OutlineRenderFlags OutlineRenderMode + { + get + { + return _outlineMode; + } + set + { + _outlineMode = value; + } + } + + #endregion + + #region IEquatable + + /// + public bool Equals(IOutlineSettings other) + { + return Equals(this, other); + } + + #endregion + + #region Object + + /// + public override bool Equals(object other) + { + return Equals(this, other as IOutlineSettings); + } + + /// + public override int GetHashCode() + { + return base.GetHashCode(); + } + + #endregion + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs.meta new file mode 100644 index 0000000..c6de014 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b579424fd3338724cba3155ee4d53475 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs new file mode 100644 index 0000000..a39ef7e --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs @@ -0,0 +1,178 @@ +// 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 +{ + [Serializable] + internal class OutlineSettingsInstance : IOutlineSettingsEx + { + #region data + +#pragma warning disable 0649 + + // NOTE: There are custom editors for public components, so no need to show these in default inspector. + [SerializeField, HideInInspector] + private OutlineSettings _outlineSettings; + [SerializeField, HideInInspector] + private Color _outlineColor = Color.red; + [SerializeField, HideInInspector] + private int _outlineWidth = 4; + [SerializeField, HideInInspector] + private float _outlineIntensity = 2; + [SerializeField, HideInInspector] + private OutlineRenderFlags _outlineMode; + +#pragma warning restore 0649 + + private OutlineResources _resources; + + #endregion + + #region interface + + public OutlineResources OutlineResources + { + get + { + return _resources; + } + set + { + _resources = value; + } + } + + public bool RequiresCameraDepth + { + get + { + var renderMode = _outlineMode; + + if (!ReferenceEquals(_outlineSettings, null)) + { + renderMode = _outlineSettings.OutlineRenderMode; + } + + return (renderMode & OutlineRenderFlags.EnableDepthTesting) != 0; + } + } + + internal OutlineSettingsInstance() + { + } + + internal OutlineSettingsInstance(OutlineResources resources) + { + _resources = resources; + } + + #endregion + + #region IOutlineSettingsEx + + public OutlineSettings OutlineSettings + { + get + { + return _outlineSettings; + } + set + { + _outlineSettings = value; + } + } + + #endregion + + #region IOutlineSettings + + /// + public Color OutlineColor + { + get + { + if (!ReferenceEquals(_outlineSettings, null)) + { + return _outlineSettings.OutlineColor; + } + + return _outlineColor; + } + set + { + _outlineColor = value; + } + } + + /// + public int OutlineWidth + { + get + { + if (!ReferenceEquals(_outlineSettings, null)) + { + return _outlineSettings.OutlineWidth; + } + + return _outlineWidth; + } + set + { + _outlineWidth = Mathf.Clamp(value, OutlineRenderer.MinWidth, OutlineRenderer.MaxWidth); + } + } + + /// + public float OutlineIntensity + { + get + { + if (!ReferenceEquals(_outlineSettings, null)) + { + return _outlineSettings.OutlineIntensity; + } + + return _outlineIntensity; + } + set + { + _outlineIntensity = Mathf.Clamp(value, OutlineRenderer.MinIntensity, OutlineRenderer.MaxIntensity); + } + } + + /// + public OutlineRenderFlags OutlineRenderMode + { + get + { + if (!ReferenceEquals(_outlineSettings, null)) + { + return _outlineSettings.OutlineRenderMode; + } + + return _outlineMode; + } + set + { + _outlineMode = value; + } + } + + #endregion + + #region IEquatable + + public bool Equals(IOutlineSettings other) + { + return OutlineSettings.Equals(this, other); + } + + #endregion + + #region implementation + #endregion + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs.meta new file mode 100644 index 0000000..177c3cb --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8ea4c60e473b8ef4790934bb274993cc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/Properties.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/Properties.meta new file mode 100644 index 0000000..708e1e7 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/Properties.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7bd10545b6de6654b864faecdec920cd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/Properties/AssemblyInfo.cs b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d7b9f2c --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UnityFx.Outline")] +[assembly: AssemblyProduct("UnityFx.Outline")] +[assembly: AssemblyDescription("Screen-space outlines for Unity3d.")] +#if DEBUG +[assembly: AssemblyConfiguration("Debug")] +#else +[assembly: AssemblyConfiguration("Release")] +#endif +[assembly: AssemblyCompany("")] +[assembly: AssemblyCopyright("Copyright © Alexander Bogarsukov 2019-2020")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// Make internals visible to the editor assembly. +[assembly: InternalsVisibleTo("UnityFx.Outline.Editor")] diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/Properties/AssemblyInfo.cs.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/Properties/AssemblyInfo.cs.meta new file mode 100644 index 0000000..dd9f2bd --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Scripts/Properties/AssemblyInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1613c034178676349be3282789167284 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders.meta new file mode 100644 index 0000000..bf1ab62 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: e4ede0e617beaeb4a8781136599aa84e +folderAsset: yes +timeCreated: 1566126961 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader new file mode 100644 index 0000000..2febb62 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader @@ -0,0 +1,69 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +// Renders outline based on a texture produces by 'UnityF/Outline/RenderColor' output. +// Modified version of 'Custom/Post Outline' shader taken from https://willweissman.wordpress.com/tutorials/shaders/unity-shaderlab-object-outlines/. +Shader "UnityFx/Outline/HPass" +{ + Properties + { + _Width("Outline thickness (in pixels)", Range(1, 32)) = 5 + } + + SubShader + { + Cull Off + ZWrite Off + ZTest Always + Lighting Off + + Pass + { + HLSLPROGRAM + + #pragma vertex Vert + #pragma fragment Frag + #include "UnityCG.cginc" + + CBUFFER_START(UnityPerMaterial) + int _Width; + CBUFFER_END + + UNITY_DECLARE_TEX2D(_MaskTex); + float2 _MaskTex_TexelSize; + float _GaussSamples[32]; + + struct v2f + { + float4 pos : POSITION; + float2 uvs : TEXCOORD0; + }; + + v2f Vert(appdata_base v) + { + v2f o; + + o.pos = float4(v.vertex.xy, 0.0, 1.0); + o.uvs = ComputeScreenPos(o.pos); + + return o; + } + + float Frag(v2f i) : COLOR + { + float TX_x = _MaskTex_TexelSize.x; + float intensity; + int n = _Width; + + for (int k = -n; k <= n; k += 1) + { + intensity += UNITY_SAMPLE_TEX2D(_MaskTex, i.uvs.xy + float2(k * TX_x, 0)).r * _GaussSamples[abs(k)]; + } + + return intensity; + } + + ENDHLSL + } + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader.meta new file mode 100644 index 0000000..bb55354 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 41c9acbf41c8245498ac9beab378de12 +timeCreated: 1566126977 +licenseType: Free +ShaderImporter: + externalObjects: {} + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader new file mode 100644 index 0000000..dbf1a18 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader @@ -0,0 +1,83 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +// Renders outline based on a texture produces by 'UnityF/Outline/RenderColor' output. +// Modified version of 'Custom/Post Outline' shader taken from https://willweissman.wordpress.com/tutorials/shaders/unity-shaderlab-object-outlines/. +Shader "UnityFx/Outline/VPassBlend" +{ + Properties + { + _Width("Outline thickness (in pixels)", Range(1, 32)) = 5 + _Intensity("Outline intensity", Range(0.1, 100)) = 2 + _Color("Outline color", Color) = (1, 0, 0, 1) + } + + SubShader + { + Cull Off + ZWrite Off + ZTest Always + Lighting Off + + Blend SrcAlpha OneMinusSrcAlpha + + Pass + { + HLSLPROGRAM + + #pragma vertex Vert + #pragma fragment Frag + #include "UnityCG.cginc" + + CBUFFER_START(UnityPerMaterial) + float _Intensity; + int _Width; + float4 _Color; + CBUFFER_END + + UNITY_DECLARE_TEX2D(_MaskTex); + float2 _MaskTex_TexelSize; + UNITY_DECLARE_TEX2D(_HPassTex); + float2 _HPassTex_TexelSize; + float _GaussSamples[32]; + + struct v2f + { + float4 pos : POSITION; + float2 uvs : TEXCOORD0; + }; + + v2f Vert(appdata_base v) + { + v2f o; + + o.pos = float4(v.vertex.xy, 0.0, 1.0); + o.uvs = ComputeScreenPos(o.pos); + + return o; + } + + float4 Frag(v2f i) : COLOR + { + if (UNITY_SAMPLE_TEX2D(_MaskTex, i.uvs.xy).r > 0) + { + discard; + } + + float TX_y = _MaskTex_TexelSize.y; + float intensity; + int n = _Width; + + for (int k = -n; k <= _Width; k += 1) + { + intensity += UNITY_SAMPLE_TEX2D(_HPassTex, i.uvs.xy + float2(0, k * TX_y)).r * _GaussSamples[abs(k)]; + } + + intensity = _Intensity > 99 ? step(0.01, intensity) : intensity * _Intensity; + return float4(_Color.rgb, saturate(_Color.a * intensity)); + } + + ENDHLSL + } + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader.meta new file mode 100644 index 0000000..5852e4b --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1df0cb1700e142f4ca3b28297d3957da +ShaderImporter: + externalObjects: {} + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader new file mode 100644 index 0000000..bf53276 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader @@ -0,0 +1,43 @@ +// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. +// See the LICENSE.md file in the project root for more information. + +// Renders everything with while color. +// Modified version of 'Custom/DrawSimple' shader taken from https://willweissman.wordpress.com/tutorials/shaders/unity-shaderlab-object-outlines/. +Shader "UnityFx/Outline/RenderColor" +{ + SubShader + { + Cull Off + ZWrite Off + ZTest LEqual + Lighting Off + + Pass + { + HLSLPROGRAM + + #pragma vertex Vert + #pragma fragment Frag + #include "UnityCG.cginc" + + struct v2f + { + float4 pos: POSITION; + }; + + v2f Vert(v2f i) + { + v2f o; + o.pos = UnityObjectToClipPos(i.pos); + return o; + } + + half4 Frag(): COLOR0 + { + return half4(1, 1, 1, 1); + } + + ENDHLSL + } + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader.meta new file mode 100644 index 0000000..66aa3a2 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: ac20fbf75bafe454aba5ef3c098349df +timeCreated: 1566126977 +licenseType: Free +ShaderImporter: + externalObjects: {} + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef b/Outline.Core/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef new file mode 100644 index 0000000..af0702d --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef @@ -0,0 +1,3 @@ +{ + "name": "UnityFx.Outline" +} diff --git a/Outline.Core/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef.meta b/Outline.Core/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef.meta new file mode 100644 index 0000000..6a74c49 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: de7ed7f8e7092c144bd17cbabf282ba3 +timeCreated: 1566126961 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/UnityFx.Outline/package.json b/Outline.Core/Packages/UnityFx.Outline/package.json new file mode 100644 index 0000000..0dfd31d --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/package.json @@ -0,0 +1,27 @@ +{ + "name": "com.unityfx.outline", + "version": "0.8.0", + "displayName": "Screen-space outline", + "description": "Configurable per-object and per-camera outlines. Both solid and blurred outline modes are supported (Gauss blur). The outlines can be easily customized either through scripts or with Unity editor (both in edit-time or runtime).", + "unity": "2017.2", + "keywords": [ + "UnityFx", + "UnityFx.Outline", + "outline", + "post-effect" + ], + "category": "UnityFx", + "author": { + "name": "Arvtesh", + "email": "arvtesh@gmail.com" + }, + "license": "MIT", + "homepage": "https://github.com/Arvtesh/UnityFx.Outline", + "repository": { + "type": "git", + "url": "https://github.com/Arvtesh/UnityFx.Outline.git" + }, + "bugs": { + "url": "https://github.com/Arvtesh/UnityFx.Outline/issues" + } +} diff --git a/Outline.Core/Packages/UnityFx.Outline/package.json.meta b/Outline.Core/Packages/UnityFx.Outline/package.json.meta new file mode 100644 index 0000000..d824967 --- /dev/null +++ b/Outline.Core/Packages/UnityFx.Outline/package.json.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 411b5b9873de2d244ac737335a5117d6 +timeCreated: 1566126977 +licenseType: Free +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.Core/Packages/manifest.json b/Outline.Core/Packages/manifest.json new file mode 100644 index 0000000..2ca7506 --- /dev/null +++ b/Outline.Core/Packages/manifest.json @@ -0,0 +1,35 @@ +{ + "dependencies": { + "com.unity.package-manager-ui": "2.0.8", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} From 41e967eed5e3ce615976edb5280e687593bb023c Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Thu, 2 Apr 2020 14:41:27 +0300 Subject: [PATCH 31/39] Added post-processing specific project --- Outline.PostProcessing/Assets/Examples.meta | 8 + .../Assets/Examples/PostProcessing.meta | 8 + .../PostProcessingProfile.asset | 39 ++ .../PostProcessingProfile.asset.meta | 8 + .../PostProcessing/PostProcessingSample.unity | 644 ++++++++++++++++++ .../PostProcessingSample.unity.meta | 7 + .../CHANGELOG.md | 9 + .../CHANGELOG.md.meta | 7 + .../UnityFx.Outline.PostProcessing/README.md | 11 + .../README.md.meta | 7 + .../Runtime.meta | 8 + .../Runtime/Scripts.meta | 8 + .../Runtime/Scripts/Outline.cs | 65 ++ .../Runtime/Scripts/Outline.cs.meta | 13 + .../Runtime/Scripts/OutlineEffectRenderer.cs | 55 ++ .../Scripts/OutlineEffectRenderer.cs.meta | 11 + .../UnityFx.Outline.PostProcessing.asmdef | 15 + ...UnityFx.Outline.PostProcessing.asmdef.meta | 7 + .../package.json | 33 + .../package.json.meta | 7 + Outline.PostProcessing/Packages/manifest.json | 45 ++ 21 files changed, 1015 insertions(+) create mode 100644 Outline.PostProcessing/Assets/Examples.meta create mode 100644 Outline.PostProcessing/Assets/Examples/PostProcessing.meta create mode 100644 Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingProfile.asset create mode 100644 Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingProfile.asset.meta create mode 100644 Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingSample.unity create mode 100644 Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingSample.unity.meta create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md.meta create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/README.md create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/README.md.meta create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime.meta create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts.meta create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs.meta create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs.meta create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef.meta create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/package.json create mode 100644 Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/package.json.meta create mode 100644 Outline.PostProcessing/Packages/manifest.json diff --git a/Outline.PostProcessing/Assets/Examples.meta b/Outline.PostProcessing/Assets/Examples.meta new file mode 100644 index 0000000..6594ef3 --- /dev/null +++ b/Outline.PostProcessing/Assets/Examples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a810a4ae77829ce4d90d97e71431392f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.PostProcessing/Assets/Examples/PostProcessing.meta b/Outline.PostProcessing/Assets/Examples/PostProcessing.meta new file mode 100644 index 0000000..ff5cf73 --- /dev/null +++ b/Outline.PostProcessing/Assets/Examples/PostProcessing.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0afa5bb63d529a84daf887e3dc44b420 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingProfile.asset b/Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingProfile.asset new file mode 100644 index 0000000..725ebe2 --- /dev/null +++ b/Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingProfile.asset @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8e6292b2c06870d4495f009f912b9600, type: 3} + m_Name: PostProcessingProfile + m_EditorClassIdentifier: + settings: + - {fileID: 114600372921182068} +--- !u!114 &114600372921182068 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 362f6fe821115814693a671c047d5f31, type: 3} + m_Name: Outline + m_EditorClassIdentifier: + active: 1 + enabled: + overrideState: 1 + value: 1 + _defaultResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, type: 2} + Resources: + overrideState: 0 + value: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, type: 2} + Layers: + overrideState: 0 + value: {fileID: 0} diff --git a/Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingProfile.asset.meta b/Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingProfile.asset.meta new file mode 100644 index 0000000..c432c9a --- /dev/null +++ b/Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingProfile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d4e92bcee87e63243abc9035c870abe2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingSample.unity b/Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingSample.unity new file mode 100644 index 0000000..289e850 --- /dev/null +++ b/Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingSample.unity @@ -0,0 +1,644 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44657844, g: 0.49641222, b: 0.57481694, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 10 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &167171210 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 167171212} + - component: {fileID: 167171211} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &167171211 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167171210} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 0.5 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &167171212 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167171210} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &692811812 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 692811816} + - component: {fileID: 692811815} + - component: {fileID: 692811813} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &692811813 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 692811812} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 948f4100a11a5c24981795d21301da5c, type: 3} + m_Name: + m_EditorClassIdentifier: + volumeTrigger: {fileID: 692811816} + volumeLayer: + serializedVersion: 2 + m_Bits: 256 + stopNaNPropagation: 1 + finalBlitToCameraTarget: 0 + antialiasingMode: 0 + temporalAntialiasing: + jitterSpread: 0.75 + sharpness: 0.25 + stationaryBlending: 0.95 + motionBlending: 0.85 + subpixelMorphologicalAntialiasing: + quality: 2 + fastApproximateAntialiasing: + fastMode: 0 + keepAlpha: 0 + fog: + enabled: 1 + excludeSkybox: 1 + debugLayer: + lightMeter: + width: 512 + height: 256 + showCurves: 1 + histogram: + width: 512 + height: 256 + channel: 3 + waveform: + exposure: 0.12 + height: 256 + vectorscope: + size: 256 + exposure: 0.12 + overlaySettings: + linearDepth: 0 + motionColorIntensity: 4 + motionGridSize: 64 + colorBlindnessType: 0 + colorBlindnessStrength: 1 + m_Resources: {fileID: 11400000, guid: d82512f9c8e5d4a4d938b575d47f88d4, type: 2} + m_ShowToolkit: 0 + m_ShowCustomSorter: 0 + breakBeforeColorGrading: 0 + m_BeforeTransparentBundles: [] + m_BeforeStackBundles: + - assemblyQualifiedName: UnityFx.Outline.PostProcessing.Outline, UnityFx.Outline.PostProcessing, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_AfterStackBundles: [] +--- !u!20 &692811815 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 692811812} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 1 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &692811816 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 692811812} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1579373806} + - {fileID: 748173443} + - {fileID: 1789341921} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &748173439 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 748173443} + - component: {fileID: 748173442} + - component: {fileID: 748173441} + - component: {fileID: 748173440} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &748173440 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748173439} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &748173441 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748173439} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &748173442 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748173439} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &748173443 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748173439} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.51, y: 0, z: 4} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 692811816} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &880286468 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 880286470} + - component: {fileID: 880286469} + m_Layer: 8 + m_Name: PostProcessingVolume + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &880286469 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 880286468} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8b9a305e18de0c04dbd257a21cd47087, type: 3} + m_Name: + m_EditorClassIdentifier: + sharedProfile: {fileID: 11400000, guid: d4e92bcee87e63243abc9035c870abe2, type: 2} + isGlobal: 1 + blendDistance: 0 + weight: 1 + priority: 0 +--- !u!4 &880286470 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 880286468} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1579373802 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1579373806} + - component: {fileID: 1579373805} + - component: {fileID: 1579373804} + - component: {fileID: 1579373803} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &1579373803 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1579373802} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!135 &1579373804 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1579373802} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1579373805 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1579373802} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1579373806 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1579373802} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 4} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 692811816} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1789341920 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1789341921} + - component: {fileID: 1789341925} + - component: {fileID: 1789341924} + - component: {fileID: 1789341923} + m_Layer: 0 + m_Name: Cylinder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1789341921 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1789341920} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.5, y: 0, z: 4} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 692811816} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1789341923 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1789341920} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!136 &1789341924 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1789341920} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1789341925 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1789341920} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingSample.unity.meta b/Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingSample.unity.meta new file mode 100644 index 0000000..8ca40bd --- /dev/null +++ b/Outline.PostProcessing/Assets/Examples/PostProcessing/PostProcessingSample.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4d21e5bd8f334a040a5dd6da35054df4 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md new file mode 100644 index 0000000..3a73de8 --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md @@ -0,0 +1,9 @@ +# UnityFx.Outline.PostProcessing changelog +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.1.0] - unreleased + +### Added +- Initial release. diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md.meta b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md.meta new file mode 100644 index 0000000..73d1d67 --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d5d97340f52aca745b5b5d55c881ebc5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/README.md b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/README.md new file mode 100644 index 0000000..1fc72d2 --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/README.md @@ -0,0 +1,11 @@ +# UnityFx.Outline.PostProcessing + +## SUMMARY +Screen-space outline effects for Unity Post-processing Stack v2. + +## USEFUL LINKS +* [Github project](https://github.com/Arvtesh/UnityFx.Outline) +* [npm package](https://www.npmjs.com/package/com.unityfx.outline.postprocessing) +* [Documentation](https://github.com/Arvtesh/UnityFx.Outline/blob/master/README.md) +* [License](https://github.com/Arvtesh/UnityFx.Outline/blob/master/LICENSE.md) +* [Support](mailto:arvtesh@gmail.com) diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/README.md.meta b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/README.md.meta new file mode 100644 index 0000000..48d5112 --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9b8ad98b0bcd54241b6b9c186551ecc3 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime.meta b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime.meta new file mode 100644 index 0000000..9898607 --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 58b0863f5e2afd341a39b8095514add5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts.meta b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts.meta new file mode 100644 index 0000000..0fe0ce1 --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 96bc3f6fffa960f4691dcc70b0dc8a02 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs new file mode 100644 index 0000000..e7ef71d --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs @@ -0,0 +1,65 @@ +// 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; +using UnityEngine.Rendering.PostProcessing; + +namespace UnityFx.Outline.PostProcessing +{ + [Serializable] + [PostProcess(typeof(OutlineEffectRenderer), PostProcessEvent.BeforeStack, "UnityFx/Outline", false)] + public sealed class Outline : PostProcessEffectSettings + { +#pragma warning disable 0649 + + [SerializeField] + private OutlineResources _defaultResources; + +#pragma warning restore 0649 + + [Serializable] + public class OutlineResourcesParameter : ParameterOverride + { + internal Outline Settings; + + protected override void OnEnable() + { + if (value == null) + { + value = Settings._defaultResources; + } + } + } + + [Serializable] + public class OutlineLayersParameter : ParameterOverride + { + } + + // NOTE: PostProcessEffectSettings.OnEnable implementation requires the fields to be public to function properly. + public OutlineResourcesParameter Resources = new OutlineResourcesParameter(); + public OutlineLayersParameter Layers = new OutlineLayersParameter(); + + public Outline() + { + // NOTE: The better way to do this is implementing OnEnable(), but it is already implemented as private (!!!) method in PostProcessEffectSettings. + Resources.Settings = this; + } + + public override bool IsEnabledAndSupported(PostProcessRenderContext context) + { +#if UNITY_EDITOR + + // Don't render outline preview when the editor is not playing. + if (!Application.isPlaying) + { + return false; + } + +#endif + + return base.IsEnabledAndSupported(context) && Resources != null && Layers != null && Layers.value != null; + } + } +} diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs.meta b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs.meta new file mode 100644 index 0000000..063c836 --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 362f6fe821115814693a671c047d5f31 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: + - _defaultResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, + type: 2} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs new file mode 100644 index 0000000..3b8cf2f --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs @@ -0,0 +1,55 @@ +// 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; +using UnityEngine.Rendering.PostProcessing; +using UnityEngine.Scripting; + +namespace UnityFx.Outline.PostProcessing +{ + [Preserve] + public sealed class OutlineEffectRenderer : PostProcessEffectRenderer + { + private OutlineResources _defaultResources; + + public override void Render(PostProcessRenderContext context) + { + OutlineResources resources; + + if (settings.Resources.value != null) + { + resources = settings.Resources; + } + else + { + if (!_defaultResources) + { + _defaultResources = ScriptableObject.CreateInstance(); + _defaultResources.ResetToDefaults(); + _defaultResources.FullscreenTriangleMesh = RuntimeUtilities.fullscreenTriangle; + } + + resources = _defaultResources; + } + + if (resources && resources.IsValid) + { + using (var renderer = new OutlineRenderer(context.command, context.source, context.destination)) + { + settings.Layers.value.Render(renderer, resources); + } + } + } + + public override void Release() + { + if (_defaultResources) + { + ScriptableObject.Destroy(_defaultResources); + } + + base.Release(); + } + } +} diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs.meta b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs.meta new file mode 100644 index 0000000..4fbea54 --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 94b195a6784c3664eb4f501e87f38ce3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef new file mode 100644 index 0000000..7ccfffc --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef @@ -0,0 +1,15 @@ +{ + "name": "UnityFx.Outline.PostProcessing", + "references": [ + "Unity.Postprocessing.Runtime", + "UnityFx.Outline" + ], + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef.meta b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef.meta new file mode 100644 index 0000000..c9386d2 --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8e3d165dc2f9115429adabaabad94f93 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/package.json b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/package.json new file mode 100644 index 0000000..a6caddb --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/package.json @@ -0,0 +1,33 @@ +{ + "name": "com.unityfx.outline.postprocessing", + "version": "0.1.0", + "displayName": "Screen-space outline (Post-processing v2)", + "description": "Configurable outline for Unity post-processing stack (v2). Both solid and blurred modes supported (Gauss blur).", + "unity": "2018.4", + "dependencies": { + "com.unityfx.outline": "0.7.1", + "com.unity.postprocessing": "2.2.2" + }, + "keywords": [ + "UnityFx", + "UnityFx.Outline", + "UnityFx.Outline.PostProcessing", + "Outline", + "Post-processing", + "Post-effect" + ], + "category": "UnityFx", + "author": { + "name": "Arvtesh", + "email": "arvtesh@gmail.com" + }, + "license": "MIT", + "homepage": "https://github.com/Arvtesh/UnityFx.Outline", + "repository": { + "type": "git", + "url": "https://github.com/Arvtesh/UnityFx.Outline.git" + }, + "bugs": { + "url": "https://github.com/Arvtesh/UnityFx.Outline/issues" + } +} diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/package.json.meta b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/package.json.meta new file mode 100644 index 0000000..62b5420 --- /dev/null +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5e0ccba19a9670b46ad359a388c4ddc5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.PostProcessing/Packages/manifest.json b/Outline.PostProcessing/Packages/manifest.json new file mode 100644 index 0000000..215c50c --- /dev/null +++ b/Outline.PostProcessing/Packages/manifest.json @@ -0,0 +1,45 @@ +{ + "scopedRegistries": [ + { + "name": "Arvtesh", + "url": "https://registry.npmjs.org/", + "scopes": [ + "com.unityfx" + ] + } + ], + "dependencies": { + "com.unity.package-manager-ui": "2.0.8", + "com.unityfx.outline": "0.7.1", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} From 5cc04a888a2f57ace10c9c59d5607b31a6c60b79 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Thu, 2 Apr 2020 15:24:08 +0300 Subject: [PATCH 32/39] Added HDRP specific project --- Assets/Examples.meta | 8 - Assets/Examples/PostProcessing.meta | 8 - .../PostProcessingProfile.asset | 39 -- .../PostProcessingProfile.asset.meta | 8 - .../PostProcessing/PostProcessingSample.unity | 644 ------------------ .../PostProcessingSample.unity.meta | 7 - Assets/Examples/SimplePerCamera.meta | 8 - Assets/Examples/SimplePerCamera/Outline.unity | 586 ---------------- .../SimplePerCamera/Outline.unity.meta | 9 - .../SimplePerCamera/OutlineEffectBuilder.cs | 88 --- .../OutlineEffectBuilder.cs.meta | 13 - .../SimplePerCamera/TestOutlineLayers.asset | 43 -- .../TestOutlineLayers.asset.meta | 10 - Assets/Examples/SimplePerObject.meta | 8 - .../SimplePerObject/TestOutlineSettings.asset | 18 - .../TestOutlineSettings.asset.meta | 8 - .../UnityFx.Outline.HDRP/CHANGELOG.md | 0 .../UnityFx.Outline.HDRP/CHANGELOG.md.meta | 0 .../Packages}/UnityFx.Outline.HDRP/README.md | 0 .../UnityFx.Outline.HDRP/README.md.meta | 0 .../UnityFx.Outline.HDRP/Runtime.meta | 0 .../UnityFx.Outline.HDRP/Runtime/Scripts.meta | 0 .../Runtime/Scripts/Outline.cs | 0 .../Runtime/Scripts/Outline.cs.meta | 0 .../Runtime/UnityFx.Outline.HDRP.asmdef | 0 .../Runtime/UnityFx.Outline.HDRP.asmdef.meta | 0 .../UnityFx.Outline.HDRP/package.json | 0 .../UnityFx.Outline.HDRP/package.json.meta | 0 .../Packages}/manifest.json | 4 +- .../CHANGELOG.md | 9 - .../CHANGELOG.md.meta | 7 - .../UnityFx.Outline.PostProcessing/README.md | 11 - .../README.md.meta | 7 - .../Runtime.meta | 8 - .../Runtime/Scripts.meta | 8 - .../Runtime/Scripts/Outline.cs | 65 -- .../Runtime/Scripts/Outline.cs.meta | 13 - .../Runtime/Scripts/OutlineEffectRenderer.cs | 55 -- .../Scripts/OutlineEffectRenderer.cs.meta | 11 - .../UnityFx.Outline.PostProcessing.asmdef | 15 - ...UnityFx.Outline.PostProcessing.asmdef.meta | 7 - .../package.json | 33 - .../package.json.meta | 7 - Packages/UnityFx.Outline/CHANGELOG.md | 106 --- Packages/UnityFx.Outline/CHANGELOG.md.meta | 7 - Packages/UnityFx.Outline/Editor.meta | 10 - Packages/UnityFx.Outline/Editor/Scripts.meta | 10 - .../Editor/Scripts/OutlineBehaviourEditor.cs | 84 --- .../Scripts/OutlineBehaviourEditor.cs.meta | 13 - .../Editor/Scripts/OutlineEditorUtility.cs | 201 ------ .../Scripts/OutlineEditorUtility.cs.meta | 11 - .../Editor/Scripts/OutlineEffectEditor.cs | 59 -- .../Scripts/OutlineEffectEditor.cs.meta | 13 - .../Scripts/OutlineLayerCollectionEditor.cs | 121 ---- .../OutlineLayerCollectionEditor.cs.meta | 11 - .../Editor/Scripts/OutlineSettingsEditor.cs | 33 - .../Scripts/OutlineSettingsEditor.cs.meta | 11 - .../Editor/UnityFx.Outline.Editor.asmdef | 16 - .../Editor/UnityFx.Outline.Editor.asmdef.meta | 9 - Packages/UnityFx.Outline/README.md | 11 - Packages/UnityFx.Outline/README.md.meta | 9 - Packages/UnityFx.Outline/Runtime.meta | 10 - Packages/UnityFx.Outline/Runtime/Prefabs.meta | 8 - .../Runtime/Prefabs/OutlineResources.asset | 16 - .../Prefabs/OutlineResources.asset.meta | 10 - Packages/UnityFx.Outline/Runtime/Scripts.meta | 8 - .../Runtime/Scripts/AssemblyInfo.cs | 29 - .../Runtime/Scripts/AssemblyInfo.cs.meta | 11 - .../Runtime/Scripts/IOutlineSettings.cs | 45 -- .../Runtime/Scripts/IOutlineSettings.cs.meta | 11 - .../Runtime/Scripts/IOutlineSettingsEx.cs | 19 - .../Scripts/IOutlineSettingsEx.cs.meta | 11 - .../Runtime/Scripts/OutlineBehaviour.cs | 372 ---------- .../Runtime/Scripts/OutlineBehaviour.cs.meta | 15 - .../Runtime/Scripts/OutlineEffect.cs | 240 ------- .../Runtime/Scripts/OutlineEffect.cs.meta | 15 - .../Runtime/Scripts/OutlineLayer.cs | 494 -------------- .../Runtime/Scripts/OutlineLayer.cs.meta | 13 - .../Runtime/Scripts/OutlineLayerCollection.cs | 291 -------- .../Scripts/OutlineLayerCollection.cs.meta | 13 - .../Runtime/Scripts/OutlineRenderFlags.cs | 29 - .../Scripts/OutlineRenderFlags.cs.meta | 11 - .../Runtime/Scripts/OutlineRenderer.cs | 493 -------------- .../Runtime/Scripts/OutlineRenderer.cs.meta | 13 - .../Scripts/OutlineRendererCollection.cs | 146 ---- .../Scripts/OutlineRendererCollection.cs.meta | 11 - .../Runtime/Scripts/OutlineResources.cs | 234 ------- .../Runtime/Scripts/OutlineResources.cs.meta | 14 - .../Runtime/Scripts/OutlineSettings.cs | 128 ---- .../Runtime/Scripts/OutlineSettings.cs.meta | 11 - .../Scripts/OutlineSettingsInstance.cs | 178 ----- .../Scripts/OutlineSettingsInstance.cs.meta | 11 - Packages/UnityFx.Outline/Runtime/Shaders.meta | 10 - .../Runtime/Shaders/OutlinePass1.shader | 69 -- .../Runtime/Shaders/OutlinePass1.shader.meta | 10 - .../Runtime/Shaders/OutlinePass2.shader | 83 --- .../Runtime/Shaders/OutlinePass2.shader.meta | 8 - .../Runtime/Shaders/OutlineRenderColor.shader | 43 -- .../Shaders/OutlineRenderColor.shader.meta | 10 - .../Runtime/UnityFx.Outline.asmdef | 3 - .../Runtime/UnityFx.Outline.asmdef.meta | 9 - Packages/UnityFx.Outline/Tests.meta | 8 - Packages/UnityFx.Outline/Tests/Editor.meta | 8 - .../UnityFx.Outline/Tests/Editor/Scripts.meta | 8 - .../Tests/Editor/Scripts/Helpers.meta | 8 - .../Helpers/IOutlineSettingsExTests.cs | 98 --- .../Helpers/IOutlineSettingsExTests.cs.meta | 11 - .../Scripts/Helpers/IOutlineSettingsTests.cs | 195 ------ .../Helpers/IOutlineSettingsTests.cs.meta | 11 - .../Editor/Scripts/OutlineBehaviourTests.cs | 33 - .../Scripts/OutlineBehaviourTests.cs.meta | 11 - .../Scripts/OutlineLayerCollectionTests.cs | 164 ----- .../OutlineLayerCollectionTests.cs.meta | 11 - .../Tests/Editor/Scripts/OutlineLayerTests.cs | 117 ---- .../Editor/Scripts/OutlineLayerTests.cs.meta | 11 - .../Editor/Scripts/OutlineRendererTests.cs | 47 -- .../Scripts/OutlineRendererTests.cs.meta | 11 - .../Editor/Scripts/OutlineSettingsTests.cs | 32 - .../Scripts/OutlineSettingsTests.cs.meta | 11 - .../UnityFx.Outline.Editor.Tests.asmdef | 19 - .../UnityFx.Outline.Editor.Tests.asmdef.meta | 7 - Packages/UnityFx.Outline/package.json | 27 - Packages/UnityFx.Outline/package.json.meta | 9 - 123 files changed, 2 insertions(+), 6510 deletions(-) delete mode 100644 Assets/Examples.meta delete mode 100644 Assets/Examples/PostProcessing.meta delete mode 100644 Assets/Examples/PostProcessing/PostProcessingProfile.asset delete mode 100644 Assets/Examples/PostProcessing/PostProcessingProfile.asset.meta delete mode 100644 Assets/Examples/PostProcessing/PostProcessingSample.unity delete mode 100644 Assets/Examples/PostProcessing/PostProcessingSample.unity.meta delete mode 100644 Assets/Examples/SimplePerCamera.meta delete mode 100644 Assets/Examples/SimplePerCamera/Outline.unity delete mode 100644 Assets/Examples/SimplePerCamera/Outline.unity.meta delete mode 100644 Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs delete mode 100644 Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs.meta delete mode 100644 Assets/Examples/SimplePerCamera/TestOutlineLayers.asset delete mode 100644 Assets/Examples/SimplePerCamera/TestOutlineLayers.asset.meta delete mode 100644 Assets/Examples/SimplePerObject.meta delete mode 100644 Assets/Examples/SimplePerObject/TestOutlineSettings.asset delete mode 100644 Assets/Examples/SimplePerObject/TestOutlineSettings.asset.meta rename {Packages => Outline.HDRP/Packages}/UnityFx.Outline.HDRP/CHANGELOG.md (100%) rename {Packages => Outline.HDRP/Packages}/UnityFx.Outline.HDRP/CHANGELOG.md.meta (100%) rename {Packages => Outline.HDRP/Packages}/UnityFx.Outline.HDRP/README.md (100%) rename {Packages => Outline.HDRP/Packages}/UnityFx.Outline.HDRP/README.md.meta (100%) rename {Packages => Outline.HDRP/Packages}/UnityFx.Outline.HDRP/Runtime.meta (100%) rename {Packages => Outline.HDRP/Packages}/UnityFx.Outline.HDRP/Runtime/Scripts.meta (100%) rename {Packages => Outline.HDRP/Packages}/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs (100%) rename {Packages => Outline.HDRP/Packages}/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta (100%) rename {Packages => Outline.HDRP/Packages}/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef (100%) rename {Packages => Outline.HDRP/Packages}/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef.meta (100%) rename {Packages => Outline.HDRP/Packages}/UnityFx.Outline.HDRP/package.json (100%) rename {Packages => Outline.HDRP/Packages}/UnityFx.Outline.HDRP/package.json.meta (100%) rename {Packages => Outline.HDRP/Packages}/manifest.json (91%) delete mode 100644 Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md delete mode 100644 Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md.meta delete mode 100644 Packages/UnityFx.Outline.PostProcessing/README.md delete mode 100644 Packages/UnityFx.Outline.PostProcessing/README.md.meta delete mode 100644 Packages/UnityFx.Outline.PostProcessing/Runtime.meta delete mode 100644 Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts.meta delete mode 100644 Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs delete mode 100644 Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs.meta delete mode 100644 Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs delete mode 100644 Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs.meta delete mode 100644 Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef delete mode 100644 Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef.meta delete mode 100644 Packages/UnityFx.Outline.PostProcessing/package.json delete mode 100644 Packages/UnityFx.Outline.PostProcessing/package.json.meta delete mode 100644 Packages/UnityFx.Outline/CHANGELOG.md delete mode 100644 Packages/UnityFx.Outline/CHANGELOG.md.meta delete mode 100644 Packages/UnityFx.Outline/Editor.meta delete mode 100644 Packages/UnityFx.Outline/Editor/Scripts.meta delete mode 100644 Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs delete mode 100644 Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs.meta delete mode 100644 Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs delete mode 100644 Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs.meta delete mode 100644 Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs delete mode 100644 Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs.meta delete mode 100644 Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs delete mode 100644 Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs.meta delete mode 100644 Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs delete mode 100644 Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs.meta delete mode 100644 Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef delete mode 100644 Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef.meta delete mode 100644 Packages/UnityFx.Outline/README.md delete mode 100644 Packages/UnityFx.Outline/README.md.meta delete mode 100644 Packages/UnityFx.Outline/Runtime.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Prefabs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset delete mode 100644 Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs delete mode 100644 Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Shaders.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader delete mode 100644 Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader delete mode 100644 Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader delete mode 100644 Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader.meta delete mode 100644 Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef delete mode 100644 Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef.meta delete mode 100644 Packages/UnityFx.Outline/Tests.meta delete mode 100644 Packages/UnityFx.Outline/Tests/Editor.meta delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts.meta delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers.meta delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs.meta delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs.meta delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineBehaviourTests.cs delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineBehaviourTests.cs.meta delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs.meta delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerTests.cs delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerTests.cs.meta delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineRendererTests.cs delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineRendererTests.cs.meta delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineSettingsTests.cs delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineSettingsTests.cs.meta delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/UnityFx.Outline.Editor.Tests.asmdef delete mode 100644 Packages/UnityFx.Outline/Tests/Editor/UnityFx.Outline.Editor.Tests.asmdef.meta delete mode 100644 Packages/UnityFx.Outline/package.json delete mode 100644 Packages/UnityFx.Outline/package.json.meta diff --git a/Assets/Examples.meta b/Assets/Examples.meta deleted file mode 100644 index 040f581..0000000 --- a/Assets/Examples.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cd9a1f8eda7b3ae4da8c3a27817dae4e -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Examples/PostProcessing.meta b/Assets/Examples/PostProcessing.meta deleted file mode 100644 index ff5cf73..0000000 --- a/Assets/Examples/PostProcessing.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0afa5bb63d529a84daf887e3dc44b420 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Examples/PostProcessing/PostProcessingProfile.asset b/Assets/Examples/PostProcessing/PostProcessingProfile.asset deleted file mode 100644 index 725ebe2..0000000 --- a/Assets/Examples/PostProcessing/PostProcessingProfile.asset +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8e6292b2c06870d4495f009f912b9600, type: 3} - m_Name: PostProcessingProfile - m_EditorClassIdentifier: - settings: - - {fileID: 114600372921182068} ---- !u!114 &114600372921182068 -MonoBehaviour: - m_ObjectHideFlags: 3 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 362f6fe821115814693a671c047d5f31, type: 3} - m_Name: Outline - m_EditorClassIdentifier: - active: 1 - enabled: - overrideState: 1 - value: 1 - _defaultResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, type: 2} - Resources: - overrideState: 0 - value: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, type: 2} - Layers: - overrideState: 0 - value: {fileID: 0} diff --git a/Assets/Examples/PostProcessing/PostProcessingProfile.asset.meta b/Assets/Examples/PostProcessing/PostProcessingProfile.asset.meta deleted file mode 100644 index c432c9a..0000000 --- a/Assets/Examples/PostProcessing/PostProcessingProfile.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d4e92bcee87e63243abc9035c870abe2 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Examples/PostProcessing/PostProcessingSample.unity b/Assets/Examples/PostProcessing/PostProcessingSample.unity deleted file mode 100644 index 289e850..0000000 --- a/Assets/Examples/PostProcessing/PostProcessingSample.unity +++ /dev/null @@ -1,644 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44657844, g: 0.49641222, b: 0.57481694, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 1 - m_LightmapEditorSettings: - serializedVersion: 10 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 0 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVRBounces: 2 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVRFilteringMode: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ShowResolutionOverlay: 1 - m_LightingDataAsset: {fileID: 0} - m_UseShadowmask: 1 ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &167171210 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 167171212} - - component: {fileID: 167171211} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &167171211 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 167171210} - m_Enabled: 1 - serializedVersion: 8 - m_Type: 1 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 0.5 - m_Range: 10 - m_SpotAngle: 30 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &167171212 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 167171210} - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &692811812 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 692811816} - - component: {fileID: 692811815} - - component: {fileID: 692811813} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &692811813 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 692811812} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 948f4100a11a5c24981795d21301da5c, type: 3} - m_Name: - m_EditorClassIdentifier: - volumeTrigger: {fileID: 692811816} - volumeLayer: - serializedVersion: 2 - m_Bits: 256 - stopNaNPropagation: 1 - finalBlitToCameraTarget: 0 - antialiasingMode: 0 - temporalAntialiasing: - jitterSpread: 0.75 - sharpness: 0.25 - stationaryBlending: 0.95 - motionBlending: 0.85 - subpixelMorphologicalAntialiasing: - quality: 2 - fastApproximateAntialiasing: - fastMode: 0 - keepAlpha: 0 - fog: - enabled: 1 - excludeSkybox: 1 - debugLayer: - lightMeter: - width: 512 - height: 256 - showCurves: 1 - histogram: - width: 512 - height: 256 - channel: 3 - waveform: - exposure: 0.12 - height: 256 - vectorscope: - size: 256 - exposure: 0.12 - overlaySettings: - linearDepth: 0 - motionColorIntensity: 4 - motionGridSize: 64 - colorBlindnessType: 0 - colorBlindnessStrength: 1 - m_Resources: {fileID: 11400000, guid: d82512f9c8e5d4a4d938b575d47f88d4, type: 2} - m_ShowToolkit: 0 - m_ShowCustomSorter: 0 - breakBeforeColorGrading: 0 - m_BeforeTransparentBundles: [] - m_BeforeStackBundles: - - assemblyQualifiedName: UnityFx.Outline.PostProcessing.Outline, UnityFx.Outline.PostProcessing, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_AfterStackBundles: [] ---- !u!20 &692811815 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 692811812} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_GateFitMode: 2 - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 1 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &692811816 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 692811812} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1579373806} - - {fileID: 748173443} - - {fileID: 1789341921} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &748173439 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 748173443} - - component: {fileID: 748173442} - - component: {fileID: 748173441} - - component: {fileID: 748173440} - m_Layer: 0 - m_Name: Cube - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!23 &748173440 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748173439} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!65 &748173441 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748173439} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!33 &748173442 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748173439} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &748173443 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748173439} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -1.51, y: 0, z: 4} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 692811816} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &880286468 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 880286470} - - component: {fileID: 880286469} - m_Layer: 8 - m_Name: PostProcessingVolume - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &880286469 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 880286468} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8b9a305e18de0c04dbd257a21cd47087, type: 3} - m_Name: - m_EditorClassIdentifier: - sharedProfile: {fileID: 11400000, guid: d4e92bcee87e63243abc9035c870abe2, type: 2} - isGlobal: 1 - blendDistance: 0 - weight: 1 - priority: 0 ---- !u!4 &880286470 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 880286468} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1579373802 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1579373806} - - component: {fileID: 1579373805} - - component: {fileID: 1579373804} - - component: {fileID: 1579373803} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!23 &1579373803 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1579373802} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!135 &1579373804 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1579373802} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!33 &1579373805 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1579373802} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1579373806 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1579373802} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 4} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 692811816} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1789341920 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1789341921} - - component: {fileID: 1789341925} - - component: {fileID: 1789341924} - - component: {fileID: 1789341923} - m_Layer: 0 - m_Name: Cylinder - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1789341921 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1789341920} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 1.5, y: 0, z: 4} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 692811816} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!23 &1789341923 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1789341920} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!136 &1789341924 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1789341920} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - m_Radius: 0.5 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!33 &1789341925 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1789341920} - m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Examples/PostProcessing/PostProcessingSample.unity.meta b/Assets/Examples/PostProcessing/PostProcessingSample.unity.meta deleted file mode 100644 index 8ca40bd..0000000 --- a/Assets/Examples/PostProcessing/PostProcessingSample.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 4d21e5bd8f334a040a5dd6da35054df4 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Examples/SimplePerCamera.meta b/Assets/Examples/SimplePerCamera.meta deleted file mode 100644 index 31b3630..0000000 --- a/Assets/Examples/SimplePerCamera.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 874c6e35dd593604d9dc8bf919bc94d7 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Examples/SimplePerCamera/Outline.unity b/Assets/Examples/SimplePerCamera/Outline.unity deleted file mode 100644 index c172ec7..0000000 --- a/Assets/Examples/SimplePerCamera/Outline.unity +++ /dev/null @@ -1,586 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44657844, g: 0.49641222, b: 0.57481694, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 1 - m_LightmapEditorSettings: - serializedVersion: 10 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 0 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVRBounces: 2 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVRFilteringMode: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ShowResolutionOverlay: 1 - m_LightingDataAsset: {fileID: 0} - m_UseShadowmask: 1 ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &167171210 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 167171212} - - component: {fileID: 167171211} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &167171211 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 167171210} - m_Enabled: 1 - serializedVersion: 8 - m_Type: 1 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 0.5 - m_Range: 10 - m_SpotAngle: 30 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &167171212 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 167171210} - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &692811812 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 692811816} - - component: {fileID: 692811815} - - component: {fileID: 692811818} - - component: {fileID: 692811817} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!20 &692811815 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 692811812} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_GateFitMode: 2 - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &692811816 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 692811812} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1579373806} - - {fileID: 748173443} - - {fileID: 1789341921} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &692811817 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 692811812} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5a318c96b1bc1614683eccf7abd717a1, type: 3} - m_Name: - m_EditorClassIdentifier: - _outlineGos: - - {fileID: 1579373802} - - {fileID: 748173439} ---- !u!114 &692811818 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 692811812} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 270d3185d159bf54fb4cddbb42235437, type: 3} - m_Name: - m_EditorClassIdentifier: - _outlineResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, type: 2} - _outlineLayers: {fileID: 11400000, guid: 3a6c3b3c5f6e3ad4ab8e09fc219865bd, type: 2} - _cameraEvent: 18 ---- !u!1 &748173439 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 748173443} - - component: {fileID: 748173442} - - component: {fileID: 748173441} - - component: {fileID: 748173440} - m_Layer: 0 - m_Name: Cube - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!23 &748173440 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748173439} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!65 &748173441 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748173439} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!33 &748173442 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748173439} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &748173443 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748173439} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -1, y: 0, z: 5.58} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 692811816} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1579373802 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1579373806} - - component: {fileID: 1579373805} - - component: {fileID: 1579373804} - - component: {fileID: 1579373803} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!23 &1579373803 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1579373802} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!135 &1579373804 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1579373802} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!33 &1579373805 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1579373802} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1579373806 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1579373802} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 4} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 692811816} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1789341920 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1789341921} - - component: {fileID: 1789341925} - - component: {fileID: 1789341924} - - component: {fileID: 1789341923} - - component: {fileID: 1789341922} - m_Layer: 0 - m_Name: Cylinder - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1789341921 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1789341920} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 1.5, y: 0, z: 4} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 692811816} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1789341922 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1789341920} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 271c580db5fd384429cdac899152e9e0, type: 3} - m_Name: - m_EditorClassIdentifier: - _outlineResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, type: 2} - _outlineSettings: - _outlineSettings: {fileID: 0} - _outlineColor: {r: 0, g: 1, b: 0, a: 1} - _outlineWidth: 15 - _outlineIntensity: 2 - _outlineMode: 1 - _depthTestEnabled: 0 ---- !u!23 &1789341923 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1789341920} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!136 &1789341924 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1789341920} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - m_Radius: 0.5 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!33 &1789341925 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1789341920} - m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Examples/SimplePerCamera/Outline.unity.meta b/Assets/Examples/SimplePerCamera/Outline.unity.meta deleted file mode 100644 index bb769c6..0000000 --- a/Assets/Examples/SimplePerCamera/Outline.unity.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: e1f1f5e7ceb61b746b9f2016f0e53a93 -timeCreated: 1566127107 -licenseType: Free -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs b/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs deleted file mode 100644 index 444b39c..0000000 --- a/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs +++ /dev/null @@ -1,88 +0,0 @@ -// 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.Examples -{ - /// - /// Helperr class for managing outlines from editor. - /// - [RequireComponent(typeof(OutlineEffect))] - public class OutlineEffectBuilder : MonoBehaviour - { - #region data - -#pragma warning disable 0649 - - [SerializeField] - private GameObject[] _outlineGos; - -#pragma warning restore 0649 - - private OutlineEffect _outlineEffect; - private OutlineLayer _outlineLayer; - - #endregion - - #region MonoBehaviour - - private void Awake() - { - if (_outlineEffect == null) - { - _outlineEffect = GetComponent(); - } - - if (_outlineLayer == null) - { - if (_outlineEffect.OutlineLayers.Count > 0) - { - _outlineLayer = _outlineEffect.OutlineLayers[0]; - } - else - { - _outlineLayer = new OutlineLayer(); - _outlineEffect.OutlineLayers.Add(_outlineLayer); - } - } - - foreach (var go in _outlineGos) - { - if (go) - { - _outlineLayer.Add(go); - } - } - } - - private void OnValidate() - { - if (_outlineEffect == null) - { - _outlineEffect = GetComponent(); - } - - if (_outlineEffect.OutlineLayers.Count > 0) - { - _outlineLayer = _outlineEffect.OutlineLayers[0]; - } - else - { - _outlineLayer = new OutlineLayer(); - _outlineEffect.OutlineLayers.Add(_outlineLayer); - } - - foreach (var go in _outlineGos) - { - if (go) - { - _outlineLayer.Add(go); - } - } - } - - #endregion - } -} diff --git a/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs.meta b/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs.meta deleted file mode 100644 index 7150935..0000000 --- a/Assets/Examples/SimplePerCamera/OutlineEffectBuilder.cs.meta +++ /dev/null @@ -1,13 +0,0 @@ -fileFormatVersion: 2 -guid: 5a318c96b1bc1614683eccf7abd717a1 -timeCreated: 1566138009 -licenseType: Free -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset b/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset deleted file mode 100644 index 3de703c..0000000 --- a/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset +++ /dev/null @@ -1,43 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 57d0c11168277cf4eb3b4b89706e6aa5, type: 3} - m_Name: TestOutlineLayers - m_EditorClassIdentifier: - _layers: - - _settings: - _outlineSettings: {fileID: 11400000, guid: 45705bbb29366194eb01ca517d80967c, - type: 2} - _outlineColor: {r: 1, g: 0, b: 0, a: 1} - _outlineWidth: 5 - _outlineIntensity: 2 - _outlineMode: 0 - _name: - _zOrder: 0 - _enabled: 1 - - _settings: - _outlineSettings: {fileID: 0} - _outlineColor: {r: 1, g: 1, b: 0, a: 1} - _outlineWidth: 15 - _outlineIntensity: 2 - _outlineMode: 1 - _name: - _zOrder: 0 - _enabled: 1 - - _settings: - _outlineSettings: {fileID: 0} - _outlineColor: {r: 1, g: 0, b: 1, a: 1} - _outlineWidth: 4 - _outlineIntensity: 2 - _outlineMode: 0 - _name: - _zOrder: 0 - _enabled: 1 diff --git a/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset.meta b/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset.meta deleted file mode 100644 index 354a62d..0000000 --- a/Assets/Examples/SimplePerCamera/TestOutlineLayers.asset.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 3a6c3b3c5f6e3ad4ab8e09fc219865bd -timeCreated: 1566565181 -licenseType: Pro -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Examples/SimplePerObject.meta b/Assets/Examples/SimplePerObject.meta deleted file mode 100644 index 9c27014..0000000 --- a/Assets/Examples/SimplePerObject.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: dc9211a2b55b6d44098fcc852d15936c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Examples/SimplePerObject/TestOutlineSettings.asset b/Assets/Examples/SimplePerObject/TestOutlineSettings.asset deleted file mode 100644 index a32e433..0000000 --- a/Assets/Examples/SimplePerObject/TestOutlineSettings.asset +++ /dev/null @@ -1,18 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b579424fd3338724cba3155ee4d53475, type: 3} - m_Name: TestOutlineSettings - m_EditorClassIdentifier: - _outlineColor: {r: 1, g: 0, b: 0, a: 1} - _outlineWidth: 5 - _outlineIntensity: 1 - _outlineMode: 0 diff --git a/Assets/Examples/SimplePerObject/TestOutlineSettings.asset.meta b/Assets/Examples/SimplePerObject/TestOutlineSettings.asset.meta deleted file mode 100644 index 253e14e..0000000 --- a/Assets/Examples/SimplePerObject/TestOutlineSettings.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 45705bbb29366194eb01ca517d80967c -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline.HDRP/CHANGELOG.md b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/CHANGELOG.md similarity index 100% rename from Packages/UnityFx.Outline.HDRP/CHANGELOG.md rename to Outline.HDRP/Packages/UnityFx.Outline.HDRP/CHANGELOG.md diff --git a/Packages/UnityFx.Outline.HDRP/CHANGELOG.md.meta b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/CHANGELOG.md.meta similarity index 100% rename from Packages/UnityFx.Outline.HDRP/CHANGELOG.md.meta rename to Outline.HDRP/Packages/UnityFx.Outline.HDRP/CHANGELOG.md.meta diff --git a/Packages/UnityFx.Outline.HDRP/README.md b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/README.md similarity index 100% rename from Packages/UnityFx.Outline.HDRP/README.md rename to Outline.HDRP/Packages/UnityFx.Outline.HDRP/README.md diff --git a/Packages/UnityFx.Outline.HDRP/README.md.meta b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/README.md.meta similarity index 100% rename from Packages/UnityFx.Outline.HDRP/README.md.meta rename to Outline.HDRP/Packages/UnityFx.Outline.HDRP/README.md.meta diff --git a/Packages/UnityFx.Outline.HDRP/Runtime.meta b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime.meta similarity index 100% rename from Packages/UnityFx.Outline.HDRP/Runtime.meta rename to Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime.meta diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/Scripts.meta b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/Scripts.meta similarity index 100% rename from Packages/UnityFx.Outline.HDRP/Runtime/Scripts.meta rename to Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/Scripts.meta diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs similarity index 100% rename from Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs rename to Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta similarity index 100% rename from Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta rename to Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs.meta diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef similarity index 100% rename from Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef rename to Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef diff --git a/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef.meta b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef.meta similarity index 100% rename from Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef.meta rename to Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/UnityFx.Outline.HDRP.asmdef.meta diff --git a/Packages/UnityFx.Outline.HDRP/package.json b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/package.json similarity index 100% rename from Packages/UnityFx.Outline.HDRP/package.json rename to Outline.HDRP/Packages/UnityFx.Outline.HDRP/package.json diff --git a/Packages/UnityFx.Outline.HDRP/package.json.meta b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/package.json.meta similarity index 100% rename from Packages/UnityFx.Outline.HDRP/package.json.meta rename to Outline.HDRP/Packages/UnityFx.Outline.HDRP/package.json.meta diff --git a/Packages/manifest.json b/Outline.HDRP/Packages/manifest.json similarity index 91% rename from Packages/manifest.json rename to Outline.HDRP/Packages/manifest.json index ca7d94d..1acdf96 100644 --- a/Packages/manifest.json +++ b/Outline.HDRP/Packages/manifest.json @@ -1,8 +1,8 @@ { "dependencies": { - "com.unity.package-manager-ui": "2.0.8", - "com.unity.postprocessing": "2.3.0", + "com.unityfx.outline": "file:../../Outline.Core/Packages/UnityFx.Outline", "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", "com.unity.modules.assetbundle": "1.0.0", "com.unity.modules.audio": "1.0.0", diff --git a/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md b/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md deleted file mode 100644 index 3a73de8..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# UnityFx.Outline.PostProcessing changelog -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.1.0] - unreleased - -### Added -- Initial release. diff --git a/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md.meta b/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md.meta deleted file mode 100644 index 73d1d67..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: d5d97340f52aca745b5b5d55c881ebc5 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline.PostProcessing/README.md b/Packages/UnityFx.Outline.PostProcessing/README.md deleted file mode 100644 index 1fc72d2..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# UnityFx.Outline.PostProcessing - -## SUMMARY -Screen-space outline effects for Unity Post-processing Stack v2. - -## USEFUL LINKS -* [Github project](https://github.com/Arvtesh/UnityFx.Outline) -* [npm package](https://www.npmjs.com/package/com.unityfx.outline.postprocessing) -* [Documentation](https://github.com/Arvtesh/UnityFx.Outline/blob/master/README.md) -* [License](https://github.com/Arvtesh/UnityFx.Outline/blob/master/LICENSE.md) -* [Support](mailto:arvtesh@gmail.com) diff --git a/Packages/UnityFx.Outline.PostProcessing/README.md.meta b/Packages/UnityFx.Outline.PostProcessing/README.md.meta deleted file mode 100644 index 48d5112..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/README.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 9b8ad98b0bcd54241b6b9c186551ecc3 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline.PostProcessing/Runtime.meta b/Packages/UnityFx.Outline.PostProcessing/Runtime.meta deleted file mode 100644 index 9898607..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/Runtime.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 58b0863f5e2afd341a39b8095514add5 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts.meta b/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts.meta deleted file mode 100644 index 0fe0ce1..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 96bc3f6fffa960f4691dcc70b0dc8a02 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs b/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs deleted file mode 100644 index e7ef71d..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs +++ /dev/null @@ -1,65 +0,0 @@ -// 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; -using UnityEngine.Rendering.PostProcessing; - -namespace UnityFx.Outline.PostProcessing -{ - [Serializable] - [PostProcess(typeof(OutlineEffectRenderer), PostProcessEvent.BeforeStack, "UnityFx/Outline", false)] - public sealed class Outline : PostProcessEffectSettings - { -#pragma warning disable 0649 - - [SerializeField] - private OutlineResources _defaultResources; - -#pragma warning restore 0649 - - [Serializable] - public class OutlineResourcesParameter : ParameterOverride - { - internal Outline Settings; - - protected override void OnEnable() - { - if (value == null) - { - value = Settings._defaultResources; - } - } - } - - [Serializable] - public class OutlineLayersParameter : ParameterOverride - { - } - - // NOTE: PostProcessEffectSettings.OnEnable implementation requires the fields to be public to function properly. - public OutlineResourcesParameter Resources = new OutlineResourcesParameter(); - public OutlineLayersParameter Layers = new OutlineLayersParameter(); - - public Outline() - { - // NOTE: The better way to do this is implementing OnEnable(), but it is already implemented as private (!!!) method in PostProcessEffectSettings. - Resources.Settings = this; - } - - public override bool IsEnabledAndSupported(PostProcessRenderContext context) - { -#if UNITY_EDITOR - - // Don't render outline preview when the editor is not playing. - if (!Application.isPlaying) - { - return false; - } - -#endif - - return base.IsEnabledAndSupported(context) && Resources != null && Layers != null && Layers.value != null; - } - } -} diff --git a/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs.meta b/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs.meta deleted file mode 100644 index 063c836..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/Outline.cs.meta +++ /dev/null @@ -1,13 +0,0 @@ -fileFormatVersion: 2 -guid: 362f6fe821115814693a671c047d5f31 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: - - _defaultResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, - type: 2} - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs b/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs deleted file mode 100644 index 3b8cf2f..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs +++ /dev/null @@ -1,55 +0,0 @@ -// 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; -using UnityEngine.Rendering.PostProcessing; -using UnityEngine.Scripting; - -namespace UnityFx.Outline.PostProcessing -{ - [Preserve] - public sealed class OutlineEffectRenderer : PostProcessEffectRenderer - { - private OutlineResources _defaultResources; - - public override void Render(PostProcessRenderContext context) - { - OutlineResources resources; - - if (settings.Resources.value != null) - { - resources = settings.Resources; - } - else - { - if (!_defaultResources) - { - _defaultResources = ScriptableObject.CreateInstance(); - _defaultResources.ResetToDefaults(); - _defaultResources.FullscreenTriangleMesh = RuntimeUtilities.fullscreenTriangle; - } - - resources = _defaultResources; - } - - if (resources && resources.IsValid) - { - using (var renderer = new OutlineRenderer(context.command, context.source, context.destination)) - { - settings.Layers.value.Render(renderer, resources); - } - } - } - - public override void Release() - { - if (_defaultResources) - { - ScriptableObject.Destroy(_defaultResources); - } - - base.Release(); - } - } -} diff --git a/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs.meta b/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs.meta deleted file mode 100644 index 4fbea54..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/Runtime/Scripts/OutlineEffectRenderer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 94b195a6784c3664eb4f501e87f38ce3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef b/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef deleted file mode 100644 index 7ccfffc..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "UnityFx.Outline.PostProcessing", - "references": [ - "Unity.Postprocessing.Runtime", - "UnityFx.Outline" - ], - "optionalUnityReferences": [], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [] -} \ No newline at end of file diff --git a/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef.meta b/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef.meta deleted file mode 100644 index c9386d2..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/Runtime/UnityFx.Outline.PostProcessing.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 8e3d165dc2f9115429adabaabad94f93 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline.PostProcessing/package.json b/Packages/UnityFx.Outline.PostProcessing/package.json deleted file mode 100644 index 49d5161..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "com.unityfx.outline.postprocessing", - "version": "0.1.0", - "displayName": "Screen-space outline (Post-processing v2)", - "description": "Configurable outline for Unity post-processing stack (v2). Both solid and blurred modes supported (Gauss blur).", - "unity": "2018.4", - "dependencies": { - "com.unityfx.outline": "0.8.0", - "com.unity.postprocessing": "2.2.2" - }, - "keywords": [ - "UnityFx", - "UnityFx.Outline", - "UnityFx.Outline.PostProcessing", - "Outline", - "Post-processing", - "Post-effect" - ], - "category": "UnityFx", - "author": { - "name": "Arvtesh", - "email": "arvtesh@gmail.com" - }, - "license": "MIT", - "homepage": "https://github.com/Arvtesh/UnityFx.Outline", - "repository": { - "type": "git", - "url": "https://github.com/Arvtesh/UnityFx.Outline.git" - }, - "bugs": { - "url": "https://github.com/Arvtesh/UnityFx.Outline/issues" - } -} diff --git a/Packages/UnityFx.Outline.PostProcessing/package.json.meta b/Packages/UnityFx.Outline.PostProcessing/package.json.meta deleted file mode 100644 index 62b5420..0000000 --- a/Packages/UnityFx.Outline.PostProcessing/package.json.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 5e0ccba19a9670b46ad359a388c4ddc5 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/CHANGELOG.md b/Packages/UnityFx.Outline/CHANGELOG.md deleted file mode 100644 index c7d442d..0000000 --- a/Packages/UnityFx.Outline/CHANGELOG.md +++ /dev/null @@ -1,106 +0,0 @@ -# UnityFx.Outline changelog -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.7.1] - 2020.01.28 - -Bugfixes and project layout changes. - -### Fixed -- Fixed `OutlineBehaviour` to allow changing its state while its `GameObject` is inactive. - -## [0.7.0] - 2019.11.26 - -`MaterialPropertyBlock`-based rendering and [Unity Post-processing Stack v2](https://github.com/Unity-Technologies/PostProcessing/tree/v2) compatibility. - -### Added -- Moved to for `MaterialPropertyBlock`-based rendering. This is in-line with Unity post-processing Stack and is more performant approach. -- Significant optimizations made to `OutlineRenderer`. - -### Changed -- `IOutlineSettings` now implements `IEquatable`. -- Changed all outline shaders to use HLSL-based macros. -- Modified all shaders to ignore MVP vertex transform to be compatible with the new rendering model. -- Exposed rendering APIs for `OutlineLayer` and `OutlineLayerCollection`. - -### Fixed -- Fixed `TiledGPUPerformanceWarning` on mobile targets. - -### Removed -- Removed `OutlineMaterialSet` class. It is not used in `MaterialPropertyBlock`-based effect rendering. - -## [0.6.0] - 2019.09.26 - -Quality of life improvements. - -### Added -- Added `OutlineLayer.Enabled`. -- Added `OutlineLayer.Name`. -- Added possibility to change render order of layers via `OutlineLayer.Priority`. -- Added possibility to edit renderers of an `OutlineLayer`. -- Added possibility to alter `CameraEvent` used to render `OutlineEffect`. -- Added more info to the `OutlineLayer` preview inspector. - -### Changed -- `IOutilneSettings` setters now throw if overriden. - -### Fixed -- Fixed `OutlineLayer.Add` not filtering renderers by the mask passed. - -## [0.5.0] - 2019.09.09 - -Editor UI improvements and unit tests. - -### Added -- Added `OutlineSettings`, that can be shared between dfferent `OutlineLayer` and `OutlineBehaviour` instances. -- Added custom inspectors for `OutlineSettings`, `OutlineLayerCollection`. -- Added undo/redo support to all custom inspectors. -- Added unit-tests. - -### Changed -- Improved inspectors for `OutlineBehaviour` and `OutlineEffect`. - -## [0.4.0] - 2019.08.31 - -Blurred outlines. - -### Added -- Added Gauss blurring to outlines. -- Added outline mode parameter (possible values are `Solid` and `Blurred`). -- Added outline intensity parameter (for blurred outlines only). -- Added `IOutlineSettings` interface to make outline settings the same for `OutlineBehaviour` and `OutlineLayer`. -- Added `OutlineMaterialSet` helper. - -### Changed -- Changed solid outline to use Gauss sampling (to achieve smoother outlines). -- Changed outline implementation to use different passed for horizontal and vertical sampling (to make algorithm complexity linear instead of quadric). - -### Fixed -- Fixed an issue with `OutlineBehaviour` not rendering outlines if attached to a `GameObject` with no renderers. - -### Removed -- Removed `OutlineResourceCache` class. - -## [0.3.0] - 2019.08.27 - -### Added -- Added support for sharing outline layers between `OutlineEffect` instances. -- Added custom editors for `OutlineEffect` and `OutlineBehaviour`. -- Added possibility to setup outline layers as `ScriptableObject` asset. - -### Fixed -- Fixed profiler error 'BeginSample and EndSample count must match'. - -## [0.2.0] - 2019.08.19 - -### Added -- Added `OutlineBehaviour` for rendering per-object outlines. -- Added `OutlineResources` to help initialize outline effects in runtime. -- Added `OutlineRenderer` as low-level helper for outline rendering. - -## [0.1.0] - 2019.08.18 - -### Added -- Initial release. - diff --git a/Packages/UnityFx.Outline/CHANGELOG.md.meta b/Packages/UnityFx.Outline/CHANGELOG.md.meta deleted file mode 100644 index b191c07..0000000 --- a/Packages/UnityFx.Outline/CHANGELOG.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: a0afeafc656ad714fbfb0e40dc4587e1 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Editor.meta b/Packages/UnityFx.Outline/Editor.meta deleted file mode 100644 index c29e17b..0000000 --- a/Packages/UnityFx.Outline/Editor.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 155cf68da709a7a4da2ba665007263f2 -folderAsset: yes -timeCreated: 1566558257 -licenseType: Pro -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Editor/Scripts.meta b/Packages/UnityFx.Outline/Editor/Scripts.meta deleted file mode 100644 index 7da429c..0000000 --- a/Packages/UnityFx.Outline/Editor/Scripts.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 15c9c665be3d06048bebd0e20ec2b173 -folderAsset: yes -timeCreated: 1566558344 -licenseType: Pro -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs b/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs deleted file mode 100644 index 492498a..0000000 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using UnityEditor; -using UnityEditor.SceneManagement; -using UnityEngine; - -namespace UnityFx.Outline -{ - [CustomEditor(typeof(OutlineBehaviour))] - public class OutlineBehaviourEditor : Editor - { - private OutlineBehaviour _effect; - private bool _debugOpened; - private bool _renderersOpened; - private bool _camerasOpened; - - private void OnEnable() - { - _effect = (OutlineBehaviour)target; - } - - public override void OnInspectorGUI() - { - base.OnInspectorGUI(); - - // 1) Outline settings. - EditorGUI.BeginChangeCheck(); - - OutlineEditorUtility.Render(_effect, _effect); - - if (EditorGUI.EndChangeCheck()) - { - EditorUtility.SetDirty(_effect.gameObject); - - if (!EditorApplication.isPlayingOrWillChangePlaymode) - { - EditorSceneManager.MarkSceneDirty(_effect.gameObject.scene); - } - } - - // 2) Renderers (read-only). - _renderersOpened = EditorGUILayout.Foldout(_renderersOpened, "Renderers", true); - - if (_renderersOpened) - { - EditorGUI.BeginDisabledGroup(true); - EditorGUI.indentLevel += 1; - - var rendererNumber = 1; - - foreach (var renderer in _effect.OutlineRenderers) - { - EditorGUILayout.ObjectField("#" + rendererNumber.ToString(), renderer, typeof(Renderer), true); - rendererNumber++; - } - - EditorGUI.indentLevel -= 1; - EditorGUI.EndDisabledGroup(); - } - - // 3) Cameras (read-only). - _camerasOpened = EditorGUILayout.Foldout(_camerasOpened, "Cameras", true); - - if (_camerasOpened) - { - EditorGUI.BeginDisabledGroup(true); - EditorGUI.indentLevel += 1; - - var cameraNumber = 1; - - foreach (var camera in _effect.Cameras) - { - EditorGUILayout.ObjectField("#" + cameraNumber.ToString(), camera, typeof(Camera), true); - cameraNumber++; - } - - EditorGUI.indentLevel -= 1; - EditorGUI.EndDisabledGroup(); - } - } - } -} diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs.meta b/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs.meta deleted file mode 100644 index 1c3d375..0000000 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineBehaviourEditor.cs.meta +++ /dev/null @@ -1,13 +0,0 @@ -fileFormatVersion: 2 -guid: a6e77a9d499a86e4fbdc52a2977e774f -timeCreated: 1566572433 -licenseType: Pro -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs b/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs deleted file mode 100644 index 3f82a55..0000000 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEditor; -using UnityEngine; - -namespace UnityFx.Outline -{ - public static class OutlineEditorUtility - { - public static void RenderDivider(Color color, int thickness = 1, int padding = 5) - { - var r = EditorGUILayout.GetControlRect(GUILayout.Height(padding + thickness)); - - r.height = thickness; - r.y += padding / 2; - r.x -= 2; - - EditorGUI.DrawRect(r, color); - } - - public static void Render(IOutlineSettingsEx settings, UnityEngine.Object undoContext) - { - var obj = (OutlineSettings)EditorGUILayout.ObjectField("Outline Settings", settings.OutlineSettings, typeof(OutlineSettings), true); - - if (settings.OutlineSettings != obj) - { - Undo.RecordObject(undoContext, "Settings"); - settings.OutlineSettings = obj; - } - - if (obj) - { - EditorGUI.BeginDisabledGroup(true); - EditorGUI.indentLevel += 1; - - Render((IOutlineSettings)settings, undoContext); - - EditorGUILayout.HelpBox(string.Format("Outline settings are overriden with values from {0}.", obj.name), MessageType.Info, true); - EditorGUI.indentLevel -= 1; - EditorGUI.EndDisabledGroup(); - } - else - { - EditorGUI.indentLevel += 1; - - Render((IOutlineSettings)settings, undoContext); - - EditorGUI.indentLevel -= 1; - } - } - - public static void Render(IOutlineSettings settings, UnityEngine.Object undoContext) - { - var color = EditorGUILayout.ColorField("Color", settings.OutlineColor); - - if (settings.OutlineColor != color) - { - Undo.RecordObject(undoContext, "Color"); - settings.OutlineColor = color; - } - - var width = EditorGUILayout.IntSlider("Width", settings.OutlineWidth, OutlineRenderer.MinWidth, OutlineRenderer.MaxWidth); - - if (settings.OutlineWidth != width) - { - Undo.RecordObject(undoContext, "Width"); - settings.OutlineWidth = width; - } - - var prevBlurred = (settings.OutlineRenderMode & OutlineRenderFlags.Blurred) != 0; - var blurred = EditorGUILayout.Toggle("Blurred", prevBlurred); - - if (blurred) - { - EditorGUI.indentLevel += 1; - - var i = EditorGUILayout.Slider("Blur Intensity", settings.OutlineIntensity, OutlineRenderer.MinIntensity, OutlineRenderer.MaxIntensity); - - if (!Mathf.Approximately(settings.OutlineIntensity, i)) - { - Undo.RecordObject(undoContext, "Blur Intensity"); - settings.OutlineIntensity = i; - } - - EditorGUI.indentLevel -= 1; - } - - if (blurred != prevBlurred) - { - Undo.RecordObject(undoContext, "Blur"); - - if (blurred) - { - settings.OutlineRenderMode |= OutlineRenderFlags.Blurred; - } - else - { - settings.OutlineRenderMode &= ~OutlineRenderFlags.Blurred; - } - } - - var prevDepthTestEnabled = (settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0; - var depthTestEnabled = EditorGUILayout.Toggle("Depth Test", prevDepthTestEnabled); - - if (depthTestEnabled != prevDepthTestEnabled) - { - Undo.RecordObject(undoContext, "Depth Test"); - - if (depthTestEnabled) - { - settings.OutlineRenderMode |= OutlineRenderFlags.EnableDepthTesting; - } - else - { - settings.OutlineRenderMode &= ~OutlineRenderFlags.EnableDepthTesting; - } - } - } - - public static void RenderPreview(OutlineLayer layer, int layerIndex, bool showObjects) - { - if (layer != null) - { - var goIndex = 1; - - EditorGUILayout.BeginHorizontal(); - EditorGUI.indentLevel += 1; - EditorGUILayout.PrefixLabel("Layer #" + layerIndex.ToString()); - EditorGUI.indentLevel -= 1; - - if (layer.Enabled) - { - EditorGUILayout.LabelField(layer.OutlineRenderMode == OutlineRenderFlags.Solid ? layer.OutlineRenderMode.ToString() : string.Format("Blurred ({0})", layer.OutlineIntensity), GUILayout.MaxWidth(70)); - EditorGUILayout.IntField(layer.OutlineWidth, GUILayout.MaxWidth(100)); - EditorGUILayout.ColorField(layer.OutlineColor, GUILayout.MinWidth(100)); - } - else - { - EditorGUILayout.LabelField("Disabled."); - } - - EditorGUILayout.EndHorizontal(); - - if (showObjects) - { - if (layer.Count > 0) - { - foreach (var go in layer) - { - EditorGUI.indentLevel += 2; - EditorGUILayout.ObjectField("#" + goIndex.ToString(), go, typeof(GameObject), true); - EditorGUI.indentLevel -= 2; - - goIndex++; - } - } - else - { - EditorGUI.indentLevel += 2; - EditorGUILayout.LabelField("No objects."); - EditorGUI.indentLevel -= 2; - } - } - } - else - { - EditorGUILayout.BeginHorizontal(); - EditorGUI.indentLevel += 1; - EditorGUILayout.PrefixLabel("Layer #" + layerIndex.ToString()); - EditorGUI.indentLevel -= 1; - EditorGUILayout.LabelField("Null"); - EditorGUILayout.EndHorizontal(); - } - } - - public static void RenderPreview(IList layers, bool showObjects) - { - EditorGUI.BeginDisabledGroup(true); - - if (layers.Count > 0) - { - for (var i = 0; i < layers.Count; ++i) - { - RenderPreview(layers[i], i, showObjects); - } - } - else - { - EditorGUI.indentLevel += 1; - EditorGUILayout.LabelField("No layers."); - EditorGUI.indentLevel -= 1; - } - - EditorGUI.EndDisabledGroup(); - } - } -} diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs.meta b/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs.meta deleted file mode 100644 index 28953ac..0000000 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEditorUtility.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ba087138029b59d4bbdf0783db0e2606 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs b/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs deleted file mode 100644 index fd4c904..0000000 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEditor; -using UnityEditor.SceneManagement; -using UnityEngine.Rendering; - -namespace UnityFx.Outline -{ - [CustomEditor(typeof(OutlineEffect))] - public class OutlineEffectEditor : Editor - { - private OutlineEffect _effect; - private bool _debugOpened; - private bool _previewOpened; - - private void OnEnable() - { - _effect = (OutlineEffect)target; - } - - public override void OnInspectorGUI() - { - base.OnInspectorGUI(); - - EditorGUI.BeginChangeCheck(); - var e = (CameraEvent)EditorGUILayout.EnumPopup("Render Event", _effect.RenderEvent); - - if (e != _effect.RenderEvent) - { - Undo.RecordObject(_effect, "Set Render Event"); - _effect.RenderEvent = e; - } - - if (EditorGUI.EndChangeCheck()) - { - EditorUtility.SetDirty(_effect.gameObject); - - if (!EditorApplication.isPlayingOrWillChangePlaymode) - { - EditorSceneManager.MarkSceneDirty(_effect.gameObject.scene); - } - } - - if (_effect.OutlineLayers.Count > 0) - { - _previewOpened = EditorGUILayout.Foldout(_previewOpened, "Preview", true); - - if (_previewOpened) - { - OutlineEditorUtility.RenderPreview(_effect.OutlineLayers, true); - } - } - } - } -} diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs.meta b/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs.meta deleted file mode 100644 index 4b3f6af..0000000 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineEffectEditor.cs.meta +++ /dev/null @@ -1,13 +0,0 @@ -fileFormatVersion: 2 -guid: 03c2e35bb52d2ba44882b92d7cde45bf -timeCreated: 1566558360 -licenseType: Pro -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs b/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs deleted file mode 100644 index f0c57e0..0000000 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEditor; -using UnityEngine; - -namespace UnityFx.Outline -{ - [CustomEditor(typeof(OutlineLayerCollection))] - public class OutlineLayerCollectionEditor : Editor - { - private readonly GUILayoutOption _layerButtonStyle = GUILayout.ExpandWidth(false); - private OutlineLayerCollection _layers; - - public override void OnInspectorGUI() - { - base.OnInspectorGUI(); - - EditorGUI.BeginChangeCheck(); - - var removeLayer = -1; - - // 1) Layers list. - if (_layers.Count > 0) - { - for (var i = 0; i < _layers.Count; i++) - { - EditorGUILayout.Space(); - OutlineEditorUtility.RenderDivider(Color.gray); - - EditorGUILayout.BeginHorizontal(); - var enabled = EditorGUILayout.ToggleLeft("Layer #" + i.ToString(), _layers[i].Enabled, EditorStyles.boldLabel); - - if (enabled != _layers[i].Enabled) - { - if (enabled) - { - Undo.RecordObject(_layers, "Enable Layer"); - } - else - { - Undo.RecordObject(_layers, "Disable Layer"); - } - - _layers[i].Enabled = enabled; - } - - GUILayout.FlexibleSpace(); - - if (GUILayout.Button("Remove", _layerButtonStyle)) - { - removeLayer = i; - } - - EditorGUILayout.EndHorizontal(); - EditorGUILayout.Space(); - - var name = EditorGUILayout.TextField("Layer Name", _layers[i].NameTag); - - if (name != _layers[i].NameTag) - { - Undo.RecordObject(_layers, "Set Layer Name"); - _layers[i].NameTag = name; - } - - var priority = EditorGUILayout.IntField("Layer Priority", _layers[i].Priority); - - if (priority != _layers[i].Priority) - { - Undo.RecordObject(_layers, "Set Layer Priority"); - _layers[i].Priority = priority; - } - - OutlineEditorUtility.Render(_layers[i], _layers); - } - } - else - { - EditorGUILayout.HelpBox("The layer collection is empty.", MessageType.Info, true); - } - - // Add/remove processing. - OutlineEditorUtility.RenderDivider(Color.gray); - EditorGUILayout.BeginHorizontal(); - GUILayout.FlexibleSpace(); - - if (GUILayout.Button("Add New", _layerButtonStyle)) - { - Undo.RecordObject(_layers, "Add Layer"); - _layers.Add(new OutlineLayer()); - } - - if (GUILayout.Button("Remove All", _layerButtonStyle)) - { - Undo.RecordObject(_layers, "Remove All Layers"); - _layers.Clear(); - } - - if (removeLayer >= 0) - { - Undo.RecordObject(_layers, "Remove Layer"); - _layers.RemoveAt(removeLayer); - } - - EditorGUILayout.EndHorizontal(); - - if (EditorGUI.EndChangeCheck()) - { - EditorUtility.SetDirty(_layers); - } - } - - private void OnEnable() - { - _layers = (OutlineLayerCollection)target; - } - } -} diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs.meta b/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs.meta deleted file mode 100644 index 528a02e..0000000 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineLayerCollectionEditor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5f4ec5de59e58794b8e34f2ca3c00199 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs b/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs deleted file mode 100644 index efa43c4..0000000 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEditor; -using UnityEngine; - -namespace UnityFx.Outline -{ - [CustomEditor(typeof(OutlineSettings))] - public class OutlineSettingsEditor : Editor - { - private OutlineSettings _settings; - - public override void OnInspectorGUI() - { - EditorGUI.BeginChangeCheck(); - OutlineEditorUtility.Render(_settings, _settings); - - if (EditorGUI.EndChangeCheck()) - { - EditorUtility.SetDirty(_settings); - } - } - - private void OnEnable() - { - _settings = (OutlineSettings)target; - } - } -} diff --git a/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs.meta b/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs.meta deleted file mode 100644 index 2569298..0000000 --- a/Packages/UnityFx.Outline/Editor/Scripts/OutlineSettingsEditor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 28f2a32d8600f8045a4b9a9916ff8801 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef b/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef deleted file mode 100644 index 04858cc..0000000 --- a/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "UnityFx.Outline.Editor", - "references": [ - "UnityFx.Outline" - ], - "optionalUnityReferences": [], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [] -} \ No newline at end of file diff --git a/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef.meta b/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef.meta deleted file mode 100644 index ec90eb8..0000000 --- a/Packages/UnityFx.Outline/Editor/UnityFx.Outline.Editor.asmdef.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 9ce6758f27194b64fadf06ac518b5196 -timeCreated: 1566558329 -licenseType: Pro -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/README.md b/Packages/UnityFx.Outline/README.md deleted file mode 100644 index 2bb00b7..0000000 --- a/Packages/UnityFx.Outline/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# UnityFx.Outline - -## SUMMARY -Screen-space outline effects for Unity. - -## USEFUL LINKS -* [Github project](https://github.com/Arvtesh/UnityFx.Outline) -* [npm package](https://www.npmjs.com/package/com.unityfx.outline) -* [Documentation](https://github.com/Arvtesh/UnityFx.Outline/blob/master/README.md) -* [License](https://github.com/Arvtesh/UnityFx.Outline/blob/master/LICENSE.md) -* [Support](mailto:arvtesh@gmail.com) diff --git a/Packages/UnityFx.Outline/README.md.meta b/Packages/UnityFx.Outline/README.md.meta deleted file mode 100644 index eb46e78..0000000 --- a/Packages/UnityFx.Outline/README.md.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 4b1c4eed7166ed4429494dc10c2a3d6c -timeCreated: 1566148623 -licenseType: Free -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime.meta b/Packages/UnityFx.Outline/Runtime.meta deleted file mode 100644 index d5034b4..0000000 --- a/Packages/UnityFx.Outline/Runtime.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: bc6bfa143e596d949867e28985573575 -folderAsset: yes -timeCreated: 1566126961 -licenseType: Free -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Prefabs.meta b/Packages/UnityFx.Outline/Runtime/Prefabs.meta deleted file mode 100644 index 88c5e98..0000000 --- a/Packages/UnityFx.Outline/Runtime/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 82099d138ba6a5c40a5915c4ca5211fe -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset b/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset deleted file mode 100644 index 5b0a0c7..0000000 --- a/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset +++ /dev/null @@ -1,16 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b503341e0a514e3489c4851727e68257, type: 3} - m_Name: OutlineResources - m_EditorClassIdentifier: - RenderShader: {fileID: 4800000, guid: ac20fbf75bafe454aba5ef3c098349df, type: 3} - HPassShader: {fileID: 4800000, guid: 41c9acbf41c8245498ac9beab378de12, type: 3} - VPassBlendShader: {fileID: 4800000, guid: 1df0cb1700e142f4ca3b28297d3957da, type: 3} diff --git a/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset.meta b/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset.meta deleted file mode 100644 index d66452d..0000000 --- a/Packages/UnityFx.Outline/Runtime/Prefabs/OutlineResources.asset.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: d28e70f030b1a634db9a6a6d5478ef19 -timeCreated: 1566149572 -licenseType: Free -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts.meta b/Packages/UnityFx.Outline/Runtime/Scripts.meta deleted file mode 100644 index fdf3731..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5474ddc00e5e1574cba82c3dbad68ded -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs b/Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs deleted file mode 100644 index d7b9f2c..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("UnityFx.Outline")] -[assembly: AssemblyProduct("UnityFx.Outline")] -[assembly: AssemblyDescription("Screen-space outlines for Unity3d.")] -#if DEBUG -[assembly: AssemblyConfiguration("Debug")] -#else -[assembly: AssemblyConfiguration("Release")] -#endif -[assembly: AssemblyCompany("")] -[assembly: AssemblyCopyright("Copyright © Alexander Bogarsukov 2019-2020")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// Make internals visible to the editor assembly. -[assembly: InternalsVisibleTo("UnityFx.Outline.Editor")] diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs.meta deleted file mode 100644 index dd9f2bd..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/AssemblyInfo.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1613c034178676349be3282789167284 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs b/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs deleted file mode 100644 index c822837..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs +++ /dev/null @@ -1,45 +0,0 @@ -// 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 -{ - /// - /// Generic outline settings. - /// - public interface IOutlineSettings : IEquatable - { - /// - /// Gets or sets outline color. - /// - /// - /// - Color OutlineColor { get; set; } - - /// - /// Gets or sets outline width in pixels. Allowed range is [, ]. - /// - /// - /// - int OutlineWidth { get; set; } - - /// - /// Gets or sets outline intensity value. Allowed range is [, ]. - /// This is used for blurred oulines only (i.e. is set to ). - /// - /// - /// - /// - float OutlineIntensity { get; set; } - - /// - /// Gets or sets outline render mode. - /// - /// - /// - /// - OutlineRenderFlags OutlineRenderMode { get; set; } - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs.meta deleted file mode 100644 index 688fd30..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettings.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: efc18f75d5206f14a80e9306650c858a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs b/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs deleted file mode 100644 index 0939a90..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs +++ /dev/null @@ -1,19 +0,0 @@ -// 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 -{ - /// - /// Extended outline settings. - /// - public interface IOutlineSettingsEx : IOutlineSettings - { - /// - /// Gets or sets serializable outline settings. Set this to non- value to share settings with other components. - /// - OutlineSettings OutlineSettings { get; set; } - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs.meta deleted file mode 100644 index 73a20da..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/IOutlineSettingsEx.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9d3517d0fef6af540b0b046d3b2421dd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs deleted file mode 100644 index 325b329..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs +++ /dev/null @@ -1,372 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Rendering; - -namespace UnityFx.Outline -{ - /// - /// Attach this script to a to add outline effect. It can be configured in edit-time or in runtime via scripts. - /// - /// - [ExecuteInEditMode] - [DisallowMultipleComponent] - public sealed class OutlineBehaviour : MonoBehaviour, IOutlineSettingsEx - { - #region data - -#pragma warning disable 0649 - - [SerializeField, Tooltip("Sets outline resources to use. Do not change the defaults unless you know what you're doing.")] - private OutlineResources _outlineResources; - [SerializeField, HideInInspector] - private OutlineSettingsInstance _outlineSettings; - [SerializeField, Tooltip("If set, list of object renderers is updated on each frame. Enable if the object has child renderers which are enabled/disabled frequently.")] - private bool _updateRenderers; - -#pragma warning restore 0649 - - private OutlineRendererCollection _renderers; - private CommandBuffer _commandBuffer; - - private Dictionary _cameraMap = new Dictionary(); - private float _cameraMapUpdateTimer; - - #endregion - - #region interface - - /// - /// Gets or sets resources used by the effect implementation. - /// - /// Thrown if setter argument is . - public OutlineResources OutlineResources - { - get - { - return _outlineResources; - } - set - { - if (value == null) - { - throw new ArgumentNullException("OutlineResources"); - } - - if (_outlineResources != value) - { - CreateSettingsIfNeeded(); - - _outlineResources = value; - _outlineSettings.OutlineResources = _outlineResources; - } - } - } - - /// - /// Gets outline renderers. By default all child components are used for outlining. - /// - public ICollection OutlineRenderers - { - get - { - CreateRenderersIfNeeded(); - return _renderers; - } - } - - /// - /// Gets all cameras outline data is rendered to. - /// - public ICollection Cameras - { - get - { - return _cameraMap.Keys; - } - } - - #endregion - - #region MonoBehaviour - - private void Awake() - { - CreateRenderersIfNeeded(); - CreateSettingsIfNeeded(); - - _outlineSettings.OutlineResources = _outlineResources; - } - - private void OnDestroy() - { - if (_outlineSettings != null) - { - _outlineSettings.OutlineResources = null; - } - } - - private void OnEnable() - { - CreateCommandBufferIfNeeded(); - Camera.onPreRender += OnCameraPreRender; - } - - private void OnDisable() - { - Camera.onPreRender -= OnCameraPreRender; - - foreach (var kvp in _cameraMap) - { - if (kvp.Key) - { - kvp.Key.RemoveCommandBuffer(OutlineRenderer.RenderEvent, kvp.Value); - } - } - - _cameraMap.Clear(); - - if (_commandBuffer != null) - { - _commandBuffer.Dispose(); - _commandBuffer = null; - } - } - - private void Update() - { - _cameraMapUpdateTimer += Time.deltaTime; - - if (_cameraMapUpdateTimer > 16) - { - RemoveDestroyedCameras(); - _cameraMapUpdateTimer = 0; - } - - if (_outlineResources != null && _renderers != null) - { - if (_updateRenderers) - { - _renderers.Reset(false); - } - - _commandBuffer.Clear(); - - using (var renderer = new OutlineRenderer(_commandBuffer, BuiltinRenderTextureType.CameraTarget)) - { - renderer.Render(_renderers.GetList(), _outlineSettings.OutlineResources, _outlineSettings); - } - } - } - -#if UNITY_EDITOR - - private void OnValidate() - { - CreateRenderersIfNeeded(); - CreateCommandBufferIfNeeded(); - CreateSettingsIfNeeded(); - - _outlineSettings.OutlineResources = _outlineResources; - } - - private void Reset() - { - if (_outlineSettings != null) - { - _outlineSettings.OutlineResources = _outlineResources; - } - - if (_renderers != null) - { - _renderers.Reset(true); - } - } - -#endif - - #endregion - - #region IOutlineSettingsEx - - /// - /// Gets or sets outline settings. Set this to non- value to share settings with other components. - /// - public OutlineSettings OutlineSettings - { - get - { - if (_outlineSettings == null) - { - _outlineSettings = new OutlineSettingsInstance(); - } - - return _outlineSettings.OutlineSettings; - } - set - { - if (_outlineSettings == null) - { - _outlineSettings = new OutlineSettingsInstance(); - } - - _outlineSettings.OutlineSettings = value; - } - } - - #endregion - - #region IOutlineSettings - - /// - public Color OutlineColor - { - get - { - CreateSettingsIfNeeded(); - return _outlineSettings.OutlineColor; - } - set - { - CreateSettingsIfNeeded(); - _outlineSettings.OutlineColor = value; - } - } - - /// - public int OutlineWidth - { - get - { - CreateSettingsIfNeeded(); - return _outlineSettings.OutlineWidth; - } - set - { - CreateSettingsIfNeeded(); - _outlineSettings.OutlineWidth = value; - } - } - - /// - public float OutlineIntensity - { - get - { - CreateSettingsIfNeeded(); - return _outlineSettings.OutlineIntensity; - } - set - { - CreateSettingsIfNeeded(); - _outlineSettings.OutlineIntensity = value; - } - } - - /// - public OutlineRenderFlags OutlineRenderMode - { - get - { - CreateSettingsIfNeeded(); - return _outlineSettings.OutlineRenderMode; - } - set - { - CreateSettingsIfNeeded(); - _outlineSettings.OutlineRenderMode = value; - } - } - - #endregion - - #region IEquatable - - /// - public bool Equals(IOutlineSettings other) - { - return OutlineSettings.Equals(_outlineSettings, other); - } - - #endregion - - #region implementation - - private void OnCameraPreRender(Camera camera) - { - if (camera) - { - if (_outlineSettings.RequiresCameraDepth) - { - camera.depthTextureMode |= DepthTextureMode.Depth; - } - - if (!_cameraMap.ContainsKey(camera)) - { - camera.AddCommandBuffer(OutlineRenderer.RenderEvent, _commandBuffer); - _cameraMap.Add(camera, _commandBuffer); - } - } - } - - private void RemoveDestroyedCameras() - { - List camerasToRemove = null; - - foreach (var camera in _cameraMap.Keys) - { - if (camera == null) - { - if (camerasToRemove != null) - { - camerasToRemove.Add(camera); - } - else - { - camerasToRemove = new List() { camera }; - } - } - } - - if (camerasToRemove != null) - { - foreach (var camera in camerasToRemove) - { - _cameraMap.Remove(camera); - } - } - } - - private void CreateCommandBufferIfNeeded() - { - if (_commandBuffer == null) - { - _commandBuffer = new CommandBuffer(); - _commandBuffer.name = string.Format("{0} - {1}", GetType().Name, name); - } - } - - private void CreateSettingsIfNeeded() - { - if (_outlineSettings == null) - { - _outlineSettings = new OutlineSettingsInstance(_outlineResources); - } - } - - private void CreateRenderersIfNeeded() - { - if (_renderers == null) - { - _renderers = new OutlineRendererCollection(gameObject); - _renderers.Reset(true); - } - } - - #endregion - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs.meta deleted file mode 100644 index a9c85ed..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineBehaviour.cs.meta +++ /dev/null @@ -1,15 +0,0 @@ -fileFormatVersion: 2 -guid: 271c580db5fd384429cdac899152e9e0 -timeCreated: 1566149857 -licenseType: Free -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: - - _outlineResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, - type: 2} - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs deleted file mode 100644 index a4bacb8..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Rendering; - -namespace UnityFx.Outline -{ - /// - /// Renders outlines at specific camera. Should be attached to camera to function. - /// - /// - /// - /// - /// - [DisallowMultipleComponent] - [RequireComponent(typeof(Camera))] - public sealed partial class OutlineEffect : MonoBehaviour - { - #region data - - [SerializeField, Tooltip("Sets outline resources to use. Do not change the defaults unless you know what you're doing.")] - private OutlineResources _outlineResources; - [SerializeField, Tooltip("Collection of outline layers to use. This can be used to share outline settings between multiple cameras.")] - private OutlineLayerCollection _outlineLayers; - [SerializeField, HideInInspector] - private CameraEvent _cameraEvent = OutlineRenderer.RenderEvent; - - private CommandBuffer _commandBuffer; - - #endregion - - #region interface - - /// - /// Gets or sets resources used by the effect implementation. - /// - /// Thrown if setter argument is . - public OutlineResources OutlineResources - { - get - { - return _outlineResources; - } - set - { - if (ReferenceEquals(value, null)) - { - throw new ArgumentNullException("OutlineResources"); - } - - _outlineResources = value; - } - } - - /// - /// Gets collection of outline layers. - /// - /// - public IList OutlineLayers - { - get - { - CreateLayersIfNeeded(); - return _outlineLayers; - } - } - - /// - /// Gets or sets used to render the outlines. - /// - public CameraEvent RenderEvent - { - get - { - return _cameraEvent; - } - set - { - if (_cameraEvent != value) - { - if (_commandBuffer != null) - { - var camera = GetComponent(); - - if (camera) - { - camera.RemoveCommandBuffer(_cameraEvent, _commandBuffer); - camera.AddCommandBuffer(value, _commandBuffer); - } - } - - _cameraEvent = value; - } - } - } - - /// - /// Adds the passed to the first outline layer. Creates the layer if needed. - /// - /// The to add and render outline for. - /// - public void AddGameObject(GameObject go) - { - AddGameObject(go, 0); - } - - /// - /// Adds the passed to the specified outline layer. Creates the layer if needed. - /// - /// The to add and render outline for. - /// - public void AddGameObject(GameObject go, int layerIndex) - { - if (layerIndex < 0) - { - throw new ArgumentOutOfRangeException("layerIndex"); - } - - CreateLayersIfNeeded(); - - while (_outlineLayers.Count <= layerIndex) - { - _outlineLayers.Add(new OutlineLayer()); - } - - _outlineLayers[layerIndex].Add(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() - { - } - - private void OnEnable() - { - var camera = GetComponent(); - - if (camera) - { - _commandBuffer = new CommandBuffer - { - name = string.Format("{0} - {1}", GetType().Name, name) - }; - - camera.depthTextureMode |= DepthTextureMode.Depth; - camera.AddCommandBuffer(_cameraEvent, _commandBuffer); - } - } - - private void OnDisable() - { - var camera = GetComponent(); - - if (camera) - { - camera.RemoveCommandBuffer(_cameraEvent, _commandBuffer); - } - - if (_commandBuffer != null) - { - _commandBuffer.Dispose(); - _commandBuffer = null; - } - } - - private void Update() - { - if (_outlineLayers) - { - FillCommandBuffer(); - } - } - - private void OnDestroy() - { - // TODO: Find a way to do this once per OutlineLayerCollection instance. - if (_outlineLayers) - { - _outlineLayers.Reset(); - } - } - -#if UNITY_EDITOR - - private void Reset() - { - _outlineLayers = null; - } - -#endif - - #endregion - - #region implementation - - private void FillCommandBuffer() - { - _commandBuffer.Clear(); - - if (_outlineResources && _outlineResources.IsValid) - { - using (var renderer = new OutlineRenderer(_commandBuffer, BuiltinRenderTextureType.CameraTarget)) - { - _outlineLayers.Render(renderer, _outlineResources); - } - } - } - - private void CreateLayersIfNeeded() - { - if (ReferenceEquals(_outlineLayers, null)) - { - _outlineLayers = ScriptableObject.CreateInstance(); - _outlineLayers.name = "OutlineLayers"; - } - } - - #endregion - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs.meta deleted file mode 100644 index 1044087..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineEffect.cs.meta +++ /dev/null @@ -1,15 +0,0 @@ -fileFormatVersion: 2 -guid: 270d3185d159bf54fb4cddbb42235437 -timeCreated: 1566149591 -licenseType: Free -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: - - _outlineResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, - type: 2} - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs deleted file mode 100644 index eac4774..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs +++ /dev/null @@ -1,494 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using UnityEngine; - -namespace UnityFx.Outline -{ - /// - /// A collection of instances that share outline settings. An - /// can only belong to one at time. - /// - /// - /// - [Serializable] - public sealed partial class OutlineLayer : ICollection, IOutlineSettingsEx - { - #region data - - [SerializeField, HideInInspector] - private OutlineSettingsInstance _settings = new OutlineSettingsInstance(); - [SerializeField, HideInInspector] - private string _name; - [SerializeField, HideInInspector] - private int _zOrder; - [SerializeField, HideInInspector] - private bool _enabled = true; - - private OutlineLayerCollection _parentCollection; - private Dictionary _outlineObjects = new Dictionary(); - - #endregion - - #region interface - - /// - /// Gets the layer name. - /// - public string Name - { - get - { - if (string.IsNullOrEmpty(_name)) - { - return "OutlineLayer #" + Index.ToString(); - } - - return _name; - } - } - - /// - /// Gets or sets a value indicating whether the layer is enabled. - /// - /// - public bool Enabled - { - get - { - return _enabled; - } - set - { - _enabled = value; - } - } - - /// - /// Gets or sets the layer priority. Layers with greater values are rendered on top of layers with lower priority. - /// Layers with equal priorities are rendered according to index in parent collection. - /// - /// - public int Priority - { - get - { - return _zOrder; - } - set - { - if (_zOrder != value) - { - if (_parentCollection != null) - { - _parentCollection.SetOrderChanged(); - } - - _zOrder = value; - } - } - } - - /// - /// Gets index of the layer in parent collection. - /// - public int Index - { - get - { - if (_parentCollection != null) - { - return _parentCollection.IndexOf(this); - } - - return -1; - } - } - - /// - /// Initializes a new instance of the class. - /// - public OutlineLayer() - { - } - - /// - /// Initializes a new instance of the class. - /// - public OutlineLayer(string name) - { - _name = name; - } - - /// - /// Initializes a new instance of the class. - /// - /// Thrown if is . - public OutlineLayer(OutlineSettings settings) - { - if (ReferenceEquals(settings, null)) - { - throw new ArgumentNullException("settings"); - } - - _settings.OutlineSettings = settings; - } - - /// - /// Initializes a new instance of the class. - /// - /// Thrown if is . - public OutlineLayer(string name, OutlineSettings settings) - { - if (ReferenceEquals(settings, null)) - { - throw new ArgumentNullException("settings"); - } - - _name = name; - _settings.OutlineSettings = settings; - } - - /// - /// Adds a new object to the layer. - /// - /// Thrown if is . - public void Add(GameObject go, int ignoreLayerMask) - { - if (ReferenceEquals(go, null)) - { - throw new ArgumentNullException("go"); - } - - if (!_outlineObjects.ContainsKey(go)) - { - var renderers = new OutlineRendererCollection(go); - renderers.Reset(false, ignoreLayerMask); - _outlineObjects.Add(go, renderers); - } - } - - /// - /// Adds a new object to the layer. - /// - /// Thrown if is . - public void Add(GameObject go, string ignoreLayer) - { - Add(go, 1 << LayerMask.NameToLayer(ignoreLayer)); - } - - /// - /// Attempts to get renderers assosiated with the specified . - /// - /// Thrown if is . - public bool TryGetRenderers(GameObject go, out ICollection renderers) - { - if (ReferenceEquals(go, null)) - { - throw new ArgumentNullException("go"); - } - - OutlineRendererCollection result; - - if (_outlineObjects.TryGetValue(go, out result)) - { - renderers = result; - return true; - } - - renderers = null; - return false; - } - - /// - /// Renders the layers. - /// - public void Render(OutlineRenderer renderer, OutlineResources resources) - { - if (_enabled) - { - _settings.OutlineResources = resources; - - foreach (var kvp in _outlineObjects) - { - if (kvp.Key && kvp.Key.activeInHierarchy) - { - renderer.Render(kvp.Value.GetList(), resources, _settings); - } - } - } - } - - #endregion - - #region internals - - internal string NameTag - { - get - { - return _name; - } - set - { - _name = value; - } - } - - internal OutlineLayerCollection ParentCollection - { - get - { - return _parentCollection; - } - } - - internal void Reset() - { - _settings.OutlineResources = null; - _outlineObjects.Clear(); - } - - internal void SetCollection(OutlineLayerCollection collection) - { - if (_parentCollection == null || collection == null || _parentCollection == collection) - { - _parentCollection = collection; - } - else - { - throw new InvalidOperationException("OutlineLayer can only belong to a single OutlineLayerCollection."); - } - } - - #endregion - - #region IOutlineSettingsEx - - /// - /// Gets or sets outline settings. Set this to non- value to share settings with other components. - /// - public OutlineSettings OutlineSettings - { - get - { - return _settings.OutlineSettings; - } - set - { - _settings.OutlineSettings = value; - } - } - - #endregion - - #region IOutlineSettings - - /// - public Color OutlineColor - { - get - { - return _settings.OutlineColor; - } - set - { - _settings.OutlineColor = value; - } - } - - /// - public int OutlineWidth - { - get - { - return _settings.OutlineWidth; - } - set - { - _settings.OutlineWidth = value; - } - } - - /// - public float OutlineIntensity - { - get - { - return _settings.OutlineIntensity; - } - set - { - _settings.OutlineIntensity = value; - } - } - - /// - public OutlineRenderFlags OutlineRenderMode - { - get - { - return _settings.OutlineRenderMode; - } - set - { - _settings.OutlineRenderMode = value; - } - } - - #endregion - - #region ICollection - - /// - public int Count - { - get - { - return _outlineObjects.Count; - } - } - - /// - public bool IsReadOnly - { - get - { - return false; - } - } - - /// - public void Add(GameObject go) - { - Add(go, 0); - } - - /// - public bool Remove(GameObject go) - { - if (!ReferenceEquals(go, null)) - { - return _outlineObjects.Remove(go); - } - - return false; - } - - /// - public bool Contains(GameObject go) - { - if (ReferenceEquals(go, null)) - { - return false; - } - - return _outlineObjects.ContainsKey(go); - } - - /// - public void Clear() - { - _outlineObjects.Clear(); - } - - /// - public void CopyTo(GameObject[] array, int arrayIndex) - { - _outlineObjects.Keys.CopyTo(array, arrayIndex); - } - - #endregion - - #region IEnumerable - - /// - public IEnumerator GetEnumerator() - { - return _outlineObjects.Keys.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return _outlineObjects.Keys.GetEnumerator(); - } - - #endregion - - #region IEquatable - - /// - public bool Equals(IOutlineSettings other) - { - return OutlineSettings.Equals(this, other); - } - - #endregion - - #region Object - - /// - public override string ToString() - { - var text = new StringBuilder(); - - if (string.IsNullOrEmpty(_name)) - { - text.Append("OutlineLayer"); - } - else - { - text.Append(_name); - } - - if (_parentCollection != null) - { - text.Append(" #"); - text.Append(_parentCollection.IndexOf(this)); - } - - if (_zOrder > 0) - { - text.Append(" z"); - text.Append(_zOrder); - } - - if (_outlineObjects.Count > 0) - { - text.Append(" ("); - - foreach (var go in _outlineObjects.Keys) - { - text.Append(go.name); - text.Append(", "); - } - - text.Remove(text.Length - 2, 2); - text.Append(")"); - } - - return string.Format("{0}", text); - } - - /// - public override bool Equals(object other) - { - return OutlineSettings.Equals(this, other as IOutlineSettings); - } - - /// - public override int GetHashCode() - { - return base.GetHashCode(); - } - - #endregion - - #region implementation - #endregion - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs.meta deleted file mode 100644 index f199256..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayer.cs.meta +++ /dev/null @@ -1,13 +0,0 @@ -fileFormatVersion: 2 -guid: 1360e19784ddfac45a7dcb6ba39595ed -timeCreated: 1566130871 -licenseType: Free -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs deleted file mode 100644 index d28f982..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace UnityFx.Outline -{ - /// - /// A serializable collection of outline layers. - /// - /// - /// - /// - [CreateAssetMenu(fileName = "OutlineLayerCollection", menuName = "UnityFx/Outline/Outline Layer Collection")] - public sealed class OutlineLayerCollection : ScriptableObject, IList - { - #region data - - private class OutlineLayerComparer : IComparer - { - public int Compare(OutlineLayer x, OutlineLayer y) - { - return x.Priority - y.Priority; - } - } - - [SerializeField, HideInInspector] - private List _layers = new List(); - - private List _sortedLayers = new List(); - private OutlineLayerComparer _sortComparer = new OutlineLayerComparer(); - private bool _orderChanged = true; - - #endregion - - #region interface - - /// - /// Gets layers ordered by . - /// - public OutlineLayer[] SortedLayers - { - get - { - UpdateSortedLayersIfNeeded(); - return _sortedLayers.ToArray(); - } - } - - /// - /// Renders all layers. - /// - public void Render(OutlineRenderer renderer, OutlineResources resources) - { - UpdateSortedLayersIfNeeded(); - - foreach (var layer in _sortedLayers) - { - layer.Render(renderer, resources); - } - } - - #endregion - - #region internals - - internal void SetOrderChanged() - { - _orderChanged = true; - } - - internal void Reset() - { - foreach (var layer in _layers) - { - layer.Reset(); - } - } - - #endregion - - #region ScriptableObject - - private void OnEnable() - { - foreach (var layer in _layers) - { - layer.SetCollection(this); - } - - _orderChanged = true; - } - - #endregion - - #region IList - - /// - public OutlineLayer this[int layerIndex] - { - get - { - return _layers[layerIndex]; - } - set - { - if (value == null) - { - throw new ArgumentNullException("layer"); - } - - if (layerIndex < 0 || layerIndex >= _layers.Count) - { - throw new ArgumentOutOfRangeException("layerIndex"); - } - - if (_layers[layerIndex] != value) - { - value.SetCollection(this); - - _layers[layerIndex].SetCollection(null); - _layers[layerIndex] = value; - - _orderChanged = true; - } - } - } - - /// - public int IndexOf(OutlineLayer layer) - { - if (layer != null) - { - return _layers.IndexOf(layer); - } - - return -1; - } - - /// - public void Insert(int index, OutlineLayer layer) - { - if (layer == null) - { - throw new ArgumentNullException("layer"); - } - - if (layer.ParentCollection != this) - { - layer.SetCollection(this); - - _layers.Insert(index, layer); - - _orderChanged = true; - } - } - - /// - public void RemoveAt(int index) - { - if (index >= 0 && index < _layers.Count) - { - _layers[index].SetCollection(null); - _layers.RemoveAt(index); - - _orderChanged = true; - } - } - - #endregion - - #region ICollection - - /// - public int Count - { - get - { - return _layers.Count; - } - } - - /// - public bool IsReadOnly - { - get - { - return false; - } - } - - /// - public void Add(OutlineLayer layer) - { - if (layer == null) - { - throw new ArgumentNullException("layer"); - } - - if (layer.ParentCollection != this) - { - layer.SetCollection(this); - - _layers.Add(layer); - _orderChanged = true; - } - } - - /// - public bool Remove(OutlineLayer layer) - { - if (_layers.Remove(layer)) - { - layer.SetCollection(null); - - _sortedLayers.Remove(layer); - - return true; - } - - return false; - } - - /// - public void Clear() - { - if (_layers.Count > 0) - { - foreach (var layer in _layers) - { - layer.SetCollection(null); - } - - _layers.Clear(); - _sortedLayers.Clear(); - } - } - - /// - public bool Contains(OutlineLayer layer) - { - if (layer == null) - { - return false; - } - - return _layers.Contains(layer); - } - - /// - public void CopyTo(OutlineLayer[] array, int arrayIndex) - { - _layers.CopyTo(array, arrayIndex); - } - - #endregion - - #region IEnumerable - - /// - public IEnumerator GetEnumerator() - { - return _layers.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return _layers.GetEnumerator(); - } - - #endregion - - #region implementation - - private void UpdateSortedLayersIfNeeded() - { - if (_orderChanged) - { - _sortedLayers.Clear(); - _sortedLayers.AddRange(_layers); - _sortedLayers.Sort(_sortComparer); - _orderChanged = false; - } - } - - #endregion - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs.meta deleted file mode 100644 index 3b46761..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineLayerCollection.cs.meta +++ /dev/null @@ -1,13 +0,0 @@ -fileFormatVersion: 2 -guid: 57d0c11168277cf4eb3b4b89706e6aa5 -timeCreated: 1566560091 -licenseType: Pro -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs deleted file mode 100644 index c911c0d..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; - -namespace UnityFx.Outline -{ - /// - /// Enumerates outline render modes. - /// - [Flags] - public enum OutlineRenderFlags - { - /// - /// Outline frame is a solid line. - /// - Solid = 0, - - /// - /// Outline frame is blurred. - /// - Blurred = 1, - - /// - /// Enabled depth testing when rendering object outlines. Only visible parts of objects are outlined. - /// - EnableDepthTesting = 0x100 - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs.meta deleted file mode 100644 index 8c8d06c..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderFlags.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 836bd13bd33c59246b1cebab92f8e62a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs deleted file mode 100644 index 3569cf7..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs +++ /dev/null @@ -1,493 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Rendering; - -namespace UnityFx.Outline -{ - /// - /// Helper class for outline rendering with . - /// - /// - /// The class can be used on its own or as part of a higher level systems. It is used - /// by higher level outline implementations ( and - /// ). It is fully compatible with Unity post processing stack as well. - /// The class implements to be used inside - /// block as shown in the code samples. Disposing does not dispose - /// the corresponding . - /// Command buffer is not cleared before rendering. It is user responsibility to do so if needed. - /// - /// - /// var commandBuffer = new CommandBuffer(); - /// - /// using (var renderer = new OutlineRenderer(commandBuffer, BuiltinRenderTextureType.CameraTarget)) - /// { - /// renderer.Render(renderers, resources, settings); - /// } - /// - /// camera.AddCommandBuffer(CameraEvent.BeforeImageEffects, commandBuffer); - /// - /// - /// [Preserve] - /// public class OutlineEffectRenderer : PostProcessEffectRenderer - /// { - /// public override void Init() - /// { - /// base.Init(); - /// - /// // Reuse fullscreen triangle mesh from PostProcessing (do not create own). - /// settings.OutlineResources.FullscreenTriangleMesh = RuntimeUtilities.fullscreenTriangle; - /// } - /// - /// public override void Render(PostProcessRenderContext context) - /// { - /// var resources = settings.OutlineResources; - /// var layers = settings.OutlineLayers; - /// - /// if (resources && resources.IsValid && layers) - /// { - /// // No need to setup property sheet parameters, all the rendering staff is handled by the OutlineRenderer. - /// using (var renderer = new OutlineRenderer(context.command, context.source, context.destination)) - /// { - /// layers.Render(renderer, resources); - /// } - /// } - /// } - /// } - /// - /// - public struct OutlineRenderer : IDisposable - { - #region data - - private static readonly int _mainRtId = Shader.PropertyToID("_MainTex"); - private static readonly int _maskRtId = Shader.PropertyToID("_MaskTex"); - private static readonly int _hPassRtId = Shader.PropertyToID("_HPassTex"); - - private readonly RenderTargetIdentifier _source; - private readonly RenderTargetIdentifier _destination; - private readonly CommandBuffer _commandBuffer; - - #endregion - - #region interface - - /// - /// A default outline rendering should be assosiated with. - /// - public const CameraEvent RenderEvent = CameraEvent.BeforeImageEffects; - - /// - /// Name of the outline effect. - /// - public const string EffectName = "Outline"; - - /// - /// Minimum value of outline width parameter. - /// - /// - public const int MinWidth = 1; - - /// - /// Maximum value of outline width parameter. - /// - /// - public const int MaxWidth = 32; - - /// - /// Minimum value of outline intensity parameter. - /// - /// - /// - public const int MinIntensity = 1; - - /// - /// Maximum value of outline intensity parameter. - /// - /// - /// - public const int MaxIntensity = 64; - - /// - /// Value of outline intensity parameter that is treated as solid fill. - /// - /// - /// - public const int SolidIntensity = 100; - - /// - /// Initializes a new instance of the struct. - /// - /// A to render the effect to. It should be cleared manually (if needed) before passing to this method. - /// Render target. - /// Thrown if is . - public OutlineRenderer(CommandBuffer commandBuffer, BuiltinRenderTextureType rt) - : this(commandBuffer, rt, rt, Vector2Int.zero) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// A to render the effect to. It should be cleared manually (if needed) before passing to this method. - /// Render target. - /// Thrown if is . - public OutlineRenderer(CommandBuffer commandBuffer, RenderTargetIdentifier rt) - : this(commandBuffer, rt, rt, Vector2Int.zero) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// A to render the effect to. It should be cleared manually (if needed) before passing to this method. - /// Source image. Can be the same as . - /// Render target. - /// Thrown if is . - public OutlineRenderer(CommandBuffer commandBuffer, RenderTargetIdentifier src, RenderTargetIdentifier dst) - : this(commandBuffer, src, dst, Vector2Int.zero) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// A to render the effect to. It should be cleared manually (if needed) before passing to this method. - /// Source image. Can be the same as . - /// Render target. - /// Size of the temporaty render textures. - /// Thrown if is . - public OutlineRenderer(CommandBuffer commandBuffer, RenderTargetIdentifier src, RenderTargetIdentifier dst, Vector2Int rtSize) - { - if (commandBuffer == null) - { - throw new ArgumentNullException("commandBuffer"); - } - - var cx = rtSize.x > 0 ? rtSize.x : -1; - var cy = rtSize.y > 0 ? rtSize.y : -1; - - _source = src; - _destination = dst; - - _commandBuffer = commandBuffer; - _commandBuffer.BeginSample(EffectName); - _commandBuffer.GetTemporaryRT(_maskRtId, cx, cy, 0, FilterMode.Bilinear, RenderTextureFormat.R8); - _commandBuffer.GetTemporaryRT(_hPassRtId, cx, cy, 0, FilterMode.Bilinear, RenderTextureFormat.R8); - - // Need to copy src content into dst if they are not the same. For instance this is the case when rendering - // the outline effect as part of Unity Post Processing stack. - if (!src.Equals(dst)) - { - if (SystemInfo.copyTextureSupport > CopyTextureSupport.None) - { - _commandBuffer.CopyTexture(src, dst); - } - else - { -#if UNITY_2018_2_OR_NEWER - _commandBuffer.SetRenderTarget(dst, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store); -#else - _commandBuffer.SetRenderTarget(dst); -#endif - _commandBuffer.Blit(src, BuiltinRenderTextureType.CurrentActive); - } - } - } - - /// - /// Renders outline around a single object. This version allows enumeration of with no GC allocations. - /// - /// One or more renderers representing a single object to be outlined. - /// Outline resources. - /// Outline settings. - /// Thrown if any of the arguments is . - /// - /// - public void Render(IList renderers, OutlineResources resources, IOutlineSettings settings) - { - if (renderers == null) - { - throw new ArgumentNullException("renderers"); - } - - if (resources == null) - { - throw new ArgumentNullException("resources"); - } - - if (settings == null) - { - throw new ArgumentNullException("settings"); - } - - Init(resources, settings); - RenderObject(resources, settings, renderers); - RenderHPass(resources, settings); - RenderVPassBlend(resources, settings); - } - - /// - /// Renders outline around a single object. - /// - /// One or more renderers representing a single object to be outlined. - /// Outline resources. - /// Outline settings. - /// Thrown if any of the arguments is . - /// - /// - public void Render(IEnumerable renderers, OutlineResources resources, IOutlineSettings settings) - { - if (renderers == null) - { - throw new ArgumentNullException("renderers"); - } - - if (resources == null) - { - throw new ArgumentNullException("resources"); - } - - if (settings == null) - { - throw new ArgumentNullException("settings"); - } - - Init(resources, settings); - RenderObject(resources, settings, renderers); - RenderHPass(resources, settings); - RenderVPassBlend(resources, settings); - } - - /// - /// Renders outline around a single object. - /// - /// A representing an object to be outlined. - /// Outline resources. - /// Outline settings. - /// Thrown if any of the arguments is . - /// - /// - public void Render(Renderer renderer, OutlineResources resources, IOutlineSettings settings) - { - if (renderer == null) - { - throw new ArgumentNullException("renderers"); - } - - if (resources == null) - { - throw new ArgumentNullException("resources"); - } - - if (settings == null) - { - throw new ArgumentNullException("settings"); - } - - Init(resources, settings); - RenderObject(resources, settings, renderer); - RenderHPass(resources, settings); - RenderVPassBlend(resources, settings); - } - - /// - /// Calculates value of Gauss function for the specified and values. - /// - /// - /// - public static float Gauss(float x, float stdDev) - { - var stdDev2 = stdDev * stdDev * 2; - var a = 1 / Mathf.Sqrt((float)Math.PI * stdDev2); - var gauss = a * Mathf.Pow((float)Math.E, -x * x / stdDev2); - - return gauss; - } - - /// - /// Samples Gauss function for the specified . - /// - /// - public static float[] GetGaussSamples(int width, float[] samples) - { - // NOTE: According to '3 sigma' rule there is no reason to have StdDev less then width / 3. - // In practice blur looks best when StdDev is within range [width / 3, width / 2]. - var stdDev = width * 0.5f; - - if (samples == null) - { - samples = new float[MaxWidth]; - } - - for (var i = 0; i < width; i++) - { - samples[i] = Gauss(i, stdDev); - } - - return samples; - } - - #endregion - - #region IDisposable - - /// - /// Finalizes the effect rendering and releases temporary textures used. Should only be called once. - /// - public void Dispose() - { - _commandBuffer.ReleaseTemporaryRT(_hPassRtId); - _commandBuffer.ReleaseTemporaryRT(_maskRtId); - _commandBuffer.EndSample(EffectName); - } - - #endregion - - #region implementation - - private void Init(OutlineResources resources, IOutlineSettings settings) - { - _commandBuffer.SetGlobalFloatArray(resources.GaussSamplesId, resources.GetGaussSamples(settings.OutlineWidth)); - } - - private void RenderObjectClear(bool depthTestEnabled) - { - if (depthTestEnabled) - { - // NOTE: Use the camera depth buffer when rendering the mask. Shader only reads from the depth buffer (ZWrite Off). -#if UNITY_2018_2_OR_NEWER - _commandBuffer.SetRenderTarget(_maskRtId, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, BuiltinRenderTextureType.Depth, RenderBufferLoadAction.Load, RenderBufferStoreAction.DontCare); -#else - _commandBuffer.SetRenderTarget(_maskRtId, BuiltinRenderTextureType.Depth); -#endif - } - else - { -#if UNITY_2018_2_OR_NEWER - _commandBuffer.SetRenderTarget(_maskRtId, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store); -#else - _commandBuffer.SetRenderTarget(_maskRtId); -#endif - } - - _commandBuffer.ClearRenderTarget(false, true, Color.clear); - } - - private void RenderObject(OutlineResources resources, IOutlineSettings settings, IList renderers) - { - RenderObjectClear((settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0); - - for (var i = 0; i < renderers.Count; ++i) - { - var r = renderers[i]; - - if (r && r.enabled && r.gameObject.activeInHierarchy) - { - // NOTE: Accessing Renderer.sharedMaterials triggers GC.Alloc. That's why we use a temporary - // list of materials, cached with the outline resources. - r.GetSharedMaterials(resources.TmpMaterials); - - for (var j = 0; j < resources.TmpMaterials.Count; ++j) - { - _commandBuffer.DrawRenderer(r, resources.RenderMaterial, j); - } - } - } - } - - private void RenderObject(OutlineResources resources, IOutlineSettings settings, IEnumerable renderers) - { - RenderObjectClear((settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0); - - // NOTE: Calling IEnumerable.GetEnumerator() triggers GC.Alloc. - foreach (var r in renderers) - { - if (r && r.enabled && r.gameObject.activeInHierarchy) - { - // NOTE: Accessing Renderer.sharedMaterials triggers GC.Alloc. That's why we use a temporary - // list of materials, cached with the outline resources. - r.GetSharedMaterials(resources.TmpMaterials); - - for (var j = 0; j < resources.TmpMaterials.Count; ++j) - { - _commandBuffer.DrawRenderer(r, resources.RenderMaterial, j); - } - } - } - } - - private void RenderObject(OutlineResources resources, IOutlineSettings settings, Renderer renderer) - { - RenderObjectClear((settings.OutlineRenderMode & OutlineRenderFlags.EnableDepthTesting) != 0); - - if (renderer && renderer.gameObject.activeInHierarchy && renderer.enabled) - { - // NOTE: Accessing Renderer.sharedMaterials triggers GC.Alloc. That's why we use a temporary - // list of materials, cached with the outline resources. - renderer.GetSharedMaterials(resources.TmpMaterials); - - for (var i = 0; i < resources.TmpMaterials.Count; ++i) - { - _commandBuffer.DrawRenderer(renderer, resources.RenderMaterial, i); - } - } - } - - private void RenderHPass(OutlineResources resources, IOutlineSettings settings) - { - // Setup shader parameter overrides. - var props = resources.HPassProperties; - props.SetFloat(resources.WidthId, settings.OutlineWidth); - - // Set source texture as _MainTex to match Blit behavior. - _commandBuffer.SetGlobalTexture(_mainRtId, _maskRtId); - - // Set destination texture as render target. -#if UNITY_2018_2_OR_NEWER - _commandBuffer.SetRenderTarget(_hPassRtId, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store); -#else - _commandBuffer.SetRenderTarget(_hPassRtId); -#endif - - // Blit fullscreen triangle. - _commandBuffer.DrawMesh(resources.FullscreenTriangleMesh, Matrix4x4.identity, resources.HPassMaterial, 0, 0, props); - } - - private void RenderVPassBlend(OutlineResources resources, IOutlineSettings settings) - { - // Setup shader parameter overrides. - var props = resources.VPassBlendProperties; - - props.SetFloat(resources.WidthId, settings.OutlineWidth); - props.SetColor(resources.ColorId, settings.OutlineColor); - - if ((settings.OutlineRenderMode & OutlineRenderFlags.Blurred) != 0) - { - props.SetFloat(resources.IntensityId, settings.OutlineIntensity); - } - else - { - props.SetFloat(resources.IntensityId, SolidIntensity); - } - - // Set source texture as _MainTex to match Blit behavior. - _commandBuffer.SetGlobalTexture(_mainRtId, _source); - - // Set destination texture as render target. -#if UNITY_2018_2_OR_NEWER - _commandBuffer.SetRenderTarget(_destination, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store); -#else - _commandBuffer.SetRenderTarget(_destination); -#endif - - // Blit fullscreen triangle. - _commandBuffer.DrawMesh(resources.FullscreenTriangleMesh, Matrix4x4.identity, resources.VPassBlendMaterial, 0, 0, props); - } - - #endregion - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs.meta deleted file mode 100644 index 90c49ef..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRenderer.cs.meta +++ /dev/null @@ -1,13 +0,0 @@ -fileFormatVersion: 2 -guid: 4271470bd9f5d5041a4a8881d8457a55 -timeCreated: 1566150038 -licenseType: Free -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs deleted file mode 100644 index 730e6dd..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace UnityFx.Outline -{ - internal class OutlineRendererCollection : ICollection - { - #region data - - private readonly List _renderers = new List(); - private readonly GameObject _go; - - #endregion - - #region interface - - internal OutlineRendererCollection(GameObject go) - { - Debug.Assert(go); - _go = go; - } - - internal List GetList() - { - return _renderers; - } - - internal void Reset(bool includeInactive) - { - _go.GetComponentsInChildren(includeInactive, _renderers); - } - - internal void Reset(bool includeInactive, int ignoreLayerMask) - { - _renderers.Clear(); - - var renderers = _go.GetComponentsInChildren(includeInactive); - - if (renderers != null) - { - if (ignoreLayerMask != 0) - { - foreach (var renderer in renderers) - { - if (((1 << renderer.gameObject.layer) & ignoreLayerMask) == 0) - { - _renderers.Add(renderer); - } - } - } - else - { - foreach (var renderer in renderers) - { - _renderers.Add(renderer); - } - } - } - } - - #endregion - - #region ICollection - - public int Count - { - get - { - return _renderers.Count; - } - } - - public bool IsReadOnly - { - get - { - return false; - } - } - - public void Add(Renderer renderer) - { - Validate(renderer); - - _renderers.Add(renderer); - } - - public bool Remove(Renderer renderer) - { - return _renderers.Remove(renderer); - } - - public void Clear() - { - _renderers.Clear(); - } - - public bool Contains(Renderer renderer) - { - return _renderers.Contains(renderer); - } - - public void CopyTo(Renderer[] array, int arrayIndex) - { - _renderers.CopyTo(array, arrayIndex); - } - - #endregion - - #region IEnumerable - - public IEnumerator GetEnumerator() - { - return _renderers.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return _renderers.GetEnumerator(); - } - - #endregion - - #region implementation - - private void Validate(Renderer renderer) - { - if (renderer == null) - { - throw new ArgumentNullException("renderer"); - } - - if (!renderer.transform.IsChildOf(_go.transform)) - { - throw new ArgumentException(string.Format("Only children of the {0} are allowed.", _go.name), "renderer"); - } - } - - #endregion - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs.meta deleted file mode 100644 index f582b73..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineRendererCollection.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 89621a3cc73c4e6498a00b2d180ed462 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs deleted file mode 100644 index 8d8f169..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace UnityFx.Outline -{ - /// - /// This asset is used to store references to shaders and other resources needed at runtime without having to use a Resources folder. - /// - /// - [CreateAssetMenu(fileName = "OutlineResources", menuName = "UnityFx/Outline/Outline Resources")] - public sealed class OutlineResources : ScriptableObject - { - #region data - - private Material _renderMaterial; - private Material _hPassMaterial; - private Material _vPassMaterial; - private MaterialPropertyBlock _hPassProperties; - private MaterialPropertyBlock _vPassProperties; - private Mesh _fullscreenTriangleMesh; - private float[][] _gaussSamples; - - #endregion - - #region interface - - /// - /// Hashed name of _Color shader parameter. - /// - public readonly int ColorId = Shader.PropertyToID("_Color"); - - /// - /// Hashed name of _Width shader parameter. - /// - public readonly int WidthId = Shader.PropertyToID("_Width"); - - /// - /// Hashed name of _Intensity shader parameter. - /// - public readonly int IntensityId = Shader.PropertyToID("_Intensity"); - - /// - /// Hashed name of _GaussSamples shader parameter. - /// - public readonly int GaussSamplesId = Shader.PropertyToID("_GaussSamples"); - - /// - /// Temp materials list. Used by to avoid GC allocations. - /// - public readonly List TmpMaterials = new List(); - - /// - /// Gets or sets a that renders objects outlined with a solid while color. - /// - public Shader RenderShader; - - /// - /// Gets or sets a that renders outline around the mask, that was generated with (pass 1). - /// - public Shader HPassShader; - - /// - /// Gets or sets a that renders outline around the mask, that was generated with and (pass 2). - /// - public Shader VPassBlendShader; - - /// - /// Gets a -based material. - /// - public Material RenderMaterial - { - get - { - if (_renderMaterial == null) - { - _renderMaterial = new Material(RenderShader) - { - name = "Outline - SimpleRender", - hideFlags = HideFlags.HideAndDontSave - }; - } - - return _renderMaterial; - } - } - - /// - /// Gets a -based material. - /// - public Material HPassMaterial - { - get - { - if (_hPassMaterial == null) - { - _hPassMaterial = new Material(HPassShader) - { - name = "Outline - HPassRender", - hideFlags = HideFlags.HideAndDontSave - }; - } - - return _hPassMaterial; - } - } - - /// - /// Gets a -based material. - /// - public Material VPassBlendMaterial - { - get - { - if (_vPassMaterial == null) - { - _vPassMaterial = new Material(VPassBlendShader) - { - name = "Outline - VPassBlendRender", - hideFlags = HideFlags.HideAndDontSave - }; - } - - return _vPassMaterial; - } - } - - /// - /// Gets a for . - /// - public MaterialPropertyBlock HPassProperties - { - get - { - if (_hPassProperties == null) - { - _hPassProperties = new MaterialPropertyBlock(); - } - - return _hPassProperties; - } - } - - /// - /// Gets a for . - /// - public MaterialPropertyBlock VPassBlendProperties - { - get - { - if (_vPassProperties == null) - { - _vPassProperties = new MaterialPropertyBlock(); - } - - return _vPassProperties; - } - } - - /// - /// Gets or sets a fullscreen triangle mesh. - /// - public Mesh FullscreenTriangleMesh - { - get - { - if (_fullscreenTriangleMesh == null) - { - _fullscreenTriangleMesh = new Mesh() - { - name = "Outline - FullscreenTriangle", - hideFlags = HideFlags.HideAndDontSave, - vertices = new Vector3[] { new Vector3(-1f, -1f, 0f), new Vector3(-1f, 3f, 0f), new Vector3( 3f, -1f, 0f) }, - triangles = new int[] {0, 1, 2 } - }; - - _fullscreenTriangleMesh.UploadMeshData(true); - } - - return _fullscreenTriangleMesh; - } - set - { - _fullscreenTriangleMesh = value; - } - } - - /// - /// Gets a value indicating whether the instance is in valid state. - /// - public bool IsValid - { - get - { - return RenderShader && HPassShader && VPassBlendShader; - } - } - - /// - /// Gets cached gauss samples for the specified outline . - /// - public float[] GetGaussSamples(int width) - { - var index = Mathf.Clamp(width, 1, OutlineRenderer.MaxWidth) - 1; - - if (_gaussSamples == null) - { - _gaussSamples = new float[OutlineRenderer.MaxWidth][]; - } - - if (_gaussSamples[index] == null) - { - _gaussSamples[index] = OutlineRenderer.GetGaussSamples(width, null); - } - - return _gaussSamples[index]; - } - - /// - /// Resets the resources to defaults. - /// - public void ResetToDefaults() - { - RenderShader = Shader.Find("UnityFx/Outline/RenderColor"); - HPassShader = Shader.Find("UnityFx/Outline/HPass"); - VPassBlendShader = Shader.Find("UnityFx/Outline/VPassBlend"); - } - - #endregion - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs.meta deleted file mode 100644 index 0f1aca3..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineResources.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -fileFormatVersion: 2 -guid: b503341e0a514e3489c4851727e68257 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: - - RenderShader: {fileID: 4800000, guid: ac20fbf75bafe454aba5ef3c098349df, type: 3} - - HPassShader: {fileID: 4800000, guid: 41c9acbf41c8245498ac9beab378de12, type: 3} - - VPassBlendShader: {fileID: 4800000, guid: 1df0cb1700e142f4ca3b28297d3957da, type: 3} - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs deleted file mode 100644 index 2535031..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs +++ /dev/null @@ -1,128 +0,0 @@ -// 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 -{ - /// - /// Outline settings. - /// - [CreateAssetMenu(fileName = "OutlineSettings", menuName = "UnityFx/Outline/Outline Settings")] - public sealed class OutlineSettings : ScriptableObject, IOutlineSettings - { - #region data - - // NOTE: There is a custom editor for OutlineSettings, so no need to show these in default inspector. - [SerializeField, HideInInspector] - private Color _outlineColor = Color.red; - [SerializeField, HideInInspector] - private int _outlineWidth = 4; - [SerializeField, HideInInspector] - private float _outlineIntensity = 2; - [SerializeField, HideInInspector] - private OutlineRenderFlags _outlineMode; - - #endregion - - #region interface - - public static bool Equals(IOutlineSettings lhs, IOutlineSettings rhs) - { - if (lhs == null || rhs == null) - { - return false; - } - - return lhs.OutlineColor == rhs.OutlineColor && - lhs.OutlineWidth == rhs.OutlineWidth && - lhs.OutlineRenderMode == rhs.OutlineRenderMode && - Mathf.Approximately(lhs.OutlineIntensity, rhs.OutlineIntensity); - } - - #endregion - - #region IOutlineSettings - - /// - public Color OutlineColor - { - get - { - return _outlineColor; - } - set - { - _outlineColor = value; - } - } - - /// - public int OutlineWidth - { - get - { - return _outlineWidth; - } - set - { - _outlineWidth = Mathf.Clamp(value, OutlineRenderer.MinWidth, OutlineRenderer.MaxWidth); - } - } - - /// - public float OutlineIntensity - { - get - { - return _outlineIntensity; - } - set - { - _outlineIntensity = Mathf.Clamp(value, OutlineRenderer.MinIntensity, OutlineRenderer.MaxIntensity); - } - } - - /// - public OutlineRenderFlags OutlineRenderMode - { - get - { - return _outlineMode; - } - set - { - _outlineMode = value; - } - } - - #endregion - - #region IEquatable - - /// - public bool Equals(IOutlineSettings other) - { - return Equals(this, other); - } - - #endregion - - #region Object - - /// - public override bool Equals(object other) - { - return Equals(this, other as IOutlineSettings); - } - - /// - public override int GetHashCode() - { - return base.GetHashCode(); - } - - #endregion - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs.meta deleted file mode 100644 index c6de014..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettings.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b579424fd3338724cba3155ee4d53475 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs deleted file mode 100644 index a39ef7e..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs +++ /dev/null @@ -1,178 +0,0 @@ -// 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 -{ - [Serializable] - internal class OutlineSettingsInstance : IOutlineSettingsEx - { - #region data - -#pragma warning disable 0649 - - // NOTE: There are custom editors for public components, so no need to show these in default inspector. - [SerializeField, HideInInspector] - private OutlineSettings _outlineSettings; - [SerializeField, HideInInspector] - private Color _outlineColor = Color.red; - [SerializeField, HideInInspector] - private int _outlineWidth = 4; - [SerializeField, HideInInspector] - private float _outlineIntensity = 2; - [SerializeField, HideInInspector] - private OutlineRenderFlags _outlineMode; - -#pragma warning restore 0649 - - private OutlineResources _resources; - - #endregion - - #region interface - - public OutlineResources OutlineResources - { - get - { - return _resources; - } - set - { - _resources = value; - } - } - - public bool RequiresCameraDepth - { - get - { - var renderMode = _outlineMode; - - if (!ReferenceEquals(_outlineSettings, null)) - { - renderMode = _outlineSettings.OutlineRenderMode; - } - - return (renderMode & OutlineRenderFlags.EnableDepthTesting) != 0; - } - } - - internal OutlineSettingsInstance() - { - } - - internal OutlineSettingsInstance(OutlineResources resources) - { - _resources = resources; - } - - #endregion - - #region IOutlineSettingsEx - - public OutlineSettings OutlineSettings - { - get - { - return _outlineSettings; - } - set - { - _outlineSettings = value; - } - } - - #endregion - - #region IOutlineSettings - - /// - public Color OutlineColor - { - get - { - if (!ReferenceEquals(_outlineSettings, null)) - { - return _outlineSettings.OutlineColor; - } - - return _outlineColor; - } - set - { - _outlineColor = value; - } - } - - /// - public int OutlineWidth - { - get - { - if (!ReferenceEquals(_outlineSettings, null)) - { - return _outlineSettings.OutlineWidth; - } - - return _outlineWidth; - } - set - { - _outlineWidth = Mathf.Clamp(value, OutlineRenderer.MinWidth, OutlineRenderer.MaxWidth); - } - } - - /// - public float OutlineIntensity - { - get - { - if (!ReferenceEquals(_outlineSettings, null)) - { - return _outlineSettings.OutlineIntensity; - } - - return _outlineIntensity; - } - set - { - _outlineIntensity = Mathf.Clamp(value, OutlineRenderer.MinIntensity, OutlineRenderer.MaxIntensity); - } - } - - /// - public OutlineRenderFlags OutlineRenderMode - { - get - { - if (!ReferenceEquals(_outlineSettings, null)) - { - return _outlineSettings.OutlineRenderMode; - } - - return _outlineMode; - } - set - { - _outlineMode = value; - } - } - - #endregion - - #region IEquatable - - public bool Equals(IOutlineSettings other) - { - return OutlineSettings.Equals(this, other); - } - - #endregion - - #region implementation - #endregion - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs.meta b/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs.meta deleted file mode 100644 index 177c3cb..0000000 --- a/Packages/UnityFx.Outline/Runtime/Scripts/OutlineSettingsInstance.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8ea4c60e473b8ef4790934bb274993cc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Shaders.meta b/Packages/UnityFx.Outline/Runtime/Shaders.meta deleted file mode 100644 index bf1ab62..0000000 --- a/Packages/UnityFx.Outline/Runtime/Shaders.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: e4ede0e617beaeb4a8781136599aa84e -folderAsset: yes -timeCreated: 1566126961 -licenseType: Free -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader b/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader deleted file mode 100644 index 2febb62..0000000 --- a/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -// Renders outline based on a texture produces by 'UnityF/Outline/RenderColor' output. -// Modified version of 'Custom/Post Outline' shader taken from https://willweissman.wordpress.com/tutorials/shaders/unity-shaderlab-object-outlines/. -Shader "UnityFx/Outline/HPass" -{ - Properties - { - _Width("Outline thickness (in pixels)", Range(1, 32)) = 5 - } - - SubShader - { - Cull Off - ZWrite Off - ZTest Always - Lighting Off - - Pass - { - HLSLPROGRAM - - #pragma vertex Vert - #pragma fragment Frag - #include "UnityCG.cginc" - - CBUFFER_START(UnityPerMaterial) - int _Width; - CBUFFER_END - - UNITY_DECLARE_TEX2D(_MaskTex); - float2 _MaskTex_TexelSize; - float _GaussSamples[32]; - - struct v2f - { - float4 pos : POSITION; - float2 uvs : TEXCOORD0; - }; - - v2f Vert(appdata_base v) - { - v2f o; - - o.pos = float4(v.vertex.xy, 0.0, 1.0); - o.uvs = ComputeScreenPos(o.pos); - - return o; - } - - float Frag(v2f i) : COLOR - { - float TX_x = _MaskTex_TexelSize.x; - float intensity; - int n = _Width; - - for (int k = -n; k <= n; k += 1) - { - intensity += UNITY_SAMPLE_TEX2D(_MaskTex, i.uvs.xy + float2(k * TX_x, 0)).r * _GaussSamples[abs(k)]; - } - - return intensity; - } - - ENDHLSL - } - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader.meta b/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader.meta deleted file mode 100644 index bb55354..0000000 --- a/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass1.shader.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 41c9acbf41c8245498ac9beab378de12 -timeCreated: 1566126977 -licenseType: Free -ShaderImporter: - externalObjects: {} - defaultTextures: [] - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader b/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader deleted file mode 100644 index dbf1a18..0000000 --- a/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -// Renders outline based on a texture produces by 'UnityF/Outline/RenderColor' output. -// Modified version of 'Custom/Post Outline' shader taken from https://willweissman.wordpress.com/tutorials/shaders/unity-shaderlab-object-outlines/. -Shader "UnityFx/Outline/VPassBlend" -{ - Properties - { - _Width("Outline thickness (in pixels)", Range(1, 32)) = 5 - _Intensity("Outline intensity", Range(0.1, 100)) = 2 - _Color("Outline color", Color) = (1, 0, 0, 1) - } - - SubShader - { - Cull Off - ZWrite Off - ZTest Always - Lighting Off - - Blend SrcAlpha OneMinusSrcAlpha - - Pass - { - HLSLPROGRAM - - #pragma vertex Vert - #pragma fragment Frag - #include "UnityCG.cginc" - - CBUFFER_START(UnityPerMaterial) - float _Intensity; - int _Width; - float4 _Color; - CBUFFER_END - - UNITY_DECLARE_TEX2D(_MaskTex); - float2 _MaskTex_TexelSize; - UNITY_DECLARE_TEX2D(_HPassTex); - float2 _HPassTex_TexelSize; - float _GaussSamples[32]; - - struct v2f - { - float4 pos : POSITION; - float2 uvs : TEXCOORD0; - }; - - v2f Vert(appdata_base v) - { - v2f o; - - o.pos = float4(v.vertex.xy, 0.0, 1.0); - o.uvs = ComputeScreenPos(o.pos); - - return o; - } - - float4 Frag(v2f i) : COLOR - { - if (UNITY_SAMPLE_TEX2D(_MaskTex, i.uvs.xy).r > 0) - { - discard; - } - - float TX_y = _MaskTex_TexelSize.y; - float intensity; - int n = _Width; - - for (int k = -n; k <= _Width; k += 1) - { - intensity += UNITY_SAMPLE_TEX2D(_HPassTex, i.uvs.xy + float2(0, k * TX_y)).r * _GaussSamples[abs(k)]; - } - - intensity = _Intensity > 99 ? step(0.01, intensity) : intensity * _Intensity; - return float4(_Color.rgb, saturate(_Color.a * intensity)); - } - - ENDHLSL - } - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader.meta b/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader.meta deleted file mode 100644 index 5852e4b..0000000 --- a/Packages/UnityFx.Outline/Runtime/Shaders/OutlinePass2.shader.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1df0cb1700e142f4ca3b28297d3957da -ShaderImporter: - externalObjects: {} - defaultTextures: [] - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader b/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader deleted file mode 100644 index bf53276..0000000 --- a/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -// Renders everything with while color. -// Modified version of 'Custom/DrawSimple' shader taken from https://willweissman.wordpress.com/tutorials/shaders/unity-shaderlab-object-outlines/. -Shader "UnityFx/Outline/RenderColor" -{ - SubShader - { - Cull Off - ZWrite Off - ZTest LEqual - Lighting Off - - Pass - { - HLSLPROGRAM - - #pragma vertex Vert - #pragma fragment Frag - #include "UnityCG.cginc" - - struct v2f - { - float4 pos: POSITION; - }; - - v2f Vert(v2f i) - { - v2f o; - o.pos = UnityObjectToClipPos(i.pos); - return o; - } - - half4 Frag(): COLOR0 - { - return half4(1, 1, 1, 1); - } - - ENDHLSL - } - } -} diff --git a/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader.meta b/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader.meta deleted file mode 100644 index 66aa3a2..0000000 --- a/Packages/UnityFx.Outline/Runtime/Shaders/OutlineRenderColor.shader.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: ac20fbf75bafe454aba5ef3c098349df -timeCreated: 1566126977 -licenseType: Free -ShaderImporter: - externalObjects: {} - defaultTextures: [] - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef b/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef deleted file mode 100644 index af0702d..0000000 --- a/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "UnityFx.Outline" -} diff --git a/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef.meta b/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef.meta deleted file mode 100644 index 6a74c49..0000000 --- a/Packages/UnityFx.Outline/Runtime/UnityFx.Outline.asmdef.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: de7ed7f8e7092c144bd17cbabf282ba3 -timeCreated: 1566126961 -licenseType: Free -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Tests.meta b/Packages/UnityFx.Outline/Tests.meta deleted file mode 100644 index ac6bd9e..0000000 --- a/Packages/UnityFx.Outline/Tests.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 9c2f662256b33974c94b1b56640a7397 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Tests/Editor.meta b/Packages/UnityFx.Outline/Tests/Editor.meta deleted file mode 100644 index f2ff48e..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f2ad07e44abb5204aa73321dbeb58ddd -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts.meta b/Packages/UnityFx.Outline/Tests/Editor/Scripts.meta deleted file mode 100644 index f055344..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0678297c303e4104896b2beec616a514 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers.meta b/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers.meta deleted file mode 100644 index 75cfe48..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ecd2c4203d2dee74389ff168d633fe3a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs b/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs deleted file mode 100644 index af05396..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.ComponentModel; -using UnityEngine; -using UnityEngine.TestTools; -using NUnit.Framework; - -namespace UnityFx.Outline -{ - public abstract class IOutlineSettingsExTests : IOutlineSettingsTests - { - private IOutlineSettingsEx _settings; - private IChangeTracking _changeTracking; - - protected void Init(IOutlineSettingsEx settings) - { - _settings = settings; - _changeTracking = settings as IChangeTracking; - base.Init(settings); - } - - [Test] - public void OutlineSettings_SetsValue() - { - var settings = ScriptableObject.CreateInstance(); - - try - { - _settings.OutlineSettings = settings; - - Assert.AreEqual(settings, _settings.OutlineSettings); - - _settings.OutlineSettings = null; - - Assert.IsNull(_settings.OutlineSettings); - } - finally - { - UnityEngine.Object.DestroyImmediate(settings); - } - } - - [Test] - public void OutlineSettings_SetsChanged() - { - if (_changeTracking != null) - { - var settings = ScriptableObject.CreateInstance(); - - try - { - _changeTracking.AcceptChanges(); - _settings.OutlineSettings = settings; - - Assert.IsTrue(_changeTracking.IsChanged); - } - finally - { - UnityEngine.Object.DestroyImmediate(settings); - } - } - } - - [Test] - public void OutlineSettings_DoesNotSetsChangedOnSameValue() - { - if (_changeTracking != null) - { - _changeTracking.AcceptChanges(); - _settings.OutlineSettings = _settings.OutlineSettings; - - Assert.IsFalse(_changeTracking.IsChanged); - } - } - - [Test] - public void OutlineSettings_MakesOtherSettersThrow() - { - var settings = ScriptableObject.CreateInstance(); - - try - { - _settings.OutlineSettings = settings; - - Assert.Throws(() => _settings.OutlineColor = Color.blue); - Assert.Throws(() => _settings.OutlineWidth = 12); - Assert.Throws(() => _settings.OutlineRenderMode = OutlineRenderFlags.Blurred); - Assert.Throws(() => _settings.OutlineIntensity = 17); - } - finally - { - UnityEngine.Object.DestroyImmediate(settings); - } - } - } -} diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs.meta b/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs.meta deleted file mode 100644 index eacde42..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsExTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c7d2cd56d59228e40917059e616e5ee9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs b/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs deleted file mode 100644 index 55a2687..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.ComponentModel; -using UnityEngine; -using UnityEngine.TestTools; -using NUnit.Framework; - -namespace UnityFx.Outline -{ - public abstract class IOutlineSettingsTests - { - private IOutlineSettings _settings; - private IChangeTracking _changeTracking; - - protected void Init(IOutlineSettings settings) - { - _settings = settings; - _changeTracking = settings as IChangeTracking; - } - - [Test] - public void OutlineColor_SetsValue() - { - var color = Color.blue; - _settings.OutlineColor = color; - - Assert.AreEqual(color, _settings.OutlineColor); - } - - [Test] - public void OutlineColor_SetsChanged() - { - if (_changeTracking != null) - { - _changeTracking.AcceptChanges(); - _settings.OutlineColor = Color.blue; - - Assert.IsTrue(_changeTracking.IsChanged); - } - } - - [Test] - public void OutlineColor_DoesNotSetsChangedOnSameValue() - { - if (_changeTracking != null) - { - _changeTracking.AcceptChanges(); - _settings.OutlineColor = _settings.OutlineColor; - - Assert.IsFalse(_changeTracking.IsChanged); - } - } - - [Test] - public void OutlineWidth_DefaultValueIsValid() - { - Assert.LessOrEqual(OutlineRenderer.MinWidth, _settings.OutlineWidth); - Assert.GreaterOrEqual(OutlineRenderer.MaxWidth, _settings.OutlineWidth); - } - - [Test] - public void OutlineWidth_SetsValue() - { - var width = UnityEngine.Random.Range(OutlineRenderer.MinWidth, OutlineRenderer.MaxWidth); - _settings.OutlineWidth = width; - - Assert.AreEqual(width, _settings.OutlineWidth); - } - - [Test] - public void OutlineWidth_ClampsValue() - { - _settings.OutlineWidth = 1000; - - Assert.AreEqual(OutlineRenderer.MaxWidth, _settings.OutlineWidth); - - _settings.OutlineWidth = -1000; - - Assert.AreEqual(OutlineRenderer.MinWidth, _settings.OutlineWidth); - } - - [Test] - public void OutlineWidth_SetsChanged() - { - if (_changeTracking != null) - { - _changeTracking.AcceptChanges(); - _settings.OutlineWidth = 10; - - Assert.IsTrue(_changeTracking.IsChanged); - } - } - - [Test] - public void OutlineWidth_DoesNotSetsChangedOnSameValue() - { - if (_changeTracking != null) - { - _changeTracking.AcceptChanges(); - _settings.OutlineWidth = _settings.OutlineWidth; - - Assert.IsFalse(_changeTracking.IsChanged); - } - } - - [Test] - public void OutlineMode_SetsValue() - { - _settings.OutlineRenderMode = OutlineRenderFlags.Blurred; - Assert.AreEqual(OutlineRenderFlags.Blurred, _settings.OutlineRenderMode); - - _settings.OutlineRenderMode = OutlineRenderFlags.Solid; - Assert.AreEqual(OutlineRenderFlags.Solid, _settings.OutlineRenderMode); - } - - [Test] - public void OutlineMode_SetsChanged() - { - if (_changeTracking != null) - { - _changeTracking.AcceptChanges(); - _settings.OutlineRenderMode = OutlineRenderFlags.Blurred; - - Assert.IsTrue(_changeTracking.IsChanged); - } - } - - [Test] - public void OutlineMode_DoesNotSetsChangedOnSameValue() - { - if (_changeTracking != null) - { - _changeTracking.AcceptChanges(); - _settings.OutlineRenderMode = _settings.OutlineRenderMode; - - Assert.IsFalse(_changeTracking.IsChanged); - } - } - - [Test] - public void OutlineIntensity_DefaultValueIsValid() - { - Assert.LessOrEqual(OutlineRenderer.MinIntensity, _settings.OutlineIntensity); - Assert.GreaterOrEqual(OutlineRenderer.MaxIntensity, _settings.OutlineIntensity); - } - - [Test] - public void OutlineIntensity_SetsValue() - { - var intensity = UnityEngine.Random.Range(OutlineRenderer.MinIntensity, OutlineRenderer.MaxIntensity); - - _settings.OutlineIntensity = intensity; - - Assert.AreEqual(intensity, _settings.OutlineIntensity); - } - - [Test] - public void OutlineIntensity_ClampsValue() - { - _settings.OutlineIntensity = 1000; - - Assert.AreEqual(OutlineRenderer.MaxIntensity, _settings.OutlineIntensity); - - _settings.OutlineIntensity = -1000; - - Assert.AreEqual(OutlineRenderer.MinIntensity, _settings.OutlineIntensity); - } - - [Test] - public void OutlineIntensity_SetsChanged() - { - if (_changeTracking != null) - { - _changeTracking.AcceptChanges(); - _settings.OutlineIntensity = 21; - - Assert.IsTrue(_changeTracking.IsChanged); - } - } - - [Test] - public void OutlineIntensity_DoesNotSetsChangedOnSameValue() - { - if (_changeTracking != null) - { - _changeTracking.AcceptChanges(); - _settings.OutlineIntensity = _settings.OutlineIntensity; - - Assert.IsFalse(_changeTracking.IsChanged); - } - } - } -} diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs.meta b/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs.meta deleted file mode 100644 index 57016ed..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/Helpers/IOutlineSettingsTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 504f7cf5606c25a4a8eeea06598d8cd0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineBehaviourTests.cs b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineBehaviourTests.cs deleted file mode 100644 index 02c4202..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineBehaviourTests.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.TestTools; -using NUnit.Framework; - -namespace UnityFx.Outline -{ - [Category("OutlineBehaviour"), TestOf(typeof(OutlineBehaviour))] - public class OutlineBehaviourTests : IOutlineSettingsExTests, IDisposable - { - private GameObject _go; - private OutlineBehaviour _outlineEffect; - - [SetUp] - public void Init() - { - _go = new GameObject(); - _outlineEffect = _go.AddComponent(); - Init(_outlineEffect); - } - - [TearDown] - public void Dispose() - { - UnityEngine.Object.DestroyImmediate(_go); - } - } -} diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineBehaviourTests.cs.meta b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineBehaviourTests.cs.meta deleted file mode 100644 index 34a74f0..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineBehaviourTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f7ff33caf6306d649ab2176f29f193d6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs deleted file mode 100644 index fc19adb..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.TestTools; -using NUnit.Framework; - -namespace UnityFx.Outline -{ - [Category("OutlineLayerCollection"), TestOf(typeof(OutlineLayerCollection))] - public class OutlineLayerCollectionTests : IDisposable - { - private OutlineLayerCollection _layerCollection; - - [SetUp] - public void Init() - { - _layerCollection = ScriptableObject.CreateInstance(); - } - - [TearDown] - public void Dispose() - { - UnityEngine.Object.DestroyImmediate(_layerCollection); - } - - [Test] - public void DefaultStateIsValid() - { - Assert.IsFalse(_layerCollection.IsReadOnly); - Assert.IsEmpty(_layerCollection); - Assert.Zero(_layerCollection.Count); - } - - [Test] - public void Add_ThrowsIfArgumentIsNull() - { - Assert.Throws(() => _layerCollection.Add(null)); - } - - [Test] - public void Add_ThrowsIfLayerBelongsToAnotherCollection() - { - var anotherLayerCollection = ScriptableObject.CreateInstance(); - var layer = new OutlineLayer(); - - try - { - anotherLayerCollection.Add(layer); - Assert.Throws(() => _layerCollection.Add(layer)); - } - finally - { - UnityEngine.Object.DestroyImmediate(anotherLayerCollection); - } - } - - [Test] - public void Add_SetsCount() - { - _layerCollection.Add(new OutlineLayer()); - - Assert.AreEqual(1, _layerCollection.Count); - } - - [Test] - public void Insert_ThrowsIfArgumentIsNull() - { - Assert.Throws(() => _layerCollection.Insert(0, null)); - } - - [Test] - public void Insert_ThrowsIfLayerBelongsToAnotherCollection() - { - var anotherLayerCollection = ScriptableObject.CreateInstance(); - var layer = new OutlineLayer(); - - try - { - anotherLayerCollection.Add(layer); - Assert.Throws(() => _layerCollection.Insert(0, layer)); - } - finally - { - UnityEngine.Object.DestroyImmediate(anotherLayerCollection); - } - } - - [Test] - public void Insert_SetsCount() - { - _layerCollection.Insert(0, new OutlineLayer()); - - Assert.AreEqual(1, _layerCollection.Count); - } - - [Test] - public void Remove_DoesNotThrowOnNullArgument() - { - Assert.DoesNotThrow(() => _layerCollection.Remove(null)); - } - - [Test] - public void Remove_SetsCount() - { - var layer = new OutlineLayer(); - - _layerCollection.Add(layer); - _layerCollection.Remove(layer); - - Assert.Zero(_layerCollection.Count); - } - - [Test] - public void Clear_ResetsCount() - { - _layerCollection.Add(new OutlineLayer()); - _layerCollection.Clear(); - - Assert.Zero(_layerCollection.Count); - } - - [Test] - public void Contains_DoesNotThrowIfArgumentIsNull() - { - _layerCollection.Contains(null); - } - - [Test] - public void Contains_SearchesArgument() - { - var layer = new OutlineLayer(); - - Assert.IsFalse(_layerCollection.Contains(layer)); - - _layerCollection.Add(layer); - - Assert.IsTrue(_layerCollection.Contains(layer)); - } - - [Test] - public void SortedLayers_IsSortedByPriority() - { - var layer1 = new OutlineLayer() - { - Priority = 2 - }; - - var layer2 = new OutlineLayer(); - var layer3 = new OutlineLayer(); - - _layerCollection.Add(layer1); - _layerCollection.Add(layer2); - _layerCollection.Add(layer3); - - Assert.AreEqual(layer2, _layerCollection.SortedLayers[0]); - Assert.AreEqual(layer3, _layerCollection.SortedLayers[1]); - Assert.AreEqual(layer1, _layerCollection.SortedLayers[2]); - } - } -} diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs.meta b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs.meta deleted file mode 100644 index d67e736..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerCollectionTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4a6e8c8f29227c2469990a6168c53b3f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerTests.cs b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerTests.cs deleted file mode 100644 index df639c6..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerTests.cs +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.TestTools; -using NUnit.Framework; - -namespace UnityFx.Outline -{ - [Category("OutlineLayer"), TestOf(typeof(OutlineLayer))] - public class OutlineLayerTests : IOutlineSettingsExTests, IDisposable - { - private OutlineLayer _layer; - - [SetUp] - public void Init() - { - _layer = new OutlineLayer("TestLayer"); - Init(_layer); - } - - [TearDown] - public void Dispose() - { - } - - [Test] - public void DefaultStateIsValid() - { - Assert.IsFalse(_layer.IsReadOnly); - Assert.IsEmpty(_layer); - Assert.Zero(_layer.Count); - Assert.AreEqual("TestLayer", _layer.Name); - Assert.AreEqual(-1, _layer.Index); - } - - [Test] - public void Add_ThrowsIfArgumentIsNull() - { - Assert.Throws(() => _layer.Add(null)); - } - - [Test] - public void Add_SetsCount() - { - _layer.Add(new GameObject()); - - Assert.AreEqual(1, _layer.Count); - } - - [Test] - public void Add_FiltersRenderesByLayer() - { - var go = new GameObject("r1", typeof(MeshRenderer)); - var go2 = new GameObject("r2", typeof(MeshRenderer)); - - go2.layer = LayerMask.NameToLayer("TransparentFX"); - go2.transform.SetParent(go.transform, false); - - ICollection r; - - _layer.Add(go, "TransparentFX"); - _layer.TryGetRenderers(go, out r); - - Assert.AreEqual(1, r.Count); - Assert.IsTrue(r.Contains(go.GetComponent())); - Assert.IsFalse(r.Contains(go2.GetComponent())); - } - - [Test] - public void Remove_DoesNotThrowOnNullArgument() - { - Assert.DoesNotThrow(() => _layer.Remove(null)); - } - - [Test] - public void Remove_SetsCount() - { - var go = new GameObject(); - - _layer.Add(go); - _layer.Remove(go); - - Assert.Zero(_layer.Count); - } - - [Test] - public void Clear_ResetsCount() - { - _layer.Add(new GameObject()); - _layer.Clear(); - - Assert.Zero(_layer.Count); - } - - [Test] - public void Contains_DoesNotThrowIfArgumentIsNull() - { - _layer.Contains(null); - } - - [Test] - public void Contains_SearchesArgument() - { - var go = new GameObject(); - - Assert.IsFalse(_layer.Contains(go)); - - _layer.Add(go); - - Assert.IsTrue(_layer.Contains(go)); - } - } -} diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerTests.cs.meta b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerTests.cs.meta deleted file mode 100644 index 5f35914..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineLayerTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6372b061875e8a54bb7ca0dbf1bb3e4b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineRendererTests.cs b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineRendererTests.cs deleted file mode 100644 index e4c83b0..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineRendererTests.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.TestTools; -using NUnit.Framework; - -namespace UnityFx.Outline -{ - [Category("OutlineRenderer"), TestOf(typeof(OutlineRenderer))] - public class OutlineRendererTests : IDisposable - { - private CommandBuffer _commandBuffer; - private OutlineRenderer _renderer; - - [SetUp] - public void Init() - { - _commandBuffer = new CommandBuffer(); - _renderer = new OutlineRenderer(_commandBuffer, BuiltinRenderTextureType.CameraTarget); - } - - [TearDown] - public void Dispose() - { - _commandBuffer.Dispose(); - } - - [Test] - public void Dispose_CanBeCalledMultipleTimes() - { - _renderer.Dispose(); - _renderer.Dispose(); - } - - [Test] - public void RenderSingleObject_ThrowsIfNullArguments() - { - Assert.Throws(() => _renderer.Render(default(IList), null, null)); - Assert.Throws(() => _renderer.Render(default(Renderer), null, null)); - } - } -} diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineRendererTests.cs.meta b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineRendererTests.cs.meta deleted file mode 100644 index dce56a7..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineRendererTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0c4dcc61e824b6f4f8805dbe543d2997 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineSettingsTests.cs b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineSettingsTests.cs deleted file mode 100644 index e47efbe..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineSettingsTests.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (C) 2019-2020 Alexander Bogarsukov. All rights reserved. -// See the LICENSE.md file in the project root for more information. - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEditor; -using UnityEngine; -using UnityEngine.TestTools; -using NUnit.Framework; - -namespace UnityFx.Outline -{ - [Category("OutlineSettings"), TestOf(typeof(OutlineSettings))] - public class OutlineSettingsTests : IOutlineSettingsTests, IDisposable - { - private OutlineSettings _settings; - - [SetUp] - public void Init() - { - _settings = ScriptableObject.CreateInstance(); - Init(_settings); - } - - [TearDown] - public void Dispose() - { - UnityEngine.Object.DestroyImmediate(_settings); - } - } -} diff --git a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineSettingsTests.cs.meta b/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineSettingsTests.cs.meta deleted file mode 100644 index 297e458..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/Scripts/OutlineSettingsTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ee681c20e65b7a34085cd5f07a0c03a5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/Tests/Editor/UnityFx.Outline.Editor.Tests.asmdef b/Packages/UnityFx.Outline/Tests/Editor/UnityFx.Outline.Editor.Tests.asmdef deleted file mode 100644 index f715ffe..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/UnityFx.Outline.Editor.Tests.asmdef +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "UnityFx.Outline.Editor.Tests", - "references": [ - "UnityFx.Outline", - "UnityFx.Outline.Editor" - ], - "optionalUnityReferences": [ - "TestAssemblies" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [] -} \ No newline at end of file diff --git a/Packages/UnityFx.Outline/Tests/Editor/UnityFx.Outline.Editor.Tests.asmdef.meta b/Packages/UnityFx.Outline/Tests/Editor/UnityFx.Outline.Editor.Tests.asmdef.meta deleted file mode 100644 index 5b4009a..0000000 --- a/Packages/UnityFx.Outline/Tests/Editor/UnityFx.Outline.Editor.Tests.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 10ef01f813866564b87fc5ff13123c77 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/UnityFx.Outline/package.json b/Packages/UnityFx.Outline/package.json deleted file mode 100644 index 0dfd31d..0000000 --- a/Packages/UnityFx.Outline/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "com.unityfx.outline", - "version": "0.8.0", - "displayName": "Screen-space outline", - "description": "Configurable per-object and per-camera outlines. Both solid and blurred outline modes are supported (Gauss blur). The outlines can be easily customized either through scripts or with Unity editor (both in edit-time or runtime).", - "unity": "2017.2", - "keywords": [ - "UnityFx", - "UnityFx.Outline", - "outline", - "post-effect" - ], - "category": "UnityFx", - "author": { - "name": "Arvtesh", - "email": "arvtesh@gmail.com" - }, - "license": "MIT", - "homepage": "https://github.com/Arvtesh/UnityFx.Outline", - "repository": { - "type": "git", - "url": "https://github.com/Arvtesh/UnityFx.Outline.git" - }, - "bugs": { - "url": "https://github.com/Arvtesh/UnityFx.Outline/issues" - } -} diff --git a/Packages/UnityFx.Outline/package.json.meta b/Packages/UnityFx.Outline/package.json.meta deleted file mode 100644 index d824967..0000000 --- a/Packages/UnityFx.Outline/package.json.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 411b5b9873de2d244ac737335a5117d6 -timeCreated: 1566126977 -licenseType: Free -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: From 24bf7b73415aba9562943f4dc348f36edde0b1db Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Thu, 2 Apr 2020 15:42:47 +0300 Subject: [PATCH 33/39] Updated publish scripts --- .github/workflows/npmpublish.yml | 6 +++--- NpmPublish.bat | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/npmpublish.yml b/.github/workflows/npmpublish.yml index b31fac2..a5a13f5 100644 --- a/.github/workflows/npmpublish.yml +++ b/.github/workflows/npmpublish.yml @@ -15,8 +15,8 @@ jobs: node-version: 12 registry-url: https://registry.npmjs.org/ - run: | - npm publish Packages/UnityFx.Outline - npm publish Packages/UnityFx.Outline.PostProcessing - npm publish Packages/UnityFx.Outline.HDRP + npm publish Outline.Core/Packages/UnityFx.Outline + npm publish Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing + npm publish Outline.HDRP/Packages/UnityFx.Outline.HDRP env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/NpmPublish.bat b/NpmPublish.bat index 5ac393f..0fd89a5 100644 --- a/NpmPublish.bat +++ b/NpmPublish.bat @@ -1,2 +1,3 @@ -npm publish Packages\UnityFx.Outline -npm publish Packages\UnityFx.Outline.PostProcessing +npm publish Outline.Core\Packages\UnityFx.Outline +npm publish Outline.PostProcessing\Packages\UnityFx.Outline.PostProcessing +npm publish Outline.HDRP\Packages\UnityFx.Outline.HDRP From caa3ef67c4b8894bc1101b3ac91f99cd75f5ee4a Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Fri, 3 Apr 2020 12:23:43 +0300 Subject: [PATCH 34/39] Removed ProjectSettings folder from .gitignore --- .gitignore | 3 - .../ProjectSettings/AudioManager.asset | 19 + .../ProjectSettings/ClusterInputManager.asset | 6 + .../ProjectSettings/DynamicsManager.asset | 33 + .../ProjectSettings/EditorBuildSettings.asset | 8 + .../ProjectSettings/EditorSettings.asset | 23 + .../ProjectSettings/GraphicsSettings.asset | 63 ++ .../ProjectSettings/InputManager.asset | 295 +++++++++ .../ProjectSettings/NavMeshAreas.asset | 91 +++ .../ProjectSettings/Physics2DSettings.asset | 56 ++ .../ProjectSettings/PresetManager.asset | 6 + .../ProjectSettings/ProjectSettings.asset | 598 +++++++++++++++++ .../ProjectSettings/ProjectVersion.txt | 1 + .../ProjectSettings/QualitySettings.asset | 229 +++++++ Outline.Core/ProjectSettings/TagManager.asset | 43 ++ .../ProjectSettings/TimeManager.asset | 9 + .../UnityConnectSettings.asset | 34 + Outline.Core/ProjectSettings/VFXManager.asset | 11 + .../ProjectSettings/AudioManager.asset | 19 + .../ProjectSettings/ClusterInputManager.asset | 6 + .../ProjectSettings/DynamicsManager.asset | 36 ++ .../ProjectSettings/EditorBuildSettings.asset | 8 + .../ProjectSettings/EditorSettings.asset | 35 + .../ProjectSettings/GraphicsSettings.asset | 64 ++ .../ProjectSettings/HDRPProjectSettings.asset | 21 + .../ProjectSettings/InputManager.asset | 487 ++++++++++++++ .../ProjectSettings/NavMeshAreas.asset | 91 +++ .../ProjectSettings/Physics2DSettings.asset | 56 ++ .../ProjectSettings/PresetManager.asset | 7 + .../ProjectSettings/ProjectSettings.asset | 610 ++++++++++++++++++ .../ProjectSettings/ProjectVersion.txt | 2 + .../ProjectSettings/QualitySettings.asset | 236 +++++++ Outline.HDRP/ProjectSettings/TagManager.asset | 43 ++ .../ProjectSettings/TimeManager.asset | 9 + .../UnityConnectSettings.asset | 34 + Outline.HDRP/ProjectSettings/VFXManager.asset | 12 + Outline.HDRP/ProjectSettings/XRSettings.asset | 10 + .../ProjectSettings/AudioManager.asset | Bin 0 -> 4148 bytes .../ProjectSettings/ClusterInputManager.asset | Bin 0 -> 4104 bytes .../ProjectSettings/DynamicsManager.asset | Bin 0 -> 4338 bytes .../ProjectSettings/EditorBuildSettings.asset | Bin 0 -> 4108 bytes .../ProjectSettings/EditorSettings.asset | Bin 0 -> 4228 bytes .../ProjectSettings/InputManager.asset | Bin 0 -> 5520 bytes .../ProjectSettings/NavMeshAreas.asset | Bin 0 -> 4464 bytes .../ProjectSettings/Physics2DSettings.asset | Bin 0 -> 4448 bytes .../ProjectSettings/PresetManager.asset | Bin 0 -> 4104 bytes .../ProjectSettings/ProjectSettings.asset | 607 +++++++++++++++++ .../ProjectSettings/ProjectVersion.txt | 1 + .../ProjectSettings/QualitySettings.asset | Bin 0 -> 5100 bytes .../ProjectSettings/TagManager.asset | Bin 0 -> 4308 bytes .../ProjectSettings/TimeManager.asset | Bin 0 -> 4116 bytes .../UnityConnectSettings.asset | Bin 0 -> 4328 bytes .../ProjectSettings/VFXManager.asset | Bin 0 -> 4148 bytes .../ProjectSettings/graphicssettings.asset | Bin 0 -> 4467 bytes 54 files changed, 3919 insertions(+), 3 deletions(-) create mode 100644 Outline.Core/ProjectSettings/AudioManager.asset create mode 100644 Outline.Core/ProjectSettings/ClusterInputManager.asset create mode 100644 Outline.Core/ProjectSettings/DynamicsManager.asset create mode 100644 Outline.Core/ProjectSettings/EditorBuildSettings.asset create mode 100644 Outline.Core/ProjectSettings/EditorSettings.asset create mode 100644 Outline.Core/ProjectSettings/GraphicsSettings.asset create mode 100644 Outline.Core/ProjectSettings/InputManager.asset create mode 100644 Outline.Core/ProjectSettings/NavMeshAreas.asset create mode 100644 Outline.Core/ProjectSettings/Physics2DSettings.asset create mode 100644 Outline.Core/ProjectSettings/PresetManager.asset create mode 100644 Outline.Core/ProjectSettings/ProjectSettings.asset create mode 100644 Outline.Core/ProjectSettings/ProjectVersion.txt create mode 100644 Outline.Core/ProjectSettings/QualitySettings.asset create mode 100644 Outline.Core/ProjectSettings/TagManager.asset create mode 100644 Outline.Core/ProjectSettings/TimeManager.asset create mode 100644 Outline.Core/ProjectSettings/UnityConnectSettings.asset create mode 100644 Outline.Core/ProjectSettings/VFXManager.asset create mode 100644 Outline.HDRP/ProjectSettings/AudioManager.asset create mode 100644 Outline.HDRP/ProjectSettings/ClusterInputManager.asset create mode 100644 Outline.HDRP/ProjectSettings/DynamicsManager.asset create mode 100644 Outline.HDRP/ProjectSettings/EditorBuildSettings.asset create mode 100644 Outline.HDRP/ProjectSettings/EditorSettings.asset create mode 100644 Outline.HDRP/ProjectSettings/GraphicsSettings.asset create mode 100644 Outline.HDRP/ProjectSettings/HDRPProjectSettings.asset create mode 100644 Outline.HDRP/ProjectSettings/InputManager.asset create mode 100644 Outline.HDRP/ProjectSettings/NavMeshAreas.asset create mode 100644 Outline.HDRP/ProjectSettings/Physics2DSettings.asset create mode 100644 Outline.HDRP/ProjectSettings/PresetManager.asset create mode 100644 Outline.HDRP/ProjectSettings/ProjectSettings.asset create mode 100644 Outline.HDRP/ProjectSettings/ProjectVersion.txt create mode 100644 Outline.HDRP/ProjectSettings/QualitySettings.asset create mode 100644 Outline.HDRP/ProjectSettings/TagManager.asset create mode 100644 Outline.HDRP/ProjectSettings/TimeManager.asset create mode 100644 Outline.HDRP/ProjectSettings/UnityConnectSettings.asset create mode 100644 Outline.HDRP/ProjectSettings/VFXManager.asset create mode 100644 Outline.HDRP/ProjectSettings/XRSettings.asset create mode 100644 Outline.PostProcessing/ProjectSettings/AudioManager.asset create mode 100644 Outline.PostProcessing/ProjectSettings/ClusterInputManager.asset create mode 100644 Outline.PostProcessing/ProjectSettings/DynamicsManager.asset create mode 100644 Outline.PostProcessing/ProjectSettings/EditorBuildSettings.asset create mode 100644 Outline.PostProcessing/ProjectSettings/EditorSettings.asset create mode 100644 Outline.PostProcessing/ProjectSettings/InputManager.asset create mode 100644 Outline.PostProcessing/ProjectSettings/NavMeshAreas.asset create mode 100644 Outline.PostProcessing/ProjectSettings/Physics2DSettings.asset create mode 100644 Outline.PostProcessing/ProjectSettings/PresetManager.asset create mode 100644 Outline.PostProcessing/ProjectSettings/ProjectSettings.asset create mode 100644 Outline.PostProcessing/ProjectSettings/ProjectVersion.txt create mode 100644 Outline.PostProcessing/ProjectSettings/QualitySettings.asset create mode 100644 Outline.PostProcessing/ProjectSettings/TagManager.asset create mode 100644 Outline.PostProcessing/ProjectSettings/TimeManager.asset create mode 100644 Outline.PostProcessing/ProjectSettings/UnityConnectSettings.asset create mode 100644 Outline.PostProcessing/ProjectSettings/VFXManager.asset create mode 100644 Outline.PostProcessing/ProjectSettings/graphicssettings.asset diff --git a/.gitignore b/.gitignore index 60d4cea..b55632c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,9 +3,6 @@ [Oo]bj/ [Bb]uild/ [Bb]uilds/ -[Pp]roject[Ss]ettings/ - -Assets/AssetStoreTools* # Visual Studio cache directory .vs/ diff --git a/Outline.Core/ProjectSettings/AudioManager.asset b/Outline.Core/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000..27287fe --- /dev/null +++ b/Outline.Core/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 0 diff --git a/Outline.Core/ProjectSettings/ClusterInputManager.asset b/Outline.Core/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000..e7886b2 --- /dev/null +++ b/Outline.Core/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/Outline.Core/ProjectSettings/DynamicsManager.asset b/Outline.Core/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000..8db40ea --- /dev/null +++ b/Outline.Core/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,33 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0 + m_ClothInterCollisionStiffness: 0 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 0 + m_ClothInterCollisionSettingsToggle: 0 + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 diff --git a/Outline.Core/ProjectSettings/EditorBuildSettings.asset b/Outline.Core/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 0000000..0147887 --- /dev/null +++ b/Outline.Core/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: [] + m_configObjects: {} diff --git a/Outline.Core/ProjectSettings/EditorSettings.asset b/Outline.Core/ProjectSettings/EditorSettings.asset new file mode 100644 index 0000000..fb66ccf --- /dev/null +++ b/Outline.Core/ProjectSettings/EditorSettings.asset @@ -0,0 +1,23 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 7 + m_ExternalVersionControlSupport: Hidden Meta Files + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 2 + m_DefaultBehaviorMode: 0 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 0 + m_SpritePackerPaddingPower: 1 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp + m_ProjectGenerationRootNamespace: + m_CollabEditorSettings: + inProgressEnabled: 1 + m_EnableTextureStreamingInPlayMode: 1 diff --git a/Outline.Core/ProjectSettings/GraphicsSettings.asset b/Outline.Core/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000..b23b253 --- /dev/null +++ b/Outline.Core/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,63 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_LegacyDeferred: + m_Mode: 1 + m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, + type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 + m_LogWhenShaderIsCompiled: 0 diff --git a/Outline.Core/ProjectSettings/InputManager.asset b/Outline.Core/ProjectSettings/InputManager.asset new file mode 100644 index 0000000..17c8f53 --- /dev/null +++ b/Outline.Core/ProjectSettings/InputManager.asset @@ -0,0 +1,295 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 diff --git a/Outline.Core/ProjectSettings/NavMeshAreas.asset b/Outline.Core/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000..3b0b7c3 --- /dev/null +++ b/Outline.Core/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/Outline.Core/ProjectSettings/Physics2DSettings.asset b/Outline.Core/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000..6c5cf8a --- /dev/null +++ b/Outline.Core/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_AutoSimulation: 1 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 0 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/Outline.Core/ProjectSettings/PresetManager.asset b/Outline.Core/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000..636a595 --- /dev/null +++ b/Outline.Core/ProjectSettings/PresetManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + m_DefaultList: [] diff --git a/Outline.Core/ProjectSettings/ProjectSettings.asset b/Outline.Core/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000..f23af1f --- /dev/null +++ b/Outline.Core/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,598 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 18 + productGUID: b364a1e52fff61f4dba1069ff72e90f9 + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: DefaultCompany + productName: Outline.Core + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1024 + defaultScreenHeight: 768 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 0 + m_MTRendering: 1 + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + displayResolutionDialog: 1 + iosUseCustomAppBackgroundBehavior: 0 + iosAllowHTTPDownload: 1 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 0 + androidBlitType: 0 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 0 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 0 + graphicsJobs: 0 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + graphicsJobMode: 0 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 1048576 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + vulkanEnableSetSRGBWrite: 0 + m_SupportedAspectRatios: + 4:3: 1 + 5:4: 1 + 16:10: 1 + 16:9: 1 + Others: 1 + bundleVersion: 1.0 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 0 + xboxOneEnable7thCore: 1 + isWsaHolographicRemotingEnabled: 0 + vrSettings: + cardboard: + depthFormat: 0 + enableTransitionView: 0 + daydream: + depthFormat: 0 + useSustainedPerformanceMode: 0 + enableVideoLayer: 0 + useProtectedVideoMemory: 0 + minimumSupportedHeadTracking: 0 + maximumSupportedHeadTracking: 1 + hololens: + depthFormat: 1 + depthBufferSharingEnabled: 1 + oculus: + sharedDepthBuffer: 1 + dashSupport: 1 + lowOverheadMode: 0 + protectedContext: 0 + v2Signing: 0 + enable360StereoCapture: 0 + protectGraphicsMemory: 0 + enableFrameTimingStats: 0 + useHDRDisplay: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 + applicationIdentifier: {} + buildNumber: {} + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 16 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 0 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSTargetOSVersionString: 9.0 + tvOSSdkVersion: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 9.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + iPhoneSplashScreen: {fileID: 0} + iPhoneHighResSplashScreen: {fileID: 0} + iPhoneTallHighResSplashScreen: {fileID: 0} + iPhone47inSplashScreen: {fileID: 0} + iPhone55inPortraitSplashScreen: {fileID: 0} + iPhone55inLandscapeSplashScreen: {fileID: 0} + iPhone58inPortraitSplashScreen: {fileID: 0} + iPhone58inLandscapeSplashScreen: {fileID: 0} + iPadPortraitSplashScreen: {fileID: 0} + iPadHighResPortraitSplashScreen: {fileID: 0} + iPadLandscapeSplashScreen: {fileID: 0} + iPadHighResLandscapeSplashScreen: {fileID: 0} + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSUseLaunchScreenStoryboard: 0 + iOSLaunchScreenCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + clonedFromGUID: 00000000000000000000000000000000 + templatePackageId: + templateDefaultScene: + AndroidTargetArchitectures: 1 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + resolutionDialogBanner: {fileID: 0} + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: [] + m_BuildTargetBatching: [] + m_BuildTargetGraphicsAPIs: [] + m_BuildTargetVRSettings: [] + m_BuildTargetEnableVuforiaSettings: [] + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupLightmapSettings: [] + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchTouchScreenUsage: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 6 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchPlayerConnectionEnabled: 1 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 2 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 2 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + spritePackerPolicy: + webGLMemorySize: 256 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 1 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + scriptingDefineSymbols: {} + platformArchitecture: {} + scriptingBackend: {} + il2cppCompilerConfiguration: {} + managedStrippingLevel: {} + incrementalIl2cppBuild: {} + allowUnsafeCode: 0 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + apiCompatibilityLevelPerPlatform: {} + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: Outline.Core + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: Outline.Core + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, + a: 1} + metroSplashScreenUseBackgroundColor: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + metroCompilationOverrides: 1 + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + xboxOneScriptCompiler: 0 + XboxOneOverrideIdentityName: + vrEditorSettings: + daydream: + daydreamIconForeground: {fileID: 0} + daydreamIconBackground: {fileID: 0} + cloudServicesEnabled: {} + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_PrivateKeyPath: + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + facebookSdkVersion: + facebookAppId: + facebookCookies: 1 + facebookLogging: 1 + facebookStatus: 1 + facebookXfbml: 0 + facebookFrictionlessRequests: 1 + apiCompatibilityLevel: 6 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + projectName: + organizationId: + cloudEnabled: 0 + enableNativePlatformBackendsForNewInputSystem: 0 + disableOldInputManagerSupport: 0 + legacyClampBlendShapeWeights: 0 diff --git a/Outline.Core/ProjectSettings/ProjectVersion.txt b/Outline.Core/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..31a1862 --- /dev/null +++ b/Outline.Core/ProjectSettings/ProjectVersion.txt @@ -0,0 +1 @@ +m_EditorVersion: 2018.4.11f1 diff --git a/Outline.Core/ProjectSettings/QualitySettings.asset b/Outline.Core/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000..92c2a3c --- /dev/null +++ b/Outline.Core/ProjectSettings/QualitySettings.asset @@ -0,0 +1,229 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 5 + m_QualitySettings: + - serializedVersion: 2 + name: Very Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 15 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 1 + textureQuality: 1 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.3 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.4 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 16 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 1 + lodBias: 0.7 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 64 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: High + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Very High + pixelLightCount: 3 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 70 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1.5 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 1024 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Ultra + pixelLightCount: 4 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 4 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 2 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + m_PerPlatformDefaultQuality: + Android: 2 + Lumin: 5 + Nintendo Switch: 5 + PS4: 5 + Standalone: 5 + WebGL: 3 + Windows Store Apps: 5 + XboxOne: 5 + iPhone: 2 + tvOS: 2 diff --git a/Outline.Core/ProjectSettings/TagManager.asset b/Outline.Core/ProjectSettings/TagManager.asset new file mode 100644 index 0000000..1c92a78 --- /dev/null +++ b/Outline.Core/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/Outline.Core/ProjectSettings/TimeManager.asset b/Outline.Core/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000..558a017 --- /dev/null +++ b/Outline.Core/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/Outline.Core/ProjectSettings/UnityConnectSettings.asset b/Outline.Core/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000..fa0b146 --- /dev/null +++ b/Outline.Core/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/Outline.Core/ProjectSettings/VFXManager.asset b/Outline.Core/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..6e0eaca --- /dev/null +++ b/Outline.Core/ProjectSettings/VFXManager.asset @@ -0,0 +1,11 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 diff --git a/Outline.HDRP/ProjectSettings/AudioManager.asset b/Outline.HDRP/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000..27287fe --- /dev/null +++ b/Outline.HDRP/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 0 diff --git a/Outline.HDRP/ProjectSettings/ClusterInputManager.asset b/Outline.HDRP/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000..e7886b2 --- /dev/null +++ b/Outline.HDRP/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/Outline.HDRP/ProjectSettings/DynamicsManager.asset b/Outline.HDRP/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000..1596c42 --- /dev/null +++ b/Outline.HDRP/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0.1 + m_ClothInterCollisionStiffness: 0.2 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 0 + m_ClothInterCollisionSettingsToggle: 0 + m_ClothGravity: {x: 0, y: -9.81, z: 0} + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_SolverType: 0 + m_DefaultMaxAngularSpeed: 50 diff --git a/Outline.HDRP/ProjectSettings/EditorBuildSettings.asset b/Outline.HDRP/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 0000000..0147887 --- /dev/null +++ b/Outline.HDRP/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: [] + m_configObjects: {} diff --git a/Outline.HDRP/ProjectSettings/EditorSettings.asset b/Outline.HDRP/ProjectSettings/EditorSettings.asset new file mode 100644 index 0000000..c8da44e --- /dev/null +++ b/Outline.HDRP/ProjectSettings/EditorSettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_ExternalVersionControlSupport: Visible Meta Files + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 2 + m_DefaultBehaviorMode: 0 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 0 + m_SpritePackerPaddingPower: 1 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp + m_ProjectGenerationRootNamespace: + m_CollabEditorSettings: + inProgressEnabled: 1 + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_AsyncShaderCompilation: 1 + m_EnterPlayModeOptionsEnabled: 0 + m_EnterPlayModeOptions: 3 + m_ShowLightmapResolutionOverlay: 1 + m_UseLegacyProbeSampleCount: 0 + m_AssetPipelineMode: 1 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 diff --git a/Outline.HDRP/ProjectSettings/GraphicsSettings.asset b/Outline.HDRP/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000..35a0fa7 --- /dev/null +++ b/Outline.HDRP/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,64 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_LegacyDeferred: + m_Mode: 1 + m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, + type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 + m_LogWhenShaderIsCompiled: 0 + m_AllowEnlightenSupportForUpgradedProject: 0 diff --git a/Outline.HDRP/ProjectSettings/HDRPProjectSettings.asset b/Outline.HDRP/ProjectSettings/HDRPProjectSettings.asset new file mode 100644 index 0000000..dddb307 --- /dev/null +++ b/Outline.HDRP/ProjectSettings/HDRPProjectSettings.asset @@ -0,0 +1,21 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 63a2978a97e4fc04cb9d905947216f3d, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 1 + m_DefaultScenePrefabSaved: {fileID: 0} + m_DefaultDXRScenePrefabSaved: {fileID: 0} + m_ProjectSettingFolderPath: HDRPDefaultResources + m_WizardPopupAtStart: 0 + m_WizardActiveTab: 0 + m_PackageVersionForMaterials: 7.1.8 diff --git a/Outline.HDRP/ProjectSettings/InputManager.asset b/Outline.HDRP/ProjectSettings/InputManager.asset new file mode 100644 index 0000000..b16147e --- /dev/null +++ b/Outline.HDRP/ProjectSettings/InputManager.asset @@ -0,0 +1,487 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: joystick button 8 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: backspace + altNegativeButton: + altPositiveButton: joystick button 9 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Reset + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Next + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page down + altNegativeButton: + altPositiveButton: joystick button 5 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Previous + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page up + altNegativeButton: + altPositiveButton: joystick button 4 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Validate + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Persistent + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: right shift + altNegativeButton: + altPositiveButton: joystick button 2 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Multiplier + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: joystick button 3 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 6 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 5 + joyNum: 0 diff --git a/Outline.HDRP/ProjectSettings/NavMeshAreas.asset b/Outline.HDRP/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000..3b0b7c3 --- /dev/null +++ b/Outline.HDRP/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/Outline.HDRP/ProjectSettings/Physics2DSettings.asset b/Outline.HDRP/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000..6c5cf8a --- /dev/null +++ b/Outline.HDRP/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_AutoSimulation: 1 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 0 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/Outline.HDRP/ProjectSettings/PresetManager.asset b/Outline.HDRP/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000..67a94da --- /dev/null +++ b/Outline.HDRP/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/Outline.HDRP/ProjectSettings/ProjectSettings.asset b/Outline.HDRP/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000..d8171fb --- /dev/null +++ b/Outline.HDRP/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,610 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 20 + productGUID: 7510e5ff91f1dd44e98faa701473f4c5 + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: DefaultCompany + productName: Outline.HDRP + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1024 + defaultScreenHeight: 768 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 0 + m_MTRendering: 1 + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + iosAllowHTTPDownload: 1 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 0 + androidBlitType: 0 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 0 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 0 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 1048576 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + m_SupportedAspectRatios: + 4:3: 1 + 5:4: 1 + 16:10: 1 + 16:9: 1 + Others: 1 + bundleVersion: 1.0 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + cardboard: + depthFormat: 0 + enableTransitionView: 0 + daydream: + depthFormat: 0 + useSustainedPerformanceMode: 0 + enableVideoLayer: 0 + useProtectedVideoMemory: 0 + minimumSupportedHeadTracking: 0 + maximumSupportedHeadTracking: 1 + hololens: + depthFormat: 1 + depthBufferSharingEnabled: 1 + lumin: + depthFormat: 0 + frameTiming: 2 + enableGLCache: 0 + glCacheMaxBlobSize: 524288 + glCacheMaxFileSize: 8388608 + oculus: + sharedDepthBuffer: 1 + dashSupport: 1 + lowOverheadMode: 0 + protectedContext: 0 + v2Signing: 1 + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 + useHDRDisplay: 0 + D3DHDRBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 0 + resolutionScalingMode: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 + applicationIdentifier: {} + buildNumber: {} + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 19 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 0 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSTargetOSVersionString: + tvOSSdkVersion: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + iPhoneSplashScreen: {fileID: 0} + iPhoneHighResSplashScreen: {fileID: 0} + iPhoneTallHighResSplashScreen: {fileID: 0} + iPhone47inSplashScreen: {fileID: 0} + iPhone55inPortraitSplashScreen: {fileID: 0} + iPhone55inLandscapeSplashScreen: {fileID: 0} + iPhone58inPortraitSplashScreen: {fileID: 0} + iPhone58inLandscapeSplashScreen: {fileID: 0} + iPadPortraitSplashScreen: {fileID: 0} + iPadHighResPortraitSplashScreen: {fileID: 0} + iPadLandscapeSplashScreen: {fileID: 0} + iPadHighResLandscapeSplashScreen: {fileID: 0} + iPhone65inPortraitSplashScreen: {fileID: 0} + iPhone65inLandscapeSplashScreen: {fileID: 0} + iPhone61inPortraitSplashScreen: {fileID: 0} + iPhone61inLandscapeSplashScreen: {fileID: 0} + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSUseLaunchScreenStoryboard: 0 + iOSLaunchScreenCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + clonedFromGUID: 00000000000000000000000000000000 + templatePackageId: + templateDefaultScene: + AndroidTargetArchitectures: 1 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: [] + m_BuildTargetBatching: [] + m_BuildTargetGraphicsJobs: [] + m_BuildTargetGraphicsJobMode: [] + m_BuildTargetGraphicsAPIs: [] + m_BuildTargetVRSettings: [] + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupLightmapSettings: [] + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchTouchScreenUsage: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchPlayerConnectionEnabled: 1 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 2 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 2 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 32 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 0 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLWasmStreaming: 0 + scriptingDefineSymbols: {} + platformArchitecture: {} + scriptingBackend: {} + il2cppCompilerConfiguration: {} + managedStrippingLevel: {} + incrementalIl2cppBuild: {} + allowUnsafeCode: 0 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 0 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: {} + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: Outline.HDRP + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: Outline.HDRP + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, + a: 1} + metroSplashScreenUseBackgroundColor: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + vrEditorSettings: + daydream: + daydreamIconForeground: {fileID: 0} + daydreamIconBackground: {fileID: 0} + cloudServicesEnabled: {} + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + apiCompatibilityLevel: 6 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + projectName: + organizationId: + cloudEnabled: 0 + enableNativePlatformBackendsForNewInputSystem: 0 + disableOldInputManagerSupport: 0 + legacyClampBlendShapeWeights: 0 diff --git a/Outline.HDRP/ProjectSettings/ProjectVersion.txt b/Outline.HDRP/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..e1506f9 --- /dev/null +++ b/Outline.HDRP/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 2019.3.1f1 +m_EditorVersionWithRevision: 2019.3.1f1 (89d6087839c2) diff --git a/Outline.HDRP/ProjectSettings/QualitySettings.asset b/Outline.HDRP/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000..d24eb10 --- /dev/null +++ b/Outline.HDRP/ProjectSettings/QualitySettings.asset @@ -0,0 +1,236 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 5 + m_QualitySettings: + - serializedVersion: 2 + name: Very Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 15 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 1 + textureQuality: 1 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.3 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.4 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 16 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 1 + lodBias: 0.7 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 64 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: High + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Very High + pixelLightCount: 3 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 70 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1.5 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 1024 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Ultra + pixelLightCount: 4 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 4 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 255 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 2 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + m_PerPlatformDefaultQuality: + Android: 2 + Lumin: 5 + Nintendo Switch: 5 + PS4: 5 + Stadia: 5 + Standalone: 5 + WebGL: 3 + Windows Store Apps: 5 + XboxOne: 5 + iPhone: 2 + tvOS: 2 diff --git a/Outline.HDRP/ProjectSettings/TagManager.asset b/Outline.HDRP/ProjectSettings/TagManager.asset new file mode 100644 index 0000000..1c92a78 --- /dev/null +++ b/Outline.HDRP/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/Outline.HDRP/ProjectSettings/TimeManager.asset b/Outline.HDRP/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000..558a017 --- /dev/null +++ b/Outline.HDRP/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/Outline.HDRP/ProjectSettings/UnityConnectSettings.asset b/Outline.HDRP/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000..fa0b146 --- /dev/null +++ b/Outline.HDRP/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/Outline.HDRP/ProjectSettings/VFXManager.asset b/Outline.HDRP/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..3a95c98 --- /dev/null +++ b/Outline.HDRP/ProjectSettings/VFXManager.asset @@ -0,0 +1,12 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 diff --git a/Outline.HDRP/ProjectSettings/XRSettings.asset b/Outline.HDRP/ProjectSettings/XRSettings.asset new file mode 100644 index 0000000..482590c --- /dev/null +++ b/Outline.HDRP/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file diff --git a/Outline.PostProcessing/ProjectSettings/AudioManager.asset b/Outline.PostProcessing/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000000000000000000000000000000000000..5c938375a642d9716bc3c5e35af7fdea906a824e GIT binary patch literal 4148 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 R_%QLYL6x|*7Su>G`yY_^n+gB` literal 0 HcmV?d00001 diff --git a/Outline.PostProcessing/ProjectSettings/NavMeshAreas.asset b/Outline.PostProcessing/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000000000000000000000000000000000000..6e823e5b74a5eae6beaefe4400392a45dc27650d GIT binary patch literal 4464 zcmeH~OHUI~6vxj%3%=hkKn0%*6NyELx{($d1)~Ik#JDn-_F4vKI!$NBs0%ahW$zMW z;zAcD@&ROPToX6OrEzEc0@nY39!;m;Kr;t!?>WCY_x7Csy^D@WenMn_L+~N850l8) zrNY(G@zFxzVL|@1S}nr>e9kAW*3A!})_&gq*7JLPTK7-9+&T|BkLNvn47(x{U`Z)7R$t)c*b8Mv?h_sr|Q+hoevKVn^=Jczc`YBk(092)bi-I#^&caIC3XIQ zPd-2hOY(ogCm$q)CHxP3@*zT4!uySgACGXz2f!|4;6J=e641}fI?n4_%uh1ENFLqW z5;)Ism^>g)pW_JmCVBcCPm#mOc|VhTdzvsH&!z6?8Rizr^QrrJmOLE!)crgc^EvhS zj&@h(o6f4Pc#GQe%zDig)zr$B_+be_S$Rt8%GOeGTu9}s$bUjtCXtB-ug07iPoz;r1>b|n3wPh`u&royXM10A#bjZELQI(3{RGyxYz>N^S*AdyK&C*ZK&C*ZK&C*ZK&HSy zsK5wn=KJnFWj#{Mmd1<7B;QZx9B-tP<-qt09a9kl7EJ!{^YF&tmyVzM?6)W~K7}dn bJyZZp@F{^(8jtemz literal 0 HcmV?d00001 diff --git a/Outline.PostProcessing/ProjectSettings/Physics2DSettings.asset b/Outline.PostProcessing/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000000000000000000000000000000000000..bf33cdadac8d9063e882cd6c049a18656560ab19 GIT binary patch literal 4448 zcmeH~O>h)N6vulKKZ#!`hzcSK3MvE=QBjcH&BldI1+ubhDpgt~liki{WHJ+HW=Zy7 z)p&riN~&b&$sM7fV&vZ{F9Xxx%z1Qz` zzt_{56{7F55NnSM{3pb1_!44p&%nO^z5N3NQv>3k#l=O-0=$Eo#l^mbOB35(zfu`J zdnr8d>cox_(1mM+z$cL>g@`d_F&V@{Son9gSHz!MBBl*prOgt*fZvYs4QM@RLTrJq zN1TC=O&HO>mpI2aV?>_DqrC;K5c|+>Lc11?LO;L357$TA>k<|xydQDv7&Gqm8MhMq z7cr(ibrkxipI6W)zmX6^&UKzfpL`7=MDzF2C+{PKXug0xIoC?j{2TPiZzhCj{wwwzz@ey~DizWWC;v0yIDQBL)0O$JeB3Jh0KPrB=!T(VF9)tJbK+(@e zgRfVd=PU1jm*V#td_?ih26q&{&)}yN-(v6&6~Eu$Un%~8!GBhKtHG}*zRlnp@St$N z4;p+>@rN>QC3P7CN9x4(gtMRW@R6 zt><^e`wjlL;=2vL4oTp?_K+7-KW9+r?cn%`ft>v~_D}xFD0CUs(r>5*5Gx#yZ z_ZqyR_~Qm2SNw^LTY_;Xz!?|!C1S3O%lj6uH!y!a2241cX0S1tcK;3-EkugK`M?btHbEj>}Wdaj7!&V!c`R$ z?a1*xy07`6!~Qa;EgRE;45xj!1;Zou{HWteJ1F}>Ae)?%(vsKixGQlZu)WYt;?!rQ zR4$JB(K0k-cV^ml5XpMeb|oBUpyABOv8n3Jtlf;XlC0s^T`6Z_nl2|9HGCI)@|yIZ z*0X}E6qS81g3Ga~sZd5jC3D1|9Ggv2GRTxI4MiuEN03-2LMrSQYC-}Zp%X^ZYj*2? zz)E3K)k9uq{dCJns|;&0fG4Pq$~hHwiIsiVby{@A<>a`F99LYsZJ;5))vfqJGv~J6 z^_s&@*bHPOE6#k>LAA1&RMNTQb^K1aLS1pZ)=@-~VYFfi&(F4SxEg`eZcCKgSYQ=Z z^;&h`JxOI4irb|mlsb`LcV=)t)p>oc zgNH_jhn+}mkI#UD^#}*C>Z!s6)Rb-4owS=L!Z8ntwkMM#dQ2uq0Obqu5M(AWPr@PZ z$=RRsgBkiLxpQ_mtWWzm14+pf&-t-F(0QiQ4hMN$Dh&;BU1?EDLEz8n{A%x|Ir{{T zmFov05N$Cj>|{b3x)k!^Nwsv7(ySbuw1gQXj+_2o?$@`>Q@U%X;N;=*^|j`H;nuWlFdn)X>a9T)lPS6K7YR=!FW)wgJ2 zz~4&zzNi}Ct=Y(Q+!jPcIfYYUhEiVAPO(O0-|zF5eQKRWHHWBGZL=c&t^5!!$8PD7I6yX^DL!&`3csy_QZf~6NYTWE748e1Y$XmTa>xacP(IswQ&>qZ_~Hi|u*L#L6CAs#mRlZ2W)AsM6#aL!2~TAnm>vM4ztO%79% zlu}Ie2J$XA1)(WPnf?ND_O~0R4bR{%CDiQgX!4}2fS;n~xt)mi+*HfEc!pZy{B+B^ zy2*{FWeYp`F4ok^@`Tat8a3zlA~xRDGT;1?OWb4c|D#(!`(fm_h@8*63=qP2pL@hd zIQbx)rtnJY|D(f@VcPKDIt({>{w$~k;f8+e;hXpgn?Ypo{>CoS5g rEGF6vFQVD6Nt^!#Te+`Oz$xGqa0)mDoB~b(r+`zyDc}_N-wJ#KK|Z5$ literal 0 HcmV?d00001 diff --git a/Outline.PostProcessing/ProjectSettings/ProjectSettings.asset b/Outline.PostProcessing/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000..c7ccd06 --- /dev/null +++ b/Outline.PostProcessing/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,607 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 18 + productGUID: 80c46c34b35de234b8ff59cb435fdc78 + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: DefaultCompany + productName: Outline.PostProcessing + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1024 + defaultScreenHeight: 768 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 0 + m_MTRendering: 1 + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + displayResolutionDialog: 1 + iosUseCustomAppBackgroundBehavior: 0 + iosAllowHTTPDownload: 1 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 0 + androidBlitType: 0 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 0 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 0 + graphicsJobs: 0 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + graphicsJobMode: 0 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 1048576 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + vulkanEnableSetSRGBWrite: 0 + m_SupportedAspectRatios: + 4:3: 1 + 5:4: 1 + 16:10: 1 + 16:9: 1 + Others: 1 + bundleVersion: 1.0 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 0 + xboxOneEnable7thCore: 1 + isWsaHolographicRemotingEnabled: 0 + vrSettings: + cardboard: + depthFormat: 0 + enableTransitionView: 0 + daydream: + depthFormat: 0 + useSustainedPerformanceMode: 0 + enableVideoLayer: 0 + useProtectedVideoMemory: 0 + minimumSupportedHeadTracking: 0 + maximumSupportedHeadTracking: 1 + hololens: + depthFormat: 1 + depthBufferSharingEnabled: 1 + oculus: + sharedDepthBuffer: 1 + dashSupport: 1 + lowOverheadMode: 0 + protectedContext: 0 + v2Signing: 0 + enable360StereoCapture: 0 + protectGraphicsMemory: 0 + enableFrameTimingStats: 0 + useHDRDisplay: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 + applicationIdentifier: {} + buildNumber: {} + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 16 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 0 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSTargetOSVersionString: 9.0 + tvOSSdkVersion: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 9.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + iPhoneSplashScreen: {fileID: 0} + iPhoneHighResSplashScreen: {fileID: 0} + iPhoneTallHighResSplashScreen: {fileID: 0} + iPhone47inSplashScreen: {fileID: 0} + iPhone55inPortraitSplashScreen: {fileID: 0} + iPhone55inLandscapeSplashScreen: {fileID: 0} + iPhone58inPortraitSplashScreen: {fileID: 0} + iPhone58inLandscapeSplashScreen: {fileID: 0} + iPadPortraitSplashScreen: {fileID: 0} + iPadHighResPortraitSplashScreen: {fileID: 0} + iPadLandscapeSplashScreen: {fileID: 0} + iPadHighResLandscapeSplashScreen: {fileID: 0} + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSUseLaunchScreenStoryboard: 0 + iOSLaunchScreenCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + clonedFromGUID: 00000000000000000000000000000000 + templatePackageId: + templateDefaultScene: + AndroidTargetArchitectures: 1 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + resolutionDialogBanner: {fileID: 0} + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: [] + m_BuildTargetBatching: [] + m_BuildTargetGraphicsAPIs: [] + m_BuildTargetVRSettings: [] + m_BuildTargetEnableVuforiaSettings: [] + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupLightmapSettings: [] + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchTouchScreenUsage: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 6 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchPlayerConnectionEnabled: 1 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 2 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 2 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + spritePackerPolicy: + webGLMemorySize: 256 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 1 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + scriptingDefineSymbols: + 1: UNITY_POST_PROCESSING_STACK_V2 + 7: UNITY_POST_PROCESSING_STACK_V2 + 13: UNITY_POST_PROCESSING_STACK_V2 + 19: UNITY_POST_PROCESSING_STACK_V2 + 21: UNITY_POST_PROCESSING_STACK_V2 + 25: UNITY_POST_PROCESSING_STACK_V2 + 26: UNITY_POST_PROCESSING_STACK_V2 + 27: UNITY_POST_PROCESSING_STACK_V2 + 28: UNITY_POST_PROCESSING_STACK_V2 + platformArchitecture: {} + scriptingBackend: {} + il2cppCompilerConfiguration: {} + managedStrippingLevel: {} + incrementalIl2cppBuild: {} + allowUnsafeCode: 0 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + apiCompatibilityLevelPerPlatform: {} + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: Outline.PostProcessing + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: Outline.PostProcessing + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, + a: 1} + metroSplashScreenUseBackgroundColor: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + metroCompilationOverrides: 1 + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + xboxOneScriptCompiler: 0 + XboxOneOverrideIdentityName: + vrEditorSettings: + daydream: + daydreamIconForeground: {fileID: 0} + daydreamIconBackground: {fileID: 0} + cloudServicesEnabled: {} + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_PrivateKeyPath: + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + facebookSdkVersion: + facebookAppId: + facebookCookies: 1 + facebookLogging: 1 + facebookStatus: 1 + facebookXfbml: 0 + facebookFrictionlessRequests: 1 + apiCompatibilityLevel: 6 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + projectName: + organizationId: + cloudEnabled: 0 + enableNativePlatformBackendsForNewInputSystem: 0 + disableOldInputManagerSupport: 0 + legacyClampBlendShapeWeights: 0 diff --git a/Outline.PostProcessing/ProjectSettings/ProjectVersion.txt b/Outline.PostProcessing/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..31a1862 --- /dev/null +++ b/Outline.PostProcessing/ProjectSettings/ProjectVersion.txt @@ -0,0 +1 @@ +m_EditorVersion: 2018.4.11f1 diff --git a/Outline.PostProcessing/ProjectSettings/QualitySettings.asset b/Outline.PostProcessing/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000000000000000000000000000000000000..b999b0df2b898b86de14341b18a300465d541eb2 GIT binary patch literal 5100 zcmeI0OKjXk7{|X&(kD+wy+3O%rILG;AJ9TWQm5vuy(hs3z;##Kmhbwl~@I zv~VgCNL)A+BpwGilv@!(LL7SFg47RAoR%G)v5xG<34qQa`?d?CXdvJGuf3;u!T3TAl^if^$_T$UXe9yM%pjZLYJke(h|wx@AF=1UCc?V50I|noRgnm%Mr?4=Rdm}&F(T6P2(E~n!`Wa)t7UkGapB#bh2&(k6uFcn^ z{I3Vk73hC$%KrxPD6f^{@JRoxZ*23v$o??u)N>0mQw}xGcN%5#TM3a8ei~)++X#^o zUPqaH6CqN<-$a@Gc0wfbPeoeqp-dj%$qxV6aNOi5CH7w#epeU&4e|LNb!yxk@jU#m ziTwYFI{n|B;XfOGPlo?u_?9-0N1W^7eZzNk zagO^LIDYa_hJS1L!{mjI|EtE&BVG3N|EJ-PX85+ASm$FIe$ep8GyGMoBz4*+6QiM;pGc-Ow}uWKGg_aaB!A-EL~9XwS}tqh7-eC74r|w-A`?lny+n5!#+> zK*{&c=t>tDRY65rI_WTG2cdE++L#~H$}c&})sxj~pcC(=&%SaUGccBh4aTe~i*nYq z)Ku{LglB1)akOhqYibQ7)XlKr>twRZwF58oy}DgF5w`@Q+|V9&Y!x6r5_r|Hr2NpX zI24Q8DLt!06-~w0$_ee7p3+q(o*m{n1G^d9ab`T_Tfw-h=urgBS0yj7qh9mnMYj@1 z&GD=e3?wzxv}=u8adNDv=d~k22-h`?KVjEvsvZm@bn^&K7F*V^CcP=}CYL45EJ~}z2-)QIn(XE?EO{v9- z3PLls3NYc5b;ncI2}G;x*tpSMaHLVKYQJosO;HF7uqv=J<96}ei>h3~8g^&Lu?DTN z(ow`X^nB6Hiqo*Pbwc@=F_uqQ_52!FI9w&wF^NjlgOI{%;ZBJ2T&p`ObSv`-}Oax6nNY{@;uL_tl5-&|diB!iAx?&z(DT<#KW8 z_v_b(Xxp*r?kV!Y`SVe`aWE!$PR1{K`QY;=%Y0Xj{kL915l_M*83|qfKUq;jB{BHD{A1_%V}UdCbVTYYU#Ok=K1eB;yJ})SRNP{h~~FkEDC5}P6uOj1ka>wV@}3r zStLIq%iIsz#O+C30dh#}B5{nD(?G_4+55q79?`m>5R`d;Xvf?c>zxrW8SgAEi0n6#&_a1&b8g?z;v#rR6 z+KLT4kK@WRzs(%8T|ApwUcS6whn2aAGk&G=U{t1`GTvz{<#?`+`?2q|o;i&7MHZAK?eA?Dz<6 z{Rb^gWW8q=2y3WqoV&R@bI;tld*;kGmni&AH1$eE(>(G(w6U)5q&8E!Ueu}Wd0r^Q z;0abd@A>I5-u!C6loHFITOX_0rOr|q%WT_3E^qN<;1Y%Sd5e%6X8<@#k;KCxoo8_1 za(@f?5qf8Ah4*Nj8exY4KVs~*laDpOjuxmBMQ$4T(LkLTaOqJx<(;U5c&LZ_JfQ&i z4D&dM=LqnY&!?Z~C~&slJaO(pJjalmMt+dzIB@Afo)bOX=efW!cuw*-h^M^Cmd~f3 zCttEO@Lc0rSI-%sF7h?0^Dc*|Kik8j0iEX<_xZ;HI?n@_9t-H4=;0bQ`5yN;*4S|l z7`~fh28VJ^vLsRc#}ACK?4%a~NPlzkMkjZqJC&!(U|i^+(q2-@ClK GpZx(xLaQVI literal 0 HcmV?d00001 diff --git a/Outline.PostProcessing/ProjectSettings/TimeManager.asset b/Outline.PostProcessing/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000000000000000000000000000000000000..5ea094c7c23af5b160dd15643b236d348207805c GIT binary patch literal 4116 zcmZQzV02_)5D;NtU=Re-K#GCE$iUD-&qUAAFwKzR-~a#r85x0stRR{H|8GAkpSDat zDk6sQ_!YVC7x&nJqESE$QUU_z3=9n*!(f0BD6@>2p*h(nLs)uGdI;YF)uMawTQtj zvm!M`0VGmfl3Kvvn^=*VTbirjn3I!Vjx3QI4^k7HoS2geR}_#~RFavTlZwy|ay`Tk zUbXn_kCXp;lAZ%wHy*?frSboWZBNHA!|prgE*S}6IAqcG?bJ; z3x5CwH4;JyQBXnnzM0s{u!fo9rlkZ=j13ivMe9CfMq=PP9<#fm`d0v*z zOG`RKfQ-{-$rZ%j0jFPru`r%|g=&kG32n_UL1!~u>QhTPGKwYH2kn#3R z{YB);O#Q_3xK0`)6my;_SGV+=2 z8}`N6-<8z2*{7t=!+p4%=PDRW7XL)GMOG8q9dJvYqDkW!Sp)0k&Cp*3 z?13Mq<4x~Y+{`@PM6X6LsoRXd3@O!TGRLN?r<|l;K}~ifbefOSz)kvuIdtGOp*kK;q)wc+TUunq zGs2?eqBHGZ_AvHH=*3as<-Trk?LBnOj~h`u?S!sBb1h7*$}ejc{$m}KK?VjH7-V3O zfk6fa85m^Xf6M^y=~HRiN>0^kPAjOkU8m|cqqbLV^Co!MtGdy2?Locf^V*jPe>Y_D suGji!?DqaxbvZ1SXI}XGCDU!;rgcD%H&dU%DB16B?e#9V+A%(V1AVHZ2><{9 literal 0 HcmV?d00001 diff --git a/Outline.PostProcessing/ProjectSettings/VFXManager.asset b/Outline.PostProcessing/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000000000000000000000000000000000000..4951a05672f8ae045346f5173b15b98956c51138 GIT binary patch literal 4148 zcmeH_O-chn5QVEv;{PuQE?l^9A2Je%LJVR=6colpgF6{bCmAu5VbX%)W|j$FKwJoJ zJb)MQ0(u4Ay7UB&uX-dxasW47P)yaAsyE#)Lp0PSn#~f?9G-X(tz@j#bT(~SHH*HZ zC=vp2JoS;IC|Wp7KHS|F=D$8G?b6F~geAI1@(4$cD8x#nn~=Gnrv!!1g2E&q&&4Td z0`(Gd5;=tA5UAdvkwMM#3C%*y)6iK%Kl=L{B*9~yO)%C;AvyYWhBX`18R_v@=LkLP z@H;sAb;dLs)EVz_K|46-DSGyS?}%fvj<8U1GUs=Q4dw}b-$m^3eW#e~Owa*l&yn0u z_qd=(up9I|KZE38ADG{wW*+~OM3wF1eaCa^G9cSlLB7~(`j<+U8%|XQ1!|t`dQ~@& zXDTKD+wO(j-9lkIs-cTw%fH^dtkq=D8!ESgzm1agAZEM1EK8+auioZWEp;WUhi+4r zmGsf?J6BusLOG1|E#tfL`8oI_G+`Vt4j2cF1I7X4fN{V$U>q> zE+H;U1%8CsT)|aL>>1y`d*ANy@uhL`@7mg$=KC?h|OAhqAHYMpvRu-AyPoSC?aGuI~8;59wZ@ zeTQ`~EV$8KMw`0%dbzq6qmSn5USjZ&?xosySeF`DaulQcHrixdbDFEW#bC|L>wI~^ z2iN%u9b;Jc%7Po+_tB>ARVXx9_iBTObgwD+pzgIg#<1>n1vk29(5CM7C^T1htHDFM z+X_CY%k($vxj~fk>c)Z_-7nFm?sgQKtGmPCA>Ew?AJn}`#~8lfn+tAqzeSt6x1i8m z-CGSF(&h6Sjg`rudK(v9%J~N-bD_h zF7xdL`16^#n-J!S(ShfBw`P6K%j@Ei7|W#d1r>2@9eBdp*n*8iZxU$y*@!(X$!QgEaD zy5*Ca8(p5;?^!-o;>@eh!MTsq8m#&6U>;sjJdv<9QD9|J1u$=F-{FuQ7-(&fl!}nWW zD{=VrkAXv89C!F>%entF>eBxW%j*Ug{2j|5bNGjrpK$mWmd`uGfn4e{KHIoj zJ}R)+{RuepeRLW{i0$Yb6CZ)^2WOlB#Vhd#E$=$~faRgX4_Y1-d{oD;SRRAZc)!%G zS^gqnh1}Em`4qSZl#s)6-m{z^#vX2JEjz9DWK>qD1@q?M`-729X{crZa&|6zY?~ zvRqAP!)DNHsg{`={p*PeBHUPkN_TNeCcX@_=_s(X)VCEUex_2)NcMuPCNl-60FkD9 zX%=-)s1U1E_hS|KA%zzb8KyBN5jI!nqa@QyHH;@${8X%nRq-;$*x)7>_J9kwj%!f^ zE9!PG_@&JmXml63gRKRbv{l9#!BglP6QzR-%_;n)w#jlc=Glq7__UFq?j^{s6HNnO#S#CwQr< zO!|S@@tTZ@re)g9_bgflOhue98~093`I$)`O;soxftst=Pw7a0)=^1Krl)73WHN|5 za*A?h?@hW*_OORC^P5 zi3b`JXiWwU)r#hqW!CJ>hD%W@Tp}=CC7Mxyv`Iu;G=vmgKb-5~2kQboxl(GFdreQK z%E-@#nF>>;lwAgP;c<(S1=WpJBD0=;c;}+_;~g9g`UILyv3N0_fR;Yy%#S_0_VVDf zR;mhdX-;uXR2ub?rb_SWh0tDXnDcE>tzemqAIGxf-(Gop{hP@2SB$&%rH}b`G<|HF zZ_M@f`nQu|eD~1u`1+lOHvfkwrMkCk-DgXwext4D<3~zuGs6At OAIj(C_ISCicl-yxH{+N9 literal 0 HcmV?d00001 From fc5b04e38e1f62e20d4ad69c8f000625f5f6af23 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Fri, 3 Apr 2020 12:43:10 +0300 Subject: [PATCH 35/39] Added HDRP sample --- Outline.HDRP/Assets/Example.meta | 8 + .../Example/OutlineLayerCollection.asset | 33 + .../Example/OutlineLayerCollection.asset.meta | 8 + Outline.HDRP/Assets/Example/OutlineTest.cs | 31 + .../Assets/Example/OutlineTest.cs.meta | 11 + Outline.HDRP/Assets/Example/Test.unity | 633 ++++++++++++++++++ Outline.HDRP/Assets/Example/Test.unity.meta | 7 + Outline.HDRP/Assets/HDRPDefaultResources.meta | 8 + .../DefaultSceneRoot.prefab | 494 ++++++++++++++ .../DefaultSceneRoot.prefab.meta | 7 + .../Foliage Diffusion Profile.asset | 26 + .../Foliage Diffusion Profile.asset.meta | 8 + .../HDRenderPipelineAsset.asset | 350 ++++++++++ .../HDRenderPipelineAsset.asset.meta | 8 + .../Scene PostProcess Profile.asset | 110 +++ .../Scene PostProcess Profile.asset.meta | 8 + .../Skin Diffusion Profile.asset | 26 + .../Skin Diffusion Profile.asset.meta | 8 + .../Sky and Fog Settings Profile.asset | 162 +++++ .../Sky and Fog Settings Profile.asset.meta | 8 + .../Runtime/Scripts/Outline.cs | 7 +- .../ProjectSettings/GraphicsSettings.asset | 7 +- .../ProjectSettings/HDRPProjectSettings.asset | 3 +- .../ProjectSettings/ProjectSettings.asset | 18 +- 24 files changed, 1979 insertions(+), 10 deletions(-) create mode 100644 Outline.HDRP/Assets/Example.meta create mode 100644 Outline.HDRP/Assets/Example/OutlineLayerCollection.asset create mode 100644 Outline.HDRP/Assets/Example/OutlineLayerCollection.asset.meta create mode 100644 Outline.HDRP/Assets/Example/OutlineTest.cs create mode 100644 Outline.HDRP/Assets/Example/OutlineTest.cs.meta create mode 100644 Outline.HDRP/Assets/Example/Test.unity create mode 100644 Outline.HDRP/Assets/Example/Test.unity.meta create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources.meta create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources/DefaultSceneRoot.prefab create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources/DefaultSceneRoot.prefab.meta create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources/Foliage Diffusion Profile.asset create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources/Foliage Diffusion Profile.asset.meta create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources/HDRenderPipelineAsset.asset create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources/HDRenderPipelineAsset.asset.meta create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources/Scene PostProcess Profile.asset create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources/Scene PostProcess Profile.asset.meta create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources/Skin Diffusion Profile.asset create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources/Skin Diffusion Profile.asset.meta create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources/Sky and Fog Settings Profile.asset create mode 100644 Outline.HDRP/Assets/HDRPDefaultResources/Sky and Fog Settings Profile.asset.meta diff --git a/Outline.HDRP/Assets/Example.meta b/Outline.HDRP/Assets/Example.meta new file mode 100644 index 0000000..192853a --- /dev/null +++ b/Outline.HDRP/Assets/Example.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e3460f9c82b74f04094738b4630a3156 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.HDRP/Assets/Example/OutlineLayerCollection.asset b/Outline.HDRP/Assets/Example/OutlineLayerCollection.asset new file mode 100644 index 0000000..c96e20d --- /dev/null +++ b/Outline.HDRP/Assets/Example/OutlineLayerCollection.asset @@ -0,0 +1,33 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 57d0c11168277cf4eb3b4b89706e6aa5, type: 3} + m_Name: OutlineLayerCollection + m_EditorClassIdentifier: + _layers: + - _settings: + _outlineSettings: {fileID: 0} + _outlineColor: {r: 1, g: 0, b: 0, a: 1} + _outlineWidth: 4 + _outlineIntensity: 2 + _outlineMode: 0 + _name: + _zOrder: 0 + _enabled: 1 + - _settings: + _outlineSettings: {fileID: 0} + _outlineColor: {r: 0, g: 1, b: 0.060156345, a: 1} + _outlineWidth: 7 + _outlineIntensity: 2 + _outlineMode: 1 + _name: + _zOrder: 0 + _enabled: 1 diff --git a/Outline.HDRP/Assets/Example/OutlineLayerCollection.asset.meta b/Outline.HDRP/Assets/Example/OutlineLayerCollection.asset.meta new file mode 100644 index 0000000..699e31e --- /dev/null +++ b/Outline.HDRP/Assets/Example/OutlineLayerCollection.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65159dc68f867cd4f90261bae63e29a7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.HDRP/Assets/Example/OutlineTest.cs b/Outline.HDRP/Assets/Example/OutlineTest.cs new file mode 100644 index 0000000..0253a66 --- /dev/null +++ b/Outline.HDRP/Assets/Example/OutlineTest.cs @@ -0,0 +1,31 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityFx.Outline; + +public class OutlineTest : MonoBehaviour +{ +#pragma warning disable 0649 + + [SerializeField] + private GameObject[] _layer0; + [SerializeField] + private GameObject[] _layer1; + [SerializeField] + private OutlineLayerCollection _layers; + +#pragma warning restore 0649 + + void Start() + { + foreach (var go in _layer0) + { + _layers[0].Add(go); + } + + foreach (var go in _layer1) + { + _layers[1].Add(go); + } + } +} diff --git a/Outline.HDRP/Assets/Example/OutlineTest.cs.meta b/Outline.HDRP/Assets/Example/OutlineTest.cs.meta new file mode 100644 index 0000000..426a24e --- /dev/null +++ b/Outline.HDRP/Assets/Example/OutlineTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 22d06c15672ad2440afbe792e641c411 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.HDRP/Assets/Example/Test.unity b/Outline.HDRP/Assets/Example/Test.unity new file mode 100644 index 0000000..4d65fc6 --- /dev/null +++ b/Outline.HDRP/Assets/Example/Test.unity @@ -0,0 +1,633 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &646807773 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 646807774} + - component: {fileID: 646807777} + - component: {fileID: 646807776} + - component: {fileID: 646807775} + m_Layer: 0 + m_Name: Cylinder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &646807774 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 646807773} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.52, y: -0.31, z: 4.31} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1130691891} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!136 &646807775 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 646807773} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &646807776 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 646807773} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &646807777 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 646807773} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &750107942 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 750107943} + - component: {fileID: 750107946} + - component: {fileID: 750107945} + - component: {fileID: 750107944} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &750107943 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 750107942} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.5699999, y: -0.30999994, z: 6.1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1130691891} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &750107944 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 750107942} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &750107945 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 750107942} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &750107946 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 750107942} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1001 &1130691890 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 4264326293830219037, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_LocalPosition.x + value: -2.4961035 + objectReference: {fileID: 0} + - target: {fileID: 4264326293830219037, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_LocalPosition.y + value: 3.0931349 + objectReference: {fileID: 0} + - target: {fileID: 4264326293830219037, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_LocalPosition.z + value: -3.8995318 + objectReference: {fileID: 0} + - target: {fileID: 4264326293830219037, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4264326293830219037, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4264326293830219037, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4264326293830219037, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4264326293830219037, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4264326293830219037, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4264326293830219037, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4264326293830219037, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4819242101474771701, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_AllowDynamicResolution + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4893056312182120781, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_Name + value: DefaultSceneRoot + objectReference: {fileID: 0} + - target: {fileID: 4949957087466332343, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_Version + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 4949957087466332343, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_RenderingPathCustomFrameSettings.bitDatas.data1 + value: 734440390720 + objectReference: {fileID: 0} + - target: {fileID: 5131575625094108011, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_Version + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 5131575625094108011, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_MinFilterSize + value: 0.01 + objectReference: {fileID: 0} + - target: {fileID: 5131575625094108011, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: m_ShadowResolution.m_Level + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8708978604625570628, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + propertyPath: sharedProfile + value: + objectReference: {fileID: 11400000, guid: aab0876a9ec74194fb766183257d02c9, + type: 2} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: de1884a706667b84cbf9c4195ee402ca, type: 3} +--- !u!4 &1130691891 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4958332782299279292, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + m_PrefabInstance: {fileID: 1130691890} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1130691892 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 4613009710449648096, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} + m_PrefabInstance: {fileID: 1130691890} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1130691893 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1130691892} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 22d06c15672ad2440afbe792e641c411, type: 3} + m_Name: + m_EditorClassIdentifier: + _layer0: + - {fileID: 1202059779} + - {fileID: 1822928728} + _layer1: + - {fileID: 646807773} + - {fileID: 750107942} + _layers: {fileID: 11400000, guid: 65159dc68f867cd4f90261bae63e29a7, type: 2} +--- !u!1 &1202059779 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1202059780} + - component: {fileID: 1202059783} + - component: {fileID: 1202059782} + - component: {fileID: 1202059781} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1202059780 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1202059779} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2.28, y: -0.30999994, z: 5.32} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1130691891} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1202059781 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1202059779} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1202059782 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1202059779} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1202059783 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1202059779} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1822928728 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1822928729} + - component: {fileID: 1822928732} + - component: {fileID: 1822928731} + - component: {fileID: 1822928730} + m_Layer: 0 + m_Name: Capsule + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1822928729 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1822928728} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.7100003, y: -0.30999994, z: 4.7999997} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1130691891} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!136 &1822928730 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1822928728} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1822928731 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1822928728} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1822928732 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1822928728} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Outline.HDRP/Assets/Example/Test.unity.meta b/Outline.HDRP/Assets/Example/Test.unity.meta new file mode 100644 index 0000000..3853e3d --- /dev/null +++ b/Outline.HDRP/Assets/Example/Test.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4e135944522226a4f865fc46db4f82b9 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.HDRP/Assets/HDRPDefaultResources.meta b/Outline.HDRP/Assets/HDRPDefaultResources.meta new file mode 100644 index 0000000..4e90464 --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8f3d33c32408aac48b821ee51ce221cd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.HDRP/Assets/HDRPDefaultResources/DefaultSceneRoot.prefab b/Outline.HDRP/Assets/HDRPDefaultResources/DefaultSceneRoot.prefab new file mode 100644 index 0000000..7c473fc --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources/DefaultSceneRoot.prefab @@ -0,0 +1,494 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1727821257471780564 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 78747437022727650} + - component: {fileID: 3939057304150759544} + m_Layer: 0 + m_Name: Sky and Fog Volume + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &78747437022727650 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1727821257471780564} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.4211643, y: -3.172676, z: 9.714802} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4264326293830219037} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3939057304150759544 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1727821257471780564} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} + m_Name: + m_EditorClassIdentifier: + isGlobal: 1 + priority: 0 + blendDistance: 0 + weight: 1 + sharedProfile: {fileID: 11400000, guid: a817123acc6c86946bd0d80b00908e31, type: 2} +--- !u!1 &2131112742624884157 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6534824466647122371} + - component: {fileID: 4089861365231966854} + - component: {fileID: 5131575625094108011} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6534824466647122371 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2131112742624884157} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 2.4961035, y: -0.09313488, z: 3.8995318} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4264326293830219037} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!108 &4089861365231966854 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2131112742624884157} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 10000 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 2 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 5500 + m_UseColorTemperature: 1 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!114 &5131575625094108011 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2131112742624884157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7a68c43fe1f2a47cfa234b5eeaa98012, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 5 + directionalIntensity: 3.1415927 + punctualIntensity: 600 + areaIntensity: 200 + lightLayers: 1 + m_Intensity: 10000 + m_EnableSpotReflector: 0 + m_LuxAtDistance: 1 + m_InnerSpotPercent: 0 + m_LightDimmer: 1 + m_VolumetricDimmer: 1 + m_LightUnit: 2 + m_FadeDistance: 10000 + m_AffectDiffuse: 1 + m_AffectSpecular: 1 + m_NonLightmappedOnly: 0 + m_LightTypeExtent: 0 + m_SpotLightShape: 0 + m_ShapeWidth: 0.5 + m_ShapeHeight: 0.5 + m_AspectRatio: 1 + m_ShapeRadius: 0 + m_UseCustomSpotLightShadowCone: 0 + m_CustomSpotLightShadowCone: 30 + m_MaxSmoothness: 0.99 + m_ApplyRangeAttenuation: 1 + m_DisplayAreaLightEmissiveMesh: 0 + m_AreaLightCookie: {fileID: 0} + m_AreaLightShadowCone: 120 + m_UseScreenSpaceShadows: 0 + m_InteractsWithSky: 1 + m_AngularDiameter: 0 + m_Distance: 150000000 + m_EvsmExponent: 15 + m_EvsmLightLeakBias: 0 + m_EvsmVarianceBias: 0.00001 + m_EvsmBlurPasses: 0 + m_LightlayersMask: 1 + m_LinkShadowLayers: 1 + m_ShadowNearPlane: 0.1 + m_ShadowSoftness: 0.5 + m_BlockerSampleCount: 24 + m_FilterSampleCount: 16 + m_MinFilterSize: 0.00001 + m_KernelSize: 5 + m_LightAngle: 1 + m_MaxDepthBias: 0.001 + m_ShadowResolutionTier: 1 + m_UseShadowQualitySettings: 0 + m_CustomShadowResolution: 512 + m_ShadowDimmer: 1 + m_VolumetricShadowDimmer: 1 + m_ShadowFadeDistance: 10000 + m_ContactShadows: 0 + m_ShadowTint: {r: 0, g: 0, b: 0, a: 1} + m_NormalBias: 0.75 + m_ConstantBias: 0.15 + m_ShadowUpdateMode: 0 + m_ShadowCascadeRatios: + - 0.05 + - 0.2 + - 0.3 + m_ShadowCascadeBorders: + - 0.2 + - 0.2 + - 0.2 + - 0.2 + m_ShadowAlgorithm: 0 + m_ShadowVariant: 0 + m_ShadowPrecision: 0 + useOldInspector: 0 + useVolumetric: 1 + featuresFoldout: 1 + showAdditionalSettings: 0 +--- !u!1 &4385301687372491650 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1779374894981780732} + - component: {fileID: 8708978604625570628} + m_Layer: 0 + m_Name: Scene PostProcess + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1779374894981780732 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4385301687372491650} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.4158418, y: 7.2329626, z: 6.6463027} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4264326293830219037} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8708978604625570628 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4385301687372491650} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} + m_Name: + m_EditorClassIdentifier: + isGlobal: 1 + priority: 0 + blendDistance: 0 + weight: 1 + sharedProfile: {fileID: 11400000, guid: afc2e9b608c304f468d0c1818eba58d5, type: 2} +--- !u!1 &4613009710449648096 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4958332782299279292} + - component: {fileID: 4819242101474771701} + - component: {fileID: 5890402723748121877} + - component: {fileID: 4949957087466332343} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4958332782299279292 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4613009710449648096} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2.4961035, y: -2.0931349, z: -6.100468} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4264326293830219037} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &4819242101474771701 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4613009710449648096} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!81 &5890402723748121877 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4613009710449648096} + m_Enabled: 1 +--- !u!114 &4949957087466332343 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4613009710449648096} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 23c1ce4fb46143f46bc5cb5224c934f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 6 + m_ObsoleteRenderingPath: 0 + m_ObsoleteFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 + clearColorMode: 0 + backgroundColorHDR: {r: 0.025, g: 0.07, b: 0.19, a: 0} + clearDepth: 1 + volumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + volumeAnchorOverride: {fileID: 0} + antialiasing: 0 + SMAAQuality: 2 + dithering: 0 + stopNaNs: 0 + physicalParameters: + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + flipYMode: 0 + fullscreenPassthrough: 0 + allowDynamicResolution: 0 + customRenderingSettings: 0 + invertFaceCulling: 0 + probeLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPathCustomFrameSettings: + bitDatas: + data1: 184684576768 + data2: 536805376 + lodBias: 1 + lodBiasMode: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + renderingPathCustomFrameSettingsOverrideMask: + mask: + data1: 0 + data2: 0 + defaultFrameSettings: 0 +--- !u!1 &4893056312182120781 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4264326293830219037} + m_Layer: 0 + m_Name: DefaultSceneRoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4264326293830219037 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4893056312182120781} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2.4961035, y: 3.0931349, z: -3.8995318} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4958332782299279292} + - {fileID: 6534824466647122371} + - {fileID: 78747437022727650} + - {fileID: 1779374894981780732} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Outline.HDRP/Assets/HDRPDefaultResources/DefaultSceneRoot.prefab.meta b/Outline.HDRP/Assets/HDRPDefaultResources/DefaultSceneRoot.prefab.meta new file mode 100644 index 0000000..a4ef7ab --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources/DefaultSceneRoot.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: de1884a706667b84cbf9c4195ee402ca +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.HDRP/Assets/HDRPDefaultResources/Foliage Diffusion Profile.asset b/Outline.HDRP/Assets/HDRPDefaultResources/Foliage Diffusion Profile.asset new file mode 100644 index 0000000..1e0cf48 --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources/Foliage Diffusion Profile.asset @@ -0,0 +1,26 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b2686e09ec7aef44bad2843e4416f057, type: 3} + m_Name: Foliage Diffusion Profile + m_EditorClassIdentifier: + profile: + name: Foliage + scatteringDistance: {r: 0.7568628, g: 0.7019608, b: 0.24313727, a: 1} + transmissionTint: {r: 1, g: 1, b: 1, a: 1} + texturingMode: 0 + transmissionMode: 1 + thicknessRemap: {x: 0, y: 0.2873168} + worldScale: 1 + ior: 1.4 + hash: 1081692787 + m_Version: 1 + profiles: [] diff --git a/Outline.HDRP/Assets/HDRPDefaultResources/Foliage Diffusion Profile.asset.meta b/Outline.HDRP/Assets/HDRPDefaultResources/Foliage Diffusion Profile.asset.meta new file mode 100644 index 0000000..2811ef7 --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources/Foliage Diffusion Profile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 343dd26a4b998f943bd55742e4e98058 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.HDRP/Assets/HDRPDefaultResources/HDRenderPipelineAsset.asset b/Outline.HDRP/Assets/HDRPDefaultResources/HDRenderPipelineAsset.asset new file mode 100644 index 0000000..d72ce7c --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources/HDRenderPipelineAsset.asset @@ -0,0 +1,350 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cf1dab834d4ec34195b920ea7bbf9ec, type: 3} + m_Name: HDRenderPipelineAsset + m_EditorClassIdentifier: + m_Version: 12 + m_ObsoleteFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 + m_ObsoleteBakedOrCustomReflectionFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 + m_ObsoleteRealtimeReflectionFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 + m_RenderPipelineResources: {fileID: 11400000, guid: 3ce144cff5783da45aa5d4fdc2da14b7, + type: 2} + m_RenderPipelineRayTracingResources: {fileID: 0} + m_DefaultVolumeProfile: {fileID: 11400000, guid: 3043edc9d9a47704fad99f10fea80a08, + type: 2} + m_DefaultLookDevProfile: {fileID: 0} + m_RenderingPathDefaultCameraFrameSettings: + bitDatas: + data1: 70280697347917 + data2: 4539628424926265344 + lodBias: 1 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + materialQuality: 0 + m_RenderingPathDefaultBakedOrCustomReflectionFrameSettings: + bitDatas: + data1: 64942043591501 + data2: 4539628424389459968 + lodBias: 1 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + materialQuality: 0 + m_RenderingPathDefaultRealtimeReflectionFrameSettings: + bitDatas: + data1: 69692120112973 + data2: 4539628424657895424 + lodBias: 1 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + materialQuality: 0 + m_RenderPipelineSettings: + supportShadowMask: 1 + supportSSR: 0 + supportSSAO: 1 + supportSubsurfaceScattering: 1 + increaseSssSampleCount: 0 + supportVolumetrics: 1 + increaseResolutionOfVolumetrics: 0 + supportLightLayers: 0 + lightLayerName0: Light Layer default + lightLayerName1: Light Layer 1 + lightLayerName2: Light Layer 2 + lightLayerName3: Light Layer 3 + lightLayerName4: Light Layer 4 + lightLayerName5: Light Layer 5 + lightLayerName6: Light Layer 6 + lightLayerName7: Light Layer 7 + supportDistortion: 1 + supportTransparentBackface: 1 + supportTransparentDepthPrepass: 1 + supportTransparentDepthPostpass: 1 + colorBufferFormat: 74 + supportCustomPass: 1 + customBufferFormat: 12 + supportedLitShaderMode: 2 + supportDecals: 1 + msaaSampleCount: 1 + supportMotionVectors: 1 + supportRuntimeDebugDisplay: 1 + supportDitheringCrossFade: 1 + supportTerrainHole: 0 + supportRayTracing: 0 + supportedRaytracingTier: 2 + lightLoopSettings: + cookieSize: 128 + cookieTexArraySize: 16 + pointCookieSize: 128 + cubeCookieTexArraySize: 16 + planarReflectionProbeCacheSize: 2 + planarReflectionTextureSize: 1024 + reflectionProbeCacheSize: 64 + reflectionCubemapSize: 256 + reflectionCacheCompressed: 0 + planarReflectionCacheCompressed: 0 + skyReflectionSize: 256 + skyLightingOverrideLayerMask: + serializedVersion: 2 + m_Bits: 0 + supportFabricConvolution: 0 + maxDirectionalLightsOnScreen: 16 + maxPunctualLightsOnScreen: 512 + maxAreaLightsOnScreen: 64 + maxEnvLightsOnScreen: 64 + maxDecalsOnScreen: 512 + hdShadowInitParams: + maxShadowRequests: 128 + directionalShadowsDepthBits: 32 + shadowFilteringQuality: 1 + punctualLightShadowAtlas: + shadowAtlasResolution: 4096 + shadowAtlasDepthBits: 32 + useDynamicViewportRescale: 1 + areaLightShadowAtlas: + shadowAtlasResolution: 4096 + shadowAtlasDepthBits: 32 + useDynamicViewportRescale: 1 + shadowResolutionDirectional: + m_Values: 00010000000200000004000000080000 + m_SchemaId: + m_Id: With4Levels + shadowResolutionPunctual: + m_Values: 00010000000200000004000000080000 + m_SchemaId: + m_Id: With4Levels + shadowResolutionArea: + m_Values: 00010000000200000004000000080000 + m_SchemaId: + m_Id: With4Levels + maxDirectionalShadowMapResolution: 2048 + maxPunctualShadowMapResolution: 2048 + maxAreaShadowMapResolution: 2048 + supportScreenSpaceShadows: 0 + maxScreenSpaceShadows: 2 + decalSettings: + drawDistance: 1000 + atlasWidth: 4096 + atlasHeight: 4096 + perChannelMask: 0 + postProcessSettings: + m_LutSize: 32 + lutFormat: 48 + dynamicResolutionSettings: + enabled: 0 + maxPercentage: 100 + minPercentage: 100 + dynResType: 1 + upsampleFilter: 1 + forceResolution: 0 + forcedPercentage: 100 + lowresTransparentSettings: + enabled: 1 + checkerboardDepthBuffer: 1 + upsampleType: 1 + xrSettings: + singlePass: 1 + occlusionMesh: 1 + postProcessQualitySettings: + NearBlurSampleCount: 030000000500000008000000 + NearBlurMaxRadius: + - 2 + - 4 + - 7 + FarBlurSampleCount: 04000000070000000e000000 + FarBlurMaxRadius: + - 5 + - 8 + - 13 + DoFResolution: 040000000200000001000000 + DoFHighQualityFiltering: 000101 + MotionBlurSampleCount: 04000000080000000c000000 + BloomRes: 040000000200000002000000 + BloomHighQualityFiltering: 000101 + ChromaticAberrationMaxSamples: 03000000060000000c000000 + lightSettings: + useContactShadow: + m_Values: + m_SchemaId: + m_Id: + maximumLODLevel: + m_Values: 000000000000000000000000 + m_SchemaId: + m_Id: With3Levels + lodBias: + m_Values: + - 1 + - 1 + - 1 + m_SchemaId: + m_Id: With3Levels + lightingQualitySettings: + AOStepCount: 040000000600000010000000 + AOFullRes: 000001 + AOMaximumRadiusPixels: 200000002800000050000000 + AOBilateralUpsample: 000101 + AODirectionCount: 010000000200000004000000 + ContactShadowSampleCount: 060000000a00000010000000 + SSRMaxRaySteps: 100000002000000040000000 + allowShaderVariantStripping: 1 + enableSRPBatcher: 1 + shaderVariantLogLevel: 0 + availableMaterialQualityLevels: -1 + m_DefaultMaterialQualityLevel: 4 + diffusionProfileSettings: {fileID: 0} + diffusionProfileSettingsList: + - {fileID: 11400000, guid: f2b3cca394e674d4e8b508f6db8af781, type: 2} + - {fileID: 11400000, guid: 343dd26a4b998f943bd55742e4e98058, type: 2} + beforeTransparentCustomPostProcesses: [] + beforePostProcessCustomPostProcesses: + - UnityFx.Outline.HDRP.Outline, UnityFx.Outline.HDRP, Version=0.0.0.0, Culture=neutral, + PublicKeyToken=null + afterPostProcessCustomPostProcesses: [] diff --git a/Outline.HDRP/Assets/HDRPDefaultResources/HDRenderPipelineAsset.asset.meta b/Outline.HDRP/Assets/HDRPDefaultResources/HDRenderPipelineAsset.asset.meta new file mode 100644 index 0000000..be941cb --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources/HDRenderPipelineAsset.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63e769e3f0d41094da311c3c96418947 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.HDRP/Assets/HDRPDefaultResources/Scene PostProcess Profile.asset b/Outline.HDRP/Assets/HDRPDefaultResources/Scene PostProcess Profile.asset new file mode 100644 index 0000000..1271df7 --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources/Scene PostProcess Profile.asset @@ -0,0 +1,110 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-6655779379860192965 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2d08ce26990eb1a4a9177b860541e702, type: 3} + m_Name: Exposure + m_EditorClassIdentifier: + active: 1 + m_AdvancedMode: 0 + mode: + m_OverrideState: 1 + m_Value: 1 + meteringMode: + m_OverrideState: 0 + m_Value: 2 + luminanceSource: + m_OverrideState: 0 + m_Value: 1 + fixedExposure: + m_OverrideState: 0 + m_Value: 0 + compensation: + m_OverrideState: 0 + m_Value: 0 + limitMin: + m_OverrideState: 0 + m_Value: -10 + limitMax: + m_OverrideState: 1 + m_Value: 10 + curveMap: + m_OverrideState: 0 + m_Value: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: -10 + value: -10 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 20 + value: 20 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + adaptationMode: + m_OverrideState: 0 + m_Value: 1 + adaptationSpeedDarkToLight: + m_OverrideState: 0 + m_Value: 3 + min: 0.001 + adaptationSpeedLightToDark: + m_OverrideState: 0 + m_Value: 1 + min: 0.001 +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: Scene PostProcess Profile + m_EditorClassIdentifier: + components: + - {fileID: -6655779379860192965} + - {fileID: 3674710015500977404} +--- !u!114 &3674710015500977404 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dcdde7b7f13f9c745ae31e38f089fdf8, type: 3} + m_Name: Outline + m_EditorClassIdentifier: + active: 1 + m_AdvancedMode: 0 + _defaultResources: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, type: 2} + _resources: + m_OverrideState: 0 + m_Value: {fileID: 11400000, guid: d28e70f030b1a634db9a6a6d5478ef19, type: 2} + _layers: + m_OverrideState: 1 + m_Value: {fileID: 11400000, guid: 65159dc68f867cd4f90261bae63e29a7, type: 2} diff --git a/Outline.HDRP/Assets/HDRPDefaultResources/Scene PostProcess Profile.asset.meta b/Outline.HDRP/Assets/HDRPDefaultResources/Scene PostProcess Profile.asset.meta new file mode 100644 index 0000000..08f3907 --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources/Scene PostProcess Profile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aab0876a9ec74194fb766183257d02c9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.HDRP/Assets/HDRPDefaultResources/Skin Diffusion Profile.asset b/Outline.HDRP/Assets/HDRPDefaultResources/Skin Diffusion Profile.asset new file mode 100644 index 0000000..295a25c --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources/Skin Diffusion Profile.asset @@ -0,0 +1,26 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b2686e09ec7aef44bad2843e4416f057, type: 3} + m_Name: Skin Diffusion Profile + m_EditorClassIdentifier: + profile: + name: Skin + scatteringDistance: {r: 0.7568628, g: 0.32156864, b: 0.20000002, a: 1} + transmissionTint: {r: 0.7568628, g: 0.32156864, b: 0.20000002, a: 1} + texturingMode: 0 + transmissionMode: 0 + thicknessRemap: {x: 0, y: 8.152544} + worldScale: 1 + ior: 1.4 + hash: 1075477546 + m_Version: 1 + profiles: [] diff --git a/Outline.HDRP/Assets/HDRPDefaultResources/Skin Diffusion Profile.asset.meta b/Outline.HDRP/Assets/HDRPDefaultResources/Skin Diffusion Profile.asset.meta new file mode 100644 index 0000000..6f73be7 --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources/Skin Diffusion Profile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f2b3cca394e674d4e8b508f6db8af781 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.HDRP/Assets/HDRPDefaultResources/Sky and Fog Settings Profile.asset b/Outline.HDRP/Assets/HDRPDefaultResources/Sky and Fog Settings Profile.asset new file mode 100644 index 0000000..f2ce19f --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources/Sky and Fog Settings Profile.asset @@ -0,0 +1,162 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-3305224281371206947 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 953beb541740ddc499d005ee80c9ff29, type: 3} + m_Name: + m_EditorClassIdentifier: + active: 1 + m_AdvancedMode: 0 + enabled: + m_OverrideState: 1 + m_Value: 1 + colorMode: + m_OverrideState: 0 + m_Value: 1 + color: + m_OverrideState: 0 + m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1} + hdr: 1 + showAlpha: 0 + showEyeDropper: 1 + maxFogDistance: + m_OverrideState: 0 + m_Value: 5000 + min: 0 + mipFogMaxMip: + m_OverrideState: 0 + m_Value: 0.5 + min: 0 + max: 1 + mipFogNear: + m_OverrideState: 0 + m_Value: 0 + min: 0 + mipFogFar: + m_OverrideState: 0 + m_Value: 1000 + min: 0 + baseHeight: + m_OverrideState: 0 + m_Value: 0 + maximumHeight: + m_OverrideState: 0 + m_Value: 50 + albedo: + m_OverrideState: 0 + m_Value: {r: 1, g: 1, b: 1, a: 1} + hdr: 0 + showAlpha: 1 + showEyeDropper: 1 + meanFreePath: + m_OverrideState: 1 + m_Value: 200 + min: 1 + enableVolumetricFog: + m_OverrideState: 1 + m_Value: 1 + anisotropy: + m_OverrideState: 1 + m_Value: 0.65 + min: -1 + max: 1 + globalLightProbeDimmer: + m_OverrideState: 0 + m_Value: 1 + min: 0 + max: 1 +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: Sky and Fog Settings Profile + m_EditorClassIdentifier: + components: + - {fileID: 6775376097864012941} + - {fileID: 7488742677745068149} + - {fileID: -3305224281371206947} +--- !u!114 &6775376097864012941 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0d7593b3a9277ac4696b20006c21dde2, type: 3} + m_Name: + m_EditorClassIdentifier: + active: 1 + m_AdvancedMode: 0 + skyType: + m_OverrideState: 1 + m_Value: 1 + skyAmbientMode: + m_OverrideState: 0 + m_Value: 0 + fogType: + m_OverrideState: 1 + m_Value: 3 +--- !u!114 &7488742677745068149 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59b6606ef2548734bb6d11b9d160bc7e, type: 3} + m_Name: HDRISky + m_EditorClassIdentifier: + active: 1 + m_AdvancedMode: 0 + rotation: + m_OverrideState: 0 + m_Value: 0 + min: 0 + max: 360 + skyIntensityMode: + m_OverrideState: 0 + m_Value: 0 + exposure: + m_OverrideState: 1 + m_Value: 10 + multiplier: + m_OverrideState: 0 + m_Value: 1 + min: 0 + upperHemisphereLuxValue: + m_OverrideState: 0 + m_Value: 0.46608552 + min: 0 + desiredLuxValue: + m_OverrideState: 0 + m_Value: 20000 + updateMode: + m_OverrideState: 0 + m_Value: 0 + updatePeriod: + m_OverrideState: 0 + m_Value: 0 + min: 0 + includeSunInBaking: + m_OverrideState: 0 + m_Value: 0 + hdriSky: + m_OverrideState: 1 + m_Value: {fileID: 8900000, guid: 8253d41e6e8b11a4cbe77a4f8f82934d, type: 3} diff --git a/Outline.HDRP/Assets/HDRPDefaultResources/Sky and Fog Settings Profile.asset.meta b/Outline.HDRP/Assets/HDRPDefaultResources/Sky and Fog Settings Profile.asset.meta new file mode 100644 index 0000000..ff38726 --- /dev/null +++ b/Outline.HDRP/Assets/HDRPDefaultResources/Sky and Fog Settings Profile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f7fdecfb0943ec9438e95d4c4e13123f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs index c788934..0293025 100644 --- a/Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs +++ b/Outline.HDRP/Packages/UnityFx.Outline.HDRP/Runtime/Scripts/Outline.cs @@ -67,7 +67,7 @@ public override void Setup() public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination) { - using (var renderer = new OutlineRenderer(cmd, source, destination, destination.referenceSize)) + using (var renderer = new OutlineRenderer(cmd, source, destination, source.referenceSize)) { _layers.value.Render(renderer, _resources.value); } @@ -99,6 +99,11 @@ protected override void OnEnable() public bool IsActive() { + if (!Application.isPlaying) + { + return false; + } + if (_resources == null || _layers == null) { return false; diff --git a/Outline.HDRP/ProjectSettings/GraphicsSettings.asset b/Outline.HDRP/ProjectSettings/GraphicsSettings.asset index 35a0fa7..8fbc9f6 100644 --- a/Outline.HDRP/ProjectSettings/GraphicsSettings.asset +++ b/Outline.HDRP/ProjectSettings/GraphicsSettings.asset @@ -39,7 +39,8 @@ GraphicsSettings: m_PreloadedShaders: [] m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_CustomRenderPipeline: {fileID: 0} + m_CustomRenderPipeline: {fileID: 11400000, guid: 63e769e3f0d41094da311c3c96418947, + type: 2} m_TransparencySortMode: 0 m_TransparencySortAxis: {x: 0, y: 0, z: 1} m_DefaultRenderingPath: 1 @@ -58,7 +59,7 @@ GraphicsSettings: m_FogKeepExp: 1 m_FogKeepExp2: 1 m_AlbedoSwatchInfos: [] - m_LightsUseLinearIntensity: 0 - m_LightsUseColorTemperature: 0 + m_LightsUseLinearIntensity: 1 + m_LightsUseColorTemperature: 1 m_LogWhenShaderIsCompiled: 0 m_AllowEnlightenSupportForUpgradedProject: 0 diff --git a/Outline.HDRP/ProjectSettings/HDRPProjectSettings.asset b/Outline.HDRP/ProjectSettings/HDRPProjectSettings.asset index dddb307..349631c 100644 --- a/Outline.HDRP/ProjectSettings/HDRPProjectSettings.asset +++ b/Outline.HDRP/ProjectSettings/HDRPProjectSettings.asset @@ -13,7 +13,8 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: version: 1 - m_DefaultScenePrefabSaved: {fileID: 0} + m_DefaultScenePrefabSaved: {fileID: 4893056312182120781, guid: de1884a706667b84cbf9c4195ee402ca, + type: 3} m_DefaultDXRScenePrefabSaved: {fileID: 0} m_ProjectSettingFolderPath: HDRPDefaultResources m_WizardPopupAtStart: 0 diff --git a/Outline.HDRP/ProjectSettings/ProjectSettings.asset b/Outline.HDRP/ProjectSettings/ProjectSettings.asset index d8171fb..d0a9eca 100644 --- a/Outline.HDRP/ProjectSettings/ProjectSettings.asset +++ b/Outline.HDRP/ProjectSettings/ProjectSettings.asset @@ -47,7 +47,7 @@ PlayerSettings: defaultScreenWidthWeb: 960 defaultScreenHeightWeb: 600 m_StereoRenderingPath: 0 - m_ActiveColorSpace: 0 + m_ActiveColorSpace: 1 m_MTRendering: 1 m_StackTraceTypes: 010000000100000001000000010000000100000001000000 iosShowActivityIndicatorOnLoading: -1 @@ -157,7 +157,7 @@ PlayerSettings: useHDRDisplay: 0 D3DHDRBitDepth: 0 m_ColorGamuts: 00000000 - targetPixelDensity: 0 + targetPixelDensity: 30 resolutionScalingMode: 0 androidSupportedAspectRatio: 1 androidMaxAspectRatio: 2.1 @@ -179,10 +179,10 @@ PlayerSettings: StripUnusedMeshComponents: 0 VertexChannelCompressionMask: 4054 iPhoneSdkVersion: 988 - iOSTargetOSVersionString: + iOSTargetOSVersionString: 10.0 tvOSSdkVersion: 0 tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: + tvOSTargetOSVersionString: 10.0 uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 uIRequiresFullScreen: 1 @@ -287,7 +287,15 @@ PlayerSettings: Android: 1 iPhone: 1 tvOS: 1 - m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupLightmapEncodingQuality: + - m_BuildTarget: Standalone + m_EncodingQuality: 2 + - m_BuildTarget: Android + m_EncodingQuality: 2 + - m_BuildTarget: Lumin + m_EncodingQuality: 2 + - m_BuildTarget: Windows Store Apps + m_EncodingQuality: 2 m_BuildTargetGroupLightmapSettings: [] playModeTestRunnerEnabled: 0 runPlayModeTestAsEditModeTest: 0 From 0cad51597cc79bd0a20cd33d1d7c30f4e04487f2 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Wed, 8 Apr 2020 13:07:14 +0300 Subject: [PATCH 36/39] CHANGELOG update --- CHANGELOG.md | 4 ++-- .../Packages/UnityFx.Outline/CHANGELOG.md | 16 ++++++++++++++++ .../UnityFx.Outline.PostProcessing/CHANGELOG.md | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 540f611..1498997 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,9 @@ 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.0] - unreleased +## [0.7.2] - 2020.04.08 -Added depth testing support, SRP support and performance optimizations. +Depth testing support and performance optimizations. ### Added - Added support for depth testing when rendering outlines. When enabled, outlines are only rendered around the visible object parts ([#1](https://github.com/Arvtesh/UnityFx.Outline/issues/1)). diff --git a/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md b/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md index c7d442d..d148afd 100644 --- a/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md +++ b/Outline.Core/Packages/UnityFx.Outline/CHANGELOG.md @@ -3,6 +3,22 @@ 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.7.2] - 2020.04.08 + +Depth testing support and performance optimizations. + +### Added +- Added support for depth testing when rendering outlines. When enabled, outlines are only rendered around the visible object parts ([#1](https://github.com/Arvtesh/UnityFx.Outline/issues/1)). +- Added a few convenience methods to `OutlineEffect`. +- Added editor tooltips for outline component fileds. + +### Fixed +- Get rid of GC allocatinos during command buffer updates. +- Fixed `IndexOutOfRangeException` when setting outline width to max value ([#4](https://github.com/Arvtesh/UnityFx.Outline/issues/4)). + +### Removed +- Removed change tracking support in package entities ([#2](https://github.com/Arvtesh/UnityFx.Outline/issues/2)). + ## [0.7.1] - 2020.01.28 Bugfixes and project layout changes. diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md index 3a73de8..ae04922 100644 --- a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/CHANGELOG.md @@ -3,7 +3,7 @@ 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.1.0] - unreleased +## [0.1.0] - 2020.04.08 ### Added - Initial release. From 8c1c1b0e247012aea9902f5786c7d69ed43e1159 Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Wed, 8 Apr 2020 13:23:17 +0300 Subject: [PATCH 37/39] README update --- .../Packages/UnityFx.Outline/README.md | 2 +- .../UnityFx.Outline.PostProcessing/README.md | 2 +- README.md | 28 ++++++++++++------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Outline.Core/Packages/UnityFx.Outline/README.md b/Outline.Core/Packages/UnityFx.Outline/README.md index 2bb00b7..ab04468 100644 --- a/Outline.Core/Packages/UnityFx.Outline/README.md +++ b/Outline.Core/Packages/UnityFx.Outline/README.md @@ -1,7 +1,7 @@ # UnityFx.Outline ## SUMMARY -Screen-space outline effects for Unity. +Screen-space outline effect for Unity. ## USEFUL LINKS * [Github project](https://github.com/Arvtesh/UnityFx.Outline) diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/README.md b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/README.md index 1fc72d2..bf83293 100644 --- a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/README.md +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/README.md @@ -1,7 +1,7 @@ # UnityFx.Outline.PostProcessing ## SUMMARY -Screen-space outline effects for Unity Post-processing Stack v2. +Screen-space outline effect for Unity Post-processing Stack v2. ## USEFUL LINKS * [Github project](https://github.com/Arvtesh/UnityFx.Outline) diff --git a/README.md b/README.md index 2619c06..bd34d56 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,6 @@ Channel | UnityFx.Outline | Github | [![GitHub release](https://img.shields.io/github/release/Arvtesh/UnityFx.Outline.svg?logo=github)](https://github.com/Arvtesh/UnityFx.Outline/releases) Npm (core + built-in RP) | [![Npm release](https://img.shields.io/npm/v/com.unityfx.outline.svg)](https://www.npmjs.com/package/com.unityfx.outline) ![npm](https://img.shields.io/npm/dt/com.unityfx.outline) Npm (Post-processing v2) | [![Npm release](https://img.shields.io/npm/v/com.unityfx.outline.postprocessing.svg)](https://www.npmjs.com/package/com.unityfx.outline.postprocessing) ![npm](https://img.shields.io/npm/dt/com.unityfx.outline.postprocessing) -Npm (URP) | [![Npm release](https://img.shields.io/npm/v/com.unityfx.outline.urp.svg)](https://www.npmjs.com/package/com.unityfx.outline.urp) ![npm](https://img.shields.io/npm/dt/com.unityfx.outline.urp) -Npm (HDRP) | [![Npm release](https://img.shields.io/npm/v/com.unityfx.outline.hdrp.svg)](https://www.npmjs.com/package/com.unityfx.outline.hdrp) ![npm](https://img.shields.io/npm/dt/com.unityfx.outline.hdrp) **Requires Unity 2017 or higher.**
**Compatible with [Unity Post-processing Stack v2](https://github.com/Unity-Technologies/PostProcessing/tree/v2).** @@ -48,8 +46,6 @@ git clone https://github.com/Arvtesh/UnityFx.Outline.git ### Npm packages [![NPM](https://nodei.co/npm/com.unityfx.outline.png)](https://www.npmjs.com/package/com.unityfx.outline)
[![NPM](https://nodei.co/npm/com.unityfx.outline.postprocessing.png)](https://www.npmjs.com/package/com.unityfx.outline.postprocessing)
-[![NPM](https://nodei.co/npm/com.unityfx.outline.urp.png)](https://www.npmjs.com/package/com.unityfx.outline.urp)
-[![NPM](https://nodei.co/npm/com.unityfx.outline.hdrp.png)](https://www.npmjs.com/package/com.unityfx.outline.hdrp)
Npm core package is available at [npmjs.com](https://www.npmjs.com/package/com.unityfx.outline). There are dedicated packages for [Post-processing Stack v2](https://github.com/Unity-Technologies/PostProcessing/tree/v2), [Universal Render Pipeline](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@8.0/manual/index.html) and [High Definition Render Pipeline](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@8.0/manual/index.html). To use the packages, add the following line to dependencies section of your `manifest.json`. Unity should download and link the package automatically: ```json @@ -64,10 +60,8 @@ Npm core package is available at [npmjs.com](https://www.npmjs.com/package/com.u } ], "dependencies": { - "com.unityfx.outline": "0.8.0", - "com.unityfx.outline.postprocessing": "0.1.0", - "com.unityfx.outline.urp": "0.1.0", - "com.unityfx.outline.hdrp": "0.1.0", + "com.unityfx.outline": "0.7.2", + "com.unityfx.outline.postprocessing": "0.1.0" } } ``` @@ -88,7 +82,7 @@ var layer = new OutlineLayer("MyOutlines"); layer.OutlineColor = Color.red; layer.OutlineWidth = 7; -layer.OutlineMode = OutlineMode.Blurred; +layer.OutlineRenderMode = OutlineRenderFlags.Blurred; layer.Add(myGo); outlineEffect.OutlineLayers.Add(layer); @@ -105,7 +99,7 @@ var layer = outlineEffect[0]; layer.OutlineColor = Color.red; layer.OutlineWidth = 7; -layer.OutlineMode = OutlineMode.Blurred; +layer.OutlineRenderMode = OutlineRenderFlags.Blurred; layer.Add(myGo); ``` @@ -137,6 +131,16 @@ outlineBehaviour.OutlineWidth = 2; outlineBehaviour.OutlineIntensity = 10; ``` +### Depth testing +By default depth testing is disabled when rendering outlines. This behaviour can be overriden by setting `OutlineRenderFlags.EnableDepthTesting` flag of `OutlineRenderMode` or settings the corresponding checkbox in editor. +```csharp +var outlineSettings = GetComponent(); + +outlineSettings.OutlineColor = Color.green; +outlineSettings.OutlineWidth = 2; +outlineSettings.OutlineRenderMode = OutlineRenderFlags.Blurred | OutlineRenderFlags.EnableDepthTesting; +``` + ### Extensibility There are a number of helper classes that can be used for writing highly customized outline implementations (if neither `OutlineBehaviour` nor `OutlineEffect` does not suit your needs). All outline implementations use following helpers: @@ -202,9 +206,13 @@ More info on writing custom post processing effects can be found [here](https:// ### Integration with Universal Render Pipeline (URP). [![NPM](https://nodei.co/npm/com.unityfx.outline.urp.png)](https://www.npmjs.com/package/com.unityfx.outline.urp) +TODO + ### Integration with High Definition Render Pipeline (HDRP). [![NPM](https://nodei.co/npm/com.unityfx.outline.hdrp.png)](https://www.npmjs.com/package/com.unityfx.outline.hdrp) +TODO + ## Motivation The project was initially created to help author with his [Unity3d](https://unity3d.com) projects. There are not many reusable open-source examples of it, so here it is. Hope it will be useful for someone. From f16b43cdf560dab57d0e1ca2522b4af941f7be6e Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Wed, 8 Apr 2020 13:23:34 +0300 Subject: [PATCH 38/39] Updated package versions --- .github/workflows/npmpublish.yml | 1 - Outline.Core/Packages/UnityFx.Outline/package.json | 4 ++-- .../Packages/UnityFx.Outline.PostProcessing/package.json | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/npmpublish.yml b/.github/workflows/npmpublish.yml index a5a13f5..9d54621 100644 --- a/.github/workflows/npmpublish.yml +++ b/.github/workflows/npmpublish.yml @@ -17,6 +17,5 @@ jobs: - run: | npm publish Outline.Core/Packages/UnityFx.Outline npm publish Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing - npm publish Outline.HDRP/Packages/UnityFx.Outline.HDRP env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/Outline.Core/Packages/UnityFx.Outline/package.json b/Outline.Core/Packages/UnityFx.Outline/package.json index 0dfd31d..b41e8a4 100644 --- a/Outline.Core/Packages/UnityFx.Outline/package.json +++ b/Outline.Core/Packages/UnityFx.Outline/package.json @@ -1,8 +1,8 @@ { "name": "com.unityfx.outline", - "version": "0.8.0", + "version": "0.7.2", "displayName": "Screen-space outline", - "description": "Configurable per-object and per-camera outlines. Both solid and blurred outline modes are supported (Gauss blur). The outlines can be easily customized either through scripts or with Unity editor (both in edit-time or runtime).", + "description": "Configurable per-object and per-camera outline effect implementation for built-in render pipeline. Both solid and blurred outline modes are supported (Gauss blur). Scriptable render pipeline is not supported.", "unity": "2017.2", "keywords": [ "UnityFx", diff --git a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/package.json b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/package.json index a6caddb..6c5b92f 100644 --- a/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/package.json +++ b/Outline.PostProcessing/Packages/UnityFx.Outline.PostProcessing/package.json @@ -2,10 +2,10 @@ "name": "com.unityfx.outline.postprocessing", "version": "0.1.0", "displayName": "Screen-space outline (Post-processing v2)", - "description": "Configurable outline for Unity post-processing stack (v2). Both solid and blurred modes supported (Gauss blur).", + "description": "Configurable outline implementation for Unity post-processing stack (v2). Both solid and blurred modes supported (Gauss blur). Scriptable render pipeline is not supported.", "unity": "2018.4", "dependencies": { - "com.unityfx.outline": "0.7.1", + "com.unityfx.outline": "0.7.2", "com.unity.postprocessing": "2.2.2" }, "keywords": [ From 1db0846d5c53bd607633016985950bbaa5ed05fc Mon Sep 17 00:00:00 2001 From: Alexander Bogarsukov Date: Wed, 8 Apr 2020 13:25:31 +0300 Subject: [PATCH 39/39] Updated editor screenshots --- Docs/OutlineBehaviourInspector.png | Bin 18685 -> 20783 bytes Docs/OutlineEffectInspector.png | Bin 15720 -> 18931 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Docs/OutlineBehaviourInspector.png b/Docs/OutlineBehaviourInspector.png index 27c8703e71eaa49af44b0d1dd01ea99d9a58c314..8ec031ff5df178643053caa4be72a17b464262f0 100644 GIT binary patch literal 20783 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 literal 18685 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

d~x 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 fLHRx%f9lVETljU3L_`(v$RY+$S3j3^P6i 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≥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

>lcS2owi063~h0$@QZkxJg z^7h5iDUz8^n6UxC1~Qfz6>7KPs)r^TA7y7K3F4TR-Y%Z$b2ywJJ45yqxafS)PsI0T zZiV%1sqyN5JF_3xb6+>p7EbwUy>OfH*pL7u5_mWmghEYpER|-fMIz~y=p=BsQRWy+ z#8#J=_caT%(N0g<8FbgWZ_~vKV&af`ltheu{6N+IZzn@CyHk}?Awu8zwFj*itD-CA z2&TTyIS{r8NogH0?)ojp!|o8wl@69~;ZQR%#o8W^!i~B@Zs5B!j+hSjjpc9KNZs)} z`TYHrTiH)}nEWOy_j9Gg!+IF6D+4e$J;z`RcUe z)w?Uzk5CamTzB{5L+TjxIUH);hPfyF!uCz2<)tCOSK#%szZ2^mpcX`{3Eciy*#1V^ z{2$LRw^@zn=OBuL4Z(oX{0-@LNrC^VkOm`+ZRfX7mty!VV(tG8IBf(L$cB45kHjx3|J9aumsPXL)!lrF7((#40G>)2N7k%2QSu?+|HD*CqBT(| zJ21W2@_`oVqMKOH)HPdQY$duw@fZ{OvXO3oO{B98uQmMr`&|VE=Ci+y0Qe_NjVf&2 z&L;ofNx@h-BG~M=7Jg-`U$i(wwY(zRHTVv=-m7k>N%{E@Wz_@}e`4aGd4kMW1=l)U z9Jh+|ZRSXe1;&CRiLh}AVco~mhSFDquSThIzi?uKzMrM8< z47GRnZn+bLZ?&@vT0QB=j3T}{Al%pbCZ+@u(#`nZ3X3eh$R2mz31Ho^yP~-g`it;| zIu3k8fwyx+^HJ$$L-~0l9lGgh$hVWe`%qe5&Wc6h{y`S) z^bhFU`M|Cud9tD3y%^)bzmZAAurm|^woCyi(7^xAbuPc~t1-;ECi9g&5P`T!_Z#jN z%!Pn>ueA3a58JLY8#mV3F?rj35hCyb)tQc> z%^l_6#r&zYUFA@zWhM@W#)(!Ki}yx>O(tCB;^bKx*je8+ylh7@jQfdKffzIHjC=(> zt7LUO;UU6J$&->Q`Y;0@tc*f*-1FTrP*OdiaA|vx^pZ>MqC6N5-oqK`uZY$Z%9V0BqeC%Sk@r+ z*-P|mar#j2A#cx=zzuP#csu!)&%z-opM!|gMH#FBa!vUctADq13J;!qltfP*7q(S> z&Y(<;B)BMo4(xtP2xSi8Pmy#`8r2D_|1+{e8sS!Z?q>_e+;$Z~qR`}uk}$lr=Xd5k zx2+P^%In=m+F?=skLt9*I;d6(QAXX5j!TTNf-60)I;c8ojiT~A0Yrk1+%;I#KC(*m zqA#+535Y=f3HSgXnWT*WbGsLnwqW2&&-?2?NDSRq{6>B1(VK?Qv-k-=R&fs3YW32= zrVNJ8X+0hZjmwj!k<#iogK-%B3$x|_)O8u6{72b$roJ#8whE+;l%Mg7rMBv-R|75rO$ zx@>QBC5huWrBHN!&1pLSNkJ-)(i{#O%5?8_ILq@iDa#Y&1cHCCSow5P&3WxdwHG=6TaBUcZfvl76i{}3<}>ef`AMnf_14a;#+D-!uxmwVQ|}xxb?Y z8XQ-Y$7?rrPp5h7sTF>D$F6X{_q`l%d z>0IM}(-vMwcjJ3UV;3?F^@kT|Do2`0iy7T4bJo~{3p~P09qJKdRML3|>@@Vb#M=cY zCORFDr@NNH7>kq1LHVr5+zrB{mAO*KY2)*(A7dyqs>PUgCJxH|ea45~*@8=j*ujiy z<9mhJGu!W}7S5)kpHsfoqha;_-w(nsS7B1Dp27{{w~(f~b-0l`PJAA)!rg!Y3-k#B z;?>|h$sVlwVUETmZ(@V3hhhXRrSzE?NOJPjfP2AmbK*YR+kgdPlo!?SC9L5Bg@!tA zD+hbh>F9D;Sy40JP9GS_W+T%TEdP0M=#Y%B;vY>uD>3-teJRa~{!d$p8(L2}YisM% z!~~l1@^a(c7)L-XTA~sgwG)r}g8IVFOd21Sj*W?#-ijxFQw~^Wa?}_Jg2aZO+Y<=q z(YGBmBO)VBtYZSx_`B?~ZwreQlTL%FFAM;~NhsV(LnAdkudr}H)=m|mKQJr|3=C>4 zlVJ1cK%@a~(505F_{~;bY!vBIiQ!8?nsK;sh&D;*%X#~LW%EXY+HZ9!Pft%Gcr{@D zdRL?kIZskU29FIY$fkZX=4NfGpk9VPR%et|l0^jt1wkC2pP!Qzeq@(?U+xDnRcx#1 z`V-LQzX>t69cczZ0SyEX!41UQ_=Q(yXGz=LFE|)CTHcClpB%RnWW1cR%<%xloz?%{ zr>wLzuGRT)XyIP)w-1nka@r2T&ft1;l(u7W+LKJ@^>nh4Qo<-=(#&ab2Jyd~>XWS3 znMG<{oG~?)n&JM;$iTI-vpdgjPv>?mZ)j{Bz1|-$>g?1jmg7m0Q5*HMB+ho3m8vtJ z%viz&>X6CwR}2K`Xt9VqZIWot%MrPS2pX(yfP>KA984y%m<$apM0}|JVff4z%RzrU zo{vlLemeqT9ABSZ&ECfz1t5S{zbSgzc|2D#4%p}WNh$ zH14VZausJSe-D}}*Qd^Ar9mo0RVm4jI0^Qc?_tg4Zx|#D(n!8oq?cY7g7`JwNLsS- z*l4cXiq#Nzk=PbTWor+RSG;L$YFePzslh#FAG+o}si=>V0Zjt2N4fES*ZFJ6rtH+qss11Tw|%Ppbh7Dp2zY$gZ&`!5q(>OlKDCCb9m;JdR7UOOvXE?eZ{oM6z^wzaKP zI6FUH8tn%0xg06l$RXb*?vOT}8&#|Z?ry`)f2mdya*K+979m$?Lv)9p`V#KlU@kI zj_2e%)ger>*jVdf_Sy=Bnc!|PV|Epr3PmpzaPAL946fr%-VVW3L9B}B??5`BDvrcv zipf+GSE>VNm1NMY$pg_P!qP&jz|iGmMSn;VVP(**ApCjE@BvjNCvbZkeWS-wEU{?CNpY_9|HcsT z7y~W{lo=kUeYKhPm*m;8n)#^kk&#-ZG8}^B@|9B6dC{U4cG4M1RZ^p_u)O;)+KaM; z_%M_dbSn8%ObfyZ({G^E)0IZLrb6nmtDrXGKN|az#ZE&w7HP67g}Zxi-;MjIASy>a zS@!eSIfn_1<1T+d4IBzL+iw!;{6?T!Gmhxxay(EiBQn@a$_!9d$C8$^`bCx^rmTk( zr=&LZ91%9py=l$+mlr*Rk3rLE5A7j6Ovn5Fl%*FwY+b6Y+Z2E;(r$6(Y56p~n}yco zq71=btVDNv<;Y99n2N(F0x!ek#}SF2$M!}Oy+abY61}roJC5jzLzGqh%YR5yN($wP zLj*dN(IQH^x=W5_1Sz}asY$zkm1>|N_bxE&H0CxN!%*?_Kv^cLRBevi8KdY!dvcaC zRWN1jf)Asqi5`GG$Ete6tI*f(wzakG)Cyao(#L8-y+#naf9cAnelMgg)+{{l7=A?r z;fAYN$__)a$k|<(vzWU4a*|FO(NTKd;*|xGbZw-Vv-A6!DcMw`fiXDB9bHQ0O@t{C zzLUxes0m?G#r_qWNsJJL%s*^iAFn#O?AKAsPd_~G^e7YqPR%-U?4deW`%Iwb9_Kt> z_9M&9dZnxrPvCnm*O{4fEk9t2NfEUZCB(S2yiSy(D^dzA>VB~hYn+@Azw=bxA` zXc7!ZXhbUYl#jw}0_ziMJ+hTbc)85R>g+f9p8)tOheh(NP>WHEux?n!+7mc|?jgN) z`2b6MPU;?HwBcT$VE+F4G?aYmtBGoEy)9gK0c39Y?Y0|+(sc~c{pmctvES`TN97E)pXPWA7ya>59Y4{Qr%`dJ>lPRp?diZY%8gw+IfBmw=V!@K*(|Al~h+uub=P|a8j35k=m=Iwu>8fSXBylfsV$+2{#Pi zd5-2bUS`Pt1!0AZEiK~?rgr*7_VdG=)(pATVvR`k^IB`Ovz(a0?iUPEEnqY{PN)oe zGp?P*{yQw#T}?gKV}wGdPtqaq#d1RH{s45JFb5e|Dtn|-2N~s1)VeKRgP3+AShx*i zwu&U!_dTkiS+eFh&jtHaVP1=9MAqG1ySkJ{sSeVQNV8y785OByjJ6Fik(Q(G!dK=o zWXaF5#E`*JBci=-70TK*3*2`x2d+$sR-fEiD)phKXNblGVJ_bZ9(@gzF#MGX0-zAk zOlwfRde<%*zvS7?-mmB`u2@KOM7MN6M3nOCUcp&|y! zMlF5MHZO$daRe*uspW=8aNI=XLhYiV$3J$B;8Z}z#dnbh zkk}Y;t?|ksIPDSYlwhqSF_t_3+P>^B!oaWL3T$D}u8K*!$gaJL5mr-FFjSO(PnYZE zEE|CU{o-Cg1IlxBgBFJlckftYNQm+^{8$qrl_hnQw3V6W_aRZ!y`|Fms2FKATUFZc z`O3Pu@s{MYsOZUPLVT3vra`~(0mE-{U=vuL@O7UiSyt>y7?L*P`bk(X?)x{PKGy`d zneRV&kR5qtnbUN!RTx)%o!5H9${xcKr3ps?mYf!_&*Od`WvdnnX~#0SmG#ZJd_I=R zX-uvMbwrqkh9L<6TxC@VBc-$!zG9-^voF39y5@vyIywBfZJ3i!?DT%fxE7WEDvBXg zq)Qm3?XY2H#N!Dqbbm|pH*~2pZp|L(dfvPj=4_(4F)7<%A zwaqn%-7SY4hTB~7>RG&O#Y>a+{;Q0Zgd`~?&IAiK6Jo84L9LaQReY?#`%UYY(Cv)7f~n7IMMyYV<@;|(^;bxYb}N-;1VVV8tjLS|E}CvPKKEJcHY zxt1a#!KmZWc%1jnSFDyl7NG3d#e@j^Z6zpXaoE+3$!8N++3_Q!H8h%CLO&Ps=~6SS zgKHb}`R@r5@gk%9X52cml2jpB)=z`D0N6WMWQZQt{;T$9oO~LyP)25^iS?ilA*Wr| zGL_WGF^?L?{$n6E95PxCDFQnn`oJ^~k(F$+WdlhEK)uzT;(xKxYIQOb;H+9y4)O3U zmww;z1+k-rOE)wqOApH>&c@#<>*L4G@%sqp|Ej@{fHG}YmG-tu#^BmHfW9i+%=RVm ziTb;{T^Ahn1@`CG?7ARX?2P~Yy0UJIX7ejUaO{y&4P@LGd@%tlIk{-9;V>gYU0{HX zD|TCy3*jYo4AB*b5iD5F)4YnQH7YA{%2V2V>D)^|&Z=rs#tTY;g5$UOfxt}+lL$jG z7ay3E67*+MEmc+OK})j}607wlaSn`yk@#6u(xUwXAr+vendSYrFk+UM0fcX`p?{TU zYA8X&8A}TRz)a{w^}m!5_?eH>0y!SA@9F=G6|SLX(RW-IP`CDkp^_QrLPP6`qk!Zp z?DQ!vw%6r0;Q#o|-Tumf{n>x8uE`W;bq89M653pJ#-y-5LW*oy^L@@6NXnz<0RPmh zmbUhv%%$;|q(0`ymkdQsNm(krzh^_yn$TfTjKemEh2eg& zVXNEW_#$U=vn$-O)Vd5NG#XwqHvVo}>?mR;OW{2u2FL`|tph+hff~qNs;~VtdcHlb zb3T;U>hfs~ZRMVeJPRI| z0|M*5Y=gm@7|qPFCxHK=fTP4dP&6;E8~XnJoYH9F~K8Iwn^D0J_LAcF@Q1t zIq@@@stf7DpWQd~oyg&9kG03A`|=yjI{1w;=)&k%oZZO>{X1@0!(!L6V84;|1L_bo z*KQPBl=sgc>-2O$dP`6e6?EbE&`x=~)fWOE9cL`~i|GC?&BL@ZtxB_2_+tr^Ro(`Tduc=W&ip$-3(|97+4BnFA(3u7ZQr(o&S^bB`)EeBw+=vHXJ~l{QWy|xU!;M zZ$rYxrv52~>dpApvyDW9oB>(ji0Kng!gwZ`+Ni;0KwJR^Hd8cvf*Sy>{t*|>-|3SK zvV{krl@5Rg;k9Ur*(|2m8KBVonY8N2o0?$6HR987=n^B{BFP{mh0RYQ?&<}119`B) z57i>LoDaSjxwd;GzlQz{cM{vA(MKLj2VU>dn93(BuJBeJi#=%Z$;Q$HxNA1BMXtwf zy?-K4Qd={D_uU9!9ZYP_MSMB3l!Z#eTb`aKhCwDw0?Jo;BqzuaqlqB=>>VMK!jv5Al0G#P4%HOJl@OHF(!?3Z9U!+hc!qKVjQNIqLjXMG$bqLdXdk5!RP&+os z!5y@2drz%0syMAOz46*OokrE^;enjXl(d^L*K{6YI*HaabcZBxCsCD3Nv9By(YPy~q$(s!b0lq^S0zba9FYLu zGKhgP@4~0?-_|u{SQ*Fie}q-J|1K;4mu+GkeO6v5p6Uk|R+mL($yY~-U3B98!LWWL zK|2IMs#XPgonk24=?Ow$XY8uja<))Pz-hR75|dIPhyG--nv+W=+_3j+jor)rnK_S= zz2vQp$sHP0ZmRR{_JiKN)GfYpd%RL%YwI!;1XzXi1B+*R_64e8?qi?m8nH3Lr84si zl@I1>*i)n#;%Wc+Pr(z@NuzX2);)_4Wv>pKw~)&=9c@3?Bl4<3}mrir>6MX$Twj9+fY{hoA<#zn}5CAnf49efaXUb^>gwALtDVt zGV37O{r>&C?7|m%V6mwCGxV1Hz20nXEh0;0RaH#oSuAiOw2X`8`r%U;YuEKQ*IEW& zA%_y#^jRPp4QSLa0Dm0R^8&2<+ZIya4 z3cCT;zyjUK$}=H}cL3FzQhAaT!=hDba^7m~bY%T=GrP$0Mr`ayL@