00001
00002 #ifndef __bounding_box_hpp__
00003 #define __bounding_box_hpp__
00004
00005 #include <crbn/basic/vec3.hpp>
00006 #include <crbn/basic/mat4.hpp>
00007
00008 struct bbox
00009 {
00010 vec3 min, max;
00011
00012 bbox() : min(1e38f), max(-1e38f) {}
00013 bbox(const vec3& a, const vec3& b) : min(a), max(b) {}
00014 bbox(const bbox& b) : min(b.min), max(b.max) {}
00015 };
00016
00017 inline bool inside( bbox& b, vec3& v ) {
00018 vec3& _min = b.min;
00019 vec3& _max = b.max;
00020 return ( (v.x > _min.x) && (v.y > _min.y) && (v.y > _min.y)
00021 &&
00022 (v.x < _max.x) && (v.y < _max.y) && (v.y < _max.y) );
00023 }
00024
00025
00026 inline void merge( bbox& a, bbox& b, bbox& c ) {
00027 vmin( a.min, b.min, c.min );
00028 vmax( a.max, b.max, c.max );
00029 }
00030
00031
00032 inline void merge( bbox& a, bbox& b ) {
00033 vmin( a.min, a.min, b.min );
00034 vmax( a.max, a.max, b.max );
00035 }
00036
00037
00038 inline void transform( bbox& a, bbox& b, mat4& m ) {
00039 vec3& mi = b.min;
00040 vec3& ma = b.max;
00041 vec3 am, aM;
00042 vec3 vec, va, vb;
00043
00044
00045 vec = vec3( mi.x, mi.y, mi.z );
00046 mmulp( va, m, vec );
00047
00048
00049 vec = vec3( mi.x, mi.y, ma.z );
00050 mmulp( vb, m, vec );
00051 vmin( am, va, vb );
00052 vmax( aM, va, vb );
00053
00054
00055 vec = vec3( mi.x, ma.y, mi.z );
00056 mmulp( va, m, vec );
00057 vmin( am, am, va );
00058 vmax( aM, aM, va );
00059
00060
00061 vec = vec3( mi.x, ma.y, ma.z );
00062 mmulp( va, m, vec );
00063 vmin( am, am, va );
00064 vmax( aM, aM, va );
00065
00066
00067 vec = vec3( ma.x, mi.y, mi.z );
00068 mmulp( va, m, vec );
00069 vmin( am, am, va );
00070 vmax( aM, aM, va );
00071
00072
00073 vec = vec3( ma.x, mi.y, ma.z );
00074 mmulp( va, m, vec );
00075 vmin( am, am, va );
00076 vmax( aM, aM, va );
00077
00078
00079 vec = vec3( ma.x, ma.y, mi.z );
00080 mmulp( va, m, vec );
00081 vmin( am, am, va );
00082 vmax( aM, aM, va );
00083
00084
00085 vec = vec3( ma.x, mi.y, ma.z );
00086 mmulp( va, m, vec );
00087 vmin( a.min, am, va );
00088 vmax( a.max, aM, va );
00089 }
00090
00091
00092 inline bool overlap(const bbox& a, const bbox& b) {
00093 return ( (a.min.x <= b.max.x) &&
00094 (a.min.y <= b.max.y) &&
00095 (a.min.z <= b.max.z) &&
00096 (b.min.x <= a.max.x) &&
00097 (b.min.y <= a.max.y) &&
00098 (b.min.z <= a.max.z) );
00099 }
00100
00101 #endif // __bounding_box_hpp__