VR-Forces 4.0.4 Class Documentation
include/gdb/spatialSubdivisionTerrainIntersector.h
Go to the documentation of this file.
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

Document ID: Generated on Fri Jun 29 16:33:32 EDT 2012 from SVN revision 116588
Copyright © 2005-2012 VT MÄK Inc. All Rights Reserved (www.mak.com)