1 /*************************************************************************
2  *                                                                       *
3  * Tokamak Physics Engine, Copyright (C) 2002-2007 David Lam.            *
4  * All rights reserved.  Email: david@tokamakphysics.com                 *
5  *                       Web: www.tokamakphysics.com                     *
6  *                                                                       *
7  * This library is distributed in the hope that it will be useful,       *
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
10  * LICENSE.TXT for more details.                                         *
11  *                                                                       *
12  *************************************************************************/
13 
14 #ifndef NE_SCENERY_H
15 #define NE_SCENERY_H
16 
17 class neTriangleTree;
18 
19 class neFixedTimeStepSimulator;
20 
21 /****************************************************************************
22 *
23 *	NE Physics Engine
24 *
25 *	Class: neTriangle_
26 *
27 *	Desc:
28 *
29 ****************************************************************************/
30 
31 class neTriangle_: public neTriangle
32 {
33 PLACEMENT_MAGIC
34 public:
35 //	void * operator new (size_t s, void * addr) {
36 //		return addr;
37 //	}
38 //	void operator delete (void *) {}
39 
40 };
41 
42 /****************************************************************************
43 *
44 *	NE Physics Engine
45 *
46 *	Class: neQuadTreeNode
47 *
48 *	Desc:
49 *
50 ****************************************************************************/
51 
52 //#define NE_TREE_DIM 2
53 
54 //#define NE_TREE_SECTOR_COUNT  (2 * 2)
55 
56 class neTreeNode
57 {
58 public:
59 	void Initialise(neTriangleTree * _tree, s32 _parent, const neV3 & minBound, const neV3 & maxBound);
60 
61 	void Build(neSimpleArray<s32> & triIndex, s32 level);
62 
63 	void CountTriangleInSector(neSimpleArray<s32> &tris, neSimpleArray<s32> &sectorTris, const neV3 & com, s32 i);
64 
65 	s32 CountTriangleInSector2(neSimpleArray<s32> &tris, const neV3 & com, s32 sector);
66 
67 	void MakeLeaf(neSimpleArray<s32> &tris);
68 
69 	bool IsOverlapped(const neV3 & minBound, const neV3 & maxBound);
70 
71 	void GetCandidateNodes(neSimpleArray<neTreeNode*> & nodes, const neV3 & minBound, const neV3 & maxBound, s32 level);
72 
73 	void SelectBound(const neV3 & com, neV3 & minBound, neV3 & maxBound, s32 sector);
74 
75 	void DrawTriangles();
76 
77 	void DrawBounds();
78 
79 public:
80 	static s32 numOfChildren;
81 
new(size_t t,void * addr)82 	void * operator new (size_t t, void * addr){
83 		return addr;
84 	}
85 	void operator delete [] (void *, void *){}
86 
delete(void *,void *)87 	void operator delete (void *, void *){}
88 
89 	neTreeNode();
90 
91 	neTriangleTree * tree;
92 
93 	s32 parent;
94 
95 	s32 children[4];
96 
97 	neV3 bounds[3];//min/max x,y,z
98 
99 	neSimpleArray<s32> triangleIndices; //leaf only
100 };
101 
102 /****************************************************************************
103 *
104 *	NE Physics Engine
105 *
106 *	Class: neTree
107 *
108 *	Desc:
109 *
110 ****************************************************************************/
111 
112 class neTriangleTree
113 {
114 public:
115 	neTriangleTree();
116 
117 	~neTriangleTree();
118 
119 	neBool BuildTree(neV3 * vertices, s32 vertexCount, neTriangle * tris, s32 triCount, neAllocatorAbstract * _alloc);
120 
121 	void FreeTree();
122 
GetRoot()123 	neTreeNode & GetRoot(){ return root;}
124 
HasTerrain()125 	bool HasTerrain() {return nodes.GetUsedCount() > 0;};
126 
127 	neTreeNode & GetNode(s32 nodeIndex);
128 
129 public:
130 	neV3 * vertices;
131 
132 	s32 vertexCount;
133 
134 	neArray<neTriangle_> triangles;
135 
136 	neArray<neTreeNode> nodes;
137 
138 	neAllocatorAbstract * alloc;
139 
140 	neAllocatorDefault allocDef;
141 
142 	neTreeNode root;
143 
144 	neFixedTimeStepSimulator * sim;
145 };
146 
147 #endif //NE_SCENERY_H
148