Extra2D/Extra2D/include/extra2d/scene/RenderScene.h

210 lines
3.8 KiB
C++

#pragma once
#include <extra2d/base/Object.h>
#include <extra2d/base/Types.h>
#include <string>
#include <vector>
namespace extra2d {
class Node;
class Camera;
class Model;
struct DrawBatch2D;
/**
* @brief 射线检测结果
*/
struct RaycastResult {
Node* node{nullptr};
float distance{0.0f};
};
/**
* @brief 渲染场景信息
*/
struct RenderSceneInfo {
std::string name;
};
/**
* @brief 渲染场景类
*
* 管理渲染场景中的相机、模型和绘制批次。
* 参考 Cocos Creator 的 RenderScene 设计。
*/
class RenderScene : public RefCounted {
public:
/**
* @brief 创建渲染场景
* @return 渲染场景引用
*/
static Ref<RenderScene> create();
/**
* @brief 构造函数
*/
RenderScene();
/**
* @brief 析构函数
*/
~RenderScene() override;
/**
* @brief 初始化渲染场景
* @param info 场景信息
* @return 成功返回 true
*/
bool initialize(const RenderSceneInfo& info);
/**
* @brief 销毁渲染场景
*/
void destroy();
/**
* @brief 激活渲染场景
*/
void activate();
/**
* @brief 更新渲染场景
* @param stamp 时间戳
*/
void update(u32 stamp);
// ==================== 相机管理 ====================
/**
* @brief 添加相机
* @param camera 相机
*/
void addCamera(Camera* camera);
/**
* @brief 移除相机
* @param camera 相机
*/
void removeCamera(Camera* camera);
/**
* @brief 移除所有相机
*/
void removeCameras();
/**
* @brief 获取所有相机
* @return 相机列表
*/
const std::vector<Ref<Camera>>& getCameras() const;
/**
* @brief 获取主相机
* @return 主相机指针
*/
Camera* getMainCamera() const;
/**
* @brief 设置主相机
* @param camera 相机
*/
void setMainCamera(Camera* camera);
// ==================== 模型管理 ====================
/**
* @brief 添加模型
* @param model 模型
*/
void addModel(Model* model);
/**
* @brief 移除模型
* @param model 模型
*/
void removeModel(Model* model);
/**
* @brief 移除所有模型
*/
void removeModels();
/**
* @brief 获取所有模型
* @return 模型列表
*/
const std::vector<Ref<Model>>& getModels() const;
/**
* @brief 生成模型 ID
* @return 模型 ID
*/
u64 generateModelId();
// ==================== 批次管理 ====================
/**
* @brief 添加绘制批次
* @param batch 批次
*/
void addBatch(DrawBatch2D* batch);
/**
* @brief 移除绘制批次
* @param batch 批次
*/
void removeBatch(DrawBatch2D* batch);
/**
* @brief 移除所有批次
*/
void removeBatches();
/**
* @brief 获取所有批次
* @return 批次列表
*/
const std::vector<DrawBatch2D*>& getBatches() const;
// ==================== 属性访问器 ====================
/**
* @brief 获取场景名称
* @return 场景名称
*/
const std::string& getName() const;
/**
* @brief 设置根节点
* @param node 根节点
*/
void setRootNode(Node* node);
/**
* @brief 获取根节点
* @return 根节点
*/
Node* getRootNode() const;
// ==================== 全局状态 ====================
/**
* @brief 全局管线状态改变回调
*/
void onGlobalPipelineStateChanged();
private:
std::string name_;
u64 modelId_{0};
std::vector<Ref<Camera>> cameras_;
std::vector<Ref<Model>> models_;
std::vector<DrawBatch2D*> batches_;
Camera* mainCamera_{nullptr};
Node* rootNode_{nullptr};
};
} // namespace extra2d