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> §orTris, 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