X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvertexarray.cpp;h=7716c5b2e4c68f30fcee9ada52213532dec53e29;hb=719578516a4d44a6f39eac3b074ce9f6180b5d53;hp=6d6699020334655edf2f7a899d3636572ee6071e;hpb=4443707c752ab8ee288f1c22be08cf82f27439d7;p=libs%2Fgl.git diff --git a/source/vertexarray.cpp b/source/vertexarray.cpp index 6d669902..7716c5b2 100644 --- a/source/vertexarray.cpp +++ b/source/vertexarray.cpp @@ -1,54 +1,45 @@ -/* $Id$ - -This file is part of libmspgl -Copyright © 2007-2010 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #include "arb_vertex_program.h" +#include "buffer.h" +#include "error.h" #include "extension.h" #include "gl.h" #include "version_1_2.h" +#include "version_1_3.h" #include "vertexarray.h" -#include "vertexbuffer.h" using namespace std; namespace Msp { namespace GL { +VertexArray::ArrayMask VertexArray::enabled_arrays; + VertexArray::VertexArray(const VertexFormat &f): - vbuf(0), - own_vbuf(false) + defer_vbuf(true), + dirty(false) { reset(f); } VertexArray::~VertexArray() -{ - if(own_vbuf) - delete vbuf; -} +{ } void VertexArray::use_vertex_buffer() { - if(vbuf && own_vbuf) + if(vbuf) return; vbuf = new Buffer(ARRAY_BUFFER); - own_vbuf = true; - - update_data(); + defer_vbuf = false; + dirty = true; } void VertexArray::use_vertex_buffer(Buffer *b) { - if(own_vbuf) - delete vbuf; vbuf = b; - own_vbuf = false; - - update_data(); + vbuf.keep(); + defer_vbuf = false; + dirty = true; } void VertexArray::reserve(unsigned n) @@ -85,12 +76,19 @@ void VertexArray::reset(const VertexFormat &f) void VertexArray::apply() const { if(format.empty()) - throw InvalidState("Trying to apply a vertex array with no data"); + throw invalid_operation("VertexArray::apply"); if(vbuf) - vbuf->bind(); + { + vbuf->bind_to(ARRAY_BUFFER); + if(dirty) + { + vbuf->data(data.size()*sizeof(float), &data[0]); + dirty = false; + } + } - const float *base = vbuf?0:&data[0]; + const float *base = (vbuf ? 0 : &data[0]); unsigned offset = 0; ArrayMask found; unsigned bpv = stride*sizeof(float); @@ -158,6 +156,7 @@ void VertexArray::apply() const if(i>3 || active_tex) glClientActiveTexture(GL_TEXTURE0+(i-3)); glDisableClientState(GL_TEXTURE_COORD_ARRAY); + active_tex = i-3; } else glDisableVertexAttribArrayARB(i-11); @@ -169,28 +168,31 @@ void VertexArray::apply() const glClientActiveTexture(GL_TEXTURE0); if(vbuf) - vbuf->unbind(); + Buffer::unbind_from(ARRAY_BUFFER); } -/** -Updates the VertexArray data to the VertexBuffer tied to the array, if any. -*/ -void VertexArray::update_data() +float *VertexArray::append() { - if(vbuf) - { - vbuf->data(data.size()*sizeof(float), &data[0]); - vbuf->unbind(); - } + data.insert(data.end(), stride, 0.0f); + set_dirty(); + return &*(data.end()-stride); } -float *VertexArray::append() +float *VertexArray::modify(unsigned i) { - data.insert(data.end(), stride, 0.0f); - return &*data.end()-stride; + set_dirty(); + return &data[0]+i*stride; } -VertexArray::ArrayMask VertexArray::enabled_arrays; +void VertexArray::set_dirty() +{ + dirty = true; + if(defer_vbuf) + { + vbuf = new Buffer(ARRAY_BUFFER); + defer_vbuf = false; + } +} VertexArray::ArrayMask::ArrayMask() @@ -221,6 +223,10 @@ VertexArray::Loader::Loader(VertexArray &a): add("texcoord2", static_cast(&Loader::texcoord)); add("texcoord3", static_cast(&Loader::texcoord)); add("texcoord4", static_cast(&Loader::texcoord)); + add("multitexcoord1", static_cast(&Loader::multitexcoord)); + add("multitexcoord2", static_cast(&Loader::multitexcoord)); + add("multitexcoord3", static_cast(&Loader::multitexcoord)); + add("multitexcoord4", static_cast(&Loader::multitexcoord)); add("color3", static_cast(&Loader::color)); add("color4", static_cast(&Loader::color)); add("attrib1", static_cast(&Loader::attrib));