summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorleo2000-07-23 20:32:34 +0000
committerleo2000-07-23 20:32:34 +0000
commit23628b3b6852f14a8041628a99a7780a286848d1 (patch)
treedb752c404aecb4155407b96506aaadef37cb856a
parent259b2b66808154b3d97ed3d4bbbdcc7d956d347e (diff)
Minor changes
git-svn-id: http://svn.leocad.org/trunk@98 c7d43263-9d01-0410-8a33-9dba5d9f93d6
-rw-r--r--common/pieceinf.cpp76
1 files changed, 75 insertions, 1 deletions
diff --git a/common/pieceinf.cpp b/common/pieceinf.cpp
index 754326d..dff6ea3 100644
--- a/common/pieceinf.cpp
+++ b/common/pieceinf.cpp
@@ -5,7 +5,6 @@
#include <string.h>
#include <stdio.h>
#include <math.h>
-#include "boundbox.h"
#include "opengl.h"
#include "texture.h"
#include "pieceinf.h"
@@ -37,6 +36,81 @@ static float costbl[SIDES];
#define LC_KNOB_RADIUS 0.32f
//#define LC_STUD_TECH_RADIUS (LC_FLAT_HEIGHT/2)
+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;
+}
+
// Convert a color from LDraw to LeoCAD
unsigned char ConvertColor(int c)
{