00001
00023 #ifndef INC_RVC_SPATTREE_H
00024 #define INC_RVC_SPATTREE_H
00025
00026 #ifndef INC_RVC_OBJECT_H
00027 #include <rvc/object.h>
00028 #endif
00029
00030 #ifndef INC_MI32_ELEMTYPE_H
00031 #include <mi32/elemtype.h>
00032 #endif
00033
00034 #ifndef INC_MI32_RANGE_H
00035 #include <mi32/range.h>
00036 #endif
00037
00038 #ifndef INC_MI32_POINT_H
00039 #include <mi32/point.h>
00040 #endif
00041
00042
00043 #ifndef GENERATING_DOXYGEN_OUTPUT
00044
00045 class UNSIGNEDSET;
00046 namespace RVC {
00047 class SPATIALTREEHANDLE;
00048 }
00049 #endif
00050
00051
00052 namespace RVC {
00053
00060 class SPATIALTREE : public RVC::OBJECT {
00061 public:
00062
00065 struct TIERINFO {
00066
00067
00068
00069 DPOINT3D m_Origin;
00070 DPOINT3D m_NodeSize;
00071 WPOINT3D m_NumNodes;
00072 UINT8 spare[2];
00073
00074 TIERINFO (
00075 ) { Clear(); }
00076
00079 INT32 CalcNode2D (
00080 const DPOINT2D& point
00081 ) const {
00082 INT32 xpos = CalcNodeX(point.x);
00083 if (xpos < 0 || xpos >= m_NumNodes.x) return (-1);
00084 INT32 ypos = CalcNodeY(point.y);
00085 if (ypos < 0 || ypos >= m_NumNodes.y) return (-1);
00086 return (ypos * m_NumNodes.x + xpos);
00087 }
00088
00091 INT32 CalcNode3D (
00092 const DPOINT3D& point
00093 ) const {
00094 INT32 node = CalcNode2D(point);
00095 if (m_NumNodes.z > 1 && node >= 0) {
00096 INT32 zpos = CalcNodeZ(point.z);
00097 if (zpos < 0 || zpos >= m_NumNodes.z) return (-1);
00098 node += zpos * m_NumNodes.x * m_NumNodes.y;
00099 }
00100 return (node);
00101 }
00102
00105 INT32 CalcNodeX (
00106 double x
00107 ) const { return (static_cast<INT32>(floor((x - m_Origin.x) / m_NodeSize.x))); }
00108
00111 INT32 CalcNodeY (
00112 double y
00113 ) const { return (static_cast<INT32>(floor((y - m_Origin.y) / m_NodeSize.y))); }
00114
00117 INT32 CalcNodeZ (
00118 double z
00119 ) const { return (static_cast<INT32>(floor((z - m_Origin.z) / m_NodeSize.z))); }
00120
00122 void Clear (
00123 ) {memset(static_cast<void*>(this), 0, sizeof(*this));}
00124 };
00125
00127 SPATIALTREE (
00128 );
00129
00131 SPATIALTREE (
00132 const RVC::SPATIALTREE& rhs
00133 );
00134
00136 virtual ~SPATIALTREE (
00137 );
00138
00140 RVC::SPATIALTREE& operator= (
00141 const RVC::SPATIALTREE& rhs
00142 );
00143
00145 ERRVALUE Search (
00146 ELEMTYPE elemtype,
00147 const DRECT2D& rect,
00148 SIMPLE_ARRAY<INT32_RANGE>& elemranges
00149 );
00150
00152 ERRVALUE Search (
00153 ELEMTYPE elemtype,
00154 const DRECT2D& rect,
00155 UNSIGNEDSET& ElemSet
00156 );
00157
00160 INT32 GetMaxNodeArrayElems (
00161 ELEMTYPE elemtype
00162 );
00163
00166 INT32 GetNumTiers (
00167 ELEMTYPE elemtype
00168 );
00169
00171 ERRVALUE Make (
00172 const RVC::OBJECT& parent,
00173 const RVC::DESCRIPTOR& Descriptor,
00174 const CREDENTIALS* Credentials RVC_DEFAULT_CREDENTIALS
00175 );
00176
00178 ERRVALUE Make (
00179 RVC::OBJITEM& ObjItem,
00180 #ifdef RVC_CREDENTIALS_MANDATORY
00181 const char* Source,
00182 const CREDENTIALS* Credentials
00183 #else
00184 const char* Source = 0,
00185 const CREDENTIALS* Credentials = 0
00186 #endif
00187 );
00188
00190 ERRVALUE ReadTier (
00191 ELEMTYPE elemtype,
00192 int tier,
00193 TIERINFO& tierinfo,
00194 INT32 *firstelemarray
00195 );
00196
00198 ERRVALUE WriteTier (
00199 ELEMTYPE elemtype,
00200 int tier,
00201 TIERINFO& tierinfo,
00202 INT32 *firstelemarray
00203 );
00204
00205 private:
00206 #ifndef GENERATING_DOXYGEN_OUTPUT
00207
00209 virtual ERRVALUE v_CloseObject ();
00210 virtual RVC::OBJTYPE v_GetDftObjectType () const;
00211 virtual bool v_IsObjectOpen () const;
00212 virtual ERRVALUE v_OpenObject (OPENMODE OpenMode, MDLGPARENT parent, const CREDENTIALS* Credentials);
00213
00214 SPATIALTREEHANDLE *m_pSpatialTreeHandle;
00215 #endif // GENERATING_DOXYGEN_OUTPUT
00216
00217 };
00218
00219 }
00220
00221 #endif