ULRE/inc/hgl/graph/VertexAttribDataAccess.h

1181 lines
37 KiB
C
Raw Normal View History

#ifndef HGL_GRAPH_VERTEX_ATTRIB_DATA_ACCESS_INCLUDE
#define HGL_GRAPH_VERTEX_ATTRIB_DATA_ACCESS_INCLUDE
2019-05-22 18:10:13 +08:00
#include<hgl/type/Color3f.h>
#include<hgl/type/Color4f.h>
#include<hgl/type/RectScope.h>
2020-09-05 17:54:21 +08:00
#include<hgl/type/String.h>
#include<hgl/graph/VertexAttribData.h>
2019-08-27 20:29:03 +08:00
#include<hgl/log/LogInfo.h>
2019-05-22 18:10:13 +08:00
namespace hgl
{
namespace graph
{
/**
* 访
2019-05-22 18:10:13 +08:00
*/
template<typename T,int C> class VertexAttribDataAccess
2019-05-22 18:10:13 +08:00
{
protected:
T * data; ///<符合当前类型的地址
T * data_end; ///<内存数据区访问结束地址
uint32_t count; ///<数据个数
2019-05-22 18:10:13 +08:00
uint32_t total_bytes; ///<数据总字节数
T * access; ///<当前访问地址
T * start_access; ///<访问起始地址
2019-05-22 18:10:13 +08:00
public:
VertexAttribDataAccess(uint32_t _size,T *_data)
2019-05-22 18:10:13 +08:00
{
data =_data;
count =_size;
data_end=_data+_size*C;
2020-07-31 18:01:28 +08:00
total_bytes =_size*C*sizeof(T);
access =nullptr;
start_access=nullptr;
2019-05-22 18:10:13 +08:00
}
virtual ~VertexAttribDataAccess()=default;
2019-05-22 18:10:13 +08:00
2019-06-17 20:25:44 +08:00
void BufferData(const T *ptr)
{
if(!ptr)return;
memcpy(data,ptr,total_bytes);
2019-06-17 20:25:44 +08:00
}
2019-05-22 18:10:13 +08:00
/**
*
* @param offset 访
* @return 访
*/
T *Get(uint32_t offset=0)
{
if(!data||offset>=count)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess::Get() out,offset:")+OSString::valueOf(offset));
2019-05-22 18:10:13 +08:00
return(nullptr);
}
return data+offset*C;
2019-05-22 18:10:13 +08:00
}
/**
* 访
* @param offset 访
* @return 访
*/
2020-07-20 19:18:34 +08:00
T *Begin(uint32_t offset=0)
2019-05-22 18:10:13 +08:00
{
if(access)
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess::Begin() access!=0,offset:")+OSString::valueOf(offset));
2019-05-22 18:10:13 +08:00
return(nullptr);
}
access=Get(offset);
if(access)
start_access=access;
2019-05-22 18:10:13 +08:00
return access;
}
/**
* 访
*/
void End()
{
access=nullptr;
start_access=nullptr;
2019-05-22 18:10:13 +08:00
}
/**
*
* @param vp
* @param number
*/
bool WriteData(const T *vp,const uint32_t number)
{
if(!this->access||this->access+C*number>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess::Write(const T *,number) out,number:")+OSString::valueOf(number));
2019-05-22 18:10:13 +08:00
return(false);
}
memcpy(access,vp,C*number*sizeof(T));
access+=C*number;
return(true);
}
};//class VertexAttribDataAccess
2019-05-22 18:10:13 +08:00
/**
*
*/
template<typename T,VkFormat VKFMT> class VertexAttribDataAccess1:public VertexAttribDataAccess<T,1>
2019-05-22 18:10:13 +08:00
{
public:
using VertexAttribDataAccess<T,1>::VertexAttribDataAccess;
virtual ~VertexAttribDataAccess1()=default;
2019-05-22 18:10:13 +08:00
static VkFormat GetVulkanFormat(){return VKFMT;}
static VertexAttribDataAccess1<T,VKFMT> * Create(VAD *vad)
{
if(!vad)return(nullptr);
if(vad->GetVulkanFormat()!=VKFMT)
return(nullptr);
return(new VertexAttribDataAccess1<T,VKFMT>(vad->GetCount(),(T *)vad->GetData()));
}
2019-05-22 18:10:13 +08:00
/**
*
* @param min_vertex
* @param max_vertex
*/
template<typename V>
void GetBoundingBox(V &min_vertex,V &max_vertex) const
{
T *p=this->data;
//先以corner为最小值,length为最大值求取最小最大值
min_vertex.x=*p++;
max_vertex=min_vertex;
for(uint32_t i=1;i<this->count;i++)
{
if(*p<min_vertex.x)min_vertex.x=*p;
if(*p>max_vertex.x)max_vertex.x=*p;
++p;
}
}
AABB GetAABB()const
{
vec min_point,max_point;
GetBoundingBox(min_point,max_point);
min_point.y=0;
min_point.z=0;
min_point.w=0;
max_point.y=0;
max_point.z=0;
max_point.w=0;
return AABB(min_point,max_point);
}
2019-05-22 18:10:13 +08:00
bool Write(const T v1)
{
if(!this->access||this->access+1>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess1::Write(const T) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v1;
return(true);
}
/**
*
* @param v
* @param count
*/
bool Write(const T v,const uint32_t count)
{
if(!this->access||this->access+count>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess1::Write(const T,")+OSString::valueOf(count)+OS_TEXT(") out"));
2019-05-22 18:10:13 +08:00
return(false);
}
hgl_set(this->access,v,count);
this->access+=count;
return(true);
}
};//class VertexAttribDataAccess1
2019-05-22 18:10:13 +08:00
/**
*
*/
template<typename T,VkFormat VKFMT> class VertexAttribDataAccess2:public VertexAttribDataAccess<T,2>
2019-05-22 18:10:13 +08:00
{
public:
using VertexAttribDataAccess<T,2>::VertexAttribDataAccess;
virtual ~VertexAttribDataAccess2()=default;
static VkFormat GetVulkanFormat(){return VKFMT;}
2019-05-22 18:10:13 +08:00
static VertexAttribDataAccess2<T,VKFMT> * Create(VAD *vad)
{
if(!vad)return(nullptr);
if(vad->GetVulkanFormat()!=VKFMT)
return(nullptr);
return(new VertexAttribDataAccess2<T,VKFMT>(vad->GetCount(),(T *)vad->GetData()));
}
2019-05-22 18:10:13 +08:00
/**
*
* @param min_vertex
* @param max_vertex
*/
template<typename V>
void GetBoundingBox(V &min_vertex,V &max_vertex) const
{
T *p=this->data;
//先以corner为最小值,length为最大值求取最小最大值
min_vertex.x=*p++;
min_vertex.y=*p++;
max_vertex=min_vertex;
for(uint32_t i=1;i<this->count;i++)
{
if(*p<min_vertex.x)min_vertex.x=*p;
if(*p>max_vertex.x)max_vertex.x=*p;
++p;
if(*p<min_vertex.y)min_vertex.y=*p;
if(*p>max_vertex.y)max_vertex.y=*p;
++p;
}
}
AABB GetAABB()const
{
vec min_point,max_point;
GetBoundingBox(min_point,max_point);
min_point.z=0;
min_point.w=0;
max_point.z=0;
max_point.w=0;
return AABB(min_point,max_point);
}
2019-05-22 18:10:13 +08:00
bool Write(const T v1,const T v2)
{
if(!this->access||this->access+2>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess2::Write(const T ,const T) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v1;
*this->access++=v2;
return(true);
}
bool Write(const T *v)
{
if(!this->access||this->access+2>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess2::Write(T *) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=*v++;
*this->access++=*v;
return(true);
}
2019-05-27 22:46:51 +08:00
template<typename V2>
bool Write(const V2 &v)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+2>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess2::Write(vec2 &) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v.x;
*this->access++=v.y;
return(true);
}
/**
*
* @param v
* @param count
*/
2019-05-27 22:46:51 +08:00
template<typename V2>
bool Fill(const V2 &v,const uint32_t count)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+(count<<1)>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess1::Write(const Vector2f &,")+OSString::valueOf(count)+OS_TEXT(") out"));
2019-05-22 18:10:13 +08:00
return(false);
}
for(uint32_t i=0;i<count;i++)
{
*this->access++=v.x;
*this->access++=v.y;
}
return(true);
}
bool WriteLine(const T start_x,const T start_y,const T end_x,const T end_y)
{
if(!this->access||this->access+4>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess2::WriteLine(T,T,T,T) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=start_x;
*this->access++=start_y;
*this->access++=end_x;
*this->access++=end_y;
return(true);
}
2019-05-27 22:46:51 +08:00
template<typename V2>
bool WriteLine(const V2 &start,const V2 &end)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+4>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess2::WriteLine(vec2,vec2) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=start.x;
*this->access++=start.y;
*this->access++=end.x;
*this->access++=end.y;
return(true);
}
/**
* 2D三角形
*/
2019-05-27 22:46:51 +08:00
template<typename V2>
bool WriteTriangle(const V2 &v1,const V2 &v2,const V2 &v3)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+6>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess2::WriteTriangle(vec2,vec2,vec2) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v1.x;
*this->access++=v1.y;
*this->access++=v2.x;
*this->access++=v2.y;
*this->access++=v3.x;
*this->access++=v3.y;
return(true);
}
/**
* 2D三角形
*/
2019-05-27 22:46:51 +08:00
template<typename V2>
bool WriteTriangle(const V2 *v)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+6>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess2::WriteTriangle(vec2 *) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v->x;
*this->access++=v->y;
++v;
*this->access++=v->x;
*this->access++=v->y;
++v;
*this->access++=v->x;
*this->access++=v->y;
return(true);
}
/**
* 2D四边形坐标数据
*/
2019-05-27 22:46:51 +08:00
template<typename V2>
bool WriteQuad(const V2 &lt,const V2 &rt,const V2 &rb,const V2 &lb)
2019-05-22 18:10:13 +08:00
{
if(WriteTriangle(lt,lb,rb))
if(WriteTriangle(lt,rb,rt))
return(true);
LOG_HINT(OS_TEXT("VertexAttribDataAccess2::WriteQuad(vec2 &,vec2 &,vec2 &,vec2 &) error"));
2019-05-22 18:10:13 +08:00
return(false);
}
/**
* 2D矩形
*/
template<typename V>
bool WriteRect(const T left,const T top,const T width,const T height)
{
const vec2<V> lt(left ,top);
const vec2<V> rt(left+width,top);
const vec2<V> rb(left+width,top+height);
const vec2<V> lb(left ,top+height);
return WriteQuad(lt,rt,rb,lb);
}
template<typename V>
bool WriteRect(const RectScope2<V> &scope)
{
return WriteQuad( scope.GetLeftTop(),
scope.GetRightTop(),
scope.GetRightBottom(),
scope.GetLeftBottom());
}
template<typename V>
bool WriteRectFan(const RectScope2<V> &scope)
{
if(!this->access||this->access+8>this->data_end)
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess2::WriteRectFan(RectScope2 *) out"));
return(false);
}
2020-07-31 18:01:28 +08:00
*this->access++=scope.GetLeft();
*this->access++=scope.GetBottom();
2020-07-31 18:01:28 +08:00
*this->access++=scope.GetRight();
*this->access++=scope.GetBottom();
*this->access++=scope.GetRight();
*this->access++=scope.GetTop();
*this->access++=scope.GetLeft();
*this->access++=scope.GetTop();
return(true);
}
template<typename V>
bool WriteRectTriangleStrip(const RectScope2<V> &scope)
{
if(!this->access||this->access+8>this->data_end)
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess2::WriteRectTriangleStrip(RectScope2 *) out"));
return(false);
}
*this->access++=scope.GetLeft();
*this->access++=scope.GetTop();
*this->access++=scope.GetLeft();
*this->access++=scope.GetBottom();
*this->access++=scope.GetRight();
*this->access++=scope.GetTop();
*this->access++=scope.GetRight();
*this->access++=scope.GetBottom();
return(true);
}
};//class VertexAttribDataAccess2
2019-05-22 18:10:13 +08:00
/**
*
*/
template<typename T,VkFormat VKFMT> class VertexAttribDataAccess3:public VertexAttribDataAccess<T,3>
2019-05-22 18:10:13 +08:00
{
public:
using VertexAttribDataAccess<T,3>::VertexAttribDataAccess;
virtual ~VertexAttribDataAccess3()=default;
2019-05-22 18:10:13 +08:00
static VkFormat GetVulkanFormat(){return VKFMT;}
static VertexAttribDataAccess3<T,VKFMT> * Create(VAD *vad)
{
if(!vad)return(nullptr);
2020-07-20 19:18:34 +08:00
if(vad->GetVulkanFormat()!=VKFMT)
return(nullptr);
return(new VertexAttribDataAccess3<T,VKFMT>(vad->GetCount(),(T *)vad->GetData()));
}
2019-05-22 18:10:13 +08:00
/**
*
* @param min_vertex
* @param max_vertex
*/
template<typename V>
void GetBoundingBox(V &min_vertex,V &max_vertex) const
2019-05-22 18:10:13 +08:00
{
T *p=this->data;
2019-05-22 18:10:13 +08:00
//先以corner为最小值,length为最大值求取最小最大值
min_vertex.x=*p++;
min_vertex.y=*p++;
min_vertex.z=*p++;
max_vertex=min_vertex;
for(uint32_t i=1;i<this->count;i++)
{
if(*p<min_vertex.x)min_vertex.x=*p;
if(*p>max_vertex.x)max_vertex.x=*p;
++p;
if(*p<min_vertex.y)min_vertex.y=*p;
if(*p>max_vertex.y)max_vertex.y=*p;
++p;
if(*p<min_vertex.z)min_vertex.z=*p;
if(*p>max_vertex.z)max_vertex.z=*p;
++p;
}
}
AABB GetAABB()const
{
vec min_point,max_point;
GetBoundingBox(min_point,max_point);
min_point.w=0;
max_point.w=0;
return AABB(min_point,max_point);
}
2019-05-22 18:10:13 +08:00
bool Write(const T v1,const T v2,const T v3)
{
if(!this->access||this->access+3>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess3::Write(T,T,T) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v1;
*this->access++=v2;
*this->access++=v3;
return(true);
}
2019-05-27 22:46:51 +08:00
bool Write3(const T *v)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+3>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess3::Write(T *) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=*v++;
*this->access++=*v++;
*this->access++=*v;
return(true);
}
2019-05-27 22:46:51 +08:00
template<typename V3>
bool Write(const V3 &v)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+3>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess3::Write(vec3 &) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v.x;
*this->access++=v.y;
*this->access++=v.z;
return(true);
}
2019-05-27 22:46:51 +08:00
/**
*
* @param v
* @param count
*/
template<typename V3>
bool Fill(const V3 &v,const uint32_t count)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+(count*3)>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess3::Write(const Vector3f,")+OSString::valueOf(count)+OS_TEXT(") out"));
2019-05-22 18:10:13 +08:00
return(false);
}
2019-05-27 22:46:51 +08:00
for(uint32_t i=0;i<count;i++)
{
*this->access++=v.x;
*this->access++=v.y;
*this->access++=v.z;
}
2019-05-22 18:10:13 +08:00
return(true);
}
/**
2019-05-27 22:46:51 +08:00
*
* @param v
* @param count
*/
template<typename V3>
bool Write(const V3 *v,const uint32_t count)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+(count*3)>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess3::Write(const Vector3f,")+OSString::valueOf(count)+OS_TEXT(") out"));
2019-05-22 18:10:13 +08:00
return(false);
}
for(uint32_t i=0;i<count;i++)
{
2019-05-27 22:46:51 +08:00
*this->access++=v->x;
*this->access++=v->y;
*this->access++=v->z;
++v;
2019-05-22 18:10:13 +08:00
}
return(true);
}
bool Write(const Color3f &v)
{
if(!this->access||this->access+3>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess3::Write(color3f &) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v.r;
*this->access++=v.g;
*this->access++=v.b;
return(true);
}
bool WriteLine(const T start_x,const T start_y,const T start_z,const T end_x,const T end_y,const T end_z)
{
if(!this->access||this->access+6>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess3::WriteLine(T,T,T,T,T,T) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=start_x;
*this->access++=start_y;
*this->access++=start_z;
*this->access++=end_x;
*this->access++=end_y;
*this->access++=end_z;
return(true);
}
2019-05-27 22:46:51 +08:00
template<typename V3>
bool WriteLine(const V3 &start,const V3 &end)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+6>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess3::WriteLine(vec3,vec3) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=start.x;
*this->access++=start.y;
*this->access++=start.z;
*this->access++=end.x;
*this->access++=end.y;
*this->access++=end.z;
return(true);
}
/**
* 3D三角形
*/
2019-05-27 22:46:51 +08:00
template<typename V3>
bool WriteTriangle(const V3 &v1,const V3 &v2,const V3 &v3)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+9>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess3::WriteTriangle(vec3,vec3,vec3) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v1.x;
*this->access++=v1.y;
*this->access++=v1.z;
*this->access++=v2.x;
*this->access++=v2.y;
*this->access++=v2.z;
*this->access++=v3.x;
*this->access++=v3.y;
*this->access++=v3.z;
return(true);
}
/**
* 3D三角形
*/
2019-05-27 22:46:51 +08:00
template<typename V3>
bool WriteTriangle(const V3 *v)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+9>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess3::WriteTriangle(vec3 *) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v->x;
*this->access++=v->y;
*this->access++=v->z;
++v;
*this->access++=v->x;
*this->access++=v->y;
*this->access++=v->z;
++v;
*this->access++=v->x;
*this->access++=v->y;
*this->access++=v->z;
return(true);
}
};//class VertexAttribDataAccess3
2019-05-22 18:10:13 +08:00
/**
*
*/
template<typename T,VkFormat VKFMT> class VertexAttribDataAccess4:public VertexAttribDataAccess<T,4>
2019-05-22 18:10:13 +08:00
{
public:
using VertexAttribDataAccess<T,4>::VertexAttribDataAccess;
virtual ~VertexAttribDataAccess4()=default;
static VkFormat GetVulkanFormat(){return VKFMT;}
static VertexAttribDataAccess4<T,VKFMT> * Create(VAD *vad)
{
if(!vad)return(nullptr);
2020-07-20 19:18:34 +08:00
if(vad->GetVulkanFormat()!=VKFMT)
return(nullptr);
2019-05-22 18:10:13 +08:00
return(new VertexAttribDataAccess4<T,VKFMT>(vad->GetCount(),(T *)vad->GetData()));
}
2019-05-22 18:10:13 +08:00
/**
*
* @param min_vertex
* @param max_vertex
*/
template<typename V>
void GetBoundingBox(V &min_vertex,V &max_vertex) const
2019-05-22 18:10:13 +08:00
{
T *p=this->data;
2019-05-22 18:10:13 +08:00
//先以corner为最小值,length为最大值求取最小最大值
min_vertex.x=*p++;
min_vertex.y=*p++;
min_vertex.z=*p++;
++p;
2019-05-22 18:10:13 +08:00
max_vertex=min_vertex;
for(uint32_t i=1;i<this->count;i++)
{
if(*p<min_vertex.x)min_vertex.x=*p;
if(*p>max_vertex.x)max_vertex.x=*p;
++p;
if(*p<min_vertex.y)min_vertex.y=*p;
if(*p>max_vertex.y)max_vertex.y=*p;
++p;
if(*p<min_vertex.z)min_vertex.z=*p;
if(*p>max_vertex.z)max_vertex.z=*p;
++p;
++p;
2019-05-22 18:10:13 +08:00
}
}
AABB GetAABB()const
{
vec min_point,max_point;
GetBoundingBox(min_point,max_point);
min_point.w=0;
max_point.w=0;
return AABB(min_point,max_point);
}
2019-05-22 18:10:13 +08:00
bool Write(const T v1,const T v2,const T v3,const T v4)
{
if(!this->access||this->access+4>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::Write(T,T,T,T) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v1;
*this->access++=v2;
*this->access++=v3;
*this->access++=v4;
return(true);
}
bool Write(const T *v)
{
if(!this->access||this->access+4>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::Write(T *) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=*v++;
*this->access++=*v++;
*this->access++=*v++;
*this->access++=*v;
return(true);
}
2019-05-27 22:46:51 +08:00
template<typename V4>
bool Write(const V4 &v)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+4>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::Write(color4 &) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v.x;
*this->access++=v.y;
*this->access++=v.z;
*this->access++=v.w;
return(true);
}
bool Write(const Color4f &v)
{
if(!this->access||this->access+4>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::Write(color4 &) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v.r;
*this->access++=v.g;
*this->access++=v.b;
*this->access++=v.a;
return(true);
}
2019-05-27 22:46:51 +08:00
bool Fill(const Color4f &v,const uint32_t count)
2019-05-22 18:10:13 +08:00
{
if(count<=0)return(false);
if(!this->access||this->access+(4*count)>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::Write(color4 &,count) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
for(uint32_t i=0;i<count;i++)
{
*this->access++=v.r;
*this->access++=v.g;
*this->access++=v.b;
*this->access++=v.a;
}
return(true);
}
/**
*
* @param v
* @param count
*/
2019-05-27 22:46:51 +08:00
template<typename V4>
bool Fill(const V4 &v,const uint32_t count)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+(count<<2)>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::Write(const Vector4f,")+OSString::valueOf(count)+OS_TEXT(") out"));
2019-05-22 18:10:13 +08:00
return(false);
}
for(uint32_t i=0;i<count;i++)
{
*this->access++=v.x;
*this->access++=v.y;
*this->access++=v.z;
*this->access++=v.w;
}
return(true);
}
2019-05-27 22:46:51 +08:00
/**
*
* @param v
* @param count
*/
template<typename V4>
bool Write(const V4 *v,const uint32_t count)
{
if(!this->access||this->access+(count<<2)>this->data_end)
2019-05-27 22:46:51 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::Write(const Vector4f,")+OSString::valueOf(count)+OS_TEXT(") out"));
2019-05-27 22:46:51 +08:00
return(false);
}
for(uint32_t i=0;i<count;i++)
{
*this->access++=v->x;
*this->access++=v->y;
*this->access++=v->z;
*this->access++=v->w;
++v;
}
return(true);
}
2019-05-22 18:10:13 +08:00
bool WriteLine(const T start_x,const T start_y,const T start_z,const T end_x,const T end_y,const T end_z)
{
if(!this->access||this->access+8>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::WriteLine(T,T,T,T,T,T) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=start_x;
*this->access++=start_y;
*this->access++=start_z;
*this->access++=1.0f;
*this->access++=end_x;
*this->access++=end_y;
*this->access++=end_z;
*this->access++=1.0f;
return(true);
}
2019-05-27 22:46:51 +08:00
template<typename V4>
bool WriteLine(const V4 &start,const V4 &end)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+8>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::WriteLine(vec3,vec3) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=start.x;
*this->access++=start.y;
*this->access++=start.z;
*this->access++=1.0f;
*this->access++=end.x;
*this->access++=end.y;
*this->access++=end.z;
*this->access++=1.0f;
return(true);
}
/**
* 3D三角形
*/
2019-05-27 22:46:51 +08:00
template<typename V4>
bool WriteTriangle(const V4 &v1,const V4 &v2,const V4 &v3)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+12>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::WriteTriangle(vec3,vec3,vec3) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v1.x;
*this->access++=v1.y;
*this->access++=v1.z;
*this->access++=1.0f;
*this->access++=v2.x;
*this->access++=v2.y;
*this->access++=v2.z;
*this->access++=1.0f;
*this->access++=v3.x;
*this->access++=v3.y;
*this->access++=v3.z;
*this->access++=1.0f;
return(true);
}
/**
* 3D三角形
*/
2019-05-27 22:46:51 +08:00
template<typename V4>
bool WriteTriangle(const V4 *v)
2019-05-22 18:10:13 +08:00
{
if(!this->access||this->access+12>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::WriteTriangle(vec3 *) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=v->x;
*this->access++=v->y;
*this->access++=v->z;
*this->access++=1.0f;
++v;
*this->access++=v->x;
*this->access++=v->y;
*this->access++=v->z;
*this->access++=1.0f;
++v;
*this->access++=v->x;
*this->access++=v->y;
*this->access++=v->z;
*this->access++=1.0f;
return(true);
}
/**
* 2D矩形,:Left,Top,Width,Height四个值
*/
template<typename V>
bool WriteRectangle2D(const RectScope2<V> &rect)
{
if(!this->access||this->access+4>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::WriteRectangle2D(RectScope2 ) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
*this->access++=rect.Left;
*this->access++=rect.Top;
*this->access++=rect.Width;
*this->access++=rect.Height;
return(true);
}
/**
* 2D矩形,:Left,Top,Width,Height四个值
*/
template<typename V>
bool WriteRectangle2D(const RectScope2<V> *rect,const uint32_t count)
{
if(!this->access||this->access+(4*count)>this->data_end)
2019-05-22 18:10:13 +08:00
{
LOG_HINT(OS_TEXT("VertexAttribDataAccess4::WriteRectangle2D(RectScope2 *,count) out"));
2019-05-22 18:10:13 +08:00
return(false);
}
for(uint32_t i=0;i<count;i++)
{
*this->access++=rect->Left;
*this->access++=rect->Top;
*this->access++=rect->Width;
*this->access++=rect->Height;
++rect;
}
return(true);
}
};//class VertexAttribDataAccess4
2019-05-22 18:10:13 +08:00
//缓冲区具体数据类型定义
2020-07-31 18:01:28 +08:00
typedef VertexAttribDataAccess1<int8 ,FMT_R8I > VB1i8 ,VB1b;
typedef VertexAttribDataAccess1<int16 ,FMT_R16I > VB1i16 ,VB1s;
typedef VertexAttribDataAccess1<int32 ,FMT_R32I > VB1i32 ,VB1i;
typedef VertexAttribDataAccess1<uint8 ,FMT_R8U > VB1u8 ,VB1ub;
typedef VertexAttribDataAccess1<uint16,FMT_R16U > VB1u16 ,VB1us;
typedef VertexAttribDataAccess1<uint32,FMT_R32U > VB1u32 ,VB1ui;
typedef VertexAttribDataAccess1<float ,FMT_R32F > VB1f;
typedef VertexAttribDataAccess1<double,FMT_R64F > VB1d;
typedef VertexAttribDataAccess2<int8 ,FMT_RG8I > VB2i8 ,VB2b;
typedef VertexAttribDataAccess2<int16 ,FMT_RG16I > VB2i16 ,VB2s;
typedef VertexAttribDataAccess2<int32 ,FMT_RG32I > VB2i32 ,VB2i;
typedef VertexAttribDataAccess2<uint8 ,FMT_RG8U > VB2u8 ,VB2ub;
typedef VertexAttribDataAccess2<uint16,FMT_RG16U > VB2u16 ,VB2us;
typedef VertexAttribDataAccess2<uint32,FMT_RG32U > VB2u32 ,VB2ui;
typedef VertexAttribDataAccess2<float ,FMT_RG32F > VB2f;
typedef VertexAttribDataAccess2<double,FMT_RG64F > VB2d;
// typedef VertexAttribDataAccess3<int8 ,FMT_RGB8I > VB3i8 ,VB3b;
// typedef VertexAttribDataAccess3<int16 ,FMT_RGB16I > VB3i16 ,VB3s;
typedef VertexAttribDataAccess3<int32 ,FMT_RGB32I > VB3i32 ,VB3i;
// typedef VertexAttribDataAccess3<uint8 ,FMT_RGB8U > VB3u8 ,VB3ub;
// typedef VertexAttribDataAccess3<uint16,FMT_RGB16U > VB3u16 ,VB3us;
typedef VertexAttribDataAccess3<uint32,FMT_RGB32U > VB3u32 ,VB3ui;
typedef VertexAttribDataAccess3<float ,FMT_RGB32F > VB3f;
typedef VertexAttribDataAccess3<double,FMT_RGB64F > VB3d;
typedef VertexAttribDataAccess4<int8 ,FMT_RGBA8I > VB4i8 ,VB4b;
typedef VertexAttribDataAccess4<int16 ,FMT_RGBA16I> VB4i16 ,VB4s;
typedef VertexAttribDataAccess4<int32 ,FMT_RGBA32I> VB4i32 ,VB4i;
typedef VertexAttribDataAccess4<uint8 ,FMT_RGBA8U > VB4u8 ,VB4ub;
typedef VertexAttribDataAccess4<uint16,FMT_RGBA16U> VB4u16 ,VB4us;
typedef VertexAttribDataAccess4<uint32,FMT_RGBA32U> VB4u32 ,VB4ui;
typedef VertexAttribDataAccess4<float ,FMT_RGBA32F> VB4f;
typedef VertexAttribDataAccess4<double,FMT_RGBA64F> VB4d;
2019-05-22 18:10:13 +08:00
}//namespace graph
}//namespace hgl
#endif//HGL_GRAPH_VERTEX_ATTRIB_DATA_ACCESS_INCLUDE