diff --git a/example/LightBasic/BlinnPhongDirectionLight.cpp b/example/LightBasic/BlinnPhongDirectionLight.cpp index 3b2e5939..b10e8ead 100644 --- a/example/LightBasic/BlinnPhongDirectionLight.cpp +++ b/example/LightBasic/BlinnPhongDirectionLight.cpp @@ -10,9 +10,8 @@ #include #include #include +#include #include -#include -#include using namespace hgl; using namespace hgl::graph; @@ -35,90 +34,6 @@ constexpr const COLOR AxisColor[4]= COLOR::White //全局颜色 }; -class VertexDataManager -{ - GPUDevice *device; - -protected: - - uint vi_count; ///<顶点输入流数量 - const VIF * vif_list; ///<顶点输入格式列表 - - VkDeviceSize vbo_max_size; ///<顶点缓冲区分配空间大小 - VkDeviceSize vbo_cur_size; ///<顶点缓冲区当前使用大小 - VBO ** vbo; ///<顶点缓冲区列表 - - VkDeviceSize ibo_cur_size; ///<索引缓冲区当前使用大小 - IndexBuffer * ibo; ///<索引缓冲区 - -protected: - - DataChain data_chain; ///<数据链 - -public: - - VertexDataManager(GPUDevice *dev,const VIL &_vil) - { - device=dev; - - vi_count=_vil.GetCount(); - vif_list=_vil.GetVIFList(); //来自于Material,不会被释放,所以指针有效 - - vbo_max_size=0; - vbo_cur_size=0; - vbo=hgl_zero_new(vi_count); - - ibo_cur_size=0; - ibo=nullptr; - } - - ~VertexDataManager() - { - SAFE_CLEAR_OBJECT_ARRAY(vbo,vi_count); - SAFE_CLEAR(ibo); - } - - const VkDeviceSize GetVBOMaxCount ()const{return vbo_max_size;} ///<取得顶点缓冲区分配的空间最大数量 - const VkDeviceSize GetVBOCurCount ()const{return vbo_cur_size;} ///<取得顶点缓冲区当前数量 - - const IndexType GetIBOType ()const{return ibo?ibo->GetType():IndexType::ERR;} ///<取得索引缓冲区类型 - const VkDeviceSize GetIBOMaxCount ()const{return ibo?ibo->GetCount():-1;} ///<取得索引缓冲区分配的空间最大数量 - const VkDeviceSize GetIBOCurCount ()const{return ibo?ibo_cur_size:-1;} ///<取得索引缓冲区当前数量 - -public: - - bool Init(const VkDeviceSize vbo_size,const VkDeviceSize ibo_size,const IndexType index_type) - { - if(vbo[0]||ibo) //已经初始化过了 - return(false); - - if(vbo_size<=0) - return(false); - - vbo_max_size=vbo_size; - ibo_cur_size=ibo_size; - - vbo_cur_size=0; - ibo_cur_size=0; - - for(uint i=0;iCreateVBO(vif_list[i].format,vbo_max_size); - if(!vbo[i]) - return(false); - } - - if(ibo_size>0) - { - ibo=device->CreateIBO(index_type,ibo_size); - if(!ibo) - return(false); - } - - return(true); - } -};//class VertexDataManager - class TestApp:public SceneAppFramework { private: //plane grid diff --git a/inc/hgl/graph/VertexDataManager.h b/inc/hgl/graph/VertexDataManager.h new file mode 100644 index 00000000..aeb3a1ec --- /dev/null +++ b/inc/hgl/graph/VertexDataManager.h @@ -0,0 +1,94 @@ +#pragma once + +#include +#include + +namespace hgl +{ + namespace graph + { + class VertexDataManager + { + GPUDevice *device; + + protected: + + uint vi_count; ///<顶点输入流数量 + const VIF * vif_list; ///<顶点输入格式列表 + + VkDeviceSize vbo_max_size; ///<顶点缓冲区分配空间大小 + VkDeviceSize vbo_cur_size; ///<顶点缓冲区当前使用大小 + VBO ** vbo; ///<顶点缓冲区列表 + + VkDeviceSize ibo_cur_size; ///<索引缓冲区当前使用大小 + IndexBuffer * ibo; ///<索引缓冲区 + + protected: + + DataChain data_chain; ///<数据链 + + public: + + VertexDataManager(GPUDevice *dev,const VIL *_vil) + { + device=dev; + + vi_count=_vil->GetCount(); + vif_list=_vil->GetVIFList(); //来自于Material,不会被释放,所以指针有效 + + vbo_max_size=0; + vbo_cur_size=0; + vbo=hgl_zero_new(vi_count); + + ibo_cur_size=0; + ibo=nullptr; + } + + ~VertexDataManager() + { + SAFE_CLEAR_OBJECT_ARRAY(vbo,vi_count); + SAFE_CLEAR(ibo); + } + + const VkDeviceSize GetVBOMaxCount ()const{return vbo_max_size;} ///<取得顶点缓冲区分配的空间最大数量 + const VkDeviceSize GetVBOCurCount ()const{return vbo_cur_size;} ///<取得顶点缓冲区当前数量 + + const IndexType GetIBOType ()const{return ibo?ibo->GetType():IndexType::ERR;} ///<取得索引缓冲区类型 + const VkDeviceSize GetIBOMaxCount ()const{return ibo?ibo->GetCount():-1;} ///<取得索引缓冲区分配的空间最大数量 + const VkDeviceSize GetIBOCurCount ()const{return ibo?ibo_cur_size:-1;} ///<取得索引缓冲区当前数量 + + public: + + bool Init(const VkDeviceSize vbo_size,const VkDeviceSize ibo_size,const IndexType index_type) + { + if(vbo[0]||ibo) //已经初始化过了 + return(false); + + if(vbo_size<=0) + return(false); + + vbo_max_size=vbo_size; + ibo_cur_size=ibo_size; + + vbo_cur_size=0; + ibo_cur_size=0; + + for(uint i=0;iCreateVBO(vif_list[i].format,vbo_max_size); + if(!vbo[i]) + return(false); + } + + if(ibo_size>0) + { + ibo=device->CreateIBO(index_type,ibo_size); + if(!ibo) + return(false); + } + + return(true); + } + };//class VertexDataManager + }//namespace graph +}//namespace hgl diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 2972d398..b5b9b8c6 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -13,6 +13,10 @@ SET(SG_VAD_SOURCE ${SG_INCLUDE_PATH}/VertexAttribData.h SOURCE_GROUP("VertexAttribData" FILES ${SG_VAD_SOURCE}) +SET(SG_VDM_SOURCE ${SG_INCLUDE_PATH}/VertexDataManager.h) + +SOURCE_GROUP("VertexDataManager" FILES ${SG_VDM_SOURCE}) + SET(TILE_SOURCE ${SG_INCLUDE_PATH}/TileData.h TileData.cpp) @@ -303,6 +307,7 @@ add_cm_library(ULRE.SceneGraph "ULRE" ${SCENE_GRAPH_HEADER} ${SG_TEXTURE_SOURCE} ${TILE_SOURCE} ${SG_VAD_SOURCE} + ${SG_VDM_SOURCE} # ${FONT_MANAGE_SOURCE} # ${FONT_SOURCE}