aboutsummaryrefslogtreecommitdiff
path: root/tool_src/BspLib/ObjectBSPNode.h
blob: e5301fe277dfd5438fe7e7b5e70543787a38007e (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
//-----------------------------------------------------------------------------
//	BSPLIB HEADER: ObjectBSPNode.h
//
//  Copyright (c) 1997-1998 by Markus Hadwiger
//  All Rights Reserved.
//-----------------------------------------------------------------------------

#ifndef _OBJECTBSPNODE_H_
#define _OBJECTBSPNODE_H_

// bsplib header files
#include "BspLibDefs.h"
#include "BoundingBox.h"
#include "BspObject.h"
#include "Plane.h"


BSPLIB_NAMESPACE_BEGIN


// node of object bsp tree (a bsp tree of whole objects instead of polygons) --
//
class ObjectBSPNode {

public:
	ObjectBSPNode( ObjectBSPNode *front = NULL, ObjectBSPNode *back = NULL, Plane *sep = NULL, BoundingBox *bbox = NULL, int id = -1 );
	~ObjectBSPNode() { delete separatorplane; delete boundingbox; delete frontsubtree; delete backsubtree; }

	void			NumberBSPNodes( int& curno );
	void			WriteBSPTree( FILE *fp ) const;

	BspObject*		CreateObjectList();
	BspObject*		CreateMergedBSPTree();

	void			DeleteNodeBspObjects();

	int				getNodeNumber() const { return nodenumber; }
	Plane*			getSeparatorPlane() const { return separatorplane; }
	BoundingBox*	getBoundingBox() const { return boundingbox; }
	ObjectBSPNode*	getFrontSubtree() const { return frontsubtree; }
	ObjectBSPNode*	getBackSubtree() const { return backsubtree; }

private:
	void			MergeTreeNodeObjects( BspObject *newobject );
	BSPNode*		CreateUnifiedBSPTree();

private:
	int				nodenumber;		// this node's id
	Plane*			separatorplane;	// plane inducing two halfspaces; NULL for leaves
	BoundingBox*	boundingbox;	// attached bounding box; NULL for internal nodes
	ObjectBSPNode*	frontsubtree;	// tree in front halfspace
	ObjectBSPNode*	backsubtree;	// tree in back halfspace
};

// construct node -------------------------------------------------------------
inline ObjectBSPNode::ObjectBSPNode( ObjectBSPNode *front, ObjectBSPNode *back, Plane *sep, BoundingBox *bbox, int id )
{
	frontsubtree	= front;
	backsubtree		= back;
	separatorplane	= sep;
	boundingbox		= bbox;
	nodenumber		= id;
}


BSPLIB_NAMESPACE_END


#endif // _OBJECTBSPNODE_H_