// Game drawing // Copyright (C) 2002 David Rosen // Copyright (C) 2003 Ryan C. Gordon // Copyright (C) 2003 Steven Fuller // Copyright (C) 2021, 2023 Nguyễn Gia Phong // // This file is part of Black Shades. // // Black Shades is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Black Shades is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Black Shades. If not, see . #include #include #include "Game.h" #include "misc.h" extern int thirdperson; extern float multiplier; extern bool visions; extern unsigned int gSourceID[37]; extern Camera camera; extern Sprites sprites; extern float camerashake; extern Fog fog; extern float fogcolorr; extern float fogcolorg; extern float fogcolorb; extern float sinefluct; extern float sinefluctprog; extern int environment; GLvoid ReSizeGLScene(Game* game, float fov, float near) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(fov, game->screenwidth / (GLfloat) game->screenheight, near, game->viewdistance); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void Game::DrawGLScene(void) { //Main menu if (this->menu) { //Setup fast sine fluctuation sinefluct=sin(sinefluctprog); sinefluctprog+=multiplier*1.5; glLoadIdentity(); glClearColor(0,0,0,1); glDisable(GL_CLIP_PLANE0); glDisable(GL_FOG); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //"Black Shades" glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); // Disables Depth Testing glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); glBlendFunc(GL_SRC_ALPHA,GL_ONE); glDepthMask(0); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPushMatrix(); // Store The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix glOrtho(0,640,0,480,-100,100); // Set Up An Ortho Screen glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix //Draw smoke glPushMatrix(); // Store The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix glTranslatef(60+sinefluct*40,335-sinefluct*9,0); glScalef(500-sinefluct*80,70+sinefluct*18,1); glTranslatef(.5,.5,0); glScalef(.5,.5,1); glRotatef(sinefluctprog*50,0,0,1); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, sprites.smoketextureptr); glColor4f(1,1,1,.4+sinefluct/8); glBegin(GL_TRIANGLES); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1, 1, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1,-1, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,-1, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1, -1, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 0.0f); glEnd(); glPopMatrix(); glPushMatrix(); // Store The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix glTranslatef(60+sinefluct*40,335-sinefluct*9,0); glScalef(530-sinefluct*80,50+sinefluct*18,1); glTranslatef(.5,.5,0); glScalef(.5,.5,1); glRotatef(-sinefluctprog*50,0,0,1); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, sprites.smoketextureptr); glColor4f(1,1,1,.4-sinefluct/8); glBegin(GL_TRIANGLES); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1, 1, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1,-1, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,-1, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1, -1, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 0.0f); glEnd(); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPopMatrix(); // Restore The Old Projection Matrix glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPopMatrix(); // Restore The Old Projection Matrix glDepthMask(1); // Text static char str[256]; glEnable(GL_TEXTURE_2D); glColor4f(0, 0, 0, 1); glPrint(&this->text, 100, 175, "Black Shades", 1, 2, 640, 480); // "New Game" glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); glBlendFunc(GL_SRC_ALPHA,GL_ONE); glDepthMask(0); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0, 640, 0, 480, -100, 100); glMatrixMode(GL_MODELVIEW); //Draw smoke glPushMatrix(); glLoadIdentity(); glTranslatef(120-sinefluct*40,235+sinefluct*9,0); glScalef(440+sinefluct*80,70-sinefluct*18,1); glTranslatef(.5,.5,0); glScalef(.5,.5,1); glRotatef(sinefluctprog*50,0,0,1); glEnable(GL_TEXTURE_2D); if(mouseoverbutton!=1)glBindTexture(GL_TEXTURE_2D, sprites.smoketextureptr); if(mouseoverbutton==1)glBindTexture(GL_TEXTURE_2D, flaretextureptr); glColor4f(1,0,0,.5+sinefluct/6); glBegin(GL_TRIANGLES); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1, 1, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1,-1, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,-1, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1, -1, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 0.0f); glEnd(); glPopMatrix(); glPushMatrix(); // Store The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix glTranslatef(120-sinefluct*40,235+sinefluct*9,0); glScalef(460+sinefluct*80,50-sinefluct*18,1); glTranslatef(.5,.5,0); glScalef(.5,.5,1); glRotatef(-sinefluctprog*50,0,0,1); glEnable(GL_TEXTURE_2D); if(mouseoverbutton!=1)glBindTexture(GL_TEXTURE_2D, sprites.smoketextureptr); if(mouseoverbutton==1)glBindTexture(GL_TEXTURE_2D, flaretextureptr); glColor4f(1,0,0,.5-sinefluct/6); glBegin(GL_TRIANGLES); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1, 1, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1,-1, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,-1, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1, -1, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 0.0f); glEnd(); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPopMatrix(); // Restore The Old Projection Matrix glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPopMatrix(); // Restore The Old Projection Matrix glDepthMask(1); // Text glEnable(GL_TEXTURE_2D); glColor4f(0,0,0,1); glPrint(&this->text, 190 - this->gameinprogress * 10, 170, this->gameinprogress ? "Resume Game" : "New Game", 1, 1.5, 640, 480); // "Quit" glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); // Disables Depth Testing glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); glBlendFunc(GL_SRC_ALPHA,GL_ONE); glDepthMask(0); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPushMatrix(); // Store The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix glOrtho(0,640,0,480,-100,100); // Set Up An Ortho Screen glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix // Draw smoke glPushMatrix(); // Store The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix glTranslatef(120-sinefluct*40,112+sinefluct*9,0); glScalef(440+sinefluct*80,70-sinefluct*18,1); glTranslatef(.5,.5,0); glScalef(.5,.5,1); glRotatef(sinefluctprog*50,0,0,1); glEnable(GL_TEXTURE_2D); if(mouseoverbutton!=2)glBindTexture(GL_TEXTURE_2D, sprites.smoketextureptr); if(mouseoverbutton==2)glBindTexture(GL_TEXTURE_2D, flaretextureptr); glColor4f(1,0,0,.5+sinefluct/6); glBegin(GL_TRIANGLES); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1, 1, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1,-1, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,-1, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1, -1, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 0.0f); glEnd(); glPopMatrix(); glPushMatrix(); // Store The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix glTranslatef(120-sinefluct*40,112+sinefluct*9,0); glScalef(460+sinefluct*80,50-sinefluct*18,1); glTranslatef(.5,.5,0); glScalef(.5,.5,1); glRotatef(-sinefluctprog*50,0,0,1); glEnable(GL_TEXTURE_2D); if(mouseoverbutton!=2)glBindTexture(GL_TEXTURE_2D, sprites.smoketextureptr); if(mouseoverbutton==2)glBindTexture(GL_TEXTURE_2D, flaretextureptr); glColor4f(1,0,0,.5-sinefluct/6); glBegin(GL_TRIANGLES); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1, 1, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1,-1, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,-1, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1, -1, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 0.0f); glEnd(); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPopMatrix(); // Restore The Old Projection Matrix glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPopMatrix(); // Restore The Old Projection Matrix glDepthMask(1); // Text glEnable(GL_TEXTURE_2D); glColor4f(0.0f, 0.0f, 0.0f, 1.0f); glPrint(&this->text, 197 - this->gameinprogress * 15, 87, this->gameinprogress ? "End Game" : "Quit", 1, 1.5, 640, 480); // High score glColor4f(0.5f + sinefluct / 5.0f, 0.0f, 0.0f, 1.0f); sprintf(str, "High Score: %d%s", highscore, beatgame ? " *COMPLETED*" : ""); glPrint(&this->text, 0, 0, str, 1, 0.8, 640, 480); // Flash if (flashamount > 0) { if(flashamount>1)flashamount=1; flashamount-=multiplier; if(flashamount<0)flashamount=0; glDisable(GL_DEPTH_TEST); // Disables Depth Testing glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); glDepthMask(0); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPushMatrix(); // Store The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPushMatrix(); // Store The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix glScalef(screenwidth,screenheight,1); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(flashr,flashg,flashb,flashamount); glBegin(GL_QUADS); glVertex3f(0, 0, 0.0f); glVertex3f(256, 0, 0.0f); glVertex3f(256, 256, 0.0f); glVertex3f(0, 256, 0.0f); glEnd(); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPopMatrix(); // Restore The Old Projection Matrix glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPopMatrix(); // Restore The Old Projection Matrix glEnable(GL_DEPTH_TEST); // Enables Depth Testing glEnable(GL_CULL_FACE); glDepthMask(1); } } else { // in-game glDepthMask(1); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glDisable(GL_CLIP_PLANE0); //Visions sinefluct=sin(sinefluctprog); sinefluctprog+=multiplier*3; if (!visions) { switch (environment) { case sunny_environment: viewdistance=2000; fogcolorr=.5; fogcolorg=.5; fogcolorb=.8; break; case foggy_environment: viewdistance=500; fogcolorr=.5; fogcolorg=.5; fogcolorb=.5; break; case night_environment: viewdistance=500; fogcolorr=.15; fogcolorg=.15; fogcolorb=.3; break; case snowy_environment: viewdistance=800; fogcolorr=.5; fogcolorg=.5; fogcolorb=.5; break; case rainy_environment: viewdistance=700; fogcolorr=.3; fogcolorg=.3; fogcolorb=.3; break; case firey_environment: viewdistance=600; fogcolorr=.3; fogcolorg=.1; fogcolorb=0; break; } glClearColor(fogcolorr,fogcolorg,fogcolorb,1); if (environment == sunny_environment) { setFog(&fog, fogcolorr, fogcolorg, fogcolorb, 0, viewdistance * 0.8, 0.1); GLfloat LightAmbient[]= { fogcolorr/4, fogcolorg/4, fogcolorb/4, 1.0f}; GLfloat LightDiffuse[]= { fogcolorr*1.6f, fogcolorg*1.6f, fogcolorr*1.6f, 1.0f }; glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient); glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse); } else { setFog(&fog, fogcolorr, fogcolorg, fogcolorb, 0, viewdistance * 0.8, 0.2); GLfloat LightAmbient[]= { fogcolorr*.8f, fogcolorg*.8f, fogcolorb*.8f, 1.0f}; GLfloat LightDiffuse[]= { fogcolorr*.8f, fogcolorg*.8f, fogcolorr*.8f, 1.0f }; glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient); glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse); } glEnable(GL_LIGHT0); // Change fov if zooming with scope if (this->zoom) ReSizeGLScene(this, 10.0f, 0.6f); else ReSizeGLScene(this, 90.0f, 0.1f); } else { glLightfv(GL_LIGHT0, GL_AMBIENT, (GLfloat[]) { 0.0f, 0.0f, 0.0f, 1.0f }); glLightfv(GL_LIGHT0, GL_DIFFUSE, (GLfloat[]) { 0.1f + sinefluct / 5.0f, 0.0f, 0.0f, 1.0f }); glEnable(GL_LIGHT0); fogcolorr=(sinefluct/4+.5); fogcolorg=0; fogcolorb=0; setFog(&fog, fogcolorr,fogcolorg,fogcolorb,0,viewdistance*.8*.5*(sinefluct/4+.3),sinefluct/3+.7); glClearColor(fogcolorr,fogcolorg,fogcolorb,1); ReSizeGLScene(this, 120.0f - sinefluct * 20.0f, 0.3f); glRotatef(sinefluct*10,0,0,.1); //Pitch higher if moving for effect if(person[0].currentanimation==idleanim)alSourcef(gSourceID[visionsound], AL_PITCH, 1); if(person[0].currentanimation!=idleanim)alSourcef(gSourceID[visionsound], AL_PITCH, 2); } // Set rotation/position if (thirdperson) glTranslatef(camera.targetoffset.x, camera.targetoffset.y, camera.targetoffset.z); if (thirdperson == 0 && person[0].skeleton.free) { glRotatef(person[0].skeleton.joints[head].rotate3, 0, 1, 0); glRotatef(90 - person[0].skeleton.joints[head].rotate2, 0, 0, 1); glRotatef(person[0].skeleton.joints[head].rotate1 + 90, 0, 1, 0); } else { glRotatef(camera.visrotation2, 1, 0, 0); glRotatef(camera.visrotation, 0, 1, 0); } // Shake camera if grenade explosion if (camerashake > 0) { if (person[0].aiming && person[0].whichgun != grenade && thirdperson == 0) camerashake = 0; glTranslatef(randInt(-99, 99) / 100.0f * camerashake, randInt(-99, 99) / 100.0f * camerashake, randInt(-99, 99) / 100.0f * camerashake); } glTranslatef(-camera.position.x, -camera.position.y, -camera.position.z); glPushMatrix(); glClipPlane(GL_CLIP_PLANE0, (const GLdouble []) {0.0, 1.0, 0.0, 0.0}); glDisable(GL_CLIP_PLANE0); glPopMatrix(); alignas(16) GLfloat frustum[6][4]; alignas(16) GLfloat projection[16]; glGetFloatv(GL_PROJECTION_MATRIX, projection); alignas(16) GLfloat model_view[16]; glGetFloatv(GL_MODELVIEW_MATRIX, model_view); setFrustum(frustum, projection, model_view); GLfloat LightPosition[] { -.5, 1, -.8, 0.0f }; glLightfv(GL_LIGHT0, GL_POSITION, LightPosition); glDisable(GL_TEXTURE_2D); glEnable(GL_FOG); glEnable(GL_COLOR_MATERIAL); glEnable(GL_CULL_FACE); glDepthMask(1); //Draw street glPushMatrix(); glDepthMask(0); glDisable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glTranslatef(camera.position.x,0,camera.position.z); glScalef(viewdistance*5/100,1,viewdistance*5/100); drawModel(&street, visions ? BLACK : GRAY); glEnable(GL_DEPTH_TEST); glDepthMask(1); glPopMatrix(); if (visions) glDisable(GL_LIGHTING); else glEnable(GL_LIGHTING); //Draw blocks XYZ move; int beginx,endx; int beginz,endz; int distsquared; //Only nearby blocks beginx=(camera.position.x-viewdistance+block_spacing/2)/block_spacing-2; if(beginx<0)beginx=0; beginz=(camera.position.z-viewdistance+block_spacing/2)/block_spacing-2; if(beginz<0)beginz=0; endx=(camera.position.x+viewdistance+block_spacing/2)/block_spacing+2; if(endx>num_blocks-1)endx=num_blocks-1; endz=(camera.position.z+viewdistance+block_spacing/2)/block_spacing+2; if(endz>num_blocks-1)endz=num_blocks-1; XYZ collpoint; bool drawn[num_blocks][num_blocks]{}; if(beginx(viewdistance*viewdistance+block_spacing*block_spacing ))draw=0; if(draw&&citytype[i][j]!=3&&!cubeInFrustum(frustum, (i)*block_spacing,0,(j)*block_spacing,block_spacing))draw=0; if (draw && citytype[i][j] != 3 && !sphereInFrustum(frustum, blocks[citytype[i][j]].center.x + i * block_spacing, blocks[citytype[i][j]].center.y, blocks[citytype[i][j]].center.z + j * block_spacing, blocks[citytype[i][j]].radius)) draw = false; if (draw) { glPushMatrix(); glTranslatef(i*block_spacing,0,j*block_spacing); glRotatef(cityrotation[i][j]*90,0,1,0); drawModel(blocks + citytype[i][j], visions ? BLACK : NULL); glPopMatrix(); drawn[i][j] = true; } else { move.y=0; move.x=i*block_spacing; move.z=j*block_spacing; if (sqrlen(move - camera.position) > 300000) drawn[i][j] = true; } } } // Occluding blocks beginx=(camera.position.x+block_spacing/2)/block_spacing-2; if(beginx<0)beginx=0; beginz=(camera.position.z+block_spacing/2)/block_spacing-2; if(beginz<0)beginz=0; endx=(camera.position.x+block_spacing/2)/block_spacing+2; if(endx>num_blocks-1)endx=num_blocks-1; endz=(camera.position.z+block_spacing/2)/block_spacing+2; if(endz>num_blocks-1)endz=num_blocks-1; float M[16]; XYZ drawpoint; float size=20; // Draw people if (visions) setFog(&fog, fogcolorr, fogcolorg, fogcolorb, 0, viewdistance * 0.8 * 0.5 * (-sinefluct / 4 + 0.3), -sinefluct / 3 + 0.7); glColor4f(1 , 1, 1, 1); glEnable(GL_COLOR_MATERIAL); for(int i=0;i= num_blocks || person[i].whichblocky < 0 || person[i].whichblocky >= num_blocks || !drawn[person[i].whichblockx][person[i].whichblocky])) || (person[i].skeleton.free && person[i].skeleton.joints[0].position.y < -2) || (sqrlen(person[i].playercoords - camera.position) > 1000000)) draw = false; for (auto j = beginx; j <= endx; ++j) for(auto k = beginz; k <= endz; ++k) if (draw && sqrlen(move - camera.position) < 100000 && (segCrossModelTrans(camera.position, person[i].playercoords, &blockocclude, {(float) j * block_spacing, 0.0f, (float) k * block_spacing}, 0.0f, &collpoint) > -1)) draw = false; if (draw && (segCrossModelTrans(camera.position, person[i].playercoords, &blockocclude, {(float) person[i].whichblockx * block_spacing, 0.0f, (float) person[i].whichblocky * block_spacing}, 0.0f, &collpoint) > -1)) draw = false; if (i == 0) draw = true; if (draw && person[i].existing) { if ((sqrlen(person[i].playercoords - camera.position) < 100000 + this->zoom * 3000000 && !person[i].skeleton.free) || (sqrlen(person[i].averageloc - camera.position) < 100000 + this->zoom * 3000000 && person[i].skeleton.free)) { glPushMatrix(); if(person[i].skeleton.free==0){ glTranslatef(person[i].playercoords.x,person[i].playercoords.y,person[i].playercoords.z); glRotatef(person[i].playerrotation,0,1,0); if (i != 0 || !visions) person[i].DoAnimations(i); else person[i].DoAnimationslite(i); } if (!(visions && i == 0) && !(this->zoom && i == 0)) person[i].drawSkeleton(); glPopMatrix(); } else { glPushMatrix(); if(person[i].skeleton.free<1)person[i].DoAnimationslite(i); glColor4f(1,1,1,1); glDisable(GL_CULL_FACE); glEnable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glDepthMask(0); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); if(person[i].skeleton.free<1){ glBindTexture(GL_TEXTURE_2D, personspritetextureptr); glTranslatef(person[i].playercoords.x,person[i].playercoords.y+size/2*.3,person[i].playercoords.z); } if(person[i].skeleton.free==1){ glBindTexture(GL_TEXTURE_2D, deadpersonspritetextureptr); glTranslatef(person[i].averageloc.x,person[i].averageloc.y+size/2*.3,person[i].averageloc.z); } glGetFloatv(GL_MODELVIEW_MATRIX,M); drawpoint.x=M[12]; drawpoint.y=M[13]; drawpoint.z=M[14]; glLoadIdentity(); glTranslatef(drawpoint.x, drawpoint.y, drawpoint.z); glBegin(GL_TRIANGLES); glTexCoord2f(1.0f, 1.0f); glVertex3f( .3f*size, .3f*size, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-.3f*size, .3f*size, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( .3f*size,-.3f*size, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-.3f*size,-.3f*size, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( .3f*size, -.3f*size, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-.3f*size, .3f*size, 0.0f); glEnd(); glPopMatrix(); glDepthMask(1); glDisable(GL_TEXTURE_2D); glEnable(GL_CULL_FACE); if (!visions) glEnable(GL_LIGHTING); } } if(person[i].skeleton.free<1&&!draw)person[i].DoAnimationslite(i); if(!person[i].existing) if (!draw || sqrlen(person[i].playercoords - camera.position) > 10000) person[i].existing = 1; } glDisable(GL_COLOR_MATERIAL); //Attacker psychicness for(int i=0;i-1&&person[i].killtargetvisible&&person[i].skeleton.free==0&&person[person[i].killtarget].skeleton.free==0){ sprites.MakeSprite(bulletinstant, (shotdelayamount/difficulty-person[i].shotdelay)/shotdelayamount/difficulty/2, 1, person[i].shotdelay/shotdelayamount/difficulty, person[i].shotdelay/shotdelayamount/difficulty, rotate(person[i].skeleton.joints[lefthand].position,0,person[i].playerrotation,0)+person[i].playercoords, person[person[i].killtarget].skeleton.joints[abdomen].position+person[person[i].killtarget].playercoords, person[i].shotdelay*2); } if(person[i].killtarget>-1&&person[i].killtargetvisible&&person[i].skeleton.free==0&&person[person[i].killtarget].skeleton.free!=0){ sprites.MakeSprite(bulletinstant, (shotdelayamount/difficulty-person[i].shotdelay)/shotdelayamount/difficulty/2, 1, person[i].shotdelay/shotdelayamount/difficulty, person[i].shotdelay/shotdelayamount/difficulty, rotate(person[i].skeleton.joints[lefthand].position,0,person[i].playerrotation,0)+person[i].playercoords, person[person[i].killtarget].skeleton.joints[abdomen].position, person[i].shotdelay*2); } } // Sprites glEnable(GL_CLIP_PLANE0); sprites.draw(); glDisable(GL_CLIP_PLANE0); glDisable(GL_FOG); // Zoom glAlphaFunc(GL_GREATER, 0.01); if (this->zoom) { glDisable(GL_DEPTH_TEST); // Disables Depth Testing glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); glDepthMask(0); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPushMatrix(); // Store The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPushMatrix(); // Store The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix glScalef(screenwidth,screenheight,1); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glColor4f(.5,.5,.5,1); glBindTexture(GL_TEXTURE_2D, scopetextureptr); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(0, 0, 0.0f); glTexCoord2f(1,0); glVertex3f(1, 0, 0.0f); glTexCoord2f(1,1); glVertex3f(1, 1, 0.0f); glTexCoord2f(0,1); glVertex3f(0, 1, 0.0f); glEnd(); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPopMatrix(); // Restore The Old Projection Matrix glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPopMatrix(); // Restore The Old Projection Matrix glEnable(GL_DEPTH_TEST); // Enables Depth Testing glEnable(GL_CULL_FACE); glDepthMask(1); } //Flash if(flashamount>0){ if(flashamount>1)flashamount=1; flashamount-=multiplier; if(flashamount<0)flashamount=0; glDisable(GL_DEPTH_TEST); // Disables Depth Testing glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); glDepthMask(0); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPushMatrix(); // Store The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPushMatrix(); // Store The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix glScalef(screenwidth,screenheight,1); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(flashr,flashg,flashb,flashamount); glBegin(GL_QUADS); glVertex3f(0, 0, 0.0f); glVertex3f(256, 0, 0.0f); glVertex3f(256, 256, 0.0f); glVertex3f(0, 256, 0.0f); glEnd(); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPopMatrix(); // Restore The Old Projection Matrix glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPopMatrix(); // Restore The Old Projection Matrix glEnable(GL_DEPTH_TEST); // Enables Depth Testing glEnable(GL_CULL_FACE); glDepthMask(1); } if(person[0].skeleton.free>0&&thirdperson!=2){ glDisable(GL_DEPTH_TEST); // Disables Depth Testing glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); glDepthMask(0); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPushMatrix(); // Store The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix glOrtho(0,screenwidth,0,screenheight,-100,100); // Set Up An Ortho Screen glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPushMatrix(); // Store The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix glScalef(screenwidth,screenheight,1); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColor4f(0,0,0,1-person[0].longdead); glBegin(GL_QUADS); glVertex3f(0, 0, 0.0f); glVertex3f(256, 0, 0.0f); glVertex3f(256, 256, 0.0f); glVertex3f(0, 256, 0.0f); glEnd(); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPopMatrix(); // Restore The Old Projection Matrix glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPopMatrix(); // Restore The Old Projection Matrix glEnable(GL_DEPTH_TEST); // Enables Depth Testing glEnable(GL_CULL_FACE); glDepthMask(1); } //Text glEnable(GL_TEXTURE_2D); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); static char str[256] = ""; if (!debug) { std::string s; switch (person[0].whichgun) { case nogun: s = "UNARMED"; break; case knife: s = "KNIFE"; break; case assaultrifle: s = "ASSAULT RIFLE"; break; case shotgun: s = "SHOTGUN"; break; case sniperrifle: s = "SNIPER RIFLE"; break; case grenade: s = "HAND GRENADE"; break; case handgun1: s = "MAGNUM"; break; case handgun2: s = "HANDGUN"; break; } glPrint(&this->text, 10, 90, s.c_str(), 1, 0.8, 640, 480); if(person[0].whichgun!=nogun&&person[0].whichgun!=knife&&person[0].whichgun!=grenade){ glColor4f(0,1,0,1); glPrint(&this->text, 10, 30, "Magazines", 0, 0.8, 640, 480); glColor4f(1,1,1,1); sprintf (str, "0%d",(int)person[0].reloads[person[0].whichgun]); glPrint(&this->text, 10,10,str,1,1,640,480); if(person[0].ammo>=0){ glColor4f(0,1,0,1); glPrint(&this->text, 10, 65, "Ammo", 0, 0.8, 640, 480); glColor4f(1,1,1,1); if(person[0].ammo>=10)sprintf (str, "%d",(int)person[0].ammo); if(person[0].ammo<10)sprintf (str, "0%d",(int)person[0].ammo); glPrint(&this->text, 10,40,str,1,1,640,480); } } if(person[0].whichgun==grenade){ sprintf (str, "Grenades Left: %d",(int)person[0].reloads[person[0].whichgun]+1); glPrint(&this->text, 10,20,str,0,.8,640,480); } glColor4f(1,1,0,1); glPrint(&this->text, 725, 575, "Score", 0, 0.8, 640, 480); glColor4f(1,1,1,1); sprintf(str, "%d", score); glPrint(&this->text, 580,440,str,1,1,640,480); glColor4f(1,1,0,1); glPrint(&this->text, 50, 575, "Time Remaining", 0, 0.8, 640, 480); glColor4f(1,1,1,1); if((int)timeremaining%60>=10)sprintf (str, "%d:%d", (int)(timeremaining/60),(int)timeremaining%60); if((int)timeremaining%60<10)sprintf (str, "%d:0%d", (int)(timeremaining/60),(int)timeremaining%60); glPrint(&this->text, 72, 440, str, 1, 1, 640, 480); } else { sprintf(str, "FPS: %.0f", 1.0f / multiplier); glPrint(&this->text, 10,30,str,0,.8,screenwidth,screenheight); std::string s; switch (enemystate) { case 0: s = "Enemies are in random assassination mode."; break; case 1: s = "Enemies are in passive mode."; break; case 2: s = "Enemies are in DIE!!!! mode."; break; } glPrint(&this->text, 10, 20, s.c_str(), 0, 0.8, screenwidth, screenheight); sprintf(str, "You have pointlessly shot or beaten %d unarmed civilians.", civkills); glPrint(&this->text, 10,60,str,0,.8,screenwidth,screenheight); sprintf(str, "You have incapacitated %d assassins.", goodkills); glPrint(&this->text, 10,70,str,0,.8,screenwidth,screenheight); sprintf(str, "You have allowed %d successful murders.", badkills); glPrint(&this->text, 10,80,str,0,.8,screenwidth,screenheight); } } }