Extra2D/include/renderer/renderer_module.h

439 lines
12 KiB
C
Raw Normal View History

#pragma once
#include <array>
#include <event/events.h>
#include <module/module.h>
#include <module/module_registry.h>
#include <queue>
#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 {
/**
* @brief
*
*
* -
* -
* - GPU
* -
*/
class RendererModule : public Module {
// 自动注册到模块系统,优先级为 3在 Window、Timer、Input 之后)
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;
//===========================================================================
// 资源注册接口(供其他模块使用)
//===========================================================================
/**
* @brief
* @param material
* @return
*/
MaterialHandle registerMaterial(Ptr<Material> material);
/**
* @brief
* @param mesh
* @return
*/
MeshHandle registerMesh(Ptr<Mesh> mesh);
/**
* @brief
* @param texture
* @return
*/
TextureHandle registerTexture(Ptr<Texture> texture);
/**
* @brief
* @param handle
*/
void unregisterMaterial(MaterialHandle handle);
/**
* @brief
* @param handle
*/
void unregisterMesh(MeshHandle handle);
/**
* @brief
* @param handle
*/
void unregisterTexture(TextureHandle handle);
/**
* @brief
* @param handle
* @return nullptr
*/
Ptr<Material> getMaterial(MaterialHandle handle);
/**
* @brief
* @param handle
* @return nullptr
*/
Ptr<Mesh> getMesh(MeshHandle handle);
/**
* @brief
* @param handle
* @return nullptr
*/
Ptr<Texture> getTexture(TextureHandle handle);
//===========================================================================
// 默认资源
//===========================================================================
/**
* @brief
* @return
*/
MaterialHandle getDefaultMaterialHandle() const {
return defaultMaterialHandle_;
}
/**
* @brief
* @return
*/
MeshHandle getDefaultQuadHandle() const { return defaultQuadHandle_; }
/**
* @brief 1x1
* @return
*/
TextureHandle getDefaultTextureHandle() const {
return defaultTextureHandle_;
}
//===========================================================================
// 渲染状态设置
//===========================================================================
/**
* @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);
//===========================================================================
// 默认资源创建与销毁
//===========================================================================
/**
* @brief
* @return
*/
bool createDefaultResources();
/**
* @brief
*/
void destroyDefaultResources();
//===========================================================================
// 资源句柄管理
//===========================================================================
/**
* @brief
*
*
*/
struct ResourceSlot {
Ptr<Material> material;
Ptr<Mesh> mesh;
Ptr<Texture> texture;
uint32 generation = 0;
bool active = false;
};
/**
* @brief
*
*
*/
template <typename T> struct HandlePool {
std::vector<ResourceSlot> slots;
std::queue<uint32> freeIndices;
uint32 nextGeneration = 1;
/**
* @brief
* @return 3232
*/
uint64 acquire() {
uint32 index;
if (!freeIndices.empty()) {
index = freeIndices.front();
freeIndices.pop();
} else {
index = static_cast<uint32>(slots.size());
slots.emplace_back();
}
slots[index].active = true;
slots[index].generation = nextGeneration++;
// 编码句柄高32位是索引低32位是世代
return (static_cast<uint64>(index) << 32) | slots[index].generation;
}
/**
* @brief
* @param handle
*/
void release(uint64 handle) {
uint32 index = static_cast<uint32>(handle >> 32);
if (index < slots.size() && slots[index].active) {
slots[index].active = false;
slots[index].material.reset();
slots[index].mesh.reset();
slots[index].texture.reset();
freeIndices.push(index);
}
}
/**
* @brief
* @param handle
* @return nullptr
*/
ResourceSlot *get(uint64 handle) {
uint32 index = static_cast<uint32>(handle >> 32);
uint32 generation = static_cast<uint32>(handle & 0xFFFFFFFF);
if (index < slots.size() && slots[index].active &&
slots[index].generation == generation) {
return &slots[index];
}
return nullptr;
}
};
HandlePool<Material> materialPool_; // 材质资源池
HandlePool<Mesh> meshPool_; // 网格资源池
HandlePool<Texture> texturePool_; // 纹理资源池
//===========================================================================
// 命令缓冲区
//===========================================================================
std::array<RenderCommand, MAX_RENDER_COMMANDS>
commandBuffer_; // 预分配命令缓冲区
uint32 commandCount_ = 0; // 当前命令数量
//===========================================================================
// UBO 管理器
//===========================================================================
UniformBufferManager uniformManager_;
//===========================================================================
// 默认资源句柄
//===========================================================================
MaterialHandle defaultMaterialHandle_ = INVALID_MATERIAL_HANDLE;
MeshHandle defaultQuadHandle_ = INVALID_MESH_HANDLE;
TextureHandle defaultTextureHandle_ = INVALID_TEXTURE_HANDLE;
//===========================================================================
// 事件监听器
//===========================================================================
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