X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FGameDraw.cpp;h=58142f313de0a027825fdc0d2b7e9d401ad2aadc;hb=decb00e82a2e65e25dbcdd8f16fff5a6a07d31d6;hp=b321e7ec0c450e392c24bdd6510bd914eb697348;hpb=c26c5303fbc3fcc607681b848bc4fd0641320691;p=lugaru.git diff --git a/Source/GameDraw.cpp b/Source/GameDraw.cpp index b321e7e..58142f3 100644 --- a/Source/GameDraw.cpp +++ b/Source/GameDraw.cpp @@ -1,4 +1,26 @@ -#include "Game.h" +/* +Copyright (C) 2003, 2010 - Wolfire Games + +This file is part of Lugaru. + +Lugaru 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 2 +of the License, or (at your option) any later version. + +This program 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 this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "Game.h" +#include "openal_wrapper.h" using namespace std; @@ -153,9 +175,11 @@ extern float accountcampaigntime[10]; extern bool gamestarted; -extern FSOUND_SAMPLE *samp[100]; +extern bool showdamagebar; + +extern OPENAL_SAMPLE *samp[100]; extern int channels[100]; -extern "C" void PlaySoundEx(int channel, FSOUND_SAMPLE *sptr, FSOUND_DSPUNIT *dsp, signed char startpaused); +extern "C" void PlaySoundEx(int channel, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused); /*********************> DrawGLScene() <*****/ long long Game::MD5_string (char *string){ @@ -189,7 +213,7 @@ long long Game::MD5_string (char *string){ //return 1111111111111111; } -int Game::DrawGLScene(GLvoid) +int Game::DrawGLScene(StereoSide side) { static float texcoordwidth,texcoordheight; static float texviewwidth, texviewheight; @@ -208,9 +232,18 @@ int Game::DrawGLScene(GLvoid) lastcheck+=multiplier; - glColorMask( 1.0, 1.0, 1.0, 1.0 ); - if(!registered)debugmode=0; - + if ( stereomode == stereoAnaglyph ) { + switch(side) { + case stereoLeft: glColorMask( 0.0, 1.0, 1.0, 1.0 ); break; + case stereoRight: glColorMask( 1.0, 0.0, 0.0, 1.0 ); break; + } + } else { + glColorMask( 1.0, 1.0, 1.0, 1.0 ); + + if ( stereomode == stereoHorizontalInterlaced || stereomode == stereoVerticalInterlaced ) { + glStencilFunc(side == stereoLeft ? GL_NOTEQUAL : GL_EQUAL, 0x01, 0x01); + } + } if(freeze||winfreeze||(mainmenu&&gameon)||(!gameon&&gamestarted)){ tempmult=multiplier; @@ -326,6 +359,11 @@ int Game::DrawGLScene(GLvoid) glMatrixMode (GL_MODELVIEW); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glLoadIdentity (); + + // Move the camera for the current eye's point of view. + // Reverse the movement if we're reversing stereo + glTranslatef((stereoseparation/2) * side * (stereoreverse ? -1 : 1), 0, 0); + if(!cameramode&&!freeze&&!winfreeze){ glRotatef(float(Random()%100)/10*camerashake/*+(woozy*woozy)/10*/,0,0,1); glRotatef(rotation2+sin(woozy/2)*(player[0].damage/player[0].damagetolerance)*5,1,0,0); @@ -529,29 +567,6 @@ int Game::DrawGLScene(GLvoid) } glPopMatrix(); - //if(cellophane){ - /*glEnable(GL_CULL_FACE); - glCullFace(GL_FRONT); - glDepthMask(1); - for(k=0;k=1)glDisable(GL_BLEND); - if(distance>0){ - checkpoint=DoRotation(player[k].skeleton.joints[abs(Random()%player[k].skeleton.num_joints)].position,0,player[k].rotation,0)*player[k].scale+player[k].coords; - checkpoint.y+=1; - if(checkcollide(viewer,checkpoint)){ - player[k].occluded+=1; - } - else player[k].occluded=0; - if(player[k].occluded<25)player[k].DrawSkeleton(); - } - }*/ - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); @@ -1071,10 +1086,10 @@ int Game::DrawGLScene(GLvoid) if(dialogueboxsound[whichdialogue][indialogue]==-2)whichsoundplay=firestartsound; if(dialogueboxsound[whichdialogue][indialogue]==-3)whichsoundplay=consolesuccesssound; if(dialogueboxsound[whichdialogue][indialogue]==-4)whichsoundplay=consolefailsound; - PlaySoundEx( whichsoundplay, samp[whichsoundplay], NULL, TRUE); - FSOUND_3D_SetAttributes(channels[whichsoundplay], gLoc, vel); - FSOUND_SetVolume(channels[whichsoundplay], 256); - FSOUND_SetPaused(channels[whichsoundplay], FALSE); + PlaySoundEx( whichsoundplay, samp[whichsoundplay], NULL, true); + OPENAL_3D_SetAttributes(channels[whichsoundplay], gLoc, vel); + OPENAL_SetVolume(channels[whichsoundplay], 256); + OPENAL_SetPaused(channels[whichsoundplay], false); } } } @@ -1205,6 +1220,90 @@ int Game::DrawGLScene(GLvoid) text.glPrintOutline(1024/40-4,768/16-4+768*14/16,string,1,1.5*1.25,1024,768); glColor4f(1,0,0,1); text.glPrint(1024/40,768/16+768*14/16,string,1,1.5,1024,768); + if(showdamagebar) { + glDisable(GL_DEPTH_TEST); // Disables Depth Testing + glDisable(GL_CULL_FACE); + glDisable(GL_LIGHTING); + glDisable(GL_TEXTURE_2D); + 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 + glTranslatef(15,screenheight*17.5/20,0); + glScalef(screenwidth/3+20,screenheight/20,1); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glColor4f(0.0,0.4,0.0,0.7); + float bar=((float)player[0].damage)/player[0].damagetolerance; + glBegin(GL_QUADS); + glVertex3f((bar<1?bar:1),0,0.0f); + glVertex3f(1,0,0.0f); + glVertex3f(1,1,0.0f); + glVertex3f((bar<1?bar:1),1,0.0f); + glEnd(); + glColor4f(0.1,0.0,0.0,1); + bar = ((float)player[0].bloodloss)/player[0].damagetolerance; + glBegin(GL_QUADS); + glVertex3f(0,0,0.0f); + glVertex3f((bar<1?bar:1),0,0.0f); + glVertex3f((bar<1?bar:1),1,0.0f); + glVertex3f(0,1,0.0f); + glEnd(); + glColor4f(0.4,0.0,0.0,0.7); + bar = ((float)player[0].damage)/player[0].damagetolerance; + glBegin(GL_QUADS); + glVertex3f(0,0,0.0f); + glVertex3f((bar<1?bar:1),0,0.0f); + glVertex3f((bar<1?bar:1),1,0.0f); + glVertex3f(0,1,0.0f); + glEnd(); + glColor4f(0.4,0.0,0.0,0.7); + bar = ((float)player[0].permanentdamage)/player[0].damagetolerance; + glBegin(GL_QUADS); + glVertex3f(0,0,0.0f); + glVertex3f((bar<1?bar:1),0,0.0f); + glVertex3f((bar<1?bar:1),1,0.0f); + glVertex3f(0,1,0.0f); + glEnd(); + glColor4f(0.4,0.0,0.0,0.7); + bar = ((float)player[0].superpermanentdamage)/player[0].damagetolerance; + glBegin(GL_QUADS); + glVertex3f(0,0,0.0f); + glVertex3f((bar<1?bar:1),0,0.0f); + glVertex3f((bar<1?bar:1),1,0.0f); + glVertex3f(0,1,0.0f); + glEnd(); + glColor4f(0.0,0.0,0.0,0.7); + glLineWidth(2.0); + glBegin(GL_LINE_STRIP); + glVertex3f(0,0,0.0f); + glVertex3f(1,0,0.0f); + glVertex3f(1,1,0.0f); + glVertex3f(0,1,0.0f); + glVertex3f(0,0,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); + glDisable(GL_BLEND); + glDepthMask(1); + glEnable(GL_TEXTURE_2D); + + // writing the numbers : + sprintf (string, "Damages : %d/%d (%d)",(int)(player[0].damage),(int)(player[0].damagetolerance),(int)(player[0].bloodloss)); + glColor4f(0,0,0,1); + text.glPrintOutline(1024/40-4,768/16-4+768*14/16-40,string,1,1.5*1.25,1024,768); + glColor4f(1,0,0,1); + text.glPrint(1024/40,768/16+768*14/16-40,string,1,1.5,1024,768); + } } glColor4f(.5,.5,.5,1); @@ -1939,7 +2038,7 @@ int Game::DrawGLScene(GLvoid) if(drawmode!=normalmode){ glEnable(GL_TEXTURE_2D); - //glFinish(); + glFinish(); if(!drawtoggle||drawmode!=realmotionblurmode||(drawtoggle==2||change==1)){ if(screentexture){ @@ -2218,6 +2317,10 @@ int Game::DrawGLScene(GLvoid) } if(mainmenu){ + + // !!! FIXME: hack: clamp framerate in menu so text input works correctly on fast systems. + SDL_Delay(15); + glDrawBuffer(GL_BACK); glReadBuffer(GL_BACK); glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); @@ -2332,7 +2435,7 @@ int Game::DrawGLScene(GLvoid) /*if(mainmenu!=0)*/oldmainmenu=mainmenu; - if(mainmenu==3||mainmenu==4||mainmenu==5||mainmenu==6||mainmenu==7||mainmenu==8||mainmenu==9||mainmenu==10||mainmenu==119||mainmenu==12||mainmenu==13||mainmenu==14||mainmenu==15||mainmenu==16||mainmenu==17){ + if(mainmenu==3||mainmenu==4||mainmenu==5||mainmenu==6||mainmenu==7||mainmenu==8||mainmenu==9||mainmenu==10||mainmenu==119||mainmenu==13||mainmenu==17||mainmenu==18){ glClear(GL_DEPTH_BUFFER_BIT); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.001f); @@ -2396,7 +2499,7 @@ int Game::DrawGLScene(GLvoid) glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix if(mainmenu==3){ - nummenuitems=12; + nummenuitems=14; if((float)newscreenwidth>(float)newscreenheight*1.61||(float)newscreenwidth<(float)newscreenheight*1.59)sprintf (menustring[0], "Resolution: %d*%d",(int)newscreenwidth,(int)newscreenheight); else sprintf (menustring[0], "Resolution: %d*%d (widescreen)",(int)newscreenwidth,(int)newscreenheight); startx[0]=10+20; @@ -2480,22 +2583,38 @@ int Game::DrawGLScene(GLvoid) movex[10]=0; movey[10]=0; - sprintf (menustring[11], "Volume: %d%", (int)(volume*100)); + sprintf (menustring[11], "Volume: %d%%", (int)(volume*100)); startx[11]=10+60; - starty[11]=155; + starty[11]=160; endx[11]=startx[11]+strlen(menustring[11])*10; endy[11]=starty[11]+20; movex[11]=0; movey[11]=0; + sprintf (menustring[13], "Damage Bar: %s",(showdamagebar?"on":"off")); + startx[13]=30; + starty[13]=125; + endx[13]=startx[13]+strlen(menustring[13])*10; + endy[13]=starty[13]+20; + movex[13]=0; + movey[13]=0; + sprintf (menustring[7], "-Configure Controls-"); startx[7]=10+15; - starty[7]=100; + starty[7]=90; endx[7]=startx[7]+strlen(menustring[7])*10; endy[7]=starty[7]+20; movex[7]=0; movey[7]=0; + sprintf (menustring[12], "-Configure Stereo -"); + startx[12]=10+15; + starty[12]=55; + endx[12]=startx[12]+strlen(menustring[7])*10; + endy[12]=starty[12]+20; + movex[12]=0; + movey[12]=0; + if(newdetail==detail&&newscreenheight==(int)screenheight&&newscreenwidth==(int)screenwidth)sprintf (menustring[8], "Back"); else sprintf (menustring[8], "Back (some changes take effect next time Lugaru is opened)"); startx[8]=10; @@ -2662,7 +2781,7 @@ int Game::DrawGLScene(GLvoid) if(accountcampaignchoicesmade[accountactive]) for(i=0;i0) for(i=accountcampaignchoicesmade[accountactive];istartx[i]&&(mousecoordh/screenwidth*640)starty[i]&&480-(mousecoordv/screenheight*480)accountprogress[accountactive]&&jaccountprogress[accountactive]&&j0){ glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPushMatrix(); - if((mainmenu!=7||j!=0||!entername)&&(mainmenu!=13||j!=1)&&(mainmenu!=14||j!=1))text.glPrint(startx[j],starty[j],menustring[j],0,1,640,480); + if(mainmenu!=7||j!=0||!entername)text.glPrint(startx[j],starty[j],menustring[j],0,1,640,480); else { if(displayblink){ @@ -3604,13 +3591,6 @@ int Game::DrawGLScene(GLvoid) } } glPopMatrix(); - /*} - else{ - glPushMatrix(); - sprintf (string, "Hooo!"); - text.glPrint(startx[0],starty[0],string,0,1,640,480); - glPopMatrix(); - }*/ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE); for(i=0;i<15;i++) @@ -3618,24 +3598,20 @@ int Game::DrawGLScene(GLvoid) if(1-((float)i)/15-(1-selectedlong[j])>0) { glColor4f(1,0,0,(1-((float)i)/10-(1-selectedlong[j]))*.25); - if(mainmenu==12&&j==4)glColor4f(1,(sin(menupulse)+1)/2,(sin(menupulse)+1)/2,(1-((float)i)/10-(1-selectedlong[j]))*.25); if(mainmenu==9&&j>accountprogress[accountactive]&&jaccountprogress[accountactive]&&j0) { + //printf("Flash amount: %f, delay %i\n", flashamount, flashdelay); if(flashamount>1)flashamount=1; if(flashdelay<=0)flashamount-=multiplier; flashdelay--; @@ -3939,9 +3916,10 @@ int Game::DrawGLScene(GLvoid) //glFlush(); - if(drawmode!=motionblurmode||mainmenu){ - if(drawmode!=motionblurmode) + if ( side == stereoRight || side == stereoCenter ) { + if(drawmode!=motionblurmode||mainmenu){ swap_gl_buffers(); + } } //myassert(glGetError() == GL_NO_ERROR);