#pragma once
#include <cstdint>
#include <vector>
#include "backend/rhi.h"
#include "core/frame_stats.h"
#include "core/globals.h"
#include "core/gpu_arena.h"
#include "passes/debug/debug_draw.h"
#include "scene/scene.h"
#include "shaders/renderer_types.h"
struct SceneGraph;
struct MeshRT {
rhi::Buffer blas_buffer;
rhi::AccelStruct blas{};
u64 blas_device_address = 0;
bool dynamic = false;
};
struct RtScene {
rhi::AccelStruct tlas{};
rhi::Buffer scratch_buffer;
u64 scratch_device_addr = 0;
u64 scratch_size = 0;
rhi::Buffer tlas_buffer;
u64 tlas_buffer_size = 0;
rhi::Buffer instance_buffer;
u64 instance_buffer_size = 0;
rhi::Buffer instance_data_buffer;
};
constexpr rhi::SampleCount MSAA_SAMPLE_COUNT = rhi::SampleCount::Sample1;
struct RenderData {
u64 vertex_bda = 0;
u64 index_bda = 0;
u64 aniso_wrap_mips = 0;
u64 linear_clamp_mips = 0;
u64 linear_clamp = 0;
u64 cmp_greater = 0;
rhi::BufferView vertex_view{};
rhi::BufferView frame_ubo_view[MAX_FRAMES_IN_FLIGHT]{};
u32 render_item_count = 0;
FrameStats frame_stats;
Arena staging;
std::vector<Vertex> vertices;
std::vector<u32> indices;
std::vector<SubmeshGPU> submeshes;
std::vector<MeshRT> mesh_rt;
std::vector<MaterialGPU> materials;
std::vector<RenderItemGPU> render_items;
rhi::Buffer vertex_buffer;
rhi::Buffer index_buffer;
rhi::Buffer submesh_buffer;
rhi::Buffer material_buffer;
rhi::Buffer render_item_buffer;
RtScene rt_scene;
rhi::Image display;
rhi::Image irr_atlas;
rhi::Image dis_atlas;
rhi::Image sky;
rhi::ImageView sky_view;
rhi::Image cascade[Light::CASCADE_COUNT];
rhi::Image id_blit;
u32 cascade_size = 2048;
std::vector<std::pair<rhi::Image, rhi::ImageView>> loaded_textures;
DdgiGridParams ddgi_grid{};
DdgiConfig ddgi_cfg{};
DebugViewMode debug = DebugViewMode::NONE;
DebugDraw debug_draw;
SceneGraph *scene_graph = nullptr;
};
struct FrameData {
rhi::Buffer frame_ubo;
rhi::Buffer point_light_buffer;
rhi::Buffer transform_buffer;
u32 transform_capacity = 0;
};