新的BufferObject

This commit is contained in:
hyzboy 2019-03-23 02:25:10 +08:00
parent 095951acd5
commit 6e4e99f56b

View File

@ -1,8 +1,7 @@
#ifndef HGL_GRAPH_BUFFER_OBJECT_INCLUDE
#define HGL_GRAPH_BUFFER_OBJECT_INCLUDE
#include<GLEWCore/glew.h>
#include<hgl/type/DataType.h>
#include<hgl/graph/BufferData.h>
namespace hgl
{
namespace graph
@ -13,59 +12,116 @@ namespace hgl
*/
class BufferObject
{
protected:
GLuint buffer_index; ///<缓冲区索引
GLenum buffer_type; ///<缓冲区类型(GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER等)
GLenum user_pattern; ///<数据存储区使用模式(GL_STATIC_DRAW,GL_DYNAMIC_DRAW等)
GLsizeiptr total_bytes; ///<数据总字节数
void *local_data,*local_data_end; ///<本地数据内存指针
bool self_alloc; ///<是否自身分配
GLsizeiptr buffer_bytes;
const BufferData *buffer_data;
protected:
BufferObject(GLuint index,GLenum type,GLenum up)
friend BufferObject *CreateBuffer(GLenum type,GLenum user_pattern,BufferData *buf);
BufferObject(GLuint index,GLenum type)
{
buffer_index=index;
buffer_type=type;
user_pattern=up;
buffer_type =type;
user_pattern=0;
buffer_bytes=0;
buffer_data=nullptr;
}
BufferObject(GLuint index,GLenum type,GLenum up,void *data,GLsizeiptr size,bool data_self_alloc)
{
buffer_index=index;
buffer_type=type;
user_pattern=up;
public:
total_bytes=size;
virtual ~BufferObject();
local_data=data;
local_data_end=((char *)data)+size;
public:
self_alloc=data_self_alloc;
}
GLuint GetBufferIndex ()const {return buffer_index;} ///<取得OpenGL缓冲区
GLenum GetBufferType ()const {return buffer_type;} ///<取得缓冲区类型
GLenum GetUserPattern ()const {return user_pattern;} ///<取得缓冲区使用方法
virtual ~BufferObject()
{
if(self_alloc)
if(local_data)delete[] local_data;
}
const BufferData *GetBufferData ()const {return buffer_data;} ///<取得缓冲数区(这里返回const是为了不想让只有BufferObject的模块可以修改数据)
GLuint GetBuffer ()const {return buffer_index;} ///<取得OpenGL缓冲区
GLenum GetBufferType ()const {return buffer_type;} ///<取得缓冲区类型
GLenum GetUserPattern ()const {return user_pattern;} ///<取得缓冲区使用方法
GLsizeiptr GetTotalBytes ()const {return total_bytes;} ///<取得数据总字节数
public:
void * GetData () {return data;} ///<取得数据指针
void * GetData (const uint pos) {return ((char *)data)+data_bytes*pos;} ///<取得数据指针
virtual bool Submit (const void *,GLsizeiptr,GLenum user_pattern)=0; ///<提交数据
bool Submit (const BufferData *buf_data,GLenum user_pattern) ///<提交数据
{
if(!buf_data)return(false);
buffer_data=buf_data;
const void * data=buf_data->GetData();
const GLsizeiptr size=buf_data->GetTotalBytes();
if(!data||size<=0)return(false);
return Submit(data,size,user_pattern);
}
virtual bool Change (const void *,GLsizeiptr,GLsizeiptr)=0; ///<修改数据
};//class BufferObject
BufferObject *CreateBuffer(GLenum type)
/**
*
* @param type (GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER等)
* @param user_pattern (GL_STATIC_DRAW,GL_DYNAMIC_DRAW等)
* @param buf
*/
BufferObject *CreateBuffer(GLenum type,GLenum user_pattern=0,BufferData *buf=nullptr);
/**
*
* @param buf_type (GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER等)
* @param user_pattern 使(GL_STATIC_DRAW,GL_DYNAMIC_DRAW等)
* @param total_bytes
*/
inline BufferObject *CreateBuffer( const GLenum &buf_type,
const GLenum &user_pattern,
const GLsizeiptr &total_bytes)
{
BufferObject创建方法buffer index再创建buffer object
buffer object本身与内存镜像数据部分分离buffer object的单纯性
API可用
if(total_bytes<=0)return(nullptr);
BufferObject *buf=CreateBuffer(buf_type);
if(!buf)
return(nullptr);
if(buf->Create(data,total_bytes))
return buf;
delete buf;
return(nullptr);
}
/**
*
* @param buf_type (GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER等)
* @param user_pattern 使(GL_STATIC_DRAW,GL_DYNAMIC_DRAW等)
* @param total_bytes
* @param data
*/
inline BufferObject *CreateBuffer( const GLenum &buf_type,
const GLenum &user_pattern,
const GLsizeiptr &total_bytes,void *data)
{
if(total_bytes<=0)return(nullptr);
if(!data)return(nullptr);
BufferObject *buf=CreateBuffer(buf_type);
if(!buf)
return(nullptr);
if(buf->Submit(data,total_bytes,user_pattern))
return buf;
delete buf;
return(nullptr);
}
}//namespace graph
}//namespace hgl
#endif//HGL_GRAPH_BUFFER_OBJECT_INCLUDE