From 7f8fbbd3a030feea1113fe4ef6cb56d78741e307 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 12 Jun 2024 00:23:09 +0800 Subject: [PATCH 1/8] improved VKBufferMap and added newly IBMap/VABMap --- inc/hgl/graph/PrimitiveCreater.h | 166 +----------------- inc/hgl/graph/VKBufferMap.h | 70 ++++++-- inc/hgl/graph/VKIndexBuffer.h | 124 +++++++++----- inc/hgl/graph/VKVertexAttribBuffer.h | 199 ++++++++++++++++++---- src/SceneGraph/CMakeLists.txt | 1 - src/SceneGraph/InlineGeometry.cpp | 76 ++++----- src/SceneGraph/PrimitiveCreater.cpp | 16 +- src/SceneGraph/Vulkan/VKBufferMap.cpp | 63 ------- src/SceneGraph/Vulkan/VKPrimitiveData.cpp | 12 +- src/SceneGraph/Vulkan/VKPrimitiveData.h | 2 +- 10 files changed, 364 insertions(+), 365 deletions(-) delete mode 100644 src/SceneGraph/Vulkan/VKBufferMap.cpp diff --git a/inc/hgl/graph/PrimitiveCreater.h b/inc/hgl/graph/PrimitiveCreater.h index 145a9587..55874085 100644 --- a/inc/hgl/graph/PrimitiveCreater.h +++ b/inc/hgl/graph/PrimitiveCreater.h @@ -3,6 +3,7 @@ #include #include #include +#include VK_NAMESPACE_BEGIN /** @@ -24,17 +25,17 @@ protected: uint32_t vertices_number; ///<顶点数量 - VKBufferMap * vab_map_list; + VABMap * vab_map_list; uint32_t index_number; ///<索引数量 IndexType index_type; ///<索引类型 IndexBuffer * ibo; ///<索引缓冲区 - VKBufferMap ibo_map; + IBMap ibo_map; protected: - const int GetVABIndex (const AnsiString &name,const VkFormat &format); ///<取得顶点属性索引 + const int GetVABIndex (const AnsiString &name); ///<取得顶点属性索引 public: @@ -59,7 +60,7 @@ public: //顶点缓冲区 const uint32_t GetVertexCount()const{ return vertices_number; } ///<取得顶点数量 - VKBufferMap * MapVAB (const AnsiString &name,const VkFormat &format); + VABMap * MapVAB (const AnsiString &name); bool WriteVAB (const AnsiString &name,const VkFormat &format,const void *data); ///<直接写入顶点属性数据 @@ -68,7 +69,7 @@ public: //索引缓冲区 const IndexType GetIndexType()const{return index_type;} ///<取得索引类型 const uint32_t GetIndexCount()const{return index_number;} ///<取得索引数量 - VKBufferMap * MapIBO(); + IBMap * MapIBO(); bool WriteIBO(const void *data,const uint32_t count); @@ -79,159 +80,4 @@ 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 diff --git a/inc/hgl/graph/VKBufferMap.h b/inc/hgl/graph/VKBufferMap.h index cf3a567b..63c90c79 100644 --- a/inc/hgl/graph/VKBufferMap.h +++ b/inc/hgl/graph/VKBufferMap.h @@ -4,29 +4,75 @@ #include VK_NAMESPACE_BEGIN -class VKBufferMap +template class VKBufferMap { protected: - DeviceBuffer *buffer; - VkDeviceSize offset; - VkDeviceSize size; + T *buffer; + int32_t offset; + uint32_t stride; + uint32_t count; void *map_ptr; public: - VKBufferMap(); - VKBufferMap(DeviceBuffer *buf,VkDeviceSize off,VkDeviceSize s); - ~VKBufferMap(); + VKBufferMap() + { + buffer=nullptr; + offset=0; + stride=count=0; + } - void Set(DeviceBuffer *buf_ptr,VkDeviceSize off,VkDeviceSize s); + virtual ~VKBufferMap() + { + Unmap(); + } + + void Set(T *buf,const int32_t off,const uint32_t s,const uint32_t c) + { + buffer=buf; + offset=off; + stride=s; + count=c; + + map_ptr=nullptr; + } + + const int32_t GetOffset ()const{ return offset;} + const uint32_t GetStride ()const{ return stride;} + const uint32_t GetCount ()const{ return count; } - const VkDeviceSize GetSize()const{ return size; } const bool IsValid()const{ return buffer; } - void Clear(); - void *Map(); - void Unmap(); + void Clear() + { + Unmap(); + + buffer=nullptr; + offset=0; + stride=count=0; + } + + void *Map() + { + if(map_ptr) + return(map_ptr); + + if(!buffer) + return(nullptr); + + map_ptr=buffer->Map(offset,count); + return map_ptr; + } + + void Unmap() + { + if(buffer&&map_ptr) + { + buffer->Unmap(); + map_ptr=nullptr; + } + } };//class VKBufferMap VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKIndexBuffer.h b/inc/hgl/graph/VKIndexBuffer.h index 0a143c1d..bb99dcb6 100644 --- a/inc/hgl/graph/VKIndexBuffer.h +++ b/inc/hgl/graph/VKIndexBuffer.h @@ -1,50 +1,98 @@ -#ifndef HGL_GRAPH_VULKAN_INDEX_BUFFER_INCLUDE -#define HGL_GRAPH_VULKAN_INDEX_BUFFER_INCLUDE +#pragma once #include +#include -namespace hgl +VK_NAMESPACE_BEGIN +class IndexBuffer:public DeviceBuffer { - namespace graph + IndexType index_type; + uint stride; + uint32_t count; + +private: + + friend class GPUDevice; + + IndexBuffer(VkDevice d,const DeviceBufferData &vb,IndexType it,uint32_t _count):DeviceBuffer(d,vb) { - class IndexBuffer:public DeviceBuffer - { - IndexType index_type; - uint stride; - uint32_t count; + index_type=it; + count=_count; - private: + if(index_type==IndexType::U16)stride=2;else + if(index_type==IndexType::U32)stride=4;else + if(index_type==IndexType::U8)stride=1;else + stride=0; + } - friend class GPUDevice; +public: - IndexBuffer(VkDevice d,const DeviceBufferData &vb,IndexType it,uint32_t _count):DeviceBuffer(d,vb) - { - index_type=it; - count=_count; + ~IndexBuffer()=default; - if(index_type==IndexType::U16)stride=2;else - if(index_type==IndexType::U32)stride=4;else - if(index_type==IndexType::U8)stride=1;else - stride=0; - } + const IndexType GetType ()const{return index_type;} + const uint GetStride ()const{return stride;} + const uint32 GetCount ()const{return count;} - public: +public: - ~IndexBuffer()=default; - - const IndexType GetType ()const{return index_type;} - const uint GetStride ()const{return stride;} - const uint32 GetCount ()const{return count;} - - public: - - void * Map (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Map(start*stride,size*stride);} - void Flush (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Flush(start*stride,size*stride); } - void Flush (VkDeviceSize size) override {return DeviceBuffer::Flush(size*stride);} + void * Map (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Map(start*stride,size*stride);} + void Flush (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Flush(start*stride,size*stride); } + void Flush (VkDeviceSize size) override {return DeviceBuffer::Flush(size*stride);} - bool Write (const void *ptr,uint32_t start,uint32_t size) override {return DeviceBuffer::Write(ptr,start*stride,size*stride);} - bool Write (const void *ptr,uint32_t size) override {return DeviceBuffer::Write(ptr,0,size*stride);} - };//class IndexBuffer:public DeviceBuffer - }//namespace graph -}//namespace hgl -#endif//HGL_GRAPH_VULKAN_INDEX_BUFFER_INCLUDE + bool Write (const void *ptr,uint32_t start,uint32_t size) override {return DeviceBuffer::Write(ptr,start*stride,size*stride);} + bool Write (const void *ptr,uint32_t size) override {return DeviceBuffer::Write(ptr,0,size*stride);} +};//class IndexBuffer:public DeviceBuffer + +class IBMap:public VKBufferMap +{ +public: + + using VKBufferMap::VKBufferMap; + virtual ~IBMap()=default; + + const IndexType GetType()const{return buffer->GetType();} + + void Set(IndexBuffer *ib,const int32_t index_offset,const uint32_t count) + { + VKBufferMap::Set(ib,index_offset,ib->GetStride(),count); + } +};//class IBMap + +/** +* 索引缓冲区数据访问映射 +*/ +template class IBTypeMap +{ + IBMap *ib_map; + + T *map_ptr; + +public: + + IBTypeMap(IBMap *ibm) + { + ib_map=ibm; + + if(ib_map&&ib_map->GetStride()==sizeof(T)) + map_ptr=(T *)(ib_map->Map()); + else + map_ptr=nullptr; + } + + ~IBTypeMap() + { + if(map_ptr) + ib_map->Unmap(); + } + + const bool IsValid()const{ return map_ptr; } + + operator T *(){ return map_ptr; } + T *operator->(){ return map_ptr; } +};//template class IBTypeMap + +using IBMapU8 =IBTypeMap; +using IBMapU16=IBTypeMap; +using IBMapU32=IBTypeMap; + +VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKVertexAttribBuffer.h b/inc/hgl/graph/VKVertexAttribBuffer.h index 9ab4c4bd..f7071d21 100644 --- a/inc/hgl/graph/VKVertexAttribBuffer.h +++ b/inc/hgl/graph/VKVertexAttribBuffer.h @@ -1,50 +1,179 @@ -#ifndef HGL_GRAPH_VULKAN_VERTEX_ATTRIB_BUFFER_INCLUDE -#define HGL_GRAPH_VULKAN_VERTEX_ATTRIB_BUFFER_INCLUDE +#pragma once #include +#include -namespace hgl +VK_NAMESPACE_BEGIN +class VertexAttribBuffer:public DeviceBuffer { - namespace graph + VkFormat format; ///<数据格式 + uint32_t stride; ///<单个数据字节数 + uint32_t count; ///<数据数量 + +private: + + friend class GPUDevice; + + VertexAttribBuffer(VkDevice d,const DeviceBufferData &vb,VkFormat fmt,uint32_t _stride,uint32_t _count):DeviceBuffer(d,vb) { - class VertexAttribBuffer:public DeviceBuffer + format=fmt; + stride=_stride; + count=_count; + } + +public: + + ~VertexAttribBuffer()=default; + + const VkFormat GetFormat()const { return format; } + const uint32_t GetStride()const { return stride; } + const uint32_t GetCount ()const { return count; } + + const VkDeviceSize GetTotalBytes()const { return stride*count; } + +public: + + void * Map (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Map(start*stride,size*stride);} + void Flush (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Flush(start*stride,size*stride);} + void Flush (VkDeviceSize size) override {return DeviceBuffer::Flush(size*stride);} + + bool Write (const void *ptr,uint32_t start,uint32_t size) override {return DeviceBuffer::Write(ptr,start*stride,size*stride);} + bool Write (const void *ptr,uint32_t size) override {return DeviceBuffer::Write(ptr,0,size*stride);} +};//class VertexAttribBuffer:public DeviceBuffer + +using VAB=VertexAttribBuffer; + +class VABMap:public VKBufferMap +{ +public: + + using VKBufferMap::VKBufferMap; + virtual ~VABMap()=default; + + const VkFormat GetFormat()const { return buffer->GetFormat(); } + + void Set(VAB *vab,const VkDeviceSize off,const uint32_t count) + { + VKBufferMap::Set(vab,off,vab->GetStride(),count); + } +};//class VABMap + +/** +* 顶点属性缓冲区原生数据访问映射 +*/ +template class VABRawMap +{ + VABMap *vab_map; + T *map_ptr; + +public: + + VABRawMap(VABMap *map,const VkFormat check_format=VK_FORMAT_UNDEFINED) + { + vab_map=map; + map_ptr=nullptr; + + if(vab_map) + if(check_format==VK_FORMAT_UNDEFINED + ||check_format==vab_map->GetFormat()) + map_ptr=(T *)(vab_map->Map()); + } + + ~VABRawMap() + { + if(map_ptr) + vab_map->Unmap(); + } + + const bool IsValid()const{ return vab_map?vab_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 VABFormatMap +{ + VABMap *vab_map; + + T *map_ptr; + +public: + + VABFormatMap(VABMap *map) + { + vab_map=map; + + if(vab_map&&vab_map->GetFormat()==T::GetVulkanFormat()) { - VkFormat format; ///<数据格式 - uint32_t stride; ///<单个数据字节数 - uint32_t count; ///<数据数量 + map_ptr=T::Create(vab_map->GetCount(),vab_map->Map()); + map_ptr->Begin(); + } + else + map_ptr=nullptr; + } - private: + ~VABFormatMap() + { + if(map_ptr) + { + vab_map->Unmap(); + delete map_ptr; + } + } - friend class GPUDevice; + const bool IsValid()const{ return map_ptr; } - VertexAttribBuffer(VkDevice d,const DeviceBufferData &vb,VkFormat fmt,uint32_t _stride,uint32_t _count):DeviceBuffer(d,vb) - { - format=fmt; - stride=_stride; - count=_count; - } + void Restart() + { + if(map_ptr) + vab_map->Begin(); + } - public: + T *operator->(){ return map_ptr; } +};//template class VABFormatMap - ~VertexAttribBuffer()=default; +typedef VABFormatMap VABMap1i8 ,VABMap1b; +typedef VABFormatMap VABMap1i16,VABMap1s; +typedef VABFormatMap VABMap1i32,VABMap1i; +typedef VABFormatMap VABMap1u8 ,VABMap1ub; +typedef VABFormatMap VABMap1u16,VABMap1us; +typedef VABFormatMap VABMap1u32,VABMap1ui; +typedef VABFormatMap VABMap1f; +typedef VABFormatMap VABMap1d; - const VkFormat GetFormat()const { return format; } - const uint32_t GetStride()const { return stride; } - const uint32_t GetCount ()const { return count; } +typedef VABFormatMap VABMap2i8 ,VABMap2b; +typedef VABFormatMap VABMap2i16,VABMap2s; +typedef VABFormatMap VABMap2i32,VABMap2i; +typedef VABFormatMap VABMap2u8 ,VABMap2ub; +typedef VABFormatMap VABMap2u16,VABMap2us; +typedef VABFormatMap VABMap2u32,VABMap2ui; +typedef VABFormatMap VABMap2f; +typedef VABFormatMap VABMap2d; - const VkDeviceSize GetTotalBytes()const { return stride*count; } - - public: +typedef VABFormatMap VABMap3i32,VABMap3i; +typedef VABFormatMap VABMap3u32,VABMap3ui; +typedef VABFormatMap VABMap3f; +typedef VABFormatMap VABMap3d; - void * Map (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Map(start*stride,size*stride);} - void Flush (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Flush(start*stride,size*stride);} - void Flush (VkDeviceSize size) override {return DeviceBuffer::Flush(size*stride);} - - bool Write (const void *ptr,uint32_t start,uint32_t size) override {return DeviceBuffer::Write(ptr,start*stride,size*stride);} - bool Write (const void *ptr,uint32_t size) override {return DeviceBuffer::Write(ptr,0,size*stride);} - };//class VertexAttribBuffer:public DeviceBuffer +typedef VABFormatMap VABMap4i8 ,VABMap4b; +typedef VABFormatMap VABMap4i16,VABMap4s; +typedef VABFormatMap VABMap4i32,VABMap4i; +typedef VABFormatMap VABMap4u8, VABMap4ub; +typedef VABFormatMap VABMap4u16,VABMap4us; +typedef VABFormatMap VABMap4u32,VABMap4ui; +typedef VABFormatMap VABMap4f; +typedef VABFormatMap VABMap4d; - using VAB=VertexAttribBuffer; - }//namespace graph -}//namespace hgl -#endif//HGL_GRAPH_VULKAN_VERTEX_ATTRIB_BUFFER_INCLUDE +VK_NAMESPACE_END diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 74e04b00..5f2319e1 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -125,7 +125,6 @@ SET(VK_MEMORY_SOURCE ${SG_INCLUDE_PATH}/VKMemory.h Vulkan/VKMemory.cpp Vulkan/VKMemoryAllocator.cpp Vulkan/VKBuffer.cpp - Vulkan/VKBufferMap.cpp Vulkan/VKArrayBuffer.cpp ) diff --git a/src/SceneGraph/InlineGeometry.cpp b/src/SceneGraph/InlineGeometry.cpp index dce02482..8e11b191 100644 --- a/src/SceneGraph/InlineGeometry.cpp +++ b/src/SceneGraph/InlineGeometry.cpp @@ -20,7 +20,7 @@ namespace hgl if(!pc->Init("Rectangle",4,0)) return(nullptr); - VABMap2f vertex(pc,VAN::Position); + VABMap2f vertex(pc->MapVAB(VAN::Position)); if(!vertex.IsValid()) return(nullptr); @@ -48,7 +48,7 @@ namespace hgl if(!pc->Init("RoundRectangle",4,0)) return(nullptr); - VABMap2f vertex(pc,VAN::Position); + VABMap2f vertex(pc->MapVAB(VAN::Position)); vertex->WriteRectFan(rci->scope); } @@ -62,7 +62,7 @@ namespace hgl if(!pc->Init("RoundRectangle",rci->round_per*4,8)) return(nullptr); - VABMap2f vertex(pc,VAN::Position); + VABMap2f vertex(pc->MapVAB(VAN::Position)); Vector2f *coord=new Vector2f[rci->round_per]; @@ -133,8 +133,8 @@ namespace hgl if(!pc->Init("Circle",vertex_count,0))return(nullptr); - VABMap2f vertex(pc,VAN::Position); - VABMap4f color(pc,VAN::Color); + VABMap2f vertex(pc->MapVAB(VAN::Position)); + VABMap4f color(pc->MapVAB(VAN::Color)); if(!vertex.IsValid()) return(nullptr); @@ -169,7 +169,7 @@ namespace hgl if(!pc->Init("PlaneGrid",((pgci->grid_size.Width()+1)+(pgci->grid_size.Height()+1))*2,0)) return(nullptr); - VABMap2f vertex(pc,VAN::Position); + VABMap2f vertex(pc->MapVAB(VAN::Position)); if(!vertex.IsValid()) return(nullptr); @@ -192,7 +192,7 @@ namespace hgl Vector2f(left+col,bottom)); } - VABMap1f lum(pc,VAN::Luminance); + VABMap1f lum(pc->MapVAB(VAN::Luminance)); if(lum.IsValid()) { @@ -232,21 +232,21 @@ namespace hgl return(nullptr); { - VABMap3f normal(pc,VAN::Normal); + VABMap3f normal(pc->MapVAB(VAN::Normal)); if(normal.IsValid()) normal->RepeatWrite(xy_normal,4); } { - VABMap3f tangent(pc,VAN::Tangent); + VABMap3f tangent(pc->MapVAB(VAN::Tangent)); if(tangent.IsValid()) tangent->RepeatWrite(xy_tangent,4); } { - VABMap2f tex_coord(pc,VAN::TexCoord); + VABMap2f tex_coord(pc->MapVAB(VAN::TexCoord)); if(tex_coord.IsValid()) tex_coord->Write(xy_tex_coord,4); @@ -332,7 +332,7 @@ namespace hgl { RANGE_CHECK_RETURN_NULLPTR(cci->color_type); - VABMap4f color(pc,VAN::Color); + VABMap4f color(pc->MapVAB(VAN::Color)); if(color.IsValid()) { @@ -360,7 +360,7 @@ namespace hgl template void CreateSphereIndices(PrimitiveCreater *pc,uint numberParallels,const uint numberSlices) { - IBMap ib_map(pc); + IBTypeMap ib_map(pc->MapIBO()); T *tp=ib_map; for (uint i = 0; i < numberParallels; i++) @@ -473,10 +473,10 @@ namespace hgl if(!pc->Init("Sphere",numberVertices,numberIndices)) return(nullptr); - VABMapFloat vertex (pc,VF_V3F,VAN::Position); - VABMapFloat normal (pc,VF_V3F,VAN::Normal); - VABMapFloat tangent (pc,VF_V3F,VAN::Tangent); - VABMapFloat tex_coord(pc,VF_V2F,VAN::TexCoord); + VABMapFloat vertex (pc->MapVAB(VAN::Position),VF_V3F); + VABMapFloat normal (pc->MapVAB(VAN::Normal),VF_V3F); + VABMapFloat tangent (pc->MapVAB(VAN::Tangent),VF_V3F); + VABMapFloat tex_coord(pc->MapVAB(VAN::TexCoord),VF_V2F); float *vp=vertex; float *np=normal; @@ -562,10 +562,10 @@ namespace hgl if(!pc->Init("Dome",numberVertices,numberIndices)) return(nullptr); - VABMapFloat vertex (pc,VF_V3F,VAN::Position); - VABMapFloat normal (pc,VF_V3F,VAN::Normal); - VABMapFloat tangent (pc,VF_V3F,VAN::Tangent); - VABMapFloat tex_coord(pc,VF_V2F,VAN::TexCoord); + VABMapFloat vertex (pc->MapVAB(VAN::Position),VF_V3F); + VABMapFloat normal (pc->MapVAB(VAN::Normal),VF_V3F); + VABMapFloat tangent (pc->MapVAB(VAN::Tangent),VF_V3F); + VABMapFloat tex_coord(pc->MapVAB(VAN::TexCoord),VF_V2F); float *vp=vertex; float *np=normal; @@ -637,7 +637,7 @@ namespace hgl template void CreateTorusIndices(PrimitiveCreater *pc,uint numberSlices,uint numberStacks) { - IBMap ib_map(pc); + IBTypeMap ib_map(pc->MapIBO()); T *tp=ib_map; // loop counters @@ -710,10 +710,10 @@ namespace hgl if(!pc->Init("Torus",numberVertices,numberIndices)) return(nullptr); - VABMapFloat vertex (pc,VF_V3F,VAN::Position); - VABMapFloat normal (pc,VF_V3F,VAN::Normal); - VABMapFloat tangent (pc,VF_V3F,VAN::Tangent); - VABMapFloat tex_coord(pc,VF_V2F,VAN::TexCoord); + VABMapFloat vertex (pc->MapVAB(VAN::Position),VF_V3F); + VABMapFloat normal (pc->MapVAB(VAN::Normal),VF_V3F); + VABMapFloat tangent (pc->MapVAB(VAN::Tangent),VF_V3F); + VABMapFloat tex_coord(pc->MapVAB(VAN::TexCoord),VF_V2F); float *vp=vertex; float *np=normal; @@ -788,7 +788,7 @@ namespace hgl template void CreateCylinderIndices(PrimitiveCreater *pc,const uint numberSlices) { - IBMap ib_map(pc); + IBTypeMap ib_map(pc->MapIBO()); T *tp=ib_map; uint i; @@ -852,10 +852,10 @@ namespace hgl if (cci->numberSlices < 3 || numberVertices > GLUS_MAX_VERTICES || numberIndices > GLUS_MAX_INDICES) return nullptr; - VABMapFloat vertex (pc,VF_V3F,VAN::Position); - VABMapFloat normal (pc,VF_V3F,VAN::Normal); - VABMapFloat tangent (pc,VF_V3F,VAN::Tangent); - VABMapFloat tex_coord(pc,VF_V2F,VAN::TexCoord); + VABMapFloat vertex (pc->MapVAB(VAN::Position),VF_V3F); + VABMapFloat normal (pc->MapVAB(VAN::Normal),VF_V3F); + VABMapFloat tangent (pc->MapVAB(VAN::Tangent),VF_V3F); + VABMapFloat tex_coord(pc->MapVAB(VAN::TexCoord),VF_V2F); float *vp=vertex; float *np=normal; @@ -1025,7 +1025,7 @@ namespace hgl template void CreateConeIndices(PrimitiveCreater *pc,const uint numberSlices,const uint numberStacks) { - IBMap ib_map(pc); + IBTypeMap ib_map(pc->MapIBO()); T *tp=ib_map; // Bottom @@ -1082,10 +1082,10 @@ namespace hgl if (cci->numberSlices < 3 || cci->numberStacks < 1 || numberVertices > GLUS_MAX_VERTICES || numberIndices > GLUS_MAX_INDICES) return nullptr; - VABMapFloat vertex (pc,VF_V3F,VAN::Position); - VABMapFloat normal (pc,VF_V3F,VAN::Normal); - VABMapFloat tangent (pc,VF_V3F,VAN::Tangent); - VABMapFloat tex_coord(pc,VF_V2F,VAN::TexCoord); + VABMapFloat vertex (pc->MapVAB(VAN::Position),VF_V3F); + VABMapFloat normal (pc->MapVAB(VAN::Normal),VF_V3F); + VABMapFloat tangent (pc->MapVAB(VAN::Tangent),VF_V3F); + VABMapFloat tex_coord(pc->MapVAB(VAN::TexCoord),VF_V2F); float *vp=vertex; float *np=normal; @@ -1204,8 +1204,8 @@ namespace hgl if(!pc->Init("Axis",6,0)) return(nullptr); - VABMap3f vertex(pc,VAN::Position); - VABMap4f color(pc,VAN::Color); + VABMap3f vertex(pc->MapVAB(VAN::Position)); + VABMap4f color(pc->MapVAB(VAN::Color)); if(!vertex.IsValid()||!color.IsValid()) return(nullptr); @@ -1256,7 +1256,7 @@ namespace hgl { RANGE_CHECK_RETURN_NULLPTR(cci->color_type); - VABMap4f color(pc,VAN::Color); + VABMap4f color(pc->MapVAB(VAN::Color)); if(color.IsValid()) { diff --git a/src/SceneGraph/PrimitiveCreater.cpp b/src/SceneGraph/PrimitiveCreater.cpp index 08ff14bf..a86917a7 100644 --- a/src/SceneGraph/PrimitiveCreater.cpp +++ b/src/SceneGraph/PrimitiveCreater.cpp @@ -15,7 +15,7 @@ PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v) prim_data =nullptr; - vab_map_list =new VKBufferMap[v->GetVertexAttribCount()]; + vab_map_list =new VABMap[v->GetVertexAttribCount()]; Clear(); } @@ -116,7 +116,7 @@ bool PrimitiveCreater::Init(const AnsiString &pname,const uint32_t vertex_count, return(true); } -const int PrimitiveCreater::GetVABIndex(const AnsiString &name,const VkFormat &acquire_format) +const int PrimitiveCreater::GetVABIndex(const AnsiString &name) { if(!prim_data)return(-1); @@ -129,7 +129,7 @@ const int PrimitiveCreater::GetVABIndex(const AnsiString &name,const VkFormat &a if(!vab) { - vab=prim_data->InitVAB(vab_index,acquire_format,nullptr); + vab=prim_data->InitVAB(vab_index,nullptr); if(vab) vab_map_list[vab_index].Set(vab, @@ -156,9 +156,9 @@ const int PrimitiveCreater::GetVABIndex(const AnsiString &name,const VkFormat &a return(vab_index); } -VKBufferMap *PrimitiveCreater::MapVAB(const AnsiString &name,const VkFormat &format) +VABMap *PrimitiveCreater::MapVAB(const AnsiString &name) { - const int vab_index=GetVABIndex(name,format); + const int vab_index=GetVABIndex(name); if(vab_index<0)return nullptr; @@ -169,7 +169,7 @@ bool PrimitiveCreater::WriteVAB(const AnsiString &name,const VkFormat &format, c { if(!prim_data)return(false); - const int vab_index=GetVABIndex(name,format); + const int vab_index=GetVABIndex(name); VAB *vab=prim_data->GetVAB(vab_index); @@ -179,7 +179,7 @@ bool PrimitiveCreater::WriteVAB(const AnsiString &name,const VkFormat &format, c return vab->Write(data,prim_data->GetVertexOffset(),vertices_number); } -VKBufferMap *PrimitiveCreater::MapIBO() +IBMap *PrimitiveCreater::MapIBO() { if(!ibo) return(nullptr); @@ -205,7 +205,7 @@ Primitive *PrimitiveCreater::Create() if(!prim_data) return(nullptr); - for(int i=0;iGetVertexAttribCount();i++) + for(uint32_t i=0;iGetVertexAttribCount();i++) vab_map_list[i].Clear(); ibo_map.Clear(); diff --git a/src/SceneGraph/Vulkan/VKBufferMap.cpp b/src/SceneGraph/Vulkan/VKBufferMap.cpp deleted file mode 100644 index a1b8e439..00000000 --- a/src/SceneGraph/Vulkan/VKBufferMap.cpp +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include - -VK_NAMESPACE_BEGIN - -void VKBufferMap::Set(DeviceBuffer *buf,VkDeviceSize off,VkDeviceSize s) -{ - buffer=buf; - offset=off; - size=s; - - map_ptr=nullptr; -} - -void VKBufferMap::Clear() -{ - if(buffer&&map_ptr) - buffer->Unmap(); - - buffer=nullptr; - offset=0; - size=0; - map_ptr=nullptr; -} - -VKBufferMap::VKBufferMap() -{ - Set(nullptr,0,0); -} - -VKBufferMap::VKBufferMap(DeviceBuffer *buf,VkDeviceSize off,VkDeviceSize s) -{ - Set(buf,off,s); -} - -VKBufferMap::~VKBufferMap() -{ - if(buffer&&map_ptr) - buffer->Unmap(); -} - -void *VKBufferMap::Map() -{ - if(map_ptr) - return(map_ptr); - - if(!buffer) - return(nullptr); - - map_ptr=buffer->Map(offset,size); - return map_ptr; -} - -void VKBufferMap::Unmap() -{ - if(buffer&&map_ptr) - { - buffer->Unmap(); - map_ptr=nullptr; - } -} - -VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKPrimitiveData.cpp b/src/SceneGraph/Vulkan/VKPrimitiveData.cpp index c0e401b6..321bd2a5 100644 --- a/src/SceneGraph/Vulkan/VKPrimitiveData.cpp +++ b/src/SceneGraph/Vulkan/VKPrimitiveData.cpp @@ -97,7 +97,7 @@ namespace return(ibo); } - VAB *InitVAB(const int vab_index,const VkFormat &format,const void *data) + VAB *InitVAB(const int vab_index,const void *data) { if(!device)return(nullptr); if(!vil)return(nullptr); @@ -109,12 +109,9 @@ namespace if(!vif)return(nullptr); - if(vif->format!=format) - return(nullptr); - if(!vab_list[vab_index]) { - vab_list[vab_index]=device->CreateVAB(format,vertex_count,data); + vab_list[vab_index]=device->CreateVAB(vif->format,vertex_count,data); if(!vab_list[vab_index]) return(nullptr); @@ -184,7 +181,7 @@ namespace return ibo; } - VAB *InitVAB(const int vab_index,const VkFormat &format,const void *data) + VAB *InitVAB(const int vab_index,const void *data) { if(!vdm)return(nullptr); if(!vil)return(nullptr); @@ -196,9 +193,6 @@ namespace if(!vif)return(nullptr); - if(vif->format!=format) - return(nullptr); - if (!vab_list[vab_index]) { vab_list[vab_index]=vdm->GetVAB(vab_index); diff --git a/src/SceneGraph/Vulkan/VKPrimitiveData.h b/src/SceneGraph/Vulkan/VKPrimitiveData.h index b9f91c26..e7e059f8 100644 --- a/src/SceneGraph/Vulkan/VKPrimitiveData.h +++ b/src/SceneGraph/Vulkan/VKPrimitiveData.h @@ -51,7 +51,7 @@ public: public: virtual IndexBuffer * InitIBO(const uint32_t index_count,IndexType it)=0; - virtual VAB * InitVAB(const int vab_index,const VkFormat &format,const void *data)=0; + virtual VAB * InitVAB(const int vab_index,const void *data)=0; };//class PrimitiveData PrimitiveData *CreatePrimitiveData(GPUDevice *dev,const VIL *_vil,const uint32_t vc); From 0a025f046414da11c75d2d1e4238a27306cd040d Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 12 Jun 2024 01:46:19 +0800 Subject: [PATCH 2/8] added VKBufferMap::Write function. --- inc/hgl/graph/VKBufferMap.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/inc/hgl/graph/VKBufferMap.h b/inc/hgl/graph/VKBufferMap.h index 63c90c79..db17140d 100644 --- a/inc/hgl/graph/VKBufferMap.h +++ b/inc/hgl/graph/VKBufferMap.h @@ -74,5 +74,21 @@ public: map_ptr=nullptr; } } + + bool Write(const void *data,const uint32_t c) + { + if(!data||c==0||c>count)return(false); + + if(!map_ptr) + { + if(!buffer) + return(false); + + return buffer->Write(data,offset,c); + } + + memcpy(map_ptr,data,stride*c); + return(true); + } };//class VKBufferMap VK_NAMESPACE_END From 7b0a185a455bb65641711afc7ffbea003495a60b Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 12 Jun 2024 01:48:25 +0800 Subject: [PATCH 3/8] Moved vab_map_list and ibo_map from PrimitiveCreater to PrimitiveData --- inc/hgl/graph/PrimitiveCreater.h | 10 +- inc/hgl/graph/VKIndexBuffer.h | 2 +- inc/hgl/graph/VKVertexAttribBuffer.h | 2 +- src/SceneGraph/PrimitiveCreater.cpp | 75 +++++------ src/SceneGraph/Vulkan/VKPrimitiveData.cpp | 149 ++++++++++++---------- src/SceneGraph/Vulkan/VKPrimitiveData.h | 30 +++-- 6 files changed, 144 insertions(+), 124 deletions(-) diff --git a/inc/hgl/graph/PrimitiveCreater.h b/inc/hgl/graph/PrimitiveCreater.h index 55874085..44da7c9b 100644 --- a/inc/hgl/graph/PrimitiveCreater.h +++ b/inc/hgl/graph/PrimitiveCreater.h @@ -25,17 +25,13 @@ protected: uint32_t vertices_number; ///<顶点数量 - VABMap * vab_map_list; - uint32_t index_number; ///<索引数量 IndexType index_type; ///<索引类型 IndexBuffer * ibo; ///<索引缓冲区 - IBMap ibo_map; - protected: - const int GetVABIndex (const AnsiString &name); ///<取得顶点属性索引 + const int InitVAB(const AnsiString &name,const VkFormat format,const void *data); ///<取得顶点属性索引 public: @@ -60,9 +56,9 @@ public: //顶点缓冲区 const uint32_t GetVertexCount()const{ return vertices_number; } ///<取得顶点数量 - VABMap * MapVAB (const AnsiString &name); + VABMap * MapVAB (const AnsiString &name,const VkFormat format=VK_FORMAT_UNDEFINED); - bool WriteVAB (const AnsiString &name,const VkFormat &format,const void *data); ///<直接写入顶点属性数据 + bool WriteVAB (const AnsiString &name,const VkFormat format,const void *data); ///<直接写入顶点属性数据 public: //索引缓冲区 diff --git a/inc/hgl/graph/VKIndexBuffer.h b/inc/hgl/graph/VKIndexBuffer.h index bb99dcb6..b82d1976 100644 --- a/inc/hgl/graph/VKIndexBuffer.h +++ b/inc/hgl/graph/VKIndexBuffer.h @@ -52,7 +52,7 @@ public: const IndexType GetType()const{return buffer->GetType();} - void Set(IndexBuffer *ib,const int32_t index_offset,const uint32_t count) + void SetIBO(IndexBuffer *ib,const int32_t index_offset,const uint32_t count) { VKBufferMap::Set(ib,index_offset,ib->GetStride(),count); } diff --git a/inc/hgl/graph/VKVertexAttribBuffer.h b/inc/hgl/graph/VKVertexAttribBuffer.h index f7071d21..278ff86d 100644 --- a/inc/hgl/graph/VKVertexAttribBuffer.h +++ b/inc/hgl/graph/VKVertexAttribBuffer.h @@ -52,7 +52,7 @@ public: const VkFormat GetFormat()const { return buffer->GetFormat(); } - void Set(VAB *vab,const VkDeviceSize off,const uint32_t count) + void SetVAB(VAB *vab,const VkDeviceSize off,const uint32_t count) { VKBufferMap::Set(vab,off,vab->GetStride(),count); } diff --git a/src/SceneGraph/PrimitiveCreater.cpp b/src/SceneGraph/PrimitiveCreater.cpp index a86917a7..fc4b3a5e 100644 --- a/src/SceneGraph/PrimitiveCreater.cpp +++ b/src/SceneGraph/PrimitiveCreater.cpp @@ -15,8 +15,6 @@ PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v) prim_data =nullptr; - vab_map_list =new VABMap[v->GetVertexAttribCount()]; - Clear(); } @@ -30,7 +28,6 @@ PrimitiveCreater::PrimitiveCreater(VertexDataManager *_vdm) PrimitiveCreater::~PrimitiveCreater() { - delete[] vab_map_list; SAFE_CLEAR(prim_data); } @@ -94,8 +91,6 @@ bool PrimitiveCreater::Init(const AnsiString &pname,const uint32_t vertex_count, delete prim_data; return(false); } - - ibo_map.Set(ibo,prim_data->GetFirstIndex(),index_number); #ifdef _DEBUG if(!vdm) @@ -116,75 +111,72 @@ bool PrimitiveCreater::Init(const AnsiString &pname,const uint32_t vertex_count, return(true); } -const int PrimitiveCreater::GetVABIndex(const AnsiString &name) +const int PrimitiveCreater::InitVAB(const AnsiString &name,const VkFormat format,const void *data) { if(!prim_data)return(-1); const int vab_index=prim_data->GetVABIndex(name); - if(vab_index<0) + if(vab_index<0||vab_index>=vil->GetVertexAttribCount()) return(-1); + if(format!=VK_FORMAT_UNDEFINED) + { + const VIF *vif=vil->GetConfig(vab_index); + + if(vif->format!=format) + return(-2); + } + VAB *vab=prim_data->GetVAB(vab_index); if(!vab) { - vab=prim_data->InitVAB(vab_index,nullptr); + vab=prim_data->InitVAB(vab_index,data); - if(vab) - vab_map_list[vab_index].Set(vab, - prim_data->GetVertexOffset(), - vertices_number); - } + if(!vab) + return(-1); - if(!vab) - return(-1); - -#ifdef _DEBUG - if (!vdm) - { - DebugUtils *du=device->GetDebugUtils(); - - if (du) + #ifdef _DEBUG + if (!vdm) { - du->SetBuffer(vab->GetBuffer(), prim_name+":VAB:Buffer:"+name); - du->SetDeviceMemory(vab->GetVkMemory(), prim_name+":VAB:Memory:"+name); + 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 } -#endif//_DEBUG return(vab_index); } -VABMap *PrimitiveCreater::MapVAB(const AnsiString &name) +VABMap *PrimitiveCreater::MapVAB(const AnsiString &name,const VkFormat format) { - const int vab_index=GetVABIndex(name); + const int vab_index=InitVAB(name,format,nullptr); if(vab_index<0)return nullptr; - return vab_map_list+vab_index; + return prim_data->GetVABMap(vab_index); } -bool PrimitiveCreater::WriteVAB(const AnsiString &name,const VkFormat &format, const void *data) +bool PrimitiveCreater::WriteVAB(const AnsiString &name,const VkFormat format,const void *data) { if(!prim_data)return(false); + if(!data)return(false); - const int vab_index=GetVABIndex(name); - - VAB *vab=prim_data->GetVAB(vab_index); - - if(!vab) - return(false); - - return vab->Write(data,prim_data->GetVertexOffset(),vertices_number); + return InitVAB(name,format,data)>0; } IBMap *PrimitiveCreater::MapIBO() { - if(!ibo) + if(!prim_data) return(nullptr); - return &ibo_map; + return prim_data->MapIBO(); } bool PrimitiveCreater::WriteIBO(const void *data,const uint32_t count) @@ -205,10 +197,7 @@ Primitive *PrimitiveCreater::Create() if(!prim_data) return(nullptr); - for(uint32_t i=0;iGetVertexAttribCount();i++) - vab_map_list[i].Clear(); - - ibo_map.Clear(); + prim_data->UnmapAll(); Primitive *primitive=new Primitive(prim_name,prim_data); diff --git a/src/SceneGraph/Vulkan/VKPrimitiveData.cpp b/src/SceneGraph/Vulkan/VKPrimitiveData.cpp index 321bd2a5..4d2d009c 100644 --- a/src/SceneGraph/Vulkan/VKPrimitiveData.cpp +++ b/src/SceneGraph/Vulkan/VKPrimitiveData.cpp @@ -14,12 +14,14 @@ PrimitiveData::PrimitiveData(const VIL *_vil,const uint32_t vc) vertex_count=vc; vab_list=hgl_zero_new(_vil->GetVertexAttribCount()); + vab_map_list=new VABMap[_vil->GetVertexAttribCount()]; ibo=nullptr; } PrimitiveData::~PrimitiveData() { + delete[] vab_map_list; delete[] vab_list; //注意:这里并不释放VAB,在派生类中释放 } @@ -42,6 +44,73 @@ VAB *PrimitiveData::GetVAB(const int index) return vab_list[index]; } +VAB *PrimitiveData::InitVAB(const int vab_index,const void *data) +{ + if(!vil)return(nullptr); + + if(vab_index<0||vab_index>=vil->GetVertexAttribCount()) + return(nullptr); + + const VertexInputFormat *vif=vil->GetConfig(vab_index); + + if(!vif)return(nullptr); + + if(!vab_list[vab_index]) + { + vab_list[vab_index]=CreateVAB(vab_index,vif->format,data); + + if(!vab_list[vab_index]) + return(nullptr); + } + else + { + vab_map_list[vab_index].Write(data,vertex_count); + } + + return vab_list[vab_index]; +} + +VABMap *PrimitiveData::GetVABMap(const int vab_index) +{ + if(vab_index<0||vab_index>=vil->GetVertexAttribCount())return nullptr; + + VABMap *vab_map=vab_map_list+vab_index; + + if(!vab_map->IsValid()) + { + if(!vab_list[vab_index]) + return(nullptr); + + vab_map->SetVAB(vab_list[vab_index],GetVertexOffset(),vertex_count); + } + + return vab_map; +} + +IndexBuffer *PrimitiveData::InitIBO(const uint32_t ic,IndexType it) +{ + if(ibo)delete ibo; + + ibo=CreateIBO(ic,it); + + if(!ibo) + return(nullptr); + + index_count=ic; + + ibo_map.SetIBO(ibo,GetFirstIndex(),index_count); + + return(ibo); +} + +void PrimitiveData::UnmapAll() +{ + for(int i=0;iGetVertexAttribCount();i++) + vab_map_list[i].Unmap(); + + ibo_map.Unmap(); +} + namespace { /** @@ -81,48 +150,18 @@ namespace delete ibo; } - IndexBuffer *InitIBO(const uint32_t ic,IndexType it) override - { + IndexBuffer *CreateIBO(const uint32_t ic,const IndexType &it) override + { if(!device)return(nullptr); - if(ibo)delete ibo; - - ibo=device->CreateIBO(it,ic); - - if(!ibo) - return(nullptr); - - index_count=ic; - - return(ibo); + return device->CreateIBO(it,ic); } - VAB *InitVAB(const int vab_index,const void *data) + VAB *CreateVAB(const int vab_index,const VkFormat format,const void *data) override { if(!device)return(nullptr); - if(!vil)return(nullptr); - if(vab_index<0||vab_index>=vil->GetVertexAttribCount()) - return(nullptr); - - const VertexInputFormat *vif=vil->GetConfig(vab_index); - - if(!vif)return(nullptr); - - if(!vab_list[vab_index]) - { - vab_list[vab_index]=device->CreateVAB(vif->format,vertex_count,data); - - if(!vab_list[vab_index]) - return(nullptr); - } - - if(vab_list[vab_index]&&data) - { - vab_list[vab_index]->Write(data,vertex_count); - } - - return vab_list[vab_index]; + return device->CreateVAB(format,vertex_count,data); } };//class PrimitiveDataPrivateBuffer:public PrimitiveData @@ -161,10 +200,10 @@ namespace vdm->ReleaseVAB(vab_node); } - IndexBuffer *InitIBO(const uint32_t ic,IndexType it) override + IndexBuffer *CreateIBO(const uint32_t ic,const IndexType &it) override { - if(ic<=0)return(nullptr); - if(!vdm)return(nullptr); + if(!vdm) + return(nullptr); if(!ib_node) { @@ -172,39 +211,21 @@ namespace if(!ib_node) return(nullptr); - - ibo=vdm->GetIBO(); } - index_count=ic; - - return ibo; + return vdm->GetIBO(); } - - VAB *InitVAB(const int vab_index,const void *data) + + VAB *CreateVAB(const int vab_index,const VkFormat format,const void *data) override { - if(!vdm)return(nullptr); - if(!vil)return(nullptr); + VAB *vab=vdm->GetVAB(vab_index); - if (vab_index<0||vab_index>=vil->GetVertexAttribCount()) - return(nullptr); + if(!vab)return(nullptr); - const VertexInputFormat *vif=vil->GetConfig(vab_index); + if(data) + vab->Write(data,vab_node->GetStart(),vertex_count); - if(!vif)return(nullptr); - - if (!vab_list[vab_index]) - { - vab_list[vab_index]=vdm->GetVAB(vab_index); - - if(!vab_list[vab_index]) - return(nullptr); - } - - if(vab_list[vab_index]&&data) - vab_list[vab_index]->Write(data,vab_node->GetStart(),vertex_count); - - return vab_list[vab_index]; + return vab; } };//class PrimitiveDataVDM:public PrimitiveData }//namespace diff --git a/src/SceneGraph/Vulkan/VKPrimitiveData.h b/src/SceneGraph/Vulkan/VKPrimitiveData.h index e7e059f8..49360c30 100644 --- a/src/SceneGraph/Vulkan/VKPrimitiveData.h +++ b/src/SceneGraph/Vulkan/VKPrimitiveData.h @@ -1,4 +1,7 @@ -#include +#pragma once + +#include +#include VK_NAMESPACE_BEGIN /* @@ -25,7 +28,16 @@ protected: uint32_t index_count; VAB ** vab_list; - IndexBuffer * ibo; + VABMap * vab_map_list; + + virtual VAB * CreateVAB(const int vab_index,const VkFormat format,const void *data)=0; + +protected: + + IndexBuffer * ibo; + IBMap ibo_map; + + virtual IndexBuffer *CreateIBO(const uint32_t ic,const IndexType &it)=0; public: @@ -37,21 +49,23 @@ public: const uint32_t GetVertexCount ()const{return vertex_count;} const int GetVABCount ()const; const int GetVABIndex (const AnsiString &name)const; - VAB * GetVAB (const int index); - VAB * GetVAB (const AnsiString &name){return GetVAB(GetVABIndex(name));} + VAB * GetVAB (const int index); + VAB * InitVAB (const int vab_index,const void *data); + VABMap * GetVABMap (const int vab_index); + + IndexBuffer * InitIBO(const uint32_t index_count,IndexType it); IndexBuffer * GetIBO (){return ibo;} + IBMap * MapIBO (){return &ibo_map;} uint32_t GetIndexCount ()const{return index_count;} virtual int32_t GetVertexOffset ()const=0; ///<取得顶点偏移(注意是顶点不是字节) virtual uint32_t GetFirstIndex ()const=0; ///<取得第一个索引 - virtual VertexDataManager * GetVDM()const=0; ///<取得顶点数据管理器 + virtual VertexDataManager * GetVDM()const=0; ///<取得顶点数据管理器 -public: + void UnmapAll(); - virtual IndexBuffer * InitIBO(const uint32_t index_count,IndexType it)=0; - virtual VAB * InitVAB(const int vab_index,const void *data)=0; };//class PrimitiveData PrimitiveData *CreatePrimitiveData(GPUDevice *dev,const VIL *_vil,const uint32_t vc); From 2efb9c83bf39a7744e4a1a18de211c0af34c4ee8 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 12 Jun 2024 02:07:54 +0800 Subject: [PATCH 4/8] added GetVABMap and GetIBMap in Primitive --- inc/hgl/graph/PrimitiveCreater.h | 4 +- inc/hgl/graph/VK.h | 3 + inc/hgl/graph/VKPrimitive.h | 4 ++ inc/hgl/graph/VKVertexAttribBuffer.h | 87 ++++++++++++++++++++++--- inc/hgl/graph/VertexAttribDataAccess.h | 11 ++++ src/SceneGraph/InlineGeometry.cpp | 76 ++++++++++----------- src/SceneGraph/PrimitiveCreater.cpp | 6 +- src/SceneGraph/Vulkan/VKPrimitive.cpp | 10 +++ src/SceneGraph/Vulkan/VKPrimitiveData.h | 2 +- 9 files changed, 150 insertions(+), 53 deletions(-) diff --git a/inc/hgl/graph/PrimitiveCreater.h b/inc/hgl/graph/PrimitiveCreater.h index 44da7c9b..1901217f 100644 --- a/inc/hgl/graph/PrimitiveCreater.h +++ b/inc/hgl/graph/PrimitiveCreater.h @@ -56,7 +56,7 @@ public: //顶点缓冲区 const uint32_t GetVertexCount()const{ return vertices_number; } ///<取得顶点数量 - VABMap * MapVAB (const AnsiString &name,const VkFormat format=VK_FORMAT_UNDEFINED); + VABMap * GetVABMap (const AnsiString &name,const VkFormat format=VK_FORMAT_UNDEFINED); bool WriteVAB (const AnsiString &name,const VkFormat format,const void *data); ///<直接写入顶点属性数据 @@ -65,7 +65,7 @@ public: //索引缓冲区 const IndexType GetIndexType()const{return index_type;} ///<取得索引类型 const uint32_t GetIndexCount()const{return index_number;} ///<取得索引数量 - IBMap * MapIBO(); + IBMap * GetIBMap(); bool WriteIBO(const void *data,const uint32_t count); diff --git a/inc/hgl/graph/VK.h b/inc/hgl/graph/VK.h index c7070b52..551e3022 100644 --- a/inc/hgl/graph/VK.h +++ b/inc/hgl/graph/VK.h @@ -62,6 +62,9 @@ using VAB=VertexAttribBuffer; class IndexBuffer; +class VABMap; +class IBMap; + class GPUCmdBuffer; class RenderCmdBuffer; class TextureCmdBuffer; diff --git a/inc/hgl/graph/VKPrimitive.h b/inc/hgl/graph/VKPrimitive.h index 3f2527cd..8f8569f8 100644 --- a/inc/hgl/graph/VKPrimitive.h +++ b/inc/hgl/graph/VKPrimitive.h @@ -6,6 +6,7 @@ #include VK_NAMESPACE_BEGIN + /** * 原始图元数据访问接口
* Primitive的存为是为了屏蔽PrimitiveData的初始化之类的访问接口,以便于更好的管理和使用 @@ -37,10 +38,13 @@ public: VAB * GetVAB (const int); VAB * GetVAB (const AnsiString &name){return GetVAB(GetVABIndex(name));} const int32_t GetVertexOffset ()const; ///<取得顶点偏移(注意是顶点不是字节) + VABMap * GetVABMap (const int); ///<取得VAB映射器 + VABMap * GetVABMap (const AnsiString &name){return GetVABMap(GetVABIndex(name));} const uint32_t GetIndexCount ()const; IndexBuffer * GetIBO (); const uint32_t GetFirstIndex ()const; ///<取得第一个索引 + IBMap * GetIBMap (); ///<取得索引缓冲区映射器 VertexDataManager * GetVDM (); ///<取得顶点数据管理器 diff --git a/inc/hgl/graph/VKVertexAttribBuffer.h b/inc/hgl/graph/VKVertexAttribBuffer.h index 278ff86d..46d499de 100644 --- a/inc/hgl/graph/VKVertexAttribBuffer.h +++ b/inc/hgl/graph/VKVertexAttribBuffer.h @@ -68,15 +68,24 @@ template class VABRawMap public: - VABRawMap(VABMap *map,const VkFormat check_format=VK_FORMAT_UNDEFINED) + VABRawMap(VABMap *map,const VkFormat check_format=VK_FORMAT_UNDEFINED,bool now_map=true) { vab_map=map; map_ptr=nullptr; if(vab_map) + { if(check_format==VK_FORMAT_UNDEFINED ||check_format==vab_map->GetFormat()) - map_ptr=(T *)(vab_map->Map()); + { + if(now_map) + map_ptr=(T *)(vab_map->Map()); + } + else + { + vab_map=nullptr; + } + } } ~VABRawMap() @@ -87,6 +96,26 @@ public: const bool IsValid()const{ return vab_map?vab_map->IsValid():false; } + T *Map() + { + if(!vab_map) + return(nullptr); + + if(!map_ptr) + map_ptr=(T *)(vab_map->Map()); + + return map_ptr; + } + + void Unmap() + { + if(vab_map) + { + if(map_ptr) + vab_map->Unmap(); + } + } + operator T *(){ return map_ptr; } T *operator->(){ return map_ptr; } };//template class VABRawMap @@ -111,14 +140,21 @@ template class VABFormatMap public: - VABFormatMap(VABMap *map) + VABFormatMap(VABMap *map,bool now_map=true) { vab_map=map; if(vab_map&&vab_map->GetFormat()==T::GetVulkanFormat()) { - map_ptr=T::Create(vab_map->GetCount(),vab_map->Map()); - map_ptr->Begin(); + if(now_map) + { + map_ptr=T::Create(vab_map->GetCount(),vab_map->Map()); + map_ptr->Begin(); + } + else + { + map_ptr=T::Create(vab_map->GetCount(),nullptr); + } } else map_ptr=nullptr; @@ -133,15 +169,48 @@ public: } } - const bool IsValid()const{ return map_ptr; } + const bool IsValid()const{ return map_ptr?map_ptr->IsValid():false; } + + T *Map() + { + if(!vab_map) + return(nullptr); + + if(!map_ptr) + { + map_ptr=T::Create(vab_map->GetCount(),vab_map->Map()); + } + else + { + if(!map_ptr->IsValid()) + map_ptr->SetData(vab_map->Map()); + } + + map_ptr->Begin(); + return map_ptr; + } + + void Unmap() + { + if(vab_map) + { + if(map_ptr&&map_ptr->IsValid()) + { + vab_map->Unmap(); + map_ptr->SetData(nullptr); + } + } + } void Restart() { - if(map_ptr) - vab_map->Begin(); + return Map(); } - T *operator->(){ return map_ptr; } + T *operator->() + { + return map_ptr; + } };//template class VABFormatMap typedef VABFormatMap VABMap1i8 ,VABMap1b; diff --git a/inc/hgl/graph/VertexAttribDataAccess.h b/inc/hgl/graph/VertexAttribDataAccess.h index 848544c6..b7f535ef 100644 --- a/inc/hgl/graph/VertexAttribDataAccess.h +++ b/inc/hgl/graph/VertexAttribDataAccess.h @@ -44,6 +44,17 @@ namespace hgl virtual ~VertexAttribDataAccess()=default; + void SetData(T *_data) + { + data =_data; + data_end=_data+count*C; + } + + const bool IsValid()const + { + return data; + } + void Write(const T *ptr) { if(!ptr)return; diff --git a/src/SceneGraph/InlineGeometry.cpp b/src/SceneGraph/InlineGeometry.cpp index 8e11b191..c0997718 100644 --- a/src/SceneGraph/InlineGeometry.cpp +++ b/src/SceneGraph/InlineGeometry.cpp @@ -20,7 +20,7 @@ namespace hgl if(!pc->Init("Rectangle",4,0)) return(nullptr); - VABMap2f vertex(pc->MapVAB(VAN::Position)); + VABMap2f vertex(pc->GetVABMap(VAN::Position)); if(!vertex.IsValid()) return(nullptr); @@ -48,7 +48,7 @@ namespace hgl if(!pc->Init("RoundRectangle",4,0)) return(nullptr); - VABMap2f vertex(pc->MapVAB(VAN::Position)); + VABMap2f vertex(pc->GetVABMap(VAN::Position)); vertex->WriteRectFan(rci->scope); } @@ -62,7 +62,7 @@ namespace hgl if(!pc->Init("RoundRectangle",rci->round_per*4,8)) return(nullptr); - VABMap2f vertex(pc->MapVAB(VAN::Position)); + VABMap2f vertex(pc->GetVABMap(VAN::Position)); Vector2f *coord=new Vector2f[rci->round_per]; @@ -133,8 +133,8 @@ namespace hgl if(!pc->Init("Circle",vertex_count,0))return(nullptr); - VABMap2f vertex(pc->MapVAB(VAN::Position)); - VABMap4f color(pc->MapVAB(VAN::Color)); + VABMap2f vertex(pc->GetVABMap(VAN::Position)); + VABMap4f color(pc->GetVABMap(VAN::Color)); if(!vertex.IsValid()) return(nullptr); @@ -169,7 +169,7 @@ namespace hgl if(!pc->Init("PlaneGrid",((pgci->grid_size.Width()+1)+(pgci->grid_size.Height()+1))*2,0)) return(nullptr); - VABMap2f vertex(pc->MapVAB(VAN::Position)); + VABMap2f vertex(pc->GetVABMap(VAN::Position)); if(!vertex.IsValid()) return(nullptr); @@ -192,7 +192,7 @@ namespace hgl Vector2f(left+col,bottom)); } - VABMap1f lum(pc->MapVAB(VAN::Luminance)); + VABMap1f lum(pc->GetVABMap(VAN::Luminance)); if(lum.IsValid()) { @@ -232,21 +232,21 @@ namespace hgl return(nullptr); { - VABMap3f normal(pc->MapVAB(VAN::Normal)); + VABMap3f normal(pc->GetVABMap(VAN::Normal)); if(normal.IsValid()) normal->RepeatWrite(xy_normal,4); } { - VABMap3f tangent(pc->MapVAB(VAN::Tangent)); + VABMap3f tangent(pc->GetVABMap(VAN::Tangent)); if(tangent.IsValid()) tangent->RepeatWrite(xy_tangent,4); } { - VABMap2f tex_coord(pc->MapVAB(VAN::TexCoord)); + VABMap2f tex_coord(pc->GetVABMap(VAN::TexCoord)); if(tex_coord.IsValid()) tex_coord->Write(xy_tex_coord,4); @@ -332,7 +332,7 @@ namespace hgl { RANGE_CHECK_RETURN_NULLPTR(cci->color_type); - VABMap4f color(pc->MapVAB(VAN::Color)); + VABMap4f color(pc->GetVABMap(VAN::Color)); if(color.IsValid()) { @@ -360,7 +360,7 @@ namespace hgl template void CreateSphereIndices(PrimitiveCreater *pc,uint numberParallels,const uint numberSlices) { - IBTypeMap ib_map(pc->MapIBO()); + IBTypeMap ib_map(pc->GetIBMap()); T *tp=ib_map; for (uint i = 0; i < numberParallels; i++) @@ -473,10 +473,10 @@ namespace hgl if(!pc->Init("Sphere",numberVertices,numberIndices)) return(nullptr); - VABMapFloat vertex (pc->MapVAB(VAN::Position),VF_V3F); - VABMapFloat normal (pc->MapVAB(VAN::Normal),VF_V3F); - VABMapFloat tangent (pc->MapVAB(VAN::Tangent),VF_V3F); - VABMapFloat tex_coord(pc->MapVAB(VAN::TexCoord),VF_V2F); + VABMapFloat vertex (pc->GetVABMap(VAN::Position),VF_V3F); + VABMapFloat normal (pc->GetVABMap(VAN::Normal),VF_V3F); + VABMapFloat tangent (pc->GetVABMap(VAN::Tangent),VF_V3F); + VABMapFloat tex_coord(pc->GetVABMap(VAN::TexCoord),VF_V2F); float *vp=vertex; float *np=normal; @@ -562,10 +562,10 @@ namespace hgl if(!pc->Init("Dome",numberVertices,numberIndices)) return(nullptr); - VABMapFloat vertex (pc->MapVAB(VAN::Position),VF_V3F); - VABMapFloat normal (pc->MapVAB(VAN::Normal),VF_V3F); - VABMapFloat tangent (pc->MapVAB(VAN::Tangent),VF_V3F); - VABMapFloat tex_coord(pc->MapVAB(VAN::TexCoord),VF_V2F); + VABMapFloat vertex (pc->GetVABMap(VAN::Position),VF_V3F); + VABMapFloat normal (pc->GetVABMap(VAN::Normal),VF_V3F); + VABMapFloat tangent (pc->GetVABMap(VAN::Tangent),VF_V3F); + VABMapFloat tex_coord(pc->GetVABMap(VAN::TexCoord),VF_V2F); float *vp=vertex; float *np=normal; @@ -637,7 +637,7 @@ namespace hgl template void CreateTorusIndices(PrimitiveCreater *pc,uint numberSlices,uint numberStacks) { - IBTypeMap ib_map(pc->MapIBO()); + IBTypeMap ib_map(pc->GetIBMap()); T *tp=ib_map; // loop counters @@ -710,10 +710,10 @@ namespace hgl if(!pc->Init("Torus",numberVertices,numberIndices)) return(nullptr); - VABMapFloat vertex (pc->MapVAB(VAN::Position),VF_V3F); - VABMapFloat normal (pc->MapVAB(VAN::Normal),VF_V3F); - VABMapFloat tangent (pc->MapVAB(VAN::Tangent),VF_V3F); - VABMapFloat tex_coord(pc->MapVAB(VAN::TexCoord),VF_V2F); + VABMapFloat vertex (pc->GetVABMap(VAN::Position),VF_V3F); + VABMapFloat normal (pc->GetVABMap(VAN::Normal),VF_V3F); + VABMapFloat tangent (pc->GetVABMap(VAN::Tangent),VF_V3F); + VABMapFloat tex_coord(pc->GetVABMap(VAN::TexCoord),VF_V2F); float *vp=vertex; float *np=normal; @@ -788,7 +788,7 @@ namespace hgl template void CreateCylinderIndices(PrimitiveCreater *pc,const uint numberSlices) { - IBTypeMap ib_map(pc->MapIBO()); + IBTypeMap ib_map(pc->GetIBMap()); T *tp=ib_map; uint i; @@ -852,10 +852,10 @@ namespace hgl if (cci->numberSlices < 3 || numberVertices > GLUS_MAX_VERTICES || numberIndices > GLUS_MAX_INDICES) return nullptr; - VABMapFloat vertex (pc->MapVAB(VAN::Position),VF_V3F); - VABMapFloat normal (pc->MapVAB(VAN::Normal),VF_V3F); - VABMapFloat tangent (pc->MapVAB(VAN::Tangent),VF_V3F); - VABMapFloat tex_coord(pc->MapVAB(VAN::TexCoord),VF_V2F); + VABMapFloat vertex (pc->GetVABMap(VAN::Position),VF_V3F); + VABMapFloat normal (pc->GetVABMap(VAN::Normal),VF_V3F); + VABMapFloat tangent (pc->GetVABMap(VAN::Tangent),VF_V3F); + VABMapFloat tex_coord(pc->GetVABMap(VAN::TexCoord),VF_V2F); float *vp=vertex; float *np=normal; @@ -1025,7 +1025,7 @@ namespace hgl template void CreateConeIndices(PrimitiveCreater *pc,const uint numberSlices,const uint numberStacks) { - IBTypeMap ib_map(pc->MapIBO()); + IBTypeMap ib_map(pc->GetIBMap()); T *tp=ib_map; // Bottom @@ -1082,10 +1082,10 @@ namespace hgl if (cci->numberSlices < 3 || cci->numberStacks < 1 || numberVertices > GLUS_MAX_VERTICES || numberIndices > GLUS_MAX_INDICES) return nullptr; - VABMapFloat vertex (pc->MapVAB(VAN::Position),VF_V3F); - VABMapFloat normal (pc->MapVAB(VAN::Normal),VF_V3F); - VABMapFloat tangent (pc->MapVAB(VAN::Tangent),VF_V3F); - VABMapFloat tex_coord(pc->MapVAB(VAN::TexCoord),VF_V2F); + VABMapFloat vertex (pc->GetVABMap(VAN::Position),VF_V3F); + VABMapFloat normal (pc->GetVABMap(VAN::Normal),VF_V3F); + VABMapFloat tangent (pc->GetVABMap(VAN::Tangent),VF_V3F); + VABMapFloat tex_coord(pc->GetVABMap(VAN::TexCoord),VF_V2F); float *vp=vertex; float *np=normal; @@ -1204,8 +1204,8 @@ namespace hgl if(!pc->Init("Axis",6,0)) return(nullptr); - VABMap3f vertex(pc->MapVAB(VAN::Position)); - VABMap4f color(pc->MapVAB(VAN::Color)); + VABMap3f vertex(pc->GetVABMap(VAN::Position)); + VABMap4f color(pc->GetVABMap(VAN::Color)); if(!vertex.IsValid()||!color.IsValid()) return(nullptr); @@ -1256,7 +1256,7 @@ namespace hgl { RANGE_CHECK_RETURN_NULLPTR(cci->color_type); - VABMap4f color(pc->MapVAB(VAN::Color)); + VABMap4f color(pc->GetVABMap(VAN::Color)); if(color.IsValid()) { diff --git a/src/SceneGraph/PrimitiveCreater.cpp b/src/SceneGraph/PrimitiveCreater.cpp index fc4b3a5e..61dec20d 100644 --- a/src/SceneGraph/PrimitiveCreater.cpp +++ b/src/SceneGraph/PrimitiveCreater.cpp @@ -154,7 +154,7 @@ const int PrimitiveCreater::InitVAB(const AnsiString &name,const VkFormat format return(vab_index); } -VABMap *PrimitiveCreater::MapVAB(const AnsiString &name,const VkFormat format) +VABMap *PrimitiveCreater::GetVABMap(const AnsiString &name,const VkFormat format) { const int vab_index=InitVAB(name,format,nullptr); @@ -171,12 +171,12 @@ bool PrimitiveCreater::WriteVAB(const AnsiString &name,const VkFormat format,con return InitVAB(name,format,data)>0; } -IBMap *PrimitiveCreater::MapIBO() +IBMap *PrimitiveCreater::GetIBMap() { if(!prim_data) return(nullptr); - return prim_data->MapIBO(); + return prim_data->GetIBMap(); } bool PrimitiveCreater::WriteIBO(const void *data,const uint32_t count) diff --git a/src/SceneGraph/Vulkan/VKPrimitive.cpp b/src/SceneGraph/Vulkan/VKPrimitive.cpp index c2462bc7..ab20c55f 100644 --- a/src/SceneGraph/Vulkan/VKPrimitive.cpp +++ b/src/SceneGraph/Vulkan/VKPrimitive.cpp @@ -66,6 +66,11 @@ const int32_t Primitive::GetVertexOffset()const return prim_data->GetVertexOffset(); } +VABMap *Primitive::GetVABMap(const int vab_index) +{ + return prim_data->GetVABMap(vab_index); +} + const uint32_t Primitive::GetIndexCount()const { return prim_data->GetIndexCount(); @@ -81,6 +86,11 @@ const uint32_t Primitive::GetFirstIndex()const return prim_data->GetFirstIndex(); } +IBMap *Primitive::GetIBMap() +{ + return prim_data->GetIBMap(); +} + VertexDataManager *Primitive::GetVDM() { return prim_data->GetVDM(); diff --git a/src/SceneGraph/Vulkan/VKPrimitiveData.h b/src/SceneGraph/Vulkan/VKPrimitiveData.h index 49360c30..378c9904 100644 --- a/src/SceneGraph/Vulkan/VKPrimitiveData.h +++ b/src/SceneGraph/Vulkan/VKPrimitiveData.h @@ -56,7 +56,7 @@ public: IndexBuffer * InitIBO(const uint32_t index_count,IndexType it); IndexBuffer * GetIBO (){return ibo;} - IBMap * MapIBO (){return &ibo_map;} + IBMap * GetIBMap (){return &ibo_map;} uint32_t GetIndexCount ()const{return index_count;} virtual int32_t GetVertexOffset ()const=0; ///<取得顶点偏移(注意是顶点不是字节) From b71c912fd587b294ffddf763cde9101ea02cd344 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 12 Jun 2024 02:14:56 +0800 Subject: [PATCH 5/8] [WIP] RayPicking.cpp --- example/Gizmo/RayPicking.cpp | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/example/Gizmo/RayPicking.cpp b/example/Gizmo/RayPicking.cpp index e52bd8a8..22381f7e 100644 --- a/example/Gizmo/RayPicking.cpp +++ b/example/Gizmo/RayPicking.cpp @@ -39,14 +39,13 @@ private: Pipeline * pipeline =nullptr; - VertexDataManager * vdm =nullptr; PrimitiveCreater * prim_creater =nullptr; Primitive * prim_plane_grid =nullptr; Primitive * prim_line =nullptr; - VAB * vab_pos =nullptr; + VABMap * prim_line_vab_map =nullptr; Ray ray; @@ -75,20 +74,9 @@ private: return(true); } - bool InitVDMAndPC() + bool InitPC() { - vdm=new VertexDataManager(device,material->GetDefaultVIL()); - if(!vdm->Init( 1024*1024, //VAB最大容量 - 1024*1024, //索引最大容量 - IndexType::U16)) //索引类型 - { - delete vdm; - vdm=nullptr; - - return(false); - } - - prim_creater=new PrimitiveCreater(vdm); + prim_creater=new PrimitiveCreater(device,material->GetDefaultVIL()); return(true); } @@ -133,7 +121,7 @@ private: prim_line=prim_creater->Create(); - prim_line->Getv + prim_line_vab_map=prim_line->GetVABMap(VAN::Position); } return(true); @@ -159,7 +147,6 @@ public: ~TestApp() { SAFE_CLEAR(prim_creater) - SAFE_CLEAR(vdm) } bool Init(uint w,uint h) @@ -170,7 +157,7 @@ public: if(!InitMaterialAndPipeline()) return(false); - if(!InitVDMAndPC()) + if(!InitPC()) return(false); if(!CreateRenderObject()) @@ -191,7 +178,7 @@ public: const Vector3f pos=ray.ClosestPoint(Vector3f(0,0,0)); //求射线上与点(0,0,0)最近的点的坐标 - vab_pos->Write(&pos,3*sizeof(float)); //更新VAB上这个点的位置 + prim_line_vab_map->Write(&pos,3*sizeof(float)); //更新VAB上这个点的位置 SceneAppFramework::BuildCommandBuffer(index); } From d83f04faab36654000cc49e7c8fbb049b2ad4053 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 12 Jun 2024 08:53:20 +0800 Subject: [PATCH 6/8] fixed a but that PrimitiveCreater::WriteVAB return error. --- src/SceneGraph/PrimitiveCreater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SceneGraph/PrimitiveCreater.cpp b/src/SceneGraph/PrimitiveCreater.cpp index 61dec20d..62fd6393 100644 --- a/src/SceneGraph/PrimitiveCreater.cpp +++ b/src/SceneGraph/PrimitiveCreater.cpp @@ -168,7 +168,7 @@ bool PrimitiveCreater::WriteVAB(const AnsiString &name,const VkFormat format,con if(!prim_data)return(false); if(!data)return(false); - return InitVAB(name,format,data)>0; + return InitVAB(name,format,data)>=0; } IBMap *PrimitiveCreater::GetIBMap() From 4fcdd42ce4fa2f2a9f0ffb9c4c13106a5c213fc0 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 12 Jun 2024 08:53:54 +0800 Subject: [PATCH 7/8] fixed RayPicking.cpp sample on newest sdk. --- example/Gizmo/RayPicking.cpp | 88 ++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/example/Gizmo/RayPicking.cpp b/example/Gizmo/RayPicking.cpp index 22381f7e..e771bff8 100644 --- a/example/Gizmo/RayPicking.cpp +++ b/example/Gizmo/RayPicking.cpp @@ -33,18 +33,15 @@ class TestApp:public SceneAppFramework private: - Material * material =nullptr; + Material * mtl_plane_grid =nullptr; MaterialInstance * mi_plane_grid =nullptr; - MaterialInstance * mi_line =nullptr; - - Pipeline * pipeline =nullptr; - - PrimitiveCreater * prim_creater =nullptr; - + Pipeline * pipeline_plane_grid =nullptr; Primitive * prim_plane_grid =nullptr; + Material * mtl_line =nullptr; + MaterialInstance * mi_line =nullptr; + Pipeline * pipeline_line =nullptr; Primitive * prim_line =nullptr; - VABMap * prim_line_vab_map =nullptr; Ray ray; @@ -53,37 +50,45 @@ private: bool InitMaterialAndPipeline() { - mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"VertexLuminance3D",Prim::Lines); + mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"VertexLuminance2D",Prim::Lines); cfg.local_to_world=true; - material=db->LoadMaterial("Std3D/VertexLum3D",&cfg); - if(!material)return(false); + { + cfg.position_format=VAT_VEC2; - mi_plane_grid=db->CreateMaterialInstance(material,nullptr,&white_color); - if(!mi_plane_grid)return(false); + mtl_plane_grid=db->LoadMaterial("Std3D/VertexLum2D",&cfg); + if(!mtl_plane_grid)return(false); + + mi_plane_grid=db->CreateMaterialInstance(mtl_plane_grid,nullptr,&white_color); + if(!mi_plane_grid)return(false); - mi_line=db->CreateMaterialInstance(material,nullptr,&yellow_color); - if(!mi_line)return(false); + pipeline_plane_grid=CreatePipeline(mtl_plane_grid,InlinePipeline::Solid3D,Prim::Lines); + if(!pipeline_plane_grid)return(false); + } - pipeline=CreatePipeline(material,InlinePipeline::Solid3D,Prim::Lines); + { + cfg.mtl_name="VertexLuminance3D"; + cfg.position_format=VAT_VEC3; - if(!pipeline) - return(false); + mtl_line=db->LoadMaterial("Std3D/VertexLum3D",&cfg); + if(!mtl_line)return(false); + + mi_line=db->CreateMaterialInstance(mtl_line,nullptr,&yellow_color); + if(!mi_line)return(false); + + pipeline_line=CreatePipeline(mtl_line,InlinePipeline::Solid3D,Prim::Lines); + + if(!pipeline_line) + return(false); + } return(true); } - bool InitPC() + Renderable *Add(Primitive *r,MaterialInstance *mi,Pipeline *p) { - prim_creater=new PrimitiveCreater(device,material->GetDefaultVIL()); - - return(true); - } - - Renderable *Add(Primitive *r,MaterialInstance *mi) - { - Renderable *ri=db->CreateRenderable(r,mi,pipeline); + Renderable *ri=db->CreateRenderable(r,mi,p); if(!ri) { @@ -99,8 +104,10 @@ private: bool CreateRenderObject() { using namespace inline_geometry; - + { + PrimitiveCreater pc(device,mtl_plane_grid->GetDefaultVIL()); + struct PlaneGridCreateInfo pgci; pgci.grid_size.Set(32,32); @@ -109,17 +116,19 @@ private: pgci.lum=0.5; pgci.sub_lum=0.75; - prim_plane_grid=CreatePlaneGrid(prim_creater,&pgci); + prim_plane_grid=CreatePlaneGrid(&pc,&pgci); } { - if(!prim_creater->Init("Line",2)) + PrimitiveCreater pc(device,mtl_line->GetDefaultVIL()); + + if(!pc.Init("Line",2)) return(false); - if(!prim_creater->WriteVAB(VAN::Position, VF_V3F,position_data))return(false); - if(!prim_creater->WriteVAB(VAN::Luminance,VF_V1F,lumiance_data))return(false); + if(!pc.WriteVAB(VAN::Position, VF_V3F,position_data))return(false); + if(!pc.WriteVAB(VAN::Luminance,VF_V1F,lumiance_data))return(false); - prim_line=prim_creater->Create(); + prim_line=pc.Create(); prim_line_vab_map=prim_line->GetVABMap(VAN::Position); } @@ -129,8 +138,8 @@ private: bool InitScene() { - Add(prim_plane_grid,mi_plane_grid); - Add(prim_line,mi_line); + Add(prim_plane_grid,mi_plane_grid,pipeline_plane_grid); + Add(prim_line,mi_line,pipeline_line); camera->pos=Vector3f(32,32,32); camera_control->SetTarget(Vector3f(0,0,0)); @@ -146,7 +155,8 @@ public: ~TestApp() { - SAFE_CLEAR(prim_creater) + SAFE_CLEAR(prim_plane_grid); + SAFE_CLEAR(prim_line); } bool Init(uint w,uint h) @@ -157,9 +167,6 @@ public: if(!InitMaterialAndPipeline()) return(false); - if(!InitPC()) - return(false); - if(!CreateRenderObject()) return(false); @@ -178,7 +185,8 @@ public: const Vector3f pos=ray.ClosestPoint(Vector3f(0,0,0)); //求射线上与点(0,0,0)最近的点的坐标 - prim_line_vab_map->Write(&pos,3*sizeof(float)); //更新VAB上这个点的位置 + prim_line_vab_map->Write(&pos, //更新VAB上这个点的位置 + 1); //这里的1代表的数据数量,不是字节数 SceneAppFramework::BuildCommandBuffer(index); } From 66fbe5571e43b13d75faa653e869a4c47d78009d Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 12 Jun 2024 08:56:01 +0800 Subject: [PATCH 8/8] added comments --- example/Gizmo/RayPicking.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/Gizmo/RayPicking.cpp b/example/Gizmo/RayPicking.cpp index e771bff8..05e24884 100644 --- a/example/Gizmo/RayPicking.cpp +++ b/example/Gizmo/RayPicking.cpp @@ -68,7 +68,7 @@ private: } { - cfg.mtl_name="VertexLuminance3D"; + cfg.mtl_name="VertexLuminance3D"; //注意必须用不同名字,未来改名材质文件名+cfg hash名 cfg.position_format=VAT_VEC3; mtl_line=db->LoadMaterial("Std3D/VertexLum3D",&cfg);