1
0
Fork 0

cleanup of precipitation contribution

Reindent to Stroustrup style.

Make FGPrecipitationMgr an SGSubsystem and remove all references to it
in main.cxx and renderer.cxx.

Use SGGeod::makeZUpFrame instead of a private function in
tileentry.cxx. Rewrite that function, WorldCoordinate, to use
makeZUpFrame too.
This commit is contained in:
timoore 2008-03-04 09:03:54 +00:00
parent eb26cb3590
commit b8de58bcdd
7 changed files with 130 additions and 200 deletions

View file

@ -36,6 +36,7 @@
#include "environment_ctrl.hxx" #include "environment_ctrl.hxx"
#include "environment_mgr.hxx" #include "environment_mgr.hxx"
#include "fgclouds.hxx" #include "fgclouds.hxx"
#include "precipitation_mgr.hxx"
class SGSky; class SGSky;
extern SGSky *thesky; extern SGSky *thesky;
@ -54,14 +55,18 @@ FGEnvironmentMgr::FGEnvironmentMgr ()
_controller->setEnvironment(_environment); _controller->setEnvironment(_environment);
set_subsystem("controller", _controller, 0.5); set_subsystem("controller", _controller, 0.5);
fgClouds = new FGClouds( _controller ); fgClouds = new FGClouds( _controller );
_precipitationManager = new FGPrecipitationMgr;
set_subsystem("precipitation", _precipitationManager);
} }
FGEnvironmentMgr::~FGEnvironmentMgr () FGEnvironmentMgr::~FGEnvironmentMgr ()
{ {
delete _environment; delete _environment;
remove_subsystem("controller"); remove_subsystem("controller");
remove_subsystem("precipitation");
delete _controller; delete _controller;
delete fgClouds; delete fgClouds;
delete _precipitationManager;
} }
void void

View file

@ -35,6 +35,7 @@
class FGEnvironment; class FGEnvironment;
class FGEnvironmentCtrl; class FGEnvironmentCtrl;
class FGClouds; class FGClouds;
class FGPrecipitationMgr;
/** /**
* Manage environment information. * Manage environment information.
@ -86,6 +87,7 @@ private:
FGEnvironment * _environment; // always the same, for now FGEnvironment * _environment; // always the same, for now
FGEnvironmentCtrl * _controller; // always the same, for now FGEnvironmentCtrl * _controller; // always the same, for now
FGPrecipitationMgr* _precipitationManager;
FGClouds *fgClouds; FGClouds *fgClouds;
}; };

View file

@ -24,28 +24,18 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @par CVS
* $Id$
*/ */
#include <osgDB/ReadFile>
#include <osgDB/FileUtils>
#include <osgUtil/Optimizer>
#include <osgUtil/CullVisitor>
#include <osgViewer/Viewer>
#include <osg/Depth>
#include <osg/Stencil>
#include <osg/ClipPlane>
#include <osg/ClipNode>
#include <osg/MatrixTransform> #include <osg/MatrixTransform>
#include <osgUtil/TransformCallback>
#include <simgear/constants.h> #include <simgear/constants.h>
#include <simgear/math/SGMath.hxx>
#include <simgear/scene/sky/sky.hxx> #include <simgear/scene/sky/sky.hxx>
#include <simgear/scene/sky/cloud.hxx> #include <simgear/scene/sky/cloud.hxx>
#include <Main/fg_props.hxx> #include <Main/fg_props.hxx>
#include <Main/globals.hxx>
#include <Scenery/scenery.hxx>
#include "precipitation_mgr.hxx" #include "precipitation_mgr.hxx"
@ -53,9 +43,6 @@
extern SGSky *thesky; extern SGSky *thesky;
void WorldCoordinate( osg::Matrix&, double,
double, double, double);
/** /**
* @brief FGPrecipitation Manager constructor * @brief FGPrecipitation Manager constructor
* *
@ -63,32 +50,17 @@ void WorldCoordinate( osg::Matrix&, double,
*/ */
FGPrecipitationMgr::FGPrecipitationMgr() FGPrecipitationMgr::FGPrecipitationMgr()
{ {
osg::Matrix position;
double latitude, longitude;
group = new osg::Group(); group = new osg::Group();
transform = new osg::MatrixTransform(); transform = new osg::MatrixTransform();
precipitation = new SGPrecipitation(); precipitation = new SGPrecipitation();
// By default, none precipitation // By default, no precipitation
precipitation->setRainIntensity(0); precipitation->setRainIntensity(0);
precipitation->setSnowIntensity(0); precipitation->setSnowIntensity(0);
// Read latitude and longitude position
latitude = fgGetDouble("/position/latitude-deg", 0.0);
longitude = fgGetDouble("/position/longitude-deg", 0.0);
WorldCoordinate(position, latitude, longitude, 0, 0);
// Move the precipitation object to player position
transform->setMatrix(position);
transform->addChild(precipitation->build()); transform->addChild(precipitation->build());
group->addChild(transform.get());
group->addChild(transform);
} }
@ -97,9 +69,25 @@ FGPrecipitationMgr::FGPrecipitationMgr()
*/ */
FGPrecipitationMgr::~FGPrecipitationMgr() FGPrecipitationMgr::~FGPrecipitationMgr()
{ {
delete precipitation;
} }
/**
* SGSubsystem initialization
*/
void FGPrecipitationMgr::init()
{
// Read latitude and longitude position
SGGeod geod = SGGeod::fromDegM(fgGetDouble("/position/longitude-deg", 0.0),
fgGetDouble("/position/latitude-deg", 0.0),
0.0);
osg::Matrix position(geod.makeZUpFrame());
// Move the precipitation object to player position
transform->setMatrix(position);
// Add to scene graph
osg::Group* scenery = globals->get_scenery()->get_scene_graph();
scenery->addChild(getObject());
}
/** /**
* @brief Get OSG precipitation object * @brief Get OSG precipitation object
@ -108,7 +96,7 @@ FGPrecipitationMgr::~FGPrecipitationMgr()
*/ */
osg::Group * FGPrecipitationMgr::getObject(void) osg::Group * FGPrecipitationMgr::getObject(void)
{ {
return this->group; return this->group.get();
} }
@ -163,12 +151,8 @@ float FGPrecipitationMgr::getPrecipitationAtAltitudeMax(void)
/** /**
* @brief Update the precipitation drawing * @brief Update the precipitation drawing
* *
* @returns true is all is OK
*
* This function permits you to update the precipitation drawing.
* This function is called by the renderer.
*/ */
bool FGPrecipitationMgr::update(void) void FGPrecipitationMgr::update(double dt)
{ {
double dewtemp; double dewtemp;
double currtemp; double currtemp;
@ -221,8 +205,4 @@ bool FGPrecipitationMgr::update(void)
// Update the drawing... // Update the drawing...
precipitation->update(); precipitation->update();
return true;
} }

View file

@ -24,30 +24,31 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* *
* @par CVS
* $Id$
*/ */
#ifndef _PRECIPITATION_MGR_HXX #ifndef _PRECIPITATION_MGR_HXX
#define _PRECIPITATION_MGR_HXX #define _PRECIPITATION_MGR_HXX
#include <simgear/structure/subsystem_mgr.hxx>
#include <simgear/environment/precipitation.hxx> #include <simgear/environment/precipitation.hxx>
#include "precipitation_mgr.hxx" class FGPrecipitationMgr : public SGSubsystem
{
class FGPrecipitationMgr {
private: private:
osg::Group *group; osg::ref_ptr<osg::Group> group;
osg::MatrixTransform *transform; osg::ref_ptr<osg::MatrixTransform> transform;
SGPrecipitation *precipitation; osg::ref_ptr<SGPrecipitation> precipitation;
float getPrecipitationAtAltitudeMax(void); float getPrecipitationAtAltitudeMax(void);
public: public:
FGPrecipitationMgr(); FGPrecipitationMgr();
~FGPrecipitationMgr(); virtual ~FGPrecipitationMgr();
bool update(void);
// SGSubsystem methods
virtual void init ();
virtual void update (double dt);
osg::Group * getObject(void); osg::Group * getObject(void);
}; };

View file

@ -71,7 +71,6 @@
#include <Time/tmp.hxx> #include <Time/tmp.hxx>
#include <Time/fg_timer.hxx> #include <Time/fg_timer.hxx>
#include <Environment/environment_mgr.hxx> #include <Environment/environment_mgr.hxx>
#include <Environment/precipitation_mgr.hxx>
#include <GUI/new_gui.hxx> #include <GUI/new_gui.hxx>
#include <MultiPlayer/multiplaymgr.hxx> #include <MultiPlayer/multiplaymgr.hxx>
@ -82,9 +81,6 @@
#include "main.hxx" #include "main.hxx"
extern FGPrecipitationMgr *fgPrecipitationMgr;
static double real_delta_time_sec = 0.0; static double real_delta_time_sec = 0.0;
double delta_time_sec = 0.0; double delta_time_sec = 0.0;
extern float init_volume; extern float init_volume;
@ -850,11 +846,6 @@ static void fgIdleFunction ( void ) {
globals->get_ephem()->getStars(), globals->get_ephem()->getStars(),
fgGetNode("/environment", true)); fgGetNode("/environment", true));
// Precipitation Manager...
fgPrecipitationMgr = new FGPrecipitationMgr();
// Initialize MagVar model // Initialize MagVar model
SGMagVar *magvar = new SGMagVar(); SGMagVar *magvar = new SGMagVar();
globals->set_mag( magvar ); globals->set_mag( magvar );

View file

@ -387,9 +387,6 @@ public:
// Sky structures // Sky structures
SGSky *thesky; SGSky *thesky;
// Precipitations
FGPrecipitationMgr *fgPrecipitationMgr;
static osg::ref_ptr<osg::FrameStamp> mFrameStamp = new osg::FrameStamp; static osg::ref_ptr<osg::FrameStamp> mFrameStamp = new osg::FrameStamp;
static osg::ref_ptr<SGUpdateVisitor> mUpdateVisitor= new SGUpdateVisitor; static osg::ref_ptr<SGUpdateVisitor> mUpdateVisitor= new SGUpdateVisitor;
@ -505,11 +502,6 @@ FGRenderer::init( void ) {
stateSet->setMode(GL_BLEND, osg::StateAttribute::ON); stateSet->setMode(GL_BLEND, osg::StateAttribute::ON);
stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON); stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
// Add Precipitation object
sceneGroup->addChild( fgPrecipitationMgr->getObject() );
// need to update the light on every frame // need to update the light on every frame
osg::LightSource* lightSource = new osg::LightSource; osg::LightSource* lightSource = new osg::LightSource;
lightSource->setUpdateCallback(new FGLightSourceUpdateCallback); lightSource->setUpdateCallback(new FGLightSourceUpdateCallback);
@ -788,20 +780,6 @@ FGRenderer::update( bool refresh_camera_settings ) {
// fgGetDouble("/velocities/airspeed-kt", 0.0) // fgGetDouble("/velocities/airspeed-kt", 0.0)
// * cos( fgGetDouble("/orientation/pitch-deg", 0.0) // * cos( fgGetDouble("/orientation/pitch-deg", 0.0)
// * SGD_DEGREES_TO_RADIANS); // * SGD_DEGREES_TO_RADIANS);
// TODO:find the real view speed, not the AC one
// sgEnviro.drawPrecipitation(
// fgGetDouble("/environment/metar/rain-norm", 0.0),
// fgGetDouble("/environment/metar/snow-norm", 0.0),
// fgGetDouble("/environment/metar/hail-norm", 0.0),
// current__view->getPitch_deg() + current__view->getPitchOffset_deg(),
// current__view->getRoll_deg() + current__view->getRollOffset_deg(),
// - current__view->getHeadingOffset_deg(),
// current_view_origin_airspeed_horiz_kt
// );
// Update precipitation informations...
fgPrecipitationMgr->update();
// OSGFIXME // OSGFIXME
// if( is_internal ) // if( is_internal )

View file

@ -52,6 +52,7 @@
#include <simgear/math/polar3d.hxx> #include <simgear/math/polar3d.hxx>
#include <simgear/math/sg_geodesy.hxx> #include <simgear/math/sg_geodesy.hxx>
#include <simgear/math/sg_random.h> #include <simgear/math/sg_random.h>
#include <simgear/math/SGMath.hxx>
#include <simgear/misc/sgstream.hxx> #include <simgear/misc/sgstream.hxx>
#include <simgear/scene/material/mat.hxx> #include <simgear/scene/material/mat.hxx>
#include <simgear/scene/material/matlib.hxx> #include <simgear/scene/material/matlib.hxx>
@ -165,43 +166,15 @@ FGTileEntry::~FGTileEntry ()
{ {
} }
void WorldCoordinate( osg::Matrix& obj_pos, double lat, static void WorldCoordinate(osg::Matrix& obj_pos, double lat,
double lon, double elev, double hdg ) double lon, double elev, double hdg)
{ {
double lon_rad = lon * SGD_DEGREES_TO_RADIANS; SGGeod geod = SGGeod::fromDegM(lon, lat, elev);
double lat_rad = lat * SGD_DEGREES_TO_RADIANS; obj_pos = geod.makeZUpFrame();
double hdg_rad = hdg * SGD_DEGREES_TO_RADIANS; // hdg is not a compass heading, but a counter-clockwise rotation
// around the Z axis
// setup transforms obj_pos.preMult(osg::Matrix::rotate(hdg * SGD_DEGREES_TO_RADIANS,
Point3D geod( lon_rad, lat_rad, elev ); 0.0, 0.0, 1.0));
Point3D world_pos = sgGeodToCart( geod );
double sin_lat = sin( lat_rad );
double cos_lat = cos( lat_rad );
double cos_lon = cos( lon_rad );
double sin_lon = sin( lon_rad );
double sin_hdg = sin( hdg_rad ) ;
double cos_hdg = cos( hdg_rad ) ;
obj_pos(0, 0) = cos_hdg * sin_lat * cos_lon - sin_hdg * sin_lon;
obj_pos(0, 1) = cos_hdg * sin_lat * sin_lon + sin_hdg * cos_lon;
obj_pos(0, 2) = -cos_hdg * cos_lat;
obj_pos(0, 3) = SG_ZERO;
obj_pos(1, 0) = -sin_hdg * sin_lat * cos_lon - cos_hdg * sin_lon;
obj_pos(1, 1) = -sin_hdg * sin_lat * sin_lon + cos_hdg * cos_lon;
obj_pos(1, 2) = sin_hdg * cos_lat;
obj_pos(1, 3) = SG_ZERO;
obj_pos(2, 0) = cos_lat * cos_lon;
obj_pos(2, 1) = cos_lat * sin_lon;
obj_pos(2, 2) = sin_lat;
obj_pos(2, 3) = SG_ZERO;
obj_pos(3, 0) = world_pos.x();
obj_pos(3, 1) = world_pos.y();
obj_pos(3, 2) = world_pos.z();
obj_pos(3, 3) = SG_ONE ;
} }