- set_array(GL_VERTEX_ARRAY, found&1, 1);
- set_array(GL_NORMAL_ARRAY, found&2, 2);
- set_array(GL_TEXTURE_COORD_ARRAY, found&4, 4);
- set_array(GL_COLOR_ARRAY, found&8, 8);
- for(unsigned i=4; i<32; ++i)
- set_array(i-4, (found>>i)&1, 1<<i);
+ const float *base = (vbuf ? 0 : &data[0]);
+ unsigned offset = 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)
+ {
+ unsigned char arr = (i<arrays.size() ? arrays[i] : 0);
+ unsigned char old_arr = (old && i<old->arrays.size() ? old->arrays[i] : 0);
+ if(!arr && !old_arr)
+ continue;
+
+ unsigned char comp = (arr ? arr : old_arr);
+ 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+offset);
+ array_type = GL_VERTEX_ARRAY;
+ }
+ else if(t==get_component_type(NORMAL3))
+ {
+ if(arr)
+ glNormalPointer(GL_FLOAT, stride_bytes, base+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+offset);
+ else
+ glColorPointer(sz, GL_FLOAT, stride_bytes, base+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+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+offset);
+ }