GroveEngine/modules/BgfxRenderer/RHI/RHICommandBuffer.cpp
StillHammer 9618a647a2 feat(BgfxRenderer): Fix multi-texture batching and add particle effects
- Fix texture state management in BgfxDevice: defer setTexture until submit()
- Add transient instance buffer support for multi-batch rendering
- Add ParticlePass with fire, smoke and sparkle particle systems
- Load multiple textures from config (texture1..texture10)
- Visual test now demonstrates multi-texture sprites and multi-particle effects

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 17:15:45 +08:00

109 lines
3.5 KiB
C++

#include "RHICommandBuffer.h"
namespace grove::rhi {
void RHICommandBuffer::setState(const RenderState& state) {
Command cmd;
cmd.type = CommandType::SetState;
cmd.setState.state = state;
m_commands.push_back(cmd);
}
void RHICommandBuffer::setTexture(uint8_t slot, TextureHandle tex, UniformHandle sampler) {
Command cmd;
cmd.type = CommandType::SetTexture;
cmd.setTexture.slot = slot;
cmd.setTexture.texture = tex;
cmd.setTexture.sampler = sampler;
m_commands.push_back(cmd);
}
void RHICommandBuffer::setUniform(UniformHandle uniform, const float* data, uint8_t numVec4s) {
Command cmd;
cmd.type = CommandType::SetUniform;
cmd.setUniform.uniform = uniform;
cmd.setUniform.numVec4s = numVec4s;
std::memcpy(cmd.setUniform.data, data, numVec4s * 16);
m_commands.push_back(cmd);
}
void RHICommandBuffer::setVertexBuffer(BufferHandle buffer, uint32_t offset) {
Command cmd;
cmd.type = CommandType::SetVertexBuffer;
cmd.setVertexBuffer.buffer = buffer;
cmd.setVertexBuffer.offset = offset;
m_commands.push_back(cmd);
}
void RHICommandBuffer::setIndexBuffer(BufferHandle buffer, uint32_t offset, bool is32Bit) {
Command cmd;
cmd.type = CommandType::SetIndexBuffer;
cmd.setIndexBuffer.buffer = buffer;
cmd.setIndexBuffer.offset = offset;
cmd.setIndexBuffer.is32Bit = is32Bit;
m_commands.push_back(cmd);
}
void RHICommandBuffer::setInstanceBuffer(BufferHandle buffer, uint32_t start, uint32_t count) {
Command cmd;
cmd.type = CommandType::SetInstanceBuffer;
cmd.setInstanceBuffer.buffer = buffer;
cmd.setInstanceBuffer.start = start;
cmd.setInstanceBuffer.count = count;
m_commands.push_back(cmd);
}
void RHICommandBuffer::setTransientInstanceBuffer(const TransientInstanceBuffer& buffer, uint32_t start, uint32_t count) {
Command cmd;
cmd.type = CommandType::SetTransientInstanceBuffer;
cmd.setTransientInstanceBuffer.poolIndex = buffer.poolIndex;
cmd.setTransientInstanceBuffer.start = start;
cmd.setTransientInstanceBuffer.count = count;
m_commands.push_back(cmd);
}
void RHICommandBuffer::setScissor(uint16_t x, uint16_t y, uint16_t w, uint16_t h) {
Command cmd;
cmd.type = CommandType::SetScissor;
cmd.setScissor.x = x;
cmd.setScissor.y = y;
cmd.setScissor.w = w;
cmd.setScissor.h = h;
m_commands.push_back(cmd);
}
void RHICommandBuffer::draw(uint32_t vertexCount, uint32_t startVertex) {
Command cmd;
cmd.type = CommandType::Draw;
cmd.draw.vertexCount = vertexCount;
cmd.draw.startVertex = startVertex;
m_commands.push_back(cmd);
}
void RHICommandBuffer::drawIndexed(uint32_t indexCount, uint32_t startIndex) {
Command cmd;
cmd.type = CommandType::DrawIndexed;
cmd.drawIndexed.indexCount = indexCount;
cmd.drawIndexed.startIndex = startIndex;
m_commands.push_back(cmd);
}
void RHICommandBuffer::drawInstanced(uint32_t indexCount, uint32_t instanceCount) {
Command cmd;
cmd.type = CommandType::DrawInstanced;
cmd.drawInstanced.indexCount = indexCount;
cmd.drawInstanced.instanceCount = instanceCount;
m_commands.push_back(cmd);
}
void RHICommandBuffer::submit(ViewId view, ShaderHandle shader, uint32_t depth) {
Command cmd;
cmd.type = CommandType::Submit;
cmd.submit.view = view;
cmd.submit.shader = shader;
cmd.submit.depth = depth;
m_commands.push_back(cmd);
}
} // namespace grove::rhi