diff --git a/example/Vulkan/third_triangle.cpp b/example/Vulkan/third_triangle.cpp index 3ce1d3de..d47bea90 100644 --- a/example/Vulkan/third_triangle.cpp +++ b/example/Vulkan/third_triangle.cpp @@ -6,6 +6,7 @@ #include #include #include +#include using namespace hgl; using namespace hgl::graph; @@ -33,7 +34,7 @@ class TestApp:public VulkanApplicationFramework private: SceneNode render_root; - RenderList * render_list =nullptr; + RenderList2D * render_list =nullptr; MaterialInstance * material_instance =nullptr; Renderable * render_obj =nullptr; @@ -73,7 +74,7 @@ private: render_root.RefreshMatrix(); - render_list->Expend(GetCameraInfo(),&render_root); + render_list->Expend(&render_root); return(true); } @@ -90,7 +91,7 @@ public: if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) return(false); - render_list=new RenderList(device); + render_list=new RenderList2D(device); if(!InitMaterial()) return(false); diff --git a/inc/hgl/graph/RenderList.h b/inc/hgl/graph/RenderList.h index e28a34d8..24977cc2 100644 --- a/inc/hgl/graph/RenderList.h +++ b/inc/hgl/graph/RenderList.h @@ -13,25 +13,26 @@ namespace hgl { namespace graph { - using MaterialSets=SortedSets; - /** * 渲染对象列表
* 已经展开的渲染对象列表,产生mvp用UBO/SSBO等数据,最终创建RenderCommandBuffer */ class RenderList { - protected: + protected: - GPUDevice * device; - RenderCmdBuffer *cmd_buf; + GPUDevice * device; + RenderCmdBuffer * cmd_buf; private: - RenderNodeList render_node_list; ///<场景节点列表 - MaterialSets material_sets; ///<材质合集 + GPUArrayBuffer * mvp_array; + CameraInfo camera_info; - RenderNodeComparator *render_node_comparator; + RenderNode3DList render_node_list; ///<场景节点列表 + MaterialSets material_sets; ///<材质合集 + + RenderNode3DComparator *render_node_comparator; private: @@ -61,49 +62,11 @@ namespace hgl RenderList(GPUDevice *); virtual ~RenderList(); - + virtual bool Expend(const CameraInfo &,SceneNode *); virtual bool Render(RenderCmdBuffer *); };//class RenderList - - class RenderList2D:public RenderList - { - - protected: - - virtual bool Begin() override; - virtual bool Expend(SceneNode *) override; - virtual void End() override; - - public: - - RenderList2D(); - virtual ~RenderList2D() override; - - virtual bool Expend(SceneNode *); - }; - - class RenderList3D:public RenderList - { - protected: - - CameraInfo camera_info; - GPUArrayBuffer *mvp_array; - - protected: - - virtual bool Begin() override; - virtual bool Expend(SceneNode *) override; - virtual void End() override; - - public: - - RenderList3D(); - virtual ~RenderList3D() override; - - bool Expend(const CameraInfo &,SceneNode *); - }; }//namespace graph }//namespace hgl #endif//HGL_GRAPH_RENDER_LIST_INCLUDE diff --git a/inc/hgl/graph/RenderList2D.h b/inc/hgl/graph/RenderList2D.h index e28a34d8..ea1aa903 100644 --- a/inc/hgl/graph/RenderList2D.h +++ b/inc/hgl/graph/RenderList2D.h @@ -1,37 +1,34 @@ -#ifndef HGL_GRAPH_RENDER_LIST_INCLUDE -#define HGL_GRAPH_RENDER_LIST_INCLUDE +#ifndef HGL_GRAPH_RENDER_LIST_2D_INCLUDE +#define HGL_GRAPH_RENDER_LIST_2D_INCLUDE #include -#include #include -#include +#include #include -#include -#include -#include +#include namespace hgl { namespace graph { - using MaterialSets=SortedSets; - /** * 渲染对象列表
* 已经展开的渲染对象列表,产生mvp用UBO/SSBO等数据,最终创建RenderCommandBuffer */ - class RenderList + class RenderList2D { protected: - GPUDevice * device; - RenderCmdBuffer *cmd_buf; + GPUDevice * device; + RenderCmdBuffer * cmd_buf; private: - RenderNodeList render_node_list; ///<场景节点列表 - MaterialSets material_sets; ///<材质合集 +// GPUArrayBuffer * mvp_array; - RenderNodeComparator *render_node_comparator; + RenderNode2DList render_node_list; ///<场景节点列表 + MaterialSets material_sets; ///<材质合集 + + RenderNode2DComparator render_node_comparator; private: @@ -46,7 +43,7 @@ namespace hgl protected: virtual bool Begin(); - virtual bool Expend(SceneNode *); + virtual bool ExpendNode(SceneNode *); virtual void End(); private: @@ -59,51 +56,13 @@ namespace hgl public: - RenderList(GPUDevice *); - virtual ~RenderList(); + RenderList2D(GPUDevice *); + virtual ~RenderList2D(); - virtual bool Expend(const CameraInfo &,SceneNode *); + virtual bool Expend(SceneNode *); virtual bool Render(RenderCmdBuffer *); - };//class RenderList - - class RenderList2D:public RenderList - { - - protected: - - virtual bool Begin() override; - virtual bool Expend(SceneNode *) override; - virtual void End() override; - - public: - - RenderList2D(); - virtual ~RenderList2D() override; - - virtual bool Expend(SceneNode *); - }; - - class RenderList3D:public RenderList - { - protected: - - CameraInfo camera_info; - GPUArrayBuffer *mvp_array; - - protected: - - virtual bool Begin() override; - virtual bool Expend(SceneNode *) override; - virtual void End() override; - - public: - - RenderList3D(); - virtual ~RenderList3D() override; - - bool Expend(const CameraInfo &,SceneNode *); - }; + };//class RenderList2D }//namespace graph }//namespace hgl -#endif//HGL_GRAPH_RENDER_LIST_INCLUDE +#endif//HGL_GRAPH_RENDER_LIST_2D_INCLUDE diff --git a/inc/hgl/graph/RenderNode2D.h b/inc/hgl/graph/RenderNode2D.h index 40efcee2..c125bfec 100644 --- a/inc/hgl/graph/RenderNode2D.h +++ b/inc/hgl/graph/RenderNode2D.h @@ -1,30 +1,16 @@ #ifndef HGL_GRAPH_RENDER_NODE_2D_INCLUDE #define HGL_GRAPH_RENDER_NODE_2D_INCLUDE -#include -#include -#include +#include namespace hgl { namespace graph { class Renderable; - struct Transiton2D - { - Vector2f move; - Vector2f center; //中心点 - - //下方的不管是缩放还是旋转,均以上面的center为中心变换 - - Vector2f scale; - float rotate; - float z; - }; - struct RenderNode2D { - Transiton2D trans; + Matrix3x4f local_to_world; Renderable *ri; }; diff --git a/inc/hgl/graph/VKMaterial.h b/inc/hgl/graph/VKMaterial.h index 868ad7a0..354d95a6 100644 --- a/inc/hgl/graph/VKMaterial.h +++ b/inc/hgl/graph/VKMaterial.h @@ -78,5 +78,7 @@ public: bool Release(VIL *); const uint GetVILCount(); };//class Material + +using MaterialSets=SortedSets; VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE diff --git a/inc/hgl/graph/VKMaterialParameters.h b/inc/hgl/graph/VKMaterialParameters.h index 23002f31..6b575bd0 100644 --- a/inc/hgl/graph/VKMaterialParameters.h +++ b/inc/hgl/graph/VKMaterialParameters.h @@ -43,7 +43,6 @@ public: public: #define MP_TYPE_IS(name) const bool is##name()const{return set_type==DescriptorSetType::name;} - MP_TYPE_IS(Skeleton) MP_TYPE_IS(Instance) MP_TYPE_IS(PerObject) MP_TYPE_IS(PerMaterial) diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index cb4e35f6..43e66447 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -41,9 +41,10 @@ SET(SCENE_GRAPH_HEADER ${SG_INCLUDE_PATH}/SceneInfo.h ${SG_INCLUDE_PATH}/RenderList2D.h ) -SET(SCENE_GRAPH_SOURCE RenderList.cpp +SET(SCENE_GRAPH_SOURCE + #RenderList.cpp RenderList2D.cpp - RenderList3D.cpp + #RenderList3D.cpp SceneNode.cpp SceneOrient.cpp) @@ -118,6 +119,7 @@ SET(VK_MEMORY_SOURCE ${SG_INCLUDE_PATH}/VKMemory.h Vulkan/VKMemory.cpp Vulkan/VKMemoryAllocator.cpp Vulkan/VKBuffer.cpp + Vulkan/VKArrayBuffer.cpp ) SET(VK_DEVICE_TEXTURE_SOURCE Vulkan/Texture/BufferImageCopy2D.h diff --git a/src/SceneGraph/RenderList2D.cpp b/src/SceneGraph/RenderList2D.cpp index 45d69787..63458df0 100644 --- a/src/SceneGraph/RenderList2D.cpp +++ b/src/SceneGraph/RenderList2D.cpp @@ -1,5 +1,4 @@ -#include -#include +#include #include #include #include @@ -15,11 +14,10 @@ * for(pipeline) * for(material_instance) * for(vbo) -* for(distance) */ template<> -int Comparator::compare(const RenderNode3DPointer &obj_one,const RenderNode3DPointer &obj_two) const +int Comparator::compare(const RenderNode2DPointer &obj_one,const RenderNode2DPointer &obj_two) const { int off; @@ -58,17 +56,6 @@ int Comparator::compare(const RenderNode3DPointer &obj_one, return off; } - //比较距离 - { - const double dist=obj_one->distance_to_camera_square- - obj_two->distance_to_camera_square; - - //由于距离差距可能会小于1,但又返回int,所以需要做如此处理 - - if(dist>0)return 1;else - if(dist<0)return -1; - } - return 0; } @@ -76,7 +63,7 @@ namespace hgl { namespace graph { - RenderList::RenderList(GPUDevice *dev) + RenderList2D::RenderList2D(GPUDevice *dev) { device =dev; cmd_buf =nullptr; @@ -87,13 +74,15 @@ namespace hgl last_pipeline =nullptr; hgl_zero(last_mp); last_vbo =0; + +// mvp_array =new GPUArrayBuffer(device,VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,MVPMatrixBytes); } - RenderList::~RenderList() + RenderList2D::~RenderList2D() { } - bool RenderList::Begin() + bool RenderList2D::Begin() { render_node_list.ClearData(); ri_list.ClearData(); @@ -103,7 +92,7 @@ namespace hgl return(true); } - void RenderList::End() + void RenderList2D::End() { if(render_node_list.GetCount()<=0)return; @@ -116,46 +105,46 @@ namespace hgl { //按当前总节点数量分配UBO - mvp_array->Alloc(count); - mvp_array->Clear(); +// mvp_array->Alloc(count); +// mvp_array->Clear(); ri_list.ClearData(); - ri_list.SetCount(count); + ri_list.SetCount(count); } { - ubo_align=mvp_array->GetUnitSize(); +// ubo_align=mvp_array->GetUnitSize(); - char *mp=(char *)(mvp_array->Map(0,count)); +// char *mp=(char *)(mvp_array->Map(0,count)); Renderable **ri=ri_list.GetData(); - for(RenderNode *node:render_node_list) //未来可能要在Expend处考虑做去重 + for(RenderNode2D *node:render_node_list) //未来可能要在Expend处考虑做去重 { - memcpy(mp,&(node->matrix),MVPMatrixBytes); - mp+=ubo_align; +// memcpy(mp,&(node->matrix),MVPMatrixBytes); +// mp+=ubo_align; (*ri)=node->ri; ++ri; } - mvp_array->Flush(count); +// mvp_array->Flush(count); } } //为所有的材质绑定 - for(Material *mtl:material_sets) - { - MaterialParameters *mp=mtl->GetMP(DescriptorSetType::PerObject); + //for(Material *mtl:material_sets) + //{ + // MaterialParameters *mp=mtl->GetMP(DescriptorSetType::PerObject); - if(mp) - { - if(mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),true)) - mp->Update(); - } - } + // if(mp) + // { + // if(mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),true)) + // mp->Update(); + // } + //} } - bool RenderList::Expend(SceneNode *sn) + bool RenderList2D::ExpendNode(SceneNode *sn) { if(!sn)return(false); @@ -163,14 +152,9 @@ namespace hgl if(ri) { - RenderNode *rn=new RenderNode; + RenderNode2D *rn=new RenderNode2D; - rn->matrix.Set(sn->GetLocalToWorldMatrix(),camera_info.vp,camera_info.view); - - rn->WorldCenter=sn->GetWorldCenter(); - - rn->distance_to_camera_square=length_squared(rn->WorldCenter,camera_info.pos); -// rn->distance_to_camera=sqrtf(rn->distance_to_camera_square); + rn->local_to_world=sn->GetLocalToWorldMatrix(); rn->ri=ri; @@ -185,20 +169,18 @@ namespace hgl return(true); } - bool RenderList::Expend(const CameraInfo &ci,SceneNode *sn) + bool RenderList2D::Expend(SceneNode *sn) { if(!device|!sn)return(false); - camera_info=ci; - Begin(); - Expend(sn); + ExpendNode(sn); End(); return(true); } - void RenderList::Render(Renderable *ri) + void RenderList2D::Render(Renderable *ri) { if(last_pipeline!=ri->GetPipeline()) { @@ -273,7 +255,7 @@ namespace hgl } } - bool RenderList::Render(RenderCmdBuffer *cb) + bool RenderList2D::Render(RenderCmdBuffer *cb) { if(!cb) return(false);