FDHTree.cc

Go to the documentation of this file.
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 //---------- public -------------
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 

Generated on Wed Jun 28 12:24:30 2006 for esg by  doxygen 1.4.6