266 lines
7.3 KiB
C++
266 lines
7.3 KiB
C++
#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
|