#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; VkDeviceSize vertices_number; ///<顶点数量 VkDeviceSize index_number; ///<索引数量 IndexType index_type; ///<索引类型 IBAccess * iba; ///<索引缓冲区 public: PrimitiveCreater(GPUDevice *,const VIL *); PrimitiveCreater(VertexDataManager *); virtual ~PrimitiveCreater(); virtual bool Init(const AnsiString &name,const VkDeviceSize vertices_count,const VkDeviceSize index_count,IndexType it=IndexType::AUTO); ///<初始化,参数为顶点数量 void Clear(); ///<清除创建器数据 public: //顶点缓冲区 const VkDeviceSize GetVertexCount()const{ return vertices_number; } ///<取得顶点数量 VABAccess * AcquireVAB (const AnsiString &name,const VkFormat &format,const void *data=nullptr); ///<请求一个顶点属性数据区 bool WriteVAB (const AnsiString &name,const VkFormat &format,const void *data) ///<直接写入顶点属性数据 { return AcquireVAB(name,format,data); } public: //索引缓冲区 const IndexType GetIndexType()const{return index_type;} void * MapIBO(); void UnmapIBO(); bool WriteIBO(const void *data,const VkDeviceSize count); template bool WriteIBO(const T *data){return WriteIBO(data,index_number);} public: //创建可渲染对象 virtual Primitive * Create(); ///<创建一个可渲染对象,并清除创建器数据 };//class PrimitiveCreater /** * VAB原生数据访问映射 */ template class VABRawMap { VABAccess *vaba; T *map_ptr; public: VABRawMap(PrimitiveCreater *pc,const VkFormat &format,const AnsiString &name) { vaba=pc->AcquireVAB(name,format); if(vaba) map_ptr=(T *)(vaba->vab->Map(vaba->start,vaba->count)); else map_ptr=nullptr; } ~VABRawMap() { if(vaba) vaba->vab->Unmap(); } const bool IsValid()const{ return vaba; } 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 { VABAccess *vaba; T *vb; public: VABMap(PrimitiveCreater *pc,const AnsiString &name) { vaba=pc->AcquireVAB(name,T::GetVulkanFormat(),nullptr); if(vaba) { void *map_ptr=vaba->vab->Map(vaba->start,vaba->count); vb=T::Create(pc->GetVertexCount(),map_ptr); vb->Begin(); } else { vb=nullptr; } } ~VABMap() { if(vaba) vaba->vab->Unmap(); } 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