- if(format.empty())
- throw invalid_operation("VertexArray::apply");
-
- const VertexArray *old = current();
- if(!set_current(this))
- return;
-
- if(vbuf)
- {
- vbuf->bind_to(ARRAY_BUFFER);
- if(dirty)
- {
- vbuf->data(data.size()*sizeof(float), &data[0]);
- dirty = false;
- }
- }
-
- const float *base = (vbuf ? 0 : &data[0]);
- unsigned stride_bytes = stride*sizeof(float);
- unsigned active_tex = 0;
- unsigned n_arrays = arrays.size();
- if(old)
- n_arrays = max(n_arrays, old->arrays.size());
- for(unsigned i=0; i<n_arrays; ++i)
- {
- const Array *arr = ((i<arrays.size() && arrays[i].component) ? &arrays[i] : 0);
- const Array *old_arr = ((old && i<old->arrays.size() && old->arrays[i].component) ? &old->arrays[i] : 0);
- if(!arr && !old_arr)
- continue;
-
- unsigned char comp = (arr ? arr->component : old_arr->component);
- unsigned sz = get_component_size(comp);
- unsigned t = get_component_type(comp);
- GLenum array_type = 0;
- if(t==get_component_type(VERTEX3))
- {
- if(arr)
- glVertexPointer(sz, GL_FLOAT, stride_bytes, base+arr->offset);
- array_type = GL_VERTEX_ARRAY;
- }
- else if(t==get_component_type(NORMAL3))
- {
- if(arr)
- glNormalPointer(GL_FLOAT, stride_bytes, base+arr->offset);
- array_type = GL_NORMAL_ARRAY;
- }
- else if(t==get_component_type(COLOR4_FLOAT))
- {
- if(arr)
- {
- if(sz==1)
- glColorPointer(4, GL_UNSIGNED_BYTE, stride_bytes, base+arr->offset);
- else
- glColorPointer(sz, GL_FLOAT, stride_bytes, base+arr->offset);
- }
- array_type = GL_COLOR_ARRAY;
- }
- else if(comp>=TEXCOORD1 && comp<=TEXCOORD4+12)
- {
- t -= get_component_type(TEXCOORD1);
- if(t>0 || active_tex)
- {
- glClientActiveTexture(GL_TEXTURE0+t);
- active_tex = t;
- }
- if(arr)
- glTexCoordPointer(sz, GL_FLOAT, stride_bytes, base+arr->offset);
- array_type = GL_TEXTURE_COORD_ARRAY;
- }
- else
- {
- if(t>=get_component_type(ATTRIB1))
- t -= get_component_type(ATTRIB1);
- if(arr)
- glVertexAttribPointer(t, sz, GL_FLOAT, false, stride_bytes, base+arr->offset);
- }
-
- // Only change enable state if needed
- if(arr && !old_arr)
- {
- if(array_type)
- glEnableClientState(array_type);
- else
- glEnableVertexAttribArray(t);
- }
- else if(old_arr && !arr)
- {
- if(array_type)
- glDisableClientState(array_type);
- else
- glDisableVertexAttribArray(t);
- }
- }
-
- if(active_tex)
- glClientActiveTexture(GL_TEXTURE0);
-
- if(vbuf)
- Buffer::unbind_from(ARRAY_BUFFER);