aboutsummaryrefslogtreecommitdiff
path: root/tool_src/BspLib/ObjectBSPTree.h
blob: 5d505bc3422e156c99ce183b4b4ed9e7c6f9d527 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//-----------------------------------------------------------------------------
//	BSPLIB HEADER: ObjectBSPTree.h
//
//  Copyright (c) 1997-1998 by Markus Hadwiger
//  All Rights Reserved.
//-----------------------------------------------------------------------------

#ifndef _OBJECTBSPTREE_H_
#define _OBJECTBSPTREE_H_

// bsplib header files
#include "BspLibDefs.h"
#include "ObjectBSPNode.h"


BSPLIB_NAMESPACE_BEGIN


// bsp tree of objects; basically pointer to root node (representation class) -
//
class ObjectBSPTreeRep {

	friend class ObjectBSPTree;

private:
	ObjectBSPTreeRep() : ref_count( 0 ) { root = NULL; }
	~ObjectBSPTreeRep() { delete root; }

	void			KillTree() { delete root; root = NULL; }
	ObjectBSPNode*	InitTree( ObjectBSPNode *rootnode );
	ObjectBSPNode*	getRoot() { return root; }

	int				TreeEmpty() const { return ( root == NULL ); }

private:
	int				ref_count;
	ObjectBSPNode*	root;
};

// init with entire tree of ObjectBSPNode objects -----------------------------
inline ObjectBSPNode *ObjectBSPTreeRep::InitTree( ObjectBSPNode *rootnode )
{
	delete root;
	return ( root = rootnode );
}


// bsp tree of objects; basically pointer to root node (handle class) ---------
//
class ObjectBSPTree {

public:
	ObjectBSPTree() { rep = new ObjectBSPTreeRep; rep->ref_count = 1; }
	~ObjectBSPTree() { if ( --rep->ref_count == 0 ) delete rep; }

	ObjectBSPTree( const ObjectBSPTree& copyobj );
	ObjectBSPTree& operator =( const ObjectBSPTree& copyobj );

	// pass most operations through to ObjectBSPNode
	ObjectBSPNode*	operator->() { return rep->getRoot(); }

	void			KillTree() { rep->KillTree(); }
	ObjectBSPNode*	InitTree( ObjectBSPNode *rootnode ) { return rep->InitTree( rootnode ); }
	ObjectBSPNode*	getRoot() { return rep->getRoot(); }

	int				TreeEmpty() const { return rep->TreeEmpty(); }

private:
	ObjectBSPTreeRep* rep;
};

// copy constructor -----------------------------------------------------------
inline ObjectBSPTree::ObjectBSPTree( const ObjectBSPTree& copyobj )
{
	rep = copyobj.rep;
	rep->ref_count++;
}

// assignment operator --------------------------------------------------------
inline ObjectBSPTree& ObjectBSPTree::operator =( const ObjectBSPTree& copyobj )
{
	if ( &copyobj != this ) {
		if ( --rep->ref_count == 0 ) {
			delete rep;
		}
		rep = copyobj.rep;
		rep->ref_count++;
	}
	return *this;
}


BSPLIB_NAMESPACE_END


#endif // _OBJECTBSPTREE_H_