00001
00002
00003 #include "AABB.h"
00004
00005 #include "Renderer.h"
00006
00007
00008 namespace pge {
00009
00010
00011
00012
00013
00014
00015
00016 AABB::AABB(void) {
00017 m_minX = 0.0f;
00018 m_minY = 0.0f;
00019 m_minZ = 0.0f;
00020 m_maxX = 0.0f;
00021 m_maxY = 0.0f;
00022 m_maxZ = 0.0f;
00023 }
00024
00025
00026
00027
00028
00029
00030
00031 AABB::AABB(float minX, float minY, float minZ, float maxX, float maxY, float maxZ) {
00032 m_minX = minX;
00033 m_minY = minY;
00034 m_minZ = minZ;
00035 m_maxX = maxX;
00036 m_maxY = maxY;
00037 m_maxZ = maxZ;
00038 }
00039
00040
00041
00042
00043
00044
00045
00046 AABB::AABB(const AABB ©) {
00047 m_minX = copy.m_minX;
00048 m_minY = copy.m_minY;
00049 m_minZ = copy.m_minZ;
00050 m_maxX = copy.m_maxX;
00051 m_maxY = copy.m_maxY;
00052 m_maxZ = copy.m_maxZ;
00053 }
00054
00055
00056
00057
00058
00059
00060
00061 AABB::~AABB(void) {
00062 }
00063
00064
00065
00066
00067
00068
00069
00070 bool AABB::isAABBCompletelyInside(AABB *boundingBox) {
00071 if(!isPointInside(boundingBox->m_minX, boundingBox->m_minY, boundingBox->m_minZ)) {
00072 return false;
00073 }
00074 if(!isPointInside(boundingBox->m_maxX, boundingBox->m_minY, boundingBox->m_minZ)) {
00075 return false;
00076 }
00077 if(!isPointInside(boundingBox->m_minX, boundingBox->m_maxY, boundingBox->m_minZ)) {
00078 return false;
00079 }
00080 if(!isPointInside(boundingBox->m_maxX, boundingBox->m_maxY, boundingBox->m_minZ)) {
00081 return false;
00082 }
00083 if(!isPointInside(boundingBox->m_minX, boundingBox->m_minY, boundingBox->m_maxZ)) {
00084 return false;
00085 }
00086 if(!isPointInside(boundingBox->m_maxX, boundingBox->m_minY, boundingBox->m_maxZ)) {
00087 return false;
00088 }
00089 if(!isPointInside(boundingBox->m_minX, boundingBox->m_maxY, boundingBox->m_maxZ)) {
00090 return false;
00091 }
00092 if(!isPointInside(boundingBox->m_maxX, boundingBox->m_maxY, boundingBox->m_maxZ)) {
00093 return false;
00094 }
00095 return true;
00096 }
00097
00098
00099
00100
00101
00102
00103
00104 bool AABB::isAABBInsideOrOverlapping(AABB *boundingBox) {
00105 if(isPointInside(boundingBox->m_minX, boundingBox->m_minY, boundingBox->m_minZ)) {
00106 return true;
00107 }
00108 if(isPointInside(boundingBox->m_maxX, boundingBox->m_minY, boundingBox->m_minZ)) {
00109 return true;
00110 }
00111 if(isPointInside(boundingBox->m_minX, boundingBox->m_maxY, boundingBox->m_minZ)) {
00112 return true;
00113 }
00114 if(isPointInside(boundingBox->m_maxX, boundingBox->m_maxY, boundingBox->m_minZ)) {
00115 return true;
00116 }
00117 if(isPointInside(boundingBox->m_minX, boundingBox->m_minY, boundingBox->m_maxZ)) {
00118 return true;
00119 }
00120 if(isPointInside(boundingBox->m_maxX, boundingBox->m_minY, boundingBox->m_maxZ)) {
00121 return true;
00122 }
00123 if(isPointInside(boundingBox->m_minX, boundingBox->m_maxY, boundingBox->m_maxZ)) {
00124 return true;
00125 }
00126 if(isPointInside(boundingBox->m_maxX, boundingBox->m_maxY, boundingBox->m_maxZ)) {
00127 return true;
00128 }
00129 return false;
00130 }
00131
00132
00133
00134
00135
00136
00137
00138 bool AABB::isPointInside(const Vector3f &point) {
00139 return isPointInside(point.m_v[0], point.m_v[1], point.m_v[2]);
00140 }
00141
00142
00143
00144
00145
00146
00147
00148 bool AABB::isPointInside(float x, float y, float z) {
00149 if (x >= m_minX && x <= m_maxX && y >= m_minY && y <= m_maxY && z >= m_minZ && z <= m_maxZ) {
00150 return true;
00151 }
00152 return false;
00153 }
00154
00155
00156
00157
00158
00159
00160
00161 Vector3f AABB::getCenter(void) {
00162 Vector3f center = Vector3f((m_maxX + m_minX) / 2.0f, (m_maxY + m_minY) / 2.0f, (m_maxZ + m_minZ) / 2.0f);
00163 return center;
00164 }
00165
00166
00167
00168
00169
00170
00171
00172 Vector3f AABB::getBottomCenter(void) {
00173 Vector3f center = Vector3f((m_maxX + m_minX) / 2.0f, m_minY, (m_maxZ + m_minZ) / 2.0f);
00174 return center;
00175 }
00176
00177
00178
00179
00180
00181
00182
00183 void AABB::renderSolid(Vector3f color) {
00184 renderer::color3f(color);
00185 glDisable(GL_TEXTURE_2D);
00186
00187 glBegin(GL_QUADS);
00188
00189 renderer::vertex3f(m_minX, m_minY, m_minZ);
00190 renderer::vertex3f(m_maxX, m_minY, m_minZ);
00191 renderer::vertex3f(m_maxX, m_maxY, m_minZ);
00192 renderer::vertex3f(m_minX, m_maxY, m_minZ);
00193
00194
00195 renderer::vertex3f(m_minX, m_minY, m_maxZ);
00196 renderer::vertex3f(m_maxX, m_minY, m_maxZ);
00197 renderer::vertex3f(m_maxX, m_maxY, m_maxZ);
00198 renderer::vertex3f(m_minX, m_maxY, m_maxZ);
00199
00200
00201 renderer::vertex3f(m_minX, m_maxY, m_minZ);
00202 renderer::vertex3f(m_maxX, m_maxY, m_minZ);
00203 renderer::vertex3f(m_maxX, m_maxY, m_maxZ);
00204 renderer::vertex3f(m_minX, m_maxY, m_maxZ);
00205
00206
00207 renderer::vertex3f(m_minX, m_minY, m_minZ);
00208 renderer::vertex3f(m_maxX, m_minY, m_minZ);
00209 renderer::vertex3f(m_maxX, m_minY, m_maxZ);
00210 renderer::vertex3f(m_minX, m_minY, m_maxZ);
00211
00212
00213 renderer::vertex3f(m_minX, m_minY, m_maxZ);
00214 renderer::vertex3f(m_minX, m_minY, m_minZ);
00215 renderer::vertex3f(m_minX, m_maxY, m_minZ);
00216 renderer::vertex3f(m_minX, m_maxY, m_maxZ);
00217
00218
00219 renderer::vertex3f(m_maxX, m_minY, m_minZ);
00220 renderer::vertex3f(m_maxX, m_minY, m_maxZ);
00221 renderer::vertex3f(m_maxX, m_maxY, m_maxZ);
00222 renderer::vertex3f(m_maxX, m_maxY, m_minZ);
00223 glEnd();
00224 }
00225
00226
00227
00228
00229
00230
00231
00232 void AABB::renderWireframe(Vector3f color) {
00233 renderer::color3f(color);
00234 glDisable(GL_TEXTURE_2D);
00235
00236 glBegin(GL_LINES);
00237
00238 renderer::vertex3f(m_minX, m_minY, m_minZ);
00239 renderer::vertex3f(m_maxX, m_minY, m_minZ);
00240 renderer::vertex3f(m_maxX, m_maxY, m_minZ);
00241 renderer::vertex3f(m_minX, m_maxY, m_minZ);
00242
00243
00244 renderer::vertex3f(m_minX, m_minY, m_maxZ);
00245 renderer::vertex3f(m_maxX, m_minY, m_maxZ);
00246 renderer::vertex3f(m_maxX, m_maxY, m_maxZ);
00247 renderer::vertex3f(m_minX, m_maxY, m_maxZ);
00248
00249
00250 renderer::vertex3f(m_minX, m_minY, m_maxZ);
00251 renderer::vertex3f(m_minX, m_maxY, m_maxZ);
00252 renderer::vertex3f(m_minX, m_minY, m_minZ);
00253 renderer::vertex3f(m_minX, m_maxY, m_minZ);
00254 renderer::vertex3f(m_minX, m_minY, m_maxZ);
00255 renderer::vertex3f(m_minX, m_minY, m_minZ);
00256 renderer::vertex3f(m_minX, m_maxY, m_minZ);
00257 renderer::vertex3f(m_minX, m_maxY, m_maxZ);
00258
00259
00260 renderer::vertex3f(m_maxX, m_minY, m_maxZ);
00261 renderer::vertex3f(m_maxX, m_maxY, m_maxZ);
00262 renderer::vertex3f(m_maxX, m_minY, m_minZ);
00263 renderer::vertex3f(m_maxX, m_maxY, m_minZ);
00264 renderer::vertex3f(m_maxX, m_minY, m_maxZ);
00265 renderer::vertex3f(m_maxX, m_minY, m_minZ);
00266 renderer::vertex3f(m_maxX, m_maxY, m_minZ);
00267 renderer::vertex3f(m_maxX, m_maxY, m_maxZ);
00268 glEnd();
00269 }
00270 };