#pragma once #include #include #include #include #include VK_NAMESPACE_BEGIN /** * 可绘制图元创建器 */ class PrimitiveCreater { protected: GPUDevice *device; const GPUPhysicalDevice *phy_device; const VIL * vil; protected: AnsiString prim_name; ///<名称 PrimitiveData * prim_data; ///<图元数据 VkDeviceSize vertices_number; ///<顶点数量 uint vab_proc_count; ///<操作的vab数量 VkDeviceSize index_number; ///<索引数量 IndexBuffer * ibo; void * ibo_map; protected: void ClearAllData(); public: PrimitiveCreater(GPUDevice *,const VIL *,const AnsiString &name); PrimitiveCreater(VertexDataManager *); virtual ~PrimitiveCreater() { ClearAllData(); } virtual bool Init(const VkDeviceSize vertices_count,const VkDeviceSize index_count,IndexType it=IndexType::AUTO); ///<初始化,参数为顶点数量 const VkDeviceSize GetVertexCount()const{ return vertices_number; } ///<取得顶点数量 VABAccess * AcquirePVB (const AnsiString &name,const VkFormat &format,const void *data=nullptr,const VkDeviceSize bytes=0); ///<请求一个顶点属性数据区 bool WriteVAB (const AnsiString &name,const VkFormat &format,const void *data,const uint32_t bytes) ///<直接写入顶点属性数据 { return AcquirePVB(name,format,data,bytes); } const IndexType GetIndexType()const{return ibo?ibo->GetType():IndexType::ERR;} ///<取得索引数据类型 template T * AccessIBO() { if(!ibo)return(nullptr); if(ibo->GetStride()!=sizeof(T))return(nullptr); if(!ibo_map) ibo_map=ibo->Map(); return (T *)ibo_map; } template bool WriteIBO(const T *data) { if(!ibo)return(false); if(ibo->GetStride()!=sizeof(T))return(false); if(ibo_map) { hgl_cpy((T *)ibo_map,data,index_number); ibo->Unmap(); ibo_map=nullptr; } else ibo->Write(data); return(true); } virtual Primitive * Finish(RenderResource *); ///<结束并创建可渲染对象 };//class PrimitiveCreater /** * VAB原生数据访问映射 */ template class VABRawMap { VABAccess *vaba; T *map_ptr; public: VABRawMap(PrimitiveCreater *pc,const VkFormat &format,const AnsiString &name) { vaba=pc->AcquirePVB(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->AcquirePVB(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; VK_NAMESPACE_END