Extra2D/include/renderer/renderer_module.h

266 lines
7.3 KiB
C
Raw Normal View History

#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