From 2a53e8a2afbaa93ef9e17ee0ecd4eb40fe4ba9ac Mon Sep 17 00:00:00 2001 From: Chris Chu Date: Wed, 2 Apr 2025 17:12:04 +0000 Subject: [PATCH 01/28] [UUM-100007] Shadows from Shadow Caster 2D using 2D Colliders show incorrectly when tiles are removed at runtime --- .../Runtime/2D/Shadows/ShadowProvider/ShadowMesh2D.cs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Shadows/ShadowProvider/ShadowMesh2D.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Shadows/ShadowProvider/ShadowMesh2D.cs index 3d5899d5b44..a0c9a165228 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Shadows/ShadowProvider/ShadowMesh2D.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Shadows/ShadowProvider/ShadowMesh2D.cs @@ -318,8 +318,11 @@ bool AreDegenerateVertices(NativeArray vertices) public override void SetShape(NativeArray vertices, NativeArray indices, ShadowShape2D.OutlineTopology outlineTopology, ShadowShape2D.WindingOrder windingOrder = ShadowShape2D.WindingOrder.Clockwise, bool allowTrimming = true, bool createInteriorGeometry = false) { - if (AreDegenerateVertices(vertices)) + if (AreDegenerateVertices(vertices) || indices == null || indices.Length == 0) + { + m_Mesh.Clear(); return; + } if (m_TrimEdge == k_TrimEdgeUninitialized) m_TrimEdge = m_InitialTrim; @@ -333,12 +336,6 @@ public override void SetShape(NativeArray vertices, NativeArray in if (m_Mesh == null) m_Mesh = new Mesh(); - if (indices.Length == 0) - { - m_Mesh.Clear(); - return; - } - if (outlineTopology == ShadowShape2D.OutlineTopology.Triangles) { NativeArray newVertices; From 50a1d319ff43be0a24c5cde43269916809f678d1 Mon Sep 17 00:00:00 2001 From: Kenny Tan Date: Wed, 2 Apr 2025 17:12:04 +0000 Subject: [PATCH 02/28] [UUM-100776] [6000.2] Fix Pixel Perfect error in rendergraph 2d --- .../Runtime/2D/Renderer2D.cs | 3 +-- .../Runtime/2D/Rendergraph/Renderer2DRendergraph.cs | 7 ++++++- .../Runtime/UniversalRenderer.cs | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs index a29331be976..2ddce56534c 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Renderer2D.cs @@ -177,12 +177,11 @@ private RenderPassInputSummary GetRenderPassInputs(UniversalCameraData cameraDat || !cameraData.isDefaultViewport || cameraData.requireSrgbConversion || !cameraData.resolveFinalTarget + || cameraData.cameraTargetDescriptor.msaaSamples > 1 && UniversalRenderer.PlatformRequiresExplicitMsaaResolve() || m_Renderer2DData.useCameraSortingLayerTexture || !Mathf.Approximately(cameraData.renderScale, 1.0f) || (DebugHandler != null && DebugHandler.WriteToDebugScreenTexture(cameraData.resolveFinalTarget)); - inputSummary.requiresDepthTexture |= (!cameraData.resolveFinalTarget && m_UseDepthStencilBuffer); - return inputSummary; } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs index 0ffc6c62799..acd0603683e 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/2D/Rendergraph/Renderer2DRendergraph.cs @@ -61,7 +61,12 @@ private RTHandle nextRenderGraphCameraColorHandle private bool IsPixelPerfectCameraEnabled(UniversalCameraData cameraData) { - cameraData.camera.TryGetComponent(out var ppc); + PixelPerfectCamera ppc = null; + + // Pixel Perfect Camera doesn't support camera stacking. + if (cameraData.renderType == CameraRenderType.Base && cameraData.resolveFinalTarget) + cameraData.camera.TryGetComponent(out ppc); + return ppc != null && ppc.enabled && ppc.cropFrame != PixelPerfectCamera.CropFrame.None; } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs index 240405c6d22..f8778f10393 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs @@ -1893,7 +1893,7 @@ void CreateCameraRenderTarget(ScriptableRenderContext context, ref RenderTexture cmd.Clear(); } - bool PlatformRequiresExplicitMsaaResolve() + internal static bool PlatformRequiresExplicitMsaaResolve() { #if UNITY_EDITOR // In the editor play-mode we use a Game View Render Texture, with From ce0e2b394329be5684aafed32ba005fb330d1d38 Mon Sep 17 00:00:00 2001 From: Rose Hirigoyen Date: Thu, 3 Apr 2025 05:16:04 +0000 Subject: [PATCH 03/28] UUM-86099 Imported texture not cleared on first use --- .../Compiler/NativePassCompiler.cs | 48 +++++++----- .../RenderGraphResourceRegistry.cs | 42 ++++++++--- .../Tests/Editor/RenderGraphTests.cs | 74 ++++++++++++++++--- 3 files changed, 125 insertions(+), 39 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.cs index 4a7c581a9e0..b23c7e8d2f2 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/NativePassCompiler.cs @@ -118,7 +118,7 @@ internal enum NativeCompilerProfileId NRPRGComp_TryMergeNativePasses, NRPRGComp_FindResourceUsageRanges, NRPRGComp_DetectMemorylessResources, - NRPRGComp_ExecuteCreateResources, + NRPRGComp_ExecuteInitializeResources, NRPRGComp_ExecuteBeginRenderpassCommand, NRPRGComp_ExecuteDestroyResources, } @@ -731,10 +731,9 @@ internal static bool IsSameNativeSubPass(ref SubPassDescriptor a, ref SubPassDes return true; } - - private void ExecuteCreateRessource(InternalRenderGraphContext rgContext, RenderGraphResourceRegistry resources, in PassData pass) + private void ExecuteInitializeResource(InternalRenderGraphContext rgContext, RenderGraphResourceRegistry resources, in PassData pass) { - using (new ProfilingScope(ProfilingSampler.Get(NativeCompilerProfileId.NRPRGComp_ExecuteCreateResources))) + using (new ProfilingScope(ProfilingSampler.Get(NativeCompilerProfileId.NRPRGComp_ExecuteInitializeResources))) { resources.forceManualClearOfResource = true; @@ -749,15 +748,23 @@ private void ExecuteCreateRessource(InternalRenderGraphContext rgContext, Render foreach (ref readonly var res in subPass.FirstUsedResources(contextData)) { ref readonly var resInfo = ref contextData.UnversionedResourceData(res); - if (resInfo.isImported == false && resInfo.memoryLess == false) + if (!resInfo.memoryLess) { - bool usedAsFragmentThisPass = subPass.IsUsedAsFragment(res, contextData); + if (!resInfo.isImported) + { + bool usedAsFragmentThisPass = subPass.IsUsedAsFragment(res, contextData); - // This resource is read for the first time as a regular texture and not as a framebuffer attachment - // so we need to explicitly clear it, as loadAction.clear only works on framebuffer attachments - // TODO: Should this be a performance warning?? Maybe rare enough in practice? - resources.forceManualClearOfResource = !usedAsFragmentThisPass; - resources.CreatePooledResource(rgContext, res.iType, res.index); + // This resource is read for the first time as a regular texture and not as a framebuffer attachment + // so we need to explicitly clear it, as loadAction.clear only works on framebuffer attachments + // TODO: Should this be a performance warning?? Maybe rare enough in practice? + resources.forceManualClearOfResource = !usedAsFragmentThisPass; + resources.CreatePooledResource(rgContext, res.iType, res.index); + } + else // Imported resource + { + if (resInfo.clear) + resources.ClearResource(rgContext, res.iType, res.index); + } } } } @@ -769,10 +776,15 @@ private void ExecuteCreateRessource(InternalRenderGraphContext rgContext, Render foreach (ref readonly var create in pass.FirstUsedResources(contextData)) { ref readonly var pointTo = ref contextData.UnversionedResourceData(create); - if (pointTo.isImported == false) + if (!pointTo.isImported) { resources.CreatePooledResource(rgContext, create.iType, create.index); } + else // Imported resource + { + if (pointTo.clear) + resources.ClearResource(rgContext, create.iType, create.index); + } } } @@ -1067,7 +1079,7 @@ void DetermineLoadStoreActions(ref NativePassData nativePass) { // Depth attachment always comes first if existing bool isDepthAttachment = (nativePass.hasDepth && nativePass.attachments.size == 0); - + // For color attachment, we only discard the MSAA buffers and keep the resolve texture // This is a design decision due to the restrictive ImportResourceParams API, it could be revised later storeAction = isDepthAttachment @@ -1103,7 +1115,7 @@ void DetermineLoadStoreActions(ref NativePassData nativePass) throw new Exception("Resource was marked as memoryless but is trying to store or resolve."); #endif } - + var newAttachment = new NativePassAttachment( handle, loadAction, @@ -1112,7 +1124,7 @@ void DetermineLoadStoreActions(ref NativePassData nativePass) mipLevel, depthSlice ); - + nativePass.attachments.Add(newAttachment); } } @@ -1204,7 +1216,7 @@ internal unsafe void ExecuteBeginRenderPass(InternalRenderGraphContext rgContext ValidateAttachment(renderTargetInfo, resources, width, height, samples, isVrs); ref var currBeginAttachment = ref m_BeginRenderPassAttachments.ElementAt(i); - currBeginAttachment = new AttachmentDescriptor(renderTargetInfo.format); + currBeginAttachment = new AttachmentDescriptor(renderTargetInfo.format); // Set up the RT pointers if (attachments[i].memoryless == false) @@ -1429,7 +1441,7 @@ public void ExecuteGraph(InternalRenderGraphContext rgContext, RenderGraphResour var isRaster = pass.type == RenderGraphPassType.Raster; - ExecuteCreateRessource(rgContext, resources, pass); + ExecuteInitializeResource(rgContext, resources, pass); var isAsyncCompute = pass.type == RenderGraphPassType.Compute && pass.asyncCompute == true; if (isAsyncCompute) @@ -1553,4 +1565,4 @@ public void ExecuteGraph(InternalRenderGraphContext rgContext, RenderGraphResour } } } -} \ No newline at end of file +} diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs index 4b6a3d9be56..b5442e49916 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphResourceRegistry.cs @@ -13,7 +13,7 @@ namespace UnityEngine.Rendering.RenderGraphModule /// /// Basic properties of a RTHandle needed by the render graph compiler. It is not always possible to derive these /// given an RTHandle so the user needs to pass these in. - /// + /// /// We don't use a full RenderTargetDescriptor here as filling out a full descriptor may not be trivial for users and not all /// members of the descriptor are actually used by the render graph. This struct is the minimum set of info needed by the render graph. /// If you want to develop some utility framework to work with render textures, etc. it's probably better to use RenderTargetDescriptor. @@ -91,7 +91,7 @@ internal static RenderGraphResourceRegistry current m_CurrentRegistry = value; } } - + delegate bool ResourceCreateCallback(InternalRenderGraphContext rgContext, IRenderGraphResource res); delegate void ResourceCallback(InternalRenderGraphContext rgContext, IRenderGraphResource res); @@ -550,12 +550,12 @@ internal TextureHandle ImportTexture(in RTHandle rt, RenderTargetInfo info, in I // Store the info in the descriptor structure to avoid having a separate info structure being saved per resource // This descriptor will then be used to reconstruct the info (see GetRenderTargetInfo) but is not a full featured descriptor. // This is ok as this descriptor will never be used to create textures (as they are imported into the graph and thus externally created). - + texResource.desc.format = info.format; texResource.desc.width = info.width; texResource.desc.height = info.height; texResource.desc.slices = info.volumeDepth; - texResource.desc.msaaSamples = (MSAASamples)info.msaaSamples; + texResource.desc.msaaSamples = (MSAASamples)info.msaaSamples; texResource.desc.bindTextureMS = info.bindMS; texResource.desc.clearBuffer = importParams.clearOnFirstUse; texResource.desc.clearColor = importParams.clearColor; @@ -761,7 +761,7 @@ internal void GetRenderTargetInfo(in ResourceHandle res, out RenderTargetInfo ou // so we just say we don't know what this rt is and rely on the user passing in the info to us. var desc = GetTextureResourceDesc(res, true); #if DEVELOPMENT_BUILD || UNITY_EDITOR - if (desc.width == 0 || desc.height == 0 || desc.slices == 0 || desc.msaaSamples == 0 || desc.format == GraphicsFormat.None) + if (desc.width == 0 || desc.height == 0 || desc.slices == 0 || desc.msaaSamples == 0 || desc.format == GraphicsFormat.None) { throw new Exception("Invalid imported texture. A RTHandle wrapping an RenderTargetIdentifier was imported without providing valid RenderTargetInfo."); } @@ -791,13 +791,13 @@ internal void GetRenderTargetInfo(in ResourceHandle res, out RenderTargetInfo ou outInfo.msaaSamples = (int)desc.msaaSamples; outInfo.bindMS = desc.bindTextureMS; - outInfo.format = desc.format; + outInfo.format = desc.format; } } internal GraphicsFormat GetFormat(GraphicsFormat color, GraphicsFormat depthStencil) { - ValidateFormat(color, depthStencil); + ValidateFormat(color, depthStencil); return (depthStencil != GraphicsFormat.None) ? depthStencil : color; } @@ -1066,17 +1066,35 @@ bool CreateTextureCallback(InternalRenderGraphContext rgContext, IRenderGraphRes #endif bool executedWork = false; + if ((forceManualClearOfResource && resource.desc.clearBuffer) || m_RenderGraphDebug.clearRenderTargetsAtCreation) { - bool debugClear = m_RenderGraphDebug.clearRenderTargetsAtCreation && !resource.desc.clearBuffer; - var clearFlag = GraphicsFormatUtility.IsDepthStencilFormat(resource.desc.format) ? ClearFlag.DepthStencil : ClearFlag.Color; - var clearColor = debugClear ? Color.magenta : resource.desc.clearColor; - CoreUtils.SetRenderTarget(rgContext.cmd, resource.graphicsResource, clearFlag, clearColor); + ClearTexture(rgContext, resource); executedWork = true; } return executedWork; } + internal void ClearResource(InternalRenderGraphContext rgContext, int type, int index) + { + var resource = m_RenderGraphResources[type].resourceArray[index]; + + // Only TextureResource for now, but we expect to want to handle other types of resources in the future + if (resource is TextureResource textureResource) + { + ClearTexture(rgContext, textureResource); + } + } + + private void ClearTexture(InternalRenderGraphContext rgContext, TextureResource resource) + { + if (resource == null) return; + var debugClear = m_RenderGraphDebug.clearRenderTargetsAtCreation && !resource.desc.clearBuffer; + var clearFlag = GraphicsFormatUtility.IsDepthStencilFormat(resource.desc.format) ? ClearFlag.DepthStencil : ClearFlag.Color; + var clearColor = debugClear ? Color.magenta : resource.desc.clearColor; + CoreUtils.SetRenderTarget(rgContext.cmd, resource.graphicsResource, clearFlag, clearColor); + } + internal void ReleasePooledResource(InternalRenderGraphContext rgContext, int type, int index) { var resource = m_RenderGraphResources[type].resourceArray[index]; @@ -1139,7 +1157,7 @@ void ValidateTextureDesc(in TextureDesc desc) } } - // Bind ms textures need to use the ms texture sampling functions so there is no "silent" fallback or interoperability between a "non-ms texture" and an "ms texture which happens to have 1 sample" + // Bind ms textures need to use the ms texture sampling functions so there is no "silent" fallback or interoperability between a "non-ms texture" and an "ms texture which happens to have 1 sample" // it's either ms with > 1 sample or "normal texture". This is unlike array textures where you can have an array with 1 slice. if ((int)desc.msaaSamples <= 1 && desc.bindTextureMS == true) { diff --git a/Packages/com.unity.render-pipelines.core/Tests/Editor/RenderGraphTests.cs b/Packages/com.unity.render-pipelines.core/Tests/Editor/RenderGraphTests.cs index cd783e957c8..bdeae2c97d0 100644 --- a/Packages/com.unity.render-pipelines.core/Tests/Editor/RenderGraphTests.cs +++ b/Packages/com.unity.render-pipelines.core/Tests/Editor/RenderGraphTests.cs @@ -812,7 +812,7 @@ public void TextureDescFormatPropertiesWork() var importedDesc = importedTexture.GetDescriptor(m_RenderGraph); Assert.AreEqual(textureDesc.format, importedDesc.format); - } + } textureDesc.colorFormat = formatR32; Assert.AreEqual(textureDesc.depthBufferBits, DepthBits.None); @@ -823,7 +823,7 @@ public void TextureDescFormatPropertiesWork() var importedDesc = importedTexture.GetDescriptor(m_RenderGraph); Assert.AreEqual(textureDesc.format, importedDesc.format); - } + } } [Test] @@ -920,7 +920,7 @@ public void RenderPassWithNoRenderFuncThrows() { builder.AllowPassCulling(false); - // no render func + // no render func } }; LogAssert.Expect(LogType.Error, "Render Graph Execution error"); @@ -991,11 +991,66 @@ class RenderGraphAsyncRequestTestData public NativeArray pixels; } - private bool m_AsyncReadbackDone = false; + [Test] + public void ImportedTexturesAreClearedOnFirstUse() + { + bool asyncReadbackDone = false; + const int kWidth = 4; + const int kHeight = 4; + const GraphicsFormat format = GraphicsFormat.R8G8B8A8_SRGB; + + NativeArray pixels = default; + + m_RenderGraphTestPipeline.recordRenderGraphBody = (context, camera, cmd) => + { + var redTexture = CreateRedTexture(kWidth, kHeight); + ImportResourceParams importParams = new ImportResourceParams() + { + clearColor = Color.blue, clearOnFirstUse = true + }; + var importedTexture = m_RenderGraph.ImportTexture(redTexture, importParams); + + pixels = new NativeArray(kWidth * kHeight * 4, Allocator.Persistent, + NativeArrayOptions.UninitializedMemory); + + using (var builder = + m_RenderGraph.AddUnsafePass("ImportedTextureTest", out var passData)) + { + builder.AllowPassCulling(false); + builder.UseTexture(importedTexture, AccessFlags.ReadWrite); + + passData.texture = importedTexture; + passData.pixels = pixels; + + builder.SetRenderFunc((RenderGraphAsyncRequestTestData data, UnsafeGraphContext context) => + { + context.cmd.RequestAsyncReadbackIntoNativeArray(ref data.pixels, data.texture, 0, format, + request => RenderGraphTest_AsyncReadbackCallback(request, ref asyncReadbackDone)); + }); + } + }; + + m_Camera.Render(); + + AsyncGPUReadback.WaitAllRequests(); + Assert.True(asyncReadbackDone); + + // Texture should be clear color instead of original red color + for (int i = 0; i < kWidth * kHeight; i += 4) + { + Assert.True(pixels[i] / 255.0f == Color.blue.r); + Assert.True(pixels[i + 1] / 255.0f == Color.blue.g); + Assert.True(pixels[i + 2] / 255.0f == Color.blue.b); + Assert.True(pixels[i + 3] / 255.0f == Color.blue.a); + } + + pixels.Dispose(); + } [Test] public void RequestAsyncReadbackIntoNativeArrayWorks() { + bool asyncReadbackDone = false; const int kWidth = 4; const int kHeight = 4; const GraphicsFormat format = GraphicsFormat.R8G8B8A8_SRGB; @@ -1027,7 +1082,8 @@ public void RequestAsyncReadbackIntoNativeArrayWorks() builder.SetRenderFunc((RenderGraphAsyncRequestTestData data, UnsafeGraphContext context) => { - context.cmd.RequestAsyncReadbackIntoNativeArray(ref data.pixels, data.texture, 0, format, RenderGraphTest_AsyncReadbackCallback); + context.cmd.RequestAsyncReadbackIntoNativeArray(ref data.pixels, data.texture, 0, format, + request => RenderGraphTest_AsyncReadbackCallback(request, ref asyncReadbackDone)); }); } }; @@ -1036,7 +1092,7 @@ public void RequestAsyncReadbackIntoNativeArrayWorks() AsyncGPUReadback.WaitAllRequests(); - Assert.True(m_AsyncReadbackDone); + Assert.True(asyncReadbackDone); for (int i = 0; i < kWidth * kHeight; i += 4) { @@ -1049,16 +1105,16 @@ public void RequestAsyncReadbackIntoNativeArrayWorks() pixels.Dispose(); } - void RenderGraphTest_AsyncReadbackCallback(AsyncGPUReadbackRequest request) + void RenderGraphTest_AsyncReadbackCallback(AsyncGPUReadbackRequest request, ref bool asyncReadbackDone) { if (request.hasError) { // We shouldn't have any error, asserting. - Assert.True(m_AsyncReadbackDone); + Assert.True(asyncReadbackDone); } else if (request.done) { - m_AsyncReadbackDone = true; + asyncReadbackDone = true; } } From 4a4db1e1768bced4167e419c704cf206da13fef9 Mon Sep 17 00:00:00 2001 From: Rose Hirigoyen Date: Thu, 3 Apr 2025 05:16:06 +0000 Subject: [PATCH 04/28] UUM-98558 GBuffers should be created before injection point --- .../Runtime/DeferredLights.cs | 46 ++++++++++++++----- .../Runtime/Passes/GBufferPass.cs | 45 +++--------------- .../Runtime/UniversalRenderer.cs | 4 ++ .../Runtime/UniversalRendererRenderGraph.cs | 7 ++- 4 files changed, 52 insertions(+), 50 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/DeferredLights.cs b/Packages/com.unity.render-pipelines.universal/Runtime/DeferredLights.cs index c5cb7d4edd5..3249ac5f6e5 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/DeferredLights.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/DeferredLights.cs @@ -219,10 +219,6 @@ internal GraphicsFormat GetGBufferFormat(int index) internal GraphicsFormat[] GbufferFormats { get; set; } internal RTHandle DepthAttachmentHandle { get; set; } - // Render Graph only. - // True if GBuffer pass has previously been recorded this frame. If false, GBuffers might not contain valid data. - internal bool IsGBufferValid { get; set; } - // Visible lights indices rendered using stencil volumes. NativeArray m_stencilVisLights; // Offset of each type of lights in m_stencilVisLights. @@ -429,10 +425,6 @@ internal void ResolveMixedLightingMode(UniversalLightData lightData) } } } - // Once the mixed lighting mode has been discovered, we know how many MRTs we need for the gbuffer. - // Subtractive mixed lighting requires shadowMask output, which is actually used to store unity_ProbesOcclusion values. - - CreateGbufferResources(); } // In cases when custom pass is injected between GBuffer and Deferred passes we need to fallback @@ -494,6 +486,39 @@ internal void CreateGbufferResources() } } + internal void CreateGbufferResourcesRenderGraph(RenderGraph renderGraph, UniversalResourceData resourceData) + { + int gbufferSliceCount = GBufferSliceCount; + if (GbufferTextureHandles == null || GbufferTextureHandles.Length != gbufferSliceCount) + { + GbufferFormats = new GraphicsFormat[gbufferSliceCount]; + GbufferTextureHandles = new TextureHandle[gbufferSliceCount]; + } + + bool useCameraRenderingLayersTexture = UseRenderingLayers && !UseLightLayers; + Debug.Assert(resourceData.cameraColor.IsValid(), "Deferred Renderer assumes that the intermediate (color) texture is available."); + + for (int i = 0; i < gbufferSliceCount; ++i) + { + GbufferFormats[i] = GetGBufferFormat(i); + + if (i == GBufferNormalSmoothnessIndex && HasNormalPrepass) + GbufferTextureHandles[i] = resourceData.cameraNormalsTexture; + else if (i == GBufferRenderingLayers && useCameraRenderingLayersTexture) + GbufferTextureHandles[i] = resourceData.renderingLayersTexture; + else if (i != GBufferLightingIndex) + { + var gbufferSlice = resourceData.cameraColor.GetDescriptor(renderGraph); + gbufferSlice.format = GetGBufferFormat(i); + gbufferSlice.name = k_GBufferNames[i]; + gbufferSlice.clearBuffer = true; + GbufferTextureHandles[i] = renderGraph.CreateTexture(gbufferSlice); + } + else + GbufferTextureHandles[i] = resourceData.cameraColor; + } + } + internal void UpdateDeferredInputAttachments() { this.DeferredInputAttachments[0] = this.GbufferAttachments[0]; @@ -565,7 +590,6 @@ public void Setup( internal void Setup(AdditionalLightsShadowCasterPass additionalLightsShadowCasterPass) { m_AdditionalLightsShadowCasterPass = additionalLightsShadowCasterPass; - IsGBufferValid = false; } public void OnCameraCleanup(CommandBuffer cmd) @@ -665,10 +689,10 @@ internal void ExecuteDeferredPass(RasterCommandBuffer cmd, UniversalCameraData c if (!UseFramebufferFetch) { Material deferredMaterial = m_UseDeferredPlus ? m_ClusterDeferredMaterial : m_StencilDeferredMaterial; - for (int i = 0; i < GbufferTextureHandles.Length; i++) + for (int i = 0; i < GbufferRTHandles.Length; i++) { if (i != GBufferLightingIndex) - deferredMaterial.SetTexture(k_GBufferShaderPropertyIDs[i], GbufferTextureHandles[i]); + deferredMaterial.SetTexture(k_GBufferShaderPropertyIDs[i], GbufferRTHandles[i]); } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs index db569365561..97aa109ebb4 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/Passes/GBufferPass.cs @@ -233,44 +233,13 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur bool useCameraRenderingLayersTexture = m_DeferredLights.UseRenderingLayers && !m_DeferredLights.UseLightLayers; passData.gbuffer = m_DeferredLights.GbufferTextureHandles; - - // If the gbuffer targets are already set up, then assume we are setting up for the second gbuffer pass when doing two-pass occlusion culling. - // We want to continue to render to the same targets as the first pass in this case, so just attach them for this pass. - if (m_DeferredLights.IsGBufferValid) - { - for (int i = 0; i < m_DeferredLights.GBufferSliceCount; i++) - { - builder.SetRenderAttachment(passData.gbuffer[i], i, AccessFlags.Write); - } - } - else + for (int i = 0; i < m_DeferredLights.GBufferSliceCount; i++) { - for (int i = 0; i < m_DeferredLights.GBufferSliceCount; i++) - { - var gbufferSlice = cameraData.cameraTargetDescriptor; - gbufferSlice.depthStencilFormat = GraphicsFormat.None; // make sure no depth surface is actually created - gbufferSlice.stencilFormat = GraphicsFormat.None; - - if (i == m_DeferredLights.GBufferNormalSmoothnessIndex && m_DeferredLights.HasNormalPrepass) - passData.gbuffer[i] = resourceData.cameraNormalsTexture; - else if (i == m_DeferredLights.GBufferRenderingLayers && useCameraRenderingLayersTexture) - passData.gbuffer[i] = resourceData.renderingLayersTexture; - else if (i != m_DeferredLights.GBufferLightingIndex) - { - gbufferSlice.graphicsFormat = m_DeferredLights.GetGBufferFormat(i); - passData.gbuffer[i] = UniversalRenderer.CreateRenderGraphTexture(renderGraph, gbufferSlice, DeferredLights.k_GBufferNames[i], true); - } - else - passData.gbuffer[i] = cameraColor; - - builder.SetRenderAttachment(passData.gbuffer[i], i, AccessFlags.Write); - } - - m_DeferredLights.IsGBufferValid = true; + Debug.Assert(passData.gbuffer[i].IsValid()); + builder.SetRenderAttachment(passData.gbuffer[i], i, AccessFlags.Write); } - RenderGraphUtils.UseDBufferIfValid(builder, resourceData); - resourceData.gBuffer = passData.gbuffer; + RenderGraphUtils.UseDBufferIfValid(builder, resourceData); passData.depth = cameraDepth; builder.SetRenderAttachmentDepth(cameraDepth, AccessFlags.Write); @@ -279,8 +248,8 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur InitRendererLists(ref passData, default(ScriptableRenderContext), renderGraph, renderingData, cameraData, lightData, true); builder.UseRendererList(passData.rendererListHdl); builder.UseRendererList(passData.objectsWithErrorRendererListHdl); - - if (setGlobalTextures) + + if (setGlobalTextures) { builder.SetGlobalTextureAfterPass(resourceData.cameraNormalsTexture, s_CameraNormalsTextureID); @@ -292,7 +261,7 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur builder.SetRenderFunc((PassData data, RasterGraphContext context) => { - ExecutePass(context.cmd, data, data.rendererListHdl, data.objectsWithErrorRendererListHdl); + ExecutePass(context.cmd, data, data.rendererListHdl, data.objectsWithErrorRendererListHdl); }); } } diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs index f8778f10393..8c771d6e81d 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs @@ -811,6 +811,10 @@ public override void Setup(ScriptableRenderContext context, ref RenderingData re m_DeferredLights.ResolveMixedLightingMode(lightData); + // Once the mixed lighting mode has been discovered, we know how many MRTs we need for the gbuffer. + // Subtractive mixed lighting requires shadowMask output, which is actually used to store unity_ProbesOcclusion values. + m_DeferredLights.CreateGbufferResources(); + if (m_DeferredLights.UseFramebufferFetch) { // At this point we only have injected renderer features in the queue and can do assumptions on whether we'll need Framebuffer Fetch diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs index 584d2335bc8..22798d3eec5 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs @@ -392,7 +392,7 @@ private readonly struct ClearCameraParams internal readonly bool mustClearColor; internal readonly bool mustClearDepth; internal readonly Color clearValue; - + internal ClearCameraParams(bool clearColor, bool clearDepth, Color clearVal) { mustClearColor = clearColor; @@ -1084,6 +1084,11 @@ private void OnMainRendering(RenderGraph renderGraph, ScriptableRenderContext co m_DeferredLights.HasNormalPrepass = isDepthNormalPrepass; m_DeferredLights.HasDepthPrepass = requiresPrepass; m_DeferredLights.ResolveMixedLightingMode(lightData); + // Once the mixed lighting mode has been discovered, we know how many MRTs we need for the gbuffer. + // Subtractive mixed lighting requires shadowMask output, which is actually used to store unity_ProbesOcclusion values. + m_DeferredLights.CreateGbufferResourcesRenderGraph(renderGraph, resourceData); + resourceData.gBuffer = m_DeferredLights.GbufferTextureHandles; + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.BeforeRenderingGbuffer); From 1b0d07f89199bcc4955f92a1c33b183be0d1906c Mon Sep 17 00:00:00 2001 From: Venkatesh Subramania Pillai Date: Thu, 3 Apr 2025 05:16:08 +0000 Subject: [PATCH 05/28] [2d] IN-97875 Editor crashes on PrepareSpriteTilingData when exiting Play mode --- .../Assets/Scenes/086_SpriteAtlas.meta | 8 + .../Assets/Scenes/086_SpriteAtlas.unity | 1681 +++++++++++++++++ .../Assets/Scenes/086_SpriteAtlas.unity.meta | 7 + .../086_SpriteAtlas/LoadFromResource.cs | 40 + .../086_SpriteAtlas/LoadFromResource.cs.meta | 11 + .../Scenes/086_SpriteAtlas/Resources.meta | 8 + .../Resources/Fire.spriteatlasv2 | 16 + .../Resources/Fire.spriteatlasv2.meta | 30 + .../Resources/FireVariant.spriteatlasv2 | 16 + .../Resources/FireVariant.spriteatlasv2.meta | 30 + .../Resources/Gems.spriteatlasv2 | 16 + .../Resources/Gems.spriteatlasv2.meta | 30 + .../Resources/Paintings.spriteatlasv2 | 16 + .../Resources/Paintings.spriteatlasv2.meta | 30 + .../Scenes/086_SpriteAtlas/Sprites.meta | 8 + .../086_SpriteAtlas/Sprites/Gem_Atlas.png | Bin 0 -> 99405 bytes .../Sprites/Gem_Atlas.png.meta | 338 ++++ .../Sprites/Sprite_Fire_Additive.png | Bin 0 -> 92009 bytes .../Sprites/Sprite_Fire_Additive.png.meta | 302 +++ .../Sprites/Sprite_wall_paintings.png | Bin 0 -> 85183 bytes .../Sprites/Sprite_wall_paintings.png.meta | 287 +++ 21 files changed, 2874 insertions(+) create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas.unity create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas.unity.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/LoadFromResource.cs create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/LoadFromResource.cs.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Fire.spriteatlasv2 create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Fire.spriteatlasv2.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/FireVariant.spriteatlasv2 create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/FireVariant.spriteatlasv2.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Gems.spriteatlasv2 create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Gems.spriteatlasv2.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Paintings.spriteatlasv2 create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Paintings.spriteatlasv2.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Gem_Atlas.png create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Gem_Atlas.png.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Sprite_Fire_Additive.png create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Sprite_Fire_Additive.png.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Sprite_wall_paintings.png create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Sprite_wall_paintings.png.meta diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas.meta new file mode 100644 index 00000000000..a78af6081b8 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d63616377f7bcf848951c979c29f3a65 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas.unity b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas.unity new file mode 100644 index 00000000000..6758870ebce --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas.unity @@ -0,0 +1,1681 @@ +%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: 10 + 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: 3 + 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_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + 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_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_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + 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 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &19107634 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 19107636} + - component: {fileID: 19107635} + m_Layer: 0 + m_Name: Gem_Atlas_1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &19107635 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19107634} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: -5452404639209050584, guid: 0ec5b29f4ed9ac84685e5c344282c0bf, + type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1.07, y: 1.17} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &19107636 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19107634} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2.5, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &89943473 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 89943475} + - component: {fileID: 89943474} + m_Layer: 0 + m_Name: Sprite_Fire_Additive_2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &89943474 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 89943473} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 652107442, guid: b07c028762ba2f24ab2aae8c19afcedb, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1.72, y: 2.38} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 2 + m_SpriteSortPoint: 0 +--- !u!4 &89943475 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 89943473} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.765, y: -0.49, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 625315505} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &213842765 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 213842767} + - component: {fileID: 213842766} + m_Layer: 0 + m_Name: Sprite_Fire_Additive_0 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &213842766 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 213842765} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: -1383448332, guid: b07c028762ba2f24ab2aae8c19afcedb, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1.57, y: 2.14} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 2 + m_SpriteSortPoint: 0 +--- !u!4 &213842767 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 213842765} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &325433473 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 325433475} + - component: {fileID: 325433474} + m_Layer: 0 + m_Name: wall_paintings_0 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &325433474 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 325433473} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 1570768037, guid: cce1ffd4828d03348b19e94ba66be4c3, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1.09375, y: 1.6015625} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &325433475 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 325433473} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &358425489 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 358425491} + - component: {fileID: 358425490} + m_Layer: 0 + m_Name: Gem_Atlas_0 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &358425490 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 358425489} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 8483082138732512798, guid: 0ec5b29f4ed9ac84685e5c344282c0bf, + type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1.22, y: 1.2} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &358425491 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 358425489} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &625315503 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 625315505} + - component: {fileID: 625315504} + m_Layer: 0 + m_Name: Mask + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!331 &625315504 +SpriteMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 625315503} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 15d0c3709176029428a0da2f8cecf0b5, 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_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 1026716091, guid: cce1ffd4828d03348b19e94ba66be4c3, type: 3} + m_MaskAlphaCutoff: 0.2 + m_FrontSortingLayerID: 0 + m_BackSortingLayerID: 0 + m_FrontSortingLayer: 0 + m_BackSortingLayer: 0 + m_FrontSortingOrder: 0 + m_BackSortingOrder: 0 + m_IsCustomRangeActive: 0 + m_SpriteSortPoint: 0 + m_MaskSource: 0 +--- !u!4 &625315505 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 625315503} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.03, y: 0.98, z: 0} + m_LocalScale: {x: 2, y: 2, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 882542524} + - {fileID: 89943475} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &710067197 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 710067199} + - component: {fileID: 710067198} + m_Layer: 0 + m_Name: Sprite_Fire_Additive_3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &710067198 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 710067197} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 131858358, guid: b07c028762ba2f24ab2aae8c19afcedb, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1.9, y: 2.53} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &710067199 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 710067197} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &810519564 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 810519566} + - component: {fileID: 810519565} + m_Layer: 0 + m_Name: Gem_Atlas_5 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &810519565 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 810519564} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 6086253875049130666, guid: 0ec5b29f4ed9ac84685e5c344282c0bf, + type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1.24, y: 1.19} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &810519566 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 810519564} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &882542522 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 882542524} + - component: {fileID: 882542523} + m_Layer: 0 + m_Name: Sprite_Fire_Additive_1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &882542523 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 882542522} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 2060993720, guid: b07c028762ba2f24ab2aae8c19afcedb, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1.78, y: 2.52} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 1 + m_SpriteSortPoint: 0 +--- !u!4 &882542524 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 882542522} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.735, y: -0.49, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 625315505} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &912241775 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 912241777} + - component: {fileID: 912241776} + m_Layer: 0 + m_Name: Gem_Atlas_3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &912241776 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 912241775} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: -1058190115970830684, guid: 0ec5b29f4ed9ac84685e5c344282c0bf, + type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1.2, y: 1.07} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &912241777 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 912241775} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1296061818 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1296061820} + - component: {fileID: 1296061819} + m_Layer: 0 + m_Name: Gem_Atlas_2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &1296061819 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1296061818} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: -1073606098527010786, guid: 0ec5b29f4ed9ac84685e5c344282c0bf, + type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1.13, y: 1.15} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &1296061820 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1296061818} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1367921646 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1367921648} + - component: {fileID: 1367921647} + m_Layer: 0 + m_Name: wall_paintings_1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &1367921647 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1367921646} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 1347333780, guid: cce1ffd4828d03348b19e94ba66be4c3, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 1 + m_Size: {x: 2, y: 2} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &1367921648 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1367921646} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.5, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1452826193 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1452826195} + - component: {fileID: 1452826194} + m_Layer: 0 + m_Name: Gem_Atlas_4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &1452826194 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1452826193} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: -7278019675062726547, guid: 0ec5b29f4ed9ac84685e5c344282c0bf, + type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1.18, y: 1.05} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &1452826195 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1452826193} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.5, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1627176518 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1627176520} + - component: {fileID: 1627176519} + m_Layer: 0 + m_Name: wall_paintings_2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &1627176519 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1627176518} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: -1020006118, guid: cce1ffd4828d03348b19e94ba66be4c3, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 2 + m_Size: {x: 2, y: 2} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 1 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &1627176520 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1627176518} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.5, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1765486088 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1765486090} + - component: {fileID: 1765486089} + m_Layer: 0 + m_Name: wall_paintings_3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &1765486089 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1765486088} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 1026716091, guid: cce1ffd4828d03348b19e94ba66be4c3, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1.8828125, y: 1.015625} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &1765486090 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1765486088} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4, y: -3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2103671723 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2103671727} + - component: {fileID: 2103671726} + - component: {fileID: 2103671725} + - component: {fileID: 2103671724} + - component: {fileID: 2103671728} + - component: {fileID: 2103671729} + 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 &2103671724 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2103671723} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 +--- !u!81 &2103671725 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2103671723} + m_Enabled: 1 +--- !u!20 &2103671726 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2103671723} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 1} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + 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: 1 + orthographic size: 5 + m_Depth: 0 + 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 &2103671727 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2103671723} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2103671728 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2103671723} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 73231aa468d81ea49bc3d914080de185, type: 3} + m_Name: + m_EditorClassIdentifier: + ImageComparisonSettings: + TargetWidth: 1280 + TargetHeight: 720 + TargetMSAASamples: 1 + PerPixelCorrectnessThreshold: 0.001 + PerPixelGammaThreshold: 0.003921569 + PerPixelAlphaThreshold: 0.003921569 + RMSEThreshold: 0 + AverageCorrectnessThreshold: 0.005 + IncorrectPixelsThreshold: 0.0000038146973 + UseHDR: 0 + UseBackBuffer: 0 + ImageResolution: 2 + ActiveImageTests: 1 + ActivePixelTests: -1 + WaitFrames: 0 + XRCompatible: 0 + gpuDrivenCompatible: 1 + CheckMemoryAllocation: 0 + renderBackendCompatibility: 2 + SetBackBufferResolution: 0 +--- !u!114 &2103671729 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2103671723} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0d91d872554d0444a9ebbb8f43ca3775, type: 3} + m_Name: + m_EditorClassIdentifier: Universal2DGraphicsTests::LoadFromResource +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 2103671727} + - {fileID: 358425491} + - {fileID: 19107636} + - {fileID: 1296061820} + - {fileID: 912241777} + - {fileID: 1452826195} + - {fileID: 810519566} + - {fileID: 213842767} + - {fileID: 710067199} + - {fileID: 325433475} + - {fileID: 1367921648} + - {fileID: 1627176520} + - {fileID: 1765486090} + - {fileID: 625315505} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas.unity.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas.unity.meta new file mode 100644 index 00000000000..46b6d27eb71 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5f981f02c2fc4ef4f9ff3fda036a736f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/LoadFromResource.cs b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/LoadFromResource.cs new file mode 100644 index 00000000000..9644106e361 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/LoadFromResource.cs @@ -0,0 +1,40 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.U2D; + +public class LoadFromResource : MonoBehaviour +{ + void OnEnable() + { + SpriteAtlasManager.atlasRequested += RequestLateBindingAtlas; + SpriteAtlasManager.atlasRegistered += AtlasRegistered; + } + + void OnDisable() + { + SpriteAtlasManager.atlasRequested -= RequestLateBindingAtlas; + SpriteAtlasManager.atlasRegistered -= AtlasRegistered; + } + + void RequestLateBindingAtlas(string tag, System.Action callback) + { + if (tag == "Fire") + { + var sa = UnityEngine.Resources.Load("FireVariant"); + callback(sa); + } + else if (tag == "Paintings") + { + var sa = UnityEngine.Resources.Load("Paintings"); + callback(sa); + } + else + Debug.Log("Error: Late binding callback with wrong atlas tag of " + tag); + } + + void AtlasRegistered(SpriteAtlas spriteAtlas) + { + Debug.LogFormat("Registered {0}.", spriteAtlas.name); + } +} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/LoadFromResource.cs.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/LoadFromResource.cs.meta new file mode 100644 index 00000000000..affbe75b327 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/LoadFromResource.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0d91d872554d0444a9ebbb8f43ca3775 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources.meta new file mode 100644 index 00000000000..8bafc535554 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 46c6c3baecfd95c4893923f4578ba393 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Fire.spriteatlasv2 b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Fire.spriteatlasv2 new file mode 100644 index 00000000000..1a86ba19f9f --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Fire.spriteatlasv2 @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!612988286 &1 +SpriteAtlasAsset: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + serializedVersion: 2 + m_MasterAtlas: {fileID: 0} + m_ImporterData: + packables: + - {fileID: 2800000, guid: b07c028762ba2f24ab2aae8c19afcedb, type: 3} + m_IsVariant: 0 + m_ScriptablePacker: {fileID: 0} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Fire.spriteatlasv2.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Fire.spriteatlasv2.meta new file mode 100644 index 00000000000..a138e29e3a5 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Fire.spriteatlasv2.meta @@ -0,0 +1,30 @@ +fileFormatVersion: 2 +guid: 7853358911666c447add3fb6a8c01810 +SpriteAtlasImporter: + externalObjects: {} + textureSettings: + serializedVersion: 2 + anisoLevel: 1 + compressionQuality: 50 + maxTextureSize: 2048 + textureCompression: 0 + filterMode: 1 + generateMipMaps: 0 + readable: 0 + crunchedCompression: 0 + sRGB: 1 + platformSettings: [] + packingSettings: + serializedVersion: 2 + padding: 4 + blockOffset: 1 + allowAlphaSplitting: 0 + enableRotation: 1 + enableTightPacking: 1 + enableAlphaDilation: 0 + secondaryTextureSettings: {} + variantMultiplier: 1 + bindAsDefault: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/FireVariant.spriteatlasv2 b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/FireVariant.spriteatlasv2 new file mode 100644 index 00000000000..7e94708a0bb --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/FireVariant.spriteatlasv2 @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!612988286 &1 +SpriteAtlasAsset: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + serializedVersion: 2 + m_MasterAtlas: {fileID: 100100200, guid: 7853358911666c447add3fb6a8c01810, type: 3} + m_ImporterData: + packables: + - {fileID: 2800000, guid: b07c028762ba2f24ab2aae8c19afcedb, type: 3} + m_IsVariant: 1 + m_ScriptablePacker: {fileID: 0} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/FireVariant.spriteatlasv2.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/FireVariant.spriteatlasv2.meta new file mode 100644 index 00000000000..fed686f3cd3 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/FireVariant.spriteatlasv2.meta @@ -0,0 +1,30 @@ +fileFormatVersion: 2 +guid: fdb0810a7dc52f14d87a574d5ee1a66c +SpriteAtlasImporter: + externalObjects: {} + textureSettings: + serializedVersion: 2 + anisoLevel: 1 + compressionQuality: 50 + maxTextureSize: 2048 + textureCompression: 0 + filterMode: 1 + generateMipMaps: 0 + readable: 0 + crunchedCompression: 0 + sRGB: 1 + platformSettings: [] + packingSettings: + serializedVersion: 2 + padding: 4 + blockOffset: 1 + allowAlphaSplitting: 0 + enableRotation: 1 + enableTightPacking: 1 + enableAlphaDilation: 0 + secondaryTextureSettings: {} + variantMultiplier: 0.25 + bindAsDefault: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Gems.spriteatlasv2 b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Gems.spriteatlasv2 new file mode 100644 index 00000000000..6ad87fc2376 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Gems.spriteatlasv2 @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!612988286 &1 +SpriteAtlasAsset: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + serializedVersion: 2 + m_MasterAtlas: {fileID: 0} + m_ImporterData: + packables: + - {fileID: 2800000, guid: 0ec5b29f4ed9ac84685e5c344282c0bf, type: 3} + m_IsVariant: 0 + m_ScriptablePacker: {fileID: 0} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Gems.spriteatlasv2.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Gems.spriteatlasv2.meta new file mode 100644 index 00000000000..a57e8a58d99 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Gems.spriteatlasv2.meta @@ -0,0 +1,30 @@ +fileFormatVersion: 2 +guid: 641bd12886c112c4a96b38aab7b752df +SpriteAtlasImporter: + externalObjects: {} + textureSettings: + serializedVersion: 2 + anisoLevel: 1 + compressionQuality: 50 + maxTextureSize: 2048 + textureCompression: 0 + filterMode: 0 + generateMipMaps: 0 + readable: 0 + crunchedCompression: 0 + sRGB: 1 + platformSettings: [] + packingSettings: + serializedVersion: 2 + padding: 4 + blockOffset: 1 + allowAlphaSplitting: 0 + enableRotation: 1 + enableTightPacking: 1 + enableAlphaDilation: 0 + secondaryTextureSettings: {} + variantMultiplier: 1 + bindAsDefault: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Paintings.spriteatlasv2 b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Paintings.spriteatlasv2 new file mode 100644 index 00000000000..9b74569ee15 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Paintings.spriteatlasv2 @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!612988286 &1 +SpriteAtlasAsset: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + serializedVersion: 2 + m_MasterAtlas: {fileID: 0} + m_ImporterData: + packables: + - {fileID: 2800000, guid: cce1ffd4828d03348b19e94ba66be4c3, type: 3} + m_IsVariant: 0 + m_ScriptablePacker: {fileID: 0} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Paintings.spriteatlasv2.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Paintings.spriteatlasv2.meta new file mode 100644 index 00000000000..cd86ebc6ff8 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Resources/Paintings.spriteatlasv2.meta @@ -0,0 +1,30 @@ +fileFormatVersion: 2 +guid: 82f58a60ef06da946ad346dda5845bc6 +SpriteAtlasImporter: + externalObjects: {} + textureSettings: + serializedVersion: 2 + anisoLevel: 1 + compressionQuality: 50 + maxTextureSize: 2048 + textureCompression: 0 + filterMode: 1 + generateMipMaps: 0 + readable: 0 + crunchedCompression: 0 + sRGB: 1 + platformSettings: [] + packingSettings: + serializedVersion: 2 + padding: 4 + blockOffset: 1 + allowAlphaSplitting: 0 + enableRotation: 1 + enableTightPacking: 1 + enableAlphaDilation: 0 + secondaryTextureSettings: {} + variantMultiplier: 1 + bindAsDefault: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites.meta new file mode 100644 index 00000000000..8afe06bd1ce --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f4745dada299ee346886d0a5ceb3bd73 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Gem_Atlas.png b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Gem_Atlas.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a98e79df45ffae5347b18ed34761aa31078395 GIT binary patch literal 99405 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 JF6*2UngC`r_U-@x literal 0 HcmV?d00001 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Gem_Atlas.png.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Gem_Atlas.png.meta new file mode 100644 index 00000000000..fc50cee1566 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Gem_Atlas.png.meta @@ -0,0 +1,338 @@ +fileFormatVersion: 2 +guid: 0ec5b29f4ed9ac84685e5c344282c0bf +TextureImporter: + internalIDToNameTable: + - first: + 213: 8483082138732512798 + second: Gem_Atlas_0 + - first: + 213: -5452404639209050584 + second: Gem_Atlas_1 + - first: + 213: -1073606098527010786 + second: Gem_Atlas_2 + - first: + 213: -1058190115970830684 + second: Gem_Atlas_3 + - first: + 213: -7278019675062726547 + second: Gem_Atlas_4 + - first: + 213: 6086253875049130666 + second: Gem_Atlas_5 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: CloudRendering + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Switch + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: GameCoreXboxOne + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: GameCoreScarlett + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: Gem_Atlas_0 + rect: + serializedVersion: 2 + x: 3 + y: 249 + width: 122 + height: 120 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: e16cc978246f9b570800000000000000 + internalID: 8483082138732512798 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Gem_Atlas_1 + rect: + serializedVersion: 2 + x: 138 + y: 252 + width: 107 + height: 117 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: 82ea0446eda2554b0800000000000000 + internalID: -5452404639209050584 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Gem_Atlas_2 + rect: + serializedVersion: 2 + x: 7 + y: 129 + width: 113 + height: 115 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: e10ca9c01f8c911f0800000000000000 + internalID: -1073606098527010786 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Gem_Atlas_3 + rect: + serializedVersion: 2 + x: 132 + y: 133 + width: 120 + height: 107 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: 4aeaab032bd8051f0800000000000000 + internalID: -1058190115970830684 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Gem_Atlas_4 + rect: + serializedVersion: 2 + x: 5 + y: 9 + width: 118 + height: 105 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: d6015978aa74ffa90800000000000000 + internalID: -7278019675062726547 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Gem_Atlas_5 + rect: + serializedVersion: 2 + x: 130 + y: 2 + width: 124 + height: 119 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: aaae52b27a7b67450800000000000000 + internalID: 6086253875049130666 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: + Gem_Atlas_0: 8483082138732512798 + Gem_Atlas_1: -5452404639209050584 + Gem_Atlas_2: -1073606098527010786 + Gem_Atlas_3: -1058190115970830684 + Gem_Atlas_4: -7278019675062726547 + Gem_Atlas_5: 6086253875049130666 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Sprite_Fire_Additive.png b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Sprite_Fire_Additive.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec2f8a21f8600a351deb38b27394c2e552ff793 GIT binary patch literal 92009 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 literal 0 HcmV?d00001 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Sprite_Fire_Additive.png.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Sprite_Fire_Additive.png.meta new file mode 100644 index 00000000000..cb35bdf623e --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Sprite_Fire_Additive.png.meta @@ -0,0 +1,302 @@ +fileFormatVersion: 2 +guid: b07c028762ba2f24ab2aae8c19afcedb +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 2 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: CloudRendering + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Switch + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: GameCoreXboxOne + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: GameCoreScarlett + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: Sprite_Fire_Additive_0 + rect: + serializedVersion: 2 + x: 72 + y: 265 + width: 157 + height: 214 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b104135ae5d43514a9d4ae07fd74cada + internalID: -1383448332 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Sprite_Fire_Additive_1 + rect: + serializedVersion: 2 + x: 301 + y: 258 + width: 178 + height: 252 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4fd6658a3cb353b4e97e401b911f4694 + internalID: 2060993720 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Sprite_Fire_Additive_2 + rect: + serializedVersion: 2 + x: 35 + y: 11 + width: 172 + height: 238 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 63a17d19b68525d4a98500e7d772ab4b + internalID: 652107442 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: Sprite_Fire_Additive_3 + rect: + serializedVersion: 2 + x: 279 + y: 10 + width: 190 + height: 253 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ed3672787f35b4448b81fe5a7301c0e5 + internalID: 131858358 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: + - key: SpriteEditor.SliceSettings + value: '{"sliceOnImport":false,"gridCellCount":{"x":1.0,"y":1.0},"gridSpriteSize":{"x":64.0,"y":64.0},"gridSpriteOffset":{"x":0.0,"y":0.0},"gridSpritePadding":{"x":0.0,"y":0.0},"pivot":{"x":0.0,"y":0.0},"autoSlicingMethod":0,"spriteAlignment":0,"slicingType":0,"keepEmptyRects":false,"isAlternate":false}' + nameFileIdTable: + Sprite_Fire_Additive_0: -1383448332 + Sprite_Fire_Additive_1: 2060993720 + Sprite_Fire_Additive_2: 652107442 + Sprite_Fire_Additive_3: 131858358 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Sprite_wall_paintings.png b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/086_SpriteAtlas/Sprites/Sprite_wall_paintings.png new file mode 100644 index 0000000000000000000000000000000000000000..16bb3718238ce65519e42aefce7e33e4dbcca1f3 GIT binary patch literal 85183 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 Date: Thu, 3 Apr 2025 05:16:11 +0000 Subject: [PATCH 06/28] Fix editor console error - Missing APV data asset --- .../Lighting/ProbeVolume/ProbeVolumeBuildProcessor.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeBuildProcessor.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeBuildProcessor.cs index 62805d21890..65552dc6aaf 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeBuildProcessor.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeBuildProcessor.cs @@ -150,7 +150,11 @@ public override void PrepareForBuild(BuildPlayerContext buildPlayerContext) IncludeStreamableAsset(scenario.Value.cellOptionalDataAsset, basePath, useStreamingAsset); else StripStreambleAsset(scenario.Value.cellOptionalDataAsset); - IncludeStreamableAsset(scenario.Value.cellProbeOcclusionDataAsset, basePath, useStreamingAsset); + + if (bakingSet.bakedProbeOcclusion) + IncludeStreamableAsset(scenario.Value.cellProbeOcclusionDataAsset, basePath, useStreamingAsset); + else + StripStreambleAsset(scenario.Value.cellProbeOcclusionDataAsset); } s_BakingSetsProcessedLastBuild.Add(bakingSet); From bddec3251482a70dfebdd3208406481cd099ce91 Mon Sep 17 00:00:00 2001 From: Mark Green Date: Thu, 3 Apr 2025 05:16:11 +0000 Subject: [PATCH 07/28] DOCG-6799 DOCG- 6812 Sky occlusion docs updates --- .../Documentation~/probevolumes-skyocclusion.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-skyocclusion.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-skyocclusion.md index 0124c58c3b5..dfd4a3bc593 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-skyocclusion.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/probevolumes-skyocclusion.md @@ -15,6 +15,12 @@ At runtime, when a static or dynamic GameObject samples an Adaptive Probe Volume - A sky color from the ambient probe, which updates when the sky color changes. - The sky occlusion value, which is static. +## Limitations + +When Unity calculates sky occlusion values, Unity treats the surfaces of GameObjects as opaque and a gray color. As a result, transparent or translucent GameObjects like windows or leaves bounce light away instead of transmitting it through. Also, dark-colored walls reflect the same amount of light as light-colored walls. To minimize lighting issues, disable **Contribute GI** in the [**Static Editor Flags** property](xref:um-static-objects) for transparent or translucent GameObjects. + +To override the gray color Unity uses, go to **Sky Occlusion Settings** in the [Adaptive Probe Volumes panel](probevolumes-lighting-panel-reference.html#sky-occlusion-settings) and adjust **Albedo Override**. + ## Enable sky occlusion First, enable the GPU lightmapper. Unity doesn't support sky occlusion if you use **Progressive CPU** instead. From 4dbf1164bfa475758388a765897a830c6c522a1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Carr=C3=A8re?= Date: Thu, 3 Apr 2025 05:16:12 +0000 Subject: [PATCH 08/28] Fix Markdown table --- .../Documentation~/Light-Component.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Light-Component.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Light-Component.md index 6ed657b6865..aaa53ef5b24 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/Light-Component.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/Light-Component.md @@ -39,8 +39,6 @@ To make a Light work with the **Animation window**, when you click on the **Add -| **- Flare Tint** | Controls the tint of the flare of the celestial body. | -| **- Flare Multiplier** | Multiplier applied on the flare intensity. | HDRP allows you to use a RenderTexture as a light cookie. However, for the sake of performance, if you make any changes to the RenderTexture, HDRP doesn't automatically update the cookie atlas. To notify the system that the RenderTexture content has changed and so make the system upload the change to the cookie atlas, call `IncrementUpdateCount()` on the RenderTexture. If you don't do this, the system doesn't update the cookie. ## Preset From dde9428940e146823edf50781f7684b4465e285e Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Thu, 3 Apr 2025 05:16:14 +0000 Subject: [PATCH 09/28] UUM101193 - Using Burst static methods instead of Burst IJob.Run in GRD for main thread tasks. --- .../Runtime/GPUDriven/GPUResidentDrawer.cs | 130 +------ .../GPUDriven/GPUResidentDrawerBurst.cs | 80 ++++ .../GPUDriven/GPUResidentDrawerBurst.cs.meta | 2 + .../Runtime/GPUDriven/InstanceCuller.cs | 38 +- .../Runtime/GPUDriven/InstanceCullerBurst.cs | 22 ++ .../GPUDriven/InstanceCullerBurst.cs.meta | 2 + .../GPUDriven/InstanceCullingBatcher.cs | 353 +----------------- .../GPUDriven/InstanceCullingBatcherBurst.cs | 309 +++++++++++++++ .../InstanceCullingBatcherBurst.cs.meta | 2 + .../InstanceData/InstanceDataSystem.Jobs.cs | 218 ----------- .../InstanceData/InstanceDataSystem.cs | 17 +- .../InstanceData/InstanceDataSystemBurst.cs | 195 ++++++++++ .../InstanceDataSystemBurst.cs.meta | 2 + .../Runtime/GPUDriven/LODGroupDataPool.cs | 106 +----- .../GPUDriven/LODGroupDataPoolBurst.cs | 72 ++++ .../GPUDriven/LODGroupDataPoolBurst.cs.meta | 2 + 16 files changed, 724 insertions(+), 826 deletions(-) create mode 100644 Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawerBurst.cs create mode 100644 Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawerBurst.cs.meta create mode 100644 Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullerBurst.cs create mode 100644 Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullerBurst.cs.meta create mode 100644 Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullingBatcherBurst.cs create mode 100644 Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullingBatcherBurst.cs.meta create mode 100644 Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystemBurst.cs create mode 100644 Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystemBurst.cs.meta create mode 100644 Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/LODGroupDataPoolBurst.cs create mode 100644 Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/LODGroupDataPoolBurst.cs.meta diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawer.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawer.cs index 1c459a8e22a..1b7c36dc77e 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawer.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawer.cs @@ -534,7 +534,7 @@ private void UpdateSelection() rendererIDs[i] = renderers[i] ? renderers[i].GetInstanceID() : 0; m_Batcher.UpdateSelectedRenderers(rendererIDs); - + rendererIDs.Dispose(); Profiler.EndSample(); @@ -630,7 +630,7 @@ private void PostPostLateUpdate() UpdateSelection(); m_IsSelectionDirty = false; } - + m_FrameUpdateNeeded = false; #endif } @@ -830,14 +830,8 @@ private void ClassifyMaterials(NativeArray materials, out NativeList u if (materials.Length > 0) { - new ClassifyMaterialsJob - { - materialIDs = materials.AsReadOnly(), - batchMaterialHash = m_Batcher.instanceCullingBatcher.batchMaterialHash.AsReadOnly(), - unsupportedMaterialIDs = unsupportedMaterials, - supportedMaterialIDs = supportedMaterials, - supportedPackedMaterialDatas = supportedPackedMaterialDatas - }.Run(); + GPUResidentDrawerBurst.ClassifyMaterials(materials, m_Batcher.instanceCullingBatcher.batchMaterialHash.AsReadOnly(), + ref supportedMaterials, ref unsupportedMaterials, ref supportedPackedMaterialDatas); } } @@ -847,13 +841,8 @@ private NativeList FindUnsupportedRenderers(NativeArray unsupportedMat if (unsupportedMaterials.Length > 0) { - new FindUnsupportedRenderersJob - { - unsupportedMaterials = unsupportedMaterials.AsReadOnly(), - materialIDArrays = m_BatchersContext.sharedInstanceData.materialIDArrays, - rendererGroups = m_BatchersContext.sharedInstanceData.rendererGroupIDs, - unsupportedRenderers = unsupportedRenderers, - }.Run(); + GPUResidentDrawerBurst.FindUnsupportedRenderers(unsupportedMaterials, m_BatchersContext.sharedInstanceData.materialIDArrays, + m_BatchersContext.sharedInstanceData.rendererGroupIDs, ref unsupportedRenderers); } return unsupportedRenderers; @@ -863,13 +852,8 @@ private NativeHashSet GetMaterialsWithChangedPackedMaterial(NativeArray filteredMaterials = new NativeHashSet(materials.Length, allocator); - new GetMaterialsWithChangedPackedMaterialJob - { - materialIDs = materials.AsReadOnly(), - packedMaterialDatas = packedMaterialDatas.AsReadOnly(), - packedMaterialHash = batcher.instanceCullingBatcher.packedMaterialHash.AsReadOnly(), - filteredMaterials = filteredMaterials - }.Run(); + GPUResidentDrawerBurst.GetMaterialsWithChangedPackedMaterial(materials, packedMaterialDatas, + batcher.instanceCullingBatcher.packedMaterialHash.AsReadOnly(), ref filteredMaterials); return filteredMaterials; } @@ -892,79 +876,6 @@ private NativeList FindRenderersFromMaterials(NativeArray sortedExclud return renderers; } - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] - private struct ClassifyMaterialsJob : IJob - { - [ReadOnly] public NativeParallelHashMap.ReadOnly batchMaterialHash; - [ReadOnly] public NativeArray.ReadOnly materialIDs; - - public NativeList supportedMaterialIDs; - public NativeList unsupportedMaterialIDs; - public NativeList supportedPackedMaterialDatas; - - public void Execute() - { - var usedMaterialIDs = new NativeList(4, Allocator.TempJob); - - foreach (var materialID in materialIDs) - { - if (batchMaterialHash.ContainsKey(materialID)) - usedMaterialIDs.Add(materialID); - } - - if (usedMaterialIDs.IsEmpty) - { - usedMaterialIDs.Dispose(); - return; - } - - unsupportedMaterialIDs.Resize(usedMaterialIDs.Length, NativeArrayOptions.UninitializedMemory); - supportedMaterialIDs.Resize(usedMaterialIDs.Length, NativeArrayOptions.UninitializedMemory); - supportedPackedMaterialDatas.Resize(usedMaterialIDs.Length, NativeArrayOptions.UninitializedMemory); - - int unsupportedMaterialCount = GPUDrivenProcessor.ClassifyMaterials(usedMaterialIDs.AsArray(), unsupportedMaterialIDs.AsArray(), supportedMaterialIDs.AsArray(), supportedPackedMaterialDatas.AsArray()); - - unsupportedMaterialIDs.Resize(unsupportedMaterialCount, NativeArrayOptions.ClearMemory); - supportedMaterialIDs.Resize(usedMaterialIDs.Length - unsupportedMaterialCount, NativeArrayOptions.ClearMemory); - supportedPackedMaterialDatas.Resize(supportedMaterialIDs.Length, NativeArrayOptions.ClearMemory); - - usedMaterialIDs.Dispose(); - } - } - - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] - private struct FindUnsupportedRenderersJob : IJob - { - [ReadOnly] public NativeArray.ReadOnly unsupportedMaterials; - [ReadOnly] public NativeArray.ReadOnly materialIDArrays; - [ReadOnly] public NativeArray.ReadOnly rendererGroups; - - public NativeList unsupportedRenderers; - - public unsafe void Execute() - { - if (unsupportedMaterials.Length == 0) - return; - - for (int arrayIndex = 0; arrayIndex < materialIDArrays.Length; arrayIndex++) - { - var materialIDs = materialIDArrays[arrayIndex]; - int rendererID = rendererGroups[arrayIndex]; - - for (int i = 0; i < materialIDs.Length; i++) - { - int materialID = materialIDs[i]; - - if (unsupportedMaterials.Contains(materialID)) - { - unsupportedRenderers.Add(rendererID); - break; - } - } - } - } - } - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] private unsafe struct FindRenderersFromMaterialJob : IJobParallelForBatch { @@ -1008,30 +919,5 @@ public void Execute(int startIndex, int count) selectedRenderGroups.AddRangeNoResize(renderersToAddPtr, renderersToAdd.Length); } } - - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] - private struct GetMaterialsWithChangedPackedMaterialJob : IJob - { - [ReadOnly] public NativeArray.ReadOnly materialIDs; - [ReadOnly] public NativeArray.ReadOnly packedMaterialDatas; - [ReadOnly] public NativeParallelHashMap.ReadOnly packedMaterialHash; - - [WriteOnly] public NativeHashSet filteredMaterials; - - public void Execute() - { - for (int index = 0; index < materialIDs.Length ; index++) - { - var materialID = materialIDs[index]; - var newPackedMaterialData = packedMaterialDatas[index]; - - // Has its packed material changed? If the material isn't in the packed material cache, consider the material has changed. - if (packedMaterialHash.TryGetValue(materialID, out var packedMaterial) && packedMaterial.Equals(newPackedMaterialData)) - continue; - - filteredMaterials.Add(materialID); - } - } - } } } diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawerBurst.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawerBurst.cs new file mode 100644 index 00000000000..ddb0db8c566 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawerBurst.cs @@ -0,0 +1,80 @@ +using Unity.Collections; +using UnityEngine.Rendering; +using Unity.Burst; + +namespace UnityEngine.Rendering +{ + [BurstCompile] + internal static class GPUResidentDrawerBurst + { + [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] + public static void ClassifyMaterials(in NativeArray materialIDs, in NativeParallelHashMap.ReadOnly batchMaterialHash, + ref NativeList supportedMaterialIDs, ref NativeList unsupportedMaterialIDs, ref NativeList supportedPackedMaterialDatas) + { + var usedMaterialIDs = new NativeList(4, Allocator.Temp); + + foreach (var materialID in materialIDs) + { + if (batchMaterialHash.ContainsKey(materialID)) + usedMaterialIDs.Add(materialID); + } + + if (usedMaterialIDs.IsEmpty) + { + usedMaterialIDs.Dispose(); + return; + } + + unsupportedMaterialIDs.Resize(usedMaterialIDs.Length, NativeArrayOptions.UninitializedMemory); + supportedMaterialIDs.Resize(usedMaterialIDs.Length, NativeArrayOptions.UninitializedMemory); + supportedPackedMaterialDatas.Resize(usedMaterialIDs.Length, NativeArrayOptions.UninitializedMemory); + + int unsupportedMaterialCount = GPUDrivenProcessor.ClassifyMaterials(usedMaterialIDs.AsArray(), unsupportedMaterialIDs.AsArray(), supportedMaterialIDs.AsArray(), supportedPackedMaterialDatas.AsArray()); + + unsupportedMaterialIDs.Resize(unsupportedMaterialCount, NativeArrayOptions.ClearMemory); + supportedMaterialIDs.Resize(usedMaterialIDs.Length - unsupportedMaterialCount, NativeArrayOptions.ClearMemory); + supportedPackedMaterialDatas.Resize(supportedMaterialIDs.Length, NativeArrayOptions.ClearMemory); + + usedMaterialIDs.Dispose(); + } + + [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] + public static void FindUnsupportedRenderers(in NativeArray unsupportedMaterials, in NativeArray.ReadOnly materialIDArrays, in NativeArray.ReadOnly rendererGroups, + ref NativeList unsupportedRenderers) + { + for (int arrayIndex = 0; arrayIndex < materialIDArrays.Length; arrayIndex++) + { + var materialIDs = materialIDArrays[arrayIndex]; + int rendererID = rendererGroups[arrayIndex]; + + for (int i = 0; i < materialIDs.Length; i++) + { + int materialID = materialIDs[i]; + + if (unsupportedMaterials.Contains(materialID)) + { + unsupportedRenderers.Add(rendererID); + break; + } + } + } + } + + [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] + public static void GetMaterialsWithChangedPackedMaterial(in NativeArray materialIDs, in NativeArray packedMaterialDatas, + in NativeParallelHashMap.ReadOnly packedMaterialHash, ref NativeHashSet filteredMaterials) + { + for (int index = 0; index < materialIDs.Length ; index++) + { + var materialID = materialIDs[index]; + var newPackedMaterialData = packedMaterialDatas[index]; + + // Has its packed material changed? If the material isn't in the packed material cache, consider the material has changed. + if (packedMaterialHash.TryGetValue(materialID, out var packedMaterial) && packedMaterial.Equals(newPackedMaterialData)) + continue; + + filteredMaterials.Add(materialID); + } + } + } +} diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawerBurst.cs.meta b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawerBurst.cs.meta new file mode 100644 index 00000000000..ececc7dd30e --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/GPUResidentDrawerBurst.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2f50a3b1f0997d342837e27ab3b95e6f \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCuller.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCuller.cs index 8fcbfa9c336..ed9bf2e6f13 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCuller.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCuller.cs @@ -1812,29 +1812,6 @@ private JobHandle AnimateCrossFades(CPUPerCameraInstanceData perCameraInstanceDa return handle; } - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] - private unsafe struct SetupCullingJobInput : IJob - { - public float lodBias; - public float meshLodThreshold; - [NativeDisableUnsafePtrRestriction] public BatchCullingContext* context; - [NativeDisableUnsafePtrRestriction] public ReceiverPlanes* receiverPlanes; - [NativeDisableUnsafePtrRestriction] public ReceiverSphereCuller* receiverSphereCuller; - [NativeDisableUnsafePtrRestriction] public FrustumPlaneCuller* frustumPlaneCuller; - [NativeDisableUnsafePtrRestriction] public float* screenRelativeMetric; - [NativeDisableUnsafePtrRestriction] public float* meshLodConstant; - - public void Execute() - { - *receiverPlanes = ReceiverPlanes.Create(*context, Allocator.TempJob); - *receiverSphereCuller = ReceiverSphereCuller.Create(*context, Allocator.TempJob); - *frustumPlaneCuller = FrustumPlaneCuller.Create(*context, receiverPlanes->planes.AsArray(), *receiverSphereCuller, Allocator.TempJob); - *screenRelativeMetric = LODRenderingUtils.CalculateScreenRelativeMetricNoBias(context->lodParameters); - *meshLodConstant = LODRenderingUtils.CalculateMeshLodConstant(context->lodParameters, *screenRelativeMetric, meshLodThreshold); - *screenRelativeMetric /= lodBias; - } - } - private unsafe JobHandle CreateFrustumCullingJob( in BatchCullingContext cc, in CPUInstanceData.ReadOnly instanceData, @@ -1848,7 +1825,7 @@ private unsafe JobHandle CreateFrustumCullingJob( NativeArray rendererMeshLodSettings, NativeArray rendererCrossFadeValues) { - Assert.IsTrue(cc.cullingSplits.Length <= 6, "InstanceCullingBatcher supports up to 6 culling splits."); + Assert.IsTrue(cc.cullingSplits.Length <= 6, "InstanceCuller supports up to 6 culling splits."); ReceiverPlanes receiverPlanes; ReceiverSphereCuller receiverSphereCuller; @@ -1858,17 +1835,8 @@ private unsafe JobHandle CreateFrustumCullingJob( fixed (BatchCullingContext* contextPtr = &cc) { - new SetupCullingJobInput() - { - lodBias = QualitySettings.lodBias, - meshLodThreshold = QualitySettings.meshLodThreshold, - context = contextPtr, - frustumPlaneCuller = &frustumPlaneCuller, - receiverPlanes = &receiverPlanes, - receiverSphereCuller = &receiverSphereCuller, - screenRelativeMetric = &screenRelativeMetric, - meshLodConstant = &meshLodConstant, - }.Run(); + InstanceCullerBurst.SetupCullingJobInput(QualitySettings.lodBias, QualitySettings.meshLodThreshold, contextPtr, &receiverPlanes, &receiverSphereCuller, + &frustumPlaneCuller, &screenRelativeMetric, &meshLodConstant); } if (occlusionCullingCommon != null) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullerBurst.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullerBurst.cs new file mode 100644 index 00000000000..fc4c27e8f04 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullerBurst.cs @@ -0,0 +1,22 @@ +using Unity.Collections; +using Unity.Burst; + +namespace UnityEngine.Rendering +{ + [BurstCompile] + internal static class InstanceCullerBurst + { + [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] + public static unsafe void SetupCullingJobInput(float lodBias, float meshLodThreshold, BatchCullingContext* context, + ReceiverPlanes* receiverPlanes, ReceiverSphereCuller* receiverSphereCuller, FrustumPlaneCuller* frustumPlaneCuller, + float* screenRelativeMetric, float* meshLodConstant) + { + *receiverPlanes = ReceiverPlanes.Create(*context, Allocator.TempJob); + *receiverSphereCuller = ReceiverSphereCuller.Create(*context, Allocator.TempJob); + *frustumPlaneCuller = FrustumPlaneCuller.Create(*context, receiverPlanes->planes.AsArray(), *receiverSphereCuller, Allocator.TempJob); + *screenRelativeMetric = LODRenderingUtils.CalculateScreenRelativeMetricNoBias(context->lodParameters); + *meshLodConstant = LODRenderingUtils.CalculateMeshLodConstant(context->lodParameters, *screenRelativeMetric, meshLodThreshold); + *screenRelativeMetric /= lodBias; + } + } +} diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullerBurst.cs.meta b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullerBurst.cs.meta new file mode 100644 index 00000000000..dc1b8acb849 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullerBurst.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 99f3de5decfa27b47a4ab725fc059f50 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullingBatcher.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullingBatcher.cs index a6423ab2106..292bf6a899a 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullingBatcher.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullingBatcher.cs @@ -234,74 +234,6 @@ public unsafe void Execute(int index) } } - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] - internal struct RemoveDrawInstanceIndicesJob : IJob - { - [NativeDisableContainerSafetyRestriction, NoAlias] [ReadOnly] public NativeArray drawInstanceIndices; - - public NativeList drawInstances; - public NativeParallelHashMap rangeHash; - public NativeParallelHashMap batchHash; - public NativeList drawRanges; - public NativeList drawBatches; - - public void RemoveDrawRange(in RangeKey key) - { - int drawRangeIndex = rangeHash[key]; - - ref DrawRange lastDrawRange = ref drawRanges.ElementAt(drawRanges.Length - 1); - rangeHash[lastDrawRange.key] = drawRangeIndex; - - rangeHash.Remove(key); - drawRanges.RemoveAtSwapBack(drawRangeIndex); - } - - public void RemoveDrawBatch(in DrawKey key) - { - int drawBatchIndex = batchHash[key]; - - ref DrawBatch drawBatch = ref drawBatches.ElementAt(drawBatchIndex); - - int drawRangeIndex = rangeHash[key.range]; - ref DrawRange drawRange = ref drawRanges.ElementAt(drawRangeIndex); - - Assert.IsTrue(drawRange.drawCount > 0); - - if (--drawRange.drawCount == 0) - RemoveDrawRange(drawRange.key); - - ref DrawBatch lastDrawBatch = ref drawBatches.ElementAt(drawBatches.Length - 1); - batchHash[lastDrawBatch.key] = drawBatchIndex; - - batchHash.Remove(key); - drawBatches.RemoveAtSwapBack(drawBatchIndex); - } - - public unsafe void Execute() - { - var drawInstancesPtr = (DrawInstance*)drawInstances.GetUnsafePtr(); - var drawInstancesNewBack = drawInstances.Length - 1; - - for (int indexRev = drawInstanceIndices.Length - 1; indexRev >= 0; --indexRev) - { - int indexToRemove = drawInstanceIndices[indexRev]; - DrawInstance* drawInstance = drawInstancesPtr + indexToRemove; - - int drawBatchIndex = batchHash[drawInstance->key]; - ref DrawBatch drawBatch = ref drawBatches.ElementAt(drawBatchIndex); - - Assert.IsTrue(drawBatch.instanceCount > 0); - - if (--drawBatch.instanceCount == 0) - RemoveDrawBatch(drawBatch.key); - - UnsafeUtility.MemCpy(drawInstance, drawInstancesPtr + drawInstancesNewBack--, sizeof(DrawInstance)); - } - - drawInstances.ResizeUninitialized(drawInstancesNewBack + 1); - } - } - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] internal struct UpdatePackedMaterialDataCacheJob : IJob { @@ -329,252 +261,6 @@ public void Execute() } } - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] - internal struct CreateDrawBatchesJob : IJob - { - [ReadOnly] public bool implicitInstanceIndices; - [ReadOnly] public NativeArray instances; - [ReadOnly] public GPUDrivenRendererGroupData rendererData; - [ReadOnly] public NativeParallelHashMap.ReadOnly batchMeshHash; - [ReadOnly] public NativeParallelHashMap.ReadOnly batchMaterialHash; - [ReadOnly] public NativeParallelHashMap.ReadOnly packedMaterialDataHash; - - public NativeParallelHashMap rangeHash; - public NativeList drawRanges; - public NativeParallelHashMap batchHash; - public NativeList drawBatches; - - [WriteOnly] public NativeList drawInstances; - - private ref DrawRange EditDrawRange(in RangeKey key) - { - int drawRangeIndex; - - if (!rangeHash.TryGetValue(key, out drawRangeIndex)) - { - var drawRange = new DrawRange { key = key, drawCount = 0, drawOffset = 0 }; - drawRangeIndex = drawRanges.Length; - rangeHash.Add(key, drawRangeIndex); - drawRanges.Add(drawRange); - } - - ref DrawRange data = ref drawRanges.ElementAt(drawRangeIndex); - Assert.IsTrue(data.key.Equals(key)); - - return ref data; - } - - private ref DrawBatch EditDrawBatch(in DrawKey key, in SubMeshDescriptor subMeshDescriptor) - { - var procInfo = new MeshProceduralInfo(); - procInfo.topology = subMeshDescriptor.topology; - procInfo.baseVertex = (uint)subMeshDescriptor.baseVertex; - procInfo.firstIndex = (uint)subMeshDescriptor.indexStart; - procInfo.indexCount = (uint)subMeshDescriptor.indexCount; - - int drawBatchIndex; - - if (!batchHash.TryGetValue(key, out drawBatchIndex)) - { - var drawBatch = new DrawBatch() { key = key, instanceCount = 0, instanceOffset = 0, procInfo = procInfo }; - drawBatchIndex = drawBatches.Length; - batchHash.Add(key, drawBatchIndex); - drawBatches.Add(drawBatch); - } - - ref DrawBatch data = ref drawBatches.ElementAt(drawBatchIndex); - Assert.IsTrue(data.key.Equals(key)); - - return ref data; - } - - public void ProcessRenderer(int i) - { - var meshIndex = rendererData.meshIndex[i]; - var meshID = rendererData.meshID[meshIndex]; - var meshLodInfo = rendererData.meshLodInfo[meshIndex]; - var submeshCount = rendererData.subMeshCount[meshIndex]; - var subMeshDescOffset = rendererData.subMeshDescOffset[meshIndex]; - var batchMeshID = batchMeshHash[meshID]; - var rendererGroupID = rendererData.rendererGroupID[i]; - var startSubMesh = rendererData.subMeshStartIndex[i]; - var gameObjectLayer = rendererData.gameObjectLayer[i]; - var renderingLayerMask = rendererData.renderingLayerMask[i]; - var materialsOffset = rendererData.materialsOffset[i]; - var materialsCount = rendererData.materialsCount[i]; - var lightmapIndex = rendererData.lightmapIndex[i]; - var packedRendererData = rendererData.packedRendererData[i]; - var rendererPriority = rendererData.rendererPriority[i]; - - int instanceCount; - int instanceOffset; - - if (implicitInstanceIndices) - { - instanceCount = 1; - instanceOffset = i; - } - else - { - instanceCount = rendererData.instancesCount[i]; - instanceOffset = rendererData.instancesOffset[i]; - } - - if (instanceCount == 0) - return; - - const int kLightmapIndexMask = 0xffff; - const int kLightmapIndexInfluenceOnly = 0xfffe; - - var overridenComponents = InstanceComponentGroup.Default; - - // Add per-instance wind parameters - if(packedRendererData.hasTree) - overridenComponents |= InstanceComponentGroup.Wind; - - var lmIndexMasked = lightmapIndex & kLightmapIndexMask; - - // Object doesn't have a valid lightmap Index, -> uses probes for lighting - if (lmIndexMasked >= kLightmapIndexInfluenceOnly) - { - // Only add the component when needed to store blended results (shader will use the ambient probe when not present) - if (packedRendererData.lightProbeUsage == LightProbeUsage.BlendProbes) - overridenComponents |= InstanceComponentGroup.LightProbe; - } - else - { - // Add per-instance lightmap parameters - overridenComponents |= InstanceComponentGroup.Lightmap; - } - - // Scan all materials once to retrieve whether this renderer is indirect-compatible or not (and store it in the RangeKey). - Span packedMaterialDatas = stackalloc GPUDrivenPackedMaterialData[materialsCount]; - - var supportsIndirect = true; - for (int matIndex = 0; matIndex < materialsCount; ++matIndex) - { - if (matIndex >= submeshCount) - { - Debug.LogWarning("Material count in the shared material list is higher than sub mesh count for the mesh. Object may be corrupted."); - continue; - } - - var materialIndex = rendererData.materialIndex[materialsOffset + matIndex]; - GPUDrivenPackedMaterialData packedMaterialData; - - if (rendererData.packedMaterialData.Length > 0) - { - packedMaterialData = rendererData.packedMaterialData[materialIndex]; - } - else - { - var materialID = rendererData.materialID[materialIndex]; - bool isFound = packedMaterialDataHash.TryGetValue(materialID, out packedMaterialData); - Assert.IsTrue(isFound); - } - supportsIndirect &= packedMaterialData.isIndirectSupported; - - packedMaterialDatas[matIndex] = packedMaterialData; - } - - var rangeKey = new RangeKey - { - layer = (byte)gameObjectLayer, - renderingLayerMask = renderingLayerMask, - motionMode = packedRendererData.motionVecGenMode, - shadowCastingMode = packedRendererData.shadowCastingMode, - staticShadowCaster = packedRendererData.staticShadowCaster, - rendererPriority = rendererPriority, - supportsIndirect = supportsIndirect - }; - - ref DrawRange drawRange = ref EditDrawRange(rangeKey); - - for (int matIndex = 0; matIndex < materialsCount; ++matIndex) - { - if (matIndex >= submeshCount) - { - Debug.LogWarning("Material count in the shared material list is higher than sub mesh count for the mesh. Object may be corrupted."); - continue; - } - - var materialIndex = rendererData.materialIndex[materialsOffset + matIndex]; - var materialID = rendererData.materialID[materialIndex]; - var packedMaterialData = packedMaterialDatas[matIndex]; - - if (materialID == 0) - { - Debug.LogWarning("Material in the shared materials list is null. Object will be partially rendered."); - continue; - } - - batchMaterialHash.TryGetValue(materialID, out BatchMaterialID batchMaterialID); - - // We always provide crossfade value packed in instance index. We don't use None even if there is no LOD to not split the batch. - var flags = BatchDrawCommandFlags.LODCrossFadeValuePacked; - - // Let the engine know if we've opted out of lightmap texture arrays - flags |= BatchDrawCommandFlags.UseLegacyLightmapsKeyword; - - // assume that a custom motion vectors pass contains deformation motion, so should always output motion vectors - // (otherwise this flag is set dynamically during culling only when the transform is changing) - if (packedMaterialData.isMotionVectorsPassEnabled) - flags |= BatchDrawCommandFlags.HasMotion; - - if (packedMaterialData.isTransparent) - flags |= BatchDrawCommandFlags.HasSortingPosition; - - if (packedMaterialData.supportsCrossFade) - flags |= BatchDrawCommandFlags.LODCrossFadeKeyword; - - int lodLoopCount = math.max(meshLodInfo.levelCount, 1); - - for (int lodLoopIndex = 0; lodLoopIndex < lodLoopCount; ++lodLoopIndex) - { - var submeshIndex = startSubMesh + matIndex; - var subMeshDesc = rendererData.subMeshDesc[subMeshDescOffset + submeshIndex*lodLoopCount + lodLoopIndex]; - var drawKey = new DrawKey - { - materialID = batchMaterialID, - meshID = batchMeshID, - submeshIndex = submeshIndex, - activeMeshLod = meshLodInfo.lodSelectionActive ? lodLoopIndex : -1, - flags = flags, - transparentInstanceId = packedMaterialData.isTransparent ? rendererGroupID : 0, - range = rangeKey, - overridenComponents = (uint)overridenComponents, - // When we've opted out of lightmap texture arrays, we - // need to pass in a valid lightmap index. The engine - // uses this index for sorting and for breaking the - // batch when lightmaps change across draw calls, and - // for binding the correct light map. - lightmapIndex = lightmapIndex - }; - - ref DrawBatch drawBatch = ref EditDrawBatch(drawKey, subMeshDesc); - - if (drawBatch.instanceCount == 0) - ++drawRange.drawCount; - - drawBatch.instanceCount += instanceCount; - - for (int j = 0; j < instanceCount; ++j) - { - var instanceIndex = instanceOffset + j; - InstanceHandle instance = instances[instanceIndex]; - drawInstances.Add(new DrawInstance { key = drawKey, instanceIndex = instance.index }); - } - } - } - } - - public void Execute() - { - for (int i = 0; i < rendererData.rendererGroupID.Length; ++i) - ProcessRenderer(i); - } - } - internal class CPUDrawInstanceData { public NativeList drawInstances => m_DrawInstances; @@ -672,23 +358,16 @@ public void RebuildDrawListsIfNeeded() internalDrawIndex.Dispose(); } - public unsafe void DestroyDrawInstanceIndices(NativeArray drawInstanceIndicesToDestroy) + public void DestroyDrawInstanceIndices(NativeArray drawInstanceIndicesToDestroy) { Profiler.BeginSample("DestroyDrawInstanceIndices.ParallelSort"); drawInstanceIndicesToDestroy.ParallelSort().Complete(); Profiler.EndSample(); - var removeDrawInstanceIndicesJob = new RemoveDrawInstanceIndicesJob - { - drawInstanceIndices = drawInstanceIndicesToDestroy, - drawInstances = m_DrawInstances, - drawBatches = m_DrawBatches, - drawRanges = m_DrawRanges, - batchHash = m_BatchHash, - rangeHash = m_RangeHash - }; - - removeDrawInstanceIndicesJob.Run(); + Profiler.BeginSample("DestroyDrawInstanceIndices.RemoveDrawInstanceIndices"); + InstanceCullingBatcherBurst.RemoveDrawInstanceIndices(drawInstanceIndicesToDestroy, ref m_DrawInstances, ref m_RangeHash, + ref m_BatchHash, ref m_DrawRanges, ref m_DrawBatches); + Profiler.EndSample(); } public unsafe void DestroyDrawInstances(NativeArray destroyedInstances) @@ -1097,20 +776,14 @@ public void BuildBatch( RegisterBatchMeshes(usedMeshIDs); } - new CreateDrawBatchesJob - { - implicitInstanceIndices = rendererData.instancesCount.Length == 0, - instances = instances, - rendererData = rendererData, - batchMeshHash = m_BatchMeshHash.AsReadOnly(), - batchMaterialHash = m_BatchMaterialHash.AsReadOnly(), - packedMaterialDataHash = m_PackedMaterialHash.AsReadOnly(), - rangeHash = m_DrawInstanceData.rangeHash, - drawRanges = m_DrawInstanceData.drawRanges, - batchHash = m_DrawInstanceData.batchHash, - drawBatches = m_DrawInstanceData.drawBatches, - drawInstances = m_DrawInstanceData.drawInstances - }.Run(); + var rangeHash = m_DrawInstanceData.rangeHash; + var drawRanges = m_DrawInstanceData.drawRanges; + var batchHash = m_DrawInstanceData.batchHash; + var drawBatches = m_DrawInstanceData.drawBatches; + var drawInstances = m_DrawInstanceData.drawInstances; + + InstanceCullingBatcherBurst.CreateDrawBatches(rendererData.instancesCount.Length == 0, instances, rendererData, + m_BatchMeshHash, m_BatchMaterialHash, m_PackedMaterialHash, ref rangeHash, ref drawRanges, ref batchHash, ref drawBatches, ref drawInstances); m_DrawInstanceData.NeedsRebuild(); UpdateInstanceDataBufferLayoutVersion(); diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullingBatcherBurst.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullingBatcherBurst.cs new file mode 100644 index 00000000000..f429d38b291 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullingBatcherBurst.cs @@ -0,0 +1,309 @@ +using System; +using Unity.Collections; +using Unity.Burst; +using Unity.Collections.LowLevel.Unsafe; +using Unity.Jobs; +using Unity.Mathematics; +using UnityEngine.Assertions; + +namespace UnityEngine.Rendering +{ + [BurstCompile] + internal static class InstanceCullingBatcherBurst + { + private static void RemoveDrawRange(in RangeKey key, ref NativeParallelHashMap rangeHash, ref NativeList drawRanges) + { + int drawRangeIndex = rangeHash[key]; + + ref DrawRange lastDrawRange = ref drawRanges.ElementAt(drawRanges.Length - 1); + rangeHash[lastDrawRange.key] = drawRangeIndex; + + rangeHash.Remove(key); + drawRanges.RemoveAtSwapBack(drawRangeIndex); + } + + private static void RemoveDrawBatch(in DrawKey key, ref NativeList drawRanges, ref NativeParallelHashMap rangeHash, + ref NativeParallelHashMap batchHash, ref NativeList drawBatches) + { + int drawBatchIndex = batchHash[key]; + + int drawRangeIndex = rangeHash[key.range]; + ref DrawRange drawRange = ref drawRanges.ElementAt(drawRangeIndex); + + Assert.IsTrue(drawRange.drawCount > 0); + + if (--drawRange.drawCount == 0) + RemoveDrawRange(drawRange.key, ref rangeHash, ref drawRanges); + + ref DrawBatch lastDrawBatch = ref drawBatches.ElementAt(drawBatches.Length - 1); + batchHash[lastDrawBatch.key] = drawBatchIndex; + + batchHash.Remove(key); + drawBatches.RemoveAtSwapBack(drawBatchIndex); + } + + [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] + public static unsafe void RemoveDrawInstanceIndices(in NativeArray drawInstanceIndices, ref NativeList drawInstances, ref NativeParallelHashMap rangeHash, + ref NativeParallelHashMap batchHash, ref NativeList drawRanges, ref NativeList drawBatches) + { + var drawInstancesPtr = (DrawInstance*)drawInstances.GetUnsafePtr(); + var drawInstancesNewBack = drawInstances.Length - 1; + + for (int indexRev = drawInstanceIndices.Length - 1; indexRev >= 0; --indexRev) + { + int indexToRemove = drawInstanceIndices[indexRev]; + DrawInstance* drawInstance = drawInstancesPtr + indexToRemove; + + int drawBatchIndex = batchHash[drawInstance->key]; + ref DrawBatch drawBatch = ref drawBatches.ElementAt(drawBatchIndex); + + Assert.IsTrue(drawBatch.instanceCount > 0); + + if (--drawBatch.instanceCount == 0) + RemoveDrawBatch(drawBatch.key, ref drawRanges, ref rangeHash, ref batchHash, ref drawBatches); + + UnsafeUtility.MemCpy(drawInstance, drawInstancesPtr + drawInstancesNewBack--, sizeof(DrawInstance)); + } + + drawInstances.ResizeUninitialized(drawInstancesNewBack + 1); + } + + private static ref DrawRange EditDrawRange(in RangeKey key, NativeParallelHashMap rangeHash, NativeList drawRanges) + { + int drawRangeIndex; + + if (!rangeHash.TryGetValue(key, out drawRangeIndex)) + { + var drawRange = new DrawRange { key = key, drawCount = 0, drawOffset = 0 }; + drawRangeIndex = drawRanges.Length; + rangeHash.Add(key, drawRangeIndex); + drawRanges.Add(drawRange); + } + + ref DrawRange data = ref drawRanges.ElementAt(drawRangeIndex); + Assert.IsTrue(data.key.Equals(key)); + + return ref data; + } + + private static ref DrawBatch EditDrawBatch(in DrawKey key, in SubMeshDescriptor subMeshDescriptor, NativeParallelHashMap batchHash, NativeList drawBatches) + { + var procInfo = new MeshProceduralInfo(); + procInfo.topology = subMeshDescriptor.topology; + procInfo.baseVertex = (uint)subMeshDescriptor.baseVertex; + procInfo.firstIndex = (uint)subMeshDescriptor.indexStart; + procInfo.indexCount = (uint)subMeshDescriptor.indexCount; + + int drawBatchIndex; + + if (!batchHash.TryGetValue(key, out drawBatchIndex)) + { + var drawBatch = new DrawBatch() { key = key, instanceCount = 0, instanceOffset = 0, procInfo = procInfo }; + drawBatchIndex = drawBatches.Length; + batchHash.Add(key, drawBatchIndex); + drawBatches.Add(drawBatch); + } + + ref DrawBatch data = ref drawBatches.ElementAt(drawBatchIndex); + Assert.IsTrue(data.key.Equals(key)); + + return ref data; + } + + private static void ProcessRenderer(int i, bool implicitInstanceIndices, in GPUDrivenRendererGroupData rendererData, + NativeParallelHashMap batchMeshHash, NativeParallelHashMap packedMaterialDataHash, + NativeParallelHashMap batchMaterialHash, NativeArray instances, NativeList drawInstances, + NativeParallelHashMap rangeHash, NativeList drawRanges, NativeParallelHashMap batchHash, + NativeList drawBatches) + { + var meshIndex = rendererData.meshIndex[i]; + var meshID = rendererData.meshID[meshIndex]; + var meshLodInfo = rendererData.meshLodInfo[meshIndex]; + var submeshCount = rendererData.subMeshCount[meshIndex]; + var subMeshDescOffset = rendererData.subMeshDescOffset[meshIndex]; + var batchMeshID = batchMeshHash[meshID]; + var rendererGroupID = rendererData.rendererGroupID[i]; + var startSubMesh = rendererData.subMeshStartIndex[i]; + var gameObjectLayer = rendererData.gameObjectLayer[i]; + var renderingLayerMask = rendererData.renderingLayerMask[i]; + var materialsOffset = rendererData.materialsOffset[i]; + var materialsCount = rendererData.materialsCount[i]; + var lightmapIndex = rendererData.lightmapIndex[i]; + var packedRendererData = rendererData.packedRendererData[i]; + var rendererPriority = rendererData.rendererPriority[i]; + + int instanceCount; + int instanceOffset; + + if (implicitInstanceIndices) + { + instanceCount = 1; + instanceOffset = i; + } + else + { + instanceCount = rendererData.instancesCount[i]; + instanceOffset = rendererData.instancesOffset[i]; + } + + if (instanceCount == 0) + return; + + const int kLightmapIndexMask = 0xffff; + const int kLightmapIndexInfluenceOnly = 0xfffe; + + var overridenComponents = InstanceComponentGroup.Default; + + // Add per-instance wind parameters + if(packedRendererData.hasTree) + overridenComponents |= InstanceComponentGroup.Wind; + + var lmIndexMasked = lightmapIndex & kLightmapIndexMask; + + // Object doesn't have a valid lightmap Index, -> uses probes for lighting + if (lmIndexMasked >= kLightmapIndexInfluenceOnly) + { + // Only add the component when needed to store blended results (shader will use the ambient probe when not present) + if (packedRendererData.lightProbeUsage == LightProbeUsage.BlendProbes) + overridenComponents |= InstanceComponentGroup.LightProbe; + } + else + { + // Add per-instance lightmap parameters + overridenComponents |= InstanceComponentGroup.Lightmap; + } + + // Scan all materials once to retrieve whether this renderer is indirect-compatible or not (and store it in the RangeKey). + Span packedMaterialDatas = stackalloc GPUDrivenPackedMaterialData[materialsCount]; + + var supportsIndirect = true; + for (int matIndex = 0; matIndex < materialsCount; ++matIndex) + { + if (matIndex >= submeshCount) + { + Debug.LogWarning("Material count in the shared material list is higher than sub mesh count for the mesh. Object may be corrupted."); + continue; + } + + var materialIndex = rendererData.materialIndex[materialsOffset + matIndex]; + GPUDrivenPackedMaterialData packedMaterialData; + + if (rendererData.packedMaterialData.Length > 0) + { + packedMaterialData = rendererData.packedMaterialData[materialIndex]; + } + else + { + var materialID = rendererData.materialID[materialIndex]; + bool isFound = packedMaterialDataHash.TryGetValue(materialID, out packedMaterialData); + Assert.IsTrue(isFound); + } + supportsIndirect &= packedMaterialData.isIndirectSupported; + + packedMaterialDatas[matIndex] = packedMaterialData; + } + + var rangeKey = new RangeKey + { + layer = (byte)gameObjectLayer, + renderingLayerMask = renderingLayerMask, + motionMode = packedRendererData.motionVecGenMode, + shadowCastingMode = packedRendererData.shadowCastingMode, + staticShadowCaster = packedRendererData.staticShadowCaster, + rendererPriority = rendererPriority, + supportsIndirect = supportsIndirect + }; + + ref DrawRange drawRange = ref EditDrawRange(rangeKey, rangeHash, drawRanges); + + for (int matIndex = 0; matIndex < materialsCount; ++matIndex) + { + if (matIndex >= submeshCount) + { + Debug.LogWarning("Material count in the shared material list is higher than sub mesh count for the mesh. Object may be corrupted."); + continue; + } + + var materialIndex = rendererData.materialIndex[materialsOffset + matIndex]; + var materialID = rendererData.materialID[materialIndex]; + var packedMaterialData = packedMaterialDatas[matIndex]; + + if (materialID == 0) + { + Debug.LogWarning("Material in the shared materials list is null. Object will be partially rendered."); + continue; + } + + batchMaterialHash.TryGetValue(materialID, out BatchMaterialID batchMaterialID); + + // We always provide crossfade value packed in instance index. We don't use None even if there is no LOD to not split the batch. + var flags = BatchDrawCommandFlags.LODCrossFadeValuePacked; + + // Let the engine know if we've opted out of lightmap texture arrays + flags |= BatchDrawCommandFlags.UseLegacyLightmapsKeyword; + + // assume that a custom motion vectors pass contains deformation motion, so should always output motion vectors + // (otherwise this flag is set dynamically during culling only when the transform is changing) + if (packedMaterialData.isMotionVectorsPassEnabled) + flags |= BatchDrawCommandFlags.HasMotion; + + if (packedMaterialData.isTransparent) + flags |= BatchDrawCommandFlags.HasSortingPosition; + + if (packedMaterialData.supportsCrossFade) + flags |= BatchDrawCommandFlags.LODCrossFadeKeyword; + + int lodLoopCount = math.max(meshLodInfo.levelCount, 1); + + for (int lodLoopIndex = 0; lodLoopIndex < lodLoopCount; ++lodLoopIndex) + { + var submeshIndex = startSubMesh + matIndex; + var subMeshDesc = rendererData.subMeshDesc[subMeshDescOffset + submeshIndex*lodLoopCount + lodLoopIndex]; + var drawKey = new DrawKey + { + materialID = batchMaterialID, + meshID = batchMeshID, + submeshIndex = submeshIndex, + activeMeshLod = meshLodInfo.lodSelectionActive ? lodLoopIndex : -1, + flags = flags, + transparentInstanceId = packedMaterialData.isTransparent ? rendererGroupID : 0, + range = rangeKey, + overridenComponents = (uint)overridenComponents, + // When we've opted out of lightmap texture arrays, we + // need to pass in a valid lightmap index. The engine + // uses this index for sorting and for breaking the + // batch when lightmaps change across draw calls, and + // for binding the correct light map. + lightmapIndex = lightmapIndex + }; + + ref DrawBatch drawBatch = ref EditDrawBatch(drawKey, subMeshDesc, batchHash, drawBatches); + + if (drawBatch.instanceCount == 0) + ++drawRange.drawCount; + + drawBatch.instanceCount += instanceCount; + + for (int j = 0; j < instanceCount; ++j) + { + var instanceIndex = instanceOffset + j; + InstanceHandle instance = instances[instanceIndex]; + drawInstances.Add(new DrawInstance { key = drawKey, instanceIndex = instance.index }); + } + } + } + } + + [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] + public static void CreateDrawBatches(bool implicitInstanceIndices, in NativeArray instances, in GPUDrivenRendererGroupData rendererData, + in NativeParallelHashMap batchMeshHash, in NativeParallelHashMap batchMaterialHash, + in NativeParallelHashMap packedMaterialDataHash, + ref NativeParallelHashMap rangeHash, ref NativeList drawRanges, ref NativeParallelHashMap batchHash, ref NativeList drawBatches, + ref NativeList drawInstances) + { + for (int i = 0; i < rendererData.rendererGroupID.Length; ++i) + ProcessRenderer(i, implicitInstanceIndices, rendererData, batchMeshHash, packedMaterialDataHash, batchMaterialHash, instances, + drawInstances, rangeHash, drawRanges, batchHash, drawBatches); + } + } +} diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullingBatcherBurst.cs.meta b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullingBatcherBurst.cs.meta new file mode 100644 index 00000000000..1b344d835a7 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceCullingBatcherBurst.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 07b72b6a7afa9b448b3103bb66d57ca0 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystem.Jobs.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystem.Jobs.cs index 22f3ce514ba..a31a90a4a80 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystem.Jobs.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystem.Jobs.cs @@ -482,224 +482,6 @@ public void Execute(int chunk_index) } } - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] - private struct ReallocateInstancesJob : IJob - { - [ReadOnly] public bool implicitInstanceIndices; - [ReadOnly] public NativeArray rendererGroupIDs; - [ReadOnly] public NativeArray packedRendererData; - [ReadOnly] public NativeArray instanceOffsets; - [ReadOnly] public NativeArray instanceCounts; - - public InstanceAllocators instanceAllocators; - public CPUInstanceData instanceData; - [NativeDisableContainerSafetyRestriction] public CPUPerCameraInstanceData perCameraInstanceData; - public CPUSharedInstanceData sharedInstanceData; - public NativeArray instances; - public NativeParallelMultiHashMap rendererGroupInstanceMultiHash; - - public void Execute() - { - for (int i = 0; i < rendererGroupIDs.Length; ++i) - { - var rendererGroupID = rendererGroupIDs[i]; - var hasTree = packedRendererData[i].hasTree; - - int instanceCount; - int instanceOffset; - - if (implicitInstanceIndices) - { - instanceCount = 1; - instanceOffset = i; - } - else - { - instanceCount = instanceCounts[i]; - instanceOffset = instanceOffsets[i]; - } - - SharedInstanceHandle sharedInstance; - - if (rendererGroupInstanceMultiHash.TryGetFirstValue(rendererGroupID, out var instance, out var it)) - { - sharedInstance = instanceData.Get_SharedInstance(instance); - - int currentInstancesCount = sharedInstanceData.Get_RefCount(sharedInstance); - int instancesToFreeCount = currentInstancesCount - instanceCount; - - if (instancesToFreeCount > 0) - { - bool success = true; - int freedInstancesCount = 0; - - for (int j = 0; j < instanceCount; ++j) - success = rendererGroupInstanceMultiHash.TryGetNextValue(out instance, ref it); - - Assert.IsTrue(success); - - while (success) - { - var idx = instanceData.InstanceToIndex(instance); - instanceData.Remove(instance); - perCameraInstanceData.Remove(idx); - instanceAllocators.FreeInstance(instance); - - rendererGroupInstanceMultiHash.Remove(it); - ++freedInstancesCount; - success = rendererGroupInstanceMultiHash.TryGetNextValue(out instance, ref it); - } - - Assert.AreEqual(instancesToFreeCount, freedInstancesCount); - } - } - else - { - sharedInstance = instanceAllocators.AllocateSharedInstance(); - sharedInstanceData.AddNoGrow(sharedInstance); - } - - if (instanceCount > 0) - { - sharedInstanceData.Set_RefCount(sharedInstance, instanceCount); - - for (int j = 0; j < instanceCount; ++j) - { - int instanceIndex = instanceOffset + j; - - if (instances[instanceIndex].valid) - continue; - - InstanceHandle newInstance; - - if (!hasTree) - newInstance = instanceAllocators.AllocateInstance(InstanceType.MeshRenderer); - else - newInstance = instanceAllocators.AllocateInstance(InstanceType.SpeedTree); - - instanceData.AddNoGrow(newInstance); - perCameraInstanceData.IncreaseInstanceCount(); - Assert.IsTrue(instanceData.instancesLength == perCameraInstanceData.instancesLength); - int index = instanceData.InstanceToIndex(newInstance); - instanceData.sharedInstances[index] = sharedInstance; - instanceData.movedInCurrentFrameBits.Set(index, false); - instanceData.movedInPreviousFrameBits.Set(index, false); - instanceData.visibleInPreviousFrameBits.Set(index, false); - - rendererGroupInstanceMultiHash.Add(rendererGroupID, newInstance); - instances[instanceIndex] = newInstance; - } - } - else - { - sharedInstanceData.Remove(sharedInstance); - instanceAllocators.FreeSharedInstance(sharedInstance); - } - } - } - } - - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] - private struct FreeInstancesJob : IJob - { - [ReadOnly] public NativeArray instances; - - public InstanceAllocators instanceAllocators; - public CPUInstanceData instanceData; - - [NativeDisableContainerSafetyRestriction] public CPUPerCameraInstanceData perCameraInstanceData; - public CPUSharedInstanceData sharedInstanceData; - public NativeParallelMultiHashMap rendererGroupInstanceMultiHash; - - public void Execute() - { - foreach (var instance in instances) - { - if (!instanceData.IsValidInstance(instance)) - continue; - - int instanceIndex = instanceData.InstanceToIndex(instance); - SharedInstanceHandle sharedInstance = instanceData.sharedInstances[instanceIndex]; - int sharedInstanceIndex = sharedInstanceData.SharedInstanceToIndex(sharedInstance); - int refCount = sharedInstanceData.refCounts[sharedInstanceIndex]; - var rendererGroupID = sharedInstanceData.rendererGroupIDs[sharedInstanceIndex]; - - Assert.IsTrue(refCount > 0); - - if (refCount > 1) - { - sharedInstanceData.refCounts[sharedInstanceIndex] = refCount - 1; - } - else - { - sharedInstanceData.Remove(sharedInstance); - instanceAllocators.FreeSharedInstance(sharedInstance); - } - var idx = instanceData.InstanceToIndex(instance); - instanceData.Remove(instance); - perCameraInstanceData.Remove(idx); - instanceAllocators.FreeInstance(instance); - - //@ This will have quadratic cost. Optimize later. - for (bool success = rendererGroupInstanceMultiHash.TryGetFirstValue(rendererGroupID, out var i, out var it); success;) - { - if (instance.Equals(i)) - { - rendererGroupInstanceMultiHash.Remove(it); - break; - } - success = rendererGroupInstanceMultiHash.TryGetNextValue(out i, ref it); - } - } - } - } - - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] - private struct FreeRendererGroupInstancesJob : IJob - { - [ReadOnly] public NativeArray rendererGroupsID; - - public InstanceAllocators instanceAllocators; - public CPUInstanceData instanceData; - [NativeDisableContainerSafetyRestriction] public CPUPerCameraInstanceData perCameraInstanceData; - public CPUSharedInstanceData sharedInstanceData; - public NativeParallelMultiHashMap rendererGroupInstanceMultiHash; - - public void Execute() - { - foreach (var rendererGroupID in rendererGroupsID) - { - for (bool success = rendererGroupInstanceMultiHash.TryGetFirstValue(rendererGroupID, out var instance, out var it); success;) - { - SharedInstanceHandle sharedInstance = instanceData.Get_SharedInstance(instance); - int sharedInstanceIndex = sharedInstanceData.SharedInstanceToIndex(sharedInstance); - int refCount = sharedInstanceData.refCounts[sharedInstanceIndex]; - - Assert.IsTrue(refCount > 0); - - if (refCount > 1) - { - sharedInstanceData.refCounts[sharedInstanceIndex] = refCount - 1; - } - else - { - sharedInstanceData.Remove(sharedInstance); - instanceAllocators.FreeSharedInstance(sharedInstance); - } - - var idx = instanceData.InstanceToIndex(instance); - instanceData.Remove(instance); - perCameraInstanceData.Remove(idx); - instanceAllocators.FreeInstance(instance); - - success = rendererGroupInstanceMultiHash.TryGetNextValue(out instance, ref it); - } - - rendererGroupInstanceMultiHash.Remove(rendererGroupID); - } - } - } - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] private unsafe struct UpdateRendererInstancesJob : IJobParallelFor { diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystem.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystem.cs index 64a11c20539..7db7f119fce 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystem.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystem.cs @@ -484,24 +484,21 @@ public unsafe void ReallocateAndGetInstances(in GPUDrivenRendererGroupData rende Assert.IsTrue(m_InstanceData.instancesCapacity == m_PerCameraInstanceData.instancesCapacity); m_SharedInstanceData.EnsureFreeInstances(newSharedInstancesCount); - new ReallocateInstancesJob { implicitInstanceIndices = implicitInstanceIndices, rendererGroupInstanceMultiHash = m_RendererGroupInstanceMultiHash, - instanceAllocators = m_InstanceAllocators, sharedInstanceData = m_SharedInstanceData, instanceData = m_InstanceData, perCameraInstanceData = m_PerCameraInstanceData, - rendererGroupIDs = rendererData.rendererGroupID, packedRendererData = rendererData.packedRendererData, instanceOffsets = rendererData.instancesOffset, - instanceCounts = rendererData.instancesCount, instances = instances }.Run(); + InstanceDataSystemBurst.ReallocateInstances(implicitInstanceIndices, rendererData.rendererGroupID, rendererData.packedRendererData, + rendererData.instancesOffset, rendererData.instancesCount, ref m_InstanceAllocators, ref m_InstanceData, + ref m_PerCameraInstanceData, ref m_SharedInstanceData, ref instances, ref m_RendererGroupInstanceMultiHash); } public void FreeRendererGroupInstances(NativeArray rendererGroupsID) { - new FreeRendererGroupInstancesJob { rendererGroupInstanceMultiHash = m_RendererGroupInstanceMultiHash, - instanceAllocators = m_InstanceAllocators, sharedInstanceData = m_SharedInstanceData, instanceData = m_InstanceData, perCameraInstanceData = m_PerCameraInstanceData, - rendererGroupsID = rendererGroupsID }.Run(); + InstanceDataSystemBurst.FreeRendererGroupInstances(rendererGroupsID.AsReadOnly(), ref m_InstanceAllocators, ref m_InstanceData, + ref m_PerCameraInstanceData, ref m_SharedInstanceData, ref m_RendererGroupInstanceMultiHash); } public void FreeInstances(NativeArray instances) { - new FreeInstancesJob { rendererGroupInstanceMultiHash = m_RendererGroupInstanceMultiHash, - instanceAllocators = m_InstanceAllocators, sharedInstanceData = m_SharedInstanceData, instanceData = m_InstanceData, perCameraInstanceData = m_PerCameraInstanceData, - instances = instances }.Run(); + InstanceDataSystemBurst.FreeInstances(instances.AsReadOnly(), ref m_InstanceAllocators, ref m_InstanceData, ref m_PerCameraInstanceData, + ref m_SharedInstanceData, ref m_RendererGroupInstanceMultiHash); } public JobHandle ScheduleUpdateInstanceDataJob(NativeArray instances, in GPUDrivenRendererGroupData rendererData, NativeParallelHashMap lodGroupDataMap) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystemBurst.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystemBurst.cs new file mode 100644 index 00000000000..2f62c89a558 --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystemBurst.cs @@ -0,0 +1,195 @@ +using Unity.Collections; +using Unity.Burst; +using UnityEngine.Assertions; + +namespace UnityEngine.Rendering +{ + [BurstCompile] + internal static class InstanceDataSystemBurst + { + [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] + public static void ReallocateInstances(bool implicitInstanceIndices, in NativeArray rendererGroupIDs, in NativeArray packedRendererData, + in NativeArray instanceOffsets, in NativeArray instanceCounts, ref InstanceAllocators instanceAllocators, ref CPUInstanceData instanceData, + ref CPUPerCameraInstanceData perCameraInstanceData, ref CPUSharedInstanceData sharedInstanceData, ref NativeArray instances, + ref NativeParallelMultiHashMap rendererGroupInstanceMultiHash) + { + for (int i = 0; i < rendererGroupIDs.Length; ++i) + { + var rendererGroupID = rendererGroupIDs[i]; + var hasTree = packedRendererData[i].hasTree; + + int instanceCount; + int instanceOffset; + + if (implicitInstanceIndices) + { + instanceCount = 1; + instanceOffset = i; + } + else + { + instanceCount = instanceCounts[i]; + instanceOffset = instanceOffsets[i]; + } + + SharedInstanceHandle sharedInstance; + + if (rendererGroupInstanceMultiHash.TryGetFirstValue(rendererGroupID, out var instance, out var it)) + { + sharedInstance = instanceData.Get_SharedInstance(instance); + + int currentInstancesCount = sharedInstanceData.Get_RefCount(sharedInstance); + int instancesToFreeCount = currentInstancesCount - instanceCount; + + if (instancesToFreeCount > 0) + { + bool success = true; + int freedInstancesCount = 0; + + for (int j = 0; j < instanceCount; ++j) + success = rendererGroupInstanceMultiHash.TryGetNextValue(out instance, ref it); + + Assert.IsTrue(success); + + while (success) + { + var idx = instanceData.InstanceToIndex(instance); + instanceData.Remove(instance); + perCameraInstanceData.Remove(idx); + instanceAllocators.FreeInstance(instance); + + rendererGroupInstanceMultiHash.Remove(it); + ++freedInstancesCount; + success = rendererGroupInstanceMultiHash.TryGetNextValue(out instance, ref it); + } + + Assert.AreEqual(instancesToFreeCount, freedInstancesCount); + } + } + else + { + sharedInstance = instanceAllocators.AllocateSharedInstance(); + sharedInstanceData.AddNoGrow(sharedInstance); + } + + if (instanceCount > 0) + { + sharedInstanceData.Set_RefCount(sharedInstance, instanceCount); + + for (int j = 0; j < instanceCount; ++j) + { + int instanceIndex = instanceOffset + j; + + if (instances[instanceIndex].valid) + continue; + + InstanceHandle newInstance; + + if (!hasTree) + newInstance = instanceAllocators.AllocateInstance(InstanceType.MeshRenderer); + else + newInstance = instanceAllocators.AllocateInstance(InstanceType.SpeedTree); + + instanceData.AddNoGrow(newInstance); + perCameraInstanceData.IncreaseInstanceCount(); + Assert.IsTrue(instanceData.instancesLength == perCameraInstanceData.instancesLength); + int index = instanceData.InstanceToIndex(newInstance); + instanceData.sharedInstances[index] = sharedInstance; + instanceData.movedInCurrentFrameBits.Set(index, false); + instanceData.movedInPreviousFrameBits.Set(index, false); + instanceData.visibleInPreviousFrameBits.Set(index, false); + + rendererGroupInstanceMultiHash.Add(rendererGroupID, newInstance); + instances[instanceIndex] = newInstance; + } + } + else + { + sharedInstanceData.Remove(sharedInstance); + instanceAllocators.FreeSharedInstance(sharedInstance); + } + } + } + + [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] + public static void FreeRendererGroupInstances(in NativeArray.ReadOnly rendererGroupsID, ref InstanceAllocators instanceAllocators, ref CPUInstanceData instanceData, + ref CPUPerCameraInstanceData perCameraInstanceData, ref CPUSharedInstanceData sharedInstanceData, ref NativeParallelMultiHashMap rendererGroupInstanceMultiHash) + { + foreach (var rendererGroupID in rendererGroupsID) + { + for (bool success = rendererGroupInstanceMultiHash.TryGetFirstValue(rendererGroupID, out var instance, out var it); success;) + { + SharedInstanceHandle sharedInstance = instanceData.Get_SharedInstance(instance); + int sharedInstanceIndex = sharedInstanceData.SharedInstanceToIndex(sharedInstance); + int refCount = sharedInstanceData.refCounts[sharedInstanceIndex]; + + Assert.IsTrue(refCount > 0); + + if (refCount > 1) + { + sharedInstanceData.refCounts[sharedInstanceIndex] = refCount - 1; + } + else + { + sharedInstanceData.Remove(sharedInstance); + instanceAllocators.FreeSharedInstance(sharedInstance); + } + + var idx = instanceData.InstanceToIndex(instance); + instanceData.Remove(instance); + perCameraInstanceData.Remove(idx); + instanceAllocators.FreeInstance(instance); + + success = rendererGroupInstanceMultiHash.TryGetNextValue(out instance, ref it); + } + + rendererGroupInstanceMultiHash.Remove(rendererGroupID); + } + } + + + [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] + public static void FreeInstances(in NativeArray.ReadOnly instances, ref InstanceAllocators instanceAllocators, ref CPUInstanceData instanceData, + ref CPUPerCameraInstanceData perCameraInstanceData, ref CPUSharedInstanceData sharedInstanceData, ref NativeParallelMultiHashMap rendererGroupInstanceMultiHash) + { + foreach (var instance in instances) + { + if (!instanceData.IsValidInstance(instance)) + continue; + + int instanceIndex = instanceData.InstanceToIndex(instance); + SharedInstanceHandle sharedInstance = instanceData.sharedInstances[instanceIndex]; + int sharedInstanceIndex = sharedInstanceData.SharedInstanceToIndex(sharedInstance); + int refCount = sharedInstanceData.refCounts[sharedInstanceIndex]; + var rendererGroupID = sharedInstanceData.rendererGroupIDs[sharedInstanceIndex]; + + Assert.IsTrue(refCount > 0); + + if (refCount > 1) + { + sharedInstanceData.refCounts[sharedInstanceIndex] = refCount - 1; + } + else + { + sharedInstanceData.Remove(sharedInstance); + instanceAllocators.FreeSharedInstance(sharedInstance); + } + var idx = instanceData.InstanceToIndex(instance); + instanceData.Remove(instance); + perCameraInstanceData.Remove(idx); + instanceAllocators.FreeInstance(instance); + + //@ This will have quadratic cost. Optimize later. + for (bool success = rendererGroupInstanceMultiHash.TryGetFirstValue(rendererGroupID, out var i, out var it); success;) + { + if (instance.Equals(i)) + { + rendererGroupInstanceMultiHash.Remove(it); + break; + } + success = rendererGroupInstanceMultiHash.TryGetNextValue(out i, ref it); + } + } + } + } +} diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystemBurst.cs.meta b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystemBurst.cs.meta new file mode 100644 index 00000000000..8613808fb3e --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/InstanceData/InstanceDataSystemBurst.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 302f596d55264be4ba359e52ec407766 \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/LODGroupDataPool.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/LODGroupDataPool.cs index b290404e81c..33e07168a0f 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/LODGroupDataPool.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/LODGroupDataPool.cs @@ -86,52 +86,6 @@ public unsafe void Execute(int index) } } - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] - internal unsafe struct AllocateOrGetLODGroupDataInstancesJob : IJob - { - [ReadOnly] public NativeArray lodGroupsID; - - public NativeList lodGroupsData; - public NativeList lodGroupCullingData; - public NativeParallelHashMap lodGroupDataHash; - public NativeList freeLODGroupDataHandles; - - [WriteOnly] public NativeArray lodGroupInstances; - - [NativeDisableUnsafePtrRestriction] public int* previousRendererCount; - - public void Execute() - { - int freeHandlesCount = freeLODGroupDataHandles.Length; - int lodDataLength = lodGroupsData.Length; - - for (int i = 0; i < lodGroupsID.Length; ++i) - { - int lodGroupID = lodGroupsID[i]; - - if (!lodGroupDataHash.TryGetValue(lodGroupID, out var lodGroupInstance)) - { - if (freeHandlesCount == 0) - lodGroupInstance = new GPUInstanceIndex() { index = lodDataLength++ }; - else - lodGroupInstance = freeLODGroupDataHandles[--freeHandlesCount]; - - lodGroupDataHash.TryAdd(lodGroupID, lodGroupInstance); - } - else - { - *previousRendererCount += lodGroupsData.ElementAt(lodGroupInstance.index).rendererCount; - } - - lodGroupInstances[i] = lodGroupInstance; - } - - freeLODGroupDataHandles.ResizeUninitialized(freeHandlesCount); - lodGroupsData.ResizeUninitialized(lodDataLength); - lodGroupCullingData.ResizeUninitialized(lodDataLength); - } - } - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] internal unsafe struct UpdateLODGroupDataJob : IJobParallelFor { @@ -219,38 +173,6 @@ public void Execute(int index) } } - [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] - internal unsafe struct FreeLODGroupDataJob : IJob - { - [ReadOnly] public NativeArray destroyedLODGroupsID; - - public NativeList lodGroupsData; - public NativeParallelHashMap lodGroupDataHash; - public NativeList freeLODGroupDataHandles; - - [NativeDisableUnsafePtrRestriction] public int* removedRendererCount; - - public void Execute() - { - foreach (int lodGroupID in destroyedLODGroupsID) - { - if (lodGroupDataHash.TryGetValue(lodGroupID, out var lodGroupInstance)) - { - Assert.IsTrue(lodGroupInstance.valid); - - lodGroupDataHash.Remove(lodGroupID); - freeLODGroupDataHandles.Add(lodGroupInstance); - - ref LODGroupData lodGroupData = ref lodGroupsData.ElementAt(lodGroupInstance.index); - Assert.IsTrue(lodGroupData.valid); - - *removedRendererCount += lodGroupData.rendererCount; - lodGroupData.valid = false; - } - } - } - } - internal class LODGroupDataPool : IDisposable { private NativeList m_LODGroupData; @@ -329,18 +251,9 @@ public unsafe void UpdateLODGroupData(in GPUDrivenLODGroupData inputData) var lodGroupInstances = new NativeArray(inputData.lodGroupID.Length, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); - int previousRendererCount = 0; - - new AllocateOrGetLODGroupDataInstancesJob - { - lodGroupsID = inputData.lodGroupID, - lodGroupsData = m_LODGroupData, - lodGroupCullingData = m_LODGroupCullingData, - lodGroupDataHash = m_LODGroupDataHash, - freeLODGroupDataHandles = m_FreeLODGroupDataHandles, - lodGroupInstances = lodGroupInstances, - previousRendererCount = &previousRendererCount - }.Run(); + int previousRendererCount = LODGroupDataPoolBurst.AllocateOrGetLODGroupDataInstances(inputData.lodGroupID, + ref m_LODGroupData, ref m_LODGroupCullingData, + ref m_LODGroupDataHash, ref m_FreeLODGroupDataHandles, ref lodGroupInstances); m_CrossfadedRendererCount -= previousRendererCount; Assert.IsTrue(m_CrossfadedRendererCount >= 0); @@ -367,21 +280,12 @@ public unsafe void UpdateLODGroupData(in GPUDrivenLODGroupData inputData) lodGroupInstances.Dispose(); } - public unsafe void FreeLODGroupData(NativeArray destroyedLODGroupsID) + public void FreeLODGroupData(NativeArray destroyedLODGroupsID) { if (destroyedLODGroupsID.Length == 0) return; - int removedRendererCount = 0; - - new FreeLODGroupDataJob - { - destroyedLODGroupsID = destroyedLODGroupsID, - lodGroupsData = m_LODGroupData, - lodGroupDataHash = m_LODGroupDataHash, - freeLODGroupDataHandles = m_FreeLODGroupDataHandles, - removedRendererCount = &removedRendererCount - }.Run(); + int removedRendererCount = LODGroupDataPoolBurst.FreeLODGroupData(destroyedLODGroupsID, ref m_LODGroupData, ref m_LODGroupDataHash, ref m_FreeLODGroupDataHandles); m_CrossfadedRendererCount -= removedRendererCount; Assert.IsTrue(m_CrossfadedRendererCount >= 0); diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/LODGroupDataPoolBurst.cs b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/LODGroupDataPoolBurst.cs new file mode 100644 index 00000000000..efe0342a9fe --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/LODGroupDataPoolBurst.cs @@ -0,0 +1,72 @@ +using Unity.Collections; +using Unity.Burst; +using UnityEngine.Assertions; + +namespace UnityEngine.Rendering +{ + [BurstCompile] + internal static class LODGroupDataPoolBurst + { + [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] + public static int FreeLODGroupData(in NativeArray destroyedLODGroupsID, ref NativeList lodGroupsData, + ref NativeParallelHashMap lodGroupDataHash, ref NativeList freeLODGroupDataHandles) + { + int removedRendererCount = 0; + + foreach (int lodGroupID in destroyedLODGroupsID) + { + if (lodGroupDataHash.TryGetValue(lodGroupID, out var lodGroupInstance)) + { + Assert.IsTrue(lodGroupInstance.valid); + + lodGroupDataHash.Remove(lodGroupID); + freeLODGroupDataHandles.Add(lodGroupInstance); + + ref LODGroupData lodGroupData = ref lodGroupsData.ElementAt(lodGroupInstance.index); + Assert.IsTrue(lodGroupData.valid); + + removedRendererCount += lodGroupData.rendererCount; + lodGroupData.valid = false; + } + } + + return removedRendererCount; + } + + [BurstCompile(DisableSafetyChecks = true, OptimizeFor = OptimizeFor.Performance)] + public static int AllocateOrGetLODGroupDataInstances(in NativeArray lodGroupsID, ref NativeList lodGroupsData, ref NativeList lodGroupCullingData, + ref NativeParallelHashMap lodGroupDataHash, ref NativeList freeLODGroupDataHandles, ref NativeArray lodGroupInstances) + { + int freeHandlesCount = freeLODGroupDataHandles.Length; + int lodDataLength = lodGroupsData.Length; + int previousRendererCount = 0; + + for (int i = 0; i < lodGroupsID.Length; ++i) + { + int lodGroupID = lodGroupsID[i]; + + if (!lodGroupDataHash.TryGetValue(lodGroupID, out var lodGroupInstance)) + { + if (freeHandlesCount == 0) + lodGroupInstance = new GPUInstanceIndex() { index = lodDataLength++ }; + else + lodGroupInstance = freeLODGroupDataHandles[--freeHandlesCount]; + + lodGroupDataHash.TryAdd(lodGroupID, lodGroupInstance); + } + else + { + previousRendererCount += lodGroupsData.ElementAt(lodGroupInstance.index).rendererCount; + } + + lodGroupInstances[i] = lodGroupInstance; + } + + freeLODGroupDataHandles.ResizeUninitialized(freeHandlesCount); + lodGroupsData.ResizeUninitialized(lodDataLength); + lodGroupCullingData.ResizeUninitialized(lodDataLength); + + return previousRendererCount; + } + } +} diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/LODGroupDataPoolBurst.cs.meta b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/LODGroupDataPoolBurst.cs.meta new file mode 100644 index 00000000000..6e2ab16b7ac --- /dev/null +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/LODGroupDataPoolBurst.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ad57195e4230c9344a64d902de871991 \ No newline at end of file From 988c0fd458372b0b500de119376e486f718575bd Mon Sep 17 00:00:00 2001 From: Nanho Lee Date: Thu, 3 Apr 2025 11:25:07 +0000 Subject: [PATCH 10/28] Fixed a "[APV] Can no longer switch baking set mode" --- .../ProbeVolume/ProbeVolumeLightingTab.cs | 34 +------------------ 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeLightingTab.cs b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeLightingTab.cs index a6782816899..c556fbdce65 100644 --- a/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeLightingTab.cs +++ b/Packages/com.unity.render-pipelines.core/Editor/Lighting/ProbeVolume/ProbeVolumeLightingTab.cs @@ -48,7 +48,6 @@ static class Styles public static readonly string msgEnableAll = "Some loaded Scenes are disabled by this Baking Set. These Scenes will not contribute to the generation of probe data."; public static readonly string msgUnloadOther = "Scene(s) not belonging to this Baking Set are currently loaded in the Hierarchy. This might result in incorrect lighting."; public static readonly string msgLoadForBake = "Some scene(s) in this Baking Set are not currently loaded in the Hierarchy. This might result in missing or incomplete lighting."; - public static readonly string msgIncorrectBakingSet = "The currently loaded scenes do not match the assigned Baking Set. To resolve this, make sure to load the scenes that correspond to the assigned Baking Set, unload any scenes that don’t belong, and verify the scene setup before generating lighting to ensure everything bakes correctly."; public const float statusLabelWidth = 80; @@ -222,18 +221,6 @@ public override void OnGUI() Initialize(); var prv = ProbeReferenceVolume.instance; - // The CurrentBakingSet may change when you open an additional Scene with APV - if (prv.currentBakingSet != activeSet) - { - if (prv.currentBakingSet == null) - { - m_SingleSceneMode = true; - } - else - { - OpenBakingSet(prv.currentBakingSet); - } - } // In single scene mode, user can't control active set, so we automatically create a new one // in case the active scene doesn't have a baking set so that we can display baking settings @@ -372,9 +359,8 @@ void BakingGUI() { if (newSet != null) { EditorUtility.SetDirty(newSet); newSet.singleSceneMode = false; } activeSet = newSet; - + ProbeReferenceVolume.instance.Clear(); - ProbeReferenceVolume.instance.SetActiveBakingSet(activeSet); } if (activeSet != null) @@ -497,24 +483,6 @@ void ShowWarnings() } } - if (activeSet == ProbeReferenceVolume.instance.currentBakingSet) - { - hasWarnings = true; - foreach (var sceneDataList in ProbeReferenceVolume.instance.perSceneDataList) - { - if (sceneDataList.bakingSet == activeSet) - { - hasWarnings = false; - break; - } - } - - if (hasWarnings) - { - EditorGUILayout.HelpBox(Styles.msgIncorrectBakingSet, MessageType.Warning); - } - } - scenesForBake.Clear(); scenesToUnload.Clear(); scenesToEnable.Clear(); From 2a2bda1f8fc7b01e36ae85a311539fbc5e38d0a6 Mon Sep 17 00:00:00 2001 From: Xiaoling Yao Date: Thu, 3 Apr 2025 17:12:55 +0000 Subject: [PATCH 11/28] UUM-76696: Fix terrain detail instancing under DX11 --- .../Editor/ShaderScriptableStripper.cs | 4 +- .../Shaders/Terrain/TerrainLit.shader | 4 +- .../Shaders/Terrain/TerrainLitAdd.shader | 7 +- .../Shaders/Terrain/TerrainLitBase.shader | 3 +- .../UniversalRPAssetRenderingLayers.asset | 12 - ...errainBlend_deferred_RenderingLayers.unity | 2 +- .../240_DetailInstancing_RenderingLayer.meta | 8 + .../240_DetailInstancing_RenderingLayer.unity | 488 ++++++++++++++++++ ...DetailInstancing_RenderingLayer.unity.meta | 7 + .../240 TerrainData.asset | Bin 0 -> 561608 bytes .../240 TerrainData.asset.meta | 8 + .../Cube.prefab | 113 ++++ .../Cube.prefab.meta | 7 + .../ProjectSettings/QualitySettings.asset | 14 +- 14 files changed, 652 insertions(+), 25 deletions(-) create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer.unity create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer.unity.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/240 TerrainData.asset create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/240 TerrainData.asset.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/Cube.prefab create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/Cube.prefab.meta diff --git a/Packages/com.unity.render-pipelines.universal/Editor/ShaderScriptableStripper.cs b/Packages/com.unity.render-pipelines.universal/Editor/ShaderScriptableStripper.cs index 43eb10ecf4e..7b4dc83ee19 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/ShaderScriptableStripper.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/ShaderScriptableStripper.cs @@ -111,6 +111,8 @@ public bool PassHasKeyword(LocalKeyword keyword) Shader m_PaniniProjection = Shader.Find("Hidden/Universal Render Pipeline/PaniniProjection"); Shader m_Bloom = Shader.Find("Hidden/Universal Render Pipeline/Bloom"); Shader m_TerrainLit = Shader.Find("Universal Render Pipeline/Terrain/Lit"); + Shader m_TerrainLitAddPass = Shader.Find("Universal Render Pipeline/Terrain/Lit (Add Pass)"); + Shader m_TerrainLitBasePass = Shader.Find("Universal Render Pipeline/Terrain/Lit (Base Pass)"); Shader m_StencilDeferred = Shader.Find("Hidden/Universal Render Pipeline/StencilDeferred"); Shader m_ClusterDeferred = Shader.Find("Hidden/Universal Render Pipeline/ClusterDeferred"); Shader m_UberPostShader = Shader.Find("Hidden/Universal Render Pipeline/UberPost"); @@ -958,7 +960,7 @@ internal bool StripInvalidVariants_HDR(ref IShaderScriptableStrippingData stripp internal bool StripInvalidVariants_TerrainHoles(ref IShaderScriptableStrippingData strippingData) { - if (strippingData.shader == m_TerrainLit) + if (strippingData.shader == m_TerrainLit || strippingData.shader == m_TerrainLitAddPass || strippingData.shader == m_TerrainLitBasePass) if (!strippingData.IsShaderFeatureEnabled(ShaderFeatures.TerrainHoles) && strippingData.IsKeywordEnabled(m_AlphaTestOn)) return true; return false; diff --git a/Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLit.shader b/Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLit.shader index 6b296c439a2..57d613fe218 100644 --- a/Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLit.shader +++ b/Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLit.shader @@ -162,8 +162,8 @@ Shader "Universal Render Pipeline/Terrain/Lit" //#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING #pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH - #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 + #pragma multi_compile_fragment _ _RENDER_PASS_ENABLED #pragma multi_compile _ _CLUSTER_LIGHT_LOOP #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl" @@ -175,10 +175,8 @@ Shader "Universal Render Pipeline/Terrain/Lit" #pragma multi_compile _ LIGHTMAP_ON #pragma multi_compile_fragment _ LIGHTMAP_BICUBIC_SAMPLING #pragma multi_compile _ DYNAMICLIGHTMAP_ON - #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Fog.hlsl" #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ProbeVolumeVariants.hlsl" #pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT - #pragma multi_compile_fragment _ _RENDER_PASS_ENABLED #pragma multi_compile_instancing #pragma instancing_options assumeuniformscaling nomatrices nolightprobe nolightmap diff --git a/Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitAdd.shader b/Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitAdd.shader index ffb530fa354..598142eafbb 100644 --- a/Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitAdd.shader +++ b/Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitAdd.shader @@ -48,8 +48,9 @@ Shader "Hidden/Universal Render Pipeline/Terrain/Lit (Add Pass)" Pass { - Name "TerrainAddLit" + Name "ForwardLit" Tags { "LightMode" = "UniversalForward" } + ZWrite Off Blend One One HLSLPROGRAM #pragma target 3.0 @@ -104,6 +105,7 @@ Shader "Hidden/Universal Render Pipeline/Terrain/Lit (Add Pass)" Name "GBuffer" Tags{"LightMode" = "UniversalGBuffer"} + ZWrite Off Blend 0 One One Blend 1 One One Blend 2 One One @@ -134,12 +136,13 @@ Shader "Hidden/Universal Render Pipeline/Terrain/Lit (Add Pass)" #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING #pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH - #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE #pragma multi_compile _ _CLUSTER_LIGHT_LOOP #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl" // ------------------------------------- // Unity defined keywords + #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING + #pragma multi_compile _ SHADOWS_SHADOWMASK #pragma multi_compile _ DIRLIGHTMAP_COMBINED #pragma multi_compile _ LIGHTMAP_ON #pragma multi_compile_fragment _ LIGHTMAP_BICUBIC_SAMPLING diff --git a/Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitBase.shader b/Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitBase.shader index f053f0988f5..ce1846ca79e 100644 --- a/Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitBase.shader +++ b/Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitBase.shader @@ -41,7 +41,7 @@ Shader "Hidden/Universal Render Pipeline/Terrain/Lit (Base Pass)" #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING - #pragma multi_compile _ SHADOWS_SHADOWMASKs + #pragma multi_compile _ SHADOWS_SHADOWMASK #pragma multi_compile _ _LIGHT_LAYERS #pragma multi_compile _ _CLUSTER_LIGHT_LOOP #pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS @@ -128,7 +128,6 @@ Shader "Hidden/Universal Render Pipeline/Terrain/Lit (Base Pass)" //#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING #pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH - #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE #pragma multi_compile _ _CLUSTER_LIGHT_LOOP #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl" diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/UniversalRPAssetRenderingLayers.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/UniversalRPAssetRenderingLayers.asset index cb239a834c5..e2127e5febb 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/UniversalRPAssetRenderingLayers.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/CommonAssets/UniversalRPAssetRenderingLayers.asset @@ -18,19 +18,7 @@ MonoBehaviour: m_RendererData: {fileID: 0} m_RendererDataList: - {fileID: 11400000, guid: f59607d3476b54858a594ea904187fb5, type: 2} - - {fileID: 11400000, guid: e46834cadfc4eb241bd46a362765a390, type: 2} - {fileID: 11400000, guid: 63cfed70ad0f433498f0c9564aca9906, type: 2} - - {fileID: 11400000, guid: ab1d554383c384b579bb06e59141ec9c, type: 2} - - {fileID: 11400000, guid: 4655de3dc9e4543669dc1a2ded31ef6a, type: 2} - - {fileID: 11400000, guid: 6f676805aede64702bef195ea8e85d30, type: 2} - - {fileID: 11400000, guid: 590f3c2dabc9147698f7027e50b2ecd6, type: 2} - - {fileID: 11400000, guid: 33768f1904a5640658411475990e6a10, type: 2} - - {fileID: 11400000, guid: 840ecf8b1c767914a888bcad292135dc, type: 2} - - {fileID: 11400000, guid: a4c0fb55eac69b44bb40fb6c36c637be, type: 2} - - {fileID: 11400000, guid: fe4beae404cfe4f4f9b5cb9a547ebc19, type: 2} - - {fileID: 11400000, guid: 69745c01135e9bc41824105838584836, type: 2} - - {fileID: 11400000, guid: 474a055b64b247e4fbb18d7ca29b69db, type: 2} - - {fileID: 11400000, guid: 044ced3f4a7374243ae50e121da23bf8, type: 2} m_DefaultRendererIndex: 0 m_RequireDepthTexture: 1 m_RequireOpaqueTexture: 1 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/040_Shader_TerrainBlend_deferred_RenderingLayers.unity b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/040_Shader_TerrainBlend_deferred_RenderingLayers.unity index b20be2e6a75..ce57a829d76 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/040_Shader_TerrainBlend_deferred_RenderingLayers.unity +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/040_Shader_TerrainBlend_deferred_RenderingLayers.unity @@ -263,7 +263,7 @@ MonoBehaviour: m_RequiresOpaqueTextureOption: 2 m_CameraType: 0 m_Cameras: [] - m_RendererIndex: 2 + m_RendererIndex: 1 m_VolumeLayerMask: serializedVersion: 2 m_Bits: 1 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer.meta new file mode 100644 index 00000000000..939f904cfde --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a83a8c9e466a2e64f86925e600335af9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer.unity b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer.unity new file mode 100644 index 00000000000..0ca673b81e9 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer.unity @@ -0,0 +1,488 @@ +%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: 10 + 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_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + 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_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: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + 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 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &337485437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 337485439} + - component: {fileID: 337485438} + m_Layer: 0 + m_Name: SelectRenderingQualityScript + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &337485438 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337485437} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f1decc188d2f3146ab93291a5c743e9, type: 3} + m_Name: + m_EditorClassIdentifier: + qualityLevelIndex: 3 + callbacks: [] +--- !u!4 &337485439 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337485437} + serializedVersion: 2 + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &377091179 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 377091182} + - component: {fileID: 377091181} + - component: {fileID: 377091180} + m_Layer: 0 + m_Name: Terrain + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!154 &377091180 +TerrainCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 377091179} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 2 + m_TerrainData: {fileID: 15600000, guid: 1c32d0bae69e93d43a9d0c657993f7bd, type: 2} + m_EnableTreeColliders: 1 +--- !u!218 &377091181 +Terrain: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 377091179} + m_Enabled: 1 + serializedVersion: 6 + m_TerrainData: {fileID: 15600000, guid: 1c32d0bae69e93d43a9d0c657993f7bd, type: 2} + m_TreeDistance: 5000 + m_TreeBillboardDistance: 50 + m_TreeCrossFadeLength: 5 + m_TreeMaximumFullLODCount: 50 + m_DetailObjectDistance: 80 + m_DetailObjectDensity: 1 + m_HeightmapPixelError: 5 + m_SplatMapDistance: 1000 + m_HeightmapMinimumLODSimplification: 0 + m_HeightmapMaximumLOD: 0 + m_ShadowCastingMode: 2 + m_DrawHeightmap: 0 + m_DrawInstanced: 0 + m_DrawTreesAndFoliage: 1 + m_StaticShadowCaster: 0 + m_IgnoreQualitySettings: 0 + m_ReflectionProbeUsage: 1 + m_MaterialTemplate: {fileID: 2100000, guid: 594ea882c5a793440b60ff72d896021e, type: 2} + m_BakeLightProbesForTrees: 1 + m_PreserveTreePrototypeLayers: 0 + m_DeringLightProbesForTrees: 1 + m_ReceiveGI: 1 + m_ScaleInLightmap: 0.0256 + m_LightmapParameters: {fileID: 15203, guid: 0000000000000000f000000000000000, type: 0} + m_GroupingID: 0 + m_RenderingLayerMask: 1 + m_AllowAutoConnect: 1 + m_EnableHeightmapRayTracing: 1 + m_EnableTreesAndDetailsRayTracing: 0 + m_TreeMotionVectorModeOverride: 3 +--- !u!4 &377091182 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 377091179} + serializedVersion: 2 + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &825157028 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 4978488346857466839, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_BackGroundColor.a + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4978488346857466839, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_NormalizedViewPortRect.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4978488346857466839, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_NormalizedViewPortRect.height + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 6456975910273469994, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_Name + value: StaticCamera + objectReference: {fileID: 0} + - target: {fileID: 7237400365955927806, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_RendererIndex + value: -1 + objectReference: {fileID: 0} + - target: {fileID: 8438127893108032973, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8438127893108032973, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_LocalPosition.x + value: 61.95666 + objectReference: {fileID: 0} + - target: {fileID: 8438127893108032973, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_LocalPosition.y + value: 18.068314 + objectReference: {fileID: 0} + - target: {fileID: 8438127893108032973, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_LocalPosition.z + value: 16.276543 + objectReference: {fileID: 0} + - target: {fileID: 8438127893108032973, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_LocalRotation.w + value: 0.7755467 + objectReference: {fileID: 0} + - target: {fileID: 8438127893108032973, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_LocalRotation.x + value: 0.52354926 + objectReference: {fileID: 0} + - target: {fileID: 8438127893108032973, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_LocalRotation.y + value: 0.2923398 + objectReference: {fileID: 0} + - target: {fileID: 8438127893108032973, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_LocalRotation.z + value: -0.19738515 + objectReference: {fileID: 0} + - target: {fileID: 8438127893108032973, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 25.962 + objectReference: {fileID: 0} + - target: {fileID: 8438127893108032973, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8438127893108032973, guid: a477888deb65a194793f87af3323de08, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: a477888deb65a194793f87af3323de08, type: 3} +--- !u!1 &1318578710 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1318578713} + - component: {fileID: 1318578712} + - component: {fileID: 1318578711} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1318578711 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1318578710} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_CustomShadowLayers: 0 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 0 + m_RenderingLayersMask: + serializedVersion: 0 + m_Bits: 1 + m_ShadowRenderingLayersMask: + serializedVersion: 0 + m_Bits: 1 + m_Version: 4 + m_LightLayerMask: 1 + m_ShadowLayerMask: 1 + m_RenderingLayers: 1 + m_ShadowRenderingLayers: 1 +--- !u!108 &1318578712 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1318578710} + m_Enabled: 1 + serializedVersion: 11 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + 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: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &1318578713 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1318578710} + serializedVersion: 2 + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1318578713} + - {fileID: 825157028} + - {fileID: 337485439} + - {fileID: 377091182} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer.unity.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer.unity.meta new file mode 100644 index 00000000000..7c0af5eb6d9 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0f1a5507ea180874d9535fd06eceb0e1 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/240 TerrainData.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/240 TerrainData.asset new file mode 100644 index 0000000000000000000000000000000000000000..e46c941aaa4226abece7c3c1ae864e4db5da4588 GIT binary patch literal 561608 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 z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZU~7R+RNu36>r5>H z0t5&UAV7cs0RjXF5FkK+009C72y89z?2EUqS4)5Z0RjXF5FkK+009C72oNAZfB*pk x1PBlyK!5-N0t5&UAV7cs0RjXF5FkL{g$i`$ilX{w0G{7h6fZki6!~2g{{u|38|eT5 literal 0 HcmV?d00001 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/240 TerrainData.asset.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/240 TerrainData.asset.meta new file mode 100644 index 00000000000..c170bcea081 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/240 TerrainData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1c32d0bae69e93d43a9d0c657993f7bd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 15600000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/Cube.prefab b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/Cube.prefab new file mode 100644 index 00000000000..0d1a5df7502 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/Cube.prefab @@ -0,0 +1,113 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &206789938949047527 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7008990344308566897} + - component: {fileID: 5574429419213530805} + - component: {fileID: 7767527184313356026} + - component: {fileID: 4833467457732832210} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7008990344308566897 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 206789938949047527} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 50, y: -0.00001, z: 50.00001} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &5574429419213530805 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 206789938949047527} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &7767527184313356026 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 206789938949047527} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, 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_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &4833467457732832210 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 206789938949047527} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/Cube.prefab.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/Cube.prefab.meta new file mode 100644 index 00000000000..a7aafd443ae --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/Assets/Scenes/240_DetailInstancing_RenderingLayer/Cube.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7126ee636b5a3a34da9d051bd82e0950 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/ProjectSettings/QualitySettings.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/ProjectSettings/QualitySettings.asset index 14808a7f50b..dc1bfecc324 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/ProjectSettings/QualitySettings.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Terrain/ProjectSettings/QualitySettings.asset @@ -6,7 +6,7 @@ QualitySettings: serializedVersion: 5 m_CurrentQuality: 0 m_QualitySettings: - - serializedVersion: 4 + - serializedVersion: 5 name: Ultra pixelLightCount: 4 shadows: 2 @@ -34,6 +34,7 @@ QualitySettings: adaptiveVsyncExtraA: 0 adaptiveVsyncExtraB: 0 lodBias: 2 + meshLodThreshold: 1 maximumLODLevel: 0 enableLODCrossFade: 1 streamingMipmapsActive: 0 @@ -59,7 +60,7 @@ QualitySettings: terrainFadeLength: 5 terrainMaxTrees: 50 excludedTargetPlatforms: [] - - serializedVersion: 4 + - serializedVersion: 5 name: Backbuffer pixelLightCount: 4 shadows: 2 @@ -87,6 +88,7 @@ QualitySettings: adaptiveVsyncExtraA: 0 adaptiveVsyncExtraB: 0 lodBias: 2 + meshLodThreshold: 1 maximumLODLevel: 0 enableLODCrossFade: 0 streamingMipmapsActive: 0 @@ -112,7 +114,7 @@ QualitySettings: terrainFadeLength: 5 terrainMaxTrees: 50 excludedTargetPlatforms: [] - - serializedVersion: 4 + - serializedVersion: 5 name: MotionVectorDebugRendering pixelLightCount: 4 shadows: 2 @@ -140,6 +142,7 @@ QualitySettings: adaptiveVsyncExtraA: 0 adaptiveVsyncExtraB: 0 lodBias: 2 + meshLodThreshold: 1 maximumLODLevel: 0 enableLODCrossFade: 1 streamingMipmapsActive: 0 @@ -165,7 +168,7 @@ QualitySettings: terrainFadeLength: 5 terrainMaxTrees: 50 excludedTargetPlatforms: [] - - serializedVersion: 4 + - serializedVersion: 5 name: RenderingLayers pixelLightCount: 4 shadows: 2 @@ -193,6 +196,7 @@ QualitySettings: adaptiveVsyncExtraA: 0 adaptiveVsyncExtraB: 0 lodBias: 2 + meshLodThreshold: 1 maximumLODLevel: 0 enableLODCrossFade: 1 streamingMipmapsActive: 0 @@ -221,6 +225,8 @@ QualitySettings: m_TextureMipmapLimitGroupNames: [] m_PerPlatformDefaultQuality: Android: 0 + GameCoreScarlett: 0 + GameCoreXboxOne: 0 LinuxHeadlessSimulation: 0 Nintendo 3DS: 0 Nintendo Switch: 0 From 28176a2dac850e7c5bfcfabf20ff331547e8c590 Mon Sep 17 00:00:00 2001 From: Chris Chu Date: Fri, 4 Apr 2025 03:13:22 +0000 Subject: [PATCH 12/28] [UUM-97647] Fix for Null Exception in a Shadow Shape Editor --- .../Editor/2D/Shadows/ShadowCaster2DEditor.cs | 3 ++- .../ShadowProvider/ShadowShape2DProvider_ProperyDrawer.cs | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Shadows/ShadowCaster2DEditor.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/Shadows/ShadowCaster2DEditor.cs index 57459f42989..b220620fe8d 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/Shadows/ShadowCaster2DEditor.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Shadows/ShadowCaster2DEditor.cs @@ -131,7 +131,8 @@ public override void OnInspectorGUI() else if (EditorToolManager.IsActiveTool()) ToolManager.RestorePreviousTool(); - EditorGUILayout.PropertyField(m_ShadowShape2DProvider, Styles.shadowShape2DProvider, true); + if(m_ShadowShape2DProvider != null) + EditorGUILayout.PropertyField(m_ShadowShape2DProvider, Styles.shadowShape2DProvider, true); serializedObject.ApplyModifiedProperties(); } diff --git a/Packages/com.unity.render-pipelines.universal/Editor/2D/Shadows/ShadowProvider/ShadowShape2DProvider_ProperyDrawer.cs b/Packages/com.unity.render-pipelines.universal/Editor/2D/Shadows/ShadowProvider/ShadowShape2DProvider_ProperyDrawer.cs index f7744662b62..e6b3fa4d411 100644 --- a/Packages/com.unity.render-pipelines.universal/Editor/2D/Shadows/ShadowProvider/ShadowShape2DProvider_ProperyDrawer.cs +++ b/Packages/com.unity.render-pipelines.universal/Editor/2D/Shadows/ShadowProvider/ShadowShape2DProvider_ProperyDrawer.cs @@ -25,7 +25,13 @@ bool IsChildVisible(Type parentType, SerializedProperty child) void ProcessChildren(SerializedProperty parentProperty, ProcessChild onProcessChild) { + if (parentProperty == null) + return; + var enumerator = parentProperty.GetEnumerator(); + if (enumerator.Current == null) + return; + object parentObj = parentProperty.managedReferenceValue; Type parentType = parentObj.GetType(); From ed06366f6301621468b6165366d823b48670483e Mon Sep 17 00:00:00 2001 From: Yohann Vaast Date: Fri, 4 Apr 2025 03:13:23 +0000 Subject: [PATCH 13/28] URP Render Graph - Move AfterRendering injection point --- .../Runtime/UniversalRendererRenderGraph.cs | 16 +++---- .../Scripts/Runtime/OutputTextureFeature.cs | 2 +- .../Scripts/Runtime/SetInputRequirements.cs | 2 +- .../DepthNormalsRendererDeferred.asset | 4 +- ...dererDeferred_AccurateGBufferNormals.asset | 4 +- .../DepthNormalsRendererForward.asset | 4 +- .../Renderers/DepthRendererDeferred.asset | 4 +- .../Renderers/DepthRendererForward.asset | 4 +- .../SSAO_DeferredRenderer_AfterOpaque.asset | 11 +---- .../SSAO_DeferredRenderer_Output_SSAO.asset | 13 ++---- .../SSAO_DeferredRenderer_RenderPass.asset | 13 ++---- .../Renderers/SSAO_DepthNormalRenderer.asset | 13 ++---- ...SSAO_DepthNormalRenderer_Interleaved.asset | 13 ++---- .../Renderers/SSAO_DepthRenderer.asset | 13 ++---- .../SSAO_DepthRenderer_Downsample.asset | 13 ++---- .../SSAO_DepthRenderer_Interleaved.asset | 13 ++---- ...280_HistoryVisualizerForwardRenderer.asset | 27 +++--------- .../Renderers/DepthNormalsRenderer.asset | 27 +++--------- .../200_Assets/Renderers/DepthRenderer.asset | 27 +++--------- .../Renderers/SSAO_DeferredRenderer.asset | 44 +++++++------------ .../Renderers/SSAO_DepthNormalRenderer.asset | 35 +++------------ 21 files changed, 87 insertions(+), 215 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs index 22798d3eec5..36cec88134c 100644 --- a/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs +++ b/Packages/com.unity.render-pipelines.universal/Runtime/UniversalRendererRenderGraph.cs @@ -1390,6 +1390,11 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.AfterRenderingPostProcessing); + if (cameraData.captureActions != null) + { + m_CapturePass.RecordRenderGraph(renderGraph, frameData); + } + if (applyFinalPostProcessing) { TextureHandle backbuffer = resourceData.backBufferColor; @@ -1412,20 +1417,12 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) resourceData.activeDepthID = UniversalResourceData.ActiveID.BackBuffer; } - if (cameraData.captureActions != null) - { - m_CapturePass.RecordRenderGraph(renderGraph, frameData); - } - cameraTargetResolved = // final PP always blit to camera target applyFinalPostProcessing || // no final PP but we have PP stack. In that case it blit unless there are render pass after PP (applyPostProcessing && !hasPassesAfterPostProcessing && !hasCaptureActions); - // TODO RENDERGRAPH: we need to discuss and decide if RenderPassEvent.AfterRendering injected passes should only be called after the last camera in the stack - RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.AfterRendering); - if (!resourceData.isActiveTargetBackBuffer && cameraData.resolveFinalTarget && !cameraTargetResolved) { TextureHandle backbuffer = resourceData.backBufferColor; @@ -1448,6 +1445,9 @@ private void OnAfterRendering(RenderGraph renderGraph, bool applyPostProcessing) resourceData.activeDepthID = UniversalResourceData.ActiveID.BackBuffer; } + // TODO RENDERGRAPH: we need to discuss and decide if RenderPassEvent.AfterRendering injected passes should only be called after the last camera in the stack + RecordCustomRenderGraphPasses(renderGraph, RenderPassEvent.AfterRendering); + // We can explicitely render the overlay UI from URP when HDR output is not enabled. // SupportedRenderingFeatures.active.rendersUIOverlay should also be set to true. bool shouldRenderUI = cameraData.rendersOverlayUI && cameraData.isLastBaseCamera; diff --git a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/OutputTextureFeature.cs b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/OutputTextureFeature.cs index f992e6ff8d1..b5e11bdd075 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/OutputTextureFeature.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/OutputTextureFeature.cs @@ -8,7 +8,7 @@ public class OutputTextureFeature : ScriptableRendererFeature { public Shader shader; public ScriptableRenderPassInput inputRequirement; - public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRendering; + public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing; public int renderPassEventAdjustment = 0; public Vector4 outputAdjustParams = new Vector4(0, 0, 1, 1); diff --git a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/SetInputRequirements.cs b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/SetInputRequirements.cs index f0237fffced..5589bc475b6 100644 --- a/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/SetInputRequirements.cs +++ b/Tests/SRPTests/Packages/com.unity.testing.urp/Scripts/Runtime/SetInputRequirements.cs @@ -14,7 +14,7 @@ public class SetInputRequirements : ScriptableRendererFeature { public ScriptableRenderPassInput inputRequirement; - public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRendering; + public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing; public int renderPassEventAdjustment = 0; private DummyPass m_DummyPass; diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthNormalsRendererDeferred.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthNormalsRendererDeferred.asset index c106e126b19..c8c09cfdb0a 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthNormalsRendererDeferred.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthNormalsRendererDeferred.asset @@ -56,6 +56,8 @@ MonoBehaviour: m_RenderingMode: 1 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &7456660863052077093 @@ -73,6 +75,6 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: 718823c46701e42c89603ff80f90f8b6, type: 3} inputRequirement: 2 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 outputAdjustParams: {x: 0, y: 0, z: 1, w: 1} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthNormalsRendererDeferred_AccurateGBufferNormals.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthNormalsRendererDeferred_AccurateGBufferNormals.asset index 4c69731b5f6..9c194cb0ac7 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthNormalsRendererDeferred_AccurateGBufferNormals.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthNormalsRendererDeferred_AccurateGBufferNormals.asset @@ -56,6 +56,8 @@ MonoBehaviour: m_RenderingMode: 1 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 1 m_IntermediateTextureMode: 1 --- !u!114 &7456660863052077093 @@ -73,6 +75,6 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: 718823c46701e42c89603ff80f90f8b6, type: 3} inputRequirement: 2 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 outputAdjustParams: {x: 0, y: 0, z: 1, w: 1} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthNormalsRendererForward.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthNormalsRendererForward.asset index 90ba071db8c..5fd64fad305 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthNormalsRendererForward.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthNormalsRendererForward.asset @@ -56,6 +56,8 @@ MonoBehaviour: m_RenderingMode: 0 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &7456660863052077093 @@ -73,6 +75,6 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: 718823c46701e42c89603ff80f90f8b6, type: 3} inputRequirement: 2 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 outputAdjustParams: {x: 0, y: 0, z: 1, w: 1} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthRendererDeferred.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthRendererDeferred.asset index 3050ea86987..55dda55593a 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthRendererDeferred.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthRendererDeferred.asset @@ -56,6 +56,8 @@ MonoBehaviour: m_RenderingMode: 1 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &1912622647174990926 @@ -73,6 +75,6 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: 7242d828152e64d0da5064e782974ac7, type: 3} inputRequirement: 1 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 outputAdjustParams: {x: 0, y: 0, z: 1, w: 1} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthRendererForward.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthRendererForward.asset index edea33f0449..fc23c6e9f0f 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthRendererForward.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/DepthRendererForward.asset @@ -56,6 +56,8 @@ MonoBehaviour: m_RenderingMode: 0 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &1912622647174990926 @@ -73,6 +75,6 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: 7242d828152e64d0da5064e782974ac7, type: 3} inputRequirement: 1 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 outputAdjustParams: {x: 0, y: 0, z: 1, w: 1} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer_AfterOpaque.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer_AfterOpaque.asset index e2c4bdd6610..12d8aef0160 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer_AfterOpaque.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer_AfterOpaque.asset @@ -56,6 +56,8 @@ MonoBehaviour: m_RenderingMode: 1 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &3778245575090843755 @@ -84,12 +86,3 @@ MonoBehaviour: BlurQuality: 2 Falloff: 1000 SampleCount: -1 - m_BlueNoise256Textures: - - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} - - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} - - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} - - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} - - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} - - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} - m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer_Output_SSAO.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer_Output_SSAO.asset index 16026d58a48..84d6dd763ce 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer_Output_SSAO.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer_Output_SSAO.asset @@ -15,7 +15,7 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: e61ad6112715047c9ac93c05f2990886, type: 3} inputRequirement: 0 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 outputAdjustParams: {x: 0, y: 0.5, z: 1, w: 1} --- !u!114 &11400000 @@ -75,6 +75,8 @@ MonoBehaviour: m_RenderingMode: 1 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &3778245575090843755 @@ -103,12 +105,3 @@ MonoBehaviour: BlurQuality: 1 Falloff: 1000 SampleCount: -1 - m_BlueNoise256Textures: - - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} - - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} - - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} - - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} - - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} - - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} - m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer_RenderPass.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer_RenderPass.asset index 7cfefeb4d50..24387e0e775 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer_RenderPass.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer_RenderPass.asset @@ -15,7 +15,7 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: e61ad6112715047c9ac93c05f2990886, type: 3} inputRequirement: 0 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 outputAdjustParams: {x: 0, y: 0.5, z: 1, w: 1} --- !u!114 &11400000 @@ -69,6 +69,8 @@ MonoBehaviour: m_RenderingMode: 1 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &3778245575090843755 @@ -97,12 +99,3 @@ MonoBehaviour: BlurQuality: 2 Falloff: 1000 SampleCount: -1 - m_BlueNoise256Textures: - - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} - - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} - - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} - - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} - - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} - - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} - m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthNormalRenderer.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthNormalRenderer.asset index 868e8029e0a..a40351b03ab 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthNormalRenderer.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthNormalRenderer.asset @@ -26,15 +26,6 @@ MonoBehaviour: BlurQuality: 2 Falloff: 1000 SampleCount: -1 - m_BlueNoise256Textures: - - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} - - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} - - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} - - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} - - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} - - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} - m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} --- !u!114 &11400000 MonoBehaviour: m_ObjectHideFlags: 0 @@ -86,6 +77,8 @@ MonoBehaviour: m_RenderingMode: 0 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &5568179863035868408 @@ -103,6 +96,6 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: e61ad6112715047c9ac93c05f2990886, type: 3} inputRequirement: 0 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 outputAdjustParams: {x: 0, y: 0.5, z: 1, w: 1} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthNormalRenderer_Interleaved.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthNormalRenderer_Interleaved.asset index 19314209d32..81a540de448 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthNormalRenderer_Interleaved.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthNormalRenderer_Interleaved.asset @@ -26,15 +26,6 @@ MonoBehaviour: BlurQuality: 0 Falloff: 1000 SampleCount: -1 - m_BlueNoise256Textures: - - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} - - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} - - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} - - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} - - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} - - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} - m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} --- !u!114 &11400000 MonoBehaviour: m_ObjectHideFlags: 0 @@ -86,6 +77,8 @@ MonoBehaviour: m_RenderingMode: 0 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &5568179863035868408 @@ -103,6 +96,6 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: e61ad6112715047c9ac93c05f2990886, type: 3} inputRequirement: 0 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 outputAdjustParams: {x: 0, y: 0.5, z: 1, w: 1} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthRenderer.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthRenderer.asset index d08b4a58f53..ece92131612 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthRenderer.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthRenderer.asset @@ -15,7 +15,7 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: e61ad6112715047c9ac93c05f2990886, type: 3} inputRequirement: 0 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 outputAdjustParams: {x: 0, y: 0.5, z: 1, w: 1} --- !u!114 &11400000 @@ -69,6 +69,8 @@ MonoBehaviour: m_RenderingMode: 0 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &339116797255187971 @@ -97,12 +99,3 @@ MonoBehaviour: BlurQuality: 1 Falloff: 1000 SampleCount: -1 - m_BlueNoise256Textures: - - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} - - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} - - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} - - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} - - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} - - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} - m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthRenderer_Downsample.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthRenderer_Downsample.asset index 1554947d6b0..e7e9754480a 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthRenderer_Downsample.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthRenderer_Downsample.asset @@ -15,7 +15,7 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: e61ad6112715047c9ac93c05f2990886, type: 3} inputRequirement: 0 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 outputAdjustParams: {x: 0, y: 0.5, z: 1, w: 1} --- !u!114 &11400000 @@ -76,6 +76,8 @@ MonoBehaviour: m_RenderingMode: 0 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &339116797255187971 @@ -104,12 +106,3 @@ MonoBehaviour: BlurQuality: 2 Falloff: 1000 SampleCount: -1 - m_BlueNoise256Textures: - - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} - - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} - - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} - - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} - - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} - - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} - m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthRenderer_Interleaved.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthRenderer_Interleaved.asset index 03b297c921a..42f4f523930 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthRenderer_Interleaved.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/200_Assets/Renderers/SSAO_DepthRenderer_Interleaved.asset @@ -15,7 +15,7 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: e61ad6112715047c9ac93c05f2990886, type: 3} inputRequirement: 0 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 outputAdjustParams: {x: 0, y: 0.5, z: 1, w: 1} --- !u!114 &11400000 @@ -69,6 +69,8 @@ MonoBehaviour: m_RenderingMode: 0 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &339116797255187971 @@ -97,12 +99,3 @@ MonoBehaviour: BlurQuality: 2 Falloff: 1000 SampleCount: -1 - m_BlueNoise256Textures: - - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} - - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} - - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} - - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} - - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} - - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} - m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/280_HistoryRawColorDepth/280_HistoryVisualizerForwardRenderer.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/280_HistoryRawColorDepth/280_HistoryVisualizerForwardRenderer.asset index 8ea102c55bb..2cf12ca7cca 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/280_HistoryRawColorDepth/280_HistoryVisualizerForwardRenderer.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Foundation/Assets/Scenes/280_HistoryRawColorDepth/280_HistoryVisualizerForwardRenderer.asset @@ -38,27 +38,8 @@ MonoBehaviour: - {fileID: 4985089053552760918} m_RendererFeatureMap: 174f4a50f89932775658b30215982e45 m_UseNativeRenderPass: 0 - postProcessData: {fileID: 0} xrSystemData: {fileID: 11400000, guid: 60e1133243b97e347b653163a8c01b64, type: 2} - shaders: - blitPS: {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3} - copyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} - screenSpaceShadowPS: {fileID: 0} - samplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3} - stencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3} - fallbackErrorPS: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3} - fallbackLoadingPS: {fileID: 4800000, guid: 7f888aff2ac86494babad1c2c5daeee2, type: 3} - materialErrorPS: {fileID: 0} - coreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3} - coreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, - type: 3} - blitHDROverlay: {fileID: 4800000, guid: a89bee29cffa951418fc1e2da94d1959, type: 3} - cameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf, - type: 3} - screenSpaceLensFlare: {fileID: 4800000, guid: 701880fecb344ea4c9cd0db3407ab287, - type: 3} - dataDrivenLensFlare: {fileID: 4800000, guid: 6cda457ac28612740adb23da5d39ea92, - type: 3} + postProcessData: {fileID: 0} m_AssetVersion: 2 m_OpaqueLayerMask: serializedVersion: 2 @@ -77,6 +58,8 @@ MonoBehaviour: m_RenderingMode: 0 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &4985089053552760918 @@ -94,7 +77,7 @@ MonoBehaviour: m_Active: 0 visualizeShader: {fileID: 4800000, guid: 51813323c18d44bf1af5fd3959bfcdf7, type: 3} historyToVisualize: 1 - renderPassEvent: 1000 + renderPassEvent: 600 --- !u!114 &8589096731126943511 MonoBehaviour: m_ObjectHideFlags: 0 @@ -110,4 +93,4 @@ MonoBehaviour: m_Active: 0 visualizeShader: {fileID: 4800000, guid: 51813323c18d44bf1af5fd3959bfcdf7, type: 3} historyToVisualize: 0 - renderPassEvent: 1000 + renderPassEvent: 600 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/DepthNormalsRenderer.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/DepthNormalsRenderer.asset index b3c3d86141d..edcaac08aba 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/DepthNormalsRenderer.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/DepthNormalsRenderer.asset @@ -31,31 +31,13 @@ MonoBehaviour: type: 3} probeSamplingDebugTexture: {fileID: 2800000, guid: 24ec0e140fb444a44ab96ee80844e18e, type: 3} + probeVolumeBlendStatesCS: {fileID: 0} m_RendererFeatures: - {fileID: 7456660863052077093} m_RendererFeatureMap: 25d8c6408c617b67 m_UseNativeRenderPass: 0 - postProcessData: {fileID: 0} xrSystemData: {fileID: 11400000, guid: 60e1133243b97e347b653163a8c01b64, type: 2} - shaders: - blitPS: {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3} - copyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} - screenSpaceShadowPS: {fileID: 0} - samplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3} - stencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3} - fallbackErrorPS: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3} - fallbackLoadingPS: {fileID: 4800000, guid: 7f888aff2ac86494babad1c2c5daeee2, type: 3} - materialErrorPS: {fileID: 4800000, guid: 5fd9a8feb75a4b5894c241777f519d4e, type: 3} - coreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3} - coreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, - type: 3} - blitHDROverlay: {fileID: 4800000, guid: a89bee29cffa951418fc1e2da94d1959, type: 3} - cameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf, - type: 3} - screenSpaceLensFlare: {fileID: 4800000, guid: 701880fecb344ea4c9cd0db3407ab287, - type: 3} - dataDrivenLensFlare: {fileID: 4800000, guid: 6cda457ac28612740adb23da5d39ea92, - type: 3} + postProcessData: {fileID: 0} m_AssetVersion: 2 m_OpaqueLayerMask: serializedVersion: 2 @@ -74,6 +56,8 @@ MonoBehaviour: m_RenderingMode: 0 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &7456660863052077093 @@ -91,5 +75,6 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: 718823c46701e42c89603ff80f90f8b6, type: 3} inputRequirement: 2 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 + outputAdjustParams: {x: 0, y: 0, z: 1, w: 1} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/DepthRenderer.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/DepthRenderer.asset index d7ce01292b7..23e9bd09540 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/DepthRenderer.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/DepthRenderer.asset @@ -31,31 +31,13 @@ MonoBehaviour: type: 3} probeSamplingDebugTexture: {fileID: 2800000, guid: 24ec0e140fb444a44ab96ee80844e18e, type: 3} + probeVolumeBlendStatesCS: {fileID: 0} m_RendererFeatures: - {fileID: 1912622647174990926} m_RendererFeatureMap: 4e8c3b022a008b1a m_UseNativeRenderPass: 0 - postProcessData: {fileID: 0} xrSystemData: {fileID: 11400000, guid: 60e1133243b97e347b653163a8c01b64, type: 2} - shaders: - blitPS: {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3} - copyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} - screenSpaceShadowPS: {fileID: 0} - samplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3} - stencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3} - fallbackErrorPS: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3} - fallbackLoadingPS: {fileID: 4800000, guid: 7f888aff2ac86494babad1c2c5daeee2, type: 3} - materialErrorPS: {fileID: 4800000, guid: 5fd9a8feb75a4b5894c241777f519d4e, type: 3} - coreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3} - coreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, - type: 3} - blitHDROverlay: {fileID: 4800000, guid: a89bee29cffa951418fc1e2da94d1959, type: 3} - cameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf, - type: 3} - screenSpaceLensFlare: {fileID: 4800000, guid: 701880fecb344ea4c9cd0db3407ab287, - type: 3} - dataDrivenLensFlare: {fileID: 4800000, guid: 6cda457ac28612740adb23da5d39ea92, - type: 3} + postProcessData: {fileID: 0} m_AssetVersion: 2 m_OpaqueLayerMask: serializedVersion: 2 @@ -74,6 +56,8 @@ MonoBehaviour: m_RenderingMode: 0 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &1912622647174990926 @@ -91,5 +75,6 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: 7242d828152e64d0da5064e782974ac7, type: 3} inputRequirement: 1 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 + outputAdjustParams: {x: 0, y: 0, z: 1, w: 1} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer.asset index b4fb09a9a0d..ea96692458d 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/SSAO_DeferredRenderer.asset @@ -15,8 +15,9 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: e61ad6112715047c9ac93c05f2990886, type: 3} inputRequirement: 0 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 + outputAdjustParams: {x: 0, y: 0, z: 1, w: 1} --- !u!114 &11400000 MonoBehaviour: m_ObjectHideFlags: 0 @@ -32,30 +33,24 @@ MonoBehaviour: debugShaders: debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, type: 3} + hdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} + probeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, + type: 3} + probeVolumeResources: + probeVolumeDebugShader: {fileID: 0} + probeVolumeFragmentationDebugShader: {fileID: 0} + probeVolumeOffsetDebugShader: {fileID: 0} + probeVolumeSamplingDebugShader: {fileID: 0} + probeSamplingDebugMesh: {fileID: 0} + probeSamplingDebugTexture: {fileID: 0} + probeVolumeBlendStatesCS: {fileID: 0} m_RendererFeatures: - {fileID: 3778245575090843755} - {fileID: -638104044694843295} m_RendererFeatureMap: 6b307b2155066f346150398ec0ff24f7 m_UseNativeRenderPass: 0 - postProcessData: {fileID: 0} xrSystemData: {fileID: 11400000, guid: 60e1133243b97e347b653163a8c01b64, type: 2} - shaders: - blitPS: {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3} - copyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} - screenSpaceShadowPS: {fileID: 4800000, guid: 0f854b35a0cf61a429bd5dcfea30eddd, - type: 3} - samplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3} - stencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3} - fallbackErrorPS: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3} - fallbackLoadingPS: {fileID: 4800000, guid: 7f888aff2ac86494babad1c2c5daeee2, type: 3} - materialErrorPS: {fileID: 4800000, guid: 5fd9a8feb75a4b5894c241777f519d4e, type: 3} - coreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3} - coreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, - type: 3} - cameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf, - type: 3} - objectMotionVector: {fileID: 4800000, guid: 7b3ede40266cd49a395def176e1bc486, - type: 3} + postProcessData: {fileID: 0} m_AssetVersion: 2 m_OpaqueLayerMask: serializedVersion: 2 @@ -74,6 +69,8 @@ MonoBehaviour: m_RenderingMode: 1 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &3778245575090843755 @@ -102,12 +99,3 @@ MonoBehaviour: BlurQuality: 0 Falloff: 100 SampleCount: -1 - m_BlueNoise256Textures: - - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} - - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} - - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} - - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} - - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} - - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} - m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/SSAO_DepthNormalRenderer.asset b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/SSAO_DepthNormalRenderer.asset index 0fa6115ac99..29131543efd 100644 --- a/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/SSAO_DepthNormalRenderer.asset +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_Lighting/Assets/Scenes/200_Assets/Renderers/SSAO_DepthNormalRenderer.asset @@ -26,15 +26,6 @@ MonoBehaviour: BlurQuality: 0 Falloff: 100 SampleCount: -1 - m_BlueNoise256Textures: - - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} - - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} - - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} - - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} - - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} - - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} - m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} --- !u!114 &11400000 MonoBehaviour: m_ObjectHideFlags: 0 @@ -66,31 +57,14 @@ MonoBehaviour: type: 3} probeSamplingDebugTexture: {fileID: 2800000, guid: 24ec0e140fb444a44ab96ee80844e18e, type: 3} + probeVolumeBlendStatesCS: {fileID: 0} m_RendererFeatures: - {fileID: -1872376063803869872} - {fileID: 5568179863035868408} m_RendererFeatureMap: 50b506e7e3fb03e6f874bc7d1526464d m_UseNativeRenderPass: 0 - postProcessData: {fileID: 0} xrSystemData: {fileID: 11400000, guid: 60e1133243b97e347b653163a8c01b64, type: 2} - shaders: - blitPS: {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3} - copyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} - screenSpaceShadowPS: {fileID: 4800000, guid: 0f854b35a0cf61a429bd5dcfea30eddd, - type: 3} - samplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3} - stencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3} - fallbackErrorPS: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3} - fallbackLoadingPS: {fileID: 4800000, guid: 7f888aff2ac86494babad1c2c5daeee2, type: 3} - materialErrorPS: {fileID: 4800000, guid: 5fd9a8feb75a4b5894c241777f519d4e, type: 3} - coreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3} - coreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, - type: 3} - blitHDROverlay: {fileID: 4800000, guid: a89bee29cffa951418fc1e2da94d1959, type: 3} - cameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf, - type: 3} - objectMotionVector: {fileID: 4800000, guid: 7b3ede40266cd49a395def176e1bc486, - type: 3} + postProcessData: {fileID: 0} m_AssetVersion: 2 m_OpaqueLayerMask: serializedVersion: 2 @@ -109,6 +83,8 @@ MonoBehaviour: m_RenderingMode: 0 m_DepthPrimingMode: 0 m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 m_AccurateGbufferNormals: 0 m_IntermediateTextureMode: 1 --- !u!114 &5568179863035868408 @@ -126,5 +102,6 @@ MonoBehaviour: m_Active: 1 shader: {fileID: 4800000, guid: e61ad6112715047c9ac93c05f2990886, type: 3} inputRequirement: 0 - renderPassEvent: 1000 + renderPassEvent: 600 renderPassEventAdjustment: 0 + outputAdjustParams: {x: 0, y: 0, z: 1, w: 1} From 773a737b5c54162e3d572f28774ad7a49378d050 Mon Sep 17 00:00:00 2001 From: Adrien Moulin Date: Fri, 4 Apr 2025 14:52:43 +0000 Subject: [PATCH 14/28] Graphics/SRP/Fix Subpass Attachments Indices when adding a depth attachment --- .../RenderGraph/Compiler/PassesData.cs | 119 +++++-------- .../NativePassCompilerRenderGraphTests.cs | 162 ++++++++++++++++++ 2 files changed, 205 insertions(+), 76 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/PassesData.cs b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/PassesData.cs index 7bdd2f70aa4..2d727c66342 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/PassesData.cs +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderGraph/Compiler/PassesData.cs @@ -1152,89 +1152,63 @@ public static void TryMergeNativeSubPass(CompilerContextData contextData, ref Na passToMerge.nativeSubPassIndex = nativePass.numNativeSubPasses - 1; } - // In the case where we add a new graph pass with depth to a native pass that didn't have it, we need to update - // inputs in all the previous native subpasses of the native pass - static void UpdateNativeSubPassesAttachments(CompilerContextData contextData, ref NativePassData nativePass) + // Call this function while merging a graph pass and you need to add the depth attachment used by this graph pass + // Make sure to call it before adding the rest of the graph pass attachments and its generated subpass + void AddDepthAttachmentFirstDuringMerge(CompilerContextData contextData, in PassFragmentData depthAttachment) { - int lastVisitedNativeSubpassIdx = -1; - ref readonly var fragmentList = ref nativePass.fragments; + // Native pass can only have a single depth attachment + Debug.Assert(!hasDepth); - var countPasses = nativePass.lastGraphPass - nativePass.firstGraphPass + 1; + fragments.Add(depthAttachment); + hasDepth = true; - // Do not iterate over the last graph pass as it is the one we are currently adding - for (var graphPassIdx = 0; graphPassIdx < countPasses - 1; ++graphPassIdx) - { - // We only check the first graph pass of each existing native subpass - if other graph passes - // have been merged into a native subpass, it's because they had the same attachments. - ref readonly var currGraphPass = - ref contextData.passData.ElementAt(nativePass.firstGraphPass + graphPassIdx); + var size = fragments.size; - // Already updated this native subpass - if (currGraphPass.nativeSubPassIndex + nativePass.firstNativeSubPass == lastVisitedNativeSubpassIdx) - { - continue; - } + // If depth is the only attachment of the native pass, we are done + if (size == 1) return; - // Shouldn't be necessary since we only check the first graph pass of each existing native subpass - // But let's be safe and check anyway if the pass has been culled or not. - if (currGraphPass.culled) - { - continue; - } + // size > 1 + // In this case, we are adding depth attachment to a native pass with other existing attachments + int prevDepthIdx = size - 1; - lastVisitedNativeSubpassIdx = currGraphPass.nativeSubPassIndex + nativePass.firstNativeSubPass; - ref var nativeSubPassDescriptor = - ref contextData.nativeSubPassData.ElementAt(lastVisitedNativeSubpassIdx); + // Depth must always been the first attachment, so we switch the previous first one with the recently added depth attachment + (fragments[0], fragments[prevDepthIdx]) = (fragments[prevDepthIdx], fragments[0]); + + var depthFlag = GetSubPassFlagForMerging(); + + // We also need to increment the attachment indices of all the previous subpasses of this native pass. + // Otherwise the existing subpasses will point to the wrong attachments with depth being set as the first one + for (var nativeSubPassIndex = firstNativeSubPass; nativeSubPassIndex < firstNativeSubPass + numNativeSubPasses; nativeSubPassIndex++) + { + ref var subPassDesc = ref contextData.nativeSubPassData.ElementAt(nativeSubPassIndex); // If depth ends up being bound only because of merging - if (!currGraphPass.fragmentInfoHasDepth && nativePass.hasDepth) + // Set SubPassFlags to best match the pass we are trying to merge with + subPassDesc.flags = depthFlag; + + // Updating subpass color outputs + for (int i = 0; i < subPassDesc.colorOutputs.Length; i++) { - // Set SubPassFlags to best match the pass we are trying to merge with - nativeSubPassDescriptor.flags = nativePass.GetSubPassFlagForMerging(); + if (subPassDesc.colorOutputs[i] == 0) + { + subPassDesc.colorOutputs[i] = prevDepthIdx; + } } - // MRT attachments + // Updating subpass color inputs (framebuffer fetch) + for (int i = 0; i < subPassDesc.inputs.Length; i++) { - int fragmentIdx = 0; - int colorOffset = (currGraphPass.fragmentInfoHasDepth) ? -1 : 0; - - nativeSubPassDescriptor.colorOutputs = - new AttachmentIndexArray(currGraphPass.numFragments + colorOffset); - - foreach (ref readonly var graphPassFragment in currGraphPass.Fragments(contextData)) + if (subPassDesc.inputs[i] == 0) { - // Check if we're handling the depth attachment - if (currGraphPass.fragmentInfoHasDepth && fragmentIdx == 0) - { - nativeSubPassDescriptor.flags = (graphPassFragment.accessFlags.HasFlag(AccessFlags.Write)) - ? SubPassFlags.None - : SubPassFlags.ReadOnlyDepth; - } - // It's a color attachment - else - { - // Find the index of this subpass's attachment in the native renderpass attachment list - int colorAttachmentIdx = -1; - for (int fragmentId = 0; fragmentId < fragmentList.size; ++fragmentId) - { - if (fragmentList[fragmentId].resource.index == graphPassFragment.resource.index) - { - colorAttachmentIdx = fragmentId; - break; - } - } - - Debug.Assert(colorAttachmentIdx >= - 0); // If this is not the case it means we are using an attachment in a sub pass that is not part of the native pass !?!? clear bug - - // Set up the color indexes - nativeSubPassDescriptor.colorOutputs[fragmentIdx + colorOffset] = colorAttachmentIdx; - } - - fragmentIdx++; + subPassDesc.inputs[i] = prevDepthIdx; } } + } + // We also need to update the shading rate image index (VRS) + if (hasShadingRateImage && shadingRateImageIndex == 0) + { + shadingRateImageIndex = prevDepthIdx; } } @@ -1257,18 +1231,11 @@ public static PassBreakAudit TryMerge(CompilerContextData contextData, int activ nativePass.numGraphPasses++; nativePass.lastGraphPass = passIdToMerge; - // Depth needs special handling if the native pass doesn't have depth and merges with a pass that does + // Depth needs special handling if the native pass doesn't have depth and merges with a graph pass that does // as we require the depth attachment to be at index 0 if (!nativePass.hasDepth && passToMerge.fragmentInfoHasDepth) { - nativePass.hasDepth = true; - nativePass.fragments.Add(contextData.fragmentData[passToMerge.firstFragment]); - var size = nativePass.fragments.size; - if (size > 1) - (nativePass.fragments[0], nativePass.fragments[size - 1]) = (nativePass.fragments[size - 1], nativePass.fragments[0]); - - // Must update indices from Native subPasses created before - UpdateNativeSubPassesAttachments(contextData, ref nativePass); + nativePass.AddDepthAttachmentFirstDuringMerge(contextData, contextData.fragmentData[passToMerge.firstFragment]); } // Update versions and flags of existing attachments and diff --git a/Packages/com.unity.render-pipelines.core/Tests/Editor/NativePassCompilerRenderGraphTests.cs b/Packages/com.unity.render-pipelines.core/Tests/Editor/NativePassCompilerRenderGraphTests.cs index 7dc8ad23e43..0aee4175baa 100644 --- a/Packages/com.unity.render-pipelines.core/Tests/Editor/NativePassCompilerRenderGraphTests.cs +++ b/Packages/com.unity.render-pipelines.core/Tests/Editor/NativePassCompilerRenderGraphTests.cs @@ -1416,5 +1416,167 @@ int CountGCAllocs(Action action) return gcAllocRecorder.sampleBlockCount; } } + + [Test] + public void UpdateSubpassAttachmentIndices_WhenDepthAttachmentIsAdded() + { + var g = AllocateRenderGraph(); + var buffers = ImportAndCreateBuffers(g); + + using (var builder = g.AddRasterRenderPass("NoDepth0_Subpass0", out var passData)) + { + builder.SetRenderAttachment(buffers.extraBuffers[0], 0); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + builder.AllowPassCulling(false); + } + + // Render Pass + // attachments: [extraBuffers[0]] + // subpass 0: color outputs : [0] + + using (var builder = g.AddRasterRenderPass("NoDepth1_Subpass0", out var passData)) + { + builder.SetRenderAttachment(buffers.extraBuffers[0], 0); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + builder.AllowPassCulling(false); + } + + // Render Pass + // attachments: [extraBuffers[0]] + // subpass 0: color outputs : [0] + + using (var builder = g.AddRasterRenderPass("NoDepth2_Subpass1", out var passData)) + { + builder.SetRenderAttachment(buffers.extraBuffers[1], 0); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + builder.AllowPassCulling(false); + } + + // Render Pass + // attachments: [extraBuffers[0], extraBuffers[1]] + // subpass 0: color outputs : [0] + // subpass 1: color outputs : [1] + + using (var builder = g.AddRasterRenderPass("NoDepth3_Subpass2", out var passData)) + { + builder.SetInputAttachment(buffers.extraBuffers[0], 0); + builder.SetInputAttachment(buffers.extraBuffers[1], 1); + builder.SetRenderAttachment(buffers.extraBuffers[2], 0); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + builder.AllowPassCulling(false); + } + + // Render Pass + // attachments: [extraBuffers[0], extraBuffers[1], extraBuffers[2]] + // subpass 0: color outputs : [0] + // subpass 1: color outputs : [1] + // subpass 2: color outputs : [2], inputs : [0, 1] + + using (var builder = g.AddRasterRenderPass("Depth_Subpass3", out var passData)) + { + builder.SetInputAttachment(buffers.extraBuffers[0], 0); + builder.SetRenderAttachmentDepth(buffers.depthBuffer, AccessFlags.Write); + builder.SetRenderAttachment(buffers.extraBuffers[3], 0); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + builder.AllowPassCulling(false); + } + + // Render Pass + // attachments: [depthBuffer, extraBuffers[1], extraBuffers[2], extraBuffers[0], extraBuffers[3]] + // subpass 0: color outputs : [0 -> 3] + // subpass 1: color outputs : [1] + // subpass 2: color outputs : [2], inputs : [0 -> 3, 1] + // subpass 3: color outputs : [4], inputs : [3] + + var result = g.CompileNativeRenderGraph(g.ComputeGraphHash()); + var passes = result.contextData.GetNativePasses(); + + // All graph passes are merged in the same render pass + Assert.IsTrue(passes != null && passes.Count == 1 && passes[0].numGraphPasses == 5 && passes[0].numNativeSubPasses == 4); + + // Depth is the first attachment + Assert.IsTrue(passes[0].attachments[0].handle.index == buffers.depthBuffer.handle.index); + Assert.IsTrue(passes[0].attachments[1].handle.index == buffers.extraBuffers[1].handle.index); + Assert.IsTrue(passes[0].attachments[2].handle.index == buffers.extraBuffers[2].handle.index); + Assert.IsTrue(passes[0].attachments[3].handle.index == buffers.extraBuffers[0].handle.index); + Assert.IsTrue(passes[0].attachments[4].handle.index == buffers.extraBuffers[3].handle.index); + + // Check first subpass is correctly updated + ref var subPassDesc0 = ref result.contextData.nativeSubPassData.ElementAt(0); + Assert.IsTrue(subPassDesc0.colorOutputs.Length == 1); + Assert.IsTrue(subPassDesc0.colorOutputs[0] == 3); + + // Check second subpass is correctly updated + ref var subPassDesc1 = ref result.contextData.nativeSubPassData.ElementAt(1); + Assert.IsTrue(subPassDesc1.colorOutputs.Length == 1); + Assert.IsTrue(subPassDesc1.colorOutputs[0] == 1); + + // Check third subpass is correctly updated + ref var subPassDesc2 = ref result.contextData.nativeSubPassData.ElementAt(2); + Assert.IsTrue(subPassDesc2.colorOutputs.Length == 1); + Assert.IsTrue(subPassDesc2.colorOutputs[0] == 2); + Assert.IsTrue(subPassDesc2.inputs.Length == 2); + Assert.IsTrue(subPassDesc2.inputs[0] == 3); + Assert.IsTrue(subPassDesc2.inputs[1] == 1); + + // Check fourth subpass with depth is correct + ref var subPassDesc3 = ref result.contextData.nativeSubPassData.ElementAt(3); + Assert.IsTrue(subPassDesc3.colorOutputs.Length == 1); + Assert.IsTrue(subPassDesc3.colorOutputs[0] == 4); + Assert.IsTrue(subPassDesc3.inputs.Length == 1); + Assert.IsTrue(subPassDesc3.inputs[0] == 3); + } + +/* //VRS bug. It seems that there is a bug with VRS forcing pass breaking between passes using the same shading rate image where it shouldn't: UUM-102113. + [Test] + public void UpdateShadingRateImageIndex_WhenDepthAttachmentIsAdded() + { + var g = AllocateRenderGraph(); + var buffers = ImportAndCreateBuffers(g); + + using (var builder = g.AddRasterRenderPass("NoDepth_Subpass0", out var passData)) + { + builder.SetShadingRateImageAttachment(buffers.extraBuffers[0]); + builder.SetRenderAttachment(buffers.extraBuffers[1], 0); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + builder.AllowPassCulling(false); + } + + // Render Pass + // attachments: [extraBuffers[0], extraBuffers[1]] + // shading rate image : [0] + // subpass 0: color outputs : [1] + + using (var builder = g.AddRasterRenderPass("Depth_Subpass1", out var passData)) + { + builder.SetShadingRateImageAttachment(buffers.extraBuffers[0]); + builder.SetRenderAttachmentDepth(buffers.depthBuffer, AccessFlags.Write); + builder.SetRenderAttachment(buffers.extraBuffers[2], 0); + builder.SetRenderFunc((RenderGraphTestPassData data, RasterGraphContext context) => { }); + builder.AllowPassCulling(false); + } + + // Render Pass + // attachments: [depthBuffer, extraBuffers[1], extraBuffers[0], extraBuffers[2]] + // shading rate image : [0 -> 2] + // subpass 0: color outputs : [1] + // subpass 1: color outputs : [3] + + var result = g.CompileNativeRenderGraph(g.ComputeGraphHash()); + var passes = result.contextData.GetNativePasses(); + + // All graph passes are merged in the same render pass + Assert.IsTrue(passes != null && passes.Count == 1 && passes[0].numGraphPasses == 2 && passes[0].numNativeSubPasses == 2); + + // Depth is the first attachment + Assert.IsTrue(passes[0].attachments[0].handle.index == buffers.depthBuffer.handle.index); + Assert.IsTrue(passes[0].attachments[1].handle.index == buffers.extraBuffers[1].handle.index); + Assert.IsTrue(passes[0].attachments[2].handle.index == buffers.extraBuffers[0].handle.index); + Assert.IsTrue(passes[0].attachments[3].handle.index == buffers.extraBuffers[2].handle.index); + + // Check Shading Rate Image index is correctly updated + Assert.IsTrue(passes[0].shadingRateImageIndex == buffers.extraBuffers[0].handle.index); + } +*/ } } From 1a0e17fe207b1c51fc731b28ac71182c1ad91ff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Slysz?= Date: Fri, 4 Apr 2025 14:52:46 +0000 Subject: [PATCH 15/28] Update LookDevVolumeProfileSettings.cs --- .../LookDevVolumeProfileSettingsPropertyDrawer.cs | 2 +- .../Runtime/Settings/LookDevVolumeProfileSettings.cs | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Editor/PropertyDrawers/LookDevVolumeProfileSettingsPropertyDrawer.cs b/Packages/com.unity.render-pipelines.high-definition/Editor/PropertyDrawers/LookDevVolumeProfileSettingsPropertyDrawer.cs index cd0e7f96e4b..99cc74a5039 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Editor/PropertyDrawers/LookDevVolumeProfileSettingsPropertyDrawer.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Editor/PropertyDrawers/LookDevVolumeProfileSettingsPropertyDrawer.cs @@ -111,7 +111,7 @@ VisualElement CreateAssetFieldUI() if (lookDevVolumeProfileSettings.volumeProfile == null) { lookDevVolumeProfileSettings.volumeProfile = VolumeUtils.CopyVolumeProfileFromResourcesToAssets( - GraphicsSettings.GetRenderPipelineSettings().defaultVolumeProfile); + GraphicsSettings.GetRenderPipelineSettings().lookDevVolumeProfile); } m_VolumeProfileSerializedProperty.objectReferenceValue = lookDevVolumeProfileSettings.volumeProfile; diff --git a/Packages/com.unity.render-pipelines.high-definition/Runtime/Settings/LookDevVolumeProfileSettings.cs b/Packages/com.unity.render-pipelines.high-definition/Runtime/Settings/LookDevVolumeProfileSettings.cs index cd3226f8cfe..0ff3a3c7794 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Runtime/Settings/LookDevVolumeProfileSettings.cs +++ b/Packages/com.unity.render-pipelines.high-definition/Runtime/Settings/LookDevVolumeProfileSettings.cs @@ -69,6 +69,13 @@ void IRenderPipelineGraphicsSettings.Reset() #if UNITY_EDITOR if (UnityEditor.Rendering.EditorGraphicsSettings.TryGetRenderPipelineSettingsForPipeline(out var rpgs)) { + //UUM-100350 + //For some reason, when the one in the HDRP template is modified, all its components are nullified instead of replaced. + //Removing it fully and creating it solve the issue. + string path = VolumeUtils.BuildDefaultNameForVolumeProfile(rpgs.lookDevVolumeProfile); + if (UnityEditor.AssetDatabase.AssetPathExists(path)) + UnityEditor.AssetDatabase.DeleteAsset(path); + volumeProfile = VolumeUtils.CopyVolumeProfileFromResourcesToAssets(rpgs.lookDevVolumeProfile); } #endif From 4dec0e285eb82a828045680d6f2bbe733e8ef47f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Carr=C3=A8re?= Date: Fri, 4 Apr 2025 14:52:47 +0000 Subject: [PATCH 16/28] DOCG-6857: Fix markdown markup in list --- .../raytracing-troubleshooting.md | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/Packages/com.unity.render-pipelines.high-definition/Documentation~/raytracing-troubleshooting.md b/Packages/com.unity.render-pipelines.high-definition/Documentation~/raytracing-troubleshooting.md index 4cc87068da3..edec6e0a39f 100644 --- a/Packages/com.unity.render-pipelines.high-definition/Documentation~/raytracing-troubleshooting.md +++ b/Packages/com.unity.render-pipelines.high-definition/Documentation~/raytracing-troubleshooting.md @@ -6,30 +6,23 @@ Incorrect lighting, such as missing shadows or lighting leaks, can occur if the - Lighting leaks and insufficient light contributions can occur in scenes with closed environments, improper probe placement, or incorrect fallback settings. - > [!NOTE] - > For each rasterized pixel, the lighting comes from at least five distinct sources: - > * Bullet text. - > * Directional (global) lights and their shadows - > * Direct local lights (point, spot, area) and their shadows - > * Indirect specular lighting: - > * Screen Space Reflection (SSR)/Ray Traced Reflection (RTR) - > * Planar reflection - > * Reflection probes - > * Sky cubemap - -- Indirect diffuse lighting: - - - Screen Space Global Illumination (SSGI)/Ray-Traced Global Illumination (RTGI) - - - Adaptive Probe Volumes (APV) - - - Light probe groups - - - Lightmaps - - - Ambient probes - -- Fog +To resolve lighting issues, you need to check the following light sources, which contribute to the illumination of each rasterized pixel in your scene: + +* Directional (global) lights and their shadows +* Direct local lights (point, spot, area) and their shadows +* Indirect specular lighting: + * Screen Space Reflection (SSR)/Ray Traced Reflection (RTR) + * Planar reflection + * Reflection probes + * Sky cubemap + +* Indirect diffuse lighting: + * Screen Space Global Illumination (SSGI)/Ray-Traced Global Illumination (RTGI) + * Adaptive Probe Volumes (APV) + * Light probe groups + * Lightmaps + * Ambient probes +* Fog ## Fix missing shadows from directional lights From 9e820d463f2a846a565e8a5d6fec0cd9442e690c Mon Sep 17 00:00:00 2001 From: Venkatesh Subramania Pillai Date: Fri, 4 Apr 2025 14:52:49 +0000 Subject: [PATCH 17/28] [2d] Fix (Case 98140) Fix case where Canvas Image artefacts appear when Sprite Packer is enabled --- .../Assets/Scenes/087_SpriteAtlas_Dilate.meta | 8 + .../Scenes/087_SpriteAtlas_Dilate.unity | 794 ++++++++++++++++++ .../Scenes/087_SpriteAtlas_Dilate.unity.meta | 7 + .../MapUI_Default.spriteatlasv2 | 16 + .../MapUI_Default.spriteatlasv2.meta | 82 ++ .../MapUI_Default_Atlas.meta | 8 + .../MapUI_Default_Atlas/Circle.png | Bin 0 -> 6085 bytes .../MapUI_Default_Atlas/Circle.png.meta | 272 ++++++ .../MapUI_Default_Atlas/HexagonFlatTop.png | Bin 0 -> 6927 bytes .../HexagonFlatTop.png.meta | 236 ++++++ .../MapUI_Default_Atlas/R8_vignetteSagaUI.png | Bin 0 -> 15352 bytes .../R8_vignetteSagaUI.png.meta | 156 ++++ .../MapUI_Default_Atlas/Triangle.png | Bin 0 -> 3382 bytes .../MapUI_Default_Atlas/Triangle.png.meta | 218 +++++ .../MapUI_R8.spriteatlasv2 | 16 + .../MapUI_R8.spriteatlasv2.meta | 82 ++ .../MapUI_R8_Atlas.meta | 8 + .../MapUI_R8_Atlas/Circle.png | Bin 0 -> 6085 bytes .../MapUI_R8_Atlas/Circle.png.meta | 272 ++++++ .../MapUI_R8_Atlas/HexagonFlatTop.png | Bin 0 -> 6927 bytes .../MapUI_R8_Atlas/HexagonFlatTop.png.meta | 236 ++++++ .../MapUI_R8_Atlas/R8_vignetteSagaUI.png | Bin 0 -> 15352 bytes .../MapUI_R8_Atlas/R8_vignetteSagaUI.png.meta | 156 ++++ .../MapUI_R8_Atlas/Triangle.png | Bin 0 -> 3382 bytes .../MapUI_R8_Atlas/Triangle.png.meta | 218 +++++ .../087_SpriteAtlas_Dilate/Sprites-Dilate.mat | 52 ++ .../Sprites-Dilate.mat.meta | 8 + .../Sprites-Dilate.shader | 52 ++ .../Sprites-Dilate.shader.meta | 9 + 29 files changed, 2906 insertions(+) create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate.unity create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate.unity.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default.spriteatlasv2 create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default.spriteatlasv2.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/Circle.png create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/Circle.png.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/HexagonFlatTop.png create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/HexagonFlatTop.png.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/R8_vignetteSagaUI.png create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/R8_vignetteSagaUI.png.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/Triangle.png create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/Triangle.png.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8.spriteatlasv2 create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8.spriteatlasv2.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/Circle.png create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/Circle.png.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/HexagonFlatTop.png create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/HexagonFlatTop.png.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/R8_vignetteSagaUI.png create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/R8_vignetteSagaUI.png.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/Triangle.png create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/Triangle.png.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/Sprites-Dilate.mat create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/Sprites-Dilate.mat.meta create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/Sprites-Dilate.shader create mode 100644 Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/Sprites-Dilate.shader.meta diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate.meta new file mode 100644 index 00000000000..ac2e864447f --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: acf57016d7370694b847901bc9525985 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate.unity b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate.unity new file mode 100644 index 00000000000..64929ce1243 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate.unity @@ -0,0 +1,794 @@ +%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: 10 + 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_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + 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_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: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + 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 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &273417551 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 273417553} + - component: {fileID: 273417552} + m_Layer: 0 + m_Name: R8_vignetteSagaUI (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &273417552 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 273417551} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 1112f7dfe254749418370d1f04e2e1f3, 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 21300000, guid: fc87da76bb3c847ef8699ea677d5ae74, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 10.24, y: 7.68} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &273417553 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 273417551} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 7.3, y: -6, z: 0} + m_LocalScale: {x: 0.75, y: 1.25, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &325462780 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 325462781} + - component: {fileID: 325462783} + - component: {fileID: 325462782} + m_Layer: 5 + m_Name: Vignette_0_Default + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &325462781 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 325462780} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.4, y: 0.4, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1390226662} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -450, y: 330} + m_SizeDelta: {x: -300, y: -100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &325462782 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 325462780} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 7c4a657cb1e2f44c5b698bf5d1a9469a, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &325462783 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 325462780} + m_CullTransparentMesh: 1 +--- !u!1 &854545200 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 854545202} + - component: {fileID: 854545201} + m_Layer: 0 + m_Name: R8_vignetteSagaUI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &854545201 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 854545200} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, 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_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 21300000, guid: 7c4a657cb1e2f44c5b698bf5d1a9469a, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 10.24, y: 7.68} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &854545202 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 854545200} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -7.3, y: -6, z: 0} + m_LocalScale: {x: 0.75, y: 1.25, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1089740734 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1089740739} + - component: {fileID: 1089740738} + - component: {fileID: 1089740737} + - component: {fileID: 1089740736} + - component: {fileID: 1089740735} + 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 &1089740735 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089740734} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 73231aa468d81ea49bc3d914080de185, type: 3} + m_Name: + m_EditorClassIdentifier: + ImageComparisonSettings: + TargetWidth: 512 + TargetHeight: 512 + TargetMSAASamples: 1 + PerPixelCorrectnessThreshold: 0.001 + PerPixelGammaThreshold: 0.003921569 + PerPixelAlphaThreshold: 0.003921569 + RMSEThreshold: 0 + AverageCorrectnessThreshold: 0.005 + IncorrectPixelsThreshold: 0.0000038146973 + UseHDR: 0 + UseBackBuffer: 0 + ImageResolution: 0 + ActiveImageTests: 1 + ActivePixelTests: 7 + WaitFrames: 1 + XRCompatible: 0 + gpuDrivenCompatible: 1 + CheckMemoryAllocation: 1 + renderBackendCompatibility: 2 + SetBackBufferResolution: 0 +--- !u!114 &1089740736 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089740734} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 +--- !u!81 &1089740737 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089740734} + m_Enabled: 1 +--- !u!20 &1089740738 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089740734} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 1} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + 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: 1 + orthographic size: 14 + 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 &1089740739 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089740734} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1390226658 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1390226662} + - component: {fileID: 1390226661} + - component: {fileID: 1390226660} + - component: {fileID: 1390226659} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1390226659 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1390226658} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1390226660 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1390226658} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 2048, y: 1152} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1390226661 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1390226658} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + m_Camera: {fileID: 1089740738} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1390226662 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1390226658} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 325462781} + - {fileID: 1566421299} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1505338897 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1505338900} + - component: {fileID: 1505338899} + - component: {fileID: 1505338898} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1505338898 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1505338897} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 01614664b831546d2ae94a42149d80ac, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1505338899 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1505338897} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1505338900 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1505338897} + serializedVersion: 2 + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1566421298 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1566421299} + - component: {fileID: 1566421301} + - component: {fileID: 1566421300} + m_Layer: 5 + m_Name: Vignette_1_R8 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1566421299 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566421298} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.4, y: 0.4, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1390226662} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 450, y: 330} + m_SizeDelta: {x: -300, y: -100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1566421300 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566421298} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: 1112f7dfe254749418370d1f04e2e1f3, type: 2} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: fc87da76bb3c847ef8699ea677d5ae74, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1566421301 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566421298} + m_CullTransparentMesh: 1 +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1390226662} + - {fileID: 1505338900} + - {fileID: 1089740739} + - {fileID: 854545202} + - {fileID: 273417553} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate.unity.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate.unity.meta new file mode 100644 index 00000000000..9531828bcdf --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 99c9720ab356a0642a771bea13969a05 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default.spriteatlasv2 b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default.spriteatlasv2 new file mode 100644 index 00000000000..9a2f736191a --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default.spriteatlasv2 @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!612988286 &1 +SpriteAtlasAsset: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + serializedVersion: 2 + m_MasterAtlas: {fileID: 0} + m_ImporterData: + packables: + - {fileID: 102900000, guid: c7a55ecbb37484dd08fd645f3fec3ea0, type: 3} + m_IsVariant: 0 + m_ScriptablePacker: {fileID: 0} diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default.spriteatlasv2.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default.spriteatlasv2.meta new file mode 100644 index 00000000000..3108ce8c4fa --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default.spriteatlasv2.meta @@ -0,0 +1,82 @@ +fileFormatVersion: 2 +guid: 211e79f695b488d48874e663ff25a207 +SpriteAtlasImporter: + externalObjects: {} + textureSettings: + serializedVersion: 2 + anisoLevel: 1 + compressionQuality: 50 + maxTextureSize: 2048 + textureCompression: 0 + filterMode: 1 + generateMipMaps: 0 + readable: 0 + crunchedCompression: 0 + sRGB: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 63 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 63 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 4 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 63 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + packingSettings: + serializedVersion: 2 + padding: 2 + blockOffset: 1 + allowAlphaSplitting: 0 + enableRotation: 0 + enableTightPacking: 0 + enableAlphaDilation: 0 + secondaryTextureSettings: {} + variantMultiplier: 1 + bindAsDefault: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas.meta new file mode 100644 index 00000000000..b32115af552 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c7a55ecbb37484dd08fd645f3fec3ea0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/Circle.png b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/Circle.png new file mode 100644 index 0000000000000000000000000000000000000000..a819a94061e76dd1e31179d28e9762622a17d53f GIT binary patch literal 6085 zcmbVQ30RWb*4}_Pi}R2}5~*np;1DV}P-0?gnORwyfrv_}kf36wew;dKPA6?Rm6oP9 zT8fR9S)b)_{L5@K$};MhWoeqJX%77#oleia|8xK8^1$aPR1Y)6+UB~001>z`3D6Kl^OwnHRgtf3B!T{DQsSX z11p*r#c>cN@DVfs9^N88i@lj6#7A*rxrv^Hp@tg-JU7~tuy#=pDTwdGiQ_W1CUI76 zT^`Ebx|!`BP4M=@dx$6qK>|m}!iy5(69p8JC*eCU1!>E>i3I$2h;XwfVX@pHJ}f90 z@54*t;K>dodp3#Wgm-m!a3s69xVhQkok&h3BFUBLNV0cwqL9dxMb7viF9PB%DLRG{ zLSOpB7xK-M5GNG!DMVswYN|u3vjZ z2-rznzL3jH#LF33QM_cKCjn9VR|pCGpR|dBA8A4oMijC5L`MgbJf!cyX!cJWKRGG> zyYpx^krU5J;3NtK2-fi@mLJCx@&s|b|AzYK@IN^~QX3TX)5pKml92Gzg+S<=f`suS zA^#FB2uD32Ha_e2H%EgA3R-&8a&5*Jy7toVPM zN4_-W)k9%$1<1Un{a8G!I9q!XS zNkn$JBxE~tZGJZkfX+&P`r=Sg>EMfu-K)nk+CF_5Q76>oS%<*8my{SZ4KwvGhUB9T zTNK`RNib#yRJ6|rPMluaP~6`t33fX{e_$^-E9s-N}s3TW=Q$+BjFfloCHqW`3EXYTnq`cE8e3yC}-I z&kUlIb=))#Cy+%C}9jO?pKn5QIHkxnA4LDSV z-tBb@N`u#h-7G^*lS!@4C&>d!vxXuATjdp~&2>1RkR@37r3#FedB`GUfikxzImMq9 zC5j?+80rjqynbmYe<66KajSUd@UbTmXIh9Ak!Ng0Rio?0lpW=v;HI0lNORbMsWKkE z@oP864wI=cttEY9vV8UwusES6GUvNXl#M=`EbkiynwT#bO^}{(t9^k!Bq~sFz<7a( z9mQS_N@AtDsNtChWtNHy!KVY*2#pBwOyBRlLQH_TK@w1?BUYtNwW5dGbh5+(JKu|{ zwhCV`Q>E;73w@|72<@d9p(gyglVI5(rb4x-@C=`J1AVBk1MRh|V93v{jW9L_zTuwl z+^H0_5@qy!5{`vhCSD}jo^{WCv6inptot@BBnVqxCxD1(!>vk$A`jK+MUn^9-7dzj z&1k9}ZHe?Wv}M-Zh@2U_tQ|A)$8sr9Za>@sr?0FoTk9ttLX|0!-P?*)--CfUli}h5 zX^_XV+3ELiW~)hE*`(V`{g4vfgEIWW%Kq*z0AX#L5%!ZCkn3;*PV~e?lA}w!gcDUOa|l&Kvf& zp0vDnMS4h4tr4?}a2qRI82=!9&*49Jzdi(+ZC{(N^q|Jh0K&->N0DE8Th zjTmk2&86`R&kgp7)veUtg5&7hNa9lNG#5TSCGQ%V1p7ma6$@Xu7(z+< zo*f83`S8xO0i=i2-Af;A#WAhMmHQNiX!IxvrXGmyQg^TC+JT34r`_8Ts8K>o4fEJ0 z%E$$Ms9nn0`>4!An|mup<`FVFO*?cK71;bN)AB~|<4~F7K-h|3FX%zKP}qGgoBQtM3LBf#gg^@RqtwAYz(id!jsZlo>xjYt*i3&grf##e=qk?h4tbWTE2L* zAfygc(m{FWi9Xti%12+%F5Xzxr4XOgU4C98+W}mzbf5AyKA880L7JBh%oRW4E;<*f zPbrI&EJINu6LLoC(XL2C?!(M8t1`X%&3-jP=Y#zfy@uQ_BfD6g8_NtTz;mc|hH&yh}x3e0aW8u;vD!y^>8_x0u zBXmz)#4>t_863r2r(~DKuasS+b8gunE5CT7 z1y>-6$n%XbgWY7Yu+5hEK)T|nn#>hyTIaKK?KLm7uV8XFdpHUUJ~PXImS6T7v7i-JV+0(NCB?py@sEJ z?7fruD3A%L0i`6b3H92&P z1Gl6v8fsm)-eQ`;9Ax&+ZF1XxOG9G~aQKaApuJ`Ix_CCJd>+kEVwMaD>r#vkC<~uV z-4;`z)T6zI?N?vH4JI>hXjoar1Y28MDZqHfw{jk=#Z)4zYZb+RP_zn;^?kL}3_gfZ zk5s7L?$0#Vhw}F1`O-}vb@VUA(*DdU+IFhs;n-c25KZ01>*s5KdXlGs9S_YqA6ZO{ z8_v*fubC%ZQZaLV-G}GBavw8E;aFOg+t)WKgYFPZYQzdWDUV|YR)I_2@E)ZA!OD@m z-p59EZNHte2eH|5U!(1xo}o!pCZ3=ZS!P;m56+_%34~W;HsJ9BR5m*OzB?%LpaN4( zQ}J~(ScueGnyc~cP=c#0UJ-j=ihaVdIl0L{UPa~Ptwq{eYmD5v*j9XdEezud$g zWfh{(VDn}x@_Qj)zt)txSahL2WRrL_Cnwt`*aoaJ!)O-`A763|1PayZ^qW-dLM-zd z8`0AvI;jWkF_jNnL8=gAe(PHZ$Kye`*Wh?ObaaHBUjg(3Kr zg>o4_M?=6;iad~lUzVYa`iydNcDU*wK({s;-QwEO;DegwFO6Rjiqp;3D@Ihop@5#t zH4jyVO}?9F7$~L*AlF>RtSMsd)+;wp)k4h6<+>uv=D~Bn^LQ;lrB1cXBj8eej)7|* z4YPCHq$>N+_Xgz#Pfmc77%dwEeNcq%M(smO9y)4itJInx;Wc~@F9nfn|J`2+B9}~+ z%S{k3LrK*JMv$pNKMU&r`11WEAYa)*ARKKBn_VJLb)zhHM130K|Ehs zp0)iS76L+x!0yTIhrev^(4DnqUhtz6bed5z(IzW}qoW$hD8l5WqL2}vZ``KUfIc$# z^u6~Z1858-&+pe>Q36Wj^mi3_sVHAsHawRZ_yM=A}CR&*HS$BMTZN~~x! zg3evz_jcgXyUWw(=swy-_ulsjE78LnRpg;R?&#n87Qm{vaOJk`a=(eP=+j3~)|(%p zM$wv7a60Wi{HA%ul(s2gvFykmrMHag=R)`9sW}R zty9FG%YtmaDK$KO>;1X_NoYe>`3=)JWx&^w=xbo;=iX_hjA!vGUDdl#*Ki)Du}Hq| zY**hseee0q?3Y&Eyc~t`!%aOTsTPReFMA@%-a)r883%hL{xsuF$1!feu3$bvTcyuS z(LXb8w&*4G`?ix&eb9ALI3R-+7tIldQT3p{&9-|oPpWCP@8r2mwZ<$*?=Qe!VxG^< zWl#nckAta0X#!-|^ODt&<(fZMwD)FrQ2^8q=fOD!+jWY1#{jRzq1*M?<6YhxTO5cv zjIYoA)Y>)ArUD>1bU3y`%FRi)F9X_4nZJLa_w+O~)U!F%8OoNo$HSbdaG)MaIm-&^64EmuiOeyY~ z7H9qzJJc+CSkp1ykA5hXs=dejbw2>Dtfo@awpMyH?M5?Y2(@53eyOP$2*Z~ZaKi~s zl1?3;5ua^HhvPc6Yo0Y4xeV`4@L7W0Hb1W#1JvGajZzJyf9=Q4<{Js@?xMl41>f&Z zx1P2@Nt-zJI9H$?+@%uV+-G4}B#OtzM6JqfvHFMucJK!sX$_-jgWsKY&2~KinOC&X z>95b}-99C?bX2hZfIiaFr>$2seogU?;?+G;Q3#>{URzO(CJesEdeN64Rt5lS6Nl^e zWHTaP?0gd(RcwmhTLAar4*Wh^NKcBkA3w=kQA|}?2|&-zneDARqz4(TgKe2Cud>m? z;<@O(o|@BX={Nr$Lbn``9v_wR@HdlA#6hOaQ~C@|@EtZyxzk|fT~&#(rs{{`0>9ws7K=-u&*Fq0 zG3}}=%oW5IMzsq8cuqW#AMlETSLSdkL>+d;;W_*;d8k1V{aY5{bSkyl5p zq>nI_QUZA+xT-bAYCwACW*(#6&EMje1ZmxLX)1oK>LP&j#lOO~2+F zTnE5ZD|E2fxjNVveY?4?WE>6F_;xO6SshxnH0J6PJ7iJ^!?eRbn&td~-@m8g!}Rv{ zWhhW$oaV@{MNY^X(jkq3jMKKng`0h#^|$NN9<7mgp4Xv{JC#iD zoP%49iy6gr=Jj*y+o-$id(Q$eZE)$x z)vmd_-8>5pzxj456~E;_ZfTWwtq@~j`#5gWt{Ow?euLfTd$YHtfX4=`!DrD!G>biv zSg-t!bq52|2Eb`gTq$b0Iu&2+9#F?#aJgM`atNHZZ(6Rk{4i+dX} zCoicVz)pJ>ewGAmGHWU%2BuKiXAQq)bX(N0}SDtzrxwH72Q8Fkvto9tTmsvj@GaAOq zREB5|7+5Ah59$Q+TdIAUUcE}goIvAXR9sKDctw;hEzY1qNXZY<5||9<^Q@niqwig{ zk?L>XEU{I7&C}#B7+w@|X*}}TDR6;jH=Hd^?md5)ZFBkr)BsIE8F%ZVi&beJF)Xtt zC9%WXu#p;*664wB%G2afgor|Sh9+Pr1PL4_xQMXU!u ztv?w>y5m}Uryn&}@jAu>D)?*}vk^b}gM=g;M5O zkGs5Xfqh|*+;qPfqQqeHka_dmKkipPL!AN>A8z)QgoDy-{p|ZS+LmvDL~(-0T;0F# zVDjh)1B=ht$#ym_)41c%7*pI>!3W`1=^6cF7Uc6ES)JuoNV?;Vay`$wnKblHtcl-r zo(rEU+#VECK!0|eCvSNh($ literal 0 HcmV?d00001 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/Circle.png.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/Circle.png.meta new file mode 100644 index 00000000000..2c14659a302 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/Circle.png.meta @@ -0,0 +1,272 @@ +fileFormatVersion: 2 +guid: 39cbb2200fa7a0040a86e0ca63080604 +TextureImporter: + internalIDToNameTable: + - first: + 213: -2413806693520163455 + second: Circle + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 256 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: 0 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: CloudRendering + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Nintendo Switch + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: Circle + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 256 + height: 256 + alignment: 0 + pivot: {x: 0.5, y: 0.5} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: + - - {x: 33, y: 128} + - {x: -33, y: 128} + - {x: -95, y: 95} + - {x: -128, y: 33} + - {x: -128, y: -33} + - {x: -95, y: -95} + - {x: -33, y: -128} + - {x: 33, y: -128} + - {x: 95, y: -95} + - {x: 128, y: -33} + - {x: 128, y: 33} + - {x: 95, y: 95} + physicsShape: + - - {x: 0, y: 128} + - {x: -39, y: 121} + - {x: -75, y: 103} + - {x: -103, y: 75} + - {x: -121, y: 39} + - {x: -128, y: 0} + - {x: -121, y: -39} + - {x: -103, y: -75} + - {x: -75, y: -103} + - {x: -39, y: -121} + - {x: 0, y: -128} + - {x: 39, y: -121} + - {x: 75, y: -103} + - {x: 103, y: -75} + - {x: 121, y: -39} + - {x: 128, y: 0} + - {x: 121, y: 39} + - {x: 103, y: 75} + - {x: 75, y: 103} + - {x: 39, y: 121} + tessellationDetail: 0 + bones: [] + spriteID: 18d3544e99f608ed0800000000000000 + internalID: -2413806693520163455 + vertices: [] + indices: + edges: [] + weights: [] + outline: + - - {x: 33, y: 128} + - {x: -33, y: 128} + - {x: -95, y: 95} + - {x: -128, y: 33} + - {x: -128, y: -33} + - {x: -95, y: -95} + - {x: -33, y: -128} + - {x: 33, y: -128} + - {x: 95, y: -95} + - {x: 128, y: -33} + - {x: 128, y: 33} + - {x: 95, y: 95} + customData: + physicsShape: + - - {x: 0, y: 128} + - {x: -39, y: 121} + - {x: -75, y: 103} + - {x: -103, y: 75} + - {x: -121, y: 39} + - {x: -128, y: 0} + - {x: -121, y: -39} + - {x: -103, y: -75} + - {x: -75, y: -103} + - {x: -39, y: -121} + - {x: 0, y: -128} + - {x: 39, y: -121} + - {x: 75, y: -103} + - {x: 103, y: -75} + - {x: 121, y: -39} + - {x: 128, y: 0} + - {x: 121, y: 39} + - {x: 103, y: 75} + - {x: 75, y: 103} + - {x: 39, y: 121} + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: + Circle: -2413806693520163455 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/HexagonFlatTop.png b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/HexagonFlatTop.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4a6f3d95faf5a95be484c2cab140dde748fbc5 GIT binary patch literal 6927 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 EUy_B!q5uE@ literal 0 HcmV?d00001 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/HexagonFlatTop.png.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/HexagonFlatTop.png.meta new file mode 100644 index 00000000000..c83ec002c6f --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/HexagonFlatTop.png.meta @@ -0,0 +1,236 @@ +fileFormatVersion: 2 +guid: 23d1fa82f7798f34191d838defc5f0c9 +TextureImporter: + internalIDToNameTable: + - first: + 213: 2747690628134850419 + second: Hexagon Flat Top + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 256 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: 0 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: CloudRendering + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Nintendo Switch + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: Hexagon Flat Top + rect: + serializedVersion: 2 + x: 0 + y: 15 + width: 256 + height: 226 + alignment: 0 + pivot: {x: 0.5, y: 0.5} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: + - - {x: -65, y: 113} + - {x: -128, y: 4} + - {x: -128, y: -4} + - {x: -65, y: -113} + - {x: 65, y: -113} + - {x: 128, y: -4} + - {x: 128, y: 4} + - {x: 65, y: 113} + physicsShape: + - - {x: -64, y: 111} + - {x: -128, y: 0} + - {x: -64, y: -111} + - {x: 64, y: -111} + - {x: 128, y: 0} + - {x: 64, y: 111} + tessellationDetail: 0 + bones: [] + spriteID: 37fc5a28112c12620800000000000000 + internalID: -712631045867808456 + vertices: [] + indices: + edges: [] + weights: [] + outline: + - - {x: -65, y: 113} + - {x: -128, y: 4} + - {x: -128, y: -4} + - {x: -65, y: -113} + - {x: 65, y: -113} + - {x: 128, y: -4} + - {x: 128, y: 4} + - {x: 65, y: 113} + customData: + physicsShape: + - - {x: -64, y: 111} + - {x: -128, y: 0} + - {x: -64, y: -111} + - {x: 64, y: -111} + - {x: 128, y: 0} + - {x: 64, y: 111} + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: + Hexagon Flat Top: -712631045867808456 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/R8_vignetteSagaUI.png b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_Default_Atlas/R8_vignetteSagaUI.png new file mode 100644 index 0000000000000000000000000000000000000000..26c88a25d4cc2d7185ac88ef6c74c61e8014d500 GIT binary patch literal 15352 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 literal 0 HcmV?d00001 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/Circle.png.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/Circle.png.meta new file mode 100644 index 00000000000..682c72849df --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/Circle.png.meta @@ -0,0 +1,272 @@ +fileFormatVersion: 2 +guid: 4ab9f302e876ef445b8fca718b35d05d +TextureImporter: + internalIDToNameTable: + - first: + 213: -2413806693520163455 + second: Circle + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 256 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: 0 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: CloudRendering + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Nintendo Switch + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: Circle + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 256 + height: 256 + alignment: 0 + pivot: {x: 0.5, y: 0.5} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: + - - {x: 33, y: 128} + - {x: -33, y: 128} + - {x: -95, y: 95} + - {x: -128, y: 33} + - {x: -128, y: -33} + - {x: -95, y: -95} + - {x: -33, y: -128} + - {x: 33, y: -128} + - {x: 95, y: -95} + - {x: 128, y: -33} + - {x: 128, y: 33} + - {x: 95, y: 95} + physicsShape: + - - {x: 0, y: 128} + - {x: -39, y: 121} + - {x: -75, y: 103} + - {x: -103, y: 75} + - {x: -121, y: 39} + - {x: -128, y: 0} + - {x: -121, y: -39} + - {x: -103, y: -75} + - {x: -75, y: -103} + - {x: -39, y: -121} + - {x: 0, y: -128} + - {x: 39, y: -121} + - {x: 75, y: -103} + - {x: 103, y: -75} + - {x: 121, y: -39} + - {x: 128, y: 0} + - {x: 121, y: 39} + - {x: 103, y: 75} + - {x: 75, y: 103} + - {x: 39, y: 121} + tessellationDetail: 0 + bones: [] + spriteID: 18d3544e99f608ed0800000000000000 + internalID: -2413806693520163455 + vertices: [] + indices: + edges: [] + weights: [] + outline: + - - {x: 33, y: 128} + - {x: -33, y: 128} + - {x: -95, y: 95} + - {x: -128, y: 33} + - {x: -128, y: -33} + - {x: -95, y: -95} + - {x: -33, y: -128} + - {x: 33, y: -128} + - {x: 95, y: -95} + - {x: 128, y: -33} + - {x: 128, y: 33} + - {x: 95, y: 95} + customData: + physicsShape: + - - {x: 0, y: 128} + - {x: -39, y: 121} + - {x: -75, y: 103} + - {x: -103, y: 75} + - {x: -121, y: 39} + - {x: -128, y: 0} + - {x: -121, y: -39} + - {x: -103, y: -75} + - {x: -75, y: -103} + - {x: -39, y: -121} + - {x: 0, y: -128} + - {x: 39, y: -121} + - {x: 75, y: -103} + - {x: 103, y: -75} + - {x: 121, y: -39} + - {x: 128, y: 0} + - {x: 121, y: 39} + - {x: 103, y: 75} + - {x: 75, y: 103} + - {x: 39, y: 121} + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: + Circle: -2413806693520163455 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/HexagonFlatTop.png b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/HexagonFlatTop.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4a6f3d95faf5a95be484c2cab140dde748fbc5 GIT binary patch literal 6927 zcmc&(3p~^7|Nm|#jaaD2B{O%KUF>2joREkibUPBWjmB(?O)Fw5Q7ZRT=&CfQq;%0b z@$KZOQ%Om8w4;+wN=O%#>i>*#I=|QH|Lgzz|6i~FUa#4A&+~acm-pxW`8>}v8-fGp z=xUp2LlC6v=j$B;K?v}OfX0slA4?Js#()pB*mrRf1nC&6-w0?&nK1-u7xBXuNfxmJ zm>f}pGn*@l<~hp}#6TK?W_rlPY)(8+f{o_I@`Y}=zB3ItET8L!TS#RQSz<5VGQRJs zL|*8sz%b6Lcn*V$^Ki$`lre#V1fGPAl_dy-Nlcj=ZbUB=JgbKZIP8dsB;E}-OKlLl zh!u?W5+(AmG-o27LnKnMbcQpDMxio@PFOOLOeB!V1R?`ZA~C6SCWV6i{K5fiiQE`w zh_}yYTi}};Zka?PW)cW1R;+Md;o>Yxj3tm53DU`5fcwv&&7Y*LL zBu*k%Ck~2{q(ug3JGbSgNCJIK3 zb2$W_fS14%N|JyqX-rnUOe7H{Efal1_1N^^3;<|ZtT7w^=u1Mvn299G>|_weXF&c@ zIw@?Wm`4cVC5fbo9Nz3?;HK4=Xp$r$yua}Lj^#jnY_WtN^NqFYnZE_alkvYHs-77W z6*IjOd2ER&F-#;9eBn;;7ZkB%04~;^#pdvZYFr)EQG8y)^JYtUZa6iS@I)6pi55np zF)2hQg)yDz$|Mp;MOh*)KW62aC<#v_i*Nm#@eDyu5-FMKOEDT_g{`hiR}P*WLt*3DbW$`v+J#7GlU%5r z7&hgLwxC2l=n`zf*ILzHae+n-g~O&(Y0-G9E18a`#E^)1whNJir!%5?oEQ>?O^pHJ ztBJt`YJf{@bt$^xK&T^wi_`=aNJj_hWFmMGNb0|z=NJE*`M;*;3;7@yWE@satx@rqnG@U6o81t&RND5#`3_9MZo>%;Y7Q}(5VbE7f+MKC6e(SOVc>Bu=2GqpuQZeotJX*7(Za*o zhUOFeX^Rg0wpHLytKGKACcMkwG6wH4DW3rkgx+nRa%x+1!T{z@H4u&=en^RN#5J3K}8M_Z=7P7AUUB2+q8#Gm-6 zt8x^ieQ5g)E>`6D?rB2R7|XO5E<=d@dvMAH;m9Ey zRYu!v`}n^7ds}>2I`EPxd<|~7`K9|zm046|7n3>fh7H`u8H`V!F82>Hx?cRF0el_4 z0S_p2=IQU$+KQZEaQnIv44$|%Y|=geUkEk2o@rtLD_}!-xGnRbeM&}c_MFU=pVp(q zrnH9j^xQgLd;IDks6o5ER5^Zf@9jSaVh^_Hz^PGg^}Uq?f^l0lQbLSc*Skj|Q^%J^ zJ`5i>yu1f@uk|)cj2t-m;5x8N7~WQgA6nAmx#QMtRKMMw;kc{U;Y#4#dUsp-DZ~TY zX&;Jr9Ltq?%Obj%CO0pj#9Fk59dx5QH>p1B>3w8>DSWAI_Q6vNkPXGkY};2)3{=5U zRyEdA%bpX5;U{o)TP9^s5L%@zNIM}y4=jF~S#K?$4Hv@t!1&~)ww1rg)HhyU-Jsv^gDz5*SEu0d<1 z+GEaS+{n&aw=pCRDOTnt9+P{X!b~S24xye0MXaN2*2z$d`|v>yRix+~TL=2nj9Q0f zRl)ocC_TIRNGjgWec!M44hSBVjXUy zYSwIfUO0%f(T(%y*CUrX7R9ga@T))JcYcRg>Vew(?oJnM-zTVs+h+Uf&e%1fQu|Rd zT5LS~{@4n+uW3H=@yCGFrrP{aq|Bv%Qa-YxepRvT5%QzkHuke=d8ukNY@<|W>e%0*a`+EoXJa*9EPTTua3>kjzOk8Lj%+XJ`9om<6Eq_Imq$B#eoSDhr=r8y9rMpB=Vtd`RyoZS}n=`X7T~K0ItUX}W<(6TjWU_Cg zRfczlTLZReRzH2QF2YvsvLXJ{%82q{$7@TwL*5l$iY7?o(+0DbKJi|t10T^a zl1iKv5+i-L8%k$q#1trKqL+cSZj6q2O3j((LPqJlw8|{Ha#!0CGk=@=LC?&NpWM9m)Xg$O*c?AC zvg%i}y(K^1CDa}s_rW~+hL_*N8JM9CnqGU84d`69X8o2_zNy%xe{P{xf)!%PhGqga zfpk55a~u=lWE-Ql8rS(#qu^Wu%e>|ZO6)>wXxn-|ds=)zAzGEHLX9%ngJd-u z)>2PER}j-QJFhpMvo>$zz%%$!Rl%VpP)XFFe*~lS&(lY#`Op^J&Nm**hZC)J|4h$* zgKFC0*yfEKLIJfW3^#O|Uamt&ISf>PTC-dypK`pTaVH|&#|^F<0nnjX6YhOz7FC84 z>-XPW9_XylH_~{s`Niga&d{LzRb%aM1+Di`POMLFZ7=&il zQ*RiVIUxcjo|**I1k}FnKQ~2=fgaN$@+$(%{a?N~9-~CLB4q}P+Ct_PC9A#*=^3xb~PMF#FCt5!p$z!-pAXwm6a{=5e&F_@cjyu$F&x@gCB2J();V%Zu<7L zyBQYhZqnKscEI+4hQDLcm%TPgp3aI`S7H796>WD|r5pT$0mrBa21Ztj@Ld|T_x3em zyXZ5ue_nfgnr=~B%54L;zNc^q?-uF&Q~15HxGb+CI^t@4Ge(rEr!s{jA{JOFTq4Ka z8h+NWO&EI32KH$;3hpV4fS)w}q54GcD3ph1gewpFhQtaV$-A?*Ypr#%-iZ;@D>QPi zywt2ct2b=l|Eulvg0}61#JujTyM_?lqTh#h5*)Pm>%EUI)1H}9Lonfb@qb1|yr%-?;k$@mV!&DsREObt_N~tX#h=&Db3QnQ6^r z39M`#Ff-));lcB%H|&!TOQCAh-``uGc+6ZcNHfMGpet5;n~u$^UmUWJrV)!s$@(b1~v^ zHM};BO*70SI{lA1)4W=jJ?C!f&KdwP%mZ|{+meFy(|B*04@a6k#T*djgI+FZDBAMv6mhblR-q&~*YL*b*SRUXZ4DrA%M$YWdQO3fi(mU|(=%`PoYsU? zv&tN;PxM~)K0@8A@RvK}Y^W^Ii+{1Z0Fo8U-X({JY6-}QA0~B&St`s=wMGqk4Wc2H zILa`8oHg}fO5>*wk^C3CS$0r1@`&*Fx{&7Ty}x&7B^yAE*nF*wNWnu@2yYtl>b}e~ zf&@G?@r{GUp7J8go6#Qq&QS@bTB2IUZDjiGu7Uj~!)|!0$MI4KG~-S~*JI6vzHYA! z#M(7y4;vmgZ#kure(wdNqF$LXrPShH5ctV9yZ8LoldExxIVUIHPwf>BT1O0L2m>zxB{J#u@e3r9+2 z?h5a8)|_Tchb@$?@C-s+NM0GDnCJmEhO^ghqR*twZBcl(Ua8)9zB}u=A=LN)nr8RW z7V99uR)3gd(od?I)bgZH)7f9V)FHOy#_~ZgrIEB=FV*Jy>HY1gnRTyjpPp0#g?4HW z8wE}d=}7ZjqL)imal#xTZ>~0}bNl`6ezW#jd%LragVa@BD{Ks38la=GDp9X!uvuE60 z7PoacZy{1X)bJ?=2<{SLUOm;qFr$ij-&1vG9vn*H(~QFmKQ+ZNy6r_$@d;n7qV_ z5!*X@FD*wvix8=$!v-5E8$UEAIp&GC(wMp-Z z#XV%QFzuoTBH%4u)dfyUUUj)h_uBnV&}Fbi*<=)*IolZ3(yY+g&Uy|Ir#%d_EPhCE z*!^}-8440lIGU?kzTs(}UbiOLK(;hWCsY)vu{%qX>bE*o?+3l+m;t0dRz|Jt@vPv_ zoE7lqZizB)R&f!8O{*z6;Ox2MoTGMJn!N~wt1+C^gR9UO))~0#G#8vbL$^Yua!mk= zyra>_B0SWHe8>Q#3-j(I@bk#&a%8E+B^IFWhLpoO;MP;+<}Y}0+C^%)&z_3-VHoz< zsvJMR&qO;R&3*>r2Z6~9h2sp^@(4_Y|!AEVMob&#v)d-Sj zWu*H?tg9N#ZHzs#Y=0y&V6pe6sUA3~Wz{d28!bNW^ozJy_bw0kt`B&((4B?ZVezgI zg7h>;x@5v#?J~V*b0d5W-xUBE%b!Ax_H>>p*h%qtIUNyj+F}vl&8t=u)h}(cDT-Vj z_&z9&q)?;1OYhDJc(b^qZi^4NQAAxzN2V77!K)8iYrC`3MhYlgzE3STL?V@Tod%bT z!?|dv%jnf_;4(sY_rsK0yeoyUCnrV*2^^d^$GIHUjJO4ucJnq00)DzUS5`J-J}iZ> zw%Q#)^W>+~RGn?Jk1JXL#(|nNXb_;ccalp-tQojoO(dXKgY-FGjeW9m(93*;n^ROn zjnab?S`1HpNVcxtC#70L*^z(TROAGcs`sqv&RPW;)V_1^8Iw0W4eq?9pF2E7U5zKy zQh!!~OJYh%h~J=BgboBZXsiImaaXA$!%Fods?^~|s~kXi+`i9hCw~<7cq+rfkVH}J%?|Xg_KaHd EUy_B!q5uE@ literal 0 HcmV?d00001 diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/HexagonFlatTop.png.meta b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/HexagonFlatTop.png.meta new file mode 100644 index 00000000000..7f29f5d0728 --- /dev/null +++ b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/HexagonFlatTop.png.meta @@ -0,0 +1,236 @@ +fileFormatVersion: 2 +guid: 877a1fd410da9fb46a0f81cf1a1a0307 +TextureImporter: + internalIDToNameTable: + - first: + 213: 2747690628134850419 + second: Hexagon Flat Top + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 256 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: 0 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: CloudRendering + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Nintendo Switch + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: Hexagon Flat Top + rect: + serializedVersion: 2 + x: 0 + y: 15 + width: 256 + height: 226 + alignment: 0 + pivot: {x: 0.5, y: 0.5} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: + - - {x: -65, y: 113} + - {x: -128, y: 4} + - {x: -128, y: -4} + - {x: -65, y: -113} + - {x: 65, y: -113} + - {x: 128, y: -4} + - {x: 128, y: 4} + - {x: 65, y: 113} + physicsShape: + - - {x: -64, y: 111} + - {x: -128, y: 0} + - {x: -64, y: -111} + - {x: 64, y: -111} + - {x: 128, y: 0} + - {x: 64, y: 111} + tessellationDetail: 0 + bones: [] + spriteID: 37fc5a28112c12620800000000000000 + internalID: -712631045867808456 + vertices: [] + indices: + edges: [] + weights: [] + outline: + - - {x: -65, y: 113} + - {x: -128, y: 4} + - {x: -128, y: -4} + - {x: -65, y: -113} + - {x: 65, y: -113} + - {x: 128, y: -4} + - {x: 128, y: 4} + - {x: 65, y: 113} + customData: + physicsShape: + - - {x: -64, y: 111} + - {x: -128, y: 0} + - {x: -64, y: -111} + - {x: 64, y: -111} + - {x: 128, y: 0} + - {x: 64, y: 111} + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: + Hexagon Flat Top: -712631045867808456 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/R8_vignetteSagaUI.png b/Tests/SRPTests/Projects/UniversalGraphicsTest_2D/Assets/Scenes/087_SpriteAtlas_Dilate/MapUI_R8_Atlas/R8_vignetteSagaUI.png new file mode 100644 index 0000000000000000000000000000000000000000..26c88a25d4cc2d7185ac88ef6c74c61e8014d500 GIT binary patch literal 15352 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 Date: Fri, 4 Apr 2025 14:52:49 +0000 Subject: [PATCH 18/28] various buginfo & code owner updates --- .../com.unity.render-pipelines.core/Runtime/GPUDriven/.buginfo | 2 +- .../Runtime/RenderPipelineResources/GPUDriven/.buginfo | 2 +- .../Tests/Editor/GPUDriven/.buginfo | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/.buginfo b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/.buginfo index 3561c5aedbc..e5dac0e764f 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/.buginfo +++ b/Packages/com.unity.render-pipelines.core/Runtime/GPUDriven/.buginfo @@ -1 +1 @@ -area: Graphics Optimization Systems \ No newline at end of file +area: GPU Resident Drawer diff --git a/Packages/com.unity.render-pipelines.core/Runtime/RenderPipelineResources/GPUDriven/.buginfo b/Packages/com.unity.render-pipelines.core/Runtime/RenderPipelineResources/GPUDriven/.buginfo index 58dd2dca33f..e5dac0e764f 100644 --- a/Packages/com.unity.render-pipelines.core/Runtime/RenderPipelineResources/GPUDriven/.buginfo +++ b/Packages/com.unity.render-pipelines.core/Runtime/RenderPipelineResources/GPUDriven/.buginfo @@ -1 +1 @@ -area: Graphics Optimization Systems +area: GPU Resident Drawer diff --git a/Packages/com.unity.render-pipelines.core/Tests/Editor/GPUDriven/.buginfo b/Packages/com.unity.render-pipelines.core/Tests/Editor/GPUDriven/.buginfo index 3561c5aedbc..e5dac0e764f 100644 --- a/Packages/com.unity.render-pipelines.core/Tests/Editor/GPUDriven/.buginfo +++ b/Packages/com.unity.render-pipelines.core/Tests/Editor/GPUDriven/.buginfo @@ -1 +1 @@ -area: Graphics Optimization Systems \ No newline at end of file +area: GPU Resident Drawer From e4b22bb34b9556393f05b22d9c363f68db2dcb04 Mon Sep 17 00:00:00 2001 From: Julien Amsellem Date: Fri, 4 Apr 2025 19:54:46 +0000 Subject: [PATCH 19/28] [VFX] Make common code for template window in GraphView --- .../Editor/GraphView/Views/VFXView.cs | 10 +- .../Inspector/AdvancedVisualEffectEditor.cs | 9 +- .../CreateFromTemplateDropDownButton.cs | 24 +- .../TemplateWindow/VFXTemplateDescriptor.cs | 48 -- .../VFXTemplateDescriptor.cs.meta | 3 - .../TemplateWindow/VFXTemplateHelper.cs | 90 ++-- .../TemplateWindow/VFXTemplateHelper.cs.meta | 4 +- .../VFXTemplateHelperInternal.cs | 114 ++++ .../VFXTemplateHelperInternal.cs.meta | 3 + .../TemplateWindow/VFXTemplateWindow.cs | 489 ------------------ .../TemplateWindow/VFXTemplateWindow.cs.meta | 3 - .../UIResources/uss/VFXTemplateWindow.uss | 180 ------- .../uss/VFXTemplateWindow.uss.meta | 3 - .../UIResources/uxml/VFXTemplateItem.uxml | 10 - .../uxml/VFXTemplateItem.uxml.meta | 3 - .../UIResources/uxml/VFXTemplateSection.uxml | 10 - .../uxml/VFXTemplateSection.uxml.meta | 3 - .../UIResources/uxml/VFXTemplateWindow.uxml | 46 -- .../uxml/VFXTemplateWindow.uxml.meta | 3 - .../Unity.VisualEffectGraph.Editor.asmdef | 4 +- .../Editor/VFXAssetEditorUtility.cs | 5 +- ...Test.cs => GraphViewTemplateWindowTest.cs} | 231 +++++---- ...ta => GraphViewTemplateWindowTest.cs.meta} | 0 .../Editor/Tests/VFXSystemNamesTest.cs | 7 +- ...Unity.VisualEffectGraph.EditorTests.asmdef | 4 +- .../Packages/manifest.json | 1 + 26 files changed, 342 insertions(+), 965 deletions(-) delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateDescriptor.cs delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateDescriptor.cs.meta create mode 100644 Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateHelperInternal.cs create mode 100644 Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateHelperInternal.cs.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateWindow.cs delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateWindow.cs.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXTemplateWindow.uss delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/uss/VFXTemplateWindow.uss.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/uxml/VFXTemplateItem.uxml delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/uxml/VFXTemplateItem.uxml.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/uxml/VFXTemplateSection.uxml delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/uxml/VFXTemplateSection.uxml.meta delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/uxml/VFXTemplateWindow.uxml delete mode 100644 Packages/com.unity.visualeffectgraph/Editor/UIResources/uxml/VFXTemplateWindow.uxml.meta rename Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/{VFXTemplateWindowTest.cs => GraphViewTemplateWindowTest.cs} (70%) rename Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/{VFXTemplateWindowTest.cs.meta => GraphViewTemplateWindowTest.cs.meta} (100%) diff --git a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs index 0a16d099879..c72c6c6ee9d 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/GraphView/Views/VFXView.cs @@ -582,7 +582,7 @@ public static Texture2D LoadImage(string text) private void OnCreateAsset() { - VFXTemplateWindow.ShowCreateFromTemplate(this, null); + GraphViewTemplateWindow.ShowCreateFromTemplate(new VFXTemplateHelperInternal(), CreateNewFromTemplate); } public VFXView() @@ -1774,6 +1774,14 @@ void OnCreateNode(NodeCreationContext ctx) } } + public void CreateNewFromTemplate(string templatePath, string assetPath) + { + VisualEffectAssetEditorUtility.CreateTemplateAsset(assetPath, templatePath); + var vfxAsset = AssetDatabase.LoadAssetAtPath(assetPath); + var window = VFXViewWindow.GetWindow(vfxAsset, false); + window.LoadAsset(vfxAsset, null); + } + public void CreateTemplateSystem(string path, Vector2 tPos, VFXGroupNode groupNode) { var resource = VisualEffectResource.GetResourceAtPath(path); diff --git a/Packages/com.unity.visualeffectgraph/Editor/Inspector/AdvancedVisualEffectEditor.cs b/Packages/com.unity.visualeffectgraph/Editor/Inspector/AdvancedVisualEffectEditor.cs index 51c66d95fe2..108d88966e6 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/Inspector/AdvancedVisualEffectEditor.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/Inspector/AdvancedVisualEffectEditor.cs @@ -2,6 +2,8 @@ using System.Linq; using System.Collections.Generic; using System.Reflection; + +using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.VFX; using UnityEditor.VFX.UI; @@ -753,11 +755,12 @@ private void DetachIfDeleted() private void CreateNewVFX() { - void OnTemplateCreate(string templateFilePath) + void OnTemplateCreate(string templateFilePath, string assetPath) { if (!string.IsNullOrEmpty(templateFilePath)) { - var asset = AssetDatabase.LoadAssetAtPath(templateFilePath); + VisualEffectAssetEditorUtility.CreateTemplateAsset(assetPath, templateFilePath); + var asset = AssetDatabase.LoadAssetAtPath(assetPath); m_VisualEffectAsset.objectReferenceValue = asset; serializedObject.ApplyModifiedProperties(); @@ -765,7 +768,7 @@ void OnTemplateCreate(string templateFilePath) } } - VFXTemplateWindow.ShowCreateFromTemplate(null, OnTemplateCreate); + GraphViewTemplateWindow.ShowCreateFromTemplate(new VFXTemplateHelperInternal(), OnTemplateCreate); } } } diff --git a/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/CreateFromTemplateDropDownButton.cs b/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/CreateFromTemplateDropDownButton.cs index e8bb0072095..15136f62cf7 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/CreateFromTemplateDropDownButton.cs +++ b/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/CreateFromTemplateDropDownButton.cs @@ -1,4 +1,5 @@ using UnityEditor.Experimental; +using UnityEditor.Experimental.GraphView; using UnityEditor.VFX.UI; using UnityEngine; @@ -8,9 +9,9 @@ namespace UnityEditor.VFX { class CreateFromTemplateDropDownButton : DropDownButtonBase { - private const string mainButtonName = "create-button"; + private const string k_MainButtonName = "create-button"; - private Button m_InsertButton; + private readonly Button m_InsertButton; public CreateFromTemplateDropDownButton(VFXView vfxView) : base( @@ -18,7 +19,7 @@ public CreateFromTemplateDropDownButton(VFXView vfxView) vfxView, "VFXCreateFromTemplateDropDownPanel", "Insert a template into current asset\nHold CTRL key and click to create a new VFX", - mainButtonName, + k_MainButtonName, EditorResources.iconsPath + "CreateAddNew.png", true, false) @@ -26,7 +27,7 @@ public CreateFromTemplateDropDownButton(VFXView vfxView) var createNew = m_PopupContent.Q

/// The path to a Visual Effect asset. - /// The structure that contains template information. + /// The structure that contains template information. /// Returns true if the Visual Effect asset has template information, otherwise it returns false. - public static bool TryGetTemplate(string vfxPath, out VFXTemplateDescriptor template) + public static bool TryGetTemplate(string vfxPath, out VFXTemplateDescriptor vfxTemplateDescriptor) { - var importer = (VisualEffectImporter)AssetImporter.GetAtPath(vfxPath); - var nativeTemplate = importer.templateProperty; - - if (!string.IsNullOrEmpty(nativeTemplate.name)) + if (VFXTemplateHelperInternal.TryGetTemplateStatic(vfxPath, out var graphViewTemplate)) { - template = new VFXTemplateDescriptor + vfxTemplateDescriptor = new VFXTemplateDescriptor { - name = nativeTemplate.name, - category = nativeTemplate.category, - description = nativeTemplate.description, - icon = nativeTemplate.icon, - thumbnail = nativeTemplate.thumbnail, + name = graphViewTemplate.name, + category = graphViewTemplate.category, + description = graphViewTemplate.description, + icon = graphViewTemplate.icon, + thumbnail = graphViewTemplate.thumbnail, }; - return true; } - template = default; + vfxTemplateDescriptor = default; return false; } @@ -38,29 +69,18 @@ public static bool TryGetTemplate(string vfxPath, out VFXTemplateDescriptor temp /// This method creates or updates a Visual Effect asset template. /// /// The path to the existing Visual Effect asset. - /// The structure that contains all template information. + /// The structure that contains all template information. /// Returns true if the template is created, otherwise it returns false. - public static bool TrySetTemplate(string vfxPath, VFXTemplateDescriptor template) + public static bool TrySetTemplate(string vfxPath, VFXTemplateDescriptor vfxTemplateDescriptor) { - if (string.IsNullOrEmpty(vfxPath)) - return false; - - if (AssetDatabase.AssetPathExists(vfxPath)) + return VFXTemplateHelperInternal.TrySetTemplateStatic(vfxPath, new GraphViewTemplateDescriptor { - var importer = (VisualEffectImporter)AssetImporter.GetAtPath(vfxPath); - var nativeTemplate = new VFXTemplate - { - name = template.name, - category = template.category, - description = template.description, - icon = template.icon, - thumbnail = template.thumbnail, - }; - importer.templateProperty = nativeTemplate; - return true; - } - - return false; + name = vfxTemplateDescriptor.name, + category = vfxTemplateDescriptor.category, + description = vfxTemplateDescriptor.description, + icon = vfxTemplateDescriptor.icon, + thumbnail = vfxTemplateDescriptor.thumbnail, + }); } } } diff --git a/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateHelper.cs.meta b/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateHelper.cs.meta index 75c8c9b3fa1..1ac1c682c2a 100644 --- a/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateHelper.cs.meta +++ b/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateHelper.cs.meta @@ -1,3 +1,3 @@ fileFormatVersion: 2 -guid: 020bd1d48e04472486fdf803a279364a -timeCreated: 1673371801 \ No newline at end of file +guid: 1544e89dbff4436991f7b7617c5a5578 +timeCreated: 1742490022 \ No newline at end of file diff --git a/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateHelperInternal.cs b/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateHelperInternal.cs new file mode 100644 index 00000000000..d737807a5c7 --- /dev/null +++ b/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateHelperInternal.cs @@ -0,0 +1,114 @@ +using System; + +using UnityEditor.Experimental.GraphView; + +namespace UnityEditor.VFX +{ + /// + /// This class provides all useful information for the GraphView template window + /// It also allows to read or write template information from/to a VFX asset + /// + class VFXTemplateHelperInternal : ITemplateHelper + { + class SaveFileDialog : GraphViewTemplateWindow.ISaveFileDialogHelper + { + public string OpenSaveFileDialog() + { + return EditorUtility.SaveFilePanelInProject("", "New VFX", "vfx", "Create new VisualEffect Graph"); + } + } + + public string packageInfoName => VisualEffectGraphPackageInfo.name; + public string learningSampleName => "Learning Templates"; + public string templateWindowDocUrl =>Documentation.GetPageLink("Templates-window"); + public string builtInTemplatePath => VisualEffectAssetEditorUtility.templatePath; + public string builtInCategory => "Default VFX Graph Templates"; + public string assetType => "VisualEffectAsset"; + public string emptyTemplateName => "Empty VFX"; + public string emptyTemplateDescription => "Create a completely empty VFX asset"; + public string lastSelectedGuidKey => "VFXTemplateWindow.LastSelectedGuid"; + public string createNewAssetTitle => "Create new VFX Asset"; + public string insertTemplateTitle => "Insert a template into current VFX Asset"; + public string emptyTemplateIconPath => $"{VisualEffectGraphPackageInfo.assetPackagePath}/Editor/Templates/UI/EmptyTemplate@256.png"; + public string emptyTemplateScreenshotPath => $"{VisualEffectGraphPackageInfo.assetPackagePath}/Editor/Templates/UI/3d_Empty.png"; + public string customTemplateIcon => $"{VisualEffectGraphPackageInfo.assetPackagePath}/Editor/Templates/UI/CustomVFXGraph@256.png"; + public GraphViewTemplateWindow.ISaveFileDialogHelper saveFileDialogHelper { get; set; } = new SaveFileDialog(); + + + /// + /// This method is called each time a template is used. + /// This is the good place to implement analytics + /// + /// Template that has just been used + public void RaiseTemplateUsed(GraphViewTemplateDescriptor usedTemplate) + { + // For legal reason we should only monitor built-in templates usage + if (string.Compare(usedTemplate.category, builtInCategory, StringComparison.OrdinalIgnoreCase) == 0) + { + VFXAnalytics.GetInstance().OnSystemTemplateCreated(usedTemplate.name); + } + } + + /// + /// This method gets template information for any Visual Effect asset. + /// + /// The path to a Visual Effect asset. + /// The structure that contains template information. + /// Returns true if the Visual Effect asset has template information, otherwise it returns false. + public bool TryGetTemplate(string vfxPath, out GraphViewTemplateDescriptor graphViewTemplate) => TryGetTemplateStatic(vfxPath, out graphViewTemplate); + + /// + /// This method creates or updates a Visual Effect asset template. + /// + /// The path to the existing Visual Effect asset. + /// The structure that contains all template information. + /// Returns true if the template is created, otherwise it returns false. + public bool TrySetTemplate(string vfxPath, GraphViewTemplateDescriptor graphViewTemplate) => TrySetTemplateStatic(vfxPath, graphViewTemplate); + + internal static bool TryGetTemplateStatic(string vfxPath, out GraphViewTemplateDescriptor graphViewTemplate) + { + var importer = (VisualEffectImporter)AssetImporter.GetAtPath(vfxPath); + var nativeTemplate = importer.templateProperty; + + if (!string.IsNullOrEmpty(nativeTemplate.name)) + { + graphViewTemplate = new GraphViewTemplateDescriptor + { + name = nativeTemplate.name, + category = nativeTemplate.category, + description = nativeTemplate.description, + icon = nativeTemplate.icon, + thumbnail = nativeTemplate.thumbnail, + }; + + return true; + } + + graphViewTemplate = default; + return false; + } + + internal static bool TrySetTemplateStatic(string vfxPath, GraphViewTemplateDescriptor graphViewTemplate) + { + if (string.IsNullOrEmpty(vfxPath)) + return false; + + if (AssetDatabase.AssetPathExists(vfxPath)) + { + var importer = (VisualEffectImporter)AssetImporter.GetAtPath(vfxPath); + var nativeTemplate = new VFXTemplate + { + name = graphViewTemplate.name, + category = graphViewTemplate.category, + description = graphViewTemplate.description, + icon = graphViewTemplate.icon, + thumbnail = graphViewTemplate.thumbnail, + }; + importer.templateProperty = nativeTemplate; + return true; + } + + return false; + } + } +} diff --git a/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateHelperInternal.cs.meta b/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateHelperInternal.cs.meta new file mode 100644 index 00000000000..75c8c9b3fa1 --- /dev/null +++ b/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateHelperInternal.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 020bd1d48e04472486fdf803a279364a +timeCreated: 1673371801 \ No newline at end of file diff --git a/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateWindow.cs b/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateWindow.cs deleted file mode 100644 index d22a4418aaf..00000000000 --- a/Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateWindow.cs +++ /dev/null @@ -1,489 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading; - -using Unity.UI.Builder; -using UnityEditor.Experimental; -using UnityEditor.PackageManager; -using UnityEditor.PackageManager.UI; -using UnityEditor.VFX.UI; - -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.UIElements; -using UnityEngine.VFX; - -namespace UnityEditor.VFX -{ - internal interface IVFXTemplateDescriptor - { - string header { get; } - } - - internal class VFXTemplateWindow : EditorWindow - { - internal interface ISaveFileDialogHelper - { - string OpenSaveFileDialog(string title, string defaultName, string extension, string message); - } - - private class SaveFileDialogHelper : ISaveFileDialogHelper - { - public string OpenSaveFileDialog(string title, string defaultName, string extension, string message) => EditorUtility.SaveFilePanelInProject(title, defaultName, extension, message); - } - - private class VFXTemplateSection : IVFXTemplateDescriptor - { - public VFXTemplateSection(string text) - { - header = text; - } - public string header { get; } - } - - private const string LearningSampleName = "Learning Templates"; - private const string VFXTemplateWindowDocUrl = "https://docs.unity3d.com/Packages/com.unity.visualeffectgraph@{0}/manual/Templates-window.html"; - private const string BuiltInCategory = "Default VFX Graph Templates"; - private const string EmptyTemplateName = "Empty VFX"; - private const string EmptyTemplateDescription = "Create a completely empty VFX asset"; - private const string LastSelectedGuidKey = "VFXTemplateWindow.LastSelectedGuid"; - private const string CreateNewVFXAssetTitle = "Create new VFX Asset"; - private const string InsertTemplateTitle = "Insert a template into current VFX Asset"; - private const float PackageManagerTimeout = 5f; // 5s - - private static readonly Dictionary s_ModeToTitle = new () - { - { CreateMode.CreateNew, CreateNewVFXAssetTitle }, - { CreateMode.Insert, InsertTemplateTitle }, - { CreateMode.None, CreateNewVFXAssetTitle }, - }; - - private readonly List> m_TemplatesTree = new (); - private readonly ISaveFileDialogHelper m_SaveFileDialogHelper = new SaveFileDialogHelper(); - - private TreeView m_ListOfTemplates; - private Texture2D m_CustomTemplateIcon; - private Image m_DetailsScreenshot; - private Label m_DetailsTitle; - private Label m_DetailsDescription; - private VisualTreeAsset m_ItemTemplate; - private Action m_VFXAssetCreationCallback; - private string m_LastSelectedTemplatePath; - private int m_LastSelectedIndex; - private CreateMode m_CurrentMode; - private Action m_UserCallback; - private string m_LastSelectedTemplateGuid; - private VFXView m_VfxView; - private VFXTemplateDescriptor m_SelectedTemplate; - private Button installButton; - - private enum CreateMode - { - CreateNew, - Insert, - None, - } - - public static void ShowCreateFromTemplate(VFXView vfxView, Action callback) => ShowInternal(vfxView, CreateMode.CreateNew, callback); - public static void ShowInsertTemplate(VFXView vfxView) => ShowInternal(vfxView, CreateMode.Insert); - public static void PickTemplate(Action callback) => ShowInternal(null, CreateMode.None, callback); - - private static void ShowInternal(VFXView vfxView, CreateMode mode, Action callback = null) - { - var templateWindow = EditorWindow.GetWindow(true, s_ModeToTitle[mode], false); - templateWindow.Setup(vfxView, mode, callback); - } - - private void Setup(VFXView vfxView, CreateMode mode, Action callback) - { - minSize = new Vector2(800, 300); - m_VfxView = vfxView; - m_UserCallback = callback; - m_CurrentMode = mode; - SetCallBack(); - LoadTemplates(); - } - - private void CreateGUI() - { - m_ItemTemplate = VFXView.LoadUXML("VFXTemplateItem"); - var tpl = VFXView.LoadUXML("VFXTemplateWindow"); - tpl.CloneTree(rootVisualElement); - rootVisualElement.AddStyleSheetPath("VFXTemplateWindow"); - - rootVisualElement.name = "VFXTemplateWindowRoot"; - rootVisualElement.Q