summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/boundbox.cpp76
-rw-r--r--common/boundbox.h2
2 files changed, 78 insertions, 0 deletions
diff --git a/common/boundbox.cpp b/common/boundbox.cpp
index 6dc6d17..264c632 100644
--- a/common/boundbox.cpp
+++ b/common/boundbox.cpp
@@ -3,6 +3,7 @@
#include <float.h>
#include <math.h>
+#include "opengl.h"
#include "boundbox.h"
#include "matrix.h"
#include "defines.h"
@@ -18,6 +19,81 @@ static void GetPolyCoeffs(float x1, float y1, float z1, float x2, float y2, floa
*D = - ((*A)*x1) - ((*B)*y1) - ((*C)*z1);
}
+static void GetFrustumPlanes (float planes[6][4])
+{
+ // Storage for the Modelview, Projection and their multiplication (Frustum) matrix.
+ float mv[16], pj[16], fm[16];
+
+ glGetFloatv(GL_MODELVIEW_MATRIX, mv);
+ glGetFloatv(GL_PROJECTION_MATRIX, pj);
+
+ fm[0] = pj[0] * mv[0] + pj[4] * mv[1] + pj[8] * mv[2] + pj[12] * mv[3];
+ fm[4] = pj[0] * mv[4] + pj[4] * mv[5] + pj[8] * mv[6] + pj[12] * mv[7];
+ fm[8] = pj[0] * mv[8] + pj[4] * mv[9] + pj[8] * mv[10] + pj[12] * mv[11];
+ fm[12] = pj[0] * mv[12] + pj[4] * mv[13] + pj[8] * mv[14] + pj[12] * mv[15];
+ fm[1] = pj[1] * mv[0] + pj[5] * mv[1] + pj[9] * mv[2] + pj[13] * mv[3];
+ fm[5] = pj[1] * mv[4] + pj[5] * mv[5] + pj[9] * mv[6] + pj[13] * mv[7];
+ fm[9] = pj[1] * mv[8] + pj[5] * mv[9] + pj[9] * mv[10] + pj[13] * mv[11];
+ fm[13] = pj[1] * mv[12] + pj[5] * mv[13] + pj[9] * mv[14] + pj[13] * mv[15];
+ fm[2] = pj[2] * mv[0] + pj[6] * mv[1] + pj[10] * mv[2] + pj[14] * mv[3];
+ fm[6] = pj[2] * mv[4] + pj[6] * mv[5] + pj[10] * mv[6] + pj[14] * mv[7];
+ fm[10] = pj[2] * mv[8] + pj[6] * mv[9] + pj[10] * mv[10] + pj[14] * mv[11];
+ fm[14] = pj[2] * mv[12] + pj[6] * mv[13] + pj[10] * mv[14] + pj[14] * mv[15];
+ fm[3] = pj[3] * mv[0] + pj[7] * mv[1] + pj[11] * mv[2] + pj[15] * mv[3];
+ fm[7] = pj[3] * mv[4] + pj[7] * mv[5] + pj[11] * mv[6] + pj[15] * mv[7];
+ fm[11] = pj[3] * mv[8] + pj[7] * mv[9] + pj[11] * mv[10] + pj[15] * mv[11];
+ fm[15] = pj[3] * mv[12] + pj[7] * mv[13] + pj[11] * mv[14] + pj[15] * mv[15];
+
+ planes[0][0] = (fm[0] - fm[3]) * -1;
+ planes[0][1] = (fm[4] - fm[7]) * -1;
+ planes[0][2] = (fm[8] - fm[11]) * -1;
+ planes[0][3] = (fm[12] - fm[15]) * -1;
+ planes[1][0] = fm[0] + fm[3];
+ planes[1][1] = fm[4] + fm[7];
+ planes[1][2] = fm[8] + fm[11];
+ planes[1][3] = fm[12] + fm[15];
+ planes[2][0] = (fm[1] - fm[3]) * -1;
+ planes[2][1] = (fm[5] - fm[7]) * -1;
+ planes[2][2] = (fm[9] - fm[11]) * -1;
+ planes[2][3] = (fm[13] - fm[15]) * -1;
+ planes[3][0] = fm[1] + fm[3];
+ planes[3][1] = fm[5] + fm[7];
+ planes[3][2] = fm[9] + fm[11];
+ planes[3][3] = fm[13] + fm[15];
+ planes[4][0] = (fm[2] - fm[3]) * -1;
+ planes[4][1] = (fm[6] - fm[7]) * -1;
+ planes[4][2] = (fm[10] - fm[11]) * -1;
+ planes[4][3] = (fm[14] - fm[15]) * -1;
+ planes[5][0] = fm[2] + fm[3];
+ planes[5][1] = fm[6] + fm[7];
+ planes[5][2] = fm[10] + fm[11];
+ planes[5][3] = fm[14] + fm[15];
+}
+
+bool BoxOutsideFrustum (float Dimensions[6])
+{
+ float d, planes[6][4], verts[8][3] = {
+ { Dimensions[0], Dimensions[1], Dimensions[5] },
+ { Dimensions[3], Dimensions[1], Dimensions[5] },
+ { Dimensions[0], Dimensions[1], Dimensions[2] },
+ { Dimensions[3], Dimensions[4], Dimensions[5] },
+ { Dimensions[3], Dimensions[4], Dimensions[2] },
+ { Dimensions[0], Dimensions[4], Dimensions[2] },
+ { Dimensions[0], Dimensions[4], Dimensions[5] },
+ { Dimensions[3], Dimensions[1], Dimensions[2] } };
+
+ GetFrustumPlanes (planes);
+
+ for (int i = 0; i < 6; i++)
+ for (int j = 0; j < 8; j++)
+ {
+ d = verts[j][0]*planes[i][0] + verts[j][1]*planes[i][1] + verts[j][2]*planes[i][2] + planes[i][3];
+ if (d < -0.001f)
+ return true;
+ }
+ return false;
+}
+
/////////////////////////////////////////////////////////////////////////////
// BoundingBox construction/destruction
diff --git a/common/boundbox.h b/common/boundbox.h
index 5354396..b25c0a6 100644
--- a/common/boundbox.h
+++ b/common/boundbox.h
@@ -5,6 +5,8 @@
#ifndef _BOUNDBOX_H_
#define _BOUNDBOX_H_
+bool BoxOutsideFrustum (float Dimensions[6]);
+
class Matrix;
class BoundingBox;