#pragma once #include #include 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, uint32_t offset = 0, uint32_t stride = 0) override; void setIndexBuffer(RHIBuffer *buffer, IndexType type, uint32_t offset = 0) override; void setUniformBuffer(uint32_t slot, RHIBuffer *buffer) override; void setUniformBuffer(uint32_t slot, RHIBuffer *buffer, uint32_t offset, uint32_t size = 0) override; 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 变量 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; private: bool recording_ = false; GLPipeline *currentPipeline_ = nullptr; GLBuffer *currentVertexBuffer_ = nullptr; GLBuffer *currentIndexBuffer_ = nullptr; GLFramebuffer *currentFramebuffer_ = nullptr; GLuint currentShaderProgram_ = 0; }; } // namespace extra2d