diff --git a/example/Basic/auto_instance.cpp b/example/Basic/auto_instance.cpp index 4e64f825..0805b98b 100644 --- a/example/Basic/auto_instance.cpp +++ b/example/Basic/auto_instance.cpp @@ -29,14 +29,8 @@ constexpr uint8 color_data[VERTEX_COUNT][4]= class TestApp:public WorkObject { - Color4f clear_color =Color4f(0.2f,0.2f,0.2f,1.0f); - private: - AutoDelete render_list =nullptr; - - SceneNode render_root; - MaterialInstance * material_instance =nullptr; Mesh * render_obj =nullptr; @@ -80,19 +74,17 @@ private: double rad; Matrix4f mat; + + SceneNode *scene_root=GetSceneRoot(); ///<取得场景根节点 for(uint i=0;i((360.0f/double(TRIANGLE_NUMBER))*i); //这里一定要加,否则结果用int保存会出现问题 mat=rotate(rad,Vector3f(0,0,1)); - render_root.Add(new SceneNode(mat,render_obj)); + scene_root->Add(new SceneNode(mat,render_obj)); } - render_root.RefreshMatrix(); - - render_list->Expend(&render_root); - return(true); } @@ -102,10 +94,7 @@ public: bool Init() override { - render_list=GetRenderFramework()->CreateRenderList(); - - if(!render_list) - return(false); + GetRenderer()->SetClearColor(Color4f(0.2f,0.2f,0.2f,1.0f)); if(!InitMaterial()) return(false); @@ -115,15 +104,6 @@ public: return(true); } - - void Render(double delta_time,graph::RenderCmdBuffer *cmd)override - { - cmd->SetClearColor(0,clear_color); - - cmd->BeginRenderPass(); - render_list->Render(cmd); - cmd->EndRenderPass(); - } };//class TestApp:public WorkObject int os_main(int,os_char **) diff --git a/inc/hgl/WorkObject.h b/inc/hgl/WorkObject.h index 25685d6b..19ee53f5 100644 --- a/inc/hgl/WorkObject.h +++ b/inc/hgl/WorkObject.h @@ -4,6 +4,7 @@ #include #include #include +#include #include //#include @@ -22,8 +23,6 @@ namespace hgl class WorkObject:public TickObject { graph::RenderFramework *render_framework=nullptr; - graph::IRenderTarget *cur_render_target=nullptr; - graph::RenderPass *render_pass=nullptr; bool destroy_flag=false; bool render_dirty=true; @@ -44,7 +43,12 @@ namespace hgl graph::VulkanDevAttr * GetDevAttr (){return render_framework->GetDevAttr();} graph::TextureManager * GetTextureManager (){return render_framework->GetTextureManager();} - const VkExtent2D & GetExtent2D (){return cur_render_target->GetExtent();} + const VkExtent2D & GetExtent (){return renderer->GetExtent();} + + graph::Scene * GetScene (){return scene;} + graph::SceneNode * GetSceneRoot (){return scene->GetRootNode();} + + graph::Renderer * GetRenderer (){return renderer;} public: @@ -56,19 +60,17 @@ namespace hgl public: - WorkObject(graph::RenderFramework *,graph::IRenderTarget *rt=nullptr); + WorkObject(graph::RenderFramework *,graph::Renderer *r=nullptr); virtual ~WorkObject()=default; virtual bool Init()=0; - virtual void OnRenderTargetSwitch(graph::RenderFramework *rf,graph::IRenderTarget *rt); + virtual void OnRendererChange(graph::RenderFramework *rf,graph::Renderer *r); 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: @@ -76,7 +78,7 @@ namespace hgl template graph::Pipeline *CreatePipeline(ARGS...args) { - return render_pass->CreatePipeline(args...); + return renderer->GetRenderPass()->CreatePipeline(args...); } graph::MaterialInstance *CreateMaterialInstance(const AnsiString &mi_name,const graph::mtl::MaterialCreateInfo *mci,const graph::VILConfig *vil_cfg=nullptr) diff --git a/inc/hgl/graph/RenderFramework.h b/inc/hgl/graph/RenderFramework.h index ca7c4b87..edbc4ed0 100644 --- a/inc/hgl/graph/RenderFramework.h +++ b/inc/hgl/graph/RenderFramework.h @@ -55,6 +55,8 @@ protected: Scene * default_scene =nullptr; Renderer * default_renderer=nullptr; + void CreateDefaultRenderer(); + public: Window * GetWindow ()const{return win;} diff --git a/inc/hgl/graph/Renderer.h b/inc/hgl/graph/Renderer.h index 81e36e27..20b5bbfe 100644 --- a/inc/hgl/graph/Renderer.h +++ b/inc/hgl/graph/Renderer.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include namespace hgl::graph @@ -15,7 +16,7 @@ namespace hgl::graph class Renderer { IRenderTarget *render_target; - Scene *world; + Scene *scene; Camera *camera; @@ -24,23 +25,31 @@ namespace hgl::graph RenderTask *render_task; ///<当前渲染任务 - protected: - + Color4f clear_color; ///<清屏颜色 + bool build_frame=false; public: - Scene *GetScene () const { return world; } ///<获取场景世界 - Camera * GetCurCamera () const { return camera; } ///<获取当前相机 + RenderPass *GetRenderPass (){return render_target->GetRenderPass();} ///<取得当前渲染器RenderPass + + const VkExtent2D &GetExtent ()const{return render_target->GetExtent();} ///<取得当前渲染器画面尺寸 + + Scene * GetScene ()const{return scene;} ///<获取场景世界 + Camera * GetCurCamera ()const{return camera;} ///<获取当前相机 public: Renderer(IRenderTarget *); virtual ~Renderer(); - void SetCurWorld(Scene *); + void SetRenderTarget(IRenderTarget *); + void SetCurScene(Scene *); void SetCurCamera(Camera *); - bool RenderFrame(RenderCmdBuffer *); + void SetClearColor(const Color4f &c){clear_color=c;} + + bool RenderFrame(); ///<重新重成这一帧的CommandList + bool Submit(); ///<提交CommandList到GPU };//class Renderer }//namespace hgl::graph diff --git a/src/SceneGraph/RenderFramework.cpp b/src/SceneGraph/RenderFramework.cpp index 62822119..0b40fe29 100644 --- a/src/SceneGraph/RenderFramework.cpp +++ b/src/SceneGraph/RenderFramework.cpp @@ -5,9 +5,12 @@ #include #include #include +#include #include #include #include +#include +#include #include #include @@ -47,6 +50,8 @@ RenderFramework::RenderFramework(const OSString &an) RenderFramework::~RenderFramework() { + SAFE_CLEAR(default_renderer) + SAFE_CLEAR(default_scene) SAFE_CLEAR(render_resource) SAFE_CLEAR(module_manager) @@ -117,14 +122,28 @@ bool RenderFramework::Init(uint w,uint h) render_resource=new RenderResource(device); + default_scene=new Scene; + + CreateDefaultRenderer(); + return(true); } +void RenderFramework::CreateDefaultRenderer() +{ + SAFE_CLEAR(default_renderer) + + default_renderer=new Renderer(GetSwapchainRenderTarget()); + default_renderer->SetCurScene(default_scene); +} + void RenderFramework::OnResize(uint w,uint h) { VkExtent2D ext(w,h); sc_module->OnResize(ext); //其实swapchain_module并不需要传递尺寸数据过去 + + CreateDefaultRenderer(); } void RenderFramework::OnActive(bool) diff --git a/src/SceneGraph/render/Renderer.cpp b/src/SceneGraph/render/Renderer.cpp index 25867844..2fc9d147 100644 --- a/src/SceneGraph/render/Renderer.cpp +++ b/src/SceneGraph/render/Renderer.cpp @@ -7,43 +7,55 @@ namespace hgl::graph Renderer::Renderer(IRenderTarget *rt) { render_target=rt; - world=nullptr; - render_task=new RenderTask("TempRenderTask"); + scene=nullptr; + camera=nullptr; + render_task=new RenderTask("DefaultRenderTask",rt); + + clear_color.Set(0,0,0,1); } Renderer::~Renderer() { delete render_task; - delete world; } - void Renderer::SetCurWorld(Scene *sw) + void Renderer::SetRenderTarget(IRenderTarget *rt) { - if(world==sw) + if(render_target==rt) return; - //if(world) + render_target=rt; + + render_task->Set(rt); + } + + void Renderer::SetCurScene(Scene *sw) + { + if(scene==sw) + return; + + //if(scene) //{ - // world->Unjoin(this); + // scene->Unjoin(this); //} - world=sw; + scene=sw; - //if(world) + //if(scene) //{ - // world->Join(this); + // scene->Join(this); //} } void Renderer::SetCurCamera(Camera *c) { - if(!world||!c) + if(!scene||!c) return; //if(camera) //{ - // if(world) - // camera->Unjoin(world); + // if(scene) + // camera->Unjoin(scene); // camera->Unjoin(this); //} @@ -52,19 +64,19 @@ namespace hgl::graph //if(camera) //{ - // if(world) - // camera->Unjoin(world); + // if(scene) + // camera->Unjoin(scene); // camera->Join(this); //} } - bool Renderer::RenderFrame(RenderCmdBuffer *cmd) + bool Renderer::RenderFrame() { - if(!world) + if(!scene) return(false); - SceneNode *root=world->GetRootNode(); + SceneNode *root=scene->GetRootNode(); if(!root) return(false); @@ -75,10 +87,29 @@ namespace hgl::graph bool result=false; + graph::RenderCmdBuffer *cmd=render_target->BeginRender(); + + cmd->SetClearColor(0,clear_color); + cmd->BeginRenderPass(); result=render_task->Render(cmd); cmd->EndRenderPass(); + render_target->EndRender(); + + build_frame=result; + return(result); } + + bool Renderer::Submit() + { + if(!render_target) + return(false); + + if(!build_frame) + return(false); + + return render_target->Submit(); + } }//namespace hgl::graph diff --git a/src/Work/WorkManager.cpp b/src/Work/WorkManager.cpp index 005d008f..6c9d23c7 100644 --- a/src/Work/WorkManager.cpp +++ b/src/Work/WorkManager.cpp @@ -32,9 +32,7 @@ namespace hgl VkExtent2D ext={w,h}; - graph::IRenderTarget *rt=render_framework->GetSwapchainRenderTarget(); - - cur_work_object->OnRenderTargetSwitch(render_framework,rt); + cur_work_object->OnRendererChange(render_framework,render_framework->GetDefaultRenderer()); cur_work_object->OnResize(ext); } @@ -63,7 +61,7 @@ namespace hgl cur_work_object=wo; - wo->OnRenderTargetSwitch(render_framework,render_framework->GetSwapchainRenderTarget()); + wo->OnRendererChange(render_framework,render_framework->GetDefaultRenderer()); Window *win=render_framework->GetWindow(); graph::VulkanDevice *dev=render_framework->GetDevice(); diff --git a/src/Work/WorkObject.cpp b/src/Work/WorkObject.cpp index 1966a88d..de46ee9c 100644 --- a/src/Work/WorkObject.cpp +++ b/src/Work/WorkObject.cpp @@ -11,15 +11,15 @@ namespace hgl { - WorkObject::WorkObject(graph::RenderFramework *rf,graph::IRenderTarget *rt) + WorkObject::WorkObject(graph::RenderFramework *rf,graph::Renderer *r) { - if(!rt) - rt=rf->GetSwapchainRenderTarget(); + if(!r) + renderer=rf->GetDefaultRenderer(); - OnRenderTargetSwitch(rf,rt); + OnRendererChange(rf,renderer); } - void WorkObject::OnRenderTargetSwitch(graph::RenderFramework *rf,graph::IRenderTarget *rt) + void WorkObject::OnRendererChange(graph::RenderFramework *rf,graph::Renderer *r) { if(!rf) { @@ -27,20 +27,12 @@ namespace hgl db=nullptr; } - if(!rt) - { - cur_render_target=nullptr; - render_pass=nullptr; - } - - if(!rf||!rt) + if(!rf||!r) { return; } render_framework=rf; - cur_render_target=rt; - render_pass=rt->GetRenderPass(); db=rf->GetRenderResource(); scene=rf->GetDefaultScene(); @@ -49,9 +41,9 @@ namespace hgl void WorkObject::Render(double delta_time) { - if(!cur_render_target) + if(!renderer) { - //std::cerr<<"WorkObject::Render,cur_render_target=nullptr"<BeginRender(); - - if(!cmd) - { - //std::cerr<<"WorkObject::Render,cur_render_target->BeginRender()=nullptr"<EndRender(); - cur_render_target->Submit(); + renderer->RenderFrame(); render_dirty=false; } + renderer->Submit(); + //std::cout<<"WorkObject::Render End"<