include/crbn/basic/bbox.hpp

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 // a = b U c
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 // a = a U b
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 // a = b * m
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     // 1
00045     vec = vec3( mi.x, mi.y, mi.z );
00046     mmulp( va, m, vec );
00047 
00048     // 2
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     // 3
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     // 4
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     // 5
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     // 6
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     // 7
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     // 8
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 // Are the two boxes overlapping ?
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__

Generated on Tue Nov 14 15:40:08 2006 for libcrbn by  doxygen 1.5.0