]> git.mxchange.org Git - flightgear.git/commitdiff
Minor renderer clean-up & performance bits.
authorThorstenB <brehmt@gmail.com>
Sat, 21 May 2011 11:22:47 +0000 (13:22 +0200)
committerThorstenB <brehmt@gmail.com>
Sat, 21 May 2011 11:24:23 +0000 (13:24 +0200)
Use non-static methods so we can use member variables.

src/Input/FGMouseInput.cxx
src/Main/main.cxx
src/Main/renderer.cxx
src/Main/renderer.hxx

index 8ab430653589579b8556edc0fbe7c034a4c0ad8a..9a0d13abbe92eb4a1cd6e93ec95de19ab8c46240 100644 (file)
@@ -23,8 +23,8 @@
 // $Id$
 
 #include "FGMouseInput.hxx"
+#include "Main/globals.hxx"
 
-\f
 void ActivePickCallbacks::init( int b, const osgGA::GUIEventAdapter* ea )
 {
   // 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 most specialized one in the scenegraph) is the first.
   std::vector<SGSceneryPick> pickList;
-  if (FGRenderer::pick(pickList, ea)) {
+  if (globals->get_renderer()->pick(pickList, ea)) {
     std::vector<SGSceneryPick>::const_iterator i;
     for (i = pickList.begin(); i != pickList.end(); ++i) {
       if (i->callback->buttonPressed(b, i->info)) {
index 6c7b8a7e1ce962164d18729ac02f0fee39daaaeb..e66ffe242e9e4a8b0df24e1cf6548cb4d3bf1ea5 100644 (file)
@@ -203,6 +203,7 @@ static void fgMainLoop( void ) {
         if (globals->get_tile_mgr()->isSceneryLoaded()
              && fgGetBool("sim/fdm-initialized")) {
             fgSetBool("sim/sceneryloaded",true);
+            fgSplashProgress("");
             if (fgGetBool("/sim/sound/working")) {
                 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)
 {
@@ -644,7 +649,7 @@ int fgMainInit( int argc, char **argv ) {
     fgOSInit(&argc, argv);
     _bootstrap_OSInit++;
 
-    fgRegisterWindowResizeHandler( &FGRenderer::resize );
+    fgRegisterWindowResizeHandler( &fgWinResizeFunction );
     fgRegisterIdleHandler( &fgIdleFunction );
     fgRegisterDrawHandler( &FGRenderer::update );
 
index dfa3bb45b7859b52e6b017f451dcf3d0d3360ab9..055a33aba18228421321171d80ac6f329903d586 100644 (file)
@@ -128,7 +128,7 @@ public:
       hint->setMode(GL_DONT_CARE);
   }
 private:
-  SGSharedPtr<SGPropertyNode> mConfigNode;
+  SGPropertyNode_ptr mConfigNode;
 };
 
 
@@ -272,7 +272,7 @@ private:
 class FGWireFrameModeUpdateCallback : public osg::StateAttribute::Callback {
 public:
   FGWireFrameModeUpdateCallback() :
-    mWireframe(fgGetNode("/sim/rendering/wireframe"))
+    mWireframe(fgGetNode("/sim/rendering/wireframe", true))
   { }
   virtual void operator()(osg::StateAttribute* stateAttribute,
                           osg::NodeVisitor*)
@@ -289,13 +289,13 @@ public:
                            osg::PolygonMode::FILL);
   }
 private:
-  SGSharedPtr<SGPropertyNode> mWireframe;
+  SGPropertyNode_ptr mWireframe;
 };
 
 class FGLightModelUpdateCallback : public osg::StateAttribute::Callback {
 public:
   FGLightModelUpdateCallback() :
-    mHighlights(fgGetNode("/sim/rendering/specular-highlight"))
+    mHighlights(fgGetNode("/sim/rendering/specular-highlight", true))
   { }
   virtual void operator()(osg::StateAttribute* stateAttribute,
                           osg::NodeVisitor*)
@@ -320,13 +320,13 @@ public:
     }
   }
 private:
-  SGSharedPtr<SGPropertyNode> mHighlights;
+  SGPropertyNode_ptr mHighlights;
 };
 
 class FGFogEnableUpdateCallback : public osg::StateSet::Callback {
 public:
   FGFogEnableUpdateCallback() :
-    mFogEnabled(fgGetNode("/sim/rendering/fog"))
+    mFogEnabled(fgGetNode("/sim/rendering/fog", true))
   { }
   virtual void operator()(osg::StateSet* stateSet, osg::NodeVisitor*)
   {
@@ -337,7 +337,7 @@ public:
     }
   }
 private:
-  SGSharedPtr<SGPropertyNode> mFogEnabled;
+  SGPropertyNode_ptr mFogEnabled;
 };
 
 class FGFogUpdateCallback : public osg::StateAttribute::Callback {
@@ -387,6 +387,7 @@ FGRenderer::FGRenderer()
    jpgRenderFrame = FGRenderer::update;
 #endif
    eventHandler = new FGEventHandler;
+   _splash_screen_active = true;
 }
 
 FGRenderer::~FGRenderer()
@@ -409,11 +410,34 @@ FGRenderer::splashinit( void ) {
     // visitor automatically.
     mUpdateVisitor->setFrameStamp(mFrameStamp.get());
     viewer->setUpdateVisitor(mUpdateVisitor.get());
+    fgSetDouble("/sim/startup/splash-alpha", 1.0);
 }
 
 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();
     osg::initNotifyLevel();
 
@@ -557,27 +581,39 @@ FGRenderer::init( void )
     stateSet->setAttributeAndModes(new osg::Program, osg::StateAttribute::ON);
 }
 
+void
+FGRenderer::update()
+{
+    globals->get_renderer()->update(true);
+}
 
 // Update all Visuals (redraws anything graphics related)
 void
 FGRenderer::update( bool refresh_camera_settings ) {
-    bool scenery_loaded = fgGetBool("sim/sceneryloaded", false)
-                          || fgGetBool("sim/sceneryloaded-override");
+    if ((!_scenery_loaded.get())||
+         !(_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();
-    if (!scenery_loaded) {
-      fgSetDouble("/sim/startup/splash-alpha", 1.0);
-      return;
+
+    if (_splash_screen_active)
+    {
+        // 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.
-    double sAlpha = SGMiscd::max(0, (2.5 - globals->get_sim_time_sec()) / 2.5);
-    fgSetDouble("/sim/startup/splash-alpha", sAlpha);
+    bool skyblend = _skyblend->getBoolValue();
+    bool use_point_sprites = _point_sprites->getBoolValue();
+    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
     SGConfigureDirectionalLights( use_point_sprites, enhanced_lighting,
                                   distance_attenuation );
@@ -586,10 +622,10 @@ FGRenderer::update( bool refresh_camera_settings ) {
 
     // update fog params
     double actual_visibility;
-    if (fgGetBool("/environment/clouds/status")) {
+    if (_cloud_status->getBoolValue()) {
         actual_visibility = thesky->get_visibility();
     } else {
-        actual_visibility = fgGetDouble("/environment/visibility-m");
+        actual_visibility = _visibility_m->getDoubleValue();
     }
 
     // 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 ) {
         // update view port
-        resize( fgGetInt("/sim/startup/xsize"),
-                fgGetInt("/sim/startup/ysize") );
+        resize( _xsize->getIntValue(),
+                _ysize->getIntValue() );
     }
     osg::Camera *camera = viewer->getCamera();
 
     if ( skyblend ) {
        
-        if ( fgGetBool("/sim/rendering/textures") ) {
+        if ( _textures->getBoolValue() ) {
             SGVec4f clearColor(l->adj_fog_color());
             camera->setClearColor(toOsg(clearColor));
         }
@@ -619,10 +655,10 @@ FGRenderer::update( bool refresh_camera_settings ) {
     }
 
     // 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);
 
-    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 */);
 
     // update the sky dome
@@ -635,7 +671,7 @@ FGRenderer::update( bool refresh_camera_settings ) {
         // Sun distance: 150,000,000 kilometers
 
         double sun_horiz_eff, moon_horiz_eff;
-        if (fgGetBool("/sim/rendering/horizon-effect")) {
+        if (_horizon_effect->getBoolValue()) {
             sun_horiz_eff
                 = 0.67 + pow(osg::clampAbove(0.5 + cos(l->get_sun_angle()),
                                              0.0),
@@ -666,7 +702,7 @@ FGRenderer::update( bool refresh_camera_settings ) {
         scolor.sun_angle   = l->get_sun_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->repaint( scolor, *globals->get_ephem() );
 
@@ -712,11 +748,10 @@ FGRenderer::update( bool refresh_camera_settings ) {
                              l->get_sun_angle()*SGD_RADIANS_TO_DEGREES);
     mUpdateVisitor->setVisibility(actual_visibility);
     simgear::GroundLightManager::instance()->update(mUpdateVisitor.get());
-    bool hotspots = fgGetBool("/sim/panel-hotspots");
     osg::Node::NodeMask cullMask = ~simgear::LIGHTS_BITS & ~simgear::PICK_BIT;
     cullMask |= simgear::GroundLightManager::instance()
         ->getLightNodeMask(mUpdateVisitor.get());
-    if (hotspots)
+    if (_panel_hotspots->getBoolValue())
         cullMask |= simgear::PICK_BIT;
     CameraGroup::getDefault()->setCameraCullMasks(cullMask);
 }
@@ -729,7 +764,7 @@ void
 FGRenderer::resize( int width, int height ) {
     int view_h;
 
-    if ( (!fgGetBool("/sim/virtual-cockpit"))
+    if ( (!_virtual_cockpit->getBoolValue())
          && fgPanelVisible() && idle_state == 1000 ) {
         view_h = (int)(height * (globals->get_current_panel()->getViewHeight() -
                              globals->get_current_panel()->getYOffset()) / 768.0);
@@ -740,9 +775,9 @@ FGRenderer::resize( int width, int height ) {
     static int lastwidth = 0;
     static int lastheight = 0;
     if (width != lastwidth)
-        fgSetInt("/sim/startup/xsize", lastwidth = width);
+        _xsize->setIntValue(lastwidth = width);
     if (height != lastheight)
-        fgSetInt("/sim/startup/ysize", lastheight = height);
+        _ysize->setIntValue(lastheight = height);
 
     // for all views
     FGViewMgr *viewmgr = globals->get_viewmgr();
index 2ed51be1a71858eb9f2b63cbf608aa6aeaf5afdf..3d7133e02c9f899477192e41feb679d97f55f041 100644 (file)
@@ -3,6 +3,7 @@
 #define __FG_RENDERER_HXX 1
 
 #include <simgear/scene/util/SGPickCallback.hxx>
+#include <simgear/props/props.hxx>
 
 #include <osg/ref_ptr>
 
@@ -45,18 +46,18 @@ public:
     void splashinit();
     void init();
 
-    static void resize(int width, int height );
+    void resize(int width, int height );
 
     // calling update( refresh_camera_settings = false ) will not
     // touch window or camera settings.  This is useful for the tiled
     // renderer which needs to set the view frustum itself.
-    static void update( bool refresh_camera_settings );
-    inline static void update() { update( true ); }
+    void update( bool refresh_camera_settings);
+    static void update();
 
     /** Just pick into the scene and return the pick callbacks on the way ...
      */
-    static bool pick( std::vector<SGSceneryPick>& pickList,
-                      const osgGA::GUIEventAdapter* ea );
+    bool pick( std::vector<SGSceneryPick>& pickList,
+               const osgGA::GUIEventAdapter* ea );
 
     /** Get and set the OSG Viewer object, if any.
      */
@@ -76,6 +77,15 @@ public:
 protected:
     osg::ref_ptr<osgViewer::Viewer> viewer;
     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);