#pragma once #include #include #include VK_NAMESPACE_BEGIN /** * 可绘制原始图形创建器 */ class PrimitiveCreater { protected: GPUDevice * device; VertexDataManager * vdm; const VIL * vil; protected: AnsiString prim_name; PrimitiveData * prim_data; uint32_t vertices_number; ///<顶点数量 void_pointer *map_ptr_list; ///<映射指针列表 uint32_t index_number; ///<索引数量 IndexType index_type; ///<索引类型 IndexBuffer * ibo; ///<索引缓冲区 public: PrimitiveCreater(GPUDevice *,const VIL *); PrimitiveCreater(VertexDataManager *); virtual ~PrimitiveCreater(); /** * 初始化一个原始图形创建 * @parama name 原始图形名称 * @parama vertices_count 顶点数量 * @parama index_count 索引数量 * @parama it 索引类型(注:当使用VDM时,此值无效) */ bool Init(const AnsiString &name, const uint32_t vertices_count, const uint32_t index_count=0,IndexType it=IndexType::AUTO); void Clear(); ///<清除创建器数据 public: //顶点缓冲区 const uint32_t GetVertexCount()const{ return vertices_number; } ///<取得顶点数量 const int GetVABIndex (const AnsiString &name,const VkFormat &format); ///<取得顶点属性索引 void * MapVAB (const int vab_index); ///<映射一个顶点属性数据区 void UnmapVAB (const int vab_index); ///<取消映射 bool WriteVAB (const AnsiString &name,const VkFormat &format,const void *data); ///<直接写入顶点属性数据 public: //索引缓冲区 const IndexType GetIndexType()const{return index_type;} ///<取得索引类型 const uint32_t GetIndexCount()const{return index_number;} ///<取得索引数量 void * MapIBO(); void UnmapIBO(); bool WriteIBO(const void *data,const uint32_t count); template bool WriteIBO(const T *data){return WriteIBO(data,index_number);} public: //创建可渲染对象 Primitive * Create(); ///<创建一个可渲染对象,并清除创建器数据 };//class PrimitiveCreater /** * VAB原生数据访问映射 */ template class VABRawMap { PrimitiveCreater *pc; int vab_index; T *map_ptr; public: VABRawMap(PrimitiveCreater *c,const VkFormat &format,const AnsiString &name) { pc=c; vab_index=pc->GetVABIndex(name,format); map_ptr=(T *)(pc->MapVAB(vab_index)); } ~VABRawMap() { if(map_ptr) pc->UnmapVAB(vab_index); } const bool IsValid()const{ return map_ptr; } operator T *(){ return map_ptr; } };//template class VABRawMap typedef VABRawMap VABRawMapi8, VABRawMapByte; typedef VABRawMap VABRawMapi16,VABRawMapShort; typedef VABRawMap VABRawMapi32,VABRawMapInt; typedef VABRawMap VABRawMapu8, VABRawMapUByte; typedef VABRawMap VABRawMapu16,VABRawMapUShort; typedef VABRawMap VABRawMapu32,VABRawMapUInt; typedef VABRawMap VABRawMapFloat; typedef VABRawMap VABRawMapDouble; /** * VAB VertexAttribDataAccess数据访问映射 */ template class VABMap { PrimitiveCreater *pc; int vab_index; T *vb; public: VABMap(PrimitiveCreater *c,const AnsiString &name) { pc=c; vab_index=pc->GetVABIndex(name,T::GetVulkanFormat()); void *map_ptr=(T *)(pc->MapVAB(vab_index)); if(map_ptr) { vb=T::Create(pc->GetVertexCount(),map_ptr); vb->Begin(); } else { vb=nullptr; } } ~VABMap() { if(pc&&vab_index>=0) pc->UnmapVAB(vab_index); } void Restart() { if(vb) vb->Begin(); } const bool IsValid()const{ return vb; } T *operator->(){ return vb; } };//template class VABMap typedef VABMap VABMap1i8 ,VABMap1b; typedef VABMap VABMap1i16,VABMap1s; typedef VABMap VABMap1i32,VABMap1i; typedef VABMap VABMap1u8 ,VABMap1ub; typedef VABMap VABMap1u16,VABMap1us; typedef VABMap VABMap1u32,VABMap1ui; typedef VABMap VABMap1f; typedef VABMap VABMap1d; typedef VABMap VABMap2i8 ,VABMap2b; typedef VABMap VABMap2i16,VABMap2s; typedef VABMap VABMap2i32,VABMap2i; typedef VABMap VABMap2u8 ,VABMap2ub; typedef VABMap VABMap2u16,VABMap2us; typedef VABMap VABMap2u32,VABMap2ui; typedef VABMap VABMap2f; typedef VABMap VABMap2d; typedef VABMap VABMap3i32,VABMap3i; typedef VABMap VABMap3u32,VABMap3ui; typedef VABMap VABMap3f; typedef VABMap VABMap3d; typedef VABMap VABMap4i8 ,VABMap4b; typedef VABMap VABMap4i16,VABMap4s; typedef VABMap VABMap4i32,VABMap4i; typedef VABMap VABMap4u8, VABMap4ub; typedef VABMap VABMap4u16,VABMap4us; typedef VABMap VABMap4u32,VABMap4ui; typedef VABMap VABMap4f; typedef VABMap VABMap4d; /** * 索引缓冲区映射访问 */ template class IBMap { PrimitiveCreater *pc; T *map_ptr; public: IBMap(PrimitiveCreater *c) { pc=c; if(pc) map_ptr=(T *)(pc->MapIBO()); else map_ptr=nullptr; } ~IBMap() { if(map_ptr&&pc) pc->UnmapIBO(); } const bool IsValid()const{ return map_ptr; } operator T *(){ return map_ptr; } };//template class IBMap using IBMapU8=IBMap; using IBMapU16=IBMap; using IBMapU32=IBMap; VK_NAMESPACE_END