X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScenery%2Fscenery.hxx;h=bd976ba231ce82121a8ce1895528aa7fe8821bf6;hb=674a295896a1e56d605f39874262d6f146a586a3;hp=baf9cce2267062e5e530d26ee509ed04ce6494d3;hpb=1294aed4650ec2aacef27a7fdeb2f4e012516ca0;p=flightgear.git diff --git a/src/Scenery/scenery.hxx b/src/Scenery/scenery.hxx index baf9cce22..bd976ba23 100644 --- a/src/Scenery/scenery.hxx +++ b/src/Scenery/scenery.hxx @@ -2,7 +2,7 @@ // // Written by Curtis Olson, started May 1997. // -// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com +// Copyright (C) 1997 Curtis L. Olson - http://www.flightgear.org/~curt // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -16,7 +16,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -29,41 +29,90 @@ # error This library requires C++ #endif +#include +#include -#include +#include +#include +#include +#include "SceneryPager.hxx" -// Define a structure containing global scenery parameters -struct fgSCENERY { - // center of current scenery chunk - Point3D center; - - // next center of current scenery chunk - Point3D next_center; - - // angle of sun relative to current local horizontal - double sun_angle; +class SGMaterial; - // elevation of terrain at our current lat/lon (based on the - // actual drawn polygons) - double cur_elev; +// Define a structure containing global scenery parameters +class FGScenery : public SGSubsystem { + + // scene graph + osg::ref_ptr scene_graph; + osg::ref_ptr terrain_branch; + osg::ref_ptr models_branch; + osg::ref_ptr aircraft_branch; + +public: + + FGScenery(); + ~FGScenery(); + + // Implementation of SGSubsystem. + void init (); + void bind (); + void unbind (); + void update (double dt); + + /// Compute the elevation of the scenery at geodetic latitude lat, + /// geodetic longitude lon and not higher than max_alt. + /// If the exact flag is set to true, the scenery center is moved to + /// gain a higher accuracy of that query. The center is restored past + /// that to the original value. + /// The altitude hit is returned in the alt argument. + /// The method returns true if the scenery is available for the given + /// lat/lon pair. If there is no scenery for that point, the altitude + /// value is undefined. + /// All values are meant to be in meters or degrees. + bool get_elevation_m(const SGGeod& geod, double& alt, + const SGMaterial** material, + const osg::Node* butNotFrom = 0); + + /// Compute the elevation of the scenery beow the cartesian point pos. + /// you the returned scenery altitude is not higher than the position + /// pos plus an ofset given with max_altoff. + /// If the exact flag is set to true, the scenery center is moved to + /// gain a higher accuracy of that query. The center is restored past + /// that to the original value. + /// The altitude hit is returned in the alt argument. + /// The method returns true if the scenery is available for the given + /// lat/lon pair. If there is no scenery for that point, the altitude + /// value is undefined. + /// All values are meant to be in meters. + bool get_cart_elevation_m(const SGVec3d& pos, double max_altoff, + double& elevation, const SGMaterial** material, + const osg::Node* butNotFrom = 0); + + /// Compute the nearest intersection point of the line starting from + /// start going in direction dir with the terrain. + /// The input and output values should be in cartesian coordinates in the + /// usual earth centered wgs84 coordiante system. Units are meters. + /// On success, true is returned. + bool get_cart_ground_intersection(const SGVec3d& start, const SGVec3d& dir, + SGVec3d& nearestHit, + const osg::Node* butNotFrom = 0); + + osg::Group *get_scene_graph () const { return scene_graph.get(); } + osg::Group *get_terrain_branch () const { return terrain_branch.get(); } + osg::Group *get_models_branch () const { return models_branch.get(); } + osg::Group *get_aircraft_branch () const { return aircraft_branch.get(); } + + /// Returns true if scenery is avaliable for the given lat, lon position + /// within a range of range_m. + /// lat and lon are expected to be in degrees. + bool scenery_available(const SGGeod& position, double range_m); + + // Static because access to the pager is needed before the rest of + // the scenery is initialized. + static flightgear::SceneryPager* getPagerSingleton(); }; -extern struct fgSCENERY scenery; - - -// Initialize the Scenery Management system -int fgSceneryInit( void ); - - -// Tell the scenery manager where we are so it can load the proper -// data, and build the proper structures. -void fgSceneryUpdate(double lon, double lat, double elev); - - -// Render out the current scene -void fgSceneryRender( void ); - #endif // _SCENERY_HXX