#pragma once #include #include #include #include #include #include //#include namespace hgl { namespace graph::mtl { class MaterialCreateInfo; } /** * 工作对象

* * WorkObject被定义为工作对象,所有的渲染控制都需要被写在WorkObject的Render函数下。 */ class WorkObject:public TickObject { graph::RenderFramework *render_framework=nullptr; graph::IRenderTarget *cur_render_target=nullptr; graph::RenderPass *render_pass=nullptr; bool destroy_flag=false; protected: graph::RenderResource *db=nullptr; //暂时的,未来会被更好的机制替代 /** * 不管我们的游戏多么的复杂,一般在一个WorkObject中,都只需要一个SceneWorld以及一个Renderer即可。 * 如果我们整体切换World,那么建议直接切换到新的WorkObject上。 */ graph::SceneWorld * world =nullptr; //世界 graph::Renderer * renderer=nullptr; //渲染器 public: graph::RenderFramework * GetRenderFramework (){return render_framework;} graph::VulkanDevice * GetDevice (){return render_framework->GetDevice();} graph::VulkanDevAttr * GetDevAttr (){return render_framework->GetDevAttr();} graph::TextureManager * GetTextureManager (){return render_framework->GetTextureManager();} const VkExtent2D & GetExtent2D (){return cur_render_target->GetExtent();} public: const bool IsDestroy ()const{return destroy_flag;} void MarkDestory(){destroy_flag=true;} public: WorkObject(graph::RenderFramework *,graph::IRenderTarget *rt=nullptr); virtual ~WorkObject()=default; virtual bool Init()=0; virtual void OnRenderTargetSwitch(graph::RenderFramework *rf,graph::IRenderTarget *rt); virtual void OnResize(const VkExtent2D &){} virtual void Tick(double){} virtual void Render(double delta_time,graph::RenderCmdBuffer *cmd)=0; virtual void Render(double delta_time); public: template graph::Pipeline *CreatePipeline(ARGS...args) { return render_pass->CreatePipeline(args...); } graph::MaterialInstance *CreateMaterialInstance(const AnsiString &mi_name,const graph::mtl::MaterialCreateInfo *mci,const graph::VILConfig *vil_cfg=nullptr) { return db->CreateMaterialInstance(mi_name,mci,vil_cfg); } graph::MaterialInstance *CreateMaterialInstance(const AnsiString &mtl_name,graph::mtl::MaterialCreateConfig *mtl_cfg,const graph::VILConfig *vil_cfg=nullptr) { AutoDelete mci=graph::mtl::CreateMaterialCreateInfo(GetDevAttr(),mtl_name,mtl_cfg); return db->CreateMaterialInstance(mtl_name,mci,vil_cfg); } graph::Primitive *CreatePrimitive( const AnsiString &name, const uint32_t vertices_count, const graph::VIL *vil, const std::initializer_list &vad_list); graph::Mesh *CreateMesh(const AnsiString &name, const uint32_t vertices_count, graph::MaterialInstance *mi, graph::Pipeline *pipeline, const std::initializer_list &vad_list); };//class WorkObject /** * 但我们认为游戏开发者不应该关注如何控制渲染,而应该关注如何处理游戏逻辑. * 所以我们在WorkObject的基础上再提供RenderWorkObject派生类,用于直接封装好的渲染场景树控制。 * * 开发者仅需要将要渲染的物件放置于场景树即可。 * 但开发者也可以直接使用WorkObject,自行管理这些事。 * */ }//namespcae hgl