X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuffer.cpp;h=fbb1e159ee564df8b2d7816e459adda6312cfc20;hb=2e7f19b895424c3a77940e648639f8df2b395d0f;hp=17ae494f72dc37a0892fdf282af33665d8723c49;hpb=b617c5d7b5283ad260a77f01e42e6170cabbc03d;p=libs%2Fgl.git diff --git a/source/buffer.cpp b/source/buffer.cpp index 17ae494f..fbb1e159 100644 --- a/source/buffer.cpp +++ b/source/buffer.cpp @@ -1,14 +1,10 @@ -/* $Id$ - -This file is part of libmspgl -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - +#include #include "arb_vertex_buffer_object.h" #include "extension.h" #include "buffer.h" +using namespace std; + namespace Msp { namespace GL { @@ -28,18 +24,6 @@ Buffer::~Buffer() glDeleteBuffersARB(1, &id); } -void Buffer::bind(BufferType t) const -{ - glBindBufferARB(t, id); - binding(t) = this; -} - -void Buffer::maybe_bind() const -{ - if(binding(type)!=this) - bind(); -} - void Buffer::set_usage(BufferUsage u) { usage = u; @@ -47,17 +31,31 @@ void Buffer::set_usage(BufferUsage u) void Buffer::data(unsigned size, const void *d) { - maybe_bind(); + const Buffer *old = current(type); + bind(); glBufferDataARB(type, size, d, usage); + restore(old, type); } void Buffer::sub_data(unsigned offset, unsigned size, const void *d) { - maybe_bind(); + const Buffer *old = current(type); + bind(); glBufferSubDataARB(type, offset, size, d); + restore(old, type); } -void Buffer::unbind(BufferType type) +void Buffer::bind_to(BufferType t) const +{ + const Buffer *&ptr = binding(t); + if(ptr!=this) + { + glBindBufferARB(t, id); + ptr = this; + } +} + +void Buffer::unbind_from(BufferType type) { const Buffer *&ptr = binding(type); if(ptr) @@ -75,7 +73,18 @@ const Buffer *&Buffer::binding(BufferType type) case ELEMENT_ARRAY_BUFFER: return bound[1]; case PIXEL_PACK_BUFFER: return bound[2]; case PIXEL_UNPACK_BUFFER: return bound[3]; - default: throw InvalidParameterValue("Invalid buffer type"); + default: throw invalid_argument("Buffer::binding"); + } +} + +void Buffer::restore(const Buffer *buf, BufferType type) +{ + if(buf!=current(type)) + { + if(buf) + buf->bind_to(type); + else + unbind_from(type); } }