/****************************************************************/ /* code copyright 1995-1996 Andrew Johnson - ALL RIGHTS RESERVED*/ /* ajohnson@eecs.uic.edu */ /* */ /* Electronic Visualization Lab (M/C 154) */ /* University of Illinois at Chicago */ /* 851 South Morgan St. Room 1120 SEO */ /* Chicago, IL 60607-7053 */ /* */ /* (312) 996-3002 (312) 413-7585 FAX */ /***********************************************************************/ /* graphics.c v 1.3 */ /* high level graphics routines for battalion */ /***********************************************************************/ #include "battalion.h" /*************/ /* colours */ /*************/ float colorolive[4] = {0, 0.34, 0.0, 0.0}; float planeGreen[4] = {0.21, 0.49, 0.0, 0.0}; float planeGreen2[4] = {0.25, 0.60, 0.0, 0.0}; float planeGreen3[4] = {0.10, 0.25, 0.0, 0.0}; float colorgreen[4] = {0.0, 0.9, 0.1, 0.0}; float colorblack[4] = {0.2, 0.2, 0.2, 0.95}; float colorred[4] = {0.98, 0.17, 0.0, 0.7}; float colorred_50[4] = {0.49, 0.085, 0.0, 0.7}; /* colorred * 0.5 */ float colorred2[4] = {1.0, 0.0, 0.0, 0.0}; float colorred3[4] = {0.5, 0.08, 0.0, 0.7}; float colormaserblue[4] = {0.3, 0.7, 1.0, 0.75}; float colormaserblue2[4] = {0.0, 1.0, 1.0, 0.75}; float colorwhite[4] = {1.0, 1.0, 1.0, 0.2}; float colorwhite2[4] = {1.0, 1.0, 1.0, 0.4}; /* dying vapour */ float colorsnow[4] = {0.8, 0.8, 0.9, 0.4}; float colorsnow2[4] = {0.7, 0.7, 0.8, 0.4}; float colorgrey1[4] = {0.5, 0.5, 0.5, 0.8}; float colorgrey1_50[4] = {0.25, 0.25, 0.25, 0.4}; /* colorgrey * 0.5 */ float colorgrey2[4] = {0.7, 0.7, 0.7, 0.0}; float colorgrey3[4] = {0.6, 0.6, 0.6, 0.0}; float colorgrey3_50[4] = {0.3, 0.3, 0.3, 0.0}; /* colorgrey3 * 0.5 */ float colorgrey4[4] = {0.55, 0.55, 0.55, 0.0}; float colorbrown[4] = {0.75, 0.33, 0.0, 0.8}; float colorbeige[4] = {0.75, 0.75, 0.5, 0.7}; float colorblue[4] = {0.0, 0.0, 1.0, 0.6}; float colorblue2[4] = {0.0, 0.0, 0.7, 0.0}; float colorwater[4] = {0.0, 0.25, 0.5, 0.0}; float colorsnowvapour[4] = {0.3, 0.3, 1.0, 0.4}; float coloryellow[4] = {1.0, 1.0, 0.0, 0.0}; float colormaseryellow[4] = {1.0, 0.7, 0.0, 0.0}; float colororange[4] = {1.0, 0.7, 0.0, 0.0}; float healthGreen[4] = {0.21, 0.49, 0.0, 0.0}; float treeColor[4] = {0.03, 0.34, 0.025, 0}; float treeColor2[4] = {0.05, 0.4, 0.025, 0}; /*************/ /* objects */ /*************/ GLuint plaintank, slagtank, masertank, slagmasertank, launchertank, slaglaunchertank, helo, slagHelo, bigRotor, smallRotor, propeller, airplaneBody, fighterBody, monsterleg, monsterHead, monsterTail, monsterBody, monsterSimpleHead, monsterSimpleTail, flutterHead, techsBody, techsHead, techsShadow, techsSimpleBody, techsSimpleHead, watershellObj, heroshellObj, tankShadow, planeShadow, fighterShadow, flutterShadow, flutterBody, flutterXMas, flutterWing1, flutterWing2, planeDotsObj, planeDotsObjD0, shellObj, shell2Obj, titleObj, titleObjOO, titleObjOOO, lowDPlane, highDPlane, bigPlane, roundTreeShadow, boom1Obj, boom2Obj, boom3Obj, boom4Obj, boom5Obj, boom6Obj, boom7Obj, boom8Obj, boom9Obj, boom10Obj, boom1ObjD0, boom2ObjD0, boom3ObjD0, boom4ObjD0, boom5ObjD0, boom6ObjD0, boom7ObjD0, boom8ObjD0, boom9ObjD0, boom10ObjD0, strip1Obj, strip2Obj, strip3Obj, strip1ObjD0, strip2ObjD0, strip3ObjD0, powerTower, genericWindows, building1Obj, building2Obj, building7Obj, building9Obj, building9ObjOO, building10Obj, building12Obj, building14Obj, building19Obj, building20Obj, building21Obj, building31Obj, building32Obj, building5Obj, building1ObjD0, building2ObjD0, building5ObjD0, building12ObjD0, building19ObjD0, building20ObjD0, building21ObjD0; /***************************/ /* texture mapping stuff */ /***************************/ GLuint leftScreen, rightScreen; GLuint treeWood, roadtex, officeLogo; char picleft[32400], picright[32400]; /* 180 x 180 tmap arrays*/ /* only 128 x 128 in use now */ char officeLogoData[32400]; char treeWoodData[5000]; char roadtexData[5000]; struct road roadsOnPlane[MAXROADSONPLANE]; /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void doTexStuff(char * dataPath, char * fileName, int width, int height, char * TheArray, GLuint * theObj, int interpolation, int repeat) { register int x, y; char fullPath[MAXPATH]; int arrayLoc; FILE * imageFile; strcpy(fullPath, dataPath); strcat(fullPath, fileName); imageFile = fopen(fullPath, "r"); if (imageFile == NULL) showError("Cannot find texture file in data directory"); else { for (y = 0; y < height; y++) for (x = 0; x < width; x++) { arrayLoc = (height-1-y) * width + (width-1-x); TheArray[arrayLoc] = (char) fgetc(imageFile); } *theObj = glGenLists(1); glNewList(*theObj, GL_COMPILE); glTexImage2D(GL_TEXTURE_2D, 0, 1, width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, (const GLvoid *) TheArray); if (repeat) { glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } else { glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); } if (interpolation) { glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } else { glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); } glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glEndList(); fclose(imageFile); } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* create the objects to be used in the game */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void makeObjects(char * dataPath) { GLfloat lineWidthNow; GLenum code; /********************/ /* load in textures */ /********************/ do { code = glGetError(); } while (code != GL_NO_ERROR); #ifdef MACVERSION /* this line generates a GLenum error under the mac mesa 68k version, but not oddly enough in the mac PPC version - it may be because it is the first OpenGL call*/ doTexStuff(dataPath, "TEXTURES:screenleft.tex", 128, 128, picleft, &leftScreen, 0, 0); doTexStuff(dataPath, "TEXTURES:screenright.tex", 128, 128, picright, &rightScreen, 0, 0); doTexStuff(dataPath, "TEXTURES:treewood.tex", 64, 64, treeWoodData, &treeWood, 1, 0); doTexStuff(dataPath, "TEXTURES:road.tex", 64, 64, roadtexData, &roadtex, 1, 0); #else doTexStuff(dataPath, "TEXTURES/screenleft.tex", 128, 128, picleft, &leftScreen, 0, 0); doTexStuff(dataPath, "TEXTURES/screenright.tex", 128, 128, picright, &rightScreen, 0, 0); doTexStuff(dataPath, "TEXTURES/treewood.tex", 64, 64, treeWoodData, &treeWood, 1, 0); doTexStuff(dataPath, "TEXTURES/road.tex", 64, 64, roadtexData, &roadtex, 1, 0); #endif /* doTexStuff(dataPath,"TEXTURES/logo.tex", 128, 128, officeLogoData, &officeLogo, 0, 0); */ /********************/ /* make the objects */ /********************/ plaintank = makeTank(); slagtank = makeSlagTank(); masertank = makeMaserTank(); slagmasertank = makeSlagMaserTank(); launchertank = makeLauncherTank(); slaglaunchertank = makeSlagLauncherTank(); helo = makeHelo(); slagHelo = makeSlagHelo(); bigRotor = makeBigRotor(); smallRotor = makeSmallRotor(); propeller = makePropeller(); monsterleg = makeLeg(); monsterHead = makeHead(); monsterSimpleHead = makeSimpleHead(); monsterSimpleTail = makeSimpleTail(); monsterTail = makeTail(); monsterBody = makeBody(); flutterHead = makeFlutterHead(); techsBody = makeTechsBody(); techsHead = makeTechsHead(); techsSimpleBody = makeTechsSimpleBody(); techsSimpleHead = makeTechsSimpleHead(); techsShadow = makeTechsShadow(); tankShadow = makeTankShadow(); planeShadow = makePlaneShadow(); fighterShadow = makeFighterShadow(); shellObj = glGenLists(1); shell2Obj = makeshell2(); heroshellObj = makeHeroShell(); watershellObj = makeWaterShell(); titleObj = makeTitles(1); titleObjOO = makeTitles(0); titleObjOOO = makeTitles(-1); planeDotsObj = makePlaneDots(1); planeDotsObjD0 = makePlaneDots(0); powerTower = makePowerTower(); genericWindows = makeGenericWindows(); strip1Obj = makeStrip1(1); strip2Obj = makeStrip2(1); strip3Obj = makeStrip3(1); strip1ObjD0 = makeStrip1(0); strip2ObjD0 = makeStrip2(0); strip3ObjD0 = makeStrip3(0); building1Obj = makebuilding1(1); building1ObjD0 = makebuilding1(0); building2Obj = makebuilding2(1); building2ObjD0 = makebuilding2(0); building5Obj = makebuilding5(1); building5ObjD0 = makebuilding5(0); building7Obj = makebuilding7(); building9Obj = makebuilding9(0); building9ObjOO = makebuilding9(1); glGetFloatv(GL_LINE_WIDTH, &lineWidthNow); building10Obj = makebuilding10(); glLineWidth(lineWidthNow); building12Obj = makebuilding12(1); building12ObjD0 = makebuilding12(0); building14Obj = makebuilding14(); building19Obj = makebuilding19(1); building19ObjD0 = makebuilding19(0); building20Obj = makebuilding20(1); building20ObjD0 = makebuilding20(0); building21Obj = makebuilding21(1); building21ObjD0 = makebuilding21(0); building31Obj = makebuilding31(); building32Obj = makebuilding32(); lowDPlane = makeLowDPlane(); highDPlane = makeHighDPlane(); bigPlane = makeBigPlane(); airplaneBody = makeAirplaneBody(); fighterBody = makeFighterBody(); flutterShadow = makeFlutterShadow(); flutterXMas = makeFlutterXMas(); flutterBody = makeFlutterBody(); flutterWing1 = makeFlutterWing1(); flutterWing2 = makeFlutterWing2(); roundTreeShadow = makeRoundTreeShadow(); makeBooms(); initFonts(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw a rectangular shadow on the ground */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawShadow (float x, float z, float wx, float wz) { float v[3]; v[1] = SHADOWS; glBegin(GL_QUADS); v[0] = x+wx; v[2] = z+wz; glVertex3fv(v); v[2] = z-wz; glVertex3fv(v); v[0] = x-wx; glVertex3fv(v); v[2] = z+wz; glVertex3fv(v); glEnd(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw a hunter */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void makeCHH(int dam) { if (dam > 16) makercube(-0.15, -0.05, -0.2, 0.07, 0.07, 0.1, colorblue); else makeitd(0, colorblue, -0.15, -0.05, -0.2, 0.07, 0.07, 0.1); if (dam > 12) makercube(0.15, -0.05, -0.2, 0.07, 0.07, .1, colorblue); else makeitd(1, colorblue, 0.15, -0.05, -0.2, 0.07, 0.07, .1); if (dam > 8) makercube(0.0, -0.05, 0.1, 0.2, 0.05, 0.1, colorgrey1); else makeitd(0, colorgrey1, 0.0, -0.05, 0.1, 0.2, 0.05, 0.1); if (dam > 4) makercube(0.0, -0.05, -0.2, 0.1, 0.05, 0.2, colorgrey1); else makeitd(1, colorgrey1, 0.0, -0.05, -0.2, 0.1, 0.05, 0.2); if (dam > 0) makeitPyr(3, colorgrey2, 0.0, +0.05, 0.1, 0.2, 0.05, 0.1); else makeitPyr(3, colorgrey1, 0.0, +0.05, 0.1, 0.2, 0.05, 0.1); makercube( 0.05, -0.1, 0.15, 0.02, 0.01, 0.02, colorwhite); makercube(-0.05, -0.1, 0.15, 0.02, 0.01, 0.02, colorwhite); makercube( 0.05, -0.1, -0.35, 0.02, 0.01, 0.02, colorwhite); makercube(-0.05, -0.1, -0.35, 0.02, 0.01, 0.02, colorwhite); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw a helicopter */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawHelo(float percent, int slag) { GLint shadeNow; glGetIntegerv(GL_SHADE_MODEL, &shadeNow); /*************/ /* draw body */ /*************/ glShadeModel(GL_FLAT); if (!slag) glCallList(helo); else glCallList(slagHelo); glShadeModel(shadeNow); /***************/ /* draw rotors */ /***************/ glPushMatrix(); glRotatef(-percent, 0, 1, 0); glCallList(bigRotor); glPopMatrix(); /********************/ /* draw tail rotor */ /********************/ glPushMatrix(); glTranslatef(0.04, 0, 0.375); glRotatef( -percent, 1, 0, 0); glCallList(smallRotor); glPopMatrix(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw a bomber */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawAirplane(int counter) { float percent; percent = counter * 10.0; glCallList(airplaneBody); /*******************/ /* draw propellers */ /*******************/ glPushMatrix(); glTranslatef(-0.09, -0.014, -0.07); glRotatef( -percent, 0, 0, 1); glCallList(propeller); glPopMatrix(); glPushMatrix(); glTranslatef(+0.09, -0.014, -0.07); glRotatef( -percent, 0, 0, 1); glCallList(propeller); glPopMatrix(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw a fighter */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawFighter(void) { glCallList(fighterBody); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw Googelon */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawMonster(struct monsterInfo monster, int counter, int itsChristmas, int detail) { float v[4]; /*********************/ /* googelon's shadow */ /*********************/ static float googShadow1[3] = {0.1, SHADOWS, -0.5}; static float googShadow2[3] = {0.0, SHADOWS, -0.7}; static float googShadow3[3] = {-0.1, SHADOWS, -0.5}; glPushMatrix(); glRotatef(.1*monster.headHorzRotate, 0, 1, 0); /********/ /* head */ /********/ glPushMatrix(); glRotatef(.1*monster.headVertRotate, 1, 0, 0); glCallList(monsterHead); if (itsChristmas) { glPushMatrix(); glScalef(1.2, .5, 1.2); glTranslatef(0.0, PLANEY+1.7, 0.0); glColor3fv(colorwhite); v[0] = v[1] = v[2] = 0; v[3] = .14; andysphdraw(v, 4); glPopMatrix(); glPushMatrix(); glTranslatef(-0.15, PLANEY+1.55, -0.15); glScalef(0.15, 0.2, 0.15); drawClosedCone(colorred, colorred, 1); glPopMatrix(); glPushMatrix(); glTranslatef(-0.09, PLANEY+1.75, 0.04); glRotatef(.1*(1100), 1, 0, 0); glRotatef(.1*(450), 0, 0, 1); glScalef(.04, .11, .1); drawClosedCone(colorred, colorred, 1); glPopMatrix(); glColor3fv(colorwhite); v[0] = -0.15; v[1] = PLANEY+1.6; v[2] = 0.1; v[3] = 0.05; andysphdraw(v, 4); } glPopMatrix(); /********/ /* body */ /********/ glCallList(monsterBody); /***********************/ /* legs, feet and toes */ /***********************/ glPushMatrix(); glTranslatef(0.2, monster.rot1, monster.rot2); glCallList(monsterleg); glTranslatef(-0.4, -2*monster.rot1, -2*monster.rot2); glCallList(monsterleg); glPopMatrix(); if ((!monster.monsterIsDead) && (detail > 0)) { glColor4fv(colorblack); drawShadow (0.0, 0.0, 0.2, 0.2); drawShadow (0.2, monster.rot2, 0.1, 0.15); drawShadow (-0.2, -monster.rot2, 0.1, 0.15); } /********/ /* tail */ /********/ glRotatef(sin(counter * 0.15915)*10, 0, 1, 0); /* 1/(2 * pi) */ glCallList(monsterTail); if (itsChristmas) { glPushMatrix(); glTranslatef(-0.15, PLANEY+0.85, -0.45); glScalef(0.15, 0.15, 0.15); drawClosedCone(colorbeige, colorbrown, 1); glPopMatrix(); glPushMatrix(); glTranslatef(0.0, PLANEY+0.5, -0.3); glScalef(1, 1.5, 1); glColor3fv(colorbeige); v[0] = v[1] = v[2] = 0; v[3] = 0.2; andysphdraw(v, 4); glPopMatrix(); } if ((!monster.monsterIsDead) && (detail > 0)) { glColor4fv(colorblack); drawShadow (0.0, -0.25, 0.1, 0.25); glColor3fv(colorblack); glBegin(GL_TRIANGLES); glVertex3fv(googShadow1); glVertex3fv(googShadow2); glVertex3fv(googShadow3); glEnd(); } glPopMatrix(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw SIMPLIFIED Googelon (to save time in monsterview) */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawSimpleMonster(struct monsterInfo monster, int counter, int itsChristmas, int detail) { float v[4]; /*********************/ /* googelon's shadow */ /*********************/ glPushMatrix(); glRotatef(.1*monster.headHorzRotate, 0, 1, 0); /********/ /* head */ /********/ glPushMatrix(); glRotatef(.1*monster.headVertRotate, 1, 0, 0); glCallList(monsterSimpleHead); if (itsChristmas) { glPushMatrix(); glScalef(1.2, .5, 1.2); glTranslatef(0.0, PLANEY+1.7, 0.0); glColor3fv(colorwhite); v[0] = v[1] = v[2] = 0; v[3] = .14; andysphdraw(v, 4); glPopMatrix(); glPushMatrix(); glTranslatef(-0.15, PLANEY+1.55, -0.15); glScalef(0.15, 0.2, 0.15); drawClosedCone(colorred, colorred, 1); glPopMatrix(); glPushMatrix(); glTranslatef(-0.09, PLANEY+1.75, 0.04); glRotatef(.1*(1100), 1, 0, 0); glRotatef(.1*(450), 0, 0, 1); glScalef(.04, .11, .1); drawClosedCone(colorred, colorred, 1); glPopMatrix(); glColor3fv(colorwhite); v[0] = -0.15; v[1] = PLANEY+1.6; v[2] = 0.1; v[3] = 0.05; andysphdraw(v, 4); } glPopMatrix(); /********/ /* body */ /********/ makercubeTopBack(0.0, PLANEY+0.5, 0.0, 0.2, 0.3, 0.2, colorred); makercubeTopBack(0.0, PLANEY+0.9, 0.0, 0.15, 0.2, 0.15, colorred); /***********************/ /* legs, feet and toes */ /***********************/ glPushMatrix(); glTranslatef(0.2, monster.rot1, monster.rot2); makercubeTopBack( 0.0, PLANEY+0.2, 0.0, 0.1, 0.2, 0.1, colorred); makercubeTopBack( 0.0, PLANEY+0.06, 0.17, 0.1, 0.06, 0.08, colorred); glTranslatef(-0.4, -2*monster.rot1, -2*monster.rot2); makercubeTopBack( 0.0, PLANEY+0.2, 0.0, 0.1, 0.2, 0.1, colorred); makercubeTopBack( 0.0, PLANEY+0.06, 0.17, 0.1, 0.06, 0.08, colorred); glPopMatrix(); if ((!monster.monsterIsDead) && (detail > 0)) { glColor4fv(colorblack); drawShadow (0.0, 0.0, 0.2, 0.2); drawShadow (0.2, monster.rot2, 0.1, 0.15); drawShadow (-0.2, -monster.rot2, 0.1, 0.15); } /********/ /* tail */ /********/ glRotatef(sin(counter * 0.15915)*10, 0, 1, 0); /* 1/(2 * pi) */ glCallList(monsterSimpleTail); if (itsChristmas) { glPushMatrix(); glTranslatef(-0.15, PLANEY+0.85, -0.45); glScalef(0.15, 0.15, 0.15); drawClosedCone(colorbeige, colorbrown, 1); glPopMatrix(); glPushMatrix(); glTranslatef(0.0, PLANEY+0.5, -0.3); glScalef(1, 1.5, 1); glColor3fv(colorbeige); v[0] = v[1] = v[2] = 0; v[3] = 0.2; andysphdraw(v, 4); glPopMatrix(); } glPopMatrix(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* Draw the Vapour */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawVapour(struct monsterInfo monster, int itsChristmas, int detail) { register int i; glPushMatrix(); if (detail > 0) glEnable(GL_BLEND); glRotatef(0.1 * monster.headHorzRotate, 0, 1, 0); colorwhite2[0] = 1; colorwhite2[1] = 1; colorwhite2[2] = 1; if (monster.monsterIsDead) { if (detail <= 0) { colorwhite2[0] = 1 - monster.deadCount * 0.022; colorwhite2[1] = 1 - monster.deadCount * 0.022; colorwhite2[2] = 1 - monster.deadCount * 0.022; } colorwhite2[3] = 1 - monster.deadCount * 0.022; glColor4fv(colorwhite2); } else if (itsChristmas) glColor4fv(colorsnowvapour); else glColor4fv(colorwhite); if (detail == 0) for(i = 0; i < (int) (MAXTRIBUTES/1.5); i++) andysphdraw(monster.a[i], 0); else for(i=0; i 0) glEnable(GL_BLEND); } glCallList(flutterShadow); glPopAttrib(); glPopAttrib(); } glPushMatrix(); glRotatef(offsetX * 10, 0, 0, 1); if (itsChristmas) glCallList(flutterXMas); glPushMatrix(); glRotatef(monster.headVertRotate * 0.05, 1, 0, 0); glCallList(flutterHead); glPopMatrix(); glCallList(flutterBody); glTranslatef(0, PLANEY+1.15, 0); glPushMatrix(); glRotatef( rotAmt, 0, 0, 1); /* 1/(2 * pi) */ glCallList(flutterWing1); glPopMatrix(); glPushMatrix(); glRotatef( - rotAmt, 0, 0, 1); /* 1/(2 * pi) */ glCallList(flutterWing2); glPopMatrix(); glPopMatrix(); glPopMatrix(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw Techs */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawTechs(struct monsterInfo monster, int detail) { glPushMatrix(); glRotatef(0.1 * monster.headHorzRotate, 0, 1, 0); if (monster.deadCount < 45) { glPushMatrix(); glRotatef(0.1 * monster.headVertRotate, 1, 0, 0); glCallList(techsHead); glPopMatrix(); glCallList(techsBody); } if ((!monster.monsterIsDead) && (detail > 0)) { glCallList(techsShadow); } glPopMatrix(); if (monster.deadCount >= 45) { glPushMatrix(); glTranslatef(monster.timeDead * 0.05 + 0.2, -monster.timeDead * 0.05, monster.timeDead * 0.05); glRotatef(monster.timeDead*10, 1, 0, 0); glRotatef(monster.timeDead*15, 0, 1, 0); makercube(0.0, 0, 0, 0.03, 0.25, 0.2, colorgrey2); makercube(0.011, 0, 0, 0.02, 0.2, 0.15, colorblack); glPopMatrix(); glPushMatrix(); glTranslatef(-monster.timeDead * 0.05 - 0.2, monster.timeDead * 0.05, monster.timeDead * 0.05); glRotatef(monster.timeDead*10, 1, 0, 0); glRotatef(monster.timeDead*15, 0, 1, 0); makercube( 0.0, 0, 0, 0.03, 0.25, 0.2, colorgrey2); makercube(-0.011, 0, 0, 0.02, 0.2, 0.15, colorblack); glPopMatrix(); } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw SIMPLE Techs */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawSimpleTechs(struct monsterInfo monster, int detail) { glPushMatrix(); glRotatef(0.1 * monster.headHorzRotate, 0, 1, 0); if (monster.deadCount < 45) { glPushMatrix(); glRotatef(0.1 * monster.headVertRotate, 1, 0, 0); glCallList(techsSimpleHead); glPopMatrix(); glCallList(techsSimpleBody); } if ((!monster.monsterIsDead) && (detail > 0)) { glCallList(techsShadow); } glPopMatrix(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw the energy typhoon hero */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawHeroDude(int power, int counter, int mcount, int dCount, int detail) { float spheredat[4]; int ang; int amount, amount2; float dam; float c1[4], c2[4], c3[4], c4[4], c5[4]; int sph; if (detail >= 2) sph = 4; else sph = 3; c1[3] = c2[3] = c3[3] = c4[3] = c5[3] = 1; dam = dCount * 0.075; c2[0] = (colorwhite[0] + dam) >= 1 ? 1 : (colorwhite[0] + dam); c2[1] = (colorwhite[1] + dam) >= 1 ? 1 : (colorwhite[1] + dam); c2[2] = (colorwhite[2] + dam) >= 1 ? 1 : (colorwhite[2] + dam); c1[0] = (colorwater[0] + dam) >= 1 ? 1 : (colorwater[0] + dam); c1[1] = (colorwater[1] + dam) >= 1 ? 1 : (colorwater[1] + dam); c1[2] = (colorwater[2] + dam) >= 1 ? 1 : (colorwater[2] + dam); c3[0] = (colorblack[0] + dam) >= 1 ? 1 : (colorblack[0] + dam); c3[1] = (colorblack[1] + dam) >= 1 ? 1 : (colorblack[1] + dam); c3[2] = (colorblack[2] + dam) >= 1 ? 1 : (colorblack[2] + dam); c4[0] = (colorgrey2[0] + dam) >= 1 ? 1 : (colorgrey2[0] + dam); c4[1] = (colorgrey2[1] + dam) >= 1 ? 1 : (colorgrey2[1] + dam); c4[2] = (colorgrey2[2] + dam) >= 1 ? 1 : (colorgrey2[2] + dam); c5[0] = (colorwater[0] + dam) >= 1 ? 1 : (colorwater[0] + dam); c5[1] = (colorwater[1] + dam) >= 1 ? 1 : (colorwater[1] + dam); c5[2] = (colorwater[2] + dam) >= 1 ? 1 : (colorwater[2] + dam); /********/ /* head */ /********/ glPushMatrix(); glScalef(0.55, 1, 0.55); glColor4fv(c4); spheredat[0] = 0; spheredat[1] = PLANEY+1.21; spheredat[2] = 0; spheredat[3] = 0.12; andysphdraw(spheredat, sph); if (power > 8) makercube(.06, PLANEY+1.25, .075, 0.03, 0.015, 0.035, c3); else makeitd(1, c3, .06, PLANEY+1.25, .075, 0.03, 0.015, 0.035); if (power > 5) makercube(-.06, PLANEY+1.25, .075, 0.03, 0.015, 0.035, c3); else makeitd(0, c3, -.06, PLANEY+1.25, .075, 0.03, 0.015, 0.035); if (power > 3) makercube(0, PLANEY+1.16, .075, 0.03, 0.014, 0.035, c4); else makeitd(1, c4, 0, PLANEY+1.16, .075, 0.03, 0.014, 0.035); glColor4fv(c5); spheredat[2] = -0.01; andysphdraw(spheredat, sph); glPopMatrix(); /********/ /* neck */ /********/ if (power > 10) makercube(0, PLANEY+1.075, 0, 0.025, 0.025, 0.025, c2); else makeitd(1, c2, 0, PLANEY+1.075, 0, 0.025, 0.025, 0.025); /********/ /* body */ /********/ if (power > 15) makercube(0, PLANEY+0.95, 0, 0.075, 0.1, 0.055, c1); else makeitd(0, c1, 0, PLANEY+0.95, 0, 0.075, 0.1, 0.055); if (power > 20) makercube(0, PLANEY+0.75, 0, 0.075, 0.1, 0.055, c2); else makeitd(0, c2, 0, PLANEY+0.75, 0, 0.075, 0.1, 0.055); if (power > 25) makercube(0, PLANEY+1.01, 0.055, 0.02, 0.05, 0.01, c2); else makeitd(1, c2, 0, PLANEY+1.01, 0.055, 0.02, 0.05, 0.01); /*************/ /* shoulders */ /*************/ if (power > 30) makercube(0.075, PLANEY+1.0, 0, 0.075, 0.051, 0.05, c2); else makeitd(0, c2, 0.075, PLANEY+1.0, 0, 0.075, 0.051, 0.05); if (power > 35) makercube(-0.075, PLANEY+1.0, 0, 0.075, 0.051, 0.05, c2); else makeitd(1, c2, -0.075, PLANEY+1.0, 0, 0.075, 0.051, 0.05); /********/ /* arms */ /********/ if (mcount > 30) amount = (40 - mcount) * 9; else if (mcount > 10) amount = 90; else amount = mcount * 9; ang = (int) amount * 10; glPushMatrix(); glRotatef(.1*(-ang), 1, 0, 0); if (power > 40) makercube(0.13, PLANEY+0.875, 0, 0.025, 0.125, 0.025, c1); else makeitd(1, c1, 0.13, PLANEY+0.875, 0, 0.025, 0.125, 0.025); glPushMatrix(); glTranslatef(0.13, PLANEY+0.75, 0); if (power > 45) makercube(0, -0.09, 0, 0.024, 0.11, 0.024, c2); else makeitd(0, c2, 0, -0.09, 0, 0.024, 0.11, 0.024); if (power > 50) makercube(0, -0.19, 0, 0.03, 0.03, 0.028, c1); else makeitd(1, c1, 0, -0.19, 0, 0.03, 0.03, 0.028); glPopMatrix(); glPopMatrix(); glPushMatrix(); glRotatef(.1*(-ang), 1, 0, 0); if (power > 55) makercube(-0.13, PLANEY+0.875, 0, 0.025, 0.125, 0.025, c1); else makeitd(0, c1, -0.13, PLANEY+0.875, 0, 0.025, 0.125, 0.025); glPushMatrix(); glTranslatef(-0.13, PLANEY+0.75, 0); if (power > 60) makercube(0, -0.09, 0, 0.024, 0.11, 0.024, c2); else makeitd(0, c2, 0, -0.09, 0, 0.024, 0.11, 0.024); if (power > 65) makercube(0, -0.19, 0, 0.03, 0.03, 0.028, c1); else makeitd(1, c1, 0, -0.19, 0, 0.03, 0.03, 0.028); glPopMatrix(); glPopMatrix(); /********/ /* legs */ /********/ amount = (counter * 100) % 2400; if (amount < 1200) amount2 = 300 + amount; else amount2 = 900 + amount; ang = (int) (cos(BIG_DEG_TO_RAD * amount2) * RAD_TO_SMALL_DEG * 2.5); glPushMatrix(); glTranslatef(0.04, PLANEY+0.65, 0); glRotatef(.1*(ang ), 1, 0, 0); if (power > 70) makercube(0, -0.12, 0, 0.035, 0.13, 0.03, c2); else makeitd(0, c2, 0, -0.12, 0, 0.035, 0.13, 0.03); if (power > 75) makercube(0, -.35, 0, 0.024, 0.2, 0.029, c1); else makeitd(1, c1, 0, -.35, 0, 0.024, 0.2, 0.029); if (power > 80) makercube(0, -.59, +0.025, 0.026, 0.04, 0.075, c2); else makeitd(0, c2, 0, -.59, +0.025, 0.026, 0.04, 0.075); glPopMatrix(); glPushMatrix(); glTranslatef(-0.04, PLANEY+0.65, 0); glRotatef(.1*(-ang), 1, 0, 0); if (power > 85) makercube(0, -0.12, 0, 0.035, 0.13, 0.03, c2); else makeitd(1, c2, 0, -0.12, 0, 0.035, 0.13, 0.03); if (power > 90) makercube(0, -.35, 0, 0.024, 0.2, 0.029, c1); else makeitd(0, c1, 0, -.35, 0, 0.024, 0.2, 0.029); if (power > 95) makercube(0, -.59, +0.025, 0.026, 0.04, 0.075, c2); else makeitd(1, c2, 0, -.59, +0.025, 0.026, 0.04, 0.075); glPopMatrix(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw the energy beam hero */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawHeroDude2(int power, int counter, int mcount, int dCount, int detail) { float spheredat[4]; int ang; int amount, amount2; float dam; float c1[4], c2[4], c3[4], c4[4], c5[4]; int sph; if (detail >= 2) sph=4; else sph=3 ; c1[3] = c2[3] = c3[3] = c4[3] = c5[3] = 1; dam = dCount * 0.075; c1[0] = (colorwhite[0] + dam) >= 1 ? 1 : (colorwhite[0] + dam); c1[1] = (colorwhite[1] + dam) >= 1 ? 1 : (colorwhite[1] + dam); c1[2] = (colorwhite[2] + dam) >= 1 ? 1 : (colorwhite[2] + dam); c2[0] = (colorred[0] + dam) >= 1 ? 1 : (colorred[0] + dam); c2[1] = (colorred[1] + dam) >= 1 ? 1 : (colorred[1] + dam); c2[2] = (colorred[2] + dam) >= 1 ? 1 : (colorred[2] + dam); c3[0] = (colorblack[0] + dam) >= 1 ? 1 : (colorblack[0] + dam); c3[1] = (colorblack[1] + dam) >= 1 ? 1 : (colorblack[1] + dam); c3[2] = (colorblack[2] + dam) >= 1 ? 1 : (colorblack[2] + dam); c4[0] = (colorgrey2[0] + dam) >= 1 ? 1 : (colorgrey2[0] + dam); c4[1] = (colorgrey2[1] + dam) >= 1 ? 1 : (colorgrey2[1] + dam); c4[2] = (colorgrey2[2] + dam) >= 1 ? 1 : (colorgrey2[2] + dam); c5[0] = (colorred3[0] + dam) >= 1 ? 1 : (colorred3[0] + dam); c5[1] = (colorred3[1] + dam) >= 1 ? 1 : (colorred3[1] + dam); c5[2] = (colorred3[2] + dam) >= 1 ? 1 : (colorred3[2] + dam); /********/ /* head */ /********/ glPushMatrix(); glScalef(0.55, 1, 0.55); glColor4fv(c4); spheredat[0] = 0; spheredat[1] = PLANEY+1.21; spheredat[2] = 0; spheredat[3] = 0.12; andysphdraw(spheredat, sph); if (power > 8) makercube(.06, PLANEY+1.25, .075, 0.03, 0.015, 0.035, c3); else makeitd(1, c3, .06, PLANEY+1.25, .075, 0.03, 0.015, 0.035); if (power > 5) makercube(-.06, PLANEY+1.25, .075, 0.03, 0.015, 0.035, c3); else makeitd(0, c3, -.06, PLANEY+1.25, .075, 0.03, 0.015, 0.035); if (power > 3) makercube(0, PLANEY+1.16, .075, 0.03, 0.014, 0.035, c4); else makeitd(1, c4, 0, PLANEY+1.16, .075, 0.03, 0.014, 0.035); glColor4fv(c5); spheredat[2] = -0.01; andysphdraw(spheredat, sph); glPopMatrix(); /********/ /* neck */ /********/ if (power > 10) makercube(0, PLANEY+1.075, 0, 0.025, 0.025, 0.025, c2); else makeitd(1, c2, 0, PLANEY+1.075, 0, 0.025, 0.025, 0.025); /********/ /* body */ /********/ if (power > 15) makercube(0, PLANEY+0.95, 0, 0.075, 0.1, 0.055, c1); else makeitd(0, c1, 0, PLANEY+0.95, 0, 0.075, 0.1, 0.055); if (power > 20) makercube(0, PLANEY+0.75, 0, 0.075, 0.1, 0.055, c2); else makeitd(0, c2, 0, PLANEY+0.75, 0, 0.075, 0.1, 0.055); if (power > 25) makercube(0, PLANEY+1.01, 0.055, 0.02, 0.05, 0.01, c2); else makeitd(1, c2, 0, PLANEY+1.01, 0.055, 0.02, 0.05, 0.01); /*************/ /* shoulders */ /*************/ if (power > 30) makercube(0.075, PLANEY+1.0, 0, 0.075, 0.051, 0.05, c2); else makeitd(0, c2, 0.075, PLANEY+1.0, 0, 0.075, 0.051, 0.05); if (power > 35) makercube(-0.075, PLANEY+1.0, 0, 0.075, 0.051, 0.05, c2); else makeitd(1, c2, -0.075, PLANEY+1.0, 0, 0.075, 0.051, 0.05); /********/ /* arms */ /********/ if (mcount > 30) amount = (40 - mcount) * 9; else if (mcount > 10) amount = 90; else amount = mcount * 9; ang = (int) amount * 10; if (power > 40) makercube(0.13, PLANEY+0.875, 0, 0.025, 0.125, 0.025, c1); else makeitd(1, c1, 0.13, PLANEY+0.875, 0, 0.025, 0.125, 0.025); glPushMatrix(); glTranslatef(0.13, PLANEY+0.75, 0); if (power > 45) makercube(0, -0.09, 0, 0.024, 0.11, 0.024, c2); else makeitd(0, c2, 0, -0.09, 0, 0.024, 0.11, 0.024); if (power > 50) makercube(0, -0.19, 0, 0.03, 0.03, 0.028, c1); else makeitd(1, c1, 0, -0.19, 0, 0.03, 0.03, 0.028); glPopMatrix(); glPushMatrix(); glRotatef(.1*(-ang/2 ), 1, 0, 0); if (power > 55) makercube(-0.13, PLANEY+0.875, 0, 0.025, 0.125, 0.025, c1); else makeitd(0, c1, -0.13, PLANEY+0.875, 0, 0.025, 0.125, 0.025); glPushMatrix(); glTranslatef(-0.13, PLANEY+0.75, 0); glRotatef(.1*(ang ), 0, 0, 1); if (power > 60) makercube(0, -0.09, 0, 0.024, 0.11, 0.024, c2); else makeitd(0, c2, 0, -0.09, 0, 0.024, 0.11, 0.024); if (power > 65) makercube(0, -0.19, 0, 0.03, 0.03, 0.028, c1); else makeitd(1, c1, 0, -0.19, 0, 0.03, 0.03, 0.028); glPopMatrix(); glPopMatrix(); /********/ /* legs */ /********/ amount = (counter *100) % 2400; if (amount < 1200) amount2 = 300 + amount; else amount2 = 900 + amount; ang = (int) (cos(BIG_DEG_TO_RAD * amount2) * RAD_TO_SMALL_DEG * 2.5); glPushMatrix(); glTranslatef(0.04, PLANEY+0.65, 0); glRotatef(.1*(ang ), 1, 0, 0); if (power > 70) makercube(0, -0.12, 0, 0.035, 0.13, 0.03, c2); else makeitd(0, c2, 0, -0.12, 0, 0.035, 0.13, 0.03); if (power > 75) makercube(0, -.35, 0, 0.024, 0.2, 0.029, c1); else makeitd(1, c1, 0, -.35, 0, 0.024, 0.2, 0.029); if (power > 80) makercube(0, -.59, +0.025, 0.026, 0.04, 0.075, c2); else makeitd(0, c2, 0, -.59, +0.025, 0.026, 0.04, 0.075); glPopMatrix(); glPushMatrix(); glTranslatef(-0.04, PLANEY+0.65, 0); glRotatef(.1*(-ang), 1, 0, 0); if (power > 85) makercube(0, -0.12, 0, 0.035, 0.13, 0.03, c2); else makeitd(1, c2, 0, -0.12, 0, 0.035, 0.13, 0.03); if (power > 90) makercube(0, -.35, 0, 0.024, 0.2, 0.029, c1); else makeitd(0, c1, 0, -.35, 0, 0.024, 0.2, 0.029); if (power > 95) makercube(0, -.59, +0.025, 0.026, 0.04, 0.075, c2); else makeitd(1, c2, 0, -.59, +0.025, 0.026, 0.04, 0.075); glPopMatrix(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw MechaGoogelon */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawMechaMonster(int dam, int counter, int detail) { if (dam > 48) makercube(0.2, PLANEY+0.7, 0, 0.05, 0.05, 0.15, colorblue); else makeitd(1, colorblue, 0.2, PLANEY+0.7, 0, 0.05, 0.05, 0.15); if (dam > 45) makercube(-0.2, PLANEY+0.7, 0, 0.05, 0.05, 0.15, colorblue); else makeitd(0, colorblue, -0.2, PLANEY+0.7, 0, 0.05, 0.05, 0.15); /**************************/ /* legs, feet of one side */ /**************************/ if (dam > 43) makercube(0.2, PLANEY+0.2, 0, 0.12, 0.2, 0.1, colorgrey2); else makeitd(0, colorgrey2, 0.2, PLANEY+0.2, 0, 0.12, 0.2, 0.1); if (dam > 40) makercube(0.2, PLANEY+0.06, 0.1, 0.1, 0.06, 0.15, colorwhite); else makeitd(1, colorwhite, 0.2, PLANEY+0.06, 0.1, 0.1, 0.06, 0.15); /****************************/ /* legs, feet of other side */ /****************************/ if (dam > 38) makercube(-0.2, PLANEY+0.2, 0, 0.12, 0.2, 0.1, colorgrey2); else makeitd(1, colorgrey2, -0.2, PLANEY+0.2, 0, 0.12, 0.2, 0.1); if (dam > 35) makercube(-0.2, PLANEY+0.06, 0.1, 0.1, 0.06, 0.15, colorwhite); else makeitd(0, colorwhite, -0.2, PLANEY+0.06, 0.1, 0.1, 0.06, 0.15); /********/ /* tail */ /********/ if (dam > 30) { makercube(0, PLANEY+0.2, -0.2, 0.1, 0.15, 0.2, colorwhite); makercube(0, PLANEY+0.1, -0.4, 0.08, 0.1, 0.2, colorgrey2); } else { makeitd(0, colorwhite, 0, PLANEY+0.2, -0.2, 0.1, 0.15, 0.2); makeitd(1, colorgrey2, 0, PLANEY+0.1, -0.4, 0.08, 0.1, 0.2); } glColor4fv(colorblack); if (detail > 0) { drawShadow (0, -0.2, 0.1, 0.2); drawShadow (0, -0.4, 0.08, 0.2); } /********/ /* head */ /********/ if (dam > 26) makercube(0, PLANEY + 1.15, 0, 0.25, 0.15, 0.12, colorwhite); else makeitd(0, colorwhite, 0, PLANEY + 1.15, 0, 0.25, 0.15, 0.12); makeitPyr(2, colorwhite, 0, PLANEY + 1.15, -.24, 0.25, 0.15, 0.12); if (dam > 22) makercube(0, PLANEY + 1.15, -0.24, 0.13, 0.08, 0.1, colorgrey2); else makeitd(1, colorgrey2, 0, PLANEY + 1.15, -0.24, 0.13, 0.08, 0.1); /*******/ /* eye */ /*******/ if (dam > 18) makercube(0, PLANEY + 1.20, 0.1, 0.15, 0.06, 0.05, colorblack); else makeitd(1, colorblack, 0, PLANEY + 1.20, 0.1, 0.15, 0.06, 0.05); if (dam > 14) makercube(sin((counter % 20) * 0.314) * 0.14, PLANEY + 1.20, 0.14, 0.04, 0.04, 0.04, colorred); else makeitd(0, colorred, sin((counter % 20) * 0.314) * 0.14, PLANEY + 1.20, 0.14, 0.04, 0.04, 0.04); /********/ /* body */ /********/ if (dam > 10) makercube(0, PLANEY + 0.9, 0, 0.1, 0.2, 0.1, colorgrey2); else makeitd(0, colorgrey2, 0, PLANEY + 0.9, 0, 0.1, 0.2, 0.1); if (dam > 5) makercube(0, PLANEY + 0.5, 0.2, 0.1, 0.15, 0.05, colorgrey1); else makeitd(1, colorgrey1, 0, PLANEY + 0.5, 0.2, 0.1, 0.15, 0.05); if (dam > 0) makercube(0, PLANEY + 0.5, 0, 0.2, 0.3, 0.2, colorwhite); else makeitd(0, colorwhite, 0, PLANEY + 0.5, 0, 0.2, 0.3, 0.2); glColor4fv(colorblack); if (detail > 0) drawShadow (0, 0, 0.2, 0.2); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw a window on the negative z side of a building */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void wzminus(float x, float y, float z, float wx, float wy) { float v[3]; v[2] = z; glBegin(GL_QUADS); v[0] = x-wx; v[1] = y-wy; glVertex3fv(v); v[1] = y+wy; glVertex3fv(v); v[0] = x+wx; glVertex3fv(v); v[1] = y-wy; glVertex3fv(v); glEnd(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw a window on the positive z side of a building */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void wzplus(float x, float y, float z, float wx, float wy) { float v[3]; v[2] = z; glBegin(GL_QUADS); v[0] = x+wx; v[1] = y-wy; glVertex3fv(v); v[1] = y+wy; glVertex3fv(v); v[0] = x-wx; glVertex3fv(v); v[1] = y-wy; glVertex3fv(v); glEnd(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw a window on the positive x side of a building */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void wxplus(float x, float y, float z, float wy, float wz) { float v[3]; v[0] = x; glBegin(GL_QUADS); v[1] = y+wy; v[2] = z-wz; glVertex3fv(v); v[2] = z+wz; glVertex3fv(v); v[1] = y-wy; glVertex3fv(v); v[2] = z-wz; glVertex3fv(v); glEnd(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw a window on the negative x side of a building */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void wxminus(float x, float y, float z, float wy, float wz) { float v[3]; v[0] = x; glBegin(GL_QUADS); v[1] = y-wy; v[2] = z-wz; glVertex3fv(v); v[2] = z+wz; glVertex3fv(v); v[1] = y+wy; glVertex3fv(v); v[2] = z-wz; glVertex3fv(v); glEnd(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw generic square building */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding0(float * colour, int detail) { makercubenobtm(0.0, 0.4, 0.0, 0.3, 0.4, 0.3, colour); if (detail > 0) glCallList(genericWindows); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw generic fast food resteraunt */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding6(int counter, float * c1, float * c2, int detail) { makercubenobtmnotop( 0, .2, 0, .3, .2, .35, c1); makeitPyr(1, c2, 0, .5, 0, .35, .1, .45); makercubenobtm( .38, .25, 0.1, .01, .25, .015, colorgrey2); glPushMatrix(); glTranslatef(.38, .6, 0.1); glRotatef((counter*15) % 360, 0, 1, 0); makercube(0.0, 0.0, 0.0, 0.01, 0.1, 0.14, c2); makercube(0.0, 0.0, 0.0, 0.013, 0.07, 0.11, c1); glPopMatrix(); /* windows */ if (detail > 0) { glColor3fv(colorblack); wxplus(0.303, 0.15, -0.15, 0.15, 0.05); wxplus(0.303, 0.2, 0.15, 0.075, 0.075); wzminus(-0.15, 0.2, -0.352, 0.075, 0.075); wzplus( -0.15, 0.2, 0.352, 0.075, 0.075); wzplus( 0.15, 0.2, 0.352, 0.075, 0.075); wzminus( 0.15, 0.2, -0.352, 0.075, 0.075); } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw warehouse / hanger */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding8(float * c1, float * c2, int detail) { makercubenobtmnotop(0, .2, 0, .35, .2, .3, c1); makeitPyr(4, c2, 0, .5, 0, .35, .1, .3); /* windows */ if (detail > 0) { glColor3fv(colorblack); wzminus(0.0, 0.15, -0.303, 0.25, 0.15); wzplus( 0.0, 0.15, 0.303, 0.25, 0.15); } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw cooling towers */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawCoolingTower(int detail) { GLUquadricObj *qobj; glPushMatrix(); glTranslatef(-0.3, 0.5, -0.3); glScalef(0.3, 0.5, 0.3); drawClosedCylinder(colorgrey3, colorwhite, 0, detail); glPopMatrix(); if (detail >= 0) { glPushMatrix(); glColor3fv(colorblack); glTranslatef(0.0, 0.9, 0.0); glRotatef(-90, 1, 0, 0); qobj = gluNewQuadric(); gluDisk( qobj, 0., 0.28, 32, 1); gluDeleteQuadric(qobj); glPopMatrix(); } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw factory smokestacks */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding11(int detail) { makercubenobtm( 0, .05, 0, .3, .05, .3, colorgrey1); glPushMatrix(); glTranslatef(-.25, .8, -.1); glScalef(.1, .8, .1); drawClosedCylinder(colorgrey2, colorgrey3, 0, detail); glPopMatrix(); glPushMatrix(); glTranslatef(.05, .8, -.1); glScalef(.1, .8, .1); drawClosedCylinder(colorgrey2, colorgrey3, 0, detail); glPopMatrix(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw strip-mall store */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding15(float * buildingColour, float * awningColour, int detail) { makeitPyr(13, awningColour, +.1, .54, 0, .3, .25, .297); makercubenobtm( -.1, .4, 0, .3, .4, .3, buildingColour); if (detail > 0) { glColor3fv(colorblack); wxplus(0.203, .15, -.15, .15, .05); wxminus(-0.403, .15, -.15, .15, .05); wxplus(0.203, .15, .10, .08, .12); } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw office building */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding22(float * color) { makercubenobtm(0, .75, 0, .3, .75, .3, color); makercubenobtmnotop(0, .4, 0, .307, .1, .307, colorblack); makercubenobtmnotop(0, .8, 0, .307, .1, .307, colorblack); makercubenobtmnotop(0, 1.2, 0, .307, .1, .307, colorblack); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw smaller office building */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding34(float * color) { makercubenobtm(0, .3, 0, .3, .3, .3, color); makercubenobtmnotop(0, .4, 0, .307, .1, .307, colorblack); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw small office building */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding36(float * color) { makercubenobtm(0, .5, 0, .3, .5, .3, color); makercubenobtmnotop(0, .4, 0, .307, .1, .307, colorblack); makercubenobtmnotop(0, .8, 0, .307, .1, .307, colorblack); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw office building with sign */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding37(float * color, int detail) { static float tv1[2] = {0,1}; static float tv2[2] = {1,1}; static float tv3[2] = {1,0}; static float tv4[2] = {0,0}; static float vec1[3]={0,1,0}; static float vec2[3]={1,1,0}; static float vec3[3]={1,0,0}; static float vec4[3]={0,0,0}; makercubenobtm(0, .75, 0, .3, .75, .3, color); makercubenobtmnotop(0, .4, 0, .307, .1, .307, colorblack); makercubenobtmnotop(0, .8, 0, .307, .1, .307, colorblack); makercubenobtmnotop(0, 1.2, -0.01, .307, .1, .307, colorblack); glPushMatrix(); glColor4fv(colorwhite); if ((detail >= 2) && (officeLogoData != NULL)) { glCallList(officeLogo); glEnable(GL_TEXTURE_2D); } glTranslatef(0.25, 1.1, 0.31); glScalef(0.5, 0.3, 0.01); glRotatef(180, 0, 1, 0); glBegin(GL_QUADS); if ((detail >= 2) && (picleft != NULL)) { glTexCoord2fv(tv1); glVertex3fv(vec1); glTexCoord2fv(tv2); glVertex3fv(vec2); glTexCoord2fv(tv3); glVertex3fv(vec3); glTexCoord2fv(tv4); glVertex3fv(vec4); } else { glVertex3fv(vec1); glVertex3fv(vec2); glVertex3fv(vec3); glVertex3fv(vec4); } glEnd(); glDisable(GL_TEXTURE_2D); glPopMatrix(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw satellite dish */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding25() { long backNow; GLUquadricObj *qobj; /******************/ /* satellite dish */ /******************/ float satSphere[4] = {0, 0.4, 0, 0.075}; float sat0[3] = { 0.0, 0.35, 0.0}; float sat1[3] = { 0.0, 0.0, 0.35}; float sat2[3] = { 0.0, -0.35, 0.0}; float sat3[3] = { 0.35, 0.0, 0.0}; float sat4[3] = {-0.35, 0.0, 0.0}; GLfloat lineWidthNow; glGetFloatv(GL_LINE_WIDTH, &lineWidthNow); backNow = glIsEnabled(GL_CULL_FACE); /* shadow */ glColor3fv(colorblack); glPushMatrix(); glTranslatef(0, 0, 0); glRotatef(-90, 1, 0, 0); qobj = gluNewQuadric(); gluDisk( qobj, 0., 0.3, 32, 1); gluDeleteQuadric(qobj); glPopMatrix(); /* support post */ makercubenobtm( 0, .2, 0, .05, .2, .05, colorwhite); glColor3fv(colorgrey2); andysphdraw(satSphere, 4); /* if line widths are integral Mesa chokes in a large window */ glLineWidth(3.01); glColor3fv(colorwhite); glPushMatrix(); glDisable(GL_CULL_FACE); glTranslatef(0, .4, 0); glRotatef(-45, 1, 0, 0); qobj = gluNewQuadric(); gluDisk( qobj, 0., 0.35, 32, 1); gluDeleteQuadric(qobj); glPopMatrix(); if (backNow) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); glPushMatrix(); glTranslatef(0, .4, 0); glRotatef(-45, 1, 0, 0); glColor3fv(colorgrey1); glBegin(GL_LINE_STRIP); glVertex3fv(sat0); glVertex3fv(sat1); glVertex3fv(sat2); glEnd(); glBegin(GL_LINE_STRIP); glVertex3fv(sat3); glVertex3fv(sat1); glVertex3fv(sat4); glEnd(); glPopMatrix(); glLineWidth(lineWidthNow); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw drive in theatre screen */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding26(int rorl, int detail) { /***************************/ /* theatre screen supports */ /***************************/ float screen0[3] = {-0.39, 0.01, -0.28}; float screen1[3] = {-0.39, 0.01, 0.28}; float screen2[3] = { 0.39, 0.01, 0.28}; float screen3[3] = { 0.39, 0.01, -0.28}; float screen4[3] = {-0.39, 0.79, 0.28}; float screen5[3] = { 0.39, 0.79, 0.28}; float screen6[3] = { 0.39, 0.01, -0.28}; static float vec1[3]={0,1,0}; static float vec2[3]={1,1,0}; static float vec3[3]={1,0,0}; static float vec4[3]={0,0,0}; static float tv1[2] = {0,1}; static float tv2[2] = {1,1}; static float tv3[2] = {1,0}; static float tv4[2] = {0,0}; GLfloat lineWidthNow; glGetFloatv(GL_LINE_WIDTH, &lineWidthNow); /* supports for the screen */ glColor4fv(colorgrey2); /* if line widths are integral Mesa chokes in a large window */ glLineWidth(3.01); glBegin(GL_LINE_LOOP); glVertex3fv(screen0); glVertex3fv(screen1); glVertex3fv(screen2); glVertex3fv(screen3); glEnd(); glBegin(GL_LINE_LOOP); glVertex3fv(screen0); glVertex3fv(screen4); glVertex3fv(screen5); glVertex3fv(screen6); glEnd(); /* back of the screen */ makercubenobtm( 0, 0.42, 0.28, 0.4,0.42, 0.01, colorwhite); if ((detail >= 2) && (picleft != NULL) && (picright != NULL)) { glPushMatrix(); glColor4fv(colorwhite); if (rorl == 0) glCallList(leftScreen); else glCallList(rightScreen); glEnable(GL_TEXTURE_2D); glTranslatef(0.4, 0, 0.3); glScalef(0.8, 0.8, 0.01); glRotatef(180, 0, 1, 0); glBegin(GL_QUADS); glTexCoord2fv(tv1); glVertex3fv(vec1); glTexCoord2fv(tv2); glVertex3fv(vec2); glTexCoord2fv(tv3); glVertex3fv(vec3); glTexCoord2fv(tv4); glVertex3fv(vec4); glEnd(); glDisable(GL_TEXTURE_2D); glPopMatrix(); } glLineWidth(lineWidthNow); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw fountain */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding29(int itsChristmas, int detail) { makercubenobtm( 0, .05, 0, .3, .05, .3, colorwhite); makercubenobtm( .25, .1, 0, .05, .1, .3, colorwhite); makercubenobtm( -.25, .1, 0, .05, .1, .3, colorwhite); makercubenobtm( 0, .1, .25, .3, .1, .05, colorwhite); makercubenobtm( 0, .1, -.25, .3, .1, .05, colorwhite); makeitPyr(3, colorgrey1, 0, 0.3, 0, 0.1, 0.3, 0.1); if (!itsChristmas) { if (detail > 0) glEnable(GL_BLEND); makercubenobtm( 0, .1, 0, .19, .11, .19, colormaserblue); glDisable(GL_BLEND); } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw hero beam in effect */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBuilding33(int count, int detail) { float c[4], height; c[0] = colorred[0]; c[1] = colorred[1] + (count/40.0); c[2] = colorred[2]; c[3] = 1 - (count/20.0); height = .8 - 0.04*count; if (detail > 0) glEnable(GL_BLEND); glPushMatrix(); glTranslatef(-.2, height, -.2); glScalef(.2, height, .2); drawClosedCylinder(c, c, 0, detail); glPopMatrix(); glDisable(GL_BLEND); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw power line tower */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawTower(int death, int death2) { float v1[3], v2[3], v3[3], v4[3]; float v5[3], v6[3], v7[3], v8[3]; float va[3], vb[3], vc[3], vd[3]; float ve[3], vf[3], vg[3]; float vh[3], vi[3], vj[3]; float amt, amt2; float samt2, samt, camt2; float melt1, melt2; amt = 2 * death * DEG_TO_RAD; amt2 = death2 * DEG_TO_RAD; samt2 = sin(amt2); samt = sin(amt); camt2 = cos(amt); melt1 = samt2 * 0.5*samt; melt2 = camt2 * 0.5*samt; if (death > 0) glColor3fv(colorwhite); else glColor3fv(colorgrey1); if (death == 0) v1[1] = v2[1] = v3[1] = v4[1] = 0.7; else v1[1] = v2[1] = v3[1] = v4[1] = 0.3 + 0.4 * camt2; v1[0] = v4[0] = -0.06; v1[2] = v2[2] = 0.06; v2[0] = v3[0] = 0.06; v3[2] = v4[2] = - 0.06; v5[0] = v8[0] = -0.3; v5[1] = v6[1] = v7[1] = v8[1] = 0.0; v5[2] = v6[2] = 0.3; v6[0] = v7[0] = 0.3; v7[2] = v8[2] = - 0.3; if (death == 0) { va[1] = vb[1] = vc[1] = vd[1] = 1.5; va[0] = v1[0]; va[2] = v1[2]; vb[0] = v2[0]; vb[2] = v2[2]; vc[0] = v3[0]; vc[2] = v3[2]; vd[0] = v4[0]; vd[2] = v4[2]; } else { va[1] = vb[1] = vc[1] = vd[1] = 1.5 * camt2; va[0] = v1[0]+ melt1; va[2] = v1[2]+ melt2; vb[0] = v2[0]+ melt1; vb[2] = v2[2]+ melt2; vc[0] = v3[0]+ melt1; vc[2] = v3[2]+ melt2; vd[0] = v4[0]+ melt1; vd[2] = v4[2]+ melt2; } ve[1] = vf[1] = vc[1] - 0.2; ve[0] = vc[0]; ve[2] = vc[2]; vf[0] = vd[0]; vf[2] = vd[2]; vg[0] = (vc[0] + vd[0]) * 0.5; vg[1] = vc[1] - 0.1; vg[2] = vc[2] - .2; vh[0] = va[0]; vh[1] = vi[1] = va[1] - 0.2; vh[2] = va[2]; vi[0] = vb[0]; vi[2] = vb[2]; vj[0] = (va[0] + vb[0]) * 0.5; vj[1] = va[1] - 0.1; vj[2] = va[2] + .2; /* if line widths are integral Mesa chokes in a large window */ glLineWidth(3.01); /********/ /* legs */ /********/ glBegin(GL_LINE_LOOP); glVertex3fv(v1); glVertex3fv(v2); glVertex3fv(v3); glVertex3fv(v4); glEnd(); glBegin(GL_LINE_LOOP); glVertex3fv(v4); glVertex3fv(v5); glVertex3fv(v2); glVertex3fv(v7); glEnd(); glBegin(GL_LINE_LOOP); glVertex3fv(v1); glVertex3fv(v6); glVertex3fv(v3); glVertex3fv(v8); glEnd(); /* if line widths are integral Mesa chokes in a large window */ glLineWidth(2.01); /*******/ /* top */ /*******/ glBegin(GL_LINE_LOOP); glVertex3fv(va); glVertex3fv(vb); glVertex3fv(vc); glVertex3fv(vd); glEnd(); /*************************/ /* supports and verticals*/ /*************************/ glBegin(GL_LINE_STRIP); glVertex3fv(v7); glVertex3fv(v3); glVertex3fv(vc); glVertex3fv(vg); glVertex3fv(ve); glEnd(); glBegin(GL_LINE_STRIP); glVertex3fv(v8); glVertex3fv(v4); glVertex3fv(vd); glVertex3fv(vg); glVertex3fv(vf); glEnd(); glBegin(GL_LINE_STRIP); glVertex3fv(v5); glVertex3fv(v1); glVertex3fv(va); glVertex3fv(vj); glVertex3fv(vh); glEnd(); glBegin(GL_LINE_STRIP); glVertex3fv(v6); glVertex3fv(v2); glVertex3fv(vb); glVertex3fv(vj); glVertex3fv(vi); glEnd(); glBegin(GL_LINE_LOOP); glVertex3fv(ve); glVertex3fv(vf); glVertex3fv(vh); glVertex3fv(vi); glEnd(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw the square playing field */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBattlefield(struct road * roads, float xshift, float zshift, int detail, int itsChristmas, int view) { float theta, radius; float angle; /******************************/ /* 'where is the town' arrow */ /******************************/ static float arrow[4][3] = {-0.2, PLANEY + 0.01, -1.0, -0.2, PLANEY + 0.01, 1.0, 0.2, PLANEY + 0.01, 1.0, 0.2, PLANEY + 0.01, -1.0}; static float arrowhead[3][3] = {0.0, PLANEY + 0.01, -1.75, -0.5, PLANEY + 0.01, -1.0, 0.5, PLANEY + 0.01, -1.0}; if (itsChristmas) glColor3fv(colorsnow); else glColor3fv(planeGreen); if (view == MAPVIEW) glCallList(bigPlane); else if (detail <= 1) glCallList(lowDPlane); else glCallList(highDPlane); /***************/ /* draw roads */ /***************/ drawRoads(roads, xshift, zshift, itsChristmas, view, detail); radius = sqrt(xshift * xshift + zshift * zshift); if (radius > 36) { /**********************/ /* draw town pointer */ /**********************/ if (zshift == 0) zshift = NEARZERO; theta = atan(xshift / zshift); if (zshift > 0) theta += PI; angle = theta * RAD_TO_SMALL_DEG; glPushMatrix(); glRotatef(angle, 0, 1, 0); glColor3fv(colorred); glBegin(GL_QUADS); glVertex3fv(arrow[0]); glVertex3fv(arrow[1]); glVertex3fv(arrow[2]); glVertex3fv(arrow[3]); glEnd(); glBegin(GL_TRIANGLES); glVertex3fv(arrowhead[0]); glVertex3fv(arrowhead[1]); glVertex3fv(arrowhead[2]); glEnd(); glPopMatrix(); } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw square lake segment */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawLake0(int itsChristmas) { static float lake[4][3] = {-0.3, 0.0, -0.3, 0.3, 0.0, -0.3, 0.3, 0.0, 0.3, -0.3, 0.0, 0.3}; if (itsChristmas) glColor3fv(colorblue); else glColor3fv(colorwater); glBegin(GL_QUADS); glVertex3fv(lake[3]); glVertex3fv(lake[2]); glVertex3fv(lake[1]); glVertex3fv(lake[0]); glEnd(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw triangular lake segment */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawLake1(int itsChristmas) { float lake2[3][3] = {-0.3, 0.0, -0.3, 0.3, 0.0, -0.3, -0.3, 0.0, 0.3}; if (itsChristmas) glColor3fv(colorblue); else glColor3fv(colorwater); glBegin(GL_TRIANGLES); glVertex3fv(lake2[2]); glVertex3fv(lake2[1]); glVertex3fv(lake2[0]); glEnd(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw central hill segment */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawHill0(int itsChristmas) { static float hill[4][3] = {-0.3, 0.6, -0.3, 0.3, 0.6, -0.3, 0.3, 0.6, 0.3, -0.3, 0.6, 0.3}; if (itsChristmas) glColor3fv(colorsnow); else glColor3fv(planeGreen2); glBegin(GL_QUADS); glVertex3fv(hill[3]); glVertex3fv(hill[2]); glVertex3fv(hill[1]); glVertex3fv(hill[0]); glEnd(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw side of hill */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawHill1(int sidemod, int itsChristmas) { float c[4]; static float side[4][3] = {-0.3, 0.6, -0.3, 0.3, 0.6, -0.3, 0.3, 0.0, 0.3, -0.3, 0.0, 0.3}; if (itsChristmas) { c[0] = colorsnow2[0]; c[1] = colorsnow2[1]; c[2] = colorsnow2[2]; } else { c[0] = planeGreen3[0]; c[1] = planeGreen3[1]; c[2] = planeGreen3[2]; } c[0] -= sidemod*0.04; c[1] -= sidemod*0.04; c[2] -= sidemod*0.04; if (c[0] < 0) c[0] = 0; if (c[1] < 0) c[1] = 0; if (c[2] < 0) c[2] = 0; glColor3fv(c); glBegin(GL_QUADS); glVertex3fv(side[3]); glVertex3fv(side[2]); glVertex3fv(side[1]); glVertex3fv(side[0]); glEnd(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw corner of hill */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawHill2(int sidemod, int itsChristmas) { float c[4]; static float corner[3][3] = {-0.3, 0.6, -0.3, 0.3, 0.0, -0.3, -0.3, 0.0, 0.3}; if (itsChristmas) { c[0] = colorsnow2[0]; c[1] = colorsnow2[1]; c[2] = colorsnow2[2]; } else { c[0] = planeGreen3[0]; c[1] = planeGreen3[1]; c[2] = planeGreen3[2]; } c[0] -= (sidemod*0.04 + 0.02); c[1] -= (sidemod*0.04 + 0.02); c[2] -= (sidemod*0.04 + 0.02); if (c[0] < 0) c[0] = 0; if (c[1] < 0) c[1] = 0; if (c[2] < 0) c[2] = 0; glColor3fv(c); glBegin(GL_TRIANGLES); glVertex3fv(corner[2]); glVertex3fv(corner[1]); glVertex3fv(corner[0]); glEnd(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw inside corner of hill */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawHill3(int sidemod, int itsChristmas) { float c[4]; static float insidecorner[4][3] = {-0.3, 0.6, -0.3, 0.3, 0.6, -0.3, -0.3, 0.6, 0.3, 0.3, 0.0, 0.3 }; if (itsChristmas) glColor3fv(colorsnow); else glColor3fv(planeGreen2); glBegin(GL_TRIANGLES); glVertex3fv(insidecorner[2]); glVertex3fv(insidecorner[1]); glVertex3fv(insidecorner[0]); glEnd(); if (itsChristmas) { c[0] = colorsnow2[0]; c[1] = colorsnow2[1]; c[2] = colorsnow2[2]; } else { c[0] = planeGreen3[0]; c[1] = planeGreen3[1]; c[2] = planeGreen3[2]; } c[0] -= (sidemod*0.04 + 0.02); c[1] -= (sidemod*0.04 + 0.02); c[2] -= (sidemod*0.04 + 0.02); if (c[0] < 0) c[0] = 0; if (c[1] < 0) c[1] = 0; if (c[2] < 0) c[2] = 0; glColor3fv(c); glBegin(GL_TRIANGLES); glVertex3fv(insidecorner[2]); glVertex3fv(insidecorner[3]); glVertex3fv(insidecorner[1]); glEnd(); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawWater(int shape, int itsChristmas) { switch(shape){ case 0: drawLake0(itsChristmas); break; case 1: drawLake1(itsChristmas); /* |/ */ break; case 2: glRotatef(-90, 0, 1, 0); /* \| */ drawLake1(itsChristmas); break; case 3: glRotatef(-180, 0, 1, 0); /* /| */ drawLake1(itsChristmas); break; case 4: glRotatef(90, 0, 1, 0); /* |\ */ drawLake1(itsChristmas); break; } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawHills(int shape, int itsChristmas) { switch(shape){ case 0: drawHill0(itsChristmas); break; case 1: drawHill1(0, itsChristmas); /* up neg Z */ break; case 2: glRotatef(-90, 0, 1, 0); /* up pos x */ drawHill1(1, itsChristmas); break; case 3: glRotatef(-180, 0, 1, 0); /* up pos z */ drawHill1(2, itsChristmas); break; case 4: glRotatef(90, 0, 1, 0); /* up neg x */ drawHill1(1, itsChristmas); break; case 5: drawHill2(0, itsChristmas); /* +x,+z corner */ break; case 6: glRotatef(-90, 0, 1, 0); /* up pos x */ drawHill2(0, itsChristmas); break; case 7: glRotatef(-180, 0, 1, 0); /* up pos z */ drawHill2(1, itsChristmas); break; case 8: glRotatef(90, 0, 1, 0); /* up neg x */ drawHill2(1, itsChristmas); break; case 9: drawHill3(0, itsChristmas); /* up +x,-z */ break; case 10: glRotatef(-90, 0, 1, 0); /* up +x,+z */ drawHill3(0, itsChristmas); break; case 11: glRotatef(-180, 0, 1, 0); /* up pos z */ drawHill3(1, itsChristmas); break; case 12: glRotatef(90, 0, 1, 0); /* up neg x */ drawHill3(1, itsChristmas); break; } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw all structures on plane (buildings,trees,hills,lakes) */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawtrees(struct tree * allTreesOnPlane, int numTreesOnPlane, int counter, int detail, int itsChristmas, int view) { float spheredat[4]; float x, y, z; register int treeCounter; int sph; GLfloat lineWidthNow; GLint shadeNow; glGetIntegerv(GL_SHADE_MODEL, &shadeNow); if (detail >= 2) sph = 5; else if (detail == 1) sph = 4; else sph = 2; for (treeCounter=0; treeCounter < numTreesOnPlane; treeCounter++) { if (detail >= 2) glShadeModel(GL_SMOOTH); else glShadeModel(GL_FLAT); if (((fabs(allTreesOnPlane[treeCounter].x) <= PLANESIZE) && (fabs(allTreesOnPlane[treeCounter].z) <= PLANESIZE)) || (view == MAPVIEW)) { x = allTreesOnPlane[treeCounter].x; y = allTreesOnPlane[treeCounter].y; z = allTreesOnPlane[treeCounter].z; /**********************************/ /* tree */ /**********************************/ if (allTreesOnPlane[treeCounter].type == 0) { if ((allTreesOnPlane[treeCounter].treeshape == 0) || (itsChristmas)) { /*************/ /* pine tree */ /*************/ if (detail >= 2) { glCallList(treeWood); glEnable(GL_TEXTURE_2D); } makercubenobtmnotopTEX( x, y+0.2, z, 0.075, 0.2, 0.075, colorbrown); glDisable(GL_TEXTURE_2D); /* regular pine tree colour is too dark in vector mode */ if (detail > -1) makeitPyr(1, treeColor, x, y+0.8, z, 0.2, 0.4, 0.2); else makeitPyr(1, treeColor2, x, y+0.8, z, 0.2, 0.4, 0.2); glColor4fv(colorblack); if (detail > 0) drawShadow(x, z, 0.2, 0.2); if (itsChristmas) { makercube( x+0.09, y+0.9, z+0.09, 0.025, 0.025, 0.025, coloryellow); makercube( x-0.12, y+0.7, z+0.12, 0.025, 0.025, 0.025, colorred); makercube( x-0.1, y+0.9, z-0.1, 0.025, 0.025, 0.025, colormaserblue); makercube( x+0.12, y+0.7, z-0.12, 0.025, 0.025, 0.025, colororange); } } else /**************/ /* round tree */ /**************/ { if (detail >= 2) { glCallList(treeWood); glEnable(GL_TEXTURE_2D); } makercubenobtmnotopTEX(x, y+0.4, z, 0.1, 0.4, 0.1, colorbrown); glDisable(GL_TEXTURE_2D); glColor3fv(treeColor2); spheredat[0] = x; spheredat[1] = y+1; spheredat[2] = z; spheredat[3] = 0.3; andysphdraw(spheredat, sph); if (detail > 0) { glPushMatrix(); glColor3fv(colorblack); glTranslatef(x, SHADOWS, z); glCallList(roundTreeShadow); glPopMatrix(); } } } /**********************************/ /* building */ /**********************************/ if (allTreesOnPlane[treeCounter].type == 1) { glPushMatrix(); glTranslatef(x, y, z); if (allTreesOnPlane[treeCounter].treeshape <= 17) switch(allTreesOnPlane[treeCounter].treeshape){ case 0: drawBuilding0(colorwhite, detail); break; case 1: if (detail == 0) glCallList(building1ObjD0); else glCallList(building1Obj); break; case 2: if (detail == 0) glCallList(building2ObjD0); else glCallList(building2Obj); break; case 3: glGetFloatv(GL_LINE_WIDTH, &lineWidthNow); if (allTreesOnPlane[treeCounter].deathCount && allTreesOnPlane[treeCounter].death2) drawTower(allTreesOnPlane[treeCounter].deathCount, allTreesOnPlane[treeCounter].death2); else glCallList(powerTower); glLineWidth(lineWidthNow); break; case 4: glPushAttrib(GL_LIGHTING_BIT); if (detail <= 0) { glShadeModel(GL_FLAT); drawCoolingTower(detail); } else { glShadeModel(GL_SMOOTH); drawCoolingTower(detail); /* cooling tower */ } glPopAttrib(); break; case 5: if (detail == 0) /* home */ glCallList(building5ObjD0); else glCallList(building5Obj); break; case 6: drawBuilding6(counter, colorred, coloryellow, detail); /* fast food */ break; case 7: glCallList(building7Obj); break; case 8: drawBuilding8(colorbeige, colorbrown, detail); break; case 9: glPushAttrib(GL_LIGHTING_BIT); if (detail < 0) { glShadeModel(GL_FLAT); glCallList(building9ObjOO); } else if (detail == 0) { glShadeModel(GL_FLAT); glCallList(building9Obj); } else { glShadeModel(GL_SMOOTH); glCallList(building9Obj); /*water tower*/ } glPopAttrib(); break; case 10: glGetFloatv(GL_LINE_WIDTH, &lineWidthNow); glCallList(building10Obj); glLineWidth(lineWidthNow); break; case 11: glPushAttrib(GL_LIGHTING_BIT); if (detail <= 0) glShadeModel(GL_FLAT); else glShadeModel(GL_SMOOTH); drawBuilding11(detail); /* factory smokestacks*/ glPopAttrib(); break; case 12: if (detail == 0) glCallList(building12ObjD0); else glCallList(building12Obj); break; case 13: glRotatef(180, 0, 1, 0); if (detail == 0) glCallList(building5ObjD0); else glCallList(building5Obj); break; case 14: glCallList(building14Obj); break; case 15: glCallList(strip1Obj); /* strip mall */ break; case 16: glCallList(strip2Obj); /* strip mall */ break; case 17: glCallList(strip3Obj); /* strip mall */ break; } else switch(allTreesOnPlane[treeCounter].treeshape){ case 18: glRotatef(90, 0, 1, 0); drawBuilding0(colorgrey1, detail); break; case 19: if (detail == 0) glCallList(building19ObjD0); else glCallList(building19Obj); break; case 20: if (detail == 0) glCallList(building20ObjD0); else glCallList(building20Obj); break; case 21: if (detail == 0) glCallList(building21ObjD0); else glCallList(building21Obj); break; case 22: drawBuilding22(colorgrey1); break; case 23: drawBuilding22(colorgrey2); break; case 24: drawBuilding22(colorwhite); break; case 25: drawBuilding25(); break; case 26: drawBuilding26(0, detail); break; case 27: drawBuilding26(1, detail); break; case 28: glRotatef(-90, 0, 1, 0); drawBuilding6(counter, colorgrey2, colorblue, detail); break; case 29: drawBuilding29(itsChristmas, detail); break; case 30: drawBuilding8(colorbeige, colorgrey2, detail); break; case 31: glCallList(building31Obj); /* maser battery */ break; case 32: glCallList(building32Obj); /* helo pad */ break; case 33: drawBuilding33(allTreesOnPlane[treeCounter].deathCount, detail); /* hero entrance */ break; case 34: drawBuilding34(colorblue2); /* smallest office building */ break; case 36: drawBuilding36(colorblue2); /* small office building */ break; case 37: drawBuilding37(colorblue2, detail); break; default: showError("Bogus Building in Tree List! (drawtrees)"); break; } glPopMatrix(); } /**********************************/ /* water */ /**********************************/ if (allTreesOnPlane[treeCounter].type == 2) { glPushMatrix(); glTranslatef(x, ROADS, z); drawWater(allTreesOnPlane[treeCounter].treeshape, itsChristmas); glPopMatrix(); } /**********************************/ /* hills */ /**********************************/ if (allTreesOnPlane[treeCounter].type == 3) { glPushMatrix(); glTranslatef(x, PLANEY, z); drawHills(allTreesOnPlane[treeCounter].treeshape, itsChristmas); glPopMatrix(); } } } glShadeModel(shadeNow); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw all tanks currently dying */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawSlagTanks(struct tank * allSlags, int counter, int detail) { int c; float angle2; struct tank * ttank; for(ttank = allSlags->next;ttank != NULL;ttank = ttank->next) { if ((fabs(ttank->x) <= PLANESIZE) && (fabs(ttank->z) <= PLANESIZE)) { angle2 = ttank->theta * RAD_TO_SMALL_DEG; c = ttank->count; glPushMatrix(); switch(ttank->type){ case TANK: glTranslatef(ttank->x, ttank->y-0.015, ttank->z); glScalef(1+0.015*c, 1-0.015*c, 1+0.015*c); glRotatef(angle2, 0, 1, 0); glCallList(slagtank); break; case LAUNCHER: glTranslatef(ttank->x, ttank->y-0.015, ttank->z); glScalef(1+0.015*c, 1-0.015*c, 1+0.015*c); glRotatef(angle2, 0, 1, 0); glCallList(slaglaunchertank); break; case MASERTANK: glTranslatef(ttank->x, ttank->y-0.015, ttank->z); glScalef(0.15+0.002*c, 0.15-0.004*c, 0.15+0.002*c); glRotatef(angle2, 0, 1, 0); glCallList(slagmasertank); break; case HELO: glTranslatef(ttank->x, ttank->y, ttank->z); glRotatef(c*4.0, 1, 0, 0); glRotatef(c*1.5, 0, 0, 1); glRotatef(angle2+180+(c*10), 0, 1, 0); drawHelo((counter*9) % 360, 1); break; case CHH: glTranslatef(ttank->x, ttank->y, ttank->z); glRotatef(c*4.0, 1, 0, 0); glRotatef(c*1.5, 0, 0, 1); glRotatef(angle2+(c*10), 0, 1, 0); makeCHH(0); break; case MECHAG: glTranslatef(ttank->x, 0, ttank->z); glRotatef(angle2, 0, 1, 0); drawMechaMonster(0, counter, detail); break; case HERO: glTranslatef(ttank->x, 0, ttank->z); glRotatef(angle2, 0, 1, 0); if (ttank->subtype == 0) drawHeroDude(0, ttank->walking, ttank->maserCount, c, detail); else drawHeroDude2(0, ttank->walking, ttank->maserCount, c, detail); break; case AIRPLANE: glTranslatef(ttank->x, ttank->y, ttank->z); glRotatef(c*1.5, 0, 0, 1); glRotatef(angle2+180+(c*10), 0, 1, 0); glScalef(3, 3, 3); drawAirplane((counter*2) % 360); break; case FIGHTER: glTranslatef(ttank->x, ttank->y, ttank->z); glRotatef(c*1.5, 0, 0, 1); glRotatef(angle2+180+(c*10), 0, 1, 0); glScalef(2, 2, 2); drawFighter(); break; default: showError("Bogus Vehicle in Tank List! (drawSlagTanks)"); break; } glPopMatrix(); } } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw maser beams */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawMaser(float sourceX, float sourceY, float sourceZ, int shooter, float mX, float mZ, float mHeight, float mBottom, float r1, float r2, float r3, int width, int view, int detail) { float beamLoc1[3], beamLoc2[3]; GLfloat lineWidthNow; beamLoc1[0] = sourceX; beamLoc1[1] = sourceY; beamLoc1[2] = sourceZ; beamLoc2[0] = mX + r1; beamLoc2[1] = 0.5 * (mHeight - mBottom) + mBottom + r2; beamLoc2[2] = mZ + r3; glGetFloatv(GL_LINE_WIDTH, &lineWidthNow); /* if line widths are integral Mesa chokes in a large window */ if ((view == MONSTERVIEW) || (view == ARMYVIEW)) glLineWidth(width * 0.0057); else glLineWidth(width * 0.0029); glColor3fv(colorwhite); glBegin(GL_LINES); glVertex3fv(beamLoc1); glVertex3fv(beamLoc2); glEnd(); switch(shooter) { case MASERTANK: glColor3fv(colormaserblue); break; case CHH: glColor3fv(colormaseryellow); break; case MECHAG: glColor3fv(colorred); break; default: showError("Invalid Vehicle Type (drawMaser)"); break; } if (detail != -1) glEnable(GL_BLEND); /* if line widths are integral Mesa chokes in a large window */ if ((view == MONSTERVIEW) || (view == ARMYVIEW)) glLineWidth(width * 0.011); else glLineWidth(width * 0.0057); glBegin(GL_LINES); glVertex3fv(beamLoc1); glVertex3fv(beamLoc2); glEnd(); glDisable(GL_BLEND); glLineWidth(lineWidthNow); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw all tanks on the battlefield */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawTanks(struct tank * allTanks, int counter, struct monsterInfo G, struct targetInfo * targs, int detail, int view, int wid) { struct tank cTank; struct tank * temptank; float angle2; int monsterIsDead; float height, bottom; float xloc, zloc; float radToNearestTarget, rad; struct targetInfo * nearestTarget; struct monsterInfo * nearestMonster; struct targetInfo * temptarget; for(temptank = allTanks->next;temptank != NULL;temptank = temptank->next) { cTank = *temptank; if (((fabs(cTank.x) <= PLANESIZE) && (fabs(cTank.z) <= PLANESIZE)) || (view == MAPVIEW)) { /* need to find the nearest target */ radToNearestTarget = 10000; nearestTarget = NULL; for(temptarget = targs->next;temptarget != NULL;temptarget = temptarget->next) { rad = sqrt((cTank.x-temptarget->x) * (cTank.x-temptarget->x) + (cTank.z-temptarget->z) * (cTank.z-temptarget->z)); if (rad < radToNearestTarget) { radToNearestTarget = rad; nearestTarget = temptarget; nearestMonster = &(temptarget->monster); } } /* need to compute radius to player's monster */ rad = sqrt(cTank.x * cTank.x + cTank.z * cTank.z); if (rad < radToNearestTarget) { radToNearestTarget = rad; nearestMonster = NULL; nearestTarget = NULL; } if (nearestMonster == NULL) { monsterIsDead = G.monsterIsDead; height = G.height; bottom = G.bottom; xloc = 0; zloc = 0; } else { monsterIsDead = nearestMonster->monsterIsDead; height = nearestMonster->height; bottom = nearestMonster->bottom; xloc = nearestTarget->x; zloc = nearestTarget->z; } /**********************************/ /* aim vehicle */ /**********************************/ angle2 = cTank.theta * RAD_TO_SMALL_DEG; /**********************************/ /* draw vehicle */ /**********************************/ glPushMatrix(); switch (cTank.type) { case TANK: glTranslatef(cTank.x, cTank.y, cTank.z); glRotatef(angle2, 0, 1, 0); glCallList(plaintank); break; case LAUNCHER: glTranslatef(cTank.x, cTank.y, cTank.z); glRotatef(angle2, 0, 1, 0); glCallList(launchertank); break; case MASERTANK: glTranslatef(cTank.x, cTank.y, cTank.z); glRotatef(angle2, 0, 1, 0); glScalef(0.15, 0.15, 0.15); glCallList(masertank); break; case HELO: glTranslatef(cTank.x, cTank.y, cTank.z); glRotatef(angle2+180, 0, 1, 0); drawHelo((counter*9) % 360, 0); break; case AIRPLANE: glTranslatef(cTank.x, cTank.y, cTank.z); glRotatef(angle2+180, 0, 1, 0); glScalef(3, 3, 3); drawAirplane((counter*2) % 360); break; case FIGHTER: glTranslatef(cTank.x, cTank.y, cTank.z); glRotatef(angle2+180, 0, 1, 0); glScalef(2, 2, 2); drawFighter(); break; case CHH: glTranslatef(cTank.x, cTank.y, cTank.z); glRotatef(angle2, 0, 1, 0); makeCHH(cTank.damage); break; case MECHAG: glTranslatef(cTank.x, 0, cTank.z); glRotatef(angle2, 0, 1, 0); drawMechaMonster(cTank.damage, counter, detail); break; case HERO: glTranslatef(cTank.x, 0, cTank.z); glRotatef(angle2, 0, 1, 0); if (cTank.subtype == 0) drawHeroDude(cTank.damage, cTank.walking, cTank.maserCount, 0, detail); else drawHeroDude2(cTank.damage, cTank.walking, cTank.maserCount, 0, detail); break; default: showError("Bogus Vehicle in Tank List! (drawTanks)"); break; } glPopMatrix(); if (detail > 0) { /**********************************/ /* draw shadow */ /**********************************/ glPushMatrix(); glTranslatef(cTank.x, 0, cTank.z); glRotatef(angle2, 0, 1, 0); switch (cTank.type){ case TANK: case LAUNCHER: case MASERTANK: glCallList(tankShadow); break; case HELO: glColor4fv(colorblack); drawShadow (0, 0, 0.14, 0.18); drawShadow (0, -0.22, 0.04, 0.1); break; case MECHAG: break; case CHH: glColor4fv(colorblack); drawShadow (0, 0, 0.14, 0.22); break; case HERO: glColor4fv(colorblack); drawShadow (0, 0, 0.12, 0.08); break; case AIRPLANE: glCallList(planeShadow); break; case FIGHTER: glCallList(fighterShadow); break; default: showError("Bogus Vehicle in Tank List! (drawTanks)"); break; } glPopMatrix(); } if ((cTank.maserCount > 0) && (cTank.rad <= cTank.range) && (cTank.rad >= 0.5) && (!monsterIsDead)) { /**********************************/ /* mechaGoogelon firing maser */ /**********************************/ if (cTank.type == MECHAG) drawMaser(cTank.x, cTank.y + 0.8, cTank.z, cTank.type, xloc, zloc, height, bottom, cTank.rand1, cTank.rand2, cTank.rand3, wid, view, detail); /**********************************/ /* 009CHH firing maser */ /**********************************/ if (cTank.type == CHH) drawMaser(cTank.x, cTank.y, cTank.z, cTank.type, xloc, zloc, height, bottom, cTank.rand1, cTank.rand2, cTank.rand3, wid, view, detail); /**********************************/ /* tank firing maser */ /**********************************/ if (cTank.type == MASERTANK) drawMaser(cTank.x, cTank.y + 0.375, cTank.z, cTank.type, xloc, zloc, height, bottom, cTank.rand1, cTank.rand2, cTank.rand3, wid, view, detail); /**********************************/ /* hero firing its weapon */ /**********************************/ if ((cTank.type == HERO) && (cTank.subtype == 1) && (cTank.maserCount > 10) && (cTank.maserCount < 30)) if (nearestTarget) drawHeroWeapon(nearestTarget->x, nearestTarget->z, cTank.x, cTank.y + 0.275, cTank.z, colormaserblue, height, bottom); else drawHeroWeapon(0, 0, cTank.x, cTank.y + 0.275, cTank.z, colormaserblue, height, bottom); } } } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw hero energy beam */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawHeroWeapon(float targetx, float targetz, float x, float y, float z, float * color, float height, float bottom) { float loc1[3], loc2[3]; float rad, angle, r; float midPoint; GLboolean backNow; GLint shadeNow; glGetIntegerv(GL_SHADE_MODEL, &shadeNow); backNow = glIsEnabled(GL_CULL_FACE); rad = sqrt(x * x + z * z); if (rad == 0) rad = NEARZERO; r = 0.16 / rad; if (z == 0) z = NEARZERO; angle = atan(x / z); if (z > 0) angle += PI; angle += PI; midPoint = 0.5 * (height - bottom) + bottom; glShadeModel(GL_SMOOTH); glDisable(GL_CULL_FACE); glBegin(GL_QUADS); glColor3fv(color); loc1[0] = (rad - 0.22) * sin(angle + r); loc1[1] = y; loc1[2] = (rad - 0.22) * cos(angle + r); glVertex3fv(loc1); loc1[0] = (rad - 0.22) * sin(angle - r); loc1[2] = (rad - 0.22) * cos(angle - r); glVertex3fv(loc1); glColor3fv(colorwhite); loc2[0] = targetx - 0.04; loc2[2] = targetz - 0.04; loc2[1] = midPoint; glVertex3fv(loc2); loc2[0] = targetx + 0.04; loc2[2] = targetz + 0.04; glVertex3fv(loc2); glEnd(); /* make beam viewable from side */ glBegin(GL_QUADS); glColor3fv(color); loc1[0] = (rad - 0.22) * sin(angle); loc1[1] = y + 0.03; loc1[2] = (rad - 0.22) * cos(angle); glVertex3fv(loc1); loc1[1] = y - 0.03; glVertex3fv(loc1); glColor3fv(colorwhite); loc2[0] = targetx; loc2[2] = targetz; loc2[1] = midPoint - 0.02; glVertex3fv(loc2); loc2[1] = midPoint + 0.02; glVertex3fv(loc2); glEnd(); if (backNow) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); glShadeModel(shadeNow); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void makeBooms() { int counter; GLuint O; float spheredat[4]; spheredat[0] = 0; spheredat[1] = 0; spheredat[2] = 0; for(counter=1;counter<=10;counter++) { O = glGenLists(1); glNewList(O, GL_COMPILE); spheredat[3] = 0.03 * counter; andysphdraw(spheredat, 3); glEndList(); switch(counter) { case 1: boom1Obj = O; break; case 2: boom2Obj = O; break; case 3: boom3Obj = O; break; case 4: boom4Obj = O; break; case 5: boom5Obj = O; break; case 6: boom6Obj = O; break; case 7: boom7Obj = O; break; case 8: boom8Obj = O; break; case 9: boom9Obj = O; break; case 10: boom10Obj = O; break; } /* Build smaller booms for detail level 0 */ O = glGenLists(1); glNewList(O, GL_COMPILE); spheredat[3] = 0.02 * counter; andysphdraw(spheredat, 1); glEndList(); switch(counter) { case 1: boom1ObjD0 = O; break; case 2: boom2ObjD0 = O; break; case 3: boom3ObjD0 = O; break; case 4: boom4ObjD0 = O; break; case 5: boom5ObjD0 = O; break; case 6: boom6ObjD0 = O; break; case 7: boom7ObjD0 = O; break; case 8: boom8ObjD0 = O; break; case 9: boom9ObjD0 = O; break; case 10: boom10ObjD0 = O; break; } } } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw explosions */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBooms(struct boom * boomers, int detail) { struct boom * tempboom; struct boom b; if (detail >= 2) glEnable(GL_BLEND); glColor3fv(coloryellow); for(tempboom = boomers->next;tempboom != NULL;tempboom = tempboom->next) { b = *tempboom; if (detail >= 2) { coloryellow[3] = (11 - b.count) * 0.1; glColor4fv(coloryellow); } glPushMatrix(); glTranslatef(b.x, b.y, b.z); if (detail == 0) { /* Draw smaller 'flickering' explosions (Johan) */ switch(b.count) { case 1: glCallList(boom1ObjD0); break; case 3: glCallList(boom3ObjD0); break; case 5: glCallList(boom5ObjD0); break; case 7: glCallList(boom7ObjD0); break; case 9: glCallList(boom9ObjD0); break; } } else { switch(b.count) { case 1: glCallList(boom1Obj); break; case 2: glCallList(boom2Obj); break; case 3: glCallList(boom3Obj); break; case 4: glCallList(boom4Obj); break; case 5: glCallList(boom5Obj); break; case 6: glCallList(boom6Obj); break; case 7: glCallList(boom7Obj); break; case 8: glCallList(boom8Obj); break; case 9: glCallList(boom9Obj); break; case 10: glCallList(boom10Obj); break; } } glPopMatrix(); } if (detail >= 2) glDisable(GL_BLEND); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw googelon/Flutter's energy beam */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawBeam(float x, float z, int horz, int vert, int monsterName, int detail) { float loc1[3], loc2[3], loc3[3]; float c[4] = {0, 0, 0, 0}; float * col; float R; register int i, nlines; GLfloat lineWidthNow; GLint shadeNow; glGetIntegerv(GL_SHADE_MODEL, &shadeNow); glGetFloatv(GL_LINE_WIDTH, &lineWidthNow); if (monsterName == FLUTTER) col = colororange; else col = colorblue; /**********************************/ /* draw beam */ /**********************************/ /* if line widths are integral Mesa chokes in a large window */ glLineWidth(5.01); if (vert < 175) R = 4; else R = 1.2 / (cos((900 - vert) * BIG_DEG_TO_RAD)); if (R < 0) R = 0; if (R > 4) R = 4; if (vert < 0) loc3[1] = PLANEY + 1.2 + R * sin(fabs(vert * BIG_DEG_TO_RAD)); else loc3[1] = PLANEY + 1.2 - R * sin(fabs(vert * BIG_DEG_TO_RAD)); loc1[0] = x; loc1[2] = z; loc1[1] = PLANEY + 1.2; /* this doesnt really work ... beam has xz value of 4 no matter what y is (> plane) * so beam will be longer than 4 as it gets higher up in the sky */ loc3[0] = x+R * -cos((900 + horz) * BIG_DEG_TO_RAD); loc3[2] = z+R * sin((900 + horz) * BIG_DEG_TO_RAD); if (loc3[1] < PLANEY) loc3[1] = PLANEY; if (monsterName == FLUTTER) c[0] = 0.95; else c[2] = 0.95; switch (detail) { case -1: case 0: nlines = 4; break; case 1: nlines = 25; glShadeModel(GL_SMOOTH); break; case 2: nlines = 40; glShadeModel(GL_SMOOTH); break; } for (i = 0; i < nlines; i++) { loc2[0] = loc3[0] + randy(0.04); loc2[1] = loc3[1] + randy(0.04); loc2[2] = loc3[2] + randy(0.04); c[1] = 0.5 + randy(0.5); glBegin(GL_LINES); glColor3fv(c); glVertex3fv(loc2); glColor3fv(col); glVertex3fv(loc1); glEnd(); } glShadeModel(shadeNow); if (detail > 0) { /**********************************/ /* shadow of beam */ /**********************************/ glColor3fv(colorblack); loc1[1] = SHADOWS; loc3[1] = SHADOWS; glBegin(GL_LINES); glVertex3fv(loc1); glVertex3fv(loc3); glEnd(); } glLineWidth(lineWidthNow); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw roads on the battlefield */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawRoads(struct road * roads, float xshift, float zshift, int itsChristmas, int view, int detail) { register int i; float displaySize; float square[4][3]; float v1[3]; float v2[3]; float v3[3]; float v4[3]; float xplus, xminus, zplus, zminus; int ropCounter; static float tv1[2] = {0,1}; static float tv2[2] = {1,1}; static float tv3[2] = {1,0}; static float tv4[2] = {0,0}; float c, d; float cprime, dprime; float xlinemin, xlinemax, zlinemin, zlinemax; float xlinemin2, xlinemax2, zlinemin2, zlinemax2; GLfloat lineWidthNow; glGetFloatv(GL_LINE_WIDTH, &lineWidthNow); xplus = xshift + 0.252; xminus = xshift - 0.252; zplus = zshift + 0.252; zminus = zshift - 0.252; v1[1] = v2[1] = v3[1] = v4[1] = ROADS + 0.001; /***********************************/ /* Draw 'motion' dots on the plane */ /***********************************/ if (view != MAPVIEW) { c = xshift - (int) xshift; d = zshift - (int) zshift; if (itsChristmas) glColor3fv(colorblack); else glColor3fv(coloryellow); if (c > 0) cprime = c-1; else cprime = c; if (d > 0) dprime = d-1; else dprime = d; /* if line widths are integral Mesa chokes in a large window */ glLineWidth(1.01); glPushMatrix(); glTranslatef(cprime, 0, dprime); if (detail == 0) glCallList(planeDotsObjD0); else glCallList(planeDotsObj); glPopMatrix(); } if (view == MAPVIEW) displaySize = 50; else displaySize = PLANESIZE+0.25; if (roads == NULL) return; /***********************************/ /* find all the roads on the plane */ /***********************************/ ropCounter = 0; for(i=0;roads[i].type != NULLROAD;i++) { if ((fabs(roads[i].x+xshift) <= displaySize) && (fabs(roads[i].y+zshift) <= displaySize)) { roadsOnPlane[ropCounter] = roads[i]; ropCounter++; if (ropCounter >= MAXROADSONPLANE) ropCounter = MAXROADSONPLANE - 1; } } square[0][1] = square[1][1] = square[2][1] = square[3][1] = ROADS; /********************/ /* Draw black roads */ /********************/ if (ropCounter > 0) { glColor3fv(colorblack); if (detail >= 2) { glColor3fv(colorwhite); glCallList(roadtex); glEnable(GL_TEXTURE_2D); } glBegin(GL_QUADS); for(i=0; i < ropCounter; i++) { if (roadsOnPlane[i].type < 3) { square[0][0] = square[3][0] = roadsOnPlane[i].x+xplus; square[1][0] = square[2][0] = roadsOnPlane[i].x+xminus; square[0][2] = square[1][2] = roadsOnPlane[i].y+zplus; square[2][2] = square[3][2] = roadsOnPlane[i].y+zminus; if (detail <2) { glVertex3fv(square[3]); glVertex3fv(square[2]); glVertex3fv(square[1]); glVertex3fv(square[0]); } else { glTexCoord2fv(tv1); glVertex3fv(square[3]); glTexCoord2fv(tv4); glVertex3fv(square[2]); glTexCoord2fv(tv3); glVertex3fv(square[1]); glTexCoord2fv(tv2); glVertex3fv(square[0]); } } } glEnd(); glDisable(GL_TEXTURE_2D); } /*******************/ /* Draw grey roads */ /*******************/ if (ropCounter > 0) { glColor3fv(colorgrey4); glBegin(GL_QUADS); for(i=0; i < ropCounter; i++) { if (roadsOnPlane[i].type >= 3) { square[0][0] = square[3][0] = roadsOnPlane[i].x+xplus; square[1][0] = square[2][0] = roadsOnPlane[i].x+xminus; square[0][2] = square[1][2] = roadsOnPlane[i].y+zplus; square[2][2] = square[3][2] = roadsOnPlane[i].y+zminus; glVertex3fv(square[3]); glVertex3fv(square[2]); glVertex3fv(square[1]); glVertex3fv(square[0]); } } glEnd(); } if (detail != 0) { /**************************/ /* draw they yellow lines */ /**************************/ xlinemin = xshift-ROADLINELENGTH; xlinemax = xshift+ROADLINELENGTH; zlinemin = zshift-ROADLINETHICKNESS; zlinemax = zshift+ROADLINETHICKNESS; xlinemin2 = xshift-ROADLINETHICKNESS; xlinemax2 = xshift+ROADLINETHICKNESS; zlinemin2 = zshift-ROADLINELENGTH; zlinemax2 = zshift+ROADLINELENGTH; glColor3fv(coloryellow); glBegin(GL_QUADS); for(i=0; i < ropCounter; i++) { if(roadsOnPlane[i].type == 0) { v1[0] = v4[0] = roadsOnPlane[i].x + xlinemin; v2[0] = v3[0] = roadsOnPlane[i].x + xlinemax; v2[2] = v1[2] = roadsOnPlane[i].y + zlinemin; v3[2] = v4[2] = roadsOnPlane[i].y + zlinemax; glVertex3fv(v1); glVertex3fv(v4); glVertex3fv(v3); glVertex3fv(v2); } else if(roadsOnPlane[i].type == 1) { v1[2] = v4[2] = roadsOnPlane[i].y + zlinemin2; v2[2] = v3[2] = roadsOnPlane[i].y + zlinemax2; v2[0] = v1[0] = roadsOnPlane[i].x + xlinemin2; v3[0] = v4[0] = roadsOnPlane[i].x + xlinemax2; glVertex3fv(v1); glVertex3fv(v2); glVertex3fv(v3); glVertex3fv(v4); } else if(roadsOnPlane[i].type == 2) { v1[2] = v4[2] = roadsOnPlane[i].y + zlinemin; v2[2] = v3[2] = roadsOnPlane[i].y + zlinemax; v2[0] = v1[0] = roadsOnPlane[i].x + xlinemin2; v3[0] = v4[0] = roadsOnPlane[i].x + xlinemax2; glVertex3fv(v1); glVertex3fv(v2); glVertex3fv(v3); glVertex3fv(v4); } } glEnd(); } glLineWidth(lineWidthNow); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* draw projectiles in flight */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ void drawProjectiles(struct projectile * allProjs, int counter, struct fireType * fires, int fireCounter, int itsChristmas, int detail) { struct projectile *temp; float col[4] = {1.0, 0, 0, 0}; float v[3], v2[3]; float x, y, z; float floatRatio; register int i; register int rotRatio; int beamCounter; static float beamhitx[MAXBEAMS], beamhitz[MAXBEAMS]; GLfloat lineWidthNow; glGetFloatv(GL_LINE_WIDTH, &lineWidthNow); /***********************************/ /* make standard projectile object */ /***********************************/ rotRatio = (counter*100) % 3600; floatRatio = rotRatio * 0.1; glDeleteLists( shellObj, 1); glNewList(shellObj, GL_COMPILE); if (detail <= 0) makerrotcubexyflat(0.035, 0.035, 0.035, rotRatio, colorwhite); else makerrotcubexy(0.05, 0.05, 0.05, rotRatio, colorwhite); if (itsChristmas) { makerrotcubexy(0.01, 0.051, 0.051, rotRatio, colorred); makerrotcubexy(0.051, 0.051, 0.01, rotRatio, colorred); } glEndList(); beamCounter = 0; for (temp = allProjs->next;temp != NULL;temp = temp->next) if ((fabs(temp->x) <= PLANESIZE) && (fabs(temp->z) <= PLANESIZE)) { x = temp->x; y = temp->y; z = temp->z; /**********************************/ /* draw bomb */ /**********************************/ switch(temp->type){ case PROJTANK: case PROJROCKET:glPushMatrix(); /* white cube shells */ glTranslatef(x, y, z); glCallList(shellObj); glPopMatrix(); if (detail > 0) { glColor4fv(colorblack); drawShadow (x, z, 0.05, 0.05); } break; case PROJTECHS: glPushMatrix(); /* techs shell */ glTranslatef(x, y, z); glRotatef(floatRatio, 1, 0, 0); glRotatef(floatRatio, 0, 1, 0); glCallList(shell2Obj); glPopMatrix(); if (detail > 0) { glColor4fv(colorblack); drawShadow (x, z, 0.05, 0.05); } break; case PROJFIRE: break; /* flames */ case PROJSCAR: beamhitx[beamCounter] = x; /* monster beam scar */ beamhitz[beamCounter] = z; beamCounter += 1; if (beamCounter >= MAXBEAMS) beamCounter -= 1; break; case PROJWATER: glPushMatrix(); /* water */ glTranslatef(x, y, z); glCallList(watershellObj); glPopMatrix(); break; case PROJHERO: glPushMatrix(); glTranslatef(x, y, z); glRotatef(floatRatio, 1, 0, 0); glRotatef(floatRatio, 0, 1, 0); glCallList(heroshellObj); glPopMatrix(); if (detail > 0) { glColor4fv(colorblack); drawShadow (x, z, 0.05, 0.05); } break; default: showError("Bogus Projectile in Projectile List! (drawProjectiles)"); break; } } /**********************************/ /* draw fires */ /**********************************/ for (i=0;i