Extra2D/include/renderer/renderer_module.h

242 lines
6.6 KiB
C
Raw Permalink Normal View History

#pragma once
#include <event/events.h>
#include <module/module.h>
#include <module/module_registry.h>
#include <renderer/command_queue.h>
#include <renderer/render_graph.h>
#include <renderer/render_types.h>
#include <renderer/rhi/rhi.h>
#include <renderer/viewport_adapter.h>
namespace extra2d {
// 前向声明
class AssetsModule;
/**
* @brief
*
* RHI
* -
* - 使 RenderGraph
* - 使 CommandQueue
* -
*/
class RendererModule : public Module {
// 优先级为 4在 AssetsModule (优先级 3) 之后初始化
E2D_REGISTER_MODULE(RendererModule, "Renderer", 4)
public:
/**
* @brief
*/
RendererModule();
/**
* @brief
*/
~RendererModule() override;
// 禁止拷贝和移动
RendererModule(const RendererModule &) = delete;
RendererModule &operator=(const RendererModule &) = delete;
RendererModule(RendererModule &&) = delete;
RendererModule &operator=(RendererModule &&) = delete;
/**
* @brief
*
* RenderGraph CommandQueue
*
* @return
*/
bool init() override;
/**
* @brief
*
*
*/
void shutdown() override;
//===========================================================================
// 渲染接口
//===========================================================================
/**
* @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_; }
/**
* @brief
* @return
*/
RenderGraph *getRenderGraph() { return &renderGraph_; }
/**
* @brief
* @return
*/
CommandQueue *getCommandQueue() { return renderGraph_.getCommandQueue(); }
/**
* @brief RHI
* @return RHI
*/
RHIContext *getRHIContext() const;
/**
* @brief
* @return
*/
Handle<Material> getDefaultMaterialHandle() const;
/**
* @brief
* @return
*/
Handle<Mesh> getDefaultQuadHandle() const;
/**
* @brief 1x1
* @return
*/
Handle<Texture> getDefaultTextureHandle() const;
private:
//===========================================================================
// 事件处理器
//===========================================================================
/**
* @brief
*
* RenderGraph
*/
void onRenderBegin();
/**
* @brief
* @param cmd
*/
void onRenderSubmit(const RenderCommand &cmd);
/**
* @brief
* @param viewProj
*/
void onRenderSetCamera(const Mat4 &viewProj);
/**
* @brief
*
* RenderGraph
*/
void onRenderEnd();
/**
* @brief
* @param width
* @param height
*/
void onResize(int32 width, int32 height);
/**
* @brief
*
*
*/
void onWindowShow();
//===========================================================================
// 渲染执行
//===========================================================================
/**
* @brief
* @param cmd
*/
void executeCommand(const RenderCommand &cmd);
//===========================================================================
// 渲染图和命令队列
//===========================================================================
RenderGraph renderGraph_; // 渲染图
CommandQueue *commandQueue_ = nullptr; // 命令队列(指向 renderGraph_ 内部)
//===========================================================================
// 事件监听器
//===========================================================================
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 initialized_ = false; // 是否已初始化
//===========================================================================
// 渲染统计
//===========================================================================
struct Stats {
uint32 commandsSubmitted = 0; // 提交的命令数
uint32 drawCalls = 0; // 绘制调用次数
uint32 batches = 0; // 批次数
} stats_;
//===========================================================================
// 视口状态
//===========================================================================
int32 viewportX_ = 0, viewportY_ = 0;
int32 viewportWidth_ = 1280, viewportHeight_ = 720;
//===========================================================================
// 视口适配器
//===========================================================================
ViewportAdapter viewportAdapter_; // 视口适配器
//===========================================================================
// 相机矩阵
//===========================================================================
Mat4 viewProjectionMatrix_; // 当前视图投影矩阵
};
} // namespace extra2d