diff options
Diffstat (limited to 'src/GameDraw.cpp')
| -rw-r--r-- | src/GameDraw.cpp | 117 |
1 files changed, 48 insertions, 69 deletions
diff --git a/src/GameDraw.cpp b/src/GameDraw.cpp index 846a7fa..42382cc 100644 --- a/src/GameDraw.cpp +++ b/src/GameDraw.cpp @@ -485,7 +485,6 @@ void Game::DrawGLScene(void) 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++){ @@ -502,8 +501,13 @@ void Game::DrawGLScene(void) 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&&!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 && 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); @@ -552,72 +556,47 @@ void Game::DrawGLScene(void) glEnable(GL_COLOR_MATERIAL); glEnable(GL_BLEND); for(int i=0;i<numpeople;i++){ - 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(!cubeInFrustum(frustum, person[i].playercoords.x,person[i].playercoords.y,person[i].playercoords.z,5))draw=0; - if (draw && sqrlen(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 (sqrlen(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&&!cubeInFrustum(frustum, person[i].averageloc.x,person[i].averageloc.y,person[i].averageloc.z,5))draw=0; - if (draw && sqrlen(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 (sqrlen(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){ + draw = true; + if (((!person[i].skeleton.free + || !person[i].skeleton.broken) + && !cubeInFrustum(frustum, + person[i].playercoords.x, + person[i].playercoords.y, + person[i].playercoords.z, 5)) + || (person[i].skeleton.free + && (person[i].whichblockx < 0 + || person[i].whichblockx >= 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 |
