aboutsummaryrefslogtreecommitdiff
path: root/src/GameDraw.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GameDraw.cpp')
-rw-r--r--src/GameDraw.cpp117
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