/*==LICENSE==* CyanWorlds.com Engine - MMOG client, server and tools Copyright (C) 2011 Cyan Worlds, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . You can contact Cyan Worlds, Inc. by email legal@cyan.com or by snail mail at: Cyan Worlds, Inc. 14617 N Newport Hwy Mead, WA 99021 *==LICENSE==*/ #ifndef plSpaceTreeMaker_inc #define plSpaceTreeMaker_inc #include "hsBounds.h" #include "hsTemplates.h" #include "hsBitVector.h" class hsRadixSortElem; class plSpaceTree; class plSpacePrepNode { public: hsBounds3Ext fWorldBounds; Int16 fIndex; Int16 fDataIndex; plSpacePrepNode* fChildren[2]; }; class plSpaceTreeMaker { protected: hsTArray fLeaves; // input hsRadixSortElem* fSortScratch; hsBitVector fDisabled; plSpacePrepNode* fPrepTree; Int16 fTreeSize; plSpacePrepNode* INewSubRoot(const hsBounds3Ext& bnd); void IFindBigList(hsTArray& nodes, hsScalar length, const hsVector3& axis, hsTArray& giants, hsTArray& strimp); void ISortList(hsTArray& nodes, const hsVector3& axis); void ISplitList(hsTArray& nodes, const hsVector3& axis, hsTArray& lower, hsTArray& upper); hsBounds3Ext IFindDistToCenterAxis(hsTArray& nodes, hsScalar& length, hsVector3& axis); plSpacePrepNode* IMakeFatTreeRecur(hsTArray& nodes); hsBounds3Ext IFindSplitAxis(hsTArray& nodes, hsScalar& length, hsVector3& axis); plSpacePrepNode* IMakeTreeRecur(hsTArray& nodes); void IMakeTree(); plSpaceTree* IMakeEmptyTree(); plSpaceTree* IMakeDegenerateTree(); void IGatherLeavesRecur(plSpacePrepNode* sub, plSpaceTree* tree); void IMakeSpaceTreeRecur(plSpacePrepNode* sub, plSpaceTree* tree, const int targetLevel, int currLevel); plSpaceTree* IMakeSpaceTree(); int ITreeDepth(plSpacePrepNode* subRoot); void IDeleteTreeRecur(plSpacePrepNode* node); public: void Cleanup(); void Reset(); Int32 AddLeaf(const hsBounds3Ext& worldBnd, hsBool disable=false); plSpaceTree* MakeTree(); void TestTree(); // development only - NUKE ME mf horse }; #endif // plSpaceTreeMaker_inc