Extra2D/include/renderer/renderer_module.h

266 lines
7.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <array>
#include <event/events.h>
#include <module/module.h>
#include <module/module_registry.h>
#include <renderer/material.h>
#include <renderer/mesh.h>
#include <renderer/render_types.h>
#include <renderer/shader.h>
#include <renderer/texture.h>
#include <renderer/uniform_buffer.h>
#include <renderer/viewport_adapter.h>
#include <vector>
namespace extra2d {
// 前向声明
class AssetsModule;
/**
* @brief 渲染器模块
*
* 核心渲染系统模块,负责:
* - 通过事件接收渲染命令
* - 自动批处理和排序
* - 执行实际渲染
*
* 资源管理已迁移到 AssetsModule
*/
class RendererModule : public Module {
E2D_REGISTER_MODULE(RendererModule, "Renderer", 3)
public:
/**
* @brief 默认构造函数
*/
RendererModule();
/**
* @brief 析构函数
*/
~RendererModule() override;
// 禁止拷贝
RendererModule(const RendererModule &) = delete;
RendererModule &operator=(const RendererModule &) = delete;
// 允许移动
RendererModule(RendererModule &&) noexcept;
RendererModule &operator=(RendererModule &&) noexcept;
/**
* @brief 初始化模块
*
* 绑定事件监听器,等待窗口显示事件进行 GL 初始化
*
* @return 初始化是否成功
*/
bool init() override;
/**
* @brief 关闭模块
*
* 清理所有渲染资源
*/
void shutdown() override;
//===========================================================================
// 默认资源(通过 AssetsModule 获取)
//===========================================================================
/**
* @brief 获取默认材质句柄
* @return 默认材质句柄
*/
MaterialHandle getDefaultMaterialHandle() const;
/**
* @brief 获取默认四边形网格句柄
* @return 默认四边形网格句柄
*/
MeshHandle getDefaultQuadHandle() const;
/**
* @brief 获取默认纹理句柄1x1 白色纹理)
* @return 默认纹理句柄
*/
TextureHandle getDefaultTextureHandle() const;
//===========================================================================
// 渲染状态设置
//===========================================================================
/**
* @brief 设置视口
* @param x 视口左上角 X 坐标
* @param y 视口左上角 Y 坐标
* @param width 视口宽度
* @param height 视口高度
*/
void setViewport(int32 x, int32 y, int32 width, int32 height);
/**
* @brief 清除缓冲区
* @param color 清除颜色
* @param flags 清除标志(组合使用 CLEAR_COLOR_FLAG, CLEAR_DEPTH_FLAG,
* CLEAR_STENCIL_FLAG
*/
void clear(const Color &color, uint32 flags = CLEAR_COLOR_FLAG);
/**
* @brief 获取视口适配器
* @return 视口适配器引用
*/
ViewportAdapter &getViewportAdapter() { return viewportAdapter_; }
/**
* @brief 获取视口适配器const版本
* @return 视口适配器const引用
*/
const ViewportAdapter &getViewportAdapter() const { return viewportAdapter_; }
private:
//===========================================================================
// 事件处理器
//===========================================================================
/**
* @brief 渲染开始事件处理
*
* 清空命令缓冲区,重置统计信息
*/
void onRenderBegin();
/**
* @brief 渲染提交事件处理
* @param cmd 渲染命令
*/
void onRenderSubmit(const RenderCommand &cmd);
/**
* @brief 渲染设置相机事件处理
* @param viewProj 视图投影矩阵
*/
void onRenderSetCamera(const Mat4 &viewProj);
/**
* @brief 渲染结束事件处理
*
* 排序命令,批处理并执行绘制
*/
void onRenderEnd();
/**
* @brief 窗口大小改变事件处理
* @param width 新宽度
* @param height 新高度
*/
void onResize(int32 width, int32 height);
/**
* @brief 窗口显示事件处理
*
* 延迟 GL 初始化到窗口显示时
*/
void onWindowShow();
//===========================================================================
// 渲染执行
//===========================================================================
/**
* @brief 排序渲染命令
*
* 根据 sortKey 对命令进行排序以优化绘制顺序
*/
void sortCommands();
/**
* @brief 批处理并绘制
*
* 将相同材质和网格的命令合并批次绘制
*/
void batchAndDraw();
/**
* @brief 绘制批次
* @param start 批次起始索引
* @param count 批次命令数量
* @param materialHandle 材质句柄
* @param meshHandle 网格句柄
*/
void drawBatch(uint32 start, uint32 count, MaterialHandle materialHandle,
MeshHandle meshHandle);
/**
* @brief 执行单个渲染命令
* @param cmd 渲染命令
*/
void executeCommand(const RenderCommand &cmd);
//===========================================================================
// 命令缓冲区
//===========================================================================
std::array<RenderCommand, MAX_RENDER_COMMANDS>
commandBuffer_; // 预分配命令缓冲区
uint32 commandCount_ = 0; // 当前命令数量
//===========================================================================
// UBO 管理器
//===========================================================================
UniformBufferManager uniformManager_;
//===========================================================================
// 事件监听器
//===========================================================================
events::OnRenderBegin::Listener onRenderBeginListener_;
events::OnRenderSubmit::Listener onRenderSubmitListener_;
events::OnRenderSetCamera::Listener onRenderSetCameraListener_;
events::OnRenderEnd::Listener onRenderEndListener_;
events::OnResize::Listener onResizeListener_;
events::OnShow::Listener onShowListener_;
//===========================================================================
// 状态标志
//===========================================================================
bool glInitialized_ = false; // GL 是否已初始化
//===========================================================================
// 渲染统计
//===========================================================================
struct Stats {
uint32 commandsSubmitted = 0; // 提交的命令数
uint32 commandsExecuted = 0; // 执行的命令数
uint32 drawCalls = 0; // 绘制调用次数
uint32 batches = 0; // 批次数
} stats_;
//===========================================================================
// 视口状态
//===========================================================================
int32 viewportX_ = 0, viewportY_ = 0;
int32 viewportWidth_ = 0, viewportHeight_ = 0;
//===========================================================================
// 视口适配器
//===========================================================================
ViewportAdapter viewportAdapter_; // 视口适配器
//===========================================================================
// 相机矩阵
//===========================================================================
Mat4 viewProjectionMatrix_; // 当前视图投影矩阵
};
} // namespace extra2d