diff options
Diffstat (limited to 'src/GameDraw.cpp')
-rw-r--r-- | src/GameDraw.cpp | 194 |
1 files changed, 9 insertions, 185 deletions
diff --git a/src/GameDraw.cpp b/src/GameDraw.cpp index 1094dc7..010fbc0 100644 --- a/src/GameDraw.cpp +++ b/src/GameDraw.cpp @@ -437,142 +437,80 @@ void Game::DrawGLScene(void) glDisable(GL_CLIP_PLANE0); glPopMatrix(); - frustum.GetFrustum(); - - GLfloat LightPosition[]= { -.5, 1, -.8, 0.0f }; - + GLfloat frustum[6][4]; + getFrustum(frustum); + 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); - if(visions==0)street.draw(.22,.22,.22); - if(visions==1)street.draw(0,0,0); - glEnable(GL_DEPTH_TEST); - glDepthMask(1); - glPopMatrix(); - if(visions==0)glEnable(GL_LIGHTING); - if(visions==1)glDisable(GL_LIGHTING); //Draw blocks - glEnable(GL_BLEND); - 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; bool draw; - int whichtri; - XYZ collpoint; - for(int i=beginx;i<=endx;i++){ - for(int j=beginz;j<=endz;j++){ - drawn[i][j]=1; - } - } if(beginx<endx&&beginz<endz) - for(int i=beginx;i<=endx;i++){ - for(int j=beginz;j<=endz;j++){ - draw=1; - //Only draw if visible - distsquared=((i)*block_spacing-camera.position.x)*((i)*block_spacing-camera.position.x)+((j)*block_spacing-camera.position.z)*((j)*block_spacing-camera.position.z); - if(distsquared>(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&&!frustum.CubeInFrustum((i)*block_spacing,0,(j)*block_spacing,block_spacing))draw=0; - - if(draw&&citytype[i][j]!=3&&!frustum.SphereInFrustum(blocks[citytype[i][j]].boundingspherecenter.x+(i)*block_spacing,blocks[citytype[i][j]].boundingspherecenter.y,blocks[citytype[i][j]].boundingspherecenter.z+(j)*block_spacing,blocks[citytype[i][j]].boundingsphereradius))draw=0; + if(draw&&citytype[i][j]!=3&&!sphereInFrustum(frustum, blocks[citytype[i][j]].boundingspherecenter.x+(i)*block_spacing,blocks[citytype[i][j]].boundingspherecenter.y,blocks[citytype[i][j]].boundingspherecenter.z+(j)*block_spacing,blocks[citytype[i][j]].boundingsphereradius))draw=0; if(draw){ - glPushMatrix(); - glTranslatef(i*block_spacing,0,j*block_spacing); - glRotatef(cityrotation[i][j]*90,0,1,0); - blocks[citytype[i][j]].draw(); - glPopMatrix(); - - } - - if(!draw){ - + } else { move.y=0; - move.x=i*block_spacing; - move.z=j*block_spacing; - if(findDistancefast(move,camera.position)<300000)drawn[i][j]=0; - } - } - } // Decals @@ -611,240 +549,126 @@ void Game::DrawGLScene(void) draw=1; if(person[i].skeleton.free<1){ if(person[i].whichblockx>=0&&person[i].whichblockx<num_blocks&&person[i].whichblocky>=0&&person[i].whichblocky<num_blocks){ - if(!drawn[person[i].whichblockx][person[i].whichblocky])draw=0; }else draw=0; - if(draw) - - if(!frustum.CubeInFrustum(person[i].playercoords.x,person[i].playercoords.y,person[i].playercoords.z,5))draw=0; - + if(!cubeInFrustum(frustum, person[i].playercoords.x,person[i].playercoords.y,person[i].playercoords.z,5))draw=0; if(draw) - if(findDistancefast(person[i].playercoords,camera.position)>1000000)draw=0; - if(draw) - for(int j=beginx;j<=endx;j++){ - for(int k=beginz;k<=endz;k++){ - if(draw){ - move.y=0; - move.x=j*block_spacing; - move.z=k*block_spacing; - if(findDistancefast(move,camera.position)<100000){ - whichtri=blockocclude.LineCheck2(camera.position,person[i].playercoords,&collpoint,move,0); - if(whichtri!=-1)draw=0; - } - } - } - } if(draw){ - move.y=0; - move.x=person[i].whichblockx*block_spacing; - move.z=person[i].whichblocky*block_spacing; - whichtri=blockocclude.LineCheck2(camera.position,person[i].playercoords,&collpoint,move,0); - if(whichtri!=-1)draw=0; - } - if(i==0)draw=1; - } if(person[i].skeleton.free==1){ - if(draw) - - if(!person[i].skeleton.broken&&!frustum.CubeInFrustum(person[i].averageloc.x,person[i].averageloc.y,person[i].averageloc.z,5))draw=0; - + if(!person[i].skeleton.broken&&!cubeInFrustum(frustum, person[i].averageloc.x,person[i].averageloc.y,person[i].averageloc.z,5))draw=0; if(draw) - if(findDistancefast(person[i].averageloc,camera.position)>1000000)draw=0; - if(draw) - if(person[i].skeleton.joints[0].position.y<-2)draw=0; for(int j=beginx;j<=endx;j++){ - for(int k=beginz;k<=endz;k++){ - if(draw){ - move.y=0; - move.x=j*block_spacing; - move.z=k*block_spacing; - if(findDistancefast(move,camera.position)<100000){ - whichtri=blockocclude.LineCheck2(camera.position,person[i].averageloc,&collpoint,move,0); - if(whichtri!=-1)draw=0; - } - } - } - } - if(draw){ - move.y=0; - move.x=person[i].whichblockx*block_spacing; - move.z=person[i].whichblocky*block_spacing; - whichtri=blockocclude.LineCheck2(camera.position,person[i].averageloc,&collpoint,move,0); - if(whichtri!=-1)draw=0; - } - if(i==0)draw=1; - } if(draw&&person[i].existing==1){ - if((findDistancefast(person[i].playercoords,camera.position)<100000+zoom*3000000&&person[i].skeleton.free<1)||(findDistancefast(person[i].averageloc,camera.position)<100000+zoom*3000000&&person[i].skeleton.free>=1)){ - 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==0)person[i].DoAnimations(i); - if(i==0&&visions==1)person[i].DoAnimationslite(i); - } - if(visions==1)nocolors=1; - if(visions==1&&person[i].type==eviltype)nocolors=2; - if(visions==1&&person[i].type==viptype)nocolors=3; - if(!(visions==1&&i==0)&&!(zoom==1&&i==0))person[i].DrawSkeleton(i); - glPopMatrix(); - - } - - else{ - + } else { glPushMatrix(); - if(person[i].skeleton.free<1)person[i].DoAnimationslite(i); - glColor4f(1,1,1,1); - glEnable(GL_BLEND); - 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!=1)glEnable(GL_LIGHTING); - } - } - if(person[i].skeleton.free<1&&!draw)person[i].DoAnimationslite(i); - if(!person[i].existing) - if(!draw||findDistancefast(person[i].playercoords,camera.position)>10000){person[i].existing=1;} - } - glDisable(GL_COLOR_MATERIAL); - glDisable(GL_BLEND); //Attacker psychicness |