210 lines
3.8 KiB
C++
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
|