![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /******************************************************************************* 00002 ** Copyright (c) 2008 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 *******************************************************************************/ 00005 /******************************************************************************* 00006 ** $RCSfile: spatialSubdivisionTerrainIntersector.h,v $ $Revision: 1.3 $ $State: Exp $ 00007 *******************************************************************************/ 00008 00011 00012 #ifndef spatialSubdivisionTerrainIntersector_h 00013 #define spatialSubdivisionTerrainIntersector_h 00014 00015 #include "gdb/terrainIntersector.h" 00016 #include "geometry/spatialSubdivision.h" 00017 00018 #include "gdb/gdbNode.h" 00019 00020 // Enable this to test the spatial subdivision against the spatial index 00021 // Causes a significant performance hit 00022 #define TEST_SPATIAL_SUBDIVISION 0 00023 00024 #if TEST_SPATIAL_SUBDIVISION 00025 class DtSpatialIndex; 00026 #endif 00027 00028 class DtSpatialSubdivisionTerrainIntersectorDescriptor; 00029 00030 // An intersector for DtTerrainDatabase class. 00031 // Uses the spatial subdivision methodology for providing fast terrain 00032 // intersections 00033 00034 // This is the descriptor class that will set up some basic information for the spatial 00035 // subdivision 00036 00037 class DT_DLL_gdb DtSpatialSubdivisionTerrainIntersector : public DtTerrainIntersector 00038 { 00039 private: 00040 // Not implemented. 00041 DtSpatialSubdivisionTerrainIntersector(); 00042 // Not implemented. 00043 DtSpatialSubdivisionTerrainIntersector(const DtSpatialSubdivisionTerrainIntersector& orig); 00044 // Not implemented. 00045 DtSpatialSubdivisionTerrainIntersector& operator=(const DtSpatialSubdivisionTerrainIntersector& orig); 00046 00047 public: 00048 DtSpatialSubdivisionTerrainIntersector(DtTerrainDatabase* db, 00049 const DtTerrainIntersectorDescriptor* desc); 00050 virtual ~DtSpatialSubdivisionTerrainIntersector(); 00051 00052 virtual bool init(); 00053 00054 // Calls init() 00055 virtual bool reinitialize(); 00056 00057 // \return The total number of bytes of memory used by this intersector 00058 // and any of its internal indexing into the terrain. 00059 virtual unsigned int memoryUsage() const; 00060 00061 virtual bool chordIntersect(const DtChord& chord, 00062 DtChordIntersectionRecord& record, 00063 DtGdbNode::DtIntersectRecordType irtFlag = DtGdbNode::IRT_ALL_DATA_TERRAIN) const; 00064 00065 virtual bool allIntersectsAlongChord(const DtChord& chord, 00066 DtChordIntersectRecordList& intList, 00067 DtGdbNode::DtIntersectRecordType irtFlag = DtGdbNode::IRT_ALL_DATA_TERRAIN) const; 00068 00069 virtual bool sphereIntersect(const DtSphere& sphere, DtSphereIntersectionRecord& record, 00070 DtGdbNode::DtIntersectRecordType irtFlag = DtGdbNode::IRT_ALL_DATA_TERRAIN) const; 00071 00072 virtual int terrainIntersectorType() const; 00073 00074 // \return A new instance of a descriptor for this terrain intersector. 00075 static DtSpatialSubdivisionTerrainIntersectorDescriptor* createDescriptor(); 00076 00077 public: 00078 00079 virtual DtSpatialSubdivision<DtGdbNode*>* spatialSubdivision(); 00080 virtual const DtSpatialSubdivision<DtGdbNode*>* spatialSubdivision() const; 00081 00082 // These are only used during init or reinitialization. If you set 00083 // one (or more) of these values, be sure to call reinitialize after 00084 // you are done changing values 00085 int cellCountX() const { return myCellCountX; }; 00086 void setCellCountX(int x) { myCellCountX = x ;}; 00087 00088 int cellCountY() const { return myCellCountY; }; 00089 void setCellCountY(int y) { myCellCountY = y; }; 00090 00091 int cellCountZ() const { return myCellCountZ; }; 00092 void setCellCountZ(int z) { myCellCountZ = z; }; 00093 00094 protected: 00095 virtual void buildSpatialSubdivision(unsigned int cellCountX, 00096 unsigned int cellCountY, 00097 unsigned int cellCountZ = 1); 00098 00099 #if TEST_SPATIAL_SUBDIVISION 00100 public: 00101 DtSpatialIndex* spatialIndex(); 00102 void setSpatialIndex(DtSpatialIndex* spatialIndex); 00103 protected: 00104 #endif 00105 00106 protected: 00107 DtSpatialSubdivision<DtGdbNode*>* myTerrainSpatialSubdivision; 00108 00109 // These are only used during initialization. 00110 int myCellCountX; 00111 int myCellCountY; 00112 int myCellCountZ; 00113 00114 private: 00115 #if TEST_SPATIAL_SUBDIVISION 00116 DtSpatialIndex* mySpatialIndex; 00117 #endif 00118 }; 00119 00120 inline DtSpatialSubdivision<DtGdbNode*>* DtSpatialSubdivisionTerrainIntersector::spatialSubdivision() 00121 { 00122 return myTerrainSpatialSubdivision; 00123 } 00124 00125 inline const DtSpatialSubdivision<DtGdbNode*>* DtSpatialSubdivisionTerrainIntersector::spatialSubdivision() const 00126 { 00127 return myTerrainSpatialSubdivision; 00128 } 00129 00130 #if TEST_SPATIAL_SUBDIVISION 00131 inline DtSpatialIndex* DtTerrainDatabase::spatialIndex() 00132 { 00133 return mySpatialIndex; 00134 } 00135 inline void DtTerrainDatabase::setSpatialIndex(DtSpatialIndex* newSpatialIndex) 00136 { 00137 mySpatialIndex = newSpatialIndex; 00138 } 00139 #endif 00140 00141 #endif