2026-03-03 02:16:29 +08:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <glad/glad.h>
|
|
|
|
|
#include <renderer/rhi/rhi.h>
|
|
|
|
|
|
|
|
|
|
namespace extra2d {
|
|
|
|
|
|
|
|
|
|
// 前向声明
|
|
|
|
|
class GLPipeline;
|
|
|
|
|
class GLBuffer;
|
|
|
|
|
class GLTexture;
|
|
|
|
|
class GLFramebuffer;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief OpenGL 命令列表实现
|
|
|
|
|
*/
|
|
|
|
|
class GLCommandList : public RHICommandList {
|
|
|
|
|
public:
|
|
|
|
|
GLCommandList();
|
|
|
|
|
~GLCommandList() override;
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
// 命令列表生命周期
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
|
|
void begin() override;
|
|
|
|
|
void end() override;
|
|
|
|
|
void submit() override;
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
// 渲染通道
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
|
|
void beginRenderPass(RHIFramebuffer *framebuffer,
|
|
|
|
|
ClearFlags clearFlags = ClearFlags::Color,
|
|
|
|
|
const Color &clearColor = Color::Black,
|
|
|
|
|
float clearDepth = 1.0f,
|
|
|
|
|
uint8_t clearStencil = 0) override;
|
|
|
|
|
void endRenderPass() override;
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
// 状态设置
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
|
|
void setViewport(const Viewport &viewport) override;
|
|
|
|
|
void setScissor(const ScissorRect &scissor) override;
|
|
|
|
|
void setPipeline(RHIPipeline *pipeline) override;
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
// 资源绑定
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
|
|
void setVertexBuffer(uint32_t slot, RHIBuffer *buffer,
|
2026-03-03 03:48:55 +08:00
|
|
|
uint32_t offset = 0, uint32_t stride = 0) override;
|
2026-03-03 02:16:29 +08:00
|
|
|
void setIndexBuffer(RHIBuffer *buffer, IndexType type,
|
|
|
|
|
uint32_t offset = 0) override;
|
|
|
|
|
void setUniformBuffer(uint32_t slot, RHIBuffer *buffer) override;
|
2026-03-03 03:48:55 +08:00
|
|
|
void setUniformBuffer(uint32_t slot, RHIBuffer *buffer, uint32_t offset, uint32_t size = 0) override;
|
2026-03-03 02:16:29 +08:00
|
|
|
void setTexture(uint32_t slot, RHITexture *texture) override;
|
|
|
|
|
void setSampler(uint32_t slot, TextureFilter minFilter,
|
|
|
|
|
TextureFilter magFilter, TextureWrap wrapS,
|
|
|
|
|
TextureWrap wrapT) override;
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
// 绘制命令
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
|
|
void draw(uint32_t vertexCount, uint32_t firstVertex = 0,
|
|
|
|
|
uint32_t instanceCount = 1, uint32_t firstInstance = 0) override;
|
|
|
|
|
|
|
|
|
|
void drawIndexed(uint32_t indexCount, uint32_t firstIndex = 0,
|
|
|
|
|
int32_t vertexOffset = 0, uint32_t instanceCount = 1,
|
|
|
|
|
uint32_t firstInstance = 0) override;
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
// 工具方法
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
|
|
void clear(ClearFlags flags, const Color &color = Color::Black,
|
|
|
|
|
float depth = 1.0f, uint8_t stencil = 0) override;
|
|
|
|
|
|
|
|
|
|
bool isRecording() const override;
|
|
|
|
|
|
|
|
|
|
// 设置 uniform 变量
|
2026-03-03 03:48:55 +08:00
|
|
|
void setUniform(const char* name, float value) override;
|
|
|
|
|
void setUniform(const char* name, const Vec2& value) override;
|
|
|
|
|
void setUniform(const char* name, const Vec3& value) override;
|
|
|
|
|
void setUniform(const char* name, const Color& value) override;
|
|
|
|
|
void setUniform(const char* name, const Mat4& value) override;
|
2026-03-03 02:16:29 +08:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
bool recording_ = false;
|
|
|
|
|
GLPipeline *currentPipeline_ = nullptr;
|
|
|
|
|
GLBuffer *currentVertexBuffer_ = nullptr;
|
|
|
|
|
GLBuffer *currentIndexBuffer_ = nullptr;
|
|
|
|
|
GLFramebuffer *currentFramebuffer_ = nullptr;
|
|
|
|
|
GLuint currentShaderProgram_ = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace extra2d
|