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 ( ©obj != this ) {
if ( --rep->ref_count == 0 ) {
delete rep;
}
rep = copyobj.rep;
rep->ref_count++;
}
return *this;
}
BSPLIB_NAMESPACE_END
#endif // _OBJECTBSPTREE_H_
|