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);
}
}
}