00001 #ifndef PHX_TERRAIN_DATABASE_H 00002 #define PHX_TERRAIN_DATABASE_H 00003 00004 #include <Phx/Graphics/PhxTerrainGeometry.h> 00005 #include <Phx/Util/PhxBuffer.h> 00006 #include <Phx/Util/PhxRectangle.h> 00007 00014 namespace Phx { 00015 00050 class GraphicsEngine::TerrainGeometry::TerrainDatabase : 00051 public LockedPtrInterface<TerrainDatabase> { 00052 public: 00053 00058 typedef uint64_t QuadIdentifier; 00059 00060 typedef uint32_t ChildIndex; 00061 const static ChildIndex LL = 0; 00062 const static ChildIndex UL = 1; 00063 const static ChildIndex LR = 2; 00064 const static ChildIndex UR = 3; 00065 const static ChildIndex CHILD_COUNT = 4; 00066 00070 const static QuadIdentifier INVALID_IDENTIFIER = ((uint64_t)-1); 00071 00084 const static uint32_t ROOT_IDENTIFIER_BITS = 24; 00085 00090 const static uint32_t QUAD_IDENTIFIER_BITS = 64 - ROOT_IDENTIFIER_BITS; 00091 00103 const static QuadIdentifier MIN_ROOT_IDENTIFIER = ((uint64_t)1)<<(ROOT_IDENTIFIER_BITS-2); 00104 00116 const static QuadIdentifier MAX_ROOT_IDENTIFIER = (((uint64_t)1)<<ROOT_IDENTIFIER_BITS)-1; 00117 00122 static inline bool isRootIdentifier(QuadIdentifier identifier) { 00123 return !(identifier & ~MAX_ROOT_IDENTIFIER); 00124 } 00125 00142 static inline QuadIdentifier rootIdentifier(QuadIdentifier quad) { 00143 while (!isRootIdentifier(quad)) { quad >>= 2; } 00144 return quad; 00145 } 00146 00153 static inline QuadIdentifier childIdentifier(QuadIdentifier parent, ChildIndex c) { 00154 return (parent << 2)|c; 00155 } 00156 00167 static inline QuadIdentifier parentIdentifier(QuadIdentifier quad) { 00168 if (isRootIdentifier(quad)) return INVALID_IDENTIFIER; 00169 return quad>>2; 00170 } 00171 00180 static Rectangle<float> uvCoords(QuadIdentifier identifier); 00181 00202 virtual Vector3 rootCorner(QuadIdentifier identifier, ChildIndex which) = 0; 00203 00220 virtual double ellipsoidRadius(const Vector3& v) = 0; 00221 00222 // Heights are floating point values. 00223 typedef float HeightValue; 00224 00225 // must return resolution*resolution-sized buffer. 00226 virtual Ptr<const Buffer<HeightValue> > newHeightBuffer(QuadIdentifier identifier, 00227 uint32_t resolution) = 0; 00228 00229 // must return resolution*resolution*3-sized buffer. 00230 virtual Ptr<const Buffer<uint8_t> > newColorBuffer(QuadIdentifier identifier, 00231 uint32_t resolution) = 0; 00232 00233 // must return resolution*resolution-sized buffer. 00234 virtual Ptr<const Buffer<uint8_t> > newBandBuffer(QuadIdentifier identifier, 00235 const String& band, uint32_t resolution) = 0; 00236 00237 }; 00238 00248 class GraphicsEngine::TerrainGeometry::TerrainDatabaseDescription : 00249 public Description { 00250 public: 00251 static const Description::Type DESCRIPTION_TYPE; 00252 static const String DESCRIPTION_TYPE_NAME; 00253 }; 00254 00255 }; // namespace Phx 00256 00257 #endif /* PHX_TERRAIN_DATABASE_H */
1.4.2