namespace Msp {
namespace GL {
-VertexArray::VertexArray(const VertexFormat &f):
- dirty(false)
+VertexArray::VertexArray(const VertexFormat &f)
{
reset(f);
}
VertexArray::~VertexArray()
{
+ /* Unbind accesses the current VertexArray, so a call from ~Bindable would
+ try to access destroyed data. */
if(current()==this)
- {
- /* We must deactivate arrays here, or apply() would try to access deleted
- data on the next invocation. */
- set_current(0);
- apply_arrays(0, &arrays, 0, 0);
- }
+ unbind();
}
void VertexArray::reset(const VertexFormat &f)
float *VertexArray::append()
{
data.insert(data.end(), stride, 0.0f);
+ update_offset();
dirty = true;
return &*(data.end()-stride);
}
return data.size()*sizeof(float);
}
-void VertexArray::upload_data() const
-{
- get_buffer()->sub_data(get_offset(), get_data_size(), &data[0]);
-}
-
-void VertexArray::apply() const
+void VertexArray::bind() const
{
if(format.empty())
throw invalid_operation("VertexArray::apply");
return;
Buffer *vbuf = get_buffer();
- if(vbuf)
- {
- vbuf->bind_to(ARRAY_BUFFER);
- if(dirty)
- update_buffer();
- }
+ Bind _bind_vbuf(vbuf, ARRAY_BUFFER);
+ if(vbuf && dirty)
+ update_buffer();
const float *base = (vbuf ? reinterpret_cast<float *>(get_offset()) : &data[0]);
unsigned stride_bytes = stride*sizeof(float);
apply_arrays(&arrays, (old ? &old->arrays : 0), base, stride_bytes);
-
- if(vbuf)
- Buffer::unbind_from(ARRAY_BUFFER);
}
void VertexArray::apply_arrays(const vector<Array> *arrays, const vector<Array> *old_arrays, const float *base, unsigned stride_bytes)
glClientActiveTexture(GL_TEXTURE0);
}
+void VertexArray::unbind()
+{
+ const VertexArray *old = current();
+ if(set_current(0))
+ apply_arrays(0, &old->arrays, 0, 0);
+}
+
VertexArray::Array::Array():
component(0),