00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef FXRANGEF_H
00025 #define FXRANGEF_H
00026
00027
00028 namespace FX {
00029
00030
00031 class FXSpheref;
00032
00033
00035 class FXAPI FXRangef {
00036 public:
00037 FXVec3f lower;
00038 FXVec3f upper;
00039 public:
00040
00042 FXRangef(){}
00043
00045 FXRangef(const FXRangef& bounds):lower(bounds.lower),upper(bounds.upper){}
00046
00048 FXRangef(const FXVec3f& lo,const FXVec3f& hi):lower(lo),upper(hi){}
00049
00051 FXRangef(FXfloat xlo,FXfloat xhi,FXfloat ylo,FXfloat yhi,FXfloat zlo,FXfloat zhi):lower(xlo,ylo,zlo),upper(xhi,yhi,zhi){}
00052
00054 FXRangef(const FXSpheref& sphere);
00055
00057 FXRangef& operator=(const FXRangef& bounds){ lower=bounds.lower; upper=bounds.upper; return *this; }
00058
00060 FXRangef& set(const FXRangef& bounds){ lower=bounds.lower; upper=bounds.upper; return *this; }
00061
00063 FXRangef& set(const FXVec3f& lo,const FXVec3f& hi){ lower=lo; upper=hi; return *this; }
00064
00066 FXRangef& set(FXfloat xlo,FXfloat xhi,FXfloat ylo,FXfloat yhi,FXfloat zlo,FXfloat zhi){ lower.set(xlo,ylo,zlo); upper.set(xhi,yhi,zhi); return *this; }
00067
00069 FXVec3f& operator[](FXint i){ return (&lower)[i]; }
00070
00072 const FXVec3f& operator[](FXint i) const { return (&lower)[i]; }
00073
00075 bool operator==(const FXRangef& r) const { return lower==r.lower && upper==r.upper; }
00076 bool operator!=(const FXRangef& r) const { return lower!=r.lower || upper!=r.upper; }
00077
00079 FXfloat width() const { return upper.x-lower.x; }
00080
00082 FXfloat height() const { return upper.y-lower.y; }
00083
00085 FXfloat depth() const { return upper.z-lower.z; }
00086
00088 FXfloat longest() const;
00089
00091 FXfloat shortest() const;
00092
00094 FXfloat diameter() const;
00095
00097 FXfloat radius() const;
00098
00100 FXVec3f diagonal() const;
00101
00103 FXVec3f center() const;
00104
00106 bool empty() const;
00107
00109 bool contains(FXfloat x,FXfloat y,FXfloat z) const;
00110
00112 bool contains(const FXVec3f& p) const;
00113
00115 bool contains(const FXRangef& bounds) const;
00116
00118 bool contains(const FXSpheref& sphere) const;
00119
00121 FXRangef& include(FXfloat x,FXfloat y,FXfloat z);
00122
00124 FXRangef& include(const FXVec3f& v);
00125
00127 FXRangef& include(const FXRangef& box);
00128
00130 FXRangef& include(const FXSpheref& sphere);
00131
00133 FXint intersect(const FXVec4f& plane) const;
00134
00136 bool intersect(const FXVec3f& u,const FXVec3f& v);
00137
00139 friend FXAPI bool overlap(const FXRangef& a,const FXRangef& b);
00140
00142 FXVec3f corner(FXint c) const { return FXVec3f((&lower)[c&1].x,(&lower)[(c>>1)&1].y,(&lower)[c>>2].z); }
00143
00145 friend FXAPI FXRangef unite(const FXRangef& a,const FXRangef& b);
00146
00148 friend FXAPI FXRangef intersect(const FXRangef& a,const FXRangef& b);
00149
00151 friend FXAPI FXStream& operator<<(FXStream& store,const FXRangef& bounds);
00152
00154 friend FXAPI FXStream& operator>>(FXStream& store,FXRangef& bounds);
00155 };
00156
00157
00158 extern FXAPI bool overlap(const FXRangef& a,const FXRangef& b);
00159
00160 extern FXAPI FXRangef unite(const FXRangef& a,const FXRangef& b);
00161 extern FXAPI FXRangef intersect(const FXRangef& a,const FXRangef& b);
00162
00163 extern FXAPI FXStream& operator<<(FXStream& store,const FXRangef& bounds);
00164 extern FXAPI FXStream& operator>>(FXStream& store,FXRangef& bounds);
00165
00166 }
00167
00168 #endif
00169