00001 #include <esg/spacesorting/OctTree.h> 00002 00003 using namespace esg; 00004 00005 void OctTree::_append(SceneGraphObject*, Node*) 00006 { 00007 cerr << "OctTree::_append(): Not implemented" << endl; 00008 } 00009 00010 SceneGraphObject* OctTree::_detach(Node* pNode) 00011 { 00012 cerr << "OctTree::_detach(): Not implemented" << endl; 00013 return NULL; 00014 } 00015 00016 void OctTree::_build_tree(Node* pNode) 00017 { 00018 cerr << "OctTree::_build_tree(): Not implemented" << endl; 00019 } 00020 00021 void OctTree::_rebuild_tree(Node* pNode) 00022 { 00023 cerr << "OctTree::_rebuild_tree(): Not implemented" << endl; 00024 } 00025 00026 void OctTree::_destroy_tree(Node* pNode) 00027 { 00028 pNode->objectList.dropAll(); 00029 if (pNode->isInner()) { 00030 for (register int i = 0; i < 8; i++) { 00031 _destroy_tree(pNode->children[i]); 00032 delete pNode->children[i]; 00033 } 00034 delete [] pNode->children; 00035 pNode->children = NULL; 00036 } 00037 } 00038 00039 00040 //------- public -------- 00041 00042 OctTree::OctTree(bool delay, unsigned sideLength) 00043 : SDS(false), _sideLength(sideLength) 00044 { 00045 if (delay) { 00046 cerr << "OctTree::OctTree(): Delay of build is not implemented." << endl; 00047 cerr << " Switching to online insertion." << endl; 00048 } 00049 } 00050 00051 SDS* OctTree::clone() const 00052 { 00053 OctTree* ret = new OctTree(); 00054 ret->_duplicate_attributes(*this); 00055 return ret; 00056 } 00057 00058 Iterator* OctTree::createIterator() 00059 { 00060 return (Iterator*) new IteratorOctTree(this); 00061 } 00062 00063 InspectorSDS* BVH::createInspector(unsigned level) 00064 { 00065 return new InspectorOctTree(this, level); 00066 } 00067 00068 int OctTree::append(SceneGraphObject* obj) 00069 { 00070 if (!obj) return 0; 00071 00072 if (!obj->tangible()) { 00073 _intangibleChildren.append(obj); 00074 return 1; 00075 } 00076 00077 if (_delayBuild) _root.objectList.append(obj); 00078 else _append(obj, &_root); 00079 00080 return 1; 00081 } 00082 00083 SceneGraphObject* OctTree::detach(SceneGraphObject::OID oid) 00084 { 00085 return _detach(oid, &_root); 00086 } 00087 00088 bool OctTree::update() 00089 { 00090 if (_delayBuild) return false; 00091 _rebuild_tree(&_root); 00092 return true; 00093 } 00094 00095 bool OctTree::build() 00096 { 00097 if (!_delayBuild) return false; 00098 if (_root.empty()) return false; 00099 _build_tree(&_root); 00100 _delayBuild = false; 00101 return true; 00102 }