00001 #include <esg/spacesorting/FDHTree.h>
00002 #include <esg/explorer/NExtentsExplorer.h>
00003 #include <esg/geometry/BVList.h>
00004
00005 using namespace esg;
00006
00007 bool FDHTree::_enlarge_bv(Geometry** dst, Geometry& src)
00008 {
00009 if (!(*dst)) { *dst = (Geometry*) src.clone(); return true; }
00010
00011 Interval interval1;
00012 Interval interval2;
00013 bool enlarged = false;
00014 #if defined(_MSC_VER)
00015 float *fdhVals = new float [_dirs*2];
00016 #else
00017 float fdhVals [_dirs*2];
00018 #endif
00019
00020 for (register unsigned i = 0; i < _dirs; i++) {
00021 Vector3 v(_fdhMat[i][0], _fdhMat[i][1], _fdhMat[i][2]);
00022
00023 interval1 = (*dst)->extent(v);
00024 interval2 = src.extent(v);
00025
00026 if (interval1.max >= interval2.max) fdhVals[i] = interval1.max;
00027 else { fdhVals[i] = interval2.max; enlarged = true; }
00028 if (interval1.min <= interval2.min) fdhVals[i+_dirs] = -interval1.min;
00029 else { fdhVals[i+_dirs] = -interval2.min; enlarged = true; }
00030 }
00031
00032 if (enlarged) {
00033 delete *dst;
00034 *dst = _create_bv(fdhVals, _dirs);
00035 }
00036
00037 #if defined(_MSC_VER)
00038 delete [] fdhVals;
00039 #endif
00040
00041 return enlarged;
00042 }
00043
00044 Geometry* FDHTree::_create_bv(List<SceneGraphObject>& list)
00045 {
00046 return (Geometry*) new FDH(_dirs, _fdhMat, list);
00047 }
00048
00049 Geometry* FDHTree::_create_bv(Geometry& bv1, Geometry& bv2)
00050 {
00051 return (Geometry*) new FDH(_dirs, _fdhMat, bv1, bv2);
00052 }
00053
00054 Geometry* FDHTree::_create_bv(SceneGraphObject& obj)
00055 {
00056 return (Geometry*) new FDH(_dirs, _fdhMat, obj);
00057 }
00058
00059 Geometry* FDHTree::_create_bv(const float* fdhVal, unsigned dirs)
00060 {
00061 return (Geometry*) new FDH(dirs, _fdhMat, fdhVal);
00062 }
00063
00064 BVList* FDHTree::_create_list()
00065 {
00066 return new BVList(_dirs, _fdhMat);
00067 }
00068
00069 void FDHTree::_duplicate_attributes(const SDS& src)
00070 {
00071 BVH::_duplicate_attributes(src);
00072 }
00073
00074
00075
00076 FDHTree::FDHTree(unsigned ll,
00077 unsigned dl,
00078 const float (*m)[3],
00079 const unsigned d,
00080 bool delayBuild,
00081 BVList::SplitStrategy ss)
00082 : BVH(ll,dl,delayBuild,ss), _dirs(d), _fdhMat(m)
00083 {
00084 }
00085
00086 SDS* FDHTree::clone() const
00087 {
00088 FDHTree* ret = new FDHTree(_dirs, _fdhMat);
00089 ret->_duplicate_attributes(*this);
00090 return ret;
00091 }
00092
00093