first version of VertexDataManager.h

This commit is contained in:
hyzboy 2024-04-02 21:14:34 +08:00
parent 1d3bec4098
commit ac81e4f8f0
3 changed files with 100 additions and 86 deletions

View File

@ -10,9 +10,8 @@
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/mtl/BlinnPhong.h>
#include<hgl/graph/VertexDataManager.h>
#include<hgl/color/Color.h>
#include<hgl/type/DataChain.h>
#include<hgl/type/MemoryBlock.h>
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<VBO *>(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;i<vi_count;i++)
{
vbo[i]=device->CreateVBO(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

View File

@ -0,0 +1,94 @@
#pragma once
#include<hgl/graph/VK.h>
#include<hgl/type/DataChain.h>
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<VBO *>(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;i<vi_count;i++)
{
vbo[i]=device->CreateVBO(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

View File

@ -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}