#ifdef WIN32
#include <windows.h>
#endif
#include <GL/gl.h>
#include "viewperf.h"
#include "vpDefine.h"

void FUNCTION(struct ThreadBlock *tb) {
        int polyi,verti;
	int numverts;
	int polycount = tb->np;
        GLenum mode = tb->mode;
#ifdef BATCH
        int groupi;
        int batchi;
        int leftoveri;
        int batchcount = tb->batchnum;
        int groupcount = tb->batchgroups;
        int leftovercount = tb->batchleftovers;
#endif
#ifdef EXTERNAL
        GLenum capability = tb->capability;
        void (*lExternfunc)(GLenum) = tb->externfunc;
#endif
	int *vertindex;
#ifdef BY_TWO
	int *startvertindex;
#endif

	struct vector *pvert=tb->vert;
	struct plygon *pply=tb->ply;

#ifndef FUNCTION_CALLS
#ifdef WIN32
        void (APIENTRY *glVertex3fvP)(const GLfloat *);
#else
        void (*glVertex3fvP)(const GLfloat *);
#endif
#endif


#if defined(FACET_NORM) || defined(VERT_NORM)
	struct vector *pvnorm=tb->vnorm;
#ifndef FUNCTION_CALLS
#ifdef WIN32
        void (APIENTRY *glNormal3fvP)(const GLfloat *);
#else
        void (*glNormal3fvP)(const GLfloat *);
#endif
#endif  /* ifndef FUNCTION_CALLS */
#endif


#if defined(FACET_COLOR) || defined(VERT_COLOR)
	struct colorvector *pvcolor=tb->vcolor;
#ifndef FUNCTION_CALLS
#ifdef WIN32
        void (APIENTRY *glColorP)(const GLfloat *);
#else
        void (*glColorP)(const GLfloat *);
#endif
#endif  /* ifndef FUNCTION_CALLS */
#endif


#ifdef TEXTURE
	struct vector *ptexture=tb->texture;
#ifndef FUNCTION_CALLS
#ifdef WIN32
        void (APIENTRY *glTexCoord2fvP)(const GLfloat *);
#else
        void (*glTexCoord2fvP)(const GLfloat *);
#endif
        glTexCoord2fvP = glTexCoord2fv;
#endif  /* ifndef FUNCTION_CALLS  */
#endif


#ifndef FUNCTION_CALLS
#if defined(FACET_COLOR) || defined(VERT_COLOR)
        glColorP = tb->ColorP;
#endif
#if defined(FACET_NORM) || defined(VERT_NORM)
        glNormal3fvP = glNormal3fv;
#endif
        glVertex3fvP = glVertex3fv;
#endif  



#ifdef BATCH
        polyi = polycount;
        for(groupi=groupcount-1;groupi>=0;groupi--) {
                glBegin(mode);
                for(batchi=batchcount-1;batchi>=0;batchi--) {
                polyi--;
#else
        for(polyi=polycount-1;polyi>=0;polyi--) {
#endif
		numverts = pply[polyi].numverts;
		vertindex = pply[polyi].index;
#ifdef BY_TWO
		startvertindex = vertindex;
#endif
#ifdef EXTERNAL
                lExternfunc(capability);
#endif
#if    defined(FACET_COLOR) && !defined(FUNCTION_CALLS)
                (*glColorP)((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(FACET_COLOR) &&  defined(FUNCTION_CALLS) && !defined(COLOR4)
                glColor3fv((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(FACET_COLOR) &&  defined(FUNCTION_CALLS) &&  defined(COLOR4)
                glColor4fv((const GLfloat *) (pvcolor + *vertindex));
#endif
#if    defined(FACET_NORM) && !defined(FUNCTION_CALLS)
                (*glNormal3fvP)((const GLfloat *) (pvnorm + *vertindex));
#elif  defined(FACET_NORM) &&  defined(FUNCTION_CALLS)
                glNormal3fv((const GLfloat *) (pvnorm + *vertindex));
#endif
#ifndef BATCH
        		glBegin(mode);
#endif
#if    defined(VERT_COLOR) && !defined(FUNCTION_CALLS)
                	(*glColorP)((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS)  && !defined(COLOR4)
                	glColor3fv((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS)  &&  defined(COLOR4)
                	glColor4fv((const GLfloat *) (pvcolor + *vertindex));
#endif
#if    defined(TEXTURE) && !defined(FUNCTION_CALLS)
                        (*glTexCoord2fvP)((const GLfloat *) (ptexture + *vertindex));
#elif  defined(TEXTURE) &&  defined(FUNCTION_CALLS)
                        glTexCoord2fv((const GLfloat *) (ptexture + *vertindex));
#endif
#if    defined(VERT_NORM) && !defined(FUNCTION_CALLS)
                        (*glNormal3fvP)((const GLfloat *) (pvnorm + *vertindex));
#elif  defined(VERT_NORM) &&  defined(FUNCTION_CALLS)
                        glNormal3fv((const GLfloat *) (pvnorm + *vertindex));
#endif
#ifdef FUNCTION_CALLS
                        glVertex3fv((const GLfloat *) (pvert + *vertindex));
#else
                        (*glVertex3fvP)((const GLfloat *) (pvert + *vertindex));
#endif

#ifdef BY_TWO
			vertindex++;
  #if    defined(VERT_COLOR) && !defined(FUNCTION_CALLS)
                        (*glColorP)((const GLfloat *) (pvcolor + *vertindex));
  #elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS)  && !defined(COLOR4)
                        glColor3fv((const GLfloat *) (pvcolor + *vertindex));
  #elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS)  &&  defined(COLOR4)
                        glColor4fv((const GLfloat *) (pvcolor + *vertindex));
  #endif   
  #if    defined(TEXTURE) && !defined(FUNCTION_CALLS)   
                        (*glTexCoord2fvP)((const GLfloat *) (ptexture + *vertindex));
  #elif  defined(TEXTURE) &&  defined(FUNCTION_CALLS)
                        glTexCoord2fv((const GLfloat *) (ptexture + *vertindex));
  #endif   
  #if    defined(VERT_NORM) && !defined(FUNCTION_CALLS) 
                        (*glNormal3fvP)((const GLfloat *) (pvnorm + *vertindex));
  #elif  defined(VERT_NORM) &&  defined(FUNCTION_CALLS)
                        glNormal3fv((const GLfloat *) (pvnorm + *vertindex));
  #endif   
  #ifdef FUNCTION_CALLS 
                        glVertex3fv((const GLfloat *) (pvert + *vertindex));
  #else 
                        (*glVertex3fvP)((const GLfloat *) (pvert + *vertindex));
  #endif   
#else
			vertindex++;
#endif

#if    defined(VERT_COLOR) && !defined(FUNCTION_CALLS)
                        (*glColorP)((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS)  && !defined(COLOR4)
                        glColor3fv((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS)  &&  defined(COLOR4)
                        glColor4fv((const GLfloat *) (pvcolor + *vertindex));
#endif   
#if    defined(TEXTURE) && !defined(FUNCTION_CALLS)   
                        (*glTexCoord2fvP)((const GLfloat *) (ptexture + *vertindex));
#elif  defined(TEXTURE) &&  defined(FUNCTION_CALLS)
                        glTexCoord2fv((const GLfloat *) (ptexture + *vertindex));
#endif   
#if    defined(VERT_NORM) && !defined(FUNCTION_CALLS) 
                        (*glNormal3fvP)((const GLfloat *) (pvnorm + *vertindex));
#elif  defined(VERT_NORM) &&  defined(FUNCTION_CALLS)
                        glNormal3fv((const GLfloat *) (pvnorm + *vertindex));
#endif   
#ifdef FUNCTION_CALLS 
                        glVertex3fv((const GLfloat *) (pvert + *vertindex));
#else 
                        (*glVertex3fvP)((const GLfloat *) (pvert + *vertindex));
#endif   

#ifdef BY_TWO
			vertindex++;
  #if    defined(VERT_COLOR) && !defined(FUNCTION_CALLS)
                        (*glColorP)((const GLfloat *) (pvcolor + *vertindex));
  #elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS)  && !defined(COLOR4)
                        glColor3fv((const GLfloat *) (pvcolor + *vertindex));
  #elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS)  &&  defined(COLOR4)
                        glColor4fv((const GLfloat *) (pvcolor + *vertindex));
  #endif   
  #if    defined(TEXTURE) && !defined(FUNCTION_CALLS)   
                        (*glTexCoord2fvP)((const GLfloat *) (ptexture + *vertindex));
  #elif  defined(TEXTURE) &&  defined(FUNCTION_CALLS)
                        glTexCoord2fv((const GLfloat *) (ptexture + *vertindex));
  #endif   
  #if    defined(VERT_NORM) && !defined(FUNCTION_CALLS) 
                        (*glNormal3fvP)((const GLfloat *) (pvnorm + *vertindex));
  #elif  defined(VERT_NORM) &&  defined(FUNCTION_CALLS)
                        glNormal3fv((const GLfloat *) (pvnorm + *vertindex));
  #endif   
  #ifdef FUNCTION_CALLS 
                        glVertex3fv((const GLfloat *) (pvert + *vertindex));
  #else 
                        (*glVertex3fvP)((const GLfloat *) (pvert + *vertindex));
  #endif   
#else
			vertindex++;
#endif

#if    defined(VERT_COLOR) && !defined(FUNCTION_CALLS)
                        (*glColorP)((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS)  && !defined(COLOR4)
                        glColor3fv((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS)  &&  defined(COLOR4)
                        glColor4fv((const GLfloat *) (pvcolor + *vertindex));
#endif   
#if    defined(TEXTURE) && !defined(FUNCTION_CALLS)   
                        (*glTexCoord2fvP)((const GLfloat *) (ptexture + *vertindex));
#elif  defined(TEXTURE) &&  defined(FUNCTION_CALLS)
                        glTexCoord2fv((const GLfloat *) (ptexture + *vertindex));
#endif   
#if    defined(VERT_NORM) && !defined(FUNCTION_CALLS) 
                        (*glNormal3fvP)((const GLfloat *) (pvnorm + *vertindex));
#elif  defined(VERT_NORM) &&  defined(FUNCTION_CALLS)
                        glNormal3fv((const GLfloat *) (pvnorm + *vertindex));
#endif   
#ifdef FUNCTION_CALLS 
                        glVertex3fv((const GLfloat *) (pvert + *vertindex));
#else 
                        (*glVertex3fvP)((const GLfloat *) (pvert + *vertindex));
#endif   

#ifdef BY_TWO
  #if    defined(VERT_COLOR) && !defined(FUNCTION_CALLS)
                        (*glColorP)((const GLfloat *) (pvcolor + *startvertindex));
  #elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS)  && !defined(COLOR4)
                        glColor3fv((const GLfloat *) (pvcolor + *startvertindex));
  #elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS)  &&  defined(COLOR4)
                        glColor4fv((const GLfloat *) (pvcolor + *startvertindex));
  #endif
  #if    defined(TEXTURE) && !defined(FUNCTION_CALLS)
                        (*glTexCoord2fvP)((const GLfloat *) (ptexture + *startvertindex));
  #elif  defined(TEXTURE) &&  defined(FUNCTION_CALLS)
                        glTexCoord2fv((const GLfloat *) (ptexture + *startvertindex));
  #endif
  #if    defined(VERT_NORM) && !defined(FUNCTION_CALLS)
                        (*glNormal3fvP)((const GLfloat *) (pvnorm + *startvertindex));
  #elif  defined(VERT_NORM) &&  defined(FUNCTION_CALLS)
                        glNormal3fv((const GLfloat *) (pvnorm + *startvertindex));
  #endif
  #ifdef FUNCTION_CALLS
                        glVertex3fv((const GLfloat *) (pvert + *startvertindex));
  #else
                        (*glVertex3fvP)((const GLfloat *) (pvert + *startvertindex));
  #endif
#endif

#ifndef BATCH
        		glEnd();
#endif
        }
#ifdef BATCH
        glEnd();
        }
        glBegin(mode);
        for(leftoveri=leftovercount-1;leftoveri>=0;leftoveri--) {
                polyi--;
                numverts = pply[polyi].numverts;
                vertindex = pply[polyi].index;
#ifdef BY_TWO
		startvertindex = vertindex;
#endif

#if    defined(FACET_COLOR) && !defined(FUNCTION_CALLS)
                (*glColorP)((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(FACET_COLOR) &&  defined(FUNCTION_CALLS) && !defined(COLOR4)
                glColor3fv((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(FACET_COLOR) &&  defined(FUNCTION_CALLS) &&  defined(COLOR4)
                glColor4fv((const GLfloat *) (pvcolor + *vertindex));
#endif
#if    defined(FACET_NORM) && !defined(FUNCTION_CALLS)
                (*glNormal3fvP)((const GLfloat *) (pvnorm + *vertindex));
#elif  defined(FACET_NORM) &&  defined(FUNCTION_CALLS)
                glNormal3fv((const GLfloat *) (pvnorm + *vertindex));
#endif
#if    defined(VERT_COLOR) && !defined(FUNCTION_CALLS)
                	(*glColorP)((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS) && !defined(COLOR4)
                	glColor3fv((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS) &&  defined(COLOR4)
                	glColor4fv((const GLfloat *) (pvcolor + *vertindex));
#endif
#if    defined(TEXTURE) && !defined(FUNCTION_CALLS)
                        (*glTexCoord2fvP)((const GLfloat *) (ptexture + *vertindex));
#elif  defined(TEXTURE) &&  defined(FUNCTION_CALLS)
                        glTexCoord2fv((const GLfloat *) (ptexture + *vertindex));
#endif
#if    defined(VERT_NORM) && !defined(FUNCTION_CALLS)
                        (*glNormal3fvP)((const GLfloat *) (pvnorm + *vertindex));
#elif  defined(VERT_NORM) &&  defined(FUNCTION_CALLS)
                        glNormal3fv((const GLfloat *) (pvnorm + *vertindex));
#endif
#ifdef FUNCTION_CALLS
                        glVertex3fv((const GLfloat *) (pvert + *vertindex));
#else
                        (*glVertex3fvP)((const GLfloat *) (pvert + *vertindex));
#endif

#ifdef BY_TWO
			vertindex++;
  #if    defined(VERT_COLOR) && !defined(FUNCTION_CALLS)
                        (*glColorP)((const GLfloat *) (pvcolor + *vertindex));
  #elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS) && !defined(COLOR4)
                        glColor3fv((const GLfloat *) (pvcolor + *vertindex));
  #elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS) &&  defined(COLOR4)
                        glColor4fv((const GLfloat *) (pvcolor + *vertindex));
  #endif
  #if    defined(TEXTURE) && !defined(FUNCTION_CALLS)   
                        (*glTexCoord2fvP)((const GLfloat *) (ptexture + *vertindex));
  #elif  defined(TEXTURE) &&  defined(FUNCTION_CALLS)
                        glTexCoord2fv((const GLfloat *) (ptexture + *vertindex));
  #endif   
  #if    defined(VERT_NORM) && !defined(FUNCTION_CALLS) 
                        (*glNormal3fvP)((const GLfloat *) (pvnorm + *vertindex));
  #elif  defined(VERT_NORM) &&  defined(FUNCTION_CALLS)
                        glNormal3fv((const GLfloat *) (pvnorm + *vertindex));
  #endif   
  #ifdef FUNCTION_CALLS 
                        glVertex3fv((const GLfloat *) (pvert + *vertindex));
  #else 
                        (*glVertex3fvP)((const GLfloat *) (pvert + *vertindex));
  #endif   
#else
			vertindex++;
#endif

#if    defined(VERT_COLOR) && !defined(FUNCTION_CALLS)
                        (*glColorP)((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS) && !defined(COLOR4)
                        glColor3fv((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS) &&  defined(COLOR4)
                        glColor4fv((const GLfloat *) (pvcolor + *vertindex));
#endif
#if    defined(TEXTURE) && !defined(FUNCTION_CALLS)   
                        (*glTexCoord2fvP)((const GLfloat *) (ptexture + *vertindex));
#elif  defined(TEXTURE) &&  defined(FUNCTION_CALLS)
                        glTexCoord2fv((const GLfloat *) (ptexture + *vertindex));
#endif   
#if    defined(VERT_NORM) && !defined(FUNCTION_CALLS) 
                        (*glNormal3fvP)((const GLfloat *) (pvnorm + *vertindex));
#elif  defined(VERT_NORM) &&  defined(FUNCTION_CALLS)
                        glNormal3fv((const GLfloat *) (pvnorm + *vertindex));
#endif   
#ifdef FUNCTION_CALLS 
                        glVertex3fv((const GLfloat *) (pvert + *vertindex));
#else 
                        (*glVertex3fvP)((const GLfloat *) (pvert + *vertindex));
#endif  
 
#ifdef BY_TWO
			vertindex++;

  #if    defined(VERT_COLOR) && !defined(FUNCTION_CALLS)
                        (*glColorP)((const GLfloat *) (pvcolor + *vertindex));
  #elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS) && !defined(COLOR4)
                        glColor3fv((const GLfloat *) (pvcolor + *vertindex));
  #elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS) &&  defined(COLOR4)
                        glColor4fv((const GLfloat *) (pvcolor + *vertindex));
  #endif
  #if    defined(TEXTURE) && !defined(FUNCTION_CALLS)   
                        (*glTexCoord2fvP)((const GLfloat *) (ptexture + *vertindex));
  #elif  defined(TEXTURE) &&  defined(FUNCTION_CALLS)
                        glTexCoord2fv((const GLfloat *) (ptexture + *vertindex));
  #endif   
  #if    defined(VERT_NORM) && !defined(FUNCTION_CALLS) 
                        (*glNormal3fvP)((const GLfloat *) (pvnorm + *vertindex));
  #elif  defined(VERT_NORM) &&  defined(FUNCTION_CALLS)
                        glNormal3fv((const GLfloat *) (pvnorm + *vertindex));
  #endif   
  #ifdef FUNCTION_CALLS 
                        glVertex3fv((const GLfloat *) (pvert + *vertindex));
  #else 
                        (*glVertex3fvP)((const GLfloat *) (pvert + *vertindex));
  #endif   
#else
			vertindex++;
#endif


#if    defined(VERT_COLOR) && !defined(FUNCTION_CALLS)
                        (*glColorP)((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS) && !defined(COLOR4)
                        glColor3fv((const GLfloat *) (pvcolor + *vertindex));
#elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS) &&  defined(COLOR4)
                        glColor4fv((const GLfloat *) (pvcolor + *vertindex));
#endif
#if    defined(TEXTURE) && !defined(FUNCTION_CALLS)   
                        (*glTexCoord2fvP)((const GLfloat *) (ptexture + *vertindex));
#elif  defined(TEXTURE) &&  defined(FUNCTION_CALLS)
                        glTexCoord2fv((const GLfloat *) (ptexture + *vertindex));
#endif   
#if    defined(VERT_NORM) && !defined(FUNCTION_CALLS) 
                        (*glNormal3fvP)((const GLfloat *) (pvnorm + *vertindex));
#elif  defined(VERT_NORM) &&  defined(FUNCTION_CALLS)
                        glNormal3fv((const GLfloat *) (pvnorm + *vertindex));
#endif   
#ifdef FUNCTION_CALLS 
                        glVertex3fv((const GLfloat *) (pvert + *vertindex));
#else 
                        (*glVertex3fvP)((const GLfloat *) (pvert + *vertindex));
#endif   

#ifdef BY_TWO
  #if    defined(VERT_COLOR) && !defined(FUNCTION_CALLS)
                        (*glColorP)((const GLfloat *) (pvcolor + *startvertindex));
  #elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS) && !defined(COLOR4)
                        glColor3fv((const GLfloat *) (pvcolor + *startvertindex));
  #elif  defined(VERT_COLOR) &&  defined(FUNCTION_CALLS) &&  defined(COLOR4)
                        glColor4fv((const GLfloat *) (pvcolor + *startvertindex));
  #endif
  #if    defined(TEXTURE) && !defined(FUNCTION_CALLS)
                        (*glTexCoord2fvP)((const GLfloat *) (ptexture + *startvertindex));
  #elif  defined(TEXTURE) &&  defined(FUNCTION_CALLS)
                        glTexCoord2fv((const GLfloat *) (ptexture + *startvertindex));
  #endif
  #if    defined(VERT_NORM) && !defined(FUNCTION_CALLS)
                        (*glNormal3fvP)((const GLfloat *) (pvnorm + *startvertindex));
  #elif  defined(VERT_NORM) &&  defined(FUNCTION_CALLS)
                        glNormal3fv((const GLfloat *) (pvnorm + *startvertindex));
  #endif
  #ifdef FUNCTION_CALLS
                        glVertex3fv((const GLfloat *) (pvert + *startvertindex));
  #else
                        (*glVertex3fvP)((const GLfloat *) (pvert + *startvertindex));
  #endif
#endif

}
glEnd();
#endif
}



