diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2026-08-24 11:16:07 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2026-08-24 11:16:07 +0200 |
| commit | c068f22329d5cc722622a2183bbb22eef2093df7 (patch) | |
| tree | 12d56c1aede67988a55e241364606bfbb4dba933 /tool_src/BspLib/BSPTree.h | |
| download | openparsec-c068f22329d5cc722622a2183bbb22eef2093df7.tar.xz openparsec-c068f22329d5cc722622a2183bbb22eef2093df7.zip | |
Diffstat (limited to 'tool_src/BspLib/BSPTree.h')
| -rw-r--r-- | tool_src/BspLib/BSPTree.h | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/tool_src/BspLib/BSPTree.h b/tool_src/BspLib/BSPTree.h new file mode 100644 index 0000000..b96a93c --- /dev/null +++ b/tool_src/BspLib/BSPTree.h @@ -0,0 +1,182 @@ +//----------------------------------------------------------------------------- +// BSPLIB HEADER: BSPTree.h +// +// Copyright (c) 1997-1998 by Markus Hadwiger +// All Rights Reserved. +//----------------------------------------------------------------------------- + +#ifndef _BSPTREE_H_ +#define _BSPTREE_H_ + +// bsplib header files +#include "BspLibDefs.h" +#include "BSPNode.h" + + +BSPLIB_NAMESPACE_BEGIN + + +// bsp tree; basically pointer to root node (representation class) ------------ +// +class BSPTreeRep { + + friend class BSPTree; + +private: + BSPTreeRep() : ref_count( 0 ) { root = NULL; } + ~BSPTreeRep() { delete root; } + + BSPNode* InitTree( BSPNode *rootnode ); + BSPNode* getRoot() { return root; } + + void InvalidateTree(); + + int TreeEmpty() const { return ( root == NULL ); } + +private: + int ref_count; + BSPNode* root; +}; + +// init with entire tree of BSPNode objects ----------------------------------- +inline BSPNode *BSPTreeRep::InitTree( BSPNode *rootnode ) +{ + delete root; + return ( root = rootnode ); +} + +// set root to null without deleting tree first ------------------------------- +inline void BSPTreeRep::InvalidateTree() +{ + root = NULL; +} + + +// bsp tree; basically pointer to root node (handle class) -------------------- +// +class BSPTree { + +public: + BSPTree() { rep = new BSPTreeRep; rep->ref_count = 1; } + ~BSPTree() { if ( --rep->ref_count == 0 ) delete rep; } + + BSPTree( const BSPTree& copyobj ); + BSPTree& operator =( const BSPTree& copyobj ); + + // pass most operations through to BSPNode + BSPNode* operator->() { return rep->getRoot(); } + + BSPNode* InitTree( BSPNode *rootnode ) { return rep->InitTree( rootnode ); } + BSPNode* getRoot() { return rep->getRoot(); } + + void InvalidateTree() { rep->InvalidateTree(); } + + int TreeEmpty() const { return rep->TreeEmpty(); } + +private: + BSPTreeRep* rep; +}; + +// copy constructor ----------------------------------------------------------- +inline BSPTree::BSPTree( const BSPTree& copyobj ) +{ + rep = copyobj.rep; + rep->ref_count++; +} + +// assignment operator -------------------------------------------------------- +inline BSPTree& BSPTree::operator =( const BSPTree& copyobj ) +{ + if ( ©obj != this ) { + if ( --rep->ref_count == 0 ) { + delete rep; + } + rep = copyobj.rep; + rep->ref_count++; + } + return *this; +} + + +// flat bsp tree; basically pointer to array (representation class) ----------- +// +class BSPTreeFlatRep { + + friend class BSPTreeFlat; + +private: + BSPTreeFlatRep() : ref_count( 0 ) { root = NULL; numnodes = 0; nodestorage = 0; } + ~BSPTreeFlatRep() { delete[] root; } + + BSPNodeFlat* AppendNode( int front, int back, Polygon *poly, int clist, int blist ); + BSPNodeFlat* FetchNodePerId( int id ); + BSPNode* BuildBSPTree( int nodenum ); + BSPNodeFlat* getRoot() { return root; } + + int TreeEmpty() const { return ( root == NULL ); } + int getNumNodes() const { return numnodes; } + + void ApplyScaleFactor( double sfac ); + void DestroyTree() { delete[] root; root = NULL; numnodes = 0; nodestorage = 0; } + +private: + int ref_count; + int numnodes; + int nodestorage; + BSPNodeFlat* root; +}; + + +// flat bsp tree; basically pointer to array (handle class) ------------------- +// +class BSPTreeFlat { + +public: + BSPTreeFlat() { rep = new BSPTreeFlatRep; rep->ref_count = 1; } + ~BSPTreeFlat() { if ( --rep->ref_count == 0 ) delete rep; } + + BSPTreeFlat( const BSPTreeFlat& copyobj ); + BSPTreeFlat& operator =( const BSPTreeFlat& copyobj ); + + BSPNodeFlat* AppendNode( int front, int back, Polygon *poly, int clist, int blist ) + { return rep->AppendNode( front, back, poly, clist, blist ); } + BSPNodeFlat* FetchNodePerId( int id ) { return rep->FetchNodePerId( id ); } + BSPNode* BuildBSPTree( int nodenum ) { return rep->BuildBSPTree( nodenum ); } + BSPNodeFlat* getRoot() { return rep->getRoot(); } + + int TreeEmpty() const { return rep->TreeEmpty(); } + int getNumNodes() const { return rep->getNumNodes(); } + + void ApplyScaleFactor( double sfac ) { rep->ApplyScaleFactor( sfac ); } + void DestroyTree() { rep->DestroyTree(); } + +private: + BSPTreeFlatRep* rep; +}; + +// copy constructor ----------------------------------------------------------- +inline BSPTreeFlat::BSPTreeFlat( const BSPTreeFlat& copyobj ) +{ + rep = copyobj.rep; + rep->ref_count++; +} + +// assignment operator -------------------------------------------------------- +inline BSPTreeFlat& BSPTreeFlat::operator =( const BSPTreeFlat& copyobj ) +{ + if ( ©obj != this ) { + if ( --rep->ref_count == 0 ) { + delete rep; + } + rep = copyobj.rep; + rep->ref_count++; + } + return *this; +} + + +BSPLIB_NAMESPACE_END + + +#endif // _BSPTREE_H_ + |
