void Selection(void) // This Is Where Selection Is Done { GLuint buffer[512]; // Set Up A Selection Buffer GLint hits; // The Number Of Objects That We Selected if (game) // Is Game Over? return; // If So, Don't Bother Checking For Hits PlaySound("data/shot.wav",NULL,SND_ASYNC); // Play Gun Shot Sound // The Size Of The Viewport. [0] Is <x>, [1] Is <y>, [2] Is <length>, [3] Is <width> GLint viewport[4]; // This Sets The Array <viewport> To The Size And Location Of The Screen Relative To The Window glGetIntegerv(GL_VIEWPORT, viewport); glSelectBuffer(512, buffer); // Tell OpenGL To Use Our Array For Selection // Puts OpenGL In Selection Mode. Nothing Will Be Drawn. Object ID's and Extents Are Stored In The Buffer. (void) glRenderMode(GL_SELECT); glInitNames(); // Initializes The Name Stack glPushName(0); // Push 0 (At Least One Entry) Onto The Stack glMatrixMode(GL_PROJECTION); // Selects The Projection Matrix glPushMatrix(); // Push The Projection Matrix glLoadIdentity(); // Resets The Matrix // This Creates A Matrix That Will Zoom Up To A Small Portion Of The Screen, Where The Mouse Is. gluPickMatrix((GLdouble) mouse_x, (GLdouble) (viewport[3]-mouse_y), 1.0f, 1.0f, viewport); // Apply The Perspective Matrix gluPerspective(45.0f, (GLfloat) (viewport[2]-viewport[0])/(GLfloat) (viewport[3]-viewport[1]), 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix DrawTargets(); // Render The Targets To The Selection Buffer glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPopMatrix(); // Pop The Projection Matrix glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix hits=glRenderMode(GL_RENDER); // Switch To Render Mode, Find Out How Many // Objects Were Drawn Where The Mouse Was if (hits > 0) // If There Were More Than 0 Hits { int choose = buffer[3]; // Make Our Selection The First Object int depth = buffer[1]; // Store How Far Away It Is for (int loop = 1; loop < hits; loop++) // Loop Through All The Detected Hits { // If This Object Is Closer To Us Than The One We Have Selected if (buffer[loop*4+1] < GLuint(depth)) { choose = buffer[loop*4+3]; // Select The Closer Object depth = buffer[loop*4+1]; // Store How Far Away It Is } } if (!object[choose].hit) // If The Object Hasn't Already Been Hit { object[choose].hit=TRUE; // Mark The Object As Being Hit score+=1; // Increase Score kills+=1; // Increase Level Kills if (kills>level*5) // New Level Yet? { miss=0; // Misses Reset Back To Zero kills=0; // Reset Level Kills level+=1; // Increase Level if (level>30) // Higher Than 30? level=30; // Set Level To 30 (Are You A God?) } } } }
void Draw(void) // Draw Our Scene { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer glLoadIdentity(); // Reset The Modelview Matrix glPushMatrix(); // Push The Modelview Matrix glBindTexture(GL_TEXTURE_2D, textures[7].texID); // Select The Sky Texture glBegin(GL_QUADS); // Begin Drawing Quads glTexCoord2f(1.0f,roll/1.5f+1.0f); glVertex3f( 28.0f,+7.0f,-50.0f); // Top Right glTexCoord2f(0.0f,roll/1.5f+1.0f); glVertex3f(-28.0f,+7.0f,-50.0f); // Top Left glTexCoord2f(0.0f,roll/1.5f+0.0f); glVertex3f(-28.0f,-3.0f,-50.0f); // Bottom Left glTexCoord2f(1.0f,roll/1.5f+0.0f); glVertex3f( 28.0f,-3.0f,-50.0f); // Bottom Right glTexCoord2f(1.5f,roll+1.0f); glVertex3f( 28.0f,+7.0f,-50.0f); // Top Right glTexCoord2f(0.5f,roll+1.0f); glVertex3f(-28.0f,+7.0f,-50.0f); // Top Left glTexCoord2f(0.5f,roll+0.0f); glVertex3f(-28.0f,-3.0f,-50.0f); // Bottom Left glTexCoord2f(1.5f,roll+0.0f); glVertex3f( 28.0f,-3.0f,-50.0f); // Bottom Right glTexCoord2f(1.0f,roll/1.5f+1.0f); glVertex3f( 28.0f,+7.0f,0.0f); // Top Right glTexCoord2f(0.0f,roll/1.5f+1.0f); glVertex3f(-28.0f,+7.0f,0.0f); // Top Left glTexCoord2f(0.0f,roll/1.5f+0.0f); glVertex3f(-28.0f,+7.0f,-50.0f); // Bottom Left glTexCoord2f(1.0f,roll/1.5f+0.0f); glVertex3f( 28.0f,+7.0f,-50.0f); // Bottom Right glTexCoord2f(1.5f,roll+1.0f); glVertex3f( 28.0f,+7.0f,0.0f); // Top Right glTexCoord2f(0.5f,roll+1.0f); glVertex3f(-28.0f,+7.0f,0.0f); // Top Left glTexCoord2f(0.5f,roll+0.0f); glVertex3f(-28.0f,+7.0f,-50.0f); // Bottom Left glTexCoord2f(1.5f,roll+0.0f); glVertex3f( 28.0f,+7.0f,-50.0f); // Bottom Right glEnd(); // Done Drawing Quads glBindTexture(GL_TEXTURE_2D, textures[6].texID); // Select The Ground Texture glBegin(GL_QUADS); // Draw A Quad glTexCoord2f(7.0f,4.0f-roll); glVertex3f( 27.0f,-3.0f,-50.0f); // Top Right glTexCoord2f(0.0f,4.0f-roll); glVertex3f(-27.0f,-3.0f,-50.0f); // Top Left glTexCoord2f(0.0f,0.0f-roll); glVertex3f(-27.0f,-3.0f,0.0f); // Bottom Left glTexCoord2f(7.0f,0.0f-roll); glVertex3f( 27.0f,-3.0f,0.0f); // Bottom Right glEnd(); // Done Drawing Quad DrawTargets(); // Draw Our Targets glPopMatrix(); // Pop The Modelview Matrix // Crosshair (In Ortho View) RECT window; // Storage For Window Dimensions GetClientRect (g_window->hWnd,&window); // Get Window Dimensions glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPushMatrix(); // Store The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix glOrtho(0,window.right,0,window.bottom,-1,1); // Set Up An Ortho Screen glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glTranslated(mouse_x,window.bottom-mouse_y,0.0f); // Move To The Current Mouse Position Object(16,16,8); // Draw The Crosshair // Game Stats / Title glPrint(240,450,"NeHe Productions"); // Print Title glPrint(10,10,"Level: %i",level); // Print Level glPrint(250,10,"Score: %i",score); // Print Score if (miss>9) // Have We Missed 10 Objects? { miss=9; // Limit Misses To 10 game=TRUE; // Game Over TRUE } if (game) // Is Game Over? glPrint(490,10,"GAME OVER"); // Game Over Message else glPrint(490,10,"Morale: %i/10",10-miss); // Print Morale #/10 glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPopMatrix(); // Restore The Old Projection Matrix glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glFlush(); // Flush The GL Rendering Pipeline }
int C_CFPlayer::DrawModel( int flags ) { // if local player is spectating this player in first person mode, don't draw it C_CFPlayer * pPlayer = GetLocalCFPlayer(); if (m_bIsDecapitated) SetBodygroup(1, 1); else if ((!input->CAM_IsThirdPerson() && pPlayer == this) || pPlayer->IsFirstPersonSpectating(this)) SetBodygroup(1, 1); else SetBodygroup(1, 0); if (IsFuse()) { if ((!input->CAM_IsThirdPerson() && pPlayer == this) || pPlayer->IsFirstPersonSpectating(this)) SetBodygroup(2, 0); else SetBodygroup(2, 1); } // Skip C_BasePlayer::DrawModel() because it has a bunch of logic we don't care for. int iResult = C_BaseCombatCharacter::DrawModel( flags ); if (C_CFPlayer::GetLocalCFPlayer() == this || pPlayer->IsObserver() && pPlayer->GetObserverTarget() && ToCFPlayer(pPlayer->GetObserverTarget()) == this) DrawTargets(); // Put submodels back where they are supposed to be so that shadows and such render them properly. SetBodygroup(1, m_bIsDecapitated); if (IsFuse()) SetBodygroup(2, 1); if (gpGlobals->curtime - m_flShieldTime < 0.5f) { Vector vecDmgDirection = m_vecShieldDmgOrigin - GetCentroid(); QAngle angShield; VectorAngles(vecDmgDirection, angShield); m_pBarrier->SetAbsAngles(angShield); m_pBarrier->SetAbsOrigin(GetAbsOrigin()); float flAlpha = 0; if ((gpGlobals->curtime - m_flShieldTime) < 0.2f) flAlpha = RemapVal(gpGlobals->curtime - m_flShieldTime, 0.0f, 0.2f, 0, 255); else flAlpha = RemapVal(gpGlobals->curtime - m_flShieldTime, 0.2f, 0.5f, 255, 0); flAlpha *= m_flShieldStrength; if (C_CFPlayer::GetLocalCFPlayer() == this) flAlpha /= 2; if (flAlpha) { m_pBarrier->SetBodygroup(0, m_bShieldPhysical); m_pBarrier->SetRenderColorA(flAlpha); m_pBarrier->DrawModel(flags); } } return iResult; }