diff --git a/CMCore b/CMCore index fd0dbb00..fff02148 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit fd0dbb00550bf8aee92ae19651fe8a780d8d5205 +Subproject commit fff021488c9608c2ac4ee06bc544e9a80849c6f0 diff --git a/CMSceneGraph b/CMSceneGraph index e1155d03..ffcb2f8f 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit e1155d0374cd187d3e4b74cfa1905c1e1df21167 +Subproject commit ffcb2f8fdc46a5dffc04692e4ff9fdcc1512cf3a diff --git a/example/Basic/BillboardTest.cpp b/example/Basic/BillboardTest.cpp index cfb3c987..227b2009 100644 --- a/example/Basic/BillboardTest.cpp +++ b/example/Basic/BillboardTest.cpp @@ -12,6 +12,7 @@ #include #include #include +#include using namespace hgl; using namespace hgl::graph; @@ -32,10 +33,6 @@ class TestApp:public WorkObject private: - AutoDelete render_list =nullptr; - - SceneNode render_root; - Material * mtl_plane_grid =nullptr; MaterialInstance * mi_plane_grid =nullptr; Pipeline * pipeline_plane_grid =nullptr; @@ -115,7 +112,7 @@ private: return(true); } - Mesh *Add(Primitive *r,MaterialInstance *mi,Pipeline *p) + SceneNode *CreateSceneNode(Primitive *r,MaterialInstance *mi,Pipeline *p) { Mesh *ri=db->CreateMesh(r,mi,p); @@ -125,9 +122,7 @@ private: return(nullptr); } - render_root.Add(new SceneNode(ri)); - - return ri; + return(new SceneNode(ri)); } bool CreateRenderObject() @@ -167,16 +162,24 @@ private: bool InitScene() { - Add(prim_plane_grid,mi_plane_grid,pipeline_plane_grid); + SceneNode *scene_root=GetSceneRoot(); //取得缺省场景根节点 + Camera *cur_camera=GetCamera(); //取得缺省相机 - render_root.Add(new SceneNode(ro_billboard)); + scene_root->Add(CreateSceneNode(prim_plane_grid,mi_plane_grid,pipeline_plane_grid)); - camera->pos=Vector3f(32,32,32); - camera_control->SetTarget(Vector3f(0,0,0)); - camera_control->Refresh(); + scene_root->Add(new SceneNode(ro_billboard)); - render_root.RefreshMatrix(); - render_list->Expend(&render_root); + cur_camera->pos=Vector3f(32,32,32); + + CameraControl *camera_control=GetCameraControl(); + + if(camera_control + &&camera_control->GetControlName()==FirstPersonCameraControl::StaticControlName()) + { + FirstPersonCameraControl *fp_cam_ctl=(FirstPersonCameraControl *)camera_control; + + fp_cam_ctl->SetTarget(Vector3f(0,0,0)); + } return(true); } diff --git a/inc/hgl/WorkObject.h b/inc/hgl/WorkObject.h index 7d8d1045..4309d0fd 100644 --- a/inc/hgl/WorkObject.h +++ b/inc/hgl/WorkObject.h @@ -48,7 +48,8 @@ namespace hgl graph::Scene * GetScene (){return scene;} graph::SceneNode * GetSceneRoot (){return scene->GetRootNode();} graph::Renderer * GetRenderer (){return renderer;} - graph::Camera * GetCamera (){return renderer->GetCurCamera();} + graph::Camera * GetCamera (){return renderer->GetCamera();} + graph::CameraControl * GetCameraControl (){return render_framework->GetDefaultCameraControl();} public: diff --git a/inc/hgl/graph/RenderFramework.h b/inc/hgl/graph/RenderFramework.h index 2f291394..3b29a59d 100644 --- a/inc/hgl/graph/RenderFramework.h +++ b/inc/hgl/graph/RenderFramework.h @@ -6,6 +6,7 @@ #include #include #include +#include VK_NAMESPACE_BEGIN @@ -52,9 +53,10 @@ protected: protected: //RenderContext,未来合并成一个RenderContext结构 - Scene * default_scene =nullptr; - Camera * default_camera =nullptr; - Renderer * default_renderer=nullptr; + Scene * default_scene =nullptr; + Camera * default_camera =nullptr; + CameraControl * default_camera_control =nullptr; + Renderer * default_renderer =nullptr; void CreateDefaultRenderer(); @@ -83,6 +85,7 @@ public: Scene * GetDefaultScene (){return default_scene;} Camera * GetDefaultCamera (){return default_camera;} + CameraControl * GetDefaultCameraControl (){return default_camera_control;} Renderer * GetDefaultRenderer (){return default_renderer;} public: diff --git a/inc/hgl/graph/RenderList.h b/inc/hgl/graph/RenderList.h index a0a5ff70..fc4157ff 100644 --- a/inc/hgl/graph/RenderList.h +++ b/inc/hgl/graph/RenderList.h @@ -29,12 +29,16 @@ namespace hgl virtual bool ExpendNode(SceneNode *); + public: + + const CameraInfo *GetCameraInfo()const{return camera_info;} + public: RenderList(VulkanDevice *); virtual ~RenderList()=default; - virtual void SetCamera(CameraInfo *ci){camera_info=ci;} ///<设置相机信息 + virtual void SetCameraInfo(CameraInfo *ci){camera_info=ci;} ///<设置相机信息 virtual bool Expend(SceneNode *); ///<展开场景树到渲染列表 bool IsEmpty()const{return !renderable_count;} ///<是否是空的 diff --git a/inc/hgl/graph/RenderTask.h b/inc/hgl/graph/RenderTask.h index f975b683..21fbb78f 100644 --- a/inc/hgl/graph/RenderTask.h +++ b/inc/hgl/graph/RenderTask.h @@ -16,7 +16,7 @@ namespace hgl::graph IRenderTarget * render_target; RenderList * render_list; - Camera * camera; + CameraInfo * camera_info; public: @@ -24,16 +24,16 @@ namespace hgl::graph IRenderTarget * GetRenderTarget ()const{return render_target;} RenderList * GetRenderList ()const{return render_list;} - Camera * GetCamera ()const{return camera;} + CameraInfo * GetCameraInfo ()const{return camera_info;} public: - RenderTask(const RenderTaskName &tn,IRenderTarget *rt=nullptr,Camera *c=nullptr); + RenderTask(const RenderTaskName &tn,IRenderTarget *rt=nullptr,CameraInfo *ci=nullptr); virtual ~RenderTask(); - bool SetRenderTarget(IRenderTarget *rt); - void SetCamera(Camera *c){camera=c;} + bool SetRenderTarget(IRenderTarget *); + void SetCameraInfo(CameraInfo *); bool RebuildRenderList(SceneNode *); diff --git a/inc/hgl/graph/Renderer.h b/inc/hgl/graph/Renderer.h index deab643a..df538b60 100644 --- a/inc/hgl/graph/Renderer.h +++ b/inc/hgl/graph/Renderer.h @@ -2,16 +2,16 @@ #include #include +#include #include namespace hgl::graph { class Scene; + class CameraControl; using RenderTaskNameMap=Map; - using UBOCameraInfo=DeviceBufferMap; - /** * 渲染器 */ @@ -20,9 +20,7 @@ namespace hgl::graph IRenderTarget *render_target; Scene *scene; - Camera *camera; - - UBOCameraInfo *ubo_camera_info; + CameraControl *camera_control; //RenderTaskNameMap static_render_task_list; ///<静态渲染任务列表 //RenderTaskNameMap dynamic_render_task_list; ///<动态渲染任务列表 @@ -40,7 +38,7 @@ namespace hgl::graph const VkExtent2D &GetExtent ()const{return render_target->GetExtent();} ///<取得当前渲染器画面尺寸 Scene * GetScene ()const{return scene;} ///<获取场景世界 - Camera * GetCurCamera ()const{return camera;} ///<获取当前相机 + Camera * GetCamera ()const{return camera_control->GetCamera();} ///<获取当前相机 public: @@ -48,8 +46,8 @@ namespace hgl::graph virtual ~Renderer(); bool SetRenderTarget(IRenderTarget *); - void SetCurScene(Scene *); - void SetCurCamera(Camera *); + void SetScene(Scene *); + void SetCameraControl(CameraControl *); void SetClearColor(const Color4f &c){clear_color=c;} diff --git a/inc/hgl/graph/VKBuffer.h b/inc/hgl/graph/VKBuffer.h index 5f05fe65..0a1d6d2d 100644 --- a/inc/hgl/graph/VKBuffer.h +++ b/inc/hgl/graph/VKBuffer.h @@ -75,7 +75,7 @@ public: delete dev_buf; } - operator DeviceBuffer *(){return dev_buf;} + DeviceBuffer *GetDeviceBuffer(){return dev_buf;} T *data(){return &data_map;} @@ -84,6 +84,6 @@ public: if(dev_buf) dev_buf->Write(&data_map,sizeof(T)); } -}; +};//template class DeviceBufferMap VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKDescriptorBindingManage.h b/inc/hgl/graph/VKDescriptorBindingManage.h index 07315914..fd2cd220 100644 --- a/inc/hgl/graph/VKDescriptorBindingManage.h +++ b/inc/hgl/graph/VKDescriptorBindingManage.h @@ -43,6 +43,12 @@ public: return ubo_map.Add(name,buf); } + template + bool AddUBO(const AnsiString &name,DeviceBufferMap *dbm) + { + return AddUBO(name,dbm->GetDeviceBuffer()); + } + DeviceBuffer *GetUBO(const AnsiString &name) { if(name.IsEmpty())return(nullptr); @@ -65,6 +71,12 @@ public: return ssbo_map.Add(name,buf); } + template + bool AddSSBO(const AnsiString &name,DeviceBufferMap *dbm) + { + return AddSSBO(name,dbm->GetDeviceBuffer()); + } + DeviceBuffer *GetSSBO(const AnsiString &name) { if(name.IsEmpty())return(nullptr); diff --git a/inc/hgl/graph/VKRenderTarget.h b/inc/hgl/graph/VKRenderTarget.h index 19c71e7f..7356a4aa 100644 --- a/inc/hgl/graph/VKRenderTarget.h +++ b/inc/hgl/graph/VKRenderTarget.h @@ -73,7 +73,7 @@ public: // Command Buffer public: - virtual const ViewportInfo *GetViewportInfo ()const + virtual ViewportInfo * GetViewportInfo () { return ubo_vp_info->data(); } diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 49e5438d..02839419 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -67,13 +67,14 @@ SET(GRAPH_MODULE_FILES ${SGM_HEADER_PATH}/GraphModule.h source_group("Framework\\Module" FILES ${GRAPH_MODULE_FILES}) SET(GRAPH_FRAMEWORK_FILES ${SG_INCLUDE_PATH}/RenderFramework.h - RenderFramework.cpp) + RenderFramework.cpp + CameraControl.cpp) source_group("Framework" FILES ${GRAPH_FRAMEWORK_FILES}) SET(SG_SCENE_SOURCE ${SG_INCLUDE_PATH}/Scene.h ${SG_INCLUDE_PATH}/SceneNodeAttributes.h - ${SG_INCLUDE_PATH}/SceneNode.h + ${SG_INCLUDE_PATH}/SceneNode.h ${SG_INCLUDE_PATH}/SceneMatrix.h ${SG_INCLUDE_PATH}/SceneOrient.h Scene/SceneNode.cpp diff --git a/src/SceneGraph/RenderFramework.cpp b/src/SceneGraph/RenderFramework.cpp index b6a381f4..8fa2c0a0 100644 --- a/src/SceneGraph/RenderFramework.cpp +++ b/src/SceneGraph/RenderFramework.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -52,6 +53,7 @@ RenderFramework::RenderFramework(const OSString &an) RenderFramework::~RenderFramework() { SAFE_CLEAR(default_renderer) + SAFE_CLEAR(default_camera_control) SAFE_CLEAR(default_camera) SAFE_CLEAR(default_scene) SAFE_CLEAR(render_resource) @@ -135,13 +137,21 @@ bool RenderFramework::Init(uint w,uint h) void RenderFramework::CreateDefaultRenderer() { - - SAFE_CLEAR(default_renderer) - default_renderer=new Renderer(GetSwapchainRenderTarget()); - default_renderer->SetCurScene(default_scene); - default_renderer->SetCurCamera(default_camera); + IRenderTarget *rt=GetSwapchainRenderTarget(); + + default_renderer=new Renderer(rt); + default_renderer->SetScene(default_scene); + + if(!default_camera_control) + { + auto ubo_camera_info=device->CreateUBO(); + + default_camera_control=new FirstPersonCameraControl(rt->GetViewportInfo(),default_camera,ubo_camera_info); + } + + default_renderer->SetCameraControl(default_camera_control); } void RenderFramework::OnResize(uint w,uint h) diff --git a/src/SceneGraph/Vulkan/VKRenderTarget.cpp b/src/SceneGraph/Vulkan/VKRenderTarget.cpp index d32a1850..c4502e54 100644 --- a/src/SceneGraph/Vulkan/VKRenderTarget.cpp +++ b/src/SceneGraph/Vulkan/VKRenderTarget.cpp @@ -15,7 +15,7 @@ IRenderTarget::IRenderTarget(RenderFramework *rf,const VkExtent2D &ext):desc_bin ubo_vp_info=GetDevice()->CreateUBO(); - desc_binding.AddUBO(mtl::SBS_ViewportInfo.name,*ubo_vp_info); + desc_binding.AddUBO(mtl::SBS_ViewportInfo.name,ubo_vp_info); OnResize(ext); } diff --git a/src/SceneGraph/render/RenderTask.cpp b/src/SceneGraph/render/RenderTask.cpp index 61a43cd0..ea2858c7 100644 --- a/src/SceneGraph/render/RenderTask.cpp +++ b/src/SceneGraph/render/RenderTask.cpp @@ -5,11 +5,11 @@ namespace hgl::graph { - RenderTask::RenderTask(const RenderTaskName &tn,IRenderTarget *rt,Camera *c) + RenderTask::RenderTask(const RenderTaskName &tn,IRenderTarget *rt,CameraInfo *ci) { task_name=tn; - camera=c; + camera_info=ci; render_target=nullptr; render_list=nullptr; @@ -37,11 +37,23 @@ namespace hgl::graph if(!render_list) { render_list=new RenderList(rt->GetDevice()); + + if(camera_info) + render_list->SetCameraInfo(camera_info); } return(true); } + void RenderTask::SetCameraInfo(CameraInfo *ci) + { + if(camera_info==ci)return; + + camera_info=ci; + + render_list->SetCameraInfo(ci); + } + bool RenderTask::RebuildRenderList(SceneNode *root) { if(!root) @@ -50,6 +62,9 @@ namespace hgl::graph if(!render_list) return(false); + if(!render_list->GetCameraInfo()&&camera_info) + render_list->SetCameraInfo(camera_info); + //记往不需要,也千万不要手动render_list->Clear,因为那会释放内存。再次使用时重新分配 //render_list->Expend会自己复位所有数据,且并不会释放内存 render_list->Expend(root); diff --git a/src/SceneGraph/render/Renderer.cpp b/src/SceneGraph/render/Renderer.cpp index d930fdab..4cf2b162 100644 --- a/src/SceneGraph/render/Renderer.cpp +++ b/src/SceneGraph/render/Renderer.cpp @@ -10,8 +10,8 @@ namespace hgl::graph { render_target=rt; scene=nullptr; - camera=nullptr; - ubo_camera_info=rt->GetDevice()->CreateUBO(); + camera_control=nullptr; + render_task=new RenderTask("DefaultRenderTask",rt); clear_color.Set(0,0,0,1); @@ -19,7 +19,6 @@ namespace hgl::graph Renderer::~Renderer() { - delete ubo_camera_info; delete render_task; } @@ -40,12 +39,11 @@ namespace hgl::graph render_target=rt; render_task->SetRenderTarget(rt); - render_task->SetCamera(camera); return(true); } - void Renderer::SetCurScene(Scene *sw) + void Renderer::SetScene(Scene *sw) { if(scene==sw) return; @@ -63,9 +61,9 @@ namespace hgl::graph //} } - void Renderer::SetCurCamera(Camera *c) + void Renderer::SetCameraControl(CameraControl *cc) { - if(!scene||!c) + if(!scene||!cc) return; //if(camera) @@ -76,7 +74,7 @@ namespace hgl::graph // camera->Unjoin(this); //} - camera=c; + camera_control=cc; //if(camera) //{ @@ -86,7 +84,7 @@ namespace hgl::graph // camera->Join(this); //} - render_task->SetCamera(camera); //它要camera只是为了CPU端算远近 + render_task->SetCameraInfo(camera_control->GetCameraInfo()); } bool Renderer::RenderFrame() @@ -101,17 +99,25 @@ namespace hgl::graph root->RefreshMatrix(); - if(camera) + if(camera_control) { - RefreshCameraInfo(ubo_camera_info->data(),render_target->GetViewportInfo(),camera); + camera_control->SetViewport(render_target->GetViewportInfo()); + + camera_control->Refresh(); } + // 这里内部会将Scene tree展开成RenderList,而RenderList排序是需要CameraInfo的 render_task->RebuildRenderList(root); bool result=false; graph::RenderCmdBuffer *cmd=render_target->BeginRender(); + if(camera_control) + { + cmd->SetDescriptorBinding(camera_control->GetDescriptorBinding()); + } + cmd->SetClearColor(0,clear_color); cmd->BeginRenderPass(); diff --git a/src/ShaderGen/3d/Std3DMaterial.cpp b/src/ShaderGen/3d/Std3DMaterial.cpp index cb8e79aa..aca0b4b4 100644 --- a/src/ShaderGen/3d/Std3DMaterial.cpp +++ b/src/ShaderGen/3d/Std3DMaterial.cpp @@ -25,7 +25,7 @@ bool Std3DMaterial::CustomVertexShader(ShaderCreateInfoVertex *vsc) mci->AddStruct(SBS_CameraInfo); mci->AddUBO(VK_SHADER_STAGE_ALL_GRAPHICS, - DescriptorSetType::Global, + DescriptorSetType::Camera, SBS_CameraInfo); }