summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--build.zig1
-rw-r--r--src/Frustum.cpp241
-rw-r--r--src/Frustum.h13
-rw-r--r--src/Game.h2
-rw-r--r--src/GameDraw.cpp194
-rw-r--r--src/misc.h4
-rw-r--r--src/misc.zig171
7 files changed, 184 insertions, 442 deletions
diff --git a/build.zig b/build.zig
index 85f9c22..05f9e91 100644
--- a/build.zig
+++ b/build.zig
@@ -37,7 +37,6 @@ pub fn build(b: *Builder) void {
 
     const cxxflags = [_][]const u8{ "--std=c++17", "-fno-sanitize=undefined" };
     exe.addCSourceFile("src/Decals.cpp", &cxxflags);
-    exe.addCSourceFile("src/Frustum.cpp", &cxxflags);
     exe.addCSourceFile("src/GameDraw.cpp", &cxxflags);
     exe.addCSourceFile("src/GameInitDispose.cpp", &cxxflags);
     exe.addCSourceFile("src/GameLoop.cpp", &cxxflags);
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,