using System; using UnityEngine.PathTracing.Core; using UnityEngine.Rendering; using UnityEngine.Rendering.UnifiedRayTracing; using BuildFlags = UnityEngine.Rendering.UnifiedRayTracing.BuildFlags; namespace UnityEngine.PathTracing.Integration { internal class UVAccelerationStructure : IDisposable { internal IRayTracingAccelStruct _uvAS; private GraphicsBuffer _buildScratchBuffer; public void Dispose() { _uvAS?.Dispose(); _uvAS = null; _buildScratchBuffer?.Dispose(); _buildScratchBuffer = null; } public void Build(CommandBuffer commandBuffer, RayTracingContext rayTracingContext, UVMesh uvMesh, BuildFlags buildFlags) { var options = new AccelerationStructureOptions() { buildFlags = buildFlags }; _uvAS = rayTracingContext.CreateAccelerationStructure(options); Debug.Assert(_uvAS is not null); for (int i = 0; i < uvMesh.Mesh.subMeshCount; ++i) { var instanceDesc = new MeshInstanceDesc(uvMesh.Mesh, i) { mask = 0xFFFFFFFF, instanceID = (uint)i }; _uvAS.AddInstance(instanceDesc); } RayTracingHelper.ResizeScratchBufferForBuild(_uvAS, ref _buildScratchBuffer); _uvAS.Build(commandBuffer, _buildScratchBuffer); } } }