typedef struct{
GLint size;
GLenum type;
GLsizei stride;
GLuchar *pointer;
void (*func)(GLvoid *)
GLuint *index;
}GLArrayNEW;
GLArrayNEW colorArray;
GLArrayNEW normalArray;
GLArrayNEW vertexArray;
GLArrayNEW texcoordArray;
glVertexPointerNEW(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer){
vertexArray.size = size;
vertexArray.type = type;
vertexArray.stride = stride;
vertexArray.pointer = pointer;
switch(type){
case GL_FLOAT :
switch(size){
case 1 : vertexArray.func = glTexcoord1fv; break;
case 2 : vertexArray.func = glTexcoord2fv; break;
case 3 : vertexArray.func = glTexcoord3fv; break;
case 4 : vertexArray.func = gltexcoord4fv; break;
};
break;
case GL_UNSIGNED_INT :
case GL_INT :
switch(size){
case 1 : vertexArray.func = glTexcoord1iv; break;
case 2 : vertexArray.func = glTexcoord2iv; break;
case 3 : vertexArray.func = glTexcoord3iv; break;
case 4 : vertexArray.func = gltexcoord4iv; break;
};
break;
case GL_UNSIGNED_SHORT :
case GL_SHORT :
switch(size){
case 1 : vertexArray.func = glTexcoord1sv; break;
case 2 : vertexArray.func = glTexcoord2sv; break;
case 3 : vertexArray.func = glTexcoord3sv; break;
case 4 : vertexArray.func = gltexcoord4sv; break;
};
break;
case GL_UNSIGNED_BYTE :
case GL_BYTE :
switch(size){
case 1 : vertexArray.func = glTexcoord1cv; break;
case 2 : vertexArray.func = glTexcoord2cv; break;
case 3 : vertexArray.func = glTexcoord3cv; break;
case 4 : vertexArray.func = gltexcoord4cv; break;
};
break;
default : vertexArray.func = NULL;
break;
}
glVertexPointer(size, type, stride, pointer);
}
glNormalPointerNEW(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer){
normalArray.size = size;
normalArray.type = type;
normalArray.stride = stride;
normalArray.pointer = pointer;
switch(type){
case GL_FLOAT : normalArray.func = glNormal3fv; break;
case GL_UNSIGNED_INT :
case GL_INT : normalArray.func = glNormal3iv; break;
case GL_UNSIGNED_SHORT :
case GL_SHORT : normalArray.func = glNormal3sv; break;
case GL_UNSIGNED_BYTE :
case GL_BYTE : normalArray.func = glNormal3cv; break;
default : normalArray.func = NULL;
}
glnormalPointer(size, type, stride, pointer);
}
glColorPointerNEW(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer){
colorArray.size = size;
colorArray.type = type;
colorArray.stride = stride;
colorArray.pointer = pointer;
switch(type){
case GL_FLOAT :
switch(size){
case 1 : colorArray.func = glColor1fv; break;
case 2 : colorArray.func = glColor2fv; break;
case 3 : colorArray.func = glColor3fv; break;
case 4 : colorArray.func = glColor4fv; break;
};
break;
case GL_UNSIGNED_INT :
case GL_INT :
switch(size){
case 1 : colorArray.func = glColor1iv; break;
case 2 : colorArray.func = glColor2iv; break;
case 3 : colorArray.func = glColor3iv; break;
case 4 : colorArray.func = glColor4iv; break;
};
break;
case GL_UNSIGNED_SHORT :
case GL_SHORT :
switch(size){
case 1 : colorArray.func = glColor1sv; break;
case 2 : colorArray.func = glColor2sv; break;
case 3 : colorArray.func = glColor3sv; break;
case 4 : colorArray.func = glColor4sv; break;
};
break;
case GL_UCHAR :
case GL_CHAR :
switch(size){
case 1 : colorArray.func = glColor1cv; break;
case 2 : colorArray.func = glColor2cv; break;
case 3 : colorArray.func = glColor3cv; break;
case 4 : colorArray.func = glColor4cv; break;
};
break;
default : colorArray.func = NULL;
break;
}
glColorPointer(size, type, stride, pointer);
}
glTexcoordArrayNEW(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer){
texcoordArray.size = size;
texcoordArray.type = type;
texcoordArray.stride = stride;
texcoordArray.pointer = pointer;
switch(type){
case GL_FLOAT :
switch(size){
case 1 : texcoordArray.func = glTexcoord1fv; break;
case 2 : texcoordArray.func = glTexcoord2fv; break;
case 3 : texcoordArray.func = glTexcoord3fv; break;
case 4 : texcoordArray.func = glTexcoord4fv; break;
};
break;
case GL_UNSIGNED_INT :
case GL_INT :
switch(size){
case 1 : texcoordArray.func = glTexcoord1iv break;
case 2 : texcoordArray.func = glTexcoord2iv; break;
case 3 : texcoordArray.func = glTexcoord3iv; break;
case 4 : texcoordArray.func = glTexcoord4iv; break;
};
break;
case GL_UNSIGNED_SHORT :
case GL_SHORT :
switch(size){
case 1 : texcoordArray.func = glTexcoord1sv; break;
case 2 : texcoordArray.func = glTexcoord2sv; break;
case 3 : texcoordArray.func = glTexcoord3sv; break;
case 4 : texcoordArray.func = glTexcoord4sv; break;
};
break;
case GL_UNSIGNED_BYTE :
case GL_BYTE :
switch(size){
case 1 : texcoordArray.func = glTexcoord1cv; break;
case 2 : texcoordArray.func = glTexcoord2cv; break;
case 3 : texcoordArray.func = glTexcoord3cv; break;
case 4 : texcoordArray.func = glTexcoord4cv; break;
};
break;
}
glTexcoordPointer(size, type, stride, pointer);
}
glVertexIndexiNEW(GLuint *indices){
vertexArray.index = indices;
}
glNormalIndexiNEW(GLuint *indices){
normalArray.index = indices;
}
glColorIndexiNEW(GLuint *indices){
colorArray.index = indices;
}
glTexcoordIndexiNEW(GLuint *indices){
texcoordArray.index = indices;
}
glArrayElementNEW(GLuint i){
if( texcoordArray.func && texcoordArray.index && texcoordArray.stride )
texcoordArray.func(texcoordArray.pointer+(texcoordArray.index[i]*texcoordArray.stride));
if( colorArray.func && colorArray.index && colorArray.stride )
colorArray.func(colorArray.pointer+(colorArray.index[i]*colorArray.stride));
if(normalArray.func && normalArray.index && normalArray.stride )
normalArray.func(normalArray.pointer+(normalArray.index[i]*normalArray.stride));
if(vertexArray.func && vertexArray.index && vertexArray.stride )
vertexArray.func(vertexArray.pointer+(vertexArray.index[i]*vertexArray.stride));
else
glDrawElement(i);
}
glDrawArraysNEW(GLenum mode, GLint first, GLsizei count){
glBegin(mode);
while(count){
glArrayElementNEW(first);
first++;
count--;
}
glEnd();
}
glDrawElementsEXT(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices){
int i;
GLubyte *pubyte;
GLushort *pushort;
GLuint *puint;
glBegin(mode);
switch(type){
case GL_UNSIGNED_BYTE : pubyte = indices;
for(i=0;i<count;i++)
glArrayElementNEW(*pubyte++);
break;
case GL_UNSIGNED_SHORT : pushort = indices;
for(i=0;i<count;i++)
glArrayElementNEW(*pushort++);
break;
case GL_UNSIGNED_INT : puint = indices;
for(i=0;i<count;i++)
glArrayElementNEW(*puint++);
break;
}
glEnd();
}
Perhaps a beginning for this extension ???