aboutsummaryrefslogtreecommitdiff
path: root/dep/include/g3dlite/G3D/Box.h
diff options
context:
space:
mode:
Diffstat (limited to 'dep/include/g3dlite/G3D/Box.h')
-rw-r--r--dep/include/g3dlite/G3D/Box.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/dep/include/g3dlite/G3D/Box.h b/dep/include/g3dlite/G3D/Box.h
index fccff258a25..8ec7ea3408d 100644
--- a/dep/include/g3dlite/G3D/Box.h
+++ b/dep/include/g3dlite/G3D/Box.h
@@ -1,66 +1,92 @@
/**
@file Box.h
+
Box class
+
@maintainer Morgan McGuire, matrix@graphics3d.com
+
@cite Portions based on Dave Eberly's Magic Software Library at <A HREF="http://www.magic-software.com">http://www.magic-software.com</A>
@created 2001-06-02
@edited 2006-01-05
+
Copyright 2000-2006, Morgan McGuire.
All rights reserved.
*/
+
#ifndef G3D_BOX_H
#define G3D_BOX_H
+
#include "G3D/platform.h"
#include "G3D/Vector3.h"
#include "G3D/Array.h"
#include "G3D/Plane.h"
+
namespace G3D {
+
class CoordinateFrame;
+
/**
An arbitrary 3D box, useful as a bounding box.
+
To construct a box from a coordinate frame, center and extent, use the idiom:
+
<CODE>Box box = cframe.toObjectSpace(Box(center - extent/2, center + extent/2));</CODE>
*/
class Box {
private:
+
static int32 dummy;
+
friend class CoordinateFrame;
+
/**
<PRE>
3 2 7 6
+
0 1 4 5
+
front back (seen through front)
</PRE>
*/
Vector3 _corner[8];
+
/**
Unit axes.
*/
Vector3 _axis[3];
+
Vector3 _center;
+
/**
Extent along each axis.
*/
Vector3 _extent;
+
float _area;
float _volume;
+
void init(
const Vector3& min,
const Vector3& max);
+
public:
+
/**
Does not initialize the fields.
*/
Box();
+
/**
Constructs a box from two opposite corners.
*/
Box(
const Vector3& min,
const Vector3& max);
+
Box(const class AABox& b);
+
/**
Returns the object to world transformation for
this box. localFrame().worldToObject(...) takes
@@ -69,16 +95,20 @@ public:
is no scaling in this transformation.
*/
CoordinateFrame localFrame() const;
+
void getLocalFrame(CoordinateFrame& frame) const;
+
/**
Returns the centroid of the box.
*/
inline Vector3 center() const {
return _center;
}
+
inline Vector3 getCenter() const {
return center();
}
+
/**
Returns a corner (0 <= i < 8)
@deprecated
@@ -87,10 +117,12 @@ public:
debugAssert(i < 8);
return _corner[i];
}
+
inline Vector3 corner(int i) const {
debugAssert(i < 8);
return _corner[i];
}
+
/**
Unit length.
*/
@@ -98,6 +130,7 @@ public:
debugAssert(a < 3);
return _axis[a];
}
+
/**
Distance from corner(0) to the next corner
along the box's local axis a.
@@ -106,9 +139,11 @@ public:
debugAssert(a < 3);
return (float)_extent[a];
}
+
inline Vector3 extent() const {
return _extent;
}
+
/**
Returns the four corners of a face (0 <= f < 6).
The corners are returned to form a counter clockwise quad facing outwards.
@@ -119,6 +154,7 @@ public:
Vector3& v1,
Vector3& v2,
Vector3& v3) const;
+
/**
@deprecated Use culledBy(Array<Plane>&)
*/
@@ -128,6 +164,7 @@ public:
int32& cullingPlaneIndex,
const uint32 testMask,
uint32& childMask) const;
+
/**
@deprecated Use culledBy(Array<Plane>&)
*/
@@ -136,6 +173,7 @@ public:
int numPlanes,
int32& cullingPlaneIndex = dummy,
const uint32 testMask = -1) const;
+
/**
See AABox::culledBy
*/
@@ -144,6 +182,7 @@ public:
int32& cullingPlaneIndex,
const uint32 testMask,
uint32& childMask) const;
+
/**
Conservative culling test that does not produce a mask for children.
*/
@@ -151,15 +190,21 @@ public:
const Array<Plane>& plane,
int32& cullingPlaneIndex = dummy,
const uint32 testMask = -1) const;
+
bool contains(
const Vector3& point) const;
+
/** @deprecated */
float surfaceArea() const;
+
inline float area() const {
return surfaceArea();
}
+
float volume() const;
+
void getRandomSurfacePoint(Vector3& P, Vector3& N = Vector3::dummy) const;
+
/**
@deprecated
Uniformly distributed on the surface.
@@ -169,12 +214,16 @@ public:
getRandomSurfacePoint(V);
return V;
}
+
/**
Uniformly distributed on the interior (includes surface)
*/
Vector3 randomInteriorPoint() const;
+
void getBounds(class AABox&) const;
};
+
}
+
#endif