00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <GLEXT/GLVertexBufferObject.h>
00022 #include <GLEXT/GLStateExtension.h>
00023 #include <common/DefinesAssert.h>
00024 #include <common/Logger.h>
00025
00026 GLVertexBufferObject::GLVertexBufferObject(bool indexbuffer) :
00027 id_(0), size_(0), mapped_(false),
00028 target_(indexbuffer ? GL_ELEMENT_ARRAY_BUFFER_ARB : GL_ARRAY_BUFFER_ARB)
00029 {
00030 DIALOG_ASSERT(GLStateExtension::hasVBO());
00031
00032 glGenBuffersARB(1, &id_);
00033 }
00034
00035 GLVertexBufferObject::~GLVertexBufferObject()
00036 {
00037 if (mapped_) unmap();
00038 glDeleteBuffersARB(1, &id_);
00039 }
00040
00041 void GLVertexBufferObject::init_data(unsigned size, const void* data, int usage)
00042 {
00043 size_ = size;
00044 bind();
00045 glBufferDataARB(target_, size_, data, usage);
00046 unbind();
00047 }
00048
00049 void GLVertexBufferObject::init_sub_data(unsigned offset, unsigned subsize, const void* data)
00050 {
00051 bind();
00052 glBufferSubDataARB(target_, offset, subsize, data);
00053 unbind();
00054 }
00055
00056 void GLVertexBufferObject::bind() const
00057 {
00058 glBindBufferARB(target_, id_);
00059 }
00060
00061 void GLVertexBufferObject::unbind() const
00062 {
00063 glBindBufferARB(target_, 0);
00064 }
00065
00066 void* GLVertexBufferObject::map(int access)
00067 {
00068 DIALOG_ASSERT(!mapped_);
00069 bind();
00070 void* addr = glMapBufferARB(target_, access);
00071 DIALOG_ASSERT(addr);
00072 mapped_ = true;
00073
00074 return addr;
00075 }
00076
00077 void GLVertexBufferObject::unmap()
00078 {
00079 DIALOG_ASSERT(mapped_)
00080 mapped_ = false;
00081 bind();
00082
00083 if (glUnmapBufferARB(target_) != GL_TRUE)
00084 {
00085 Logger::log("failed to unmap Vertex Buffer object, data invalid");
00086 }
00087 }