group2 0.1.0
CSE 125 Group 2
Loading...
Searching...
No Matches
SkinnedRenderer.hpp
Go to the documentation of this file.
1
26
27#pragma once
28
29#include "RendererTypes.hpp" // BoneInfluence, SkinnedInstance, RigMeshSource
30
31#include <SDL3/SDL.h>
32#include <SDL3/SDL_gpu.h>
33
34#include <glm/glm.hpp>
35#include <vector>
36
39{
40public:
41 SkinnedRenderer() = default;
42 ~SkinnedRenderer() = default;
43
48
53 void init(SDL_GPUDevice* device, SDL_GPUTextureFormat& colorTarget, const SDL_GPUShaderFormat& shaderFormat);
54
73 bool setRig(const std::vector<RigMeshSource>& meshes, int numJoints);
74
94 void setFrame(const std::vector<glm::mat4>& palette, const std::vector<SkinnedInstance>& instances);
95
104 void uploadFrame(SDL_GPUCommandBuffer* cmd, SDL_GPUCopyPass* copyPass);
105
112 void draw(SDL_GPURenderPass* renderPass, SDL_GPUCommandBuffer* cmd);
113
116 void shutdown();
117
118 // ─── Readback (optional, for debug UI) ───────────────────────────────────
119
121 [[nodiscard]] int numJoints() const { return numJoints_; }
122
124 [[nodiscard]] bool rigInstalled() const { return rigInstalled_; }
125
127 [[nodiscard]] size_t pendingInstanceCount() const { return frameInstances_.size(); }
128
129private:
138 {
139 SDL_GPUBuffer* vb = nullptr;
140 SDL_GPUBuffer* boneVb = nullptr;
141 SDL_GPUBuffer* ib = nullptr;
142 Uint32 indexCount = 0;
143 Uint32 vertexCount = 0;
144 };
145
146 struct SsboInfo
147 {
148 SDL_GPUBuffer* ssbo_{};
149 Uint32 capacityBytes_ = 0;
150 };
151
153 bool ensureSsbos(Uint32 paletteBytes, Uint32 instanceBytes);
154
155 bool createSkinningPipeline(SDL_GPUTextureFormat& colorTarget, const SDL_GPUShaderFormat& shaderFormat);
156
157 // ─── Borrowed ────────────────────────────────────────────────────────────
158 SDL_GPUDevice* device_ = nullptr;
159
160 // ─── Owned: pipeline (graphics team to create) ───────────────────────────
165 SDL_GPUGraphicsPipeline* pipeline_ = nullptr;
166
167 // ─── Owned: rig (set once via setRig) ────────────────────────────────────
168 bool rigInstalled_ = false;
169 int numJoints_ = 0;
170 std::vector<SkinnedMesh> skinnedMeshes_;
171
172 // ─── Owned: per-frame GPU resources (grow on demand) ─────────────────────
173 // SDL_GPUBuffer* palettesSsbo_ = nullptr; ///< STORAGE_READ, mat4[numInstances * numJoints].
174 // SDL_GPUBuffer* instancesSsbo_ = nullptr; ///< STORAGE_READ, SkinnedInstance[numInstances].
175 // Uint32 palettesCapacityBytes_ = 0;
176 // Uint32 instancesCapacityBytes_ = 0;
179
180 SDL_GPUTransferBuffer* paletteXfer_ = nullptr;
181 SDL_GPUTransferBuffer* instanceXfer_ = nullptr;
184
185 // ─── CPU staging (filled by setFrame, drained by uploadFrame) ────────────
186 std::vector<glm::mat4> framePalette_;
187 std::vector<SkinnedInstance> frameInstances_;
188 bool frameDirty_ = false;
189};
Shared data types exchanged between Game (producer) and NewRenderer (consumer).
bool frameDirty_
Definition SkinnedRenderer.hpp:188
SsboInfo instancesSsboInfo_
Definition SkinnedRenderer.hpp:178
SDL_GPUTransferBuffer * paletteXfer_
Definition SkinnedRenderer.hpp:180
int numJoints() const
Number of joints in the installed rig (0 if not installed).
Definition SkinnedRenderer.hpp:121
bool setRig(const std::vector< RigMeshSource > &meshes, int numJoints)
Install the shared character rig.
Definition SkinnedRenderer.cpp:82
SDL_GPUTransferBuffer * instanceXfer_
Definition SkinnedRenderer.hpp:181
void draw(SDL_GPURenderPass *renderPass, SDL_GPUCommandBuffer *cmd)
Issue the instanced draws for every visible skinned character.
Definition SkinnedRenderer.cpp:274
void shutdown()
Release all GPU resources owned by this subsystem.
Definition SkinnedRenderer.cpp:35
std::vector< glm::mat4 > framePalette_
Definition SkinnedRenderer.hpp:186
SkinnedRenderer & operator=(SkinnedRenderer &&)=delete
void init(SDL_GPUDevice *device, SDL_GPUTextureFormat &colorTarget, const SDL_GPUShaderFormat &shaderFormat)
Bind the SDL GPU device.
Definition SkinnedRenderer.cpp:21
std::vector< SkinnedInstance > frameInstances_
Definition SkinnedRenderer.hpp:187
bool ensureSsbos(Uint32 paletteBytes, Uint32 instanceBytes)
Grow palette/instance SSBOs (and their transfer buffers) to at least these byte sizes.
Definition SkinnedRenderer.cpp:192
void uploadFrame(SDL_GPUCommandBuffer *cmd, SDL_GPUCopyPass *copyPass)
Upload this frame's palette + instance buffers to the GPU.
Definition SkinnedRenderer.cpp:241
bool rigInstalled_
Definition SkinnedRenderer.hpp:168
SsboInfo palettesSsboInfo_
Definition SkinnedRenderer.hpp:177
SkinnedRenderer()=default
SkinnedRenderer & operator=(const SkinnedRenderer &)=delete
void setFrame(const std::vector< glm::mat4 > &palette, const std::vector< SkinnedInstance > &instances)
Push this frame's per-character bone palette + per-instance data.
Definition SkinnedRenderer.cpp:185
std::vector< SkinnedMesh > skinnedMeshes_
Definition SkinnedRenderer.hpp:170
SDL_GPUGraphicsPipeline * pipeline_
The skinned graphics pipeline.
Definition SkinnedRenderer.hpp:165
SkinnedRenderer(SkinnedRenderer &&)=delete
bool createSkinningPipeline(SDL_GPUTextureFormat &colorTarget, const SDL_GPUShaderFormat &shaderFormat)
Definition SkinnedRenderer.cpp:349
~SkinnedRenderer()=default
size_t pendingInstanceCount() const
Number of instances pending render this frame (0 if no frame submitted).
Definition SkinnedRenderer.hpp:127
Uint32 instanceXferCapacityBytes_
Definition SkinnedRenderer.hpp:183
SkinnedRenderer(const SkinnedRenderer &)=delete
SDL_GPUDevice * device_
Definition SkinnedRenderer.hpp:158
int numJoints_
Definition SkinnedRenderer.hpp:169
bool rigInstalled() const
True after a successful setRig.
Definition SkinnedRenderer.hpp:124
Uint32 paletteXferCapacityBytes_
Definition SkinnedRenderer.hpp:182
One mesh of the installed skinned rig.
Definition SkinnedRenderer.hpp:138
SDL_GPUBuffer * vb
Definition SkinnedRenderer.hpp:139
SDL_GPUBuffer * ib
Definition SkinnedRenderer.hpp:141
Uint32 indexCount
Definition SkinnedRenderer.hpp:142
Uint32 vertexCount
Definition SkinnedRenderer.hpp:143
SDL_GPUBuffer * boneVb
Definition SkinnedRenderer.hpp:140
Definition SkinnedRenderer.hpp:147
Uint32 capacityBytes_
Definition SkinnedRenderer.hpp:149
SDL_GPUBuffer * ssbo_
Definition SkinnedRenderer.hpp:148