X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=inline;f=progs%2Fdemos%2Fteapot.c;h=38ede7ac3e16c40fe053f52c38e4480be39faa0c;hb=ee88fff4323506772be65e0febc457e2c8543235;hp=addee03a3da7e531cc6a7286bb4ea01c5c0cd11f;hpb=5b0a7f397104ff1938908410b422e529120acde5;p=mesa.git diff --git a/progs/demos/teapot.c b/progs/demos/teapot.c index addee03a3da..38ede7ac3e1 100644 --- a/progs/demos/teapot.c +++ b/progs/demos/teapot.c @@ -10,14 +10,14 @@ #include #include #include +#include #ifdef WIN32 #include #endif #include -#include "../util/readtex.c" -#include "shadow.c" +#include "readtex.h" #ifdef XMESA #include "GL/xmesa.h" @@ -27,7 +27,8 @@ static int fullscreen=1; static int WIDTH=640; static int HEIGHT=480; -#define FRAME 50 +static GLint T0 = 0; +static GLint Frames = 0; #define BASESIZE 10.0 @@ -65,20 +66,84 @@ static int joyactive=0; static GLuint t1id,t2id; static GLuint teapotdlist,basedlist,lightdlist; -static float gettime(void) + + +/******************** begin shadow code ********************/ + +/* Taken from the projshadow.c - by Tom McReynolds, SGI */ + +/* Modified by David Bucciarelli */ + +enum { + X, Y, Z, W +}; +enum { + A, B, C, D +}; + +/* create a matrix that will project the desired shadow */ +void +shadowmatrix(GLfloat shadowMat[4][4], + GLfloat groundplane[4], + GLfloat lightpos[4]) +{ + GLfloat dot; + + /* find dot product between light position vector and ground plane normal */ + dot = groundplane[X] * lightpos[X] + + groundplane[Y] * lightpos[Y] + + groundplane[Z] * lightpos[Z] + + groundplane[W] * lightpos[W]; + + shadowMat[0][0] = dot - lightpos[X] * groundplane[X]; + shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y]; + shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z]; + shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W]; + + shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X]; + shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y]; + shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z]; + shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W]; + + shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X]; + shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y]; + shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z]; + shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W]; + + shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X]; + shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y]; + shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z]; + shadowMat[3][3] = dot - lightpos[W] * groundplane[W]; + +} + +/* find the plane equation given 3 points */ +void +findplane(GLfloat plane[4], + GLfloat v0[3], GLfloat v1[3], GLfloat v2[3]) { - static clock_t told=0; - clock_t tnew,ris; + GLfloat vec0[3], vec1[3]; - tnew=clock(); + /* need 2 vectors to find cross product */ + vec0[X] = v1[X] - v0[X]; + vec0[Y] = v1[Y] - v0[Y]; + vec0[Z] = v1[Z] - v0[Z]; - ris=tnew-told; + vec1[X] = v2[X] - v0[X]; + vec1[Y] = v2[Y] - v0[Y]; + vec1[Z] = v2[Z] - v0[Z]; - told=tnew; + /* find cross product to get A, B, and C of plane equation */ + plane[A] = vec0[Y] * vec1[Z] - vec0[Z] * vec1[Y]; + plane[B] = -(vec0[X] * vec1[Z] - vec0[Z] * vec1[X]); + plane[C] = vec0[X] * vec1[Y] - vec0[Y] * vec1[X]; - return(ris/(float)CLOCKS_PER_SEC); + plane[D] = -(plane[A] * v0[X] + plane[B] * v0[Y] + plane[C] * v0[Z]); } +/******************** end shadow code ********************/ + + static void calcposobs(void) { dir[0]=sin(alpha*M_PI/180.0); @@ -185,13 +250,13 @@ static void printhelp(void) printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Help"); glRasterPos2i(60,390); - printstring(GLUT_BITMAP_TIMES_ROMAN_24,"h - Togle Help"); + printstring(GLUT_BITMAP_TIMES_ROMAN_24,"h - Toggle Help"); glRasterPos2i(60,360); - printstring(GLUT_BITMAP_TIMES_ROMAN_24,"t - Togle Textures"); + printstring(GLUT_BITMAP_TIMES_ROMAN_24,"t - Toggle Textures"); glRasterPos2i(60,330); - printstring(GLUT_BITMAP_TIMES_ROMAN_24,"f - Togle Fog"); + printstring(GLUT_BITMAP_TIMES_ROMAN_24,"f - Toggle Fog"); glRasterPos2i(60,300); - printstring(GLUT_BITMAP_TIMES_ROMAN_24,"b - Togle Back face culling"); + printstring(GLUT_BITMAP_TIMES_ROMAN_24,"b - Toggle Back face culling"); glRasterPos2i(60,270); printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Arrow Keys - Rotate"); glRasterPos2i(60,240); @@ -201,18 +266,22 @@ static void printhelp(void) glRasterPos2i(60,180); if(joyavailable) - printstring(GLUT_BITMAP_TIMES_ROMAN_24,"j - Togle jostick control (Joystick control available)"); + printstring(GLUT_BITMAP_TIMES_ROMAN_24,"j - Toggle jostick control (Joystick control available)"); else printstring(GLUT_BITMAP_TIMES_ROMAN_24,"(No Joystick control available)"); } static void drawbase(void) { + static const GLfloat amb[4] = { 1, .5, 0.2, 1 }; + static const GLfloat diff[4] = { 1, .4, 0.2, 1 }; int i,j; float x,y,dx,dy; glBindTexture(GL_TEXTURE_2D,t1id); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, amb); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff); dx=BASESIZE/BASERES; dy=-BASESIZE/BASERES; for(y=BASESIZE/2.0,j=0;j= 2000) { + GLfloat seconds = (t - T0) / 1000.0; + GLfloat fps = Frames / seconds; + sprintf(frbuf, "Frame rate: %f", fps); + T0 = t; + Frames = 0; + } + } } static void inittextures(void) { - GLenum gluerr; - glGenTextures(1,&t1id); glBindTexture(GL_TEXTURE_2D,t1id); @@ -432,11 +508,26 @@ static void inittextures(void) glGenTextures(1,&t2id); glBindTexture(GL_TEXTURE_2D,t2id); + glPixelTransferf(GL_RED_SCALE, 0.75); + glPixelTransferf(GL_RED_BIAS, 0.25); + glPixelTransferf(GL_GREEN_SCALE, 0.75); + glPixelTransferf(GL_GREEN_BIAS, 0.25); + glPixelTransferf(GL_BLUE_SCALE, 0.75); + glPixelTransferf(GL_BLUE_BIAS, 0.25); + if (!LoadRGBMipmaps("../images/bw.rgb", GL_RGB)) { fprintf(stderr,"Error reading a texture.\n"); exit(-1); } + glPixelTransferf(GL_RED_SCALE, 1.0); + glPixelTransferf(GL_RED_BIAS, 0.0); + glPixelTransferf(GL_GREEN_SCALE, 1.0); + glPixelTransferf(GL_GREEN_BIAS, 0.0); + glPixelTransferf(GL_BLUE_SCALE, 1.0); + glPixelTransferf(GL_BLUE_BIAS, 0.0); + + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); @@ -448,17 +539,26 @@ static void inittextures(void) static void initlight(void) { - float lamb[4]={0.2,0.2,0.2,1.0}; - float lspec[4]={1.0,1.0,1.0,1.0}; + float matamb[4] ={0.5, 0.5, 0.5, 1.0}; + float matdiff[4]={0.9, 0.2, 0.2, 1.0}; + float matspec[4]={1.0,1.0,1.0,1.0}; + + float lamb[4] ={1.5, 1.5, 1.5, 1.0}; + float ldiff[4]={1.0, 1.0, 1.0, 1.0}; + float lspec[4]={1.0, 1.0, 1.0, 1.0}; glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,70.0); glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,20.0); glLightfv(GL_LIGHT0,GL_AMBIENT,lamb); + glLightfv(GL_LIGHT0,GL_DIFFUSE,ldiff); glLightfv(GL_LIGHT0,GL_SPECULAR,lspec); - glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,20.0); - glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,lspec); + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 15.0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matdiff); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matspec); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matamb); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lamb); glEnable(GL_LIGHT0); }