/* * This program is under the GNU GPL. * Use at your own risk. * * written by David Bucciarelli (tech.hmw@plus.it) * Humanware s.r.l. */ #include #include #include #include #include #ifdef _WIN32 #include #endif #include #if defined(GL_VERSION_1_1) /* Routines called directly. */ #elif defined(GL_EXT_texture_object) && defined(GL_EXT_copy_texture) && defined(GL_EXT_subtexture) #define glBindTexture(A,B) glBindTextureEXT(A,B) #define glGenTextures(A,B) glGenTexturesEXT(A,B) #define glDeleteTextures(A,B) glDeleteTexturesEXT(A,B) #else #define glBindTexture(A,B) #define glGenTextures(A,B) #define glDeleteTextures(A,B) #endif #include "image.h" static int WIDTH=640; static int HEIGHT=480; #define FRAME 50 #define NUMBLOC 5 /* Some files do not define M_PI... */ #ifndef M_PI #define M_PI 3.14159265358979323846 #endif extern int striplength_skin_13[]; extern float stripdata_skin_13[]; extern int striplength_skin_12[]; extern float stripdata_skin_12[]; extern int striplength_skin_11[]; extern float stripdata_skin_11[]; extern int striplength_skin_9[]; extern float stripdata_skin_9[]; static float obs[3]={1000.0,0.0,2.0}; static float dir[3]; static float v=0.0; static float alpha=90.0; static float beta=90.0; static int fog=1; static int bfcull=1; static int usetex=1; static int cstrip=0; static int help=1; static int joyavailable=0; static int joyactive=0; static GLuint t1id,t2id; static void inittextures(void) { IMAGE *img; GLenum gluerr; glGenTextures(1,&t1id); glBindTexture(GL_TEXTURE_2D,t1id); if(!(img=ImageLoad("tile.rgb"))) { fprintf(stderr,"Error reading a texture.\n"); exit(-1); } glPixelStorei(GL_UNPACK_ALIGNMENT,4); if((gluerr=gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)(img->data)))) { fprintf(stderr,"GLULib%s\n",gluErrorString(gluerr)); exit(-1); } glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_LINEAR); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); glGenTextures(1,&t2id); glBindTexture(GL_TEXTURE_2D,t2id); if(!(img=ImageLoad("bw.rgb"))) { fprintf(stderr,"Error reading a texture.\n"); exit(-1); } glPixelStorei(GL_UNPACK_ALIGNMENT,4); if((gluerr=gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)(img->data)))) { fprintf(stderr,"GLULib%s\n",gluErrorString(gluerr)); exit(-1); } glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_LINEAR); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); } static void drawobjs(int *l, float *f) { int mend,j; if(cstrip) { float r=0.33,g=0.33,b=0.33; for(;(*l)!=0;) { mend=*l++; r+=0.33; if(r>1.0) { r=0.33; g+=0.33; if(g>1.0) { g=0.33; b+=0.33; if(b>1.0) b=0.33; } } glColor3f(r,g,b); glBegin(GL_TRIANGLE_STRIP); for(j=0;jjoy.wXpos) min[0]=joy.wXpos; center[0]=(max[0]+min[0])/2; if(max[1]joy.wYpos) min[1]=joy.wYpos; center[1]=(max[1]+min[1])/2; if(joyactive) { if(fabs(center[0]-(float)joy.wXpos)>0.1*(max[0]-min[0])) alpha-=2.0*(center[0]-(float)joy.wXpos)/(max[0]-min[0]); if(fabs(center[1]-(float)joy.wYpos)>0.1*(max[1]-min[1])) beta+=2.0*(center[1]-(float)joy.wYpos)/(max[1]-min[1]); if(joy.wButtons & JOY_BUTTON1) v+=0.01; if(joy.wButtons & JOY_BUTTON2) v-=0.01; } } else joyavailable=0; #endif } static void draw(void) { static int count=0; static char frbuf[80]; int i; float fr,base,offset; dojoy(); glEnable(GL_DEPTH_TEST); /* if(count & 1) { glDepthRange(1.0,0.5); glDepthFunc(GL_GREATER); } else { glDepthRange(0.0,0.5); glDepthFunc(GL_LESS); } */ /*glClear(GL_COLOR_BUFFER_BIT);*/ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); if(usetex) glEnable(GL_TEXTURE_2D); else glDisable(GL_TEXTURE_2D); if(fog) glEnable(GL_FOG); else glDisable(GL_FOG); glShadeModel(GL_SMOOTH); glPushMatrix(); calcposobs(); gluLookAt(obs[0],obs[1],obs[2], obs[0]+dir[0],obs[1]+dir[1],obs[2]+dir[2], 0.0,0.0,1.0); if(dir[0]>0) { offset=8.0; base=obs[0]-fmod(obs[0],8.0); } else { offset=-8.0; base=obs[0]+(8.0-fmod(obs[0],8.0)); } glPushMatrix(); glTranslatef(base-offset/2.0,0.0,0.0); for(i=0;i