00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef CCollisionAABBBoxH
00024 #define CCollisionAABBBoxH
00025
00026 #include "math/CMaths.h"
00027 #include "graphics/CTriangle.h"
00028 #include "graphics/CVertex.h"
00029 #include <vector>
00030
00031
00032
00040
00041
00042
00051
00052 class cCollisionAABBBox
00053 {
00054 public:
00055
00056
00057
00058
00059
00061 cCollisionAABBBox() {};
00062
00064 cCollisionAABBBox(const cVector3d& a_min, const cVector3d& a_max)
00065 { setValue(a_min, a_max); }
00066
00068 virtual ~cCollisionAABBBox() {};
00069
00070
00071
00072
00073
00074
00076 inline cVector3d getCenter() const { return (m_center); }
00077
00079 inline cVector3d getExtent() const { return (m_extent); }
00080
00082 inline void setCenter(const cVector3d& a_center) { m_center = a_center; }
00083
00085 inline void setExtent(const cVector3d& a_extent) { m_extent = a_extent; }
00086
00088 inline void setValue(const cVector3d& a_min, const cVector3d& a_max)
00089 {
00090 m_extent = cMul(0.5, cSub(a_max, a_min));
00091 m_center = cAdd(a_min, m_extent);
00092 m_min = a_min;
00093 m_max = a_max;
00094 }
00095
00096
00097
00104
00105 inline bool contains(const cVector3d& a_p) const
00106 {
00107
00108 if (a_p.x > m_min.x && a_p.y > m_min.y && a_p.z > m_min.z &&
00109 a_p.x < m_max.x && a_p.y < m_max.y && a_p.z < m_max.z)
00110 return (true);
00111 else
00112 return false;
00113 }
00114
00115
00116
00125
00126 inline void enclose(const cCollisionAABBBox& a_boxA, const cCollisionAABBBox& a_boxB)
00127 {
00128
00129 cVector3d lower(cMin(a_boxA.getLowerX(), a_boxB.getLowerX()),
00130 cMin(a_boxA.getLowerY(), a_boxB.getLowerY()),
00131 cMin(a_boxA.getLowerZ(), a_boxB.getLowerZ()));
00132
00133
00134 cVector3d upper(cMax(a_boxA.getUpperX(), a_boxB.getUpperX()),
00135 cMax(a_boxA.getUpperY(), a_boxB.getUpperY()),
00136 cMax(a_boxA.getUpperZ(), a_boxB.getUpperZ()));
00137
00138
00139 setValue(lower, upper);
00140 }
00141
00142
00143
00150
00151 inline void enclose (const cVector3d& a_point)
00152 {
00153
00154 cVector3d lower(cMin(getLowerX(), a_point.x),
00155 cMin(getLowerY(), a_point.y),
00156 cMin(getLowerZ(), a_point.z));
00157
00158
00159 cVector3d upper(cMax(getUpperX(), a_point.x),
00160 cMax(getUpperY(), a_point.y),
00161 cMax(getUpperZ(), a_point.z));
00162
00163
00164 setValue(lower, upper);
00165 }
00166
00167
00169 inline void enclose(const cCollisionAABBBox& a_box) { enclose(*this, a_box); }
00170
00172 inline void setEmpty()
00173 {
00174 const double CHAI_INFINITY = 1.0e50;
00175 m_center.zero();
00176 m_extent = cVector3d(-CHAI_INFINITY, -CHAI_INFINITY, -CHAI_INFINITY);
00177 m_min.set(CHAI_INFINITY, CHAI_INFINITY, CHAI_INFINITY);
00178 m_max.set(-CHAI_INFINITY, -CHAI_INFINITY, -CHAI_INFINITY);
00179 }
00180
00182 inline double getLowerX() const { return (m_min.x); }
00183
00185 inline double getUpperX() const { return (m_max.x); }
00186
00188 inline double getLowerY() const { return (m_min.y); }
00189
00191 inline double getUpperY() const { return (m_max.y); }
00192
00194 inline double getLowerZ() const { return (m_min.z); }
00195
00197 inline double getUpperZ() const { return (m_max.z); }
00198
00200 double size() const;
00201
00202
00203
00210
00211 inline int longestAxis() const
00212 {
00213
00214 if ((m_extent.x >= m_extent.y) && (m_extent.x >= m_extent.z)) return 0;
00215 else if ((m_extent.y >= m_extent.x) && (m_extent.y >= m_extent.z)) return 1;
00216 return 2;
00217 }
00218
00220 inline void render()
00221 {
00222 cDrawWireBox(m_min.x, m_max.x, m_min.y, m_max.y, m_min.z, m_max.z);
00223 }
00224
00225
00226
00227
00228
00229
00231 cVector3d m_center;
00232
00234 cVector3d m_extent;
00235
00237 cVector3d m_min;
00238
00240 cVector3d m_max;
00241 };
00242
00243
00244 #endif
00245
00246