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:
parent
eb26cb3590
commit
b8de58bcdd
7 changed files with 130 additions and 200 deletions
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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 ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue