style cleanup
[blender.git] / source / gameengine / SceneGraph / SG_BBox.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file SG_BBox.h
29  *  \ingroup bgesg
30  *  \brief Bounding Box
31  */
32  
33 #ifndef __SG_BBOX_H__
34 #define __SG_BBOX_H__
35  
36 #include "MT_Scalar.h"
37 #include "MT_Point3.h"
38 #include "MT_Vector3.h"
39 #include "MT_Transform.h"
40
41 #include <vector> 
42
43 #ifdef WITH_CXX_GUARDEDALLOC
44 #include "MEM_guardedalloc.h"
45 #endif
46
47 class SG_Node;
48
49 /**
50  * Bounding box class.
51  * Holds the minimum and maximum axis aligned points of a node's bounding box,
52  * in world coordinates.
53  */
54 class SG_BBox
55 {
56         MT_Point3 m_min;
57         MT_Point3 m_max;
58 public:
59         typedef enum { INSIDE, INTERSECT, OUTSIDE } intersect;
60         SG_BBox();
61         SG_BBox(const MT_Point3 &min, const MT_Point3 &max);
62         SG_BBox(const SG_BBox &other, const MT_Transform &world);
63         SG_BBox(const SG_BBox &other);
64         ~SG_BBox();
65
66         /**
67          * Enlarges the bounding box to contain the specified point.
68          */
69         SG_BBox& operator +=(const MT_Point3 &point);
70         /**
71          * Enlarges the bounding box to contain the specified bound box.
72          */
73         SG_BBox& operator +=(const SG_BBox &bbox);
74         
75         SG_BBox operator + (const SG_BBox &bbox2) const;
76 #if 0
77         /**
78          * Translates the bounding box.
79          */
80         void translate(const MT_Vector3 &dx);
81         /**
82          * Scales the bounding box about the optional point.
83          */
84         void scale(const MT_Vector3 &size, const MT_Point3 &point = MT_Point3(0.0, 0.0, 0.0));
85 #endif
86         SG_BBox transform(const MT_Transform &world) const;
87         /**
88          * Computes the volume of the bounding box.
89          */
90         MT_Scalar volume() const;
91         
92         /**
93          * Test if the given point is inside this bounding box.
94          */
95         bool inside(const MT_Point3 &point) const;
96         
97         /**
98          * Test if the given bounding box is inside this bounding box.
99          */
100         bool inside(const SG_BBox &other) const;
101
102         /**
103          * Test if the given bounding box is outside this bounding box.
104          */
105         bool outside(const SG_BBox &other) const;
106         
107         /**
108          * Test if the given bounding box intersects this bounding box.
109          */
110         bool intersects(const SG_BBox &other) const;
111         
112         /**
113          * Test the given bounding box with this bounding box.
114          */
115         intersect test(const SG_BBox &other) const;
116         
117         /**
118          * Get the eight points that define this bounding box.
119          *
120          * \param world a world transform to apply to the produced points bounding box.
121          */
122         void get(MT_Point3 *box, const MT_Transform &world) const;
123         /**
124          * Get the eight points that define this axis aligned bounding box.
125          * This differs from SG_BBox::get() in that the produced box will be world axis aligned.
126          * The maximum & minimum local points will be transformed *before* splitting to 8 points.
127          * \param world a world transform to be applied.
128          */
129         void getaa(MT_Point3 *box, const MT_Transform &world) const;
130         
131         void getmm(MT_Point3 *box, const MT_Transform &world) const;
132
133         void split(SG_BBox &left, SG_BBox &right) const;
134         
135         friend class SG_Tree;
136
137
138 #ifdef WITH_CXX_GUARDEDALLOC
139 public:
140         void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_BBox"); }
141         void operator delete( void *mem ) { MEM_freeN(mem); }
142 #endif
143 };
144
145 #endif /* __SG_BBOX_H__ */