home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 February
/
Chip_2001-02_cd1.bin
/
bonus
/
demos
/
CS
/
exp
/
SOURCES
/
GLENGINE
/
boundingbox.h
< prev
next >
Wrap
C/C++ Source or Header
|
2000-07-19
|
4KB
|
174 lines
#ifndef __OGL2_BOUNDING_BOX__
#define __OGL2_BOUNDING_BOX__
#ifdef WIN32
#include <windows.h>
#endif
#ifndef WIN32
#define APIENTRY
#define CALLBACK
#endif
#include <GL/gl.h>
#include "glmatrix.h"
extern "C++" {
class BoundingBox {
GLubyte eval(GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
GLubyte c=0;
if(x>w) c|=1;
if(x<-w) c|=2;
if(y>w) c|=4;
if(y<-w) c|=8;
if(z>w) c|=16;
if(z<-w) c|=32;
return c;
}
GLfloat mx, my, mz;
GLfloat Mx, My, Mz;
bool initialized1,
initialized2,
initialized;
public:
BoundingBox () :
initialized1(false), initialized2(false), initialized(false) {}
void Corner1(GLfloat x, GLfloat y, GLfloat z) {
initialized1 = true;
mx = x;
my = y;
mz = z;
if(initialized2)
initialized = true;
}
void Corner2(GLfloat x, GLfloat y, GLfloat z) {
initialized2 = true;
Mx = x;
My = y;
Mz = z;
if(initialized1)
initialized = true;
}
bool IsVisible() {
if(!initialized)
return true;
GLmatrix matrix1, matrix2;
glGetFloatv(GL_PROJECTION_MATRIX, matrix1());
glGetFloatv(GL_MODELVIEW_MATRIX, matrix2());
matrix1 = matrix1*matrix2;
GLfloat x, y, z, w;
GLubyte outcode;
x=mx; y=my; z=mz; w=1.0;
matrix1.MultVertex4f(x, y, z, w);
outcode = eval(x, y, z, w);
if(outcode==0) return true;
x=Mx; y=my; z=mz; w=1.0;
matrix1.MultVertex4f(x, y, z, w);
outcode &= eval(x, y, z, w);
if(outcode==0) return true;
x=Mx; y=My; z=mz; w=1.0;
matrix1.MultVertex4f(x, y, z, w);
outcode &= eval(x, y, z, w);
if(outcode==0) return true;
x=mx; y=My; z=mz; w=1.0;
matrix1.MultVertex4f(x, y, z, w);
outcode &= eval(x, y, z, w);
if(outcode==0) return true;
x=mx; y=my; z=Mz; w=1.0;
matrix1.MultVertex4f(x, y, z, w);
outcode &= eval(x, y, z, w);
if(outcode==0) return true;
x=Mx; y=my; z=Mz; w=1.0;
matrix1.MultVertex4f(x, y, z, w);
outcode &= eval(x, y, z, w);
if(outcode==0) return true;
x=Mx; y=My; z=Mz; w=1.0;
matrix1.MultVertex4f(x, y, z, w);
outcode &= eval(x, y, z, w);
if(outcode==0) return true;
x=mx; y=My; z=Mz; w=1.0;
matrix1.MultVertex4f(x, y, z, w);
outcode &= eval(x, y, z, w);
if(outcode==0) return true;
return false;
}
// Union with another bounding box
BoundingBox& operator +=(const BoundingBox& B)
{
if(!B.initialized) {
initialized1 = initialized2 = initialized = false;
return *this;
}
if(initialized) {
if(B.mx<mx) mx = B.mx;
if(B.my<my) my = B.my;
if(B.mz<mz) mz = B.mz;
if(B.Mx>Mx) Mx = B.Mx;
if(B.My>My) My = B.My;
if(B.Mz>Mz) Mz = B.Mz;
}
else {
mx = B.mx; my = B.my; mz = B.mz;
Mx = B.Mx; My = B.My; Mz = B.Mz;
initialized1 = initialized2 = initialized = true;
}
return *this;
}
void Render()
{
if(!initialized)
return;
glDisable(GL_TEXTURE_2D);
glColor3f(1, 1, 1);
glBegin(GL_LINE_LOOP);
glVertex3f(mx, my, mz);
glVertex3f(Mx, my, mz);
glVertex3f(Mx, My, mz);
glVertex3f(mx, My, mz);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3f(mx, my, Mz);
glVertex3f(Mx, my, Mz);
glVertex3f(Mx, My, Mz);
glVertex3f(mx, My, Mz);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3f(mx, my, mz);
glVertex3f(Mx, my, mz);
glVertex3f(Mx, my, Mz);
glVertex3f(mx, my, Mz);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3f(mx, My, mz);
glVertex3f(Mx, My, mz);
glVertex3f(Mx, My, Mz);
glVertex3f(mx, My, Mz);
glEnd();
}
};
} // extern "C++"
#endif