diff --git a/example/LightBasic/BlinnPhongDirectionLight.cpp b/example/LightBasic/BlinnPhongDirectionLight.cpp index 8138572c..effaecd0 100644 --- a/example/LightBasic/BlinnPhongDirectionLight.cpp +++ b/example/LightBasic/BlinnPhongDirectionLight.cpp @@ -169,11 +169,18 @@ private: Renderable *Add(Primitive *r,MaterialInstance *mi,Pipeline *p,const Matrix4f &mat=Identity4f) { + if(!r) + return(nullptr); + if(!mi) + return(nullptr); + if(!p) + return(nullptr); + Renderable *ri=db->CreateRenderable(r,mi,p); if(!ri) { - LOG_ERROR(OS_TEXT("Create Renderable failed.")); + LOG_ERROR(U8_TEXT("Create Renderable failed! Primitive: ")+r->GetName()); return(nullptr); } diff --git a/inc/hgl/graph/PrimitiveCreater.h b/inc/hgl/graph/PrimitiveCreater.h index 82debf64..5282b9d2 100644 --- a/inc/hgl/graph/PrimitiveCreater.h +++ b/inc/hgl/graph/PrimitiveCreater.h @@ -7,9 +7,6 @@ #include VK_NAMESPACE_BEGIN -class VertexDataManager; -struct PrimitiveData; - /** * 可绘制图元创建器 */ @@ -24,34 +21,38 @@ protected: protected: - PrimitiveData * prim_data; - - void_pointer vab_map_ptr[HGL_MAX_VERTEX_ATTRIB_COUNT]; + AnsiString prim_name; ///<名称 + PrimitiveData * prim_data; ///<图元数据 - VkDeviceSize vertices_number; - IndexBuffer * ibo; - void * ibo_map; + VkDeviceSize vertices_number; ///<顶点数量 + uint vab_proc_count; ///<操作的vab数量 + + VkDeviceSize index_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(GPUDevice *,const VIL *,const AnsiString &name); //PrimitiveCreater(VertexDataManager *); - virtual ~PrimitiveCreater(); + 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; } ///<取得顶点数量 - bool WriteVAB(const AnsiString &name,const void *data,const uint32_t bytes); ///<直接写入顶点属性数据 + 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;} ///<取得索引数据类型 @@ -61,6 +62,9 @@ public: if(!ibo)return(nullptr); if(ibo->GetStride()!=sizeof(T))return(nullptr); + if(!ibo_map) + ibo_map=ibo->Map(); + return (T *)ibo_map; } @@ -69,12 +73,19 @@ public: if(!ibo)return(false); if(ibo->GetStride()!=sizeof(T))return(false); - hgl_cpy((T *)ibo_map,data,index_number); + 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 *,const AnsiString &); ///<结束并创建可渲染对象 + virtual Primitive * Finish(RenderResource *); ///<结束并创建可渲染对象 };//class PrimitiveCreater /** @@ -87,19 +98,25 @@ template class VABRawMap public: - VABRawMap(PrimitiveCreater *pc,const AnsiString &name) + VABRawMap(PrimitiveCreater *pc,const VkFormat &format,const AnsiString &name) { - vaba=pc->AcquirePVB(name,T::GetVulkanFormat(),nullptr); + vaba=pc->AcquirePVB(name,format); - map_ptr=(T *)(vaba->vab->Map(vaba->start,vaba->count)); + if(vaba) + map_ptr=(T *)(vaba->vab->Map(vaba->start,vaba->count)); + else + map_ptr=nullptr; } ~VABRawMap() { - vaba->vab->Unmap(); + if(vaba) + vaba->vab->Unmap(); } - T *operator->(){ return map_ptr; } + const bool IsValid()const{ return vaba; } + + operator T *(){ return map_ptr; } };//template class VABRawMap typedef VABRawMap VABRawMapi8, VABRawMapByte; @@ -125,23 +142,34 @@ public: { vaba=pc->AcquirePVB(name,T::GetVulkanFormat(),nullptr); - void *map_ptr=vaba->vab->Map(vaba->start,vaba->count); + if(vaba) + { + void *map_ptr=vaba->vab->Map(vaba->start,vaba->count); - vb=T::Create(pc->GetVertexCount(),map_ptr); + vb=T::Create(pc->GetVertexCount(),map_ptr); - vb->Begin(); + vb->Begin(); + } + else + { + vb=nullptr; + } } ~VABMap() { - vaba->vab->Unmap(); + if(vaba) + vaba->vab->Unmap(); } void Restart() { - vb->Begin(); + if(vb) + vb->Begin(); } + const bool IsValid()const{ return vb; } + T *operator->(){ return vb; } };//template class VABMap diff --git a/inc/hgl/graph/VK.h b/inc/hgl/graph/VK.h index 871d6a40..66abb33c 100644 --- a/inc/hgl/graph/VK.h +++ b/inc/hgl/graph/VK.h @@ -122,6 +122,7 @@ struct PrimitiveData; class Primitive; class Renderable; +class VertexDataManager; class RenderResource; enum class SharingMode diff --git a/inc/hgl/graph/VKPrimitive.h b/inc/hgl/graph/VKPrimitive.h index e007fb1a..8b004ac6 100644 --- a/inc/hgl/graph/VKPrimitive.h +++ b/inc/hgl/graph/VKPrimitive.h @@ -3,10 +3,9 @@ #include #include #include -#include +#include VK_NAMESPACE_BEGIN - /** * 单一图元数据访问接口
* @@ -26,31 +25,35 @@ class Primitive protected: AnsiString prim_name; - PrimitiveData *prim_data; protected: AABB BoundingBox; -public: +protected: - Primitive(const AnsiString &n) + Primitive(const AnsiString &pn,PrimitiveData *pd) { - prim_name=n; + prim_name=pn; + prim_data=pd; } - virtual ~Primitive()=0; +public: + + virtual ~Primitive()=default; public: - virtual const VkDeviceSize GetVertexCount ()const=0; - virtual const int GetVACount ()const=0; - virtual const bool GetVABAccess (const AnsiString &,VABAccess *)=0; - virtual const IBAccess * GetIBAccess ()const=0; + const AnsiString & GetName ()const{ return prim_name; } + const VkDeviceSize GetVertexCount ()const; + const int GetVACount ()const; + VABAccess * GetVABAccess (const AnsiString &); + IBAccess * GetIBAccess (); - const AABB & GetBoundingBox ()const{return BoundingBox;} + const AABB & GetBoundingBox ()const{return BoundingBox;} };//class Primitive -Primitive *CreatePrimitive(const PrimitiveData *); +Primitive *CreatePrimitivePrivate(const AnsiString &,PrimitiveData *); +Primitive *CreatePrimitivePrivate(VertexDataManager *,const AnsiString &,PrimitiveData *); VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKPrimitiveData.h b/inc/hgl/graph/VKPrimitiveData.h deleted file mode 100644 index d46777a2..00000000 --- a/inc/hgl/graph/VKPrimitiveData.h +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -VK_NAMESPACE_BEGIN - -/* - 1.截止2024.4.27,根据vulkan.gpuinfo.org统计,只有9%的设备maxVertexInputAttributes为16,不存在低于16的设备。 - 9.0%的设备为28 - 31 - 70.7%的设备为32 - 9.6%的设备为64 - - 由于我们暂时没有发现需要使用16个以上属性的情况,所以这里暂定使用16。 - (如果时间过去久远,可再次查询此值是否可改成更高的值,以及是否需要) - - 2.为何va_name使用char[][]而不是String以及动态分配内存? - - 就是为了必避动态分配内存,以及可以直接memcpy处理,所以此处这样定义。 -*/ - -struct PrimitiveData -{ - const VIL * vil; - - VkDeviceSize vertex_count; - - VABAccess vab_access[HGL_MAX_VERTEX_ATTRIB_COUNT]; - IBAccess ib_access; -};//struct PrimitiveData - -bool InitPrimitiveData( PrimitiveData *pd,const VIL *_vil,const VkDeviceSize vc); -int GetVABIndex(const PrimitiveData *pd,const AnsiString &name); -VABAccess * GetVAB( PrimitiveData *pd,const int); -VABAccess * SetVAB( PrimitiveData *pd,const int,VAB *vab,VkDeviceSize start,VkDeviceSize count); -void SetIndexBuffer( PrimitiveData *pd,IndexBuffer *ib,const VkDeviceSize ic); - -VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index 0903dd5d..4f899bc3 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -147,7 +147,8 @@ public: //Material MaterialInstance * CreateMaterialInstance(const mtl::MaterialCreateInfo *,const VILConfig *vil_cfg=nullptr); - Primitive * CreatePrimitive(const AnsiString &,const uint32_t vertex_count=0); + Primitive * CreatePrimitive( const AnsiString &,PrimitiveData *); + Primitive * CreatePrimitive(VertexDataManager *,const AnsiString &,PrimitiveData *); Renderable * CreateRenderable(Primitive *r,MaterialInstance *mi,Pipeline *p); diff --git a/inc/hgl/graph/VertexDataManager.h b/inc/hgl/graph/VertexDataManager.h index db773529..fcf5a5b9 100644 --- a/inc/hgl/graph/VertexDataManager.h +++ b/inc/hgl/graph/VertexDataManager.h @@ -9,8 +9,6 @@ namespace hgl { namespace graph { - class VertexDataManager; - struct IBAccessNode:public IBAccess { private: diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index fda1bd5c..46a92263 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -13,8 +13,7 @@ SET(SG_VDM_SOURCE ${SG_INCLUDE_PATH}/VertexAttribDataAccess.h SOURCE_GROUP("VertexDataManager" FILES ${SG_VDM_SOURCE}) -SET(SG_PRIMITIVE_SOURCE ${SG_INCLUDE_PATH}/VKPrimitiveData.h - ${SG_INCLUDE_PATH}/VKPrimitive.h +SET(SG_PRIMITIVE_SOURCE ${SG_INCLUDE_PATH}/VKPrimitive.h Vulkan/VKPrimitive.cpp Vulkan/VKPrimitiveData.cpp ${SG_INCLUDE_PATH}/VKRenderablePrimitiveCreater.h diff --git a/src/SceneGraph/InlineGeometry.cpp b/src/SceneGraph/InlineGeometry.cpp index b6475a42..1487d418 100644 --- a/src/SceneGraph/InlineGeometry.cpp +++ b/src/SceneGraph/InlineGeometry.cpp @@ -16,19 +16,19 @@ namespace hgl { Primitive *CreateRectangle(RenderResource *db,const VIL *vil,const RectangleCreateInfo *rci) { - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"Rectangle"); if(!rc.Init(4,0)) return(nullptr); - AutoDelete vertex=rc.AccessVAB(VAN::Position); + VABMap2f vertex(&rc,VAN::Position); - if(!vertex) + if(!vertex.IsValid()) return(nullptr); vertex->WriteRectFan(rci->scope); - return rc.Finish(db,"Rectangle"); + return rc.Finish(db); } Primitive *CreateGBufferCompositionRectangle(RenderResource *db,const VIL *vil) @@ -42,14 +42,14 @@ namespace hgl Primitive *CreateRoundRectangle(RenderResource *db,const VIL *vil,const RoundRectangleCreateInfo *rci) { - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"RoundRectangle"); if(rci->radius==0||rci->round_per<=1) //这是要画矩形 { if(!rc.Init(4,0)) return(nullptr); - AutoDelete vertex=rc.AccessVAB(VAN::Position); + VABMap2f vertex(&rc,VAN::Position); vertex->WriteRectFan(rci->scope); } @@ -63,7 +63,7 @@ namespace hgl if(!rc.Init(rci->round_per*4,8)) return(nullptr); - AutoDelete vertex=rc.AccessVAB(VAN::Position); + VABMap2f vertex(&rc,VAN::Position); Vector2f *coord=new Vector2f[rci->round_per]; @@ -111,12 +111,12 @@ namespace hgl delete[] coord; } - return rc.Finish(db,"RoundRectangle"); + return rc.Finish(db); } Primitive *CreateCircle(RenderResource *db,const VIL *vil,const CircleCreateInfo *cci) { - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"Circle"); uint edge; @@ -131,15 +131,15 @@ namespace hgl if(!rc.Init(cci->field_count,0))return(nullptr); } - AutoDelete vertex=rc.AccessVAB(VAN::Position); - AutoDelete color=rc.AccessVAB(VAN::Color); + VABMap2f vertex(&rc,VAN::Position); + VABMap4f color(&rc,VAN::Color); - if(!vertex) + if(!vertex.IsValid()) return(nullptr); if(cci->has_color) { - if(!color) + if(!color.IsValid()) return(nullptr); vertex->Write(cci->center); @@ -159,17 +159,17 @@ namespace hgl color->Write(cci->border_color); } - return rc.Finish(db,"Circle"); + return rc.Finish(db); } Primitive *CreatePlaneGrid(RenderResource *db,const VIL *vil,const PlaneGridCreateInfo *pgci) { - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"PlaneGrid"); if(!rc.Init(((pgci->grid_size.Width()+1)+(pgci->grid_size.Height()+1))*2,0)) return(nullptr); - AutoDelete vertex=rc.AccessVAB(VAN::Position); + VABMap3f vertex(&rc,VAN::Position); const float right=float(pgci->grid_size.Width())/2.0f; const float left =-right; @@ -189,8 +189,9 @@ namespace hgl Vector3f(left+col,bottom,0)); } - AutoDelete lum=rc.AccessVAB(VAN::Luminance); - if(lum) + VABMap1f lum(&rc,VAN::Luminance); + + if(lum.IsValid()) { for(uint row=0;row<=pgci->grid_size.Height();row++) { @@ -209,7 +210,7 @@ namespace hgl } } - return rc.Finish(db,"PlaneGrid"); + return rc.Finish(db); } Primitive *CreatePlane(RenderResource *db,const VIL *vil) @@ -219,33 +220,36 @@ namespace hgl const Vector3f xy_normal(0.0f,0.0f,1.0f); const Vector3f xy_tangent(1.0f,0.0f,0.0f); - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"Plane"); if(!rc.Init(4,8)) return(nullptr); - rc.WriteVAB(VAN::Position,xy_vertices,sizeof(xy_vertices)); + if(!rc.WriteVAB(VAN::Position,VF_V3F,xy_vertices,sizeof(xy_vertices))) + return(nullptr); { - AutoDelete normal=rc.AccessVAB(VAN::Normal); + VABMap3f normal(&rc,VAN::Normal); - if(normal)normal->RepeatWrite(xy_normal,4); + if(normal.IsValid()) + normal->RepeatWrite(xy_normal,4); } { - AutoDelete tangent=rc.AccessVAB(VAN::Tangent); + VABMap3f tangent(&rc,VAN::Tangent); - if(tangent)tangent->RepeatWrite(xy_tangent,4); + if(tangent.IsValid()) + tangent->RepeatWrite(xy_tangent,4); } { - AutoDelete tex_coord=rc.AccessVAB(VAN::TexCoord); + VABMap2f tex_coord(&rc,VAN::TexCoord); - if(tex_coord) + if(tex_coord.IsValid()) tex_coord->Write(xy_tex_coord,4); } - return rc.Finish(db,"Plane"); + return rc.Finish(db); } Primitive *CreateCube(RenderResource *db,const VIL *vil,const CubeCreateInfo *cci) @@ -301,29 +305,33 @@ namespace hgl 16, 17, 18, 16, 18, 19, 20, 23, 22, 20, 22, 21}; - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"Cube"); if(!rc.Init(24,6*2*3,IndexType::U16)) return(nullptr); - rc.WriteVAB(VAN::Position,positions,sizeof(positions)); + if(!rc.WriteVAB(VAN::Position,VF_V3F,positions,sizeof(positions))) + return(nullptr); if(cci->normal) - rc.WriteVAB(VAN::Normal,normals,sizeof(normals)); + if(!rc.WriteVAB(VAN::Normal,VF_V3F,normals,sizeof(normals))) + return(nullptr); if(cci->tangent) - rc.WriteVAB(VAN::Tangent,tangents,sizeof(tangents)); + if(!rc.WriteVAB(VAN::Tangent,VF_V3F,tangents,sizeof(tangents))) + return(nullptr); if(cci->tex_coord) - rc.WriteVAB(VAN::TexCoord,tex_coords,sizeof(tex_coords)); + if(!rc.WriteVAB(VAN::TexCoord,VF_V2F,tex_coords,sizeof(tex_coords))) + return(nullptr); if(cci->color_type!=CubeCreateInfo::ColorType::NoColor) { RANGE_CHECK_RETURN_NULLPTR(cci->color_type); - AutoDelete color=rc.AccessVAB(VAN::Color); + VABMap4f color(&rc,VAN::Color); - if(color) + if(color.IsValid()) { if(cci->color_type==CubeCreateInfo::ColorType::SameColor) color->RepeatWrite(cci->color[0],24); @@ -343,7 +351,7 @@ namespace hgl //rc.CreateIBO16(6*2*3,indices); rc.WriteIBO(indices); - return rc.Finish(db,"Cube"); + return rc.Finish(db); } template void CreateSphereIndices(T *tp,uint numberParallels,const uint numberSlices) @@ -443,7 +451,7 @@ namespace hgl */ Primitive *CreateSphere(RenderResource *db,const VIL *vil,const uint numberSlices) { - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"Sphere"); uint numberParallels = (numberSlices+1) / 2; uint numberVertices = (numberParallels + 1) * (numberSlices + 1); @@ -460,15 +468,18 @@ namespace hgl if(!rc.Init(numberVertices,numberIndices)) return(nullptr); - AutoDelete vertex=rc.AccessVAB(VAN::Position); - AutoDelete normal=rc.AccessVAB(VAN::Normal); - AutoDelete tangent=rc.AccessVAB(VAN::Tangent); - AutoDelete tex_coord=rc.AccessVAB(VAN::TexCoord); + VABRawMapFloat vertex (&rc,VF_V3F,VAN::Position); + VABRawMapFloat normal (&rc,VF_V3F,VAN::Normal); + VABRawMapFloat tangent (&rc,VF_V3F,VAN::Tangent); + VABRawMapFloat tex_coord(&rc,VF_V2F,VAN::TexCoord); - float *vp=vertex->Get(); - float *np=normal?normal->Get():nullptr; - float *tp=tangent?tangent->Get():nullptr; - float *tcp=tex_coord?tex_coord->Get():nullptr; + float *vp=vertex; + float *np=normal; + float *tp=tangent; + float *tcp=tex_coord; + + if(!vp) + return(nullptr); for (uint i = 0; i < numberParallels + 1; i++) { @@ -519,12 +530,12 @@ namespace hgl return(nullptr); } - return rc.Finish(db,"Sphere"); + return rc.Finish(db); } Primitive *CreateDome(RenderResource *db,const VIL *vil,const uint numberSlices) { - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"Dome"); uint i, j; @@ -545,16 +556,19 @@ namespace hgl if(!rc.Init(numberVertices,numberIndices)) return(nullptr); + + VABRawMapFloat vertex (&rc,VF_V3F,VAN::Position); + VABRawMapFloat normal (&rc,VF_V3F,VAN::Normal); + VABRawMapFloat tangent (&rc,VF_V3F,VAN::Tangent); + VABRawMapFloat tex_coord(&rc,VF_V2F,VAN::TexCoord); - AutoDelete vertex=rc.AccessVAB(VAN::Position); - AutoDelete normal=rc.AccessVAB(VAN::Normal); - AutoDelete tangent=rc.AccessVAB(VAN::Tangent); - AutoDelete tex_coord=rc.AccessVAB(VAN::TexCoord); - - float *vp=vertex->Get(); - float *np=normal?normal->Get():nullptr; - float *tp=tangent?tangent->Get():nullptr; - float *tcp=tex_coord?tex_coord->Get():nullptr; + float *vp=vertex; + float *np=normal; + float *tp=tangent; + float *tcp=tex_coord; + + if(!vp) + return(nullptr); for (i = 0; i < numberParallels + 1; i++) { @@ -610,7 +624,7 @@ namespace hgl return(nullptr); } - return rc.Finish(db,"Dome"); + return rc.Finish(db); } namespace @@ -650,7 +664,7 @@ namespace hgl Primitive *CreateTorus(RenderResource *db,const VIL *vil,const TorusCreateInfo *tci) { - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"Torus"); // s, t = parametric values of the equations, in the range [0,1] float s = 0; @@ -686,18 +700,21 @@ namespace hgl tIncr = 1.0f / (float) tci->numberStacks; if(!rc.Init(numberVertices,numberIndices)) + return(nullptr); + + VABRawMapFloat vertex (&rc,VF_V3F,VAN::Position); + VABRawMapFloat normal (&rc,VF_V3F,VAN::Normal); + VABRawMapFloat tangent (&rc,VF_V3F,VAN::Tangent); + VABRawMapFloat tex_coord(&rc,VF_V2F,VAN::TexCoord); + + float *vp=vertex; + float *np=normal; + float *tp=tangent; + float *tcp=tex_coord; + + if(!vp) return(nullptr); - AutoDelete vertex=rc.AccessVAB(VAN::Position); - AutoDelete normal=rc.AccessVAB(VAN::Normal); - AutoDelete tangent=rc.AccessVAB(VAN::Tangent); - AutoDelete tex_coord=rc.AccessVAB(VAN::TexCoord); - - float *vp=vertex->Get(); - float *np=normal?normal->Get():nullptr; - float *tp=tangent?tangent->Get():nullptr; - float *tcp=tex_coord?tex_coord->Get():nullptr; - // generate vertices and its attributes for (sideCount = 0; sideCount <= tci->numberSlices; ++sideCount, s += sIncr) { @@ -755,7 +772,7 @@ namespace hgl if(index_type==IndexType::U8 )CreateTorusIndices(rc.AccessIBO(),tci->numberSlices,tci->numberStacks);else return(nullptr); } - return rc.Finish(db,"Torus"); + return rc.Finish(db); } namespace @@ -815,7 +832,7 @@ namespace hgl if(numberIndices<=0) return(nullptr); - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"Cylinder"); uint numberVertices = (cci->numberSlices + 2) * 2 + (cci->numberSlices + 1) * 2; @@ -826,16 +843,19 @@ namespace hgl if (cci->numberSlices < 3 || numberVertices > GLUS_MAX_VERTICES || numberIndices > GLUS_MAX_INDICES) return nullptr; + + VABRawMapFloat vertex (&rc,VF_V3F,VAN::Position); + VABRawMapFloat normal (&rc,VF_V3F,VAN::Normal); + VABRawMapFloat tangent (&rc,VF_V3F,VAN::Tangent); + VABRawMapFloat tex_coord(&rc,VF_V2F,VAN::TexCoord); - AutoDelete vertex=rc.AccessVAB(VAN::Position); - AutoDelete normal=rc.AccessVAB(VAN::Normal); - AutoDelete tangent=rc.AccessVAB(VAN::Tangent); - AutoDelete tex_coord=rc.AccessVAB(VAN::TexCoord); + float *vp=vertex; + float *np=normal; + float *tp=tangent; + float *tcp=tex_coord; - float *vp=vertex->Get(); - float *np=normal?normal->Get():nullptr; - float *tp=tangent?tangent->Get():nullptr; - float *tcp=tex_coord?tex_coord->Get():nullptr; + if(!vp) + return(nullptr); *vp = 0.0f; ++vp; *vp = 0.0f; ++vp; @@ -989,7 +1009,7 @@ namespace hgl return(nullptr); } - return rc.Finish(db,"Cylinder"); + return rc.Finish(db); } namespace @@ -1034,7 +1054,7 @@ namespace hgl Primitive *CreateCone(RenderResource *db,const VIL *vil,const ConeCreateInfo *cci) { - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"Cone"); uint i, j; @@ -1052,16 +1072,19 @@ namespace hgl if (cci->numberSlices < 3 || cci->numberStacks < 1 || numberVertices > GLUS_MAX_VERTICES || numberIndices > GLUS_MAX_INDICES) return nullptr; + + VABRawMapFloat vertex (&rc,VF_V3F,VAN::Position); + VABRawMapFloat normal (&rc,VF_V3F,VAN::Normal); + VABRawMapFloat tangent (&rc,VF_V3F,VAN::Tangent); + VABRawMapFloat tex_coord(&rc,VF_V2F,VAN::TexCoord); - AutoDelete vertex=rc.AccessVAB(VAN::Position); - AutoDelete normal=rc.AccessVAB(VAN::Normal); - AutoDelete tangent=rc.AccessVAB(VAN::Tangent); - AutoDelete tex_coord=rc.AccessVAB(VAN::TexCoord); + float *vp=vertex; + float *np=normal; + float *tp=tangent; + float *tcp=tex_coord; - float *vp=vertex->Get(); - float *np=normal?normal->Get():nullptr; - float *tp=tangent?tangent->Get():nullptr; - float *tcp=tex_coord?tex_coord->Get():nullptr; + if(!vp) + return(nullptr); *vp = 0.0f; ++vp; *vp = 0.0f; ++vp; @@ -1160,22 +1183,22 @@ namespace hgl return(nullptr); } - return rc.Finish(db,"Cone"); + return rc.Finish(db); } Primitive *CreateAxis(RenderResource *db,const VIL *vil,const AxisCreateInfo *aci) { if(!db||!vil||!aci)return(nullptr); - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"Axis"); if(!rc.Init(6,0)) return(nullptr); - AutoDelete vertex=rc.AccessVAB(VAN::Position); - AutoDelete color=rc.AccessVAB(VAN::Color); + VABMap3f vertex(&rc,VAN::Position); + VABMap4f color(&rc,VAN::Color); - if(!vertex||!color) + if(!vertex.IsValid()||!color.IsValid()) return(nullptr); const float s=aci->size; @@ -1187,7 +1210,7 @@ namespace hgl vertex->Write(0,0,0);color->Write(aci->color[2]); vertex->Write(0,0,s);color->Write(aci->color[2]); - return rc.Finish(db,"Axis"); + return rc.Finish(db); } Primitive *CreateBoundingBox(RenderResource *db,const VIL *vil,const BoundingBoxCreateInfo *cci) @@ -1212,24 +1235,21 @@ namespace hgl 0,4, 1,5, 2,6, 3,7 }; - PrimitiveCreater rc(db->GetDevice(),vil); + PrimitiveCreater rc(db->GetDevice(),vil,"BoundingBox"); if(!rc.Init(8,24,IndexType::U16)) return(nullptr); - AutoDelete vertex=rc.AccessVAB(VAN::Position); - - if(!vertex)return(nullptr); - - rc.WriteVAB(VAN::Position,points,sizeof(points)); + if(!rc.WriteVAB(VAN::Position,VF_V3F,points,sizeof(points))) + return(nullptr); if(cci->color_type!=BoundingBoxCreateInfo::ColorType::NoColor) { RANGE_CHECK_RETURN_NULLPTR(cci->color_type); - AutoDelete color=rc.AccessVAB(VAN::Color); + VABMap4f color(&rc,VAN::Color); - if(color) + if(color.IsValid()) { if(cci->color_type==BoundingBoxCreateInfo::ColorType::SameColor) color->RepeatWrite(cci->color[0],8); @@ -1241,7 +1261,7 @@ namespace hgl rc.WriteIBO(indices); - return rc.Finish(db,"BoundingBox"); + return rc.Finish(db); } }//namespace inline_geometry }//namespace graph diff --git a/src/SceneGraph/PrimitiveCreater.cpp b/src/SceneGraph/PrimitiveCreater.cpp index 44686495..1b06a184 100644 --- a/src/SceneGraph/PrimitiveCreater.cpp +++ b/src/SceneGraph/PrimitiveCreater.cpp @@ -5,16 +5,24 @@ #include VK_NAMESPACE_BEGIN -PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v) + +PrimitiveData *CreatePrimitiveData(const VIL *_vil,const VkDeviceSize vc); +void SetIndexBuffer( PrimitiveData *pd,IndexBuffer *ib,const VkDeviceSize ic); +VABAccess * GetVABAccess( PrimitiveData *pd,const int); +void Destory( PrimitiveData *pd); + +PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v,const AnsiString &name) { device =dev; phy_device =device->GetPhysicalDevice(); vil =v; - prim_data =hgl_zero_new(); + prim_name =name; + prim_data =nullptr; - vertices_number=0; - hgl_zero(vab_ptr); + vertices_number =0; + vab_proc_count =0; + index_number =0; ibo =nullptr; ibo_map =nullptr; @@ -34,24 +42,15 @@ PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v) // ibo_map =nullptr; //} -PrimitiveCreater::~PrimitiveCreater() -{ - if(prim_data) - { - if(ibo_map) - ibo->Unmap(); - - delete prim_data; - } -} - bool PrimitiveCreater::Init(const VkDeviceSize vertex_count,const VkDeviceSize index_count,IndexType it) { if(vertex_count<=0)return(false); - vertices_number=vertex_count; + prim_data=CreatePrimitiveData(vil,vertex_count); - InitPrimitiveData(prim_data,vil,vertex_count); + if(!prim_data)return(false); + + vertices_number=vertex_count; if(index_count>0) { @@ -72,15 +71,25 @@ bool PrimitiveCreater::Init(const VkDeviceSize vertex_count,const VkDeviceSize i if(!ibo)return(false); - SetIndexBuffer(prim_data,ibo,index_count); + index_number=index_count; - ibo_map=ibo->Map(); + SetIndexBuffer(prim_data,ibo,index_count); + + #ifdef _DEBUG + DebugUtils *du=device->GetDebugUtils(); + + if(du) + { + du->SetBuffer( ibo->GetBuffer(), prim_name+":IndexBuffer:Buffer"); + du->SetDeviceMemory(ibo->GetVkMemory(), prim_name+":IndexBuffer:Memory"); + } + #endif//_DEBUG } return(true); } -VABAccess *PrimitiveCreater::AcquirePVB(const AnsiString &name,const VkFormat &acquire_format,const void *data) +VABAccess *PrimitiveCreater::AcquirePVB(const AnsiString &name,const VkFormat &acquire_format,const void *data,const VkDeviceSize bytes) { if(!vil)return(nullptr); if(name.IsEmpty())return(nullptr); @@ -97,122 +106,82 @@ VABAccess *PrimitiveCreater::AcquirePVB(const AnsiString &name,const VkFormat &a if(vif->format!=acquire_format) return(nullptr); + + if(data) + if(vif->stride*vertices_number!=bytes) + return(nullptr); - VABAccess *vab=GetVAB(prim_data,index); + VABAccess *vab_access=GetVABAccess(prim_data,index); - if(vab) - return vab; + if(!vab_access) + return(nullptr); - vad->vab =device->CreateVAB(vif->format,vertices_number,data); + if(!vab_access->vab) + { + vab_access->vab=device->CreateVAB(vif->format,vertices_number,data); + vab_access->start=0; + vab_access->count=vertices_number; + + #ifdef _DEBUG + DebugUtils *du=device->GetDebugUtils(); - if(!data) - vad->map_ptr=vad->vab->Map(); - else - vad->map_ptr=nullptr; + if(du) + { + du->SetBuffer( vab_access->vab->GetBuffer(), prim_name+":VAB:Buffer:"+name); + du->SetDeviceMemory(vab_access->vab->GetVkMemory(), prim_name+":VAB:Memory:"+name); + } + #endif//_DEBUG - vab_map.Add(name,*vad); + ++vab_proc_count; + } - return true; -} + if(data) + vab_access->vab->Write(data,bytes); -bool PrimitiveCreater::WriteVAB(const AnsiString &name,const void *data,const uint32_t bytes) -{ - if(!vil)return(false); - if(name.IsEmpty())return(false); - if(!data)return(false); - if(!bytes)return(false); - - const VertexInputFormat *vif=vil->GetConfig(name); - - if(!vif) - return(false); - - if(vif->stride*vertices_number!=bytes) - return(false); - - VABAccess vad; - - return AcquirePVB(&vad,name,data); + return vab_access; } void PrimitiveCreater::ClearAllData() { - if(vab_map.GetCount()>0) - { - const auto *sp=vab_map.GetDataList(); - for(int i=0;ivalue.vab) - { - (*sp)->value.vab->Unmap(); - delete (*sp)->value.vab; - } - - ++sp; - } - } - - if(ibo) + if(ibo_map) { ibo->Unmap(); - delete ibo; - ibo=nullptr; + ibo_map=nullptr; + } + + ibo=nullptr; + + if(prim_data) + { + Destory(prim_data); + prim_data=nullptr; } } -Primitive *PrimitiveCreater::Finish(RenderResource *rr,const AnsiString &prim_name) +Primitive *PrimitiveCreater::Finish(RenderResource *rr) { const uint si_count=vil->GetCount(VertexInputGroup::Basic); - if(vab_map.GetCount()!=si_count) + if(vab_proc_count!=si_count) return(nullptr); - Primitive *primitive=rr->CreatePrimitive(prim_name,vertices_number); - - { - const auto *sp=vab_map.GetDataList(); - for(uint i=0;ivalue.vab) - { - if((*sp)->value.map_ptr) - (*sp)->value.vab->Unmap(); - - primitive->SetVAB((*sp)->key,(*sp)->value.vab); - } - else - { - ClearAllData(); - return(nullptr); - } - - ++sp; - } - } - - { - const auto *sp=vab_map.GetDataList(); - for(uint i=0;ivalue.vab) - rr->Add((*sp)->value.vab); - - ++sp; - } - - vab_map.Clear(); - } - - if(ibo) + if(ibo_map) { ibo->Unmap(); - primitive->SetIndex(ibo,0,index_number); - - rr->Add(ibo); - ibo=nullptr; //避免释构函数删除 + ibo_map=nullptr; } - rr->Add(primitive); + Primitive *primitive=rr->CreatePrimitive(prim_name,prim_data); + + if(!primitive) + { + ClearAllData(); + return(nullptr); + } + + ibo_map=nullptr; + ibo=nullptr; + prim_data=nullptr; return primitive; } diff --git a/src/SceneGraph/Vulkan/VKPrimitive.cpp b/src/SceneGraph/Vulkan/VKPrimitive.cpp index 52ba5695..570ecbc9 100644 --- a/src/SceneGraph/Vulkan/VKPrimitive.cpp +++ b/src/SceneGraph/Vulkan/VKPrimitive.cpp @@ -10,6 +10,66 @@ #endif//_DEBUG VK_NAMESPACE_BEGIN + +const VkDeviceSize GetVertexCount( PrimitiveData *pd); +const int GetVABCount( PrimitiveData *pd); + VABAccess * GetVABAccess( PrimitiveData *pd,const AnsiString &name); + IBAccess * GetIBAccess( PrimitiveData *pd); + void Destory( PrimitiveData *pd); + void Free( PrimitiveData *pd); + +class PrimitivePrivateBuffer:public Primitive +{ +public: + + using Primitive::Primitive; + + ~PrimitivePrivateBuffer() override + { + Destory(prim_data); + } + + friend Primitive *CreatePrimitivePrivate(const AnsiString &,PrimitiveData *); +};//class PrimitivePrivateBuffer + +class PrimitiveVDM:public Primitive +{ + VertexDataManager *vdm; + +public: + + PrimitiveVDM(VertexDataManager *_vdm,const AnsiString &pn,PrimitiveData *pd):Primitive(pn,pd) + { + vdm=_vdm; + } + + ~PrimitiveVDM() override + { + + + Free(prim_data); + } + + friend Primitive *CreatePrimitivePrivate(VertexDataManager *,const AnsiString &,PrimitiveData *); +};//class PrimitiveVDM; + +Primitive *CreatePrimitivePrivate(const AnsiString &name,PrimitiveData *pd) +{ + if(!pd)return(nullptr); + if(name.IsEmpty())return(nullptr); + + return(new PrimitivePrivateBuffer(name,pd)); +} + +Primitive *CreatePrimitivePrivate(VertexDataManager *vdm,const AnsiString &name,PrimitiveData *pd) +{ + if(!vdm)return(nullptr); + if(!pd)return(nullptr); + if(name.IsEmpty())return(nullptr); + + return(new PrimitiveVDM(vdm,name,pd)); +} + //bool Renderable::Set(const int stage_input_binding,VIL *vil,VkDeviceSize offset) //{ // if(stage_input_binding<0||stage_input_binding>=buf_count||!vil)return(false); @@ -28,56 +88,24 @@ VK_NAMESPACE_BEGIN // return(true); //} -bool Primitive::SetVAB(const AnsiString &name,VAB *vab,VkDeviceSize start) +const VkDeviceSize Primitive::GetVertexCount()const { - if(!vab)return(false); - if(vab_access_map.KeyExist(name))return(false); - - VABAccess vad; - - vad.vab=vab; - vad.start=start; - - vab_access_map.Add(name,vad); - -#ifdef _DEBUG - DebugUtils *du=device->GetDebugUtils(); - - if(du) - { - du->SetBuffer(vab->GetBuffer(),prim_name+":VAB:Buffer:"+name); - du->SetDeviceMemory(vab->GetVkMemory(),prim_name+":VAB:Memory:"+name); - } -#endif//_DEBUG - - return(true); + return VK_NAMESPACE::GetVertexCount(prim_data); } -const bool Primitive::GetVABAccess(const AnsiString &name,VABAccess *vad) +const int Primitive::GetVACount()const { - if(name.IsEmpty())return(false); - if(!vad)return(false); - - return vab_access_map.Get(name,*vad); + return GetVABCount(prim_data); } -bool Primitive::SetIndex(IndexBuffer *ib,VkDeviceSize start,const VkDeviceSize index_count) +VABAccess *Primitive::GetVABAccess(const AnsiString &name) { - if(!ib)return(false); - - ib_access.buffer=ib; - ib_access.start=start; - ib_access.count=index_count; - -#ifdef _DEBUG - DebugUtils *du=device->GetDebugUtils(); - - if(du) - { - du->SetBuffer(ib->GetBuffer(),prim_name+":IBO:Buffer"); - du->SetDeviceMemory(ib->GetVkMemory(),prim_name+":IBO:Memory"); - } -#endif//_DEBUG - return(true); + return VK_NAMESPACE::GetVABAccess(prim_data,name); } + +IBAccess *Primitive::GetIBAccess() +{ + return VK_NAMESPACE::GetIBAccess(prim_data); +} + VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKPrimitiveData.cpp b/src/SceneGraph/Vulkan/VKPrimitiveData.cpp index 556afedb..2c0f2a32 100644 --- a/src/SceneGraph/Vulkan/VKPrimitiveData.cpp +++ b/src/SceneGraph/Vulkan/VKPrimitiveData.cpp @@ -1,18 +1,65 @@ -#include +#include +#include +#include VK_NAMESPACE_BEGIN -bool InitPrimitiveData(PrimitiveData *pd,const VIL *_vil,const VkDeviceSize vc) +struct PrimitiveData { - if(!pd)return(false); - if(!_vil)return(false); - if(vc<=0)return(false); + const VIL * vil; - hgl_zero(*pd); + VkDeviceSize vertex_count; + +/* + 1.ֹ2024.4.27vulkan.gpuinfo.orgͳƣֻ9%豸maxVertexInputAttributesΪ16ڵ16豸 + 9.0%豸Ϊ28 - 31 + 70.7%豸Ϊ32 + 9.6%豸Ϊ64 - pd->vil=_vil; + ʱûзҪʹ16Եݶʹ16 + (ʱȥԶٴβѯֵǷɸijɸߵֵԼǷҪ) + + 2.Ϊva_nameʹchar[][]StringԼ̬ڴ棿 + + Ϊ˱ر̬ܶڴ棬ԼֱmemcpyԴ˴塣 +*/ + + VABAccess vab_access[HGL_MAX_VERTEX_ATTRIB_COUNT]; + IBAccess ib_access; +};//struct PrimitiveData + +PrimitiveData *CreatePrimitiveData(const VIL *_vil,const VkDeviceSize vc) +{ + if(!_vil)return(nullptr); + if(vc<=0)return(nullptr); + + PrimitiveData *pd=hgl_zero_new(); + + pd->vil =_vil; pd->vertex_count=vc; - return(true); + return(pd); +} + +void Free(PrimitiveData *pd) +{ + if(!pd)return; + + delete pd; +} + +const VkDeviceSize GetVertexCount(PrimitiveData *pd) +{ + if(!pd)return(0); + + return pd->vertex_count; +} + +const int GetVABCount(PrimitiveData *pd) +{ + if(!pd)return(-1); + if(!pd->vil)return(-2); + + return pd->vil->GetCount(); } int GetVABIndex(const PrimitiveData *pd,const AnsiString &name) @@ -24,7 +71,7 @@ int GetVABIndex(const PrimitiveData *pd,const AnsiString &name) return pd->vil->GetIndex(name); } -VABAccess *GetVAB(PrimitiveData *pd,const int index) +VABAccess *GetVABAccess(PrimitiveData *pd,const int index) { if(!pd)return(nullptr); if(!pd->vil)return(nullptr); @@ -33,29 +80,66 @@ VABAccess *GetVAB(PrimitiveData *pd,const int index) return pd->vab_access+index; } -VABAccess *SetVAB(PrimitiveData *pd,const int index,VAB *vab,VkDeviceSize start,VkDeviceSize count) +VABAccess *GetVABAccess(PrimitiveData *pd,const AnsiString &name) { if(!pd)return(nullptr); if(!pd->vil)return(nullptr); - if(index<0||index>=pd->vil->GetCount())return(nullptr); + if(name.IsEmpty())return(nullptr); - VABAccess *vaba=pd->vab_access+index; + const int index=pd->vil->GetIndex(name); - vaba->vab=vab; - vaba->start=start; - vaba->count=count; + if(index<0)return(nullptr); - //#ifdef _DEBUG - // DebugUtils *du=device->GetDebugUtils(); + return pd->vab_access+index; +} - // if(du) - // { - // du->SetBuffer(vab->GetBuffer(),prim_name+":VAB:Buffer:"+name); - // du->SetDeviceMemory(vab->GetVkMemory(),prim_name+":VAB:Memory:"+name); - // } - //#endif//_DEBUG +//VABAccess *SetVAB(PrimitiveData *pd,const int index,VAB *vab,VkDeviceSize start,VkDeviceSize count) +//{ +// if(!pd)return(nullptr); +// if(!pd->vil)return(nullptr); +// if(index<0||index>=pd->vil->GetCount())return(nullptr); +// +// VABAccess *vaba=pd->vab_access+index; +// +// vaba->vab=vab; +// vaba->start=start; +// vaba->count=count; +// +// //#ifdef _DEBUG +// // DebugUtils *du=device->GetDebugUtils(); +// +// // if(du) +// // { +// // du->SetBuffer(vab->GetBuffer(),prim_name+":VAB:Buffer:"+name); +// // du->SetDeviceMemory(vab->GetVkMemory(),prim_name+":VAB:Memory:"+name); +// // } +// //#endif//_DEBUG +// +// return vaba; +//} - return vaba; +void Destory(PrimitiveData *pd) +{ + if(!pd)return; + + VABAccess *vab=pd->vab_access; + + for(uint32_t i=0;ivil->GetCount();i++) + { + if(vab->vab) + { + delete vab->vab; + vab->vab=nullptr; + } + + ++vab; + } + + if(pd->ib_access.buffer) + { + delete pd->ib_access.buffer; + pd->ib_access.buffer=nullptr; + } } void SetIndexBuffer(PrimitiveData *pd,IndexBuffer *ib,const VkDeviceSize ic) @@ -67,4 +151,11 @@ void SetIndexBuffer(PrimitiveData *pd,IndexBuffer *ib,const VkDeviceSize ic) pd->ib_access.count=ic; } +IBAccess *GetIBAccess(PrimitiveData *pd) +{ + if(!pd)return(nullptr); + + return &(pd->ib_access); +} + VK_NAMESPACE_END \ No newline at end of file diff --git a/src/SceneGraph/Vulkan/VKRenderResource.cpp b/src/SceneGraph/Vulkan/VKRenderResource.cpp index f7b3a469..f448d976 100644 --- a/src/SceneGraph/Vulkan/VKRenderResource.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResource.cpp @@ -80,16 +80,34 @@ MaterialInstance *RenderResource::CreateMaterialInstance(const mtl::MaterialCrea return CreateMaterialInstance(mtl,vil_cfg); } -Primitive *RenderResource::CreatePrimitive(const AnsiString &name,const uint32_t vertex_count) +Primitive *CreatePrimitivePrivate(const AnsiString &,PrimitiveData *); + +Primitive *RenderResource::CreatePrimitive(const AnsiString &name,PrimitiveData *pd) { - if(!vertex_count)return(nullptr); + if(!pd)return(nullptr); - Primitive *ro=new Primitive(device,name,vertex_count); + Primitive *prim=CreatePrimitivePrivate(name,pd); - if(ro) - Add(ro); + if(prim) + Add(prim); - return ro; + return prim; +} + +Primitive *CreatePrimitivePrivate(VertexDataManager *,const AnsiString &,PrimitiveData *); + +Primitive *RenderResource::CreatePrimitive(VertexDataManager *vdm,const AnsiString &name,PrimitiveData *pd) +{ + if(!vdm)return(nullptr); + if(!pd)return(nullptr); + if(name.IsEmpty())return(nullptr); + + Primitive *prim=CreatePrimitivePrivate(vdm,name,pd); + + if(prim) + Add(prim); + + return prim; } Renderable *RenderResource::CreateRenderable(Primitive *r,MaterialInstance *mi,Pipeline *p) diff --git a/src/SceneGraph/Vulkan/VKRenderable.cpp b/src/SceneGraph/Vulkan/VKRenderable.cpp index 466ecfac..9587392a 100644 --- a/src/SceneGraph/Vulkan/VKRenderable.cpp +++ b/src/SceneGraph/Vulkan/VKRenderable.cpp @@ -58,48 +58,46 @@ Renderable *CreateRenderable(Primitive *prim,MaterialInstance *mi,Pipeline *p) return(nullptr); } - VAB *vab; - VertexInputData *vid=new VertexInputData(input_count,prim->GetVertexCount(),prim->GetIBAccess()); const VertexInputFormat *vif=vil->GetVIFList(VertexInputGroup::Basic); - VABAccess vad; + VABAccess *vab_access; for(uint i=0;iGetVABAccess(vif->name,&vad)) + vab_access=prim->GetVABAccess(vif->name); + + if(!vab_access||!vab_access->vab) { LOG_ERROR("[FATAL ERROR] not found VAB \""+AnsiString(vif->name)+"\" in Material: "+mtl_name); return(nullptr); } - vab=vad.vab; - - if(vab->GetFormat()!=vif->format) + if(vab_access->vab->GetFormat()!=vif->format) { LOG_ERROR( "[FATAL ERROR] VAB \""+UTF8String(vif->name)+ UTF8String("\" format can't match Renderable, Material(")+mtl_name+ UTF8String(") Format(")+GetVulkanFormatName(vif->format)+ - UTF8String("), VAB Format(")+GetVulkanFormatName(vab->GetFormat())+ + UTF8String("), VAB Format(")+GetVulkanFormatName(vab_access->vab->GetFormat())+ ")"); return(nullptr); } - if(vab->GetStride()!=vif->stride) + if(vab_access->vab->GetStride()!=vif->stride) { LOG_ERROR( "[FATAL ERROR] VAB \""+UTF8String(vif->name)+ UTF8String("\" stride can't match Renderable, Material(")+mtl_name+ UTF8String(") stride(")+UTF8String::numberOf(vif->stride)+ - UTF8String("), VAB stride(")+UTF8String::numberOf(vab->GetStride())+ + UTF8String("), VAB stride(")+UTF8String::numberOf(vab_access->vab->GetStride())+ ")"); return(nullptr); } - vid->buffer_offset[i]=vad.start; - vid->buffer_list[i]=vab->GetBuffer(); + vid->buffer_offset[i]=vab_access->start; + vid->buffer_list[i]=vab_access->vab->GetBuffer(); ++vif; }