osgEarth 2.1.1
|
Public Member Functions | |
GeodeticManifold () | |
void | seed (Level maxLevel) |
void | cull (osgUtil::CullVisitor *cv) |
void | initialize (MeshManager *mesh) |
osg::Vec3d | midpoint (const osg::Vec3d &mapCoord0, const osg::Vec3d &mapCoord1) const |
osg::BoundingSphere | initialBound () const |
MeshNode | createNode (const osg::Vec3d &manifoldCoord) const |
osg::Vec3d | p (double x, double y, double z) |
Public Attributes | |
osg::BoundingSphere | _bs |
osg::ref_ptr< const Profile > | _profile |
osg::ref_ptr< const osg::EllipsoidModel > | _ellipsoid |
osg::ref_ptr< Diamond > | _vd [6] |
osg::ref_ptr< Diamond > | _fd [4] |
osg::ref_ptr< Diamond > | _ed [8] |
The top-level diamond layout for a round earth
Definition at line 29 of file GeodeticManifold.
GeodeticManifold::GeodeticManifold | ( | ) |
Definition at line 24 of file GeodeticManifold.cpp.
{ _profile = osgEarth::Registry::instance()->getGlobalGeodeticProfile(); _ellipsoid = _profile->getSRS()->getGeographicSRS()->getEllipsoid(); }
MeshNode GeodeticManifold::createNode | ( | const osg::Vec3d & | manifoldCoord | ) | const [virtual] |
creates a mesh node for a coordinate in manifold profile
Implements Manifold.
Definition at line 214 of file GeodeticManifold.cpp.
{ MeshNode node; node._manifoldCoord = manCoord; node._geodeticCoord.set( osg::DegreesToRadians(manCoord.x()), osg::DegreesToRadians(manCoord.y()), manCoord.z() ); osg::Vec3d temp; _ellipsoid->convertLatLongHeightToXYZ( node._geodeticCoord.y(), node._geodeticCoord.x(), node._geodeticCoord.z(), temp.x(), temp.y(), temp.z() ); node._vertex = temp; node._normal = _ellipsoid->computeLocalUpVector( temp.x(), temp.y(), temp.z() ); return node; }
void GeodeticManifold::cull | ( | osgUtil::CullVisitor * | cv | ) | [virtual] |
apply culling to the manifold.
Implements Manifold.
Definition at line 252 of file GeodeticManifold.cpp.
{ for( unsigned short e=0; e<8; ++e ) { _ed[e]->cull( cv ); } }
osg::BoundingSphere GeodeticManifold::initialBound | ( | ) | const [virtual] |
calculates the initial bound for the manifold.
Implements Manifold.
Definition at line 237 of file GeodeticManifold.cpp.
{ return osg::BoundingSphere( osg::Vec3d(0,0,0), _ellipsoid->getRadiusEquator() * 1.2 ); }
void GeodeticManifold::initialize | ( | MeshManager * | mesh | ) | [virtual] |
builds the base manifold mesh.
Implements Manifold.
Definition at line 31 of file GeodeticManifold.cpp.
{ mesh->_minGeomLevel = 1; mesh->_minActiveLevel = 3; // Construct the "vertex diamonds". _vd[0] = new Diamond(mesh, TileKey(), 0, "vd0"); // north pole 1 _vd[0]->setCoord( -90, 90, 0 ); _vd[1] = new Diamond(mesh, TileKey(), 0, "vd1"); // north pole 2 _vd[1]->setCoord( 90, 90, 0 ); _vd[2] = new Diamond(mesh, TileKey(), 0, "vd2"); // south pole 1 _vd[2]->setCoord( -90, -90, 0 ); _vd[3] = new Diamond(mesh, TileKey(), 0, "vd3"); // south pole 2 _vd[3]->setCoord( 90, -90, 0 ); _vd[4] = new Diamond(mesh, TileKey(), 0, "vd4"); _vd[4]->setCoord( -180, 0, 0 ); _vd[5] = new Diamond(mesh, TileKey(), 0, "vd5"); _vd[5]->setCoord( 0, 0, 0 ); // The 4 "face diamonds": _fd[0] = new Diamond(mesh, TileKey(), 0, "fd0"); _fd[0]->setCoord( -90, 0, 0 ); _fd[0]->_a[GDPARENT] = _vd[0].get(); _fd[0]->_a[QUADTREE] = _vd[2].get(); _fd[0]->_a[PARENT_L] = _vd[4].get(); _fd[0]->_a[PARENT_R] = _vd[5].get(); _fd[1] = new Diamond(mesh, TileKey(), 0, "fd1"); _fd[1]->setCoord( 90, 0, 0 ); _fd[1]->_a[GDPARENT] = _vd[3].get(); _fd[1]->_a[QUADTREE] = _vd[1].get(); _fd[1]->_a[PARENT_L] = _vd[4].get(); _fd[1]->_a[PARENT_R] = _vd[5].get(); _fd[2] = new Diamond(mesh, TileKey(), 0, "fd2"); // virtual north pole diamond _fd[2]->setCoord( 0, 90, 0 ); _fd[2]->_a[GDPARENT] = _vd[0].get(); _fd[2]->_a[QUADTREE] = _vd[1].get(); _fd[2]->_a[PARENT_L] = _vd[5].get(); _fd[2]->_a[PARENT_R] = _vd[4].get(); _fd[3] = new Diamond(mesh, TileKey(), 0, "fd3"); // virtual south pole diamond _fd[3]->setCoord( 0, -90, 0 ); _fd[3]->_a[GDPARENT] = _vd[3].get(); _fd[3]->_a[QUADTREE] = _vd[2].get(); _fd[3]->_a[PARENT_L] = _vd[5].get(); _fd[3]->_a[PARENT_R] = _vd[4].get(); // the 8 "edge diamonds" (first with geometry) _ed[0] = new Diamond(mesh, TileKey(1,0,0,_profile.get()), 1, "ed0"); _ed[0]->setCoord( -135, 45, 0 ); _ed[0]->_a[GDPARENT] = _vd[0].get(); _ed[0]->_a[QUADTREE] = _vd[4].get(); _ed[0]->_a[PARENT_L] = _fd[2].get(); _ed[0]->_a[PARENT_R] = _fd[0].get(); _ed[0]->_orientation = 0; _ed[1] = new Diamond(mesh, TileKey(1,1,0,_profile.get()), 1, "ed1"); _ed[1]->setCoord( -45, 45, 0 ); _ed[1]->_a[GDPARENT] = _vd[0].get(); _ed[1]->_a[QUADTREE] = _vd[5].get(); _ed[1]->_a[PARENT_L] = _fd[0].get(); _ed[1]->_a[PARENT_R] = _fd[2].get(); _ed[1]->_orientation = 2; _ed[2] = new Diamond(mesh, TileKey(1,0,1,_profile.get()), 1, "ed2"); _ed[2]->setCoord( -135, -45, 0 ); _ed[2]->_a[GDPARENT] = _vd[2].get(); _ed[2]->_a[QUADTREE] = _vd[4].get(); _ed[2]->_a[PARENT_L] = _fd[0].get(); _ed[2]->_a[PARENT_R] = _fd[3].get(); _ed[2]->_orientation = 6; _ed[3] = new Diamond(mesh, TileKey(1,1,1,_profile.get()), 1, "ed3"); _ed[3]->setCoord( -45, -45, 0 ); _ed[3]->_a[GDPARENT] = _vd[2].get(); _ed[3]->_a[QUADTREE] = _vd[5].get(); _ed[3]->_a[PARENT_L] = _fd[3].get(); _ed[3]->_a[PARENT_R] = _fd[0].get(); _ed[3]->_orientation = 4; _ed[4] = new Diamond(mesh, TileKey(1,2,0,_profile.get()), 1, "ed4"); _ed[4]->setCoord( 45, 45, 0 ); _ed[4]->_a[GDPARENT] = _vd[1].get(); _ed[4]->_a[QUADTREE] = _vd[5].get(); _ed[4]->_a[PARENT_L] = _fd[2].get(); _ed[4]->_a[PARENT_R] = _fd[1].get(); _ed[4]->_orientation = 0; _ed[5] = new Diamond(mesh, TileKey(1,3,0,_profile.get()), 1, "ed5"); _ed[5]->setCoord( 135, 45, 0 ); _ed[5]->_a[GDPARENT] = _vd[1].get(); _ed[5]->_a[QUADTREE] = _vd[4].get(); _ed[5]->_a[PARENT_L] = _fd[1].get(); _ed[5]->_a[PARENT_R] = _fd[2].get(); _ed[5]->_orientation = 2; _ed[6] = new Diamond(mesh, TileKey(1,2,1,_profile.get()), 1, "ed6"); _ed[6]->setCoord( 45, -45, 0 ); _ed[6]->_a[GDPARENT] = _vd[3].get(); _ed[6]->_a[QUADTREE] = _vd[5].get(); _ed[6]->_a[PARENT_L] = _fd[1].get(); _ed[6]->_a[PARENT_R] = _fd[3].get(); _ed[6]->_orientation = 6; _ed[7] = new Diamond(mesh, TileKey(1,3,1,_profile.get()), 1, "ed7"); _ed[7]->setCoord( 135, -45, 0 ); _ed[7]->_a[GDPARENT] = _vd[3].get(); _ed[7]->_a[QUADTREE] = _vd[4].get(); _ed[7]->_a[PARENT_L] = _fd[3].get(); _ed[7]->_a[PARENT_R] = _fd[1].get(); _ed[7]->_orientation = 7; // set child pointers: _fd[0]->setChild( 0, _ed[3].get() ); _fd[0]->setChild( 1, _ed[1].get() ); _fd[0]->setChild( 2, _ed[0].get() ); _fd[0]->setChild( 3, _ed[2].get() ); _fd[1]->setChild( 0, _ed[4].get() ); _fd[1]->setChild( 1, _ed[6].get() ); _fd[1]->setChild( 2, _ed[7].get() ); _fd[1]->setChild( 3, _ed[5].get() ); _fd[2]->setChild( 0, _ed[5].get() ); _fd[2]->setChild( 1, _ed[0].get() ); _fd[2]->setChild( 2, _ed[1].get() ); _fd[2]->setChild( 3, _ed[4].get() ); _fd[3]->setChild( 0, _ed[2].get() ); _fd[3]->setChild( 1, _ed[7].get() ); _fd[3]->setChild( 2, _ed[6].get() ); _fd[3]->setChild( 3, _ed[3].get() ); // seed the bouding spheres of the manifold diamonds: for( unsigned short f=0; f<4; ++f ) _fd[f]->activate(); for( unsigned short e=0; e<8; ++e ) _ed[e]->activate(); // generate Level 3 (the first renderable quadtree decendants). seed( 3 ); // hopefully, that's it! }
osg::Vec3d GeodeticManifold::midpoint | ( | const osg::Vec3d & | mapCoord0, |
const osg::Vec3d & | mapCoord1 | ||
) | const [virtual] |
calculates the midpoint between two map coodinates
Implements Manifold.
Definition at line 198 of file GeodeticManifold.cpp.
{ //TODO account for date line crossing return (p0+p1)*0.5; }
osg::Vec3d GeodeticManifold::p | ( | double | x, |
double | y, | ||
double | z | ||
) |
void GeodeticManifold::seed | ( | Level | maxLevel | ) |
generate children up to the specified level
Definition at line 243 of file GeodeticManifold.cpp.
{ for( unsigned short e=0; e<8; ++e ) { _ed[e]->seed( maxLevel ); } }
osg::BoundingSphere GeodeticManifold::_bs |
Definition at line 56 of file GeodeticManifold.
osg::ref_ptr<Diamond> GeodeticManifold::_ed[8] |
Definition at line 61 of file GeodeticManifold.
osg::ref_ptr<const osg::EllipsoidModel> GeodeticManifold::_ellipsoid |
Definition at line 58 of file GeodeticManifold.
osg::ref_ptr<Diamond> GeodeticManifold::_fd[4] |
Definition at line 60 of file GeodeticManifold.
osg::ref_ptr<const Profile> GeodeticManifold::_profile |
Definition at line 57 of file GeodeticManifold.
osg::ref_ptr<Diamond> GeodeticManifold::_vd[6] |
Definition at line 59 of file GeodeticManifold.