00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "stdsound.h"
00027
00028 #include "bounding_box.h"
00029 #include "nel/misc/plane.h"
00030
00031 using namespace NLMISC;
00032
00033 namespace NLSOUND {
00034
00035
00036
00037
00038
00039 CBoundingBox::CBoundingBox() : _Rx(0.0f), _Ry(0.0f), _Rz(0.0f), _Center(CVector::Null)
00040 {
00041 }
00042
00043
00044
00045
00046
00047 bool CBoundingBox::include( const CVector& pos ) const
00048 {
00049 if ( pos.x < _Center.x - _Rx ) return false;
00050 if ( pos.x > _Center.x + _Rx ) return false;
00051 if ( pos.y < _Center.y - _Ry ) return false;
00052 if ( pos.y > _Center.y + _Ry ) return false;
00053 if ( pos.z < _Center.z - _Rz ) return false;
00054 if ( pos.z > _Center.z + _Rz ) return false;
00055 return true;
00056 }
00057
00058
00059
00060
00061
00062 float CBoundingBox::getDiameter() const
00063 {
00064
00065 return (_Rx+_Ry+_Rz) / 1.5f;
00066 }
00067
00068
00069
00070
00071
00072 float CBoundingBox::getRadiusAtIntersect( const NLMISC::CVector& pos ) const
00073 {
00074 return 0.0f;
00075 }
00076
00077
00078
00079
00080
00081 CVector CBoundingBox::getIntersectWithLine( const NLMISC::CVector& c, const NLMISC::CVector& p ) const
00082 {
00083
00084 CPlane pl[6];
00085 CVector ppos = _Center;
00086 ppos.x = _Center.x + _Rx;
00087 pl[0].make( CVector::I, ppos );
00088 ppos.x = _Center.x - _Rx;
00089 pl[1].make( -CVector::I, ppos );
00090 ppos.x = _Center.x;
00091 ppos.y = _Center.y + _Ry;
00092 pl[2].make( CVector::J, ppos );
00093 ppos.y = _Center.y - _Ry;
00094 pl[3].make( -CVector::J, ppos );
00095 ppos.y = _Center.y;
00096 ppos.z = _Center.z + _Rz;
00097 pl[4].make( CVector::K, ppos );
00098 ppos.z = _Center.z - _Rz;
00099 pl[5].make( -CVector::K, ppos );
00100
00101
00102 CVector v = (p-c).normed();
00103 v *= std::max( std::max( _Rx, _Ry ), _Rz ) * 10.0f;
00104 CVector pfar = c + v;
00105
00106
00107 CVector center = c;
00108 uint i;
00109 for ( i=0; i!=6; ++i )
00110 {
00111 pl[i].clipSegmentBack( center, pfar );
00112 }
00113
00114 return pfar;
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124 float CBoundingBox::getRatio( const NLMISC::CVector& pos, IBoundingShape *inner ) const
00125 {
00126
00127
00128
00129
00130
00131
00132
00133 CVector posa = inner->getIntersectWithLine( inner->getCenter(), pos );
00134
00135
00136 CVector posb = getIntersectWithLine( inner->getCenter(), pos );
00137
00138
00139 float ab = (posa-posb).norm();
00140 if ( ab != 0 )
00141 {
00142 float pb = (pos-posb).norm();
00143 return pb / ab;
00144 }
00145 else
00146 {
00147 return 1.0f;
00148 }
00149 }
00150
00151
00152
00153
00154
00155 void CBoundingBox::getCorners( NLMISC::CVector& c1, NLMISC::CVector& c2 )
00156 {
00157 c1.x = _Center.x - _Rx;
00158 c1.y = _Center.y - _Ry;
00159 c1.z = _Center.z - _Rz;
00160 c2.x = _Center.x + _Rx;
00161 c2.y = _Center.y + _Ry;
00162 c2.z = _Center.z + _Rz;
00163 }
00164
00165
00166
00167
00168 void CBoundingBox::setCorners( const NLMISC::CVector& c1, const NLMISC::CVector& c2 )
00169 {
00170 _Center.x = (c1.x+c2.x)/2.0f;
00171 _Center.y = (c1.y+c2.y)/2.0f;
00172 _Center.z = (c1.z+c2.z)/2.0f;
00173 _Rx = (c2.x-c1.x)/2.0f;
00174 _Ry = (c2.y-c1.y)/2.0f;
00175 _Rz = (c2.z-c1.z)/2.0f;
00176 }
00177
00178
00179 }