diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Frustum.cpp | 241 | ||||
-rw-r--r-- | src/Frustum.h | 13 | ||||
-rw-r--r-- | src/Game.h | 2 | ||||
-rw-r--r-- | src/GameDraw.cpp | 194 | ||||
-rw-r--r-- | src/misc.h | 4 | ||||
-rw-r--r-- | src/misc.zig | 171 |
6 files changed, 184 insertions, 441 deletions
diff --git a/src/Frustum.cpp b/src/Frustum.cpp deleted file mode 100644 index 3611a06..0000000 --- a/src/Frustum.cpp +++ /dev/null @@ -1,241 +0,0 @@ -#include <cmath> -#include <GL/gl.h> - -#include "Frustum.h" - -void FRUSTUM:: - GetFrustum() { - float projmatrix[16]; - float mvmatrix[16]; - float clip[16]; - float t; - - glGetFloatv(GL_PROJECTION_MATRIX, projmatrix); - glGetFloatv(GL_MODELVIEW_MATRIX, mvmatrix); - - // Combine the matrices - clip[0] = mvmatrix[0] * projmatrix[0] + mvmatrix[1] * projmatrix[4] + mvmatrix[2] * projmatrix[8] + mvmatrix[3] * projmatrix[12]; - clip[1] = mvmatrix[0] * projmatrix[1] + mvmatrix[1] * projmatrix[5] + mvmatrix[2] * projmatrix[9] + mvmatrix[3] * projmatrix[13]; - clip[2] = mvmatrix[0] * projmatrix[2] + mvmatrix[1] * projmatrix[6] + mvmatrix[2] * projmatrix[10] + mvmatrix[3] * projmatrix[14]; - clip[3] = mvmatrix[0] * projmatrix[3] + mvmatrix[1] * projmatrix[7] + mvmatrix[2] * projmatrix[11] + mvmatrix[3] * projmatrix[15]; - - clip[4] = mvmatrix[4] * projmatrix[0] + mvmatrix[5] * projmatrix[4] + mvmatrix[6] * projmatrix[8] + mvmatrix[7] * projmatrix[12]; - clip[5] = mvmatrix[4] * projmatrix[1] + mvmatrix[5] * projmatrix[5] + mvmatrix[6] * projmatrix[9] + mvmatrix[7] * projmatrix[13]; - clip[6] = mvmatrix[4] * projmatrix[2] + mvmatrix[5] * projmatrix[6] + mvmatrix[6] * projmatrix[10] + mvmatrix[7] * projmatrix[14]; - clip[7] = mvmatrix[4] * projmatrix[3] + mvmatrix[5] * projmatrix[7] + mvmatrix[6] * projmatrix[11] + mvmatrix[7] * projmatrix[15]; - - clip[8] = mvmatrix[8] * projmatrix[0] + mvmatrix[9] * projmatrix[4] + mvmatrix[10] * projmatrix[8] + mvmatrix[11] * projmatrix[12]; - clip[9] = mvmatrix[8] * projmatrix[1] + mvmatrix[9] * projmatrix[5] + mvmatrix[10] * projmatrix[9] + mvmatrix[11] * projmatrix[13]; - clip[10] = mvmatrix[8] * projmatrix[2] + mvmatrix[9] * projmatrix[6] + mvmatrix[10] * projmatrix[10] + mvmatrix[11] * projmatrix[14]; - clip[11] = mvmatrix[8] * projmatrix[3] + mvmatrix[9] * projmatrix[7] + mvmatrix[10] * projmatrix[11] + mvmatrix[11] * projmatrix[15]; - - clip[12] = mvmatrix[12] * projmatrix[0] + mvmatrix[13] * projmatrix[4] + mvmatrix[14] * projmatrix[8] + mvmatrix[15] * projmatrix[12]; - clip[13] = mvmatrix[12] * projmatrix[1] + mvmatrix[13] * projmatrix[5] + mvmatrix[14] * projmatrix[9] + mvmatrix[15] * projmatrix[13]; - clip[14] = mvmatrix[12] * projmatrix[2] + mvmatrix[13] * projmatrix[6] + mvmatrix[14] * projmatrix[10] + mvmatrix[15] * projmatrix[14]; - clip[15] = mvmatrix[12] * projmatrix[3] + mvmatrix[13] * projmatrix[7] + mvmatrix[14] * projmatrix[11] + mvmatrix[15] * projmatrix[15]; - - // Right plane - frustum[0][0] = clip[3] - clip[0]; - frustum[0][1] = clip[7] - clip[4]; - frustum[0][2] = clip[11] - clip[8]; - frustum[0][3] = clip[15] - clip[12]; - - // Left plane - frustum[1][0] = clip[3] + clip[0]; - frustum[1][1] = clip[7] + clip[4]; - frustum[1][2] = clip[11] + clip[8]; - frustum[1][3] = clip[15] + clip[12]; - - // Bottom plane - frustum[2][0] = clip[3] + clip[1]; - frustum[2][1] = clip[7] + clip[5]; - frustum[2][2] = clip[11] + clip[9]; - frustum[2][3] = clip[15] + clip[13]; - - // Top plane - frustum[3][0] = clip[3] - clip[1]; - frustum[3][1] = clip[7] - clip[5]; - frustum[3][2] = clip[11] - clip[9]; - frustum[3][3] = clip[15] - clip[13]; - - // Far plane - frustum[4][0] = clip[3] - clip[2]; - frustum[4][1] = clip[7] - clip[6]; - frustum[4][2] = clip[11] - clip[10]; - frustum[4][3] = clip[15] - clip[14]; - - // Near plane - frustum[5][0] = clip[3] + clip[2]; - frustum[5][1] = clip[7] + clip[6]; - frustum[5][2] = clip[11] + clip[10]; - frustum[5][3] = clip[15] + clip[14]; - - /* normalize the right plane */ - t = sqrtf(frustum[0][0]*frustum[0][0] - + frustum[0][1]*frustum[0][1] - + frustum[0][2]*frustum[0][2]); - frustum[0][0] /= t; - frustum[0][1] /= t; - frustum[0][2] /= t; - frustum[0][3] /= t; - - /* calculate left plane */ - frustum[1][0] = clip[ 3] + clip[ 0]; - frustum[1][1] = clip[ 7] + clip[ 4]; - frustum[1][2] = clip[11] + clip[ 8]; - frustum[1][3] = clip[15] + clip[12]; - - /* normalize the left plane */ - t = sqrtf(frustum[1][0]*frustum[1][0] - + frustum[1][1]*frustum[1][1] - + frustum[1][2]*frustum[1][2]); - frustum[1][0] /= t; - frustum[1][1] /= t; - frustum[1][2] /= t; - frustum[1][3] /= t; - - /* calculate the bottom plane */ - frustum[2][0] = clip[ 3] + clip[ 1]; - frustum[2][1] = clip[ 7] + clip[ 5]; - frustum[2][2] = clip[11] + clip[ 9]; - frustum[2][3] = clip[15] + clip[13]; - - /* normalize the bottom plane */ - t = sqrtf(frustum[2][0]*frustum[2][0] - + frustum[2][1]*frustum[2][1] - + frustum[2][2]*frustum[2][2]); - frustum[2][0] /= t; - frustum[2][1] /= t; - frustum[2][2] /= t; - frustum[2][3] /= t; - - /* calculate the top plane */ - frustum[3][0] = clip[ 3] - clip[ 1]; - frustum[3][1] = clip[ 7] - clip[ 5]; - frustum[3][2] = clip[11] - clip[ 9]; - frustum[3][3] = clip[15] - clip[13]; - - /* normalize the top plane */ - t = sqrtf(frustum[3][0]*frustum[3][0] - + frustum[3][1]*frustum[3][1] - + frustum[3][2]*frustum[3][2]); - frustum[3][0] /= t; - frustum[3][1] /= t; - frustum[3][2] /= t; - frustum[3][3] /= t; - - /* calculate the far plane */ - frustum[4][0] = clip[ 3] - clip[ 2]; - frustum[4][1] = clip[ 7] - clip[ 6]; - frustum[4][2] = clip[11] - clip[10]; - frustum[4][3] = clip[15] - clip[14]; - - /* normalize the far plane */ - t = sqrtf(frustum[4][0]*frustum[4][0] - + frustum[4][1]*frustum[4][1] - + frustum[4][2]*frustum[4][2]); - frustum[4][0] /= t; - frustum[4][1] /= t; - frustum[4][2] /= t; - frustum[4][3] /= t; - - /* calculate the near plane */ - frustum[5][0] = clip[ 3] + clip[ 2]; - frustum[5][1] = clip[ 7] + clip[ 6]; - frustum[5][2] = clip[11] + clip[10]; - frustum[5][3] = clip[15] + clip[14]; - - /* normalize the near plane */ - t = sqrtf(frustum[5][0]*frustum[5][0] - + frustum[5][1]*frustum[5][1] - + frustum[5][2]*frustum[5][2]); - frustum[5][0] /= t; - frustum[5][1] /= t; - frustum[5][2] /= t; - frustum[5][3] /= t; -} - -int FRUSTUM:: - CubeInFrustum(float x, float y, float z, float size) { - int c, c2; - - c2 = 0; - for(int i=0; i<6; i++) { - c=0; - if(frustum[i][0] * (x-size) + frustum[i][1] * (y-size) + frustum[i][2] * (z-size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x+size) + frustum[i][1] * (y-size) + frustum[i][2] * (z-size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x-size) + frustum[i][1] * (y+size) + frustum[i][2] * (z-size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x+size) + frustum[i][1] * (y+size) + frustum[i][2] * (z-size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x-size) + frustum[i][1] * (y-size) + frustum[i][2] * (z+size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x+size) + frustum[i][1] * (y-size) + frustum[i][2] * (z+size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x-size) + frustum[i][1] * (y+size) + frustum[i][2] * (z+size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x+size) + frustum[i][1] * (y+size) + frustum[i][2] * (z+size) + frustum[i][3] > 0) - c++; - if(c==0) - return 0; - if(c==8) - c2++; - } - if(c2>=6) - return 2; - else - return 1; -} - -int FRUSTUM:: - CubeInFrustum(float x, float y, float z, float size, float height) { - int c, c2; - - c2 = 0; - for(int i=0; i<6; i++) { - c=0; - if(frustum[i][0] * (x-size) + frustum[i][1] * (y-height) + frustum[i][2] * (z-size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x+size) + frustum[i][1] * (y-height) + frustum[i][2] * (z-size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x-size) + frustum[i][1] * (y+height) + frustum[i][2] * (z-size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x+size) + frustum[i][1] * (y+height) + frustum[i][2] * (z-size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x-size) + frustum[i][1] * (y-height) + frustum[i][2] * (z+size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x+size) + frustum[i][1] * (y-height) + frustum[i][2] * (z+size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x-size) + frustum[i][1] * (y+height) + frustum[i][2] * (z+size) + frustum[i][3] > 0) - c++; - if(frustum[i][0] * (x+size) + frustum[i][1] * (y+height) + frustum[i][2] * (z+size) + frustum[i][3] > 0) - c++; - if(c==0) - return 0; - if(c==8) - c2++; - } - if(c2>=6) - return 2; - else - return 1; -} - -int FRUSTUM:: - SphereInFrustum(float x, float y, float z, float radius) { - int c2; - - c2 = 0; - for(int i=0; i<6; i++) { - if(frustum[i][0] * x + frustum[i][1] * y + frustum[i][2] * z + frustum[i][3] > -1*radius) - c2++; - else - return 0; - } - if(c2>=6) - return 2; - else - return 1; -} diff --git a/src/Frustum.h b/src/Frustum.h deleted file mode 100644 index 2c5cea4..0000000 --- a/src/Frustum.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef FRUSTUM_H -#define FRUSTUM_H - -class FRUSTUM { - public: - float frustum[6][4]; - void GetFrustum(); - int CubeInFrustum(float, float, float, float); - int CubeInFrustum(float, float, float, float, float); - int SphereInFrustum(float, float, float, float); -}; - -#endif diff --git a/src/Game.h b/src/Game.h index 105a65e..24c6792 100644 --- a/src/Game.h +++ b/src/Game.h @@ -42,7 +42,6 @@ #include "Skeleton.h" #include "Models.h" #include "Text.h" -#include "Frustum.h" #include "Sprites.h" #include "Person.h" #include "Decals.h" @@ -73,7 +72,6 @@ struct Game { float losedelay; struct XYZ bodycoords; - FRUSTUM frustum; Model blocks[4]; Model blockwalls[4]; Model blockcollide[4]; 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 diff --git a/src/misc.h b/src/misc.h index 4e68f90..a51e2f3 100644 --- a/src/misc.h +++ b/src/misc.h @@ -73,6 +73,10 @@ extern "C" { float randFloat(); int32_t randInt(int32_t at_least, int32_t at_most); uint32_t randUint(uint32_t less_than); + + void getFrustum(float (*)[4]); + int cubeInFrustum(float (*)[4], float, float, float, float); + int sphereInFrustum(float (*)[4], float, float, float, float); void setFog(struct Fog*, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); void tempFog(struct Fog*, GLfloat, GLfloat, GLfloat); diff --git a/src/misc.zig b/src/misc.zig index 6f1d893..d523827 100644 --- a/src/misc.zig +++ b/src/misc.zig @@ -377,6 +377,177 @@ pub fn saveScores(base_dir: []const u8, current: Scores) !void { try dir.writeFile("scores.ini", data); } +export fn getFrustum(frustum: [*][4]f32) void { + var proj: [16]f32 = undefined; + c.glGetFloatv(c.GL_PROJECTION_MATRIX, &proj); + + var mv: [16]f32 = undefined; + c.glGetFloatv(c.GL_MODELVIEW_MATRIX, &mv); + + const clip = [16]f32{ + mv[0] * proj[0] + mv[1] * proj[4] + mv[2] * proj[8] + mv[3] * proj[12], + mv[0] * proj[1] + mv[1] * proj[5] + mv[2] * proj[9] + mv[3] * proj[13], + mv[0] * proj[2] + mv[1] * proj[6] + mv[2] * proj[10] + mv[3] * proj[14], + mv[0] * proj[3] + mv[1] * proj[7] + mv[2] * proj[11] + mv[3] * proj[15], + mv[4] * proj[0] + mv[5] * proj[4] + mv[6] * proj[8] + mv[7] * proj[12], + mv[4] * proj[1] + mv[5] * proj[5] + mv[6] * proj[9] + mv[7] * proj[13], + mv[4] * proj[2] + mv[5] * proj[6] + mv[6] * proj[10] + mv[7] * proj[14], + mv[4] * proj[3] + mv[5] * proj[7] + mv[6] * proj[11] + mv[7] * proj[15], + mv[8] * proj[0] + mv[9] * proj[4] + mv[10] * proj[8] + mv[11] * proj[12], + mv[8] * proj[1] + mv[9] * proj[5] + mv[10] * proj[9] + mv[11] * proj[13], + mv[8] * proj[2] + mv[9] * proj[6] + mv[10] * proj[10] + mv[11] * proj[14], + mv[8] * proj[3] + mv[9] * proj[7] + mv[10] * proj[11] + mv[11] * proj[15], + mv[12] * proj[0] + mv[13] * proj[4] + mv[14] * proj[8] + mv[15] * proj[12], + mv[12] * proj[1] + mv[13] * proj[5] + mv[14] * proj[9] + mv[15] * proj[13], + mv[12] * proj[2] + mv[13] * proj[6] + mv[14] * proj[10] + mv[15] * proj[14], + mv[12] * proj[3] + mv[13] * proj[7] + mv[14] * proj[11] + mv[15] * proj[15], + }; + + // Right plane + frustum[0][0] = clip[3] - clip[0]; + frustum[0][1] = clip[7] - clip[4]; + frustum[0][2] = clip[11] - clip[8]; + frustum[0][3] = clip[15] - clip[12]; + + // Left plane + frustum[1][0] = clip[3] + clip[0]; + frustum[1][1] = clip[7] + clip[4]; + frustum[1][2] = clip[11] + clip[8]; + frustum[1][3] = clip[15] + clip[12]; + + // Bottom plane + frustum[2][0] = clip[3] + clip[1]; + frustum[2][1] = clip[7] + clip[5]; + frustum[2][2] = clip[11] + clip[9]; + frustum[2][3] = clip[15] + clip[13]; + + // Top plane + frustum[3][0] = clip[3] - clip[1]; + frustum[3][1] = clip[7] - clip[5]; + frustum[3][2] = clip[11] - clip[9]; + frustum[3][3] = clip[15] - clip[13]; + + // Far plane + frustum[4][0] = clip[3] - clip[2]; + frustum[4][1] = clip[7] - clip[6]; + frustum[4][2] = clip[11] - clip[10]; + frustum[4][3] = clip[15] - clip[14]; + + // Near plane + frustum[5][0] = clip[3] + clip[2]; + frustum[5][1] = clip[7] + clip[6]; + frustum[5][2] = clip[11] + clip[10]; + frustum[5][3] = clip[15] + clip[14]; + + // normalize the right plane + var t: f32 = undefined; + t = @sqrt(frustum[0][0]*frustum[0][0] + + frustum[0][1]*frustum[0][1] + + frustum[0][2]*frustum[0][2]); + frustum[0][0] /= t; + frustum[0][1] /= t; + frustum[0][2] /= t; + frustum[0][3] /= t; + + // calculate left plane + frustum[1][0] = clip[3] + clip[0]; + frustum[1][1] = clip[7] + clip[4]; + frustum[1][2] = clip[11] + clip[ 8]; + frustum[1][3] = clip[15] + clip[12]; + + // normalize the left plane + t = @sqrt(frustum[1][0]*frustum[1][0] + + frustum[1][1]*frustum[1][1] + + frustum[1][2]*frustum[1][2]); + frustum[1][0] /= t; + frustum[1][1] /= t; + frustum[1][2] /= t; + frustum[1][3] /= t; + + // calculate the bottom plane + frustum[2][0] = clip[3] + clip[1]; + frustum[2][1] = clip[7] + clip[5]; + frustum[2][2] = clip[11] + clip[9]; + frustum[2][3] = clip[15] + clip[13]; + + // normalize the bottom plane + t = @sqrt(frustum[2][0]*frustum[2][0] + + frustum[2][1]*frustum[2][1] + + frustum[2][2]*frustum[2][2]); + frustum[2][0] /= t; + frustum[2][1] /= t; + frustum[2][2] /= t; + frustum[2][3] /= t; + + // calculate the top plane + frustum[3][0] = clip[3] - clip[1]; + frustum[3][1] = clip[7] - clip[5]; + frustum[3][2] = clip[11] - clip[9]; + frustum[3][3] = clip[15] - clip[13]; + + // normalize the top plane + t = @sqrt(frustum[3][0]*frustum[3][0] + + frustum[3][1]*frustum[3][1] + + frustum[3][2]*frustum[3][2]); + frustum[3][0] /= t; + frustum[3][1] /= t; + frustum[3][2] /= t; + frustum[3][3] /= t; + + // calculate the far plane + frustum[4][0] = clip[3] - clip[2]; + frustum[4][1] = clip[7] - clip[6]; + frustum[4][2] = clip[11] - clip[10]; + frustum[4][3] = clip[15] - clip[14]; + + // normalize the far plane + t = @sqrt(frustum[4][0]*frustum[4][0] + + frustum[4][1]*frustum[4][1] + + frustum[4][2]*frustum[4][2]); + frustum[4][0] /= t; + frustum[4][1] /= t; + frustum[4][2] /= t; + frustum[4][3] /= t; + + // calculate the near plane + frustum[5][0] = clip[3] + clip[2]; + frustum[5][1] = clip[7] + clip[6]; + frustum[5][2] = clip[11] + clip[10]; + frustum[5][3] = clip[15] + clip[14]; + + // normalize the near plane + t = @sqrt(frustum[5][0]*frustum[5][0] + + frustum[5][1]*frustum[5][1] + + frustum[5][2]*frustum[5][2]); + frustum[5][0] /= t; + frustum[5][1] /= t; + frustum[5][2] /= t; + frustum[5][3] /= t; +} + +export fn cubeInFrustum(frustum: [*][4]f32, + x: f32, y: f32, z: f32, size: f32) bool { + const delta = [_]f32{ -size, size }; + var i = @as(u8, 0); + loop: while (i < 6) : (i += 1) { + for (delta) |dx| for (delta) |dy| for (delta) |dz| + if (frustum[i][0] * (x + dx) + frustum[i][1] * (y + dy) + + frustum[i][2] * (z + dz) + frustum[i][3] > 0) continue :loop; + return false; + } + return true; +} + +export fn sphereInFrustum(frustum: [*][4]f32, + x: f32, y: f32, z: f32, r: f32) bool { + var i = @as(u8, 0); + while (i < 6) : (i += 1) + if (frustum[i][0] * x + frustum[i][1] * y + + frustum[i][2] * z + frustum[i][3] <= -r) + return false; + return true; +} + const Text = struct { texture: u32, base: u32, |