Skip to content

Commit da56fbd

Browse files
[Backport 8.x.x] Fixed decal duplication when editing a prefab in context (#1107)
* Implemented proper culling for decals when used in prefabs and edited in context. * Compilation fix * Update changelog Co-authored-by: sebastienlagarde <[email protected]>
1 parent 5719763 commit da56fbd

File tree

6 files changed

+17
-18
lines changed

6 files changed

+17
-18
lines changed

com.unity.render-pipelines.high-definition/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
7373
- Fixed issue with depth pyramid generation and dynamic resolution.
7474
- Fixed a serialization issue, preventing quality level parameters to undo/redo and update scene view on change.
7575
- Fixed an issue where opening the look dev window with the light theme would make the window blink and eventually crash unity.
76+
- Fixed culling for decals when used in prefabs and edited in context.
7677

7778
### Changed
7879
- Shadowmask and realtime reflection probe property are hide in Quality settings

com.unity.render-pipelines.high-definition/Editor/Material/Decal/DecalProjectorEditor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ void DrawHandles()
259259
{
260260
// Smoothly update the decal image projected
261261
Matrix4x4 sizeOffset = Matrix4x4.Translate(decalProjector.decalOffset) * Matrix4x4.Scale(decalProjector.decalSize);
262-
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);
262+
DecalSystem.instance.UpdateCachedData(decalProjector.position, decalProjector.rotation, sizeOffset, decalProjector.drawDistance, decalProjector.fadeScale, decalProjector.uvScaleBias, decalProjector.affectsTransparency, decalProjector.Handle, decalProjector.gameObject.layer, decalProjector.gameObject.sceneCullingMask, decalProjector.fadeFactor);
263263
}
264264
}
265265
}

com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalProjector.Migration.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ enum Version
3737
if (decal.m_Handle != null)
3838
DecalSystem.instance.RemoveDecal(decal.m_Handle);
3939
Matrix4x4 sizeOffset = Matrix4x4.Translate(decal.decalOffset) * Matrix4x4.Scale(decal.decalSize);
40-
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);
40+
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.gameObject.sceneCullingMask, decal.m_FadeFactor);
4141
}),
4242
MigrationStep.New(Version.FixPivotPosition, (DecalProjector decal) =>
4343
{
@@ -69,7 +69,7 @@ enum Version
6969
if (decal.m_Handle != null)
7070
DecalSystem.instance.RemoveDecal(decal.m_Handle);
7171
Matrix4x4 sizeOffset = Matrix4x4.Translate(decal.decalOffset) * Matrix4x4.Scale(decal.decalSize);
72-
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);
72+
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.gameObject.sceneCullingMask, decal.m_FadeFactor);
7373
})
7474
);
7575

com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalProjector.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ void OnEnable()
238238
}
239239

240240
Matrix4x4 sizeOffset = Matrix4x4.Translate(decalOffset) * Matrix4x4.Scale(decalSize);
241-
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);
241+
m_Handle = DecalSystem.instance.AddDecal(position, rotation, Vector3.one, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Material, gameObject.layer, gameObject.sceneCullingMask, m_FadeFactor);
242242
m_OldMaterial = m_Material;
243243

244244
#if UNITY_EDITOR
@@ -260,7 +260,13 @@ void UpdateDecalVisibility()
260260
else if (m_Handle == null)
261261
{
262262
Matrix4x4 sizeOffset = Matrix4x4.Translate(decalOffset) * Matrix4x4.Scale(decalSize);
263-
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);
263+
m_Handle = DecalSystem.instance.AddDecal(position, rotation, Vector3.one, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Material, gameObject.layer, gameObject.sceneCullingMask, m_FadeFactor);
264+
}
265+
else
266+
{
267+
// Scene culling mask may have changed.
268+
Matrix4x4 sizeOffset = Matrix4x4.Translate(decalOffset) * Matrix4x4.Scale(decalSize);
269+
DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, gameObject.sceneCullingMask, m_FadeFactor);
264270
}
265271
}
266272
#endif
@@ -299,7 +305,7 @@ internal void OnValidate()
299305

300306
if (m_Material != null)
301307
{
302-
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);
308+
m_Handle = DecalSystem.instance.AddDecal(position, rotation, Vector3.one, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Material, gameObject.layer, gameObject.sceneCullingMask, m_FadeFactor);
303309

304310
if (!DecalSystem.IsHDRenderPipelineDecal(m_Material.shader)) // non HDRP/decal shaders such as shader graph decal do not affect transparency
305311
{
@@ -317,7 +323,7 @@ internal void OnValidate()
317323
}
318324
else // no material change, just update whatever else changed
319325
{
320-
DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, HDUtils.GetSceneCullingMaskFromGameObject(gameObject), m_FadeFactor);
326+
DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, gameObject.sceneCullingMask, m_FadeFactor);
321327
}
322328
}
323329
}
@@ -329,7 +335,7 @@ void Update() // only run in editor
329335
{
330336
Matrix4x4 sizeOffset = Matrix4x4.Translate(decalOffset) * Matrix4x4.Scale(decalSize);
331337
m_Layer = gameObject.layer;
332-
DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, HDUtils.GetSceneCullingMaskFromGameObject(gameObject), m_FadeFactor);
338+
DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, gameObject.sceneCullingMask, m_FadeFactor);
333339
}
334340
}
335341
#endif
@@ -341,7 +347,7 @@ void LateUpdate()
341347
if (transform.hasChanged == true)
342348
{
343349
Matrix4x4 sizeOffset = Matrix4x4.Translate(decalOffset) * Matrix4x4.Scale(decalSize);
344-
DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, HDUtils.GetSceneCullingMaskFromGameObject(gameObject), m_FadeFactor);
350+
DecalSystem.instance.UpdateCachedData(position, rotation, sizeOffset, m_DrawDistance, m_FadeScale, uvScaleBias, m_AffectsTransparency, m_Handle, gameObject.layer, gameObject.sceneCullingMask, m_FadeFactor);
345351
transform.hasChanged = false;
346352
}
347353
}

com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalSystem.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,7 @@ public DecalHandle AddDecal(Matrix4x4 localToWorld, Quaternion rotation, Matrix4
496496
m_CachedDrawDistances = newCachedDrawDistances;
497497
m_CachedUVScaleBias = newCachedUVScaleBias;
498498
m_CachedAffectsTransparency = newCachedAffectsTransparency;
499+
m_CachedLayerMask = newCachedLayerMask;
499500
m_CachedSceneLayerMask = newCachedSceneLayerMask;
500501
m_CachedFadeFactor = newCachedFadeFactor;
501502
}

com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/HDUtils.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -942,15 +942,6 @@ internal static UInt64 GetSceneCullingMaskFromCamera(Camera camera)
942942

943943
}
944944

945-
internal static ulong GetSceneCullingMaskFromGameObject(GameObject go)
946-
{
947-
#if UNITY_EDITOR
948-
return (go.scene == null) ? ~(ulong)0 : EditorSceneManager.GetSceneCullingMask(go.scene);
949-
#else
950-
return 0;
951-
#endif
952-
}
953-
954945
internal static HDAdditionalCameraData TryGetAdditionalCameraDataOrDefault(Camera camera)
955946
{
956947
if (camera == null || camera.Equals(null))

0 commit comments

Comments
 (0)