1
0
Fork 0

Minor renderer clean-up & performance bits.

Use non-static methods so we can use member variables.
This commit is contained in:
ThorstenB 2011-05-21 13:22:47 +02:00
parent 2088a61f2f
commit 473d1447c3
4 changed files with 92 additions and 42 deletions

View file

@ -23,8 +23,8 @@
// $Id$ // $Id$
#include "FGMouseInput.hxx" #include "FGMouseInput.hxx"
#include "Main/globals.hxx"
void ActivePickCallbacks::init( int b, const osgGA::GUIEventAdapter* ea ) void ActivePickCallbacks::init( int b, const osgGA::GUIEventAdapter* ea )
{ {
// Get the list of hit callbacks. Take the first callback that // Get the list of hit callbacks. Take the first callback that
@ -33,7 +33,7 @@ void ActivePickCallbacks::init( int b, const osgGA::GUIEventAdapter* ea )
// The nearest one is the first one and the deepest // The nearest one is the first one and the deepest
// (the most specialized one in the scenegraph) is the first. // (the most specialized one in the scenegraph) is the first.
std::vector<SGSceneryPick> pickList; std::vector<SGSceneryPick> pickList;
if (FGRenderer::pick(pickList, ea)) { if (globals->get_renderer()->pick(pickList, ea)) {
std::vector<SGSceneryPick>::const_iterator i; std::vector<SGSceneryPick>::const_iterator i;
for (i = pickList.begin(); i != pickList.end(); ++i) { for (i = pickList.begin(); i != pickList.end(); ++i) {
if (i->callback->buttonPressed(b, i->info)) { if (i->callback->buttonPressed(b, i->info)) {

View file

@ -203,6 +203,7 @@ static void fgMainLoop( void ) {
if (globals->get_tile_mgr()->isSceneryLoaded() if (globals->get_tile_mgr()->isSceneryLoaded()
&& fgGetBool("sim/fdm-initialized")) { && fgGetBool("sim/fdm-initialized")) {
fgSetBool("sim/sceneryloaded",true); fgSetBool("sim/sceneryloaded",true);
fgSplashProgress("");
if (fgGetBool("/sim/sound/working")) { if (fgGetBool("/sim/sound/working")) {
globals->get_soundmgr()->activate(); globals->get_soundmgr()->activate();
} }
@ -555,6 +556,10 @@ static void fgIdleFunction ( void ) {
} }
} }
static void fgWinResizeFunction(int width, int height)
{
globals->get_renderer()->resize(width, height);
}
static void upper_case_property(const char *name) static void upper_case_property(const char *name)
{ {
@ -644,7 +649,7 @@ int fgMainInit( int argc, char **argv ) {
fgOSInit(&argc, argv); fgOSInit(&argc, argv);
_bootstrap_OSInit++; _bootstrap_OSInit++;
fgRegisterWindowResizeHandler( &FGRenderer::resize ); fgRegisterWindowResizeHandler( &fgWinResizeFunction );
fgRegisterIdleHandler( &fgIdleFunction ); fgRegisterIdleHandler( &fgIdleFunction );
fgRegisterDrawHandler( &FGRenderer::update ); fgRegisterDrawHandler( &FGRenderer::update );

View file

@ -128,7 +128,7 @@ public:
hint->setMode(GL_DONT_CARE); hint->setMode(GL_DONT_CARE);
} }
private: private:
SGSharedPtr<SGPropertyNode> mConfigNode; SGPropertyNode_ptr mConfigNode;
}; };
@ -272,7 +272,7 @@ private:
class FGWireFrameModeUpdateCallback : public osg::StateAttribute::Callback { class FGWireFrameModeUpdateCallback : public osg::StateAttribute::Callback {
public: public:
FGWireFrameModeUpdateCallback() : FGWireFrameModeUpdateCallback() :
mWireframe(fgGetNode("/sim/rendering/wireframe")) mWireframe(fgGetNode("/sim/rendering/wireframe", true))
{ } { }
virtual void operator()(osg::StateAttribute* stateAttribute, virtual void operator()(osg::StateAttribute* stateAttribute,
osg::NodeVisitor*) osg::NodeVisitor*)
@ -289,13 +289,13 @@ public:
osg::PolygonMode::FILL); osg::PolygonMode::FILL);
} }
private: private:
SGSharedPtr<SGPropertyNode> mWireframe; SGPropertyNode_ptr mWireframe;
}; };
class FGLightModelUpdateCallback : public osg::StateAttribute::Callback { class FGLightModelUpdateCallback : public osg::StateAttribute::Callback {
public: public:
FGLightModelUpdateCallback() : FGLightModelUpdateCallback() :
mHighlights(fgGetNode("/sim/rendering/specular-highlight")) mHighlights(fgGetNode("/sim/rendering/specular-highlight", true))
{ } { }
virtual void operator()(osg::StateAttribute* stateAttribute, virtual void operator()(osg::StateAttribute* stateAttribute,
osg::NodeVisitor*) osg::NodeVisitor*)
@ -320,13 +320,13 @@ public:
} }
} }
private: private:
SGSharedPtr<SGPropertyNode> mHighlights; SGPropertyNode_ptr mHighlights;
}; };
class FGFogEnableUpdateCallback : public osg::StateSet::Callback { class FGFogEnableUpdateCallback : public osg::StateSet::Callback {
public: public:
FGFogEnableUpdateCallback() : FGFogEnableUpdateCallback() :
mFogEnabled(fgGetNode("/sim/rendering/fog")) mFogEnabled(fgGetNode("/sim/rendering/fog", true))
{ } { }
virtual void operator()(osg::StateSet* stateSet, osg::NodeVisitor*) virtual void operator()(osg::StateSet* stateSet, osg::NodeVisitor*)
{ {
@ -337,7 +337,7 @@ public:
} }
} }
private: private:
SGSharedPtr<SGPropertyNode> mFogEnabled; SGPropertyNode_ptr mFogEnabled;
}; };
class FGFogUpdateCallback : public osg::StateAttribute::Callback { class FGFogUpdateCallback : public osg::StateAttribute::Callback {
@ -387,6 +387,7 @@ FGRenderer::FGRenderer()
jpgRenderFrame = FGRenderer::update; jpgRenderFrame = FGRenderer::update;
#endif #endif
eventHandler = new FGEventHandler; eventHandler = new FGEventHandler;
_splash_screen_active = true;
} }
FGRenderer::~FGRenderer() FGRenderer::~FGRenderer()
@ -409,11 +410,34 @@ FGRenderer::splashinit( void ) {
// visitor automatically. // visitor automatically.
mUpdateVisitor->setFrameStamp(mFrameStamp.get()); mUpdateVisitor->setFrameStamp(mFrameStamp.get());
viewer->setUpdateVisitor(mUpdateVisitor.get()); viewer->setUpdateVisitor(mUpdateVisitor.get());
fgSetDouble("/sim/startup/splash-alpha", 1.0);
} }
void void
FGRenderer::init( void ) FGRenderer::init( void )
{ {
_scenery_loaded = fgGetNode("/sim/sceneryloaded", true);
_scenery_override = fgGetNode("/sim/sceneryloaded-override", true);
_panel_hotspots = fgGetNode("/sim/panel-hotspots", true);
_virtual_cockpit = fgGetNode("/sim/virtual-cockpit", true);
_sim_delta_sec = fgGetNode("/sim/time/delta-sec", true);
_xsize = fgGetNode("/sim/startup/xsize", true);
_ysize = fgGetNode("/sim/startup/ysize", true);
_skyblend = fgGetNode("/sim/rendering/skyblend", true);
_point_sprites = fgGetNode("/sim/rendering/point-sprites", true);
_enhanced_lighting = fgGetNode("/sim/rendering/enhanced-lighting", true);
_distance_attenuation = fgGetNode("/sim/rendering/distance-attenuation", true);
_horizon_effect = fgGetNode("/sim/rendering/horizon-effect", true);
_textures = fgGetNode("/sim/rendering/textures", true);
_altitude_ft = fgGetNode("/position/altitude-ft", true);
_cloud_status = fgGetNode("/environment/clouds/status", true);
_visibility_m = fgGetNode("/environment/visibility-m", true);
osgViewer::Viewer* viewer = globals->get_renderer()->getViewer(); osgViewer::Viewer* viewer = globals->get_renderer()->getViewer();
osg::initNotifyLevel(); osg::initNotifyLevel();
@ -557,27 +581,39 @@ FGRenderer::init( void )
stateSet->setAttributeAndModes(new osg::Program, osg::StateAttribute::ON); stateSet->setAttributeAndModes(new osg::Program, osg::StateAttribute::ON);
} }
void
FGRenderer::update()
{
globals->get_renderer()->update(true);
}
// Update all Visuals (redraws anything graphics related) // Update all Visuals (redraws anything graphics related)
void void
FGRenderer::update( bool refresh_camera_settings ) { FGRenderer::update( bool refresh_camera_settings ) {
bool scenery_loaded = fgGetBool("sim/sceneryloaded", false) if ((!_scenery_loaded.get())||
|| fgGetBool("sim/sceneryloaded-override"); !(_scenery_loaded->getBoolValue() ||
_scenery_override->getBoolValue()))
{
// alas, first "update" is being called before "init"...
fgSetDouble("/sim/startup/splash-alpha", 1.0);
_splash_screen_active = true;
return;
}
osgViewer::Viewer* viewer = globals->get_renderer()->getViewer(); osgViewer::Viewer* viewer = globals->get_renderer()->getViewer();
if (!scenery_loaded) {
fgSetDouble("/sim/startup/splash-alpha", 1.0); if (_splash_screen_active)
return; {
// Fade out the splash screen
double sAlpha = SGMiscd::max(0, (2.5 - globals->get_sim_time_sec()) / 2.5);
_splash_screen_active = (sAlpha > 0.0);
fgSetDouble("/sim/startup/splash-alpha", sAlpha);
} }
// Fade out the splash screen over the first three seconds. bool skyblend = _skyblend->getBoolValue();
double sAlpha = SGMiscd::max(0, (2.5 - globals->get_sim_time_sec()) / 2.5); bool use_point_sprites = _point_sprites->getBoolValue();
fgSetDouble("/sim/startup/splash-alpha", sAlpha); bool enhanced_lighting = _enhanced_lighting->getBoolValue();
bool distance_attenuation = _distance_attenuation->getBoolValue();
bool skyblend = fgGetBool("/sim/rendering/skyblend");
bool use_point_sprites = fgGetBool("/sim/rendering/point-sprites");
bool enhanced_lighting = fgGetBool("/sim/rendering/enhanced-lighting");
bool distance_attenuation
= fgGetBool("/sim/rendering/distance-attenuation");
// OSGFIXME // OSGFIXME
SGConfigureDirectionalLights( use_point_sprites, enhanced_lighting, SGConfigureDirectionalLights( use_point_sprites, enhanced_lighting,
distance_attenuation ); distance_attenuation );
@ -586,10 +622,10 @@ FGRenderer::update( bool refresh_camera_settings ) {
// update fog params // update fog params
double actual_visibility; double actual_visibility;
if (fgGetBool("/environment/clouds/status")) { if (_cloud_status->getBoolValue()) {
actual_visibility = thesky->get_visibility(); actual_visibility = thesky->get_visibility();
} else { } else {
actual_visibility = fgGetDouble("/environment/visibility-m"); actual_visibility = _visibility_m->getDoubleValue();
} }
// idle_state is now 1000 meaning we've finished all our // idle_state is now 1000 meaning we've finished all our
@ -602,14 +638,14 @@ FGRenderer::update( bool refresh_camera_settings ) {
if ( refresh_camera_settings ) { if ( refresh_camera_settings ) {
// update view port // update view port
resize( fgGetInt("/sim/startup/xsize"), resize( _xsize->getIntValue(),
fgGetInt("/sim/startup/ysize") ); _ysize->getIntValue() );
} }
osg::Camera *camera = viewer->getCamera(); osg::Camera *camera = viewer->getCamera();
if ( skyblend ) { if ( skyblend ) {
if ( fgGetBool("/sim/rendering/textures") ) { if ( _textures->getBoolValue() ) {
SGVec4f clearColor(l->adj_fog_color()); SGVec4f clearColor(l->adj_fog_color());
camera->setClearColor(toOsg(clearColor)); camera->setClearColor(toOsg(clearColor));
} }
@ -619,10 +655,10 @@ FGRenderer::update( bool refresh_camera_settings ) {
} }
// update fog params if visibility has changed // update fog params if visibility has changed
double visibility_meters = fgGetDouble("/environment/visibility-m"); double visibility_meters = _visibility_m->getDoubleValue();
thesky->set_visibility(visibility_meters); thesky->set_visibility(visibility_meters);
double altitude_m = fgGetDouble("/position/altitude-ft") * SG_FEET_TO_METER; double altitude_m = _altitude_ft->getDoubleValue() * SG_FEET_TO_METER;
thesky->modify_vis( altitude_m, 0.0 /* time factor, now unused */); thesky->modify_vis( altitude_m, 0.0 /* time factor, now unused */);
// update the sky dome // update the sky dome
@ -635,7 +671,7 @@ FGRenderer::update( bool refresh_camera_settings ) {
// Sun distance: 150,000,000 kilometers // Sun distance: 150,000,000 kilometers
double sun_horiz_eff, moon_horiz_eff; double sun_horiz_eff, moon_horiz_eff;
if (fgGetBool("/sim/rendering/horizon-effect")) { if (_horizon_effect->getBoolValue()) {
sun_horiz_eff sun_horiz_eff
= 0.67 + pow(osg::clampAbove(0.5 + cos(l->get_sun_angle()), = 0.67 + pow(osg::clampAbove(0.5 + cos(l->get_sun_angle()),
0.0), 0.0),
@ -666,7 +702,7 @@ FGRenderer::update( bool refresh_camera_settings ) {
scolor.sun_angle = l->get_sun_angle(); scolor.sun_angle = l->get_sun_angle();
scolor.moon_angle = l->get_moon_angle(); scolor.moon_angle = l->get_moon_angle();
double delta_time_sec = fgGetDouble("/sim/time/delta-sec"); double delta_time_sec = _sim_delta_sec->getDoubleValue();
thesky->reposition( sstate, *globals->get_ephem(), delta_time_sec ); thesky->reposition( sstate, *globals->get_ephem(), delta_time_sec );
thesky->repaint( scolor, *globals->get_ephem() ); thesky->repaint( scolor, *globals->get_ephem() );
@ -712,11 +748,10 @@ FGRenderer::update( bool refresh_camera_settings ) {
l->get_sun_angle()*SGD_RADIANS_TO_DEGREES); l->get_sun_angle()*SGD_RADIANS_TO_DEGREES);
mUpdateVisitor->setVisibility(actual_visibility); mUpdateVisitor->setVisibility(actual_visibility);
simgear::GroundLightManager::instance()->update(mUpdateVisitor.get()); simgear::GroundLightManager::instance()->update(mUpdateVisitor.get());
bool hotspots = fgGetBool("/sim/panel-hotspots");
osg::Node::NodeMask cullMask = ~simgear::LIGHTS_BITS & ~simgear::PICK_BIT; osg::Node::NodeMask cullMask = ~simgear::LIGHTS_BITS & ~simgear::PICK_BIT;
cullMask |= simgear::GroundLightManager::instance() cullMask |= simgear::GroundLightManager::instance()
->getLightNodeMask(mUpdateVisitor.get()); ->getLightNodeMask(mUpdateVisitor.get());
if (hotspots) if (_panel_hotspots->getBoolValue())
cullMask |= simgear::PICK_BIT; cullMask |= simgear::PICK_BIT;
CameraGroup::getDefault()->setCameraCullMasks(cullMask); CameraGroup::getDefault()->setCameraCullMasks(cullMask);
} }
@ -729,7 +764,7 @@ void
FGRenderer::resize( int width, int height ) { FGRenderer::resize( int width, int height ) {
int view_h; int view_h;
if ( (!fgGetBool("/sim/virtual-cockpit")) if ( (!_virtual_cockpit->getBoolValue())
&& fgPanelVisible() && idle_state == 1000 ) { && fgPanelVisible() && idle_state == 1000 ) {
view_h = (int)(height * (globals->get_current_panel()->getViewHeight() - view_h = (int)(height * (globals->get_current_panel()->getViewHeight() -
globals->get_current_panel()->getYOffset()) / 768.0); globals->get_current_panel()->getYOffset()) / 768.0);
@ -740,9 +775,9 @@ FGRenderer::resize( int width, int height ) {
static int lastwidth = 0; static int lastwidth = 0;
static int lastheight = 0; static int lastheight = 0;
if (width != lastwidth) if (width != lastwidth)
fgSetInt("/sim/startup/xsize", lastwidth = width); _xsize->setIntValue(lastwidth = width);
if (height != lastheight) if (height != lastheight)
fgSetInt("/sim/startup/ysize", lastheight = height); _ysize->setIntValue(lastheight = height);
// for all views // for all views
FGViewMgr *viewmgr = globals->get_viewmgr(); FGViewMgr *viewmgr = globals->get_viewmgr();

View file

@ -3,6 +3,7 @@
#define __FG_RENDERER_HXX 1 #define __FG_RENDERER_HXX 1
#include <simgear/scene/util/SGPickCallback.hxx> #include <simgear/scene/util/SGPickCallback.hxx>
#include <simgear/props/props.hxx>
#include <osg/ref_ptr> #include <osg/ref_ptr>
@ -45,18 +46,18 @@ public:
void splashinit(); void splashinit();
void init(); void init();
static void resize(int width, int height ); void resize(int width, int height );
// calling update( refresh_camera_settings = false ) will not // calling update( refresh_camera_settings = false ) will not
// touch window or camera settings. This is useful for the tiled // touch window or camera settings. This is useful for the tiled
// renderer which needs to set the view frustum itself. // renderer which needs to set the view frustum itself.
static void update( bool refresh_camera_settings ); void update( bool refresh_camera_settings);
inline static void update() { update( true ); } static void update();
/** Just pick into the scene and return the pick callbacks on the way ... /** Just pick into the scene and return the pick callbacks on the way ...
*/ */
static bool pick( std::vector<SGSceneryPick>& pickList, bool pick( std::vector<SGSceneryPick>& pickList,
const osgGA::GUIEventAdapter* ea ); const osgGA::GUIEventAdapter* ea );
/** Get and set the OSG Viewer object, if any. /** Get and set the OSG Viewer object, if any.
*/ */
@ -76,6 +77,15 @@ public:
protected: protected:
osg::ref_ptr<osgViewer::Viewer> viewer; osg::ref_ptr<osgViewer::Viewer> viewer;
osg::ref_ptr<flightgear::FGEventHandler> eventHandler; osg::ref_ptr<flightgear::FGEventHandler> eventHandler;
SGPropertyNode_ptr _scenery_loaded,_scenery_override;
SGPropertyNode_ptr _skyblend;
SGPropertyNode_ptr _point_sprites, _enhanced_lighting, _distance_attenuation;
SGPropertyNode_ptr _textures;
SGPropertyNode_ptr _cloud_status, _visibility_m;
SGPropertyNode_ptr _xsize, _ysize;
SGPropertyNode_ptr _panel_hotspots, _sim_delta_sec, _horizon_effect, _altitude_ft;
SGPropertyNode_ptr _virtual_cockpit;
bool _splash_screen_active;
}; };
bool fgDumpSceneGraphToFile(const char* filename); bool fgDumpSceneGraphToFile(const char* filename);