diff options
Diffstat (limited to 'dep/include/g3dlite/G3D/Box.h')
-rw-r--r-- | dep/include/g3dlite/G3D/Box.h | 49 |
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 |