#pragma once #include #include #include #include #include VK_NAMESPACE_BEGIN class VertexDataManager; struct PrimitiveData; /** * 可绘制图元创建器 */ class PrimitiveCreater { protected: GPUDevice *device; const GPUPhysicalDevice *phy_device; const VIL * vil; protected: PrimitiveData * prim_data; void_pointer vab_map_ptr[HGL_MAX_VERTEX_ATTRIB_COUNT]; VkDeviceSize vertices_number; IndexBuffer * ibo; void * ibo_map; protected: template friend class VABRawMap; template friend class VABMap; VABAccess *AcquirePVB(const AnsiString &,const VkFormat &,const void *data); ///<请求一个顶点属性数据区 void ClearAllData(); public: PrimitiveCreater(GPUDevice *,const VIL *); //PrimitiveCreater(VertexDataManager *); virtual ~PrimitiveCreater(); virtual bool Init(const VkDeviceSize vertices_count,const VkDeviceSize index_count,IndexType it=IndexType::AUTO); ///<初始化,参数为顶点数量 const VkDeviceSize GetVertexCount()const{ return vertices_number; } ///<取得顶点数量 bool WriteVAB(const AnsiString &name,const void *data,const uint32_t 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); return (T *)ibo_map; } template bool WriteIBO(const T *data) { if(!ibo)return(false); if(ibo->GetStride()!=sizeof(T))return(false); hgl_cpy((T *)ibo_map,data,index_number); return(true); } virtual Primitive * Finish(RenderResource *,const AnsiString &); ///<结束并创建可渲染对象 };//class PrimitiveCreater /** * VAB原生数据访问映射 */ template class VABRawMap { VABAccess *vaba; T *map_ptr; public: VABRawMap(PrimitiveCreater *pc,const AnsiString &name) { vaba=pc->AcquirePVB(name,T::GetVulkanFormat(),nullptr); map_ptr=(T *)(vaba->vab->Map(vaba->start,vaba->count)); } ~VABRawMap() { vaba->vab->Unmap(); } T *operator->(){ 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); void *map_ptr=vaba->vab->Map(vaba->start,vaba->count); vb=T::Create(pc->GetVertexCount(),map_ptr); vb->Begin(); } ~VABMap() { vaba->vab->Unmap(); } void Restart() { vb->Begin(); } 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