From 8ed4613dae189ca05d7eba6eb6bae435b5892d90 Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Tue, 9 Jun 2020 13:58:15 +0200 Subject: [PATCH 1/3] Fixed decals being duplicated in prefab isolation mode. --- .../Material/Decal/DecalProjectorEditor.cs | 2 +- .../Decal/DecalProjector.Migration.cs | 4 +- .../Runtime/Material/Decal/DecalProjector.cs | 12 ++--- .../Runtime/Material/Decal/DecalSystem.cs | 51 +++++++++++-------- .../Runtime/RenderPipeline/Utility/HDUtils.cs | 9 ++++ 5 files changed, 48 insertions(+), 30 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Decal/DecalProjectorEditor.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Decal/DecalProjectorEditor.cs index 8f7e0a840f0..2d3e741f9e6 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Decal/DecalProjectorEditor.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Decal/DecalProjectorEditor.cs @@ -259,7 +259,7 @@ void DrawHandles() { // Smoothly update the decal image projected Matrix4x4 sizeOffset = Matrix4x4.Translate(decalProjector.decalOffset) * Matrix4x4.Scale(decalProjector.decalSize); - DecalSystem.instance.UpdateCachedData(decalProjector.position, decalProjector.rotation, sizeOffset, decalProjector.drawDistance, decalProjector.fadeScale, decalProjector.uvScaleBias, decalProjector.affectsTransparency, decalProjector.Handle, decalProjector.gameObject.layer, decalProjector.fadeFactor); + DecalSystem.instance.UpdateCachedData(decalProjector.position, decalProjector.rotation, sizeOffset, decalProjector.drawDistance, decalProjector.fadeScale, decalProjector.uvScaleBias, decalProjector.affectsTransparency, decalProjector.Handle, decalProjector.gameObject.layer, HDUtils.GetSceneCullingMaskFromGameObject(decalProjector.gameObject), decalProjector.fadeFactor); } } } diff --git a/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalProjector.Migration.cs b/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalProjector.Migration.cs index da2070093f2..8c1ef20a3f2 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalProjector.Migration.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalProjector.Migration.cs @@ -37,7 +37,7 @@ enum Version if (decal.m_Handle != null) DecalSystem.instance.RemoveDecal(decal.m_Handle); Matrix4x4 sizeOffset = Matrix4x4.Translate(decal.decalOffset) * Matrix4x4.Scale(decal.decalSize); - decal.m_Handle = DecalSystem.instance.AddDecal(decal.position, decal.rotation, Vector3.one, sizeOffset, decal.m_DrawDistance, decal.m_FadeScale, decal.uvScaleBias, decal.m_AffectsTransparency, decal.m_Material, decal.gameObject.layer, decal.m_FadeFactor); + decal.m_Handle = DecalSystem.instance.AddDecal(decal.position, decal.rotation, Vector3.one, sizeOffset, decal.m_DrawDistance, decal.m_FadeScale, decal.uvScaleBias, decal.m_AffectsTransparency, decal.m_Material, decal.gameObject.layer, HDUtils.GetSceneCullingMaskFromGameObject(decal.gameObject), decal.m_FadeFactor); }), MigrationStep.New(Version.FixPivotPosition, (DecalProjector decal) => { @@ -69,7 +69,7 @@ enum Version if (decal.m_Handle != null) DecalSystem.instance.RemoveDecal(decal.m_Handle); Matrix4x4 sizeOffset = Matrix4x4.Translate(decal.decalOffset) * Matrix4x4.Scale(decal.decalSize); - decal.m_Handle = DecalSystem.instance.AddDecal(decal.position, decal.rotation, Vector3.one, sizeOffset, decal.m_DrawDistance, decal.m_FadeScale, decal.uvScaleBias, decal.m_AffectsTransparency, decal.m_Material, decal.gameObject.layer, decal.m_FadeFactor); + decal.m_Handle = DecalSystem.instance.AddDecal(decal.position, decal.rotation, Vector3.one, sizeOffset, decal.m_DrawDistance, decal.m_FadeScale, decal.uvScaleBias, decal.m_AffectsTransparency, decal.m_Material, decal.gameObject.layer, HDUtils.GetSceneCullingMaskFromGameObject(decal.gameObject), decal.m_FadeFactor); }) ); diff --git a/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalProjector.cs b/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalProjector.cs index aa381dd10c3..3706ba9ff0e 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalProjector.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalProjector.cs @@ -238,7 +238,7 @@ void OnEnable() } Matrix4x4 sizeOffset = Matrix4x4.Translate(decalOffset) * Matrix4x4.Scale(decalSize); - m_Handle = DecalSystem.instance.AddDecal(position, rotation, Vector3.one, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Material, gameObject.layer, m_FadeFactor); + m_Handle = DecalSystem.instance.AddDecal(position, rotation, Vector3.one, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Material, gameObject.layer, HDUtils.GetSceneCullingMaskFromGameObject(gameObject), m_FadeFactor); m_OldMaterial = m_Material; #if UNITY_EDITOR @@ -260,7 +260,7 @@ void UpdateDecalVisibility() else if (m_Handle == null) { Matrix4x4 sizeOffset = Matrix4x4.Translate(decalOffset) * Matrix4x4.Scale(decalSize); - m_Handle = DecalSystem.instance.AddDecal(position, rotation, Vector3.one, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Material, gameObject.layer, m_FadeFactor); + m_Handle = DecalSystem.instance.AddDecal(position, rotation, Vector3.one, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Material, gameObject.layer, HDUtils.GetSceneCullingMaskFromGameObject(gameObject), m_FadeFactor); } } #endif @@ -299,7 +299,7 @@ internal void OnValidate() if (m_Material != null) { - m_Handle = DecalSystem.instance.AddDecal(position, rotation, Vector3.one, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Material, gameObject.layer, m_FadeFactor); + m_Handle = DecalSystem.instance.AddDecal(position, rotation, Vector3.one, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Material, gameObject.layer, HDUtils.GetSceneCullingMaskFromGameObject(gameObject), m_FadeFactor); if (!DecalSystem.IsHDRenderPipelineDecal(m_Material.shader)) // non HDRP/decal shaders such as shader graph decal do not affect transparency { @@ -317,7 +317,7 @@ internal void OnValidate() } else // no material change, just update whatever else changed { - DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, m_FadeFactor); + DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, HDUtils.GetSceneCullingMaskFromGameObject(gameObject), m_FadeFactor); } } } @@ -329,7 +329,7 @@ void Update() // only run in editor { Matrix4x4 sizeOffset = Matrix4x4.Translate(decalOffset) * Matrix4x4.Scale(decalSize); m_Layer = gameObject.layer; - DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, m_FadeFactor); + DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, HDUtils.GetSceneCullingMaskFromGameObject(gameObject), m_FadeFactor); } } #endif @@ -341,7 +341,7 @@ void LateUpdate() if (transform.hasChanged == true) { Matrix4x4 sizeOffset = Matrix4x4.Translate(decalOffset) * Matrix4x4.Scale(decalSize); - DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, m_FadeFactor); + DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, HDUtils.GetSceneCullingMaskFromGameObject(gameObject), m_FadeFactor); transform.hasChanged = false; } } diff --git a/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs b/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs index 903fda5eb61..bd47b6f953f 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs @@ -422,7 +422,7 @@ private BoundingSphere GetDecalProjectBoundingSphere(Matrix4x4 decalToWorld) return res; } - public void UpdateCachedData(Matrix4x4 localToWorld, Quaternion rotation, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, DecalHandle handle, int layerMask, float fadeFactor) + public void UpdateCachedData(Matrix4x4 localToWorld, Quaternion rotation, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, DecalHandle handle, int layerMask, ulong sceneLayerMask, float fadeFactor) { int index = handle.m_Index; m_CachedDecalToWorld[index] = localToWorld * sizeOffset; @@ -448,19 +448,20 @@ public void UpdateCachedData(Matrix4x4 localToWorld, Quaternion rotation, Matrix m_CachedUVScaleBias[index] = uvScaleBias; m_CachedAffectsTransparency[index] = affectsTransparency; m_CachedLayerMask[index] = layerMask; + m_CachedSceneLayerMask[index] = sceneLayerMask; m_CachedFadeFactor[index] = fadeFactor; m_BoundingSpheres[index] = GetDecalProjectBoundingSphere(m_CachedDecalToWorld[index]); } - public void UpdateCachedData(Transform transform, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, DecalHandle handle, int layerMask, float fadeFactor) + public void UpdateCachedData(Transform transform, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, DecalHandle handle, int layerMask, ulong sceneLayerMask, float fadeFactor) { if (m_Material == null) return; - UpdateCachedData(transform.localToWorldMatrix, transform.rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, handle, layerMask, fadeFactor); + UpdateCachedData(transform.localToWorldMatrix, transform.rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, handle, layerMask, sceneLayerMask, fadeFactor); } - public DecalHandle AddDecal(Matrix4x4 localToWorld, Quaternion rotation, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, int materialID, int layerMask, float fadeFactor) + public DecalHandle AddDecal(Matrix4x4 localToWorld, Quaternion rotation, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, int materialID, int layerMask, ulong sceneLayerMask, float fadeFactor) { // increase array size if no space left if (m_DecalsCount == m_Handles.Length) @@ -473,6 +474,7 @@ public DecalHandle AddDecal(Matrix4x4 localToWorld, Quaternion rotation, Matrix4 Vector4[] newCachedUVScaleBias = new Vector4[m_DecalsCount + kDecalBlockSize]; bool[] newCachedAffectsTransparency = new bool[m_DecalsCount + kDecalBlockSize]; int[] newCachedLayerMask = new int[m_DecalsCount + kDecalBlockSize]; + ulong[] newCachedSceneLayerMask = new ulong[m_DecalsCount + kDecalBlockSize]; float[] newCachedFadeFactor = new float[m_DecalsCount + kDecalBlockSize]; m_ResultIndices = new int[m_DecalsCount + kDecalBlockSize]; @@ -484,6 +486,7 @@ public DecalHandle AddDecal(Matrix4x4 localToWorld, Quaternion rotation, Matrix4 m_CachedUVScaleBias.CopyTo(newCachedUVScaleBias, 0); m_CachedAffectsTransparency.CopyTo(newCachedAffectsTransparency, 0); m_CachedLayerMask.CopyTo(newCachedLayerMask, 0); + m_CachedSceneLayerMask.CopyTo(newCachedSceneLayerMask, 0); m_CachedFadeFactor.CopyTo(newCachedFadeFactor, 0); m_Handles = newHandles; @@ -493,13 +496,13 @@ public DecalHandle AddDecal(Matrix4x4 localToWorld, Quaternion rotation, Matrix4 m_CachedDrawDistances = newCachedDrawDistances; m_CachedUVScaleBias = newCachedUVScaleBias; m_CachedAffectsTransparency = newCachedAffectsTransparency; - m_CachedLayerMask = newCachedLayerMask; + m_CachedSceneLayerMask = newCachedSceneLayerMask; m_CachedFadeFactor = newCachedFadeFactor; } DecalHandle decalHandle = new DecalHandle(m_DecalsCount, materialID); m_Handles[m_DecalsCount] = decalHandle; - UpdateCachedData(localToWorld, rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, decalHandle, layerMask, fadeFactor); + UpdateCachedData(localToWorld, rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, decalHandle, layerMask, sceneLayerMask, fadeFactor); m_DecalsCount++; return decalHandle; } @@ -520,6 +523,7 @@ public void RemoveDecal(DecalHandle handle) m_CachedUVScaleBias[removeAtIndex] = m_CachedUVScaleBias[m_DecalsCount - 1]; m_CachedAffectsTransparency[removeAtIndex] = m_CachedAffectsTransparency[m_DecalsCount - 1]; m_CachedLayerMask[removeAtIndex] = m_CachedLayerMask[m_DecalsCount - 1]; + m_CachedSceneLayerMask[removeAtIndex] = m_CachedSceneLayerMask[m_DecalsCount - 1]; m_CachedFadeFactor[removeAtIndex] = m_CachedFadeFactor[m_DecalsCount - 1]; m_DecalsCount--; handle.m_Index = kInvalidIndex; @@ -628,14 +632,18 @@ public void CreateDrawData() AssignCurrentBatches(ref decalToWorldBatch, ref normalToWorldBatch, batchCount); Vector3 cameraPos = instance.CurrentCamera.transform.position; - Matrix4x4 worldToView = HDRenderPipeline.WorldToCamera(instance.CurrentCamera); + var camera = instance.CurrentCamera; + Matrix4x4 worldToView = HDRenderPipeline.WorldToCamera(camera); bool perChannelMask = instance.perChannelMask; + int cullingMask = camera.cullingMask; + ulong sceneCullingMask = HDUtils.GetSceneCullingMaskFromCamera(camera); + for (int resultIndex = 0; resultIndex < m_NumResults; resultIndex++) { int decalIndex = m_ResultIndices[resultIndex]; - int cullingMask = instance.CurrentCamera.cullingMask; int decalMask = 1 << m_CachedLayerMask[decalIndex]; - if ((cullingMask & decalMask) != 0) + ulong decalSceneCullingMask = m_CachedSceneLayerMask[decalIndex]; + if ((cullingMask & decalMask) != 0 && (sceneCullingMask & decalSceneCullingMask) != 0) { // do additional culling based on individual decal draw distances float distanceToDecal = (cameraPos - m_BoundingSpheres[decalIndex].position).magnitude; @@ -824,6 +832,7 @@ public int MaskBlendMode private Vector4[] m_CachedUVScaleBias = new Vector4[kDecalBlockSize]; // xy - scale, zw bias private bool[] m_CachedAffectsTransparency = new bool[kDecalBlockSize]; private int[] m_CachedLayerMask = new int[kDecalBlockSize]; + private ulong[] m_CachedSceneLayerMask = new ulong[kDecalBlockSize]; private float[] m_CachedFadeFactor = new float[kDecalBlockSize]; private Material m_Material; private MaterialPropertyBlock m_PropertyBlock = new MaterialPropertyBlock(); @@ -885,7 +894,7 @@ void SetupMipStreamingSettings(Material material, bool allMips) } } - DecalHandle AddDecal(Matrix4x4 localToWorld, Quaternion rotation, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, Material material, int layerMask, float fadeFactor) + DecalHandle AddDecal(Matrix4x4 localToWorld, Quaternion rotation, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, Material material, int layerMask, ulong sceneLayerMask, float fadeFactor) { SetupMipStreamingSettings(material, true); @@ -896,18 +905,18 @@ DecalHandle AddDecal(Matrix4x4 localToWorld, Quaternion rotation, Matrix4x4 size decalSet = new DecalSet(material); m_DecalSets.Add(key, decalSet); } - return decalSet.AddDecal(localToWorld, rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, key, layerMask, fadeFactor); + return decalSet.AddDecal(localToWorld, rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, key, layerMask, sceneLayerMask, fadeFactor); } - public DecalHandle AddDecal(Vector3 position, Quaternion rotation, Vector3 scale, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, Material material, int layerMask, float fadeFactor) + public DecalHandle AddDecal(Vector3 position, Quaternion rotation, Vector3 scale, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, Material material, int layerMask, ulong sceneLayerMask, float fadeFactor) { - return AddDecal(Matrix4x4.TRS(position, rotation, scale), rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, material, layerMask, fadeFactor); + return AddDecal(Matrix4x4.TRS(position, rotation, scale), rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, material, layerMask, sceneLayerMask, fadeFactor); } - public DecalHandle AddDecal(Transform transform, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, Material material, int layerMask, float fadeFactor) + public DecalHandle AddDecal(Transform transform, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, Material material, int layerMask, ulong sceneLayerMask, float fadeFactor) { - return AddDecal(transform.localToWorldMatrix, transform.rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, material, layerMask, fadeFactor); + return AddDecal(transform.localToWorldMatrix, transform.rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, material, layerMask, sceneLayerMask, fadeFactor); } public void RemoveDecal(DecalHandle handle) @@ -929,7 +938,7 @@ public void RemoveDecal(DecalHandle handle) } } - void UpdateCachedData(Matrix4x4 localToWorld, Quaternion rotation, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, DecalHandle handle, int layerMask, float fadeFactor) + void UpdateCachedData(Matrix4x4 localToWorld, Quaternion rotation, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, DecalHandle handle, int layerMask, ulong sceneLayerMask, float fadeFactor) { if (!DecalHandle.IsValid(handle)) return; @@ -938,18 +947,18 @@ void UpdateCachedData(Matrix4x4 localToWorld, Quaternion rotation, Matrix4x4 siz int key = handle.m_MaterialID; if (m_DecalSets.TryGetValue(key, out decalSet)) { - decalSet.UpdateCachedData(localToWorld, rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, handle, layerMask, fadeFactor); + decalSet.UpdateCachedData(localToWorld, rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, handle, layerMask, sceneLayerMask, fadeFactor); } } - public void UpdateCachedData(Vector3 position, Quaternion rotation, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, DecalHandle handle, int layerMask, float fadeFactor) + public void UpdateCachedData(Vector3 position, Quaternion rotation, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, DecalHandle handle, int layerMask, ulong sceneLayerMask, float fadeFactor) { - UpdateCachedData(Matrix4x4.TRS(position, rotation, Vector3.one), rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, handle, layerMask, fadeFactor); + UpdateCachedData(Matrix4x4.TRS(position, rotation, Vector3.one), rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, handle, layerMask, sceneLayerMask, fadeFactor); } - public void UpdateCachedData(Transform transform, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, DecalHandle handle, int layerMask, float fadeFactor) + public void UpdateCachedData(Transform transform, Matrix4x4 sizeOffset, float drawDistance, float fadeScale, Vector4 uvScaleBias, bool affectsTransparency, DecalHandle handle, int layerMask, ulong sceneLayerMask, float fadeFactor) { - UpdateCachedData(Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one)/*transform.localToWorldMatrix*/, transform.rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, handle, layerMask, fadeFactor); + UpdateCachedData(Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one)/*transform.localToWorldMatrix*/, transform.rotation, sizeOffset, drawDistance, fadeScale, uvScaleBias, affectsTransparency, handle, layerMask, sceneLayerMask, fadeFactor); } public void BeginCull(CullRequest request) { diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/HDUtils.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/HDUtils.cs index 69e5fee1443..e122a8a32fe 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/HDUtils.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/HDUtils.cs @@ -939,6 +939,15 @@ internal static UInt64 GetSceneCullingMaskFromCamera(Camera camera) } + internal static ulong GetSceneCullingMaskFromGameObject(GameObject go) + { +#if UNITY_EDITOR + return (go.scene == null) ? ~(ulong)0 : EditorSceneManager.GetSceneCullingMask(go.scene); +#else + return 0; +#endif + } + internal static HDAdditionalCameraData TryGetAdditionalCameraDataOrDefault(Camera camera) { if (camera == null || camera.Equals(null)) From 7e0752357e03142e7b0b6cf53798b31123759d2e Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Tue, 9 Jun 2020 13:59:01 +0200 Subject: [PATCH 2/3] Update changelog. --- com.unity.render-pipelines.high-definition/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.render-pipelines.high-definition/CHANGELOG.md b/com.unity.render-pipelines.high-definition/CHANGELOG.md index 95ecf55ea4f..ace54b54b33 100644 --- a/com.unity.render-pipelines.high-definition/CHANGELOG.md +++ b/com.unity.render-pipelines.high-definition/CHANGELOG.md @@ -652,6 +652,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Fix an issue with the color intensity of emissive for performance rtgi - Fixed issue with rendering being mostly broken when target platform disables VR. - Workaround an issue caused by GetKernelThreadGroupSizes failing to retrieve correct group size. +- Fixed an issue where decals were duplicated in prefab isolation mode. ### Changed - Improve MIP selection for decals on Transparents From 570bdb93dcac97df2e40ef7d74e2bb1b08535e7c Mon Sep 17 00:00:00 2001 From: Julien Ignace Date: Tue, 9 Jun 2020 18:30:49 +0200 Subject: [PATCH 3/3] Fix decals in the player. --- .../Runtime/Material/Decal/DecalSystem.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs b/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs index bd47b6f953f..edcdac53c7b 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs @@ -643,7 +643,12 @@ public void CreateDrawData() int decalIndex = m_ResultIndices[resultIndex]; int decalMask = 1 << m_CachedLayerMask[decalIndex]; ulong decalSceneCullingMask = m_CachedSceneLayerMask[decalIndex]; - if ((cullingMask & decalMask) != 0 && (sceneCullingMask & decalSceneCullingMask) != 0) + bool sceneViewCullingMaskTest = true; +#if UNITY_EDITOR + // In the player, both masks will be zero. Besides we don't want to pay the cost in this case. + sceneViewCullingMaskTest = (sceneCullingMask & decalSceneCullingMask) != 0; +#endif + if ((cullingMask & decalMask) != 0 && sceneViewCullingMaskTest) { // do additional culling based on individual decal draw distances float distanceToDecal = (cameraPos - m_BoundingSpheres[decalIndex].position).magnitude;