-void VertexArray::set_array(unsigned array, unsigned bit, unsigned mask) const
-{
- if((enabled_arrays&mask) && !bit)
- {
- glDisableClientState(array);
- enabled_arrays&=~mask;
- }
- else if(!(enabled_arrays&mask) && bit)
- {
- glEnableClientState(array);
- enabled_arrays|=mask;
+ 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);
+ }