From 9af518c224132fa038b3f5355b8a8f8e1a11af57 Mon Sep 17 00:00:00 2001 From: Huw Bowles Date: Sun, 19 Sep 2021 13:37:04 +0100 Subject: [PATCH 1/7] Make waterbody automatically clip-include If clipping is enabled and clipping set to remove everything by default, then the waterbody ensures its area is clip-included. This seems good to me, but needs the ocean lifetime stuff to ensure OnEnable is called after the OceanRenderer --- crest/Assets/Crest/Crest/Scripts/WaterBody.cs | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs index d9d323d0e..6d18f40e1 100644 --- a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs +++ b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs @@ -7,6 +7,7 @@ using UnityEditor; #endif using UnityEngine; +using UnityEngine.Rendering; namespace Crest { @@ -43,16 +44,60 @@ public partial class WaterBody : MonoBehaviour "specified, the default material assigned to the OceanRenderer component will be used.")] public Material _overrideMaterial = null; + class ClipInput : ILodDataInput + { + Material _renderMat; + + // Render to all cascades + public float Wavelength => 0f; + public bool Enabled => true; + + public Matrix4x4 _transform; + + public ClipInput(WaterBody owner) + { + var rotateQuadFaceUp = Matrix4x4.Rotate(Quaternion.AngleAxis(90, Vector3.right)); + _transform = owner.transform.localToWorldMatrix * rotateQuadFaceUp; + + _renderMat = new Material(Shader.Find("Crest/Inputs/Clip Surface/Include Area")); + } + + public void Draw(CommandBuffer buf, float weight, int isTransition, int lodIdx) + { + buf.DrawMesh(RegisterLodDataInputBase.QuadMesh, _transform, _renderMat); + } + } + + ClipInput _clipInput; + private void OnEnable() { CalculateBounds(); _waterBodies.Add(this); + + if (OceanRenderer.Instance && OceanRenderer.Instance.CreateClipSurfaceData + && OceanRenderer.Instance._defaultClippingState == OceanRenderer.DefaultClippingState.EverythingClipped) + { + if (_clipInput == null) + { + _clipInput = new ClipInput(this); + } + + var registrar = RegisterLodDataInputBase.GetRegistrar(typeof(LodDataMgrClipSurface)); + registrar.Remove(_clipInput); + registrar.Add(0, _clipInput); + } } private void OnDisable() { _waterBodies.Remove(this); + + if (_clipInput != null) + { + RegisterLodDataInputBase.GetRegistrar(typeof(LodDataMgrClipSurface)).Remove(_clipInput); + } } private void CalculateBounds() @@ -76,6 +121,15 @@ private void Start() } } + private void Update() + { + if (_clipInput != null) + { + var rotateQuadFaceUp = Matrix4x4.Rotate(Quaternion.AngleAxis(90, Vector3.right)); + _clipInput._transform = transform.localToWorldMatrix * rotateQuadFaceUp; + } + } + private void OnDrawGizmosSelected() { // Required as we're not normally executing in edit mode From f2e41c028c93043bd9641f27866adea1472bd275 Mon Sep 17 00:00:00 2001 From: Huw Bowles Date: Thu, 14 Oct 2021 16:07:57 +0100 Subject: [PATCH 2/7] Make optional --- crest/Assets/Crest/Crest/Scripts/WaterBody.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs index 6d18f40e1..cf839045f 100644 --- a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs +++ b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs @@ -34,6 +34,9 @@ public partial class WaterBody : MonoBehaviour bool _runValidationOnStart = true; #pragma warning restore 414 + [Tooltip("If clipping is enabled and set to clip everywhere by default, this option will register this water body to ensure its area does not get clipped."), SerializeField] + bool _registerWithClipSurfaceData = true; + public static List WaterBodies => _waterBodies; static List _waterBodies = new List(); @@ -76,7 +79,7 @@ private void OnEnable() _waterBodies.Add(this); - if (OceanRenderer.Instance && OceanRenderer.Instance.CreateClipSurfaceData + if (_registerWithClipSurfaceData && OceanRenderer.Instance && OceanRenderer.Instance.CreateClipSurfaceData && OceanRenderer.Instance._defaultClippingState == OceanRenderer.DefaultClippingState.EverythingClipped) { if (_clipInput == null) From 32b63245f7dd52aaa0b184eb8b79e06ac75c09cb Mon Sep 17 00:00:00 2001 From: Huw Bowles Date: Sat, 30 Oct 2021 22:48:32 +0100 Subject: [PATCH 3/7] Fix whitespace --- crest/Assets/Crest/Crest/Scripts/WaterBody.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs index cf839045f..c966087ec 100644 --- a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs +++ b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs @@ -34,9 +34,9 @@ public partial class WaterBody : MonoBehaviour bool _runValidationOnStart = true; #pragma warning restore 414 - [Tooltip("If clipping is enabled and set to clip everywhere by default, this option will register this water body to ensure its area does not get clipped."), SerializeField] - bool _registerWithClipSurfaceData = true; - + [Tooltip("If clipping is enabled and set to clip everywhere by default, this option will register this water body to ensure its area does not get clipped."), SerializeField] + bool _registerWithClipSurfaceData = true; + public static List WaterBodies => _waterBodies; static List _waterBodies = new List(); From a10dcba21d5ea35e24d1faf218d05929aacce993 Mon Sep 17 00:00:00 2001 From: Huw Bowles Date: Sun, 31 Oct 2021 14:07:04 +0100 Subject: [PATCH 4/7] Handle register/deregister per frame --- crest/Assets/Crest/Crest/Scripts/WaterBody.cs | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs index c966087ec..e6d99182c 100644 --- a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs +++ b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs @@ -36,7 +36,7 @@ public partial class WaterBody : MonoBehaviour [Tooltip("If clipping is enabled and set to clip everywhere by default, this option will register this water body to ensure its area does not get clipped."), SerializeField] bool _registerWithClipSurfaceData = true; - + public static List WaterBodies => _waterBodies; static List _waterBodies = new List(); @@ -79,28 +79,14 @@ private void OnEnable() _waterBodies.Add(this); - if (_registerWithClipSurfaceData && OceanRenderer.Instance && OceanRenderer.Instance.CreateClipSurfaceData - && OceanRenderer.Instance._defaultClippingState == OceanRenderer.DefaultClippingState.EverythingClipped) - { - if (_clipInput == null) - { - _clipInput = new ClipInput(this); - } - - var registrar = RegisterLodDataInputBase.GetRegistrar(typeof(LodDataMgrClipSurface)); - registrar.Remove(_clipInput); - registrar.Add(0, _clipInput); - } + HandleClipInputRegistration(); } private void OnDisable() { _waterBodies.Remove(this); - if (_clipInput != null) - { - RegisterLodDataInputBase.GetRegistrar(typeof(LodDataMgrClipSurface)).Remove(_clipInput); - } + HandleClipInputRegistration(); } private void CalculateBounds() @@ -115,6 +101,30 @@ private void CalculateBounds() AABB = bounds; } + void HandleClipInputRegistration() + { + var registered = _clipInput != null; + var shouldBeRegistered = _registerWithClipSurfaceData && OceanRenderer.Instance && OceanRenderer.Instance.CreateClipSurfaceData + && OceanRenderer.Instance._defaultClippingState == OceanRenderer.DefaultClippingState.EverythingClipped; + + if (registered != shouldBeRegistered) + { + if (shouldBeRegistered) + { + _clipInput = new ClipInput(this); + + var registrar = RegisterLodDataInputBase.GetRegistrar(typeof(LodDataMgrClipSurface)); + registrar.Add(0, _clipInput); + } + else + { + RegisterLodDataInputBase.GetRegistrar(typeof(LodDataMgrClipSurface)).Remove(_clipInput); + + _clipInput = null; + } + } + } + #if UNITY_EDITOR private void Start() { @@ -126,6 +136,8 @@ private void Start() private void Update() { + HandleClipInputRegistration(); + if (_clipInput != null) { var rotateQuadFaceUp = Matrix4x4.Rotate(Quaternion.AngleAxis(90, Vector3.right)); From 6d8f0b18733d5405dc7b2a2c05706d46caeadde6 Mon Sep 17 00:00:00 2001 From: Huw Bowles Date: Sun, 31 Oct 2021 14:09:49 +0100 Subject: [PATCH 5/7] OnDisable should just deregister --- crest/Assets/Crest/Crest/Scripts/WaterBody.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs index e6d99182c..877ff5fb6 100644 --- a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs +++ b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs @@ -86,7 +86,12 @@ private void OnDisable() { _waterBodies.Remove(this); - HandleClipInputRegistration(); + if (_clipInput != null) + { + RegisterLodDataInputBase.GetRegistrar(typeof(LodDataMgrClipSurface)).Remove(_clipInput); + + _clipInput = null; + } } private void CalculateBounds() From c8d969f229d50120be2faba57f5c20d5bf0b8db2 Mon Sep 17 00:00:00 2001 From: Dale Eidd Date: Sat, 13 Nov 2021 00:00:23 -0800 Subject: [PATCH 6/7] WB execute after OR --- crest/Assets/Crest/Crest/Scripts/WaterBody.cs | 1 + crest/Assets/Crest/Crest/Scripts/WaterBody.cs.meta | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs index 877ff5fb6..d03fe6221 100644 --- a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs +++ b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs @@ -79,6 +79,7 @@ private void OnEnable() _waterBodies.Add(this); + // Needs to execute after the Ocean Renderer as Update is stripped from builds. HandleClipInputRegistration(); } diff --git a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs.meta b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs.meta index dd75dd203..cccd57c33 100644 --- a/crest/Assets/Crest/Crest/Scripts/WaterBody.cs.meta +++ b/crest/Assets/Crest/Crest/Scripts/WaterBody.cs.meta @@ -4,7 +4,7 @@ MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] - executionOrder: 0 + executionOrder: 203 icon: {instanceID: 0} userData: assetBundleName: From 701656c36267924947fe1818c16bd5fd454ef7b1 Mon Sep 17 00:00:00 2001 From: Dale Eidd Date: Sat, 13 Nov 2021 00:06:39 -0800 Subject: [PATCH 7/7] Docs: update history --- docs/about/history.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/about/history.rst b/docs/about/history.rst index 22a514c6c..cab2b6acc 100644 --- a/docs/about/history.rst +++ b/docs/about/history.rst @@ -28,6 +28,7 @@ Changed - Add *Ocean Renderer > Water Body Culling* option so the ocean can ignore culling. Useful if using *Water Body > Override Material* and still want an ocean. - Improve multiple *Water Body* overlapping case when *Water Body > Override Material* option is used. + - Water Body adds an inclusion to clipping (ie unclips) if *Default Clipping State* is *Everything Clipped*. Fixed ^^^^^