bvle-voxels/src/voxel/VoxelRTManager.h
Samuel Bouchet 57ac08f231 Refactor: extract VoxelRTManager, DeferredGPUBuffer, decompose VoxelRenderPath
- Extract DeferredGPUBuffer utility (staging→dirty→capacity GPU buffer pattern)
- Extract VoxelRTManager from VoxelRenderer (~500 lines: BLAS/TLAS, RT shadows+AO)
- Decompose VoxelRenderPath into CameraController, AnimationState, VoxelProfiler
- Replace toping std::sort with O(n) counting sort by (type, variant)
- Update CLAUDE.md architecture docs to reflect new file structure
2026-03-31 13:46:35 +02:00

124 lines
5.6 KiB
C++

#pragma once
#include "DeferredGPUBuffer.h"
#include "WickedEngine.h"
namespace voxel {
// ── Ray Tracing Manager (Phase 6) ──────────────────────────────
// Groups all RT state: BLAS/TLAS management, shadow/AO dispatches.
// Extracted from VoxelRenderer to isolate the ~500 lines of RT code
// and its 20+ members for easier debugging and maintenance.
class VoxelRTManager {
public:
// ── Initialization ──────────────────────────────────────────
void initialize(wi::graphics::GraphicsDevice* device, uint32_t maxBlasVertices);
// ── BLAS extraction (compute shaders) ───────────────────────
// Extract blocky quad positions into BLAS vertex buffer.
void dispatchBLASExtract(wi::graphics::CommandList cmd,
const wi::graphics::GPUBuffer& quadBuffer,
const wi::graphics::GPUBuffer& chunkInfoBuffer,
uint32_t quadCount) const;
// Extract toping instance positions via GPU compute.
// groupBuffer/groupsGPU: toping BLAS group table.
void dispatchTopingBLASExtract(wi::graphics::CommandList cmd,
const wi::graphics::GPUBuffer& topingVertexBuffer,
const wi::graphics::GPUBuffer& topingInstanceBuffer,
const void* groupsGPUData, size_t groupsGPUSize,
uint32_t groupCount, uint32_t totalVertices) const;
// ── Acceleration structure build ────────────────────────────
static constexpr uint32_t BUILD_BLOCKY = 1 << 0;
static constexpr uint32_t BUILD_SMOOTH = 1 << 1;
static constexpr uint32_t BUILD_TOPING = 1 << 2;
static constexpr uint32_t BUILD_ALL = BUILD_BLOCKY | BUILD_SMOOTH | BUILD_TOPING;
void buildAccelerationStructures(wi::graphics::CommandList cmd,
uint32_t buildFlags,
const wi::graphics::GPUBuffer& smoothVB,
uint32_t smoothVertCount) const;
// ── RT Shadows + AO dispatch ────────────────────────────────
void dispatchShadows(wi::graphics::CommandList cmd,
const wi::graphics::Texture& depthBuffer,
const wi::graphics::Texture& renderTarget,
const wi::graphics::Texture& normalTarget,
const wi::graphics::GPUBuffer& constantBuffer) const;
// ── Toping BLAS buffer management ───────────────────────────
// Ensure capacity for toping BLAS position + index buffers.
// Returns true if buffers were (re)created.
bool ensureTopingBLASCapacity(uint32_t totalVertices);
// ── State queries ───────────────────────────────────────────
bool isAvailable() const { return available_; }
bool isReady() const { return available_ && tlas_.IsValid(); }
bool isShadowsEnabled() const { return shadowsEnabled_; }
void setShadowsEnabled(bool v) { shadowsEnabled_ = v; }
uint32_t getShadowDebug() const { return shadowDebug_; }
void setShadowDebug(uint32_t v) { shadowDebug_ = v; }
uint32_t getBlockyTriCount() const { return blockyVertexCount_ / 3; }
uint32_t getSmoothTriCount() const { return smoothVertexCount_ / 3; }
uint32_t getTopingTriCount() const { return topingVertexCount_ / 3; }
uint32_t getTopingVertexCount() const { return topingVertexCount_; }
uint32_t getTlasInstanceCount() const { return tlasInstanceCount_; }
const wi::graphics::RaytracingAccelerationStructure& getTLAS() const { return tlas_; }
// Dirty flags (public for VoxelRenderPath orchestration)
mutable bool dirty = true; // BLAS/TLAS need rebuild
mutable bool topingBLASDirty = false; // toping BLAS extract + rebuild needed
mutable bool aoHistoryValid = false;
mutable uint32_t frameCounter = 0;
mutable XMFLOAT4X4 prevViewProjection;
// AO textures (created by VoxelRenderPath::createRenderTargets)
mutable wi::graphics::Texture aoRawTexture;
mutable wi::graphics::Texture aoBlurredTexture;
mutable wi::graphics::Texture aoHistoryTexture;
private:
wi::graphics::GraphicsDevice* device_ = nullptr;
mutable bool available_ = false;
mutable bool shadowsEnabled_ = false;
mutable uint32_t shadowDebug_ = 0;
// Shaders
wi::graphics::Shader blasExtractShader_;
wi::graphics::Shader topingBLASShader_;
wi::graphics::Shader shadowShader_;
wi::graphics::Shader aoBlurShader_;
wi::graphics::Shader aoApplyShader_;
// Blocky BLAS resources
mutable wi::graphics::GPUBuffer blasPositionBuffer_;
wi::graphics::GPUBuffer blasIndexBuffer_;
mutable wi::graphics::RaytracingAccelerationStructure blockyBLAS_;
mutable uint32_t blockyBLASCapacity_ = 0;
mutable uint32_t blockyVertexCount_ = 0;
// Smooth BLAS
mutable wi::graphics::RaytracingAccelerationStructure smoothBLAS_;
mutable uint32_t smoothBLASCapacity_ = 0;
mutable uint32_t smoothVertexCount_ = 0;
// Toping BLAS
mutable wi::graphics::RaytracingAccelerationStructure topingBLAS_;
mutable uint32_t topingBLASASCapacity_ = 0;
mutable uint32_t topingVertexCount_ = 0;
mutable DeferredGPUBuffer topingBLASPositionBuf_;
mutable wi::graphics::GPUBuffer topingBLASIndexBuffer_;
mutable uint32_t topingBLASIndexCount_ = 0;
wi::graphics::GPUBuffer topingBLASGroupBuffer_;
// TLAS
mutable wi::graphics::RaytracingAccelerationStructure tlas_;
mutable uint32_t tlasInstanceCount_ = 0;
uint32_t maxBlasVertices_ = 0;
};
} // namespace voxel