- if(vbuf)
- {
- vbuf->bind_to(ARRAY_BUFFER);
- if(dirty)
- {
- vbuf->data(data.size()*sizeof(float), &data[0]);
- dirty = false;
- }
- }
+ const VertexArray *old = current();
+ /* If the array has been modified, apply it even if it was the last one to
+ be applied. This is necessary to get the data updated to vertex buffer, and
+ to resync things after a format change. Radeon drivers also have some
+ problems with modifying vertex arrays without re-setting the pointers. */
+ if(!set_current(this) && !dirty)
+ return;
+
+ Buffer *vbuf = get_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);
+}