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_mgr.hxx"
|
||||
#include "fgclouds.hxx"
|
||||
#include "precipitation_mgr.hxx"
|
||||
|
||||
class SGSky;
|
||||
extern SGSky *thesky;
|
||||
|
@ -54,14 +55,18 @@ FGEnvironmentMgr::FGEnvironmentMgr ()
|
|||
_controller->setEnvironment(_environment);
|
||||
set_subsystem("controller", _controller, 0.5);
|
||||
fgClouds = new FGClouds( _controller );
|
||||
_precipitationManager = new FGPrecipitationMgr;
|
||||
set_subsystem("precipitation", _precipitationManager);
|
||||
}
|
||||
|
||||
FGEnvironmentMgr::~FGEnvironmentMgr ()
|
||||
{
|
||||
delete _environment;
|
||||
remove_subsystem("controller");
|
||||
remove_subsystem("precipitation");
|
||||
delete _controller;
|
||||
delete fgClouds;
|
||||
delete _precipitationManager;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
class FGEnvironment;
|
||||
class FGEnvironmentCtrl;
|
||||
class FGClouds;
|
||||
class FGPrecipitationMgr;
|
||||
|
||||
/**
|
||||
* Manage environment information.
|
||||
|
@ -86,6 +87,7 @@ private:
|
|||
|
||||
FGEnvironment * _environment; // always the same, for now
|
||||
FGEnvironmentCtrl * _controller; // always the same, for now
|
||||
FGPrecipitationMgr* _precipitationManager;
|
||||
|
||||
FGClouds *fgClouds;
|
||||
};
|
||||
|
|
|
@ -24,28 +24,18 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* 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 <osgUtil/TransformCallback>
|
||||
|
||||
#include <simgear/constants.h>
|
||||
#include <simgear/math/SGMath.hxx>
|
||||
#include <simgear/scene/sky/sky.hxx>
|
||||
#include <simgear/scene/sky/cloud.hxx>
|
||||
|
||||
#include <Main/fg_props.hxx>
|
||||
#include <Main/globals.hxx>
|
||||
#include <Scenery/scenery.hxx>
|
||||
|
||||
#include "precipitation_mgr.hxx"
|
||||
|
||||
|
@ -53,9 +43,6 @@
|
|||
extern SGSky *thesky;
|
||||
|
||||
|
||||
void WorldCoordinate( osg::Matrix&, double,
|
||||
double, double, double);
|
||||
|
||||
/**
|
||||
* @brief FGPrecipitation Manager constructor
|
||||
*
|
||||
|
@ -63,32 +50,17 @@ void WorldCoordinate( osg::Matrix&, double,
|
|||
*/
|
||||
FGPrecipitationMgr::FGPrecipitationMgr()
|
||||
{
|
||||
osg::Matrix position;
|
||||
double latitude, longitude;
|
||||
group = new osg::Group();
|
||||
transform = new osg::MatrixTransform();
|
||||
precipitation = new SGPrecipitation();
|
||||
|
||||
|
||||
group = new osg::Group();
|
||||
transform = new osg::MatrixTransform();
|
||||
precipitation = new SGPrecipitation();
|
||||
// By default, no precipitation
|
||||
precipitation->setRainIntensity(0);
|
||||
precipitation->setSnowIntensity(0);
|
||||
|
||||
|
||||
// By default, none precipitation
|
||||
precipitation->setRainIntensity(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());
|
||||
|
||||
group->addChild(transform);
|
||||
transform->addChild(precipitation->build());
|
||||
group->addChild(transform.get());
|
||||
}
|
||||
|
||||
|
||||
|
@ -97,9 +69,25 @@ 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
|
||||
|
@ -108,7 +96,7 @@ FGPrecipitationMgr::~FGPrecipitationMgr()
|
|||
*/
|
||||
osg::Group * FGPrecipitationMgr::getObject(void)
|
||||
{
|
||||
return this->group;
|
||||
return this->group.get();
|
||||
}
|
||||
|
||||
|
||||
|
@ -122,107 +110,99 @@ osg::Group * FGPrecipitationMgr::getObject(void)
|
|||
*/
|
||||
float FGPrecipitationMgr::getPrecipitationAtAltitudeMax(void)
|
||||
{
|
||||
int i;
|
||||
int max;
|
||||
float result;
|
||||
int i;
|
||||
int max;
|
||||
float result;
|
||||
|
||||
|
||||
// By default (not cloud layer)
|
||||
max = SGCloudLayer::SG_MAX_CLOUD_COVERAGES;
|
||||
result = 0;
|
||||
// By default (not cloud layer)
|
||||
max = SGCloudLayer::SG_MAX_CLOUD_COVERAGES;
|
||||
result = 0;
|
||||
|
||||
// To avoid messing up
|
||||
if (thesky == NULL)
|
||||
return result;
|
||||
// To avoid messing up
|
||||
if (thesky == NULL)
|
||||
return result;
|
||||
|
||||
// For each cloud layer
|
||||
for (i=0; i<thesky->get_cloud_layer_count(); i++) {
|
||||
int q;
|
||||
// For each cloud layer
|
||||
for (i=0; i<thesky->get_cloud_layer_count(); i++) {
|
||||
int q;
|
||||
|
||||
// Get coverage
|
||||
// Value for q are (meaning / thickness) :
|
||||
// 5 : "clear" / 0
|
||||
// 4 : "cirrus" / ??
|
||||
// 3 : "few" / 65
|
||||
// 2 : "scattered" / 600
|
||||
// 1 : "broken" / 750
|
||||
// 0 : "overcast" / 1000
|
||||
q = thesky->get_cloud_layer(i)->getCoverage();
|
||||
// Get coverage
|
||||
// Value for q are (meaning / thickness) :
|
||||
// 5 : "clear" / 0
|
||||
// 4 : "cirrus" / ??
|
||||
// 3 : "few" / 65
|
||||
// 2 : "scattered" / 600
|
||||
// 1 : "broken" / 750
|
||||
// 0 : "overcast" / 1000
|
||||
q = thesky->get_cloud_layer(i)->getCoverage();
|
||||
|
||||
// Save the coverage max
|
||||
if (q < max) {
|
||||
max = q;
|
||||
result = thesky->get_cloud_layer(i)->getElevation_m();
|
||||
}
|
||||
}
|
||||
// Save the coverage max
|
||||
if (q < max) {
|
||||
max = q;
|
||||
result = thesky->get_cloud_layer(i)->getElevation_m();
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @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 currtemp;
|
||||
double rain_intensity;
|
||||
double snow_intensity;
|
||||
double dewtemp;
|
||||
double currtemp;
|
||||
double rain_intensity;
|
||||
double snow_intensity;
|
||||
|
||||
float altitudeAircraft;
|
||||
float altitudeCloudLayer;
|
||||
float altitudeAircraft;
|
||||
float altitudeCloudLayer;
|
||||
|
||||
// Get the elevation of aicraft and of the cloud layer
|
||||
altitudeAircraft = fgGetDouble("/position/altitude-ft", 0.0);
|
||||
altitudeCloudLayer = this->getPrecipitationAtAltitudeMax() * SG_METER_TO_FEET;
|
||||
// Get the elevation of aicraft and of the cloud layer
|
||||
altitudeAircraft = fgGetDouble("/position/altitude-ft", 0.0);
|
||||
altitudeCloudLayer = this->getPrecipitationAtAltitudeMax() * SG_METER_TO_FEET;
|
||||
|
||||
if (altitudeAircraft > altitudeCloudLayer) {
|
||||
// The aircraft is above the cloud layer
|
||||
rain_intensity = 0;
|
||||
snow_intensity = 0;
|
||||
}
|
||||
else {
|
||||
// The aircraft is bellow the cloud layer
|
||||
rain_intensity = fgGetDouble("/environment/metar/rain-norm", 0.0);
|
||||
snow_intensity = fgGetDouble("/environment/metar/snow-norm", 0.0);
|
||||
}
|
||||
if (altitudeAircraft > altitudeCloudLayer) {
|
||||
// The aircraft is above the cloud layer
|
||||
rain_intensity = 0;
|
||||
snow_intensity = 0;
|
||||
}
|
||||
else {
|
||||
// The aircraft is bellow the cloud layer
|
||||
rain_intensity = fgGetDouble("/environment/metar/rain-norm", 0.0);
|
||||
snow_intensity = fgGetDouble("/environment/metar/snow-norm", 0.0);
|
||||
}
|
||||
|
||||
// Get the current and dew temperature
|
||||
dewtemp = fgGetDouble("/environment/dewpoint-degc", 0.0);
|
||||
currtemp = fgGetDouble("/environment/temperature-degc", 0.0);
|
||||
// Get the current and dew temperature
|
||||
dewtemp = fgGetDouble("/environment/dewpoint-degc", 0.0);
|
||||
currtemp = fgGetDouble("/environment/temperature-degc", 0.0);
|
||||
|
||||
if (currtemp < dewtemp) {
|
||||
// There is fog... and the weather is very steamy
|
||||
if (rain_intensity == 0)
|
||||
rain_intensity = 0.15;
|
||||
}
|
||||
if (currtemp < dewtemp) {
|
||||
// There is fog... and the weather is very steamy
|
||||
if (rain_intensity == 0)
|
||||
rain_intensity = 0.15;
|
||||
}
|
||||
|
||||
// If the current temperature is below 0°C, we turn off the rain to snow...
|
||||
if (currtemp < 0)
|
||||
precipitation->setFreezing(true);
|
||||
else
|
||||
precipitation->setFreezing(false);
|
||||
// If the current temperature is below 0°C, we turn off the rain to snow...
|
||||
if (currtemp < 0)
|
||||
precipitation->setFreezing(true);
|
||||
else
|
||||
precipitation->setFreezing(false);
|
||||
|
||||
|
||||
// Set the wind property
|
||||
precipitation->setWindProperty(
|
||||
fgGetDouble("/environment/wind-from-heading-deg", 0.0),
|
||||
fgGetDouble("/environment/wind-speed-kt", 0.0));
|
||||
// Set the wind property
|
||||
precipitation->setWindProperty(
|
||||
fgGetDouble("/environment/wind-from-heading-deg", 0.0),
|
||||
fgGetDouble("/environment/wind-speed-kt", 0.0));
|
||||
|
||||
// Set the intensity of precipitation
|
||||
precipitation->setRainIntensity(rain_intensity);
|
||||
precipitation->setSnowIntensity(snow_intensity);
|
||||
// Set the intensity of precipitation
|
||||
precipitation->setRainIntensity(rain_intensity);
|
||||
precipitation->setSnowIntensity(snow_intensity);
|
||||
|
||||
// Update the drawing...
|
||||
precipitation->update();
|
||||
|
||||
return true;
|
||||
// Update the drawing...
|
||||
precipitation->update();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -24,31 +24,32 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* @par CVS
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef _PRECIPITATION_MGR_HXX
|
||||
#define _PRECIPITATION_MGR_HXX
|
||||
|
||||
#include <simgear/structure/subsystem_mgr.hxx>
|
||||
#include <simgear/environment/precipitation.hxx>
|
||||
|
||||
#include "precipitation_mgr.hxx"
|
||||
|
||||
|
||||
class FGPrecipitationMgr {
|
||||
class FGPrecipitationMgr : public SGSubsystem
|
||||
{
|
||||
private:
|
||||
osg::Group *group;
|
||||
osg::MatrixTransform *transform;
|
||||
SGPrecipitation *precipitation;
|
||||
float getPrecipitationAtAltitudeMax(void);
|
||||
osg::ref_ptr<osg::Group> group;
|
||||
osg::ref_ptr<osg::MatrixTransform> transform;
|
||||
osg::ref_ptr<SGPrecipitation> precipitation;
|
||||
float getPrecipitationAtAltitudeMax(void);
|
||||
|
||||
|
||||
public:
|
||||
FGPrecipitationMgr();
|
||||
~FGPrecipitationMgr();
|
||||
bool update(void);
|
||||
osg::Group * getObject(void);
|
||||
FGPrecipitationMgr();
|
||||
virtual ~FGPrecipitationMgr();
|
||||
|
||||
// SGSubsystem methods
|
||||
virtual void init ();
|
||||
virtual void update (double dt);
|
||||
|
||||
osg::Group * getObject(void);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -71,7 +71,6 @@
|
|||
#include <Time/tmp.hxx>
|
||||
#include <Time/fg_timer.hxx>
|
||||
#include <Environment/environment_mgr.hxx>
|
||||
#include <Environment/precipitation_mgr.hxx>
|
||||
#include <GUI/new_gui.hxx>
|
||||
#include <MultiPlayer/multiplaymgr.hxx>
|
||||
|
||||
|
@ -82,9 +81,6 @@
|
|||
#include "main.hxx"
|
||||
|
||||
|
||||
extern FGPrecipitationMgr *fgPrecipitationMgr;
|
||||
|
||||
|
||||
static double real_delta_time_sec = 0.0;
|
||||
double delta_time_sec = 0.0;
|
||||
extern float init_volume;
|
||||
|
@ -850,11 +846,6 @@ static void fgIdleFunction ( void ) {
|
|||
globals->get_ephem()->getStars(),
|
||||
fgGetNode("/environment", true));
|
||||
|
||||
|
||||
// Precipitation Manager...
|
||||
fgPrecipitationMgr = new FGPrecipitationMgr();
|
||||
|
||||
|
||||
// Initialize MagVar model
|
||||
SGMagVar *magvar = new SGMagVar();
|
||||
globals->set_mag( magvar );
|
||||
|
|
|
@ -387,9 +387,6 @@ public:
|
|||
// Sky structures
|
||||
SGSky *thesky;
|
||||
|
||||
// Precipitations
|
||||
FGPrecipitationMgr *fgPrecipitationMgr;
|
||||
|
||||
static osg::ref_ptr<osg::FrameStamp> mFrameStamp = new osg::FrameStamp;
|
||||
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_DEPTH_TEST, osg::StateAttribute::ON);
|
||||
|
||||
|
||||
// Add Precipitation object
|
||||
sceneGroup->addChild( fgPrecipitationMgr->getObject() );
|
||||
|
||||
|
||||
// need to update the light on every frame
|
||||
osg::LightSource* lightSource = new osg::LightSource;
|
||||
lightSource->setUpdateCallback(new FGLightSourceUpdateCallback);
|
||||
|
@ -788,20 +780,6 @@ FGRenderer::update( bool refresh_camera_settings ) {
|
|||
// fgGetDouble("/velocities/airspeed-kt", 0.0)
|
||||
// * cos( fgGetDouble("/orientation/pitch-deg", 0.0)
|
||||
// * 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
|
||||
// if( is_internal )
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
#include <simgear/math/polar3d.hxx>
|
||||
#include <simgear/math/sg_geodesy.hxx>
|
||||
#include <simgear/math/sg_random.h>
|
||||
#include <simgear/math/SGMath.hxx>
|
||||
#include <simgear/misc/sgstream.hxx>
|
||||
#include <simgear/scene/material/mat.hxx>
|
||||
#include <simgear/scene/material/matlib.hxx>
|
||||
|
@ -165,43 +166,15 @@ FGTileEntry::~FGTileEntry ()
|
|||
{
|
||||
}
|
||||
|
||||
void WorldCoordinate( osg::Matrix& obj_pos, double lat,
|
||||
double lon, double elev, double hdg )
|
||||
static void WorldCoordinate(osg::Matrix& obj_pos, double lat,
|
||||
double lon, double elev, double hdg)
|
||||
{
|
||||
double lon_rad = lon * SGD_DEGREES_TO_RADIANS;
|
||||
double lat_rad = lat * SGD_DEGREES_TO_RADIANS;
|
||||
double hdg_rad = hdg * SGD_DEGREES_TO_RADIANS;
|
||||
|
||||
// setup transforms
|
||||
Point3D geod( lon_rad, lat_rad, elev );
|
||||
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 ;
|
||||
SGGeod geod = SGGeod::fromDegM(lon, lat, elev);
|
||||
obj_pos = geod.makeZUpFrame();
|
||||
// hdg is not a compass heading, but a counter-clockwise rotation
|
||||
// around the Z axis
|
||||
obj_pos.preMult(osg::Matrix::rotate(hdg * SGD_DEGREES_TO_RADIANS,
|
||||
0.0, 0.0, 1.0));
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue