#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; ///<顶点数量 VKBufferMap * vab_map_list; uint32_t index_number; ///<索引数量 IndexType index_type; ///<索引类型 IndexBuffer * ibo; ///<索引缓冲区 VKBufferMap ibo_map; protected: const int GetVABIndex (const AnsiString &name,const VkFormat &format); ///<取得顶点属性索引 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; } ///<取得顶点数量 VKBufferMap * MapVAB (const AnsiString &name,const VkFormat &format); 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;} ///<取得索引数量 VKBufferMap * MapIBO(); 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 /** * 顶点属性缓冲区原生数据访问映射 */ template class VABRawMap { VKBufferMap *buf_map; T *map_ptr; public: VABRawMap(PrimitiveCreater *pc,const VkFormat &format,const AnsiString &name) { buf_map=pc->MapVAB(name,format); if(buf_map) map_ptr=(T *)(buf_map->Map()); else map_ptr=nullptr; } ~VABRawMap() { if(map_ptr) buf_map->Unmap(); } const bool IsValid()const{ return buf_map?buf_map->IsValid():false; } operator T *(){ return map_ptr; } T *operator->(){ return map_ptr; } };//template class VABRawMap typedef VABRawMap VABMapI8, VABMapByte; typedef VABRawMap VABMapI16, VABMapShort; typedef VABRawMap VABMapI32, VABMapInt; typedef VABRawMap VABMapU8, VABMapUByte; typedef VABRawMap VABMapU16, VABMapUShort; typedef VABRawMap VABMapU32, VABMapUInt; typedef VABRawMap VABMapFloat; typedef VABRawMap VABMapDouble; /** * 顶点属性缓冲区数据访问映射 */ template class VABMap { VKBufferMap *buf_map; T *map_ptr; public: VABMap(PrimitiveCreater *pc,const AnsiString &name) { buf_map=pc->MapVAB(name,T::GetVulkanFormat()); if(buf_map) { map_ptr=T::Create(buf_map->GetSize(),buf_map->Map()); map_ptr->Begin(); } else map_ptr=nullptr; } ~VABMap() { if(map_ptr) { buf_map->Unmap(); delete map_ptr; } } const bool IsValid()const{ return map_ptr; } void Restart() { if(map_ptr) map_ptr->Begin(); } T *operator->(){ return map_ptr; } };//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 { VKBufferMap *buf_map; T *map_ptr; public: IBMap(PrimitiveCreater *pc) { buf_map=pc->MapIBO(); if(buf_map) map_ptr=(T *)(buf_map->Map()); else map_ptr=nullptr; } ~IBMap() { if(map_ptr) buf_map->Unmap(); } const bool IsValid()const{ return map_ptr; } operator T *(){ return map_ptr; } T *operator->(){ return map_ptr; } };//template class IBMap using IBMapU8 =IBMap; using IBMapU16=IBMap; using IBMapU32=IBMap; VK_NAMESPACE_END