]> git.mxchange.org Git - flightgear.git/commitdiff
Modified Files:
authorfrohlich <frohlich>
Wed, 15 Nov 2006 06:07:42 +0000 (06:07 +0000)
committerfrohlich <frohlich>
Wed, 15 Nov 2006 06:07:42 +0000 (06:07 +0000)
src/Main/renderer.cxx src/Cockpit/panel.cxx: Move some more into
simple scenegraph wrappers. That fixes current problems with
invisible panels.

src/Cockpit/panel.cxx
src/Main/renderer.cxx

index c2f6f997f51426a7d5807bddc4bb49879a79d446..90ee33b1d15659e1eec96db5a03a36d0ee497eae 100644 (file)
@@ -370,11 +370,12 @@ FGPanel::draw(osg::State& state)
     panelStateSet->setAttribute(material);
     panelStateSet->setMode(GL_CULL_FACE, osg::StateAttribute::ON);
     panelStateSet->setAttributeAndModes(new osg::CullFace(osg::CullFace::BACK));
-    if ( _enable_depth_test )
-      panelStateSet->setAttributeAndModes(new osg::Depth(osg::Depth::ALWAYS));
-    else
-      panelStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
+    panelStateSet->setAttributeAndModes(new osg::Depth(osg::Depth::LEQUAL));
   }
+  if ( _enable_depth_test )
+    panelStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
+  else
+    panelStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
   state.pushStateSet(panelStateSet.get());
   state.apply();
 
@@ -470,15 +471,25 @@ FGPanel::draw(osg::State& state)
   // Draw yellow "hotspots" if directed to.  This is a panel authoring
   // feature; not intended to be high performance or to look good.
   if ( fgGetBool("/sim/panel-hotspots") ) {
-    static osg::ref_ptr<osg::StateSet> hotspotStateSet = new osg::StateSet;
-    hotspotStateSet->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::OFF);
+    static osg::ref_ptr<osg::StateSet> hotspotStateSet;
+    if (!hotspotStateSet.valid()) {
+      hotspotStateSet = new osg::StateSet;
+      hotspotStateSet->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::OFF);
+      hotspotStateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
+    }
+
     state.pushStateSet(hotspotStateSet.get());
     state.apply();
-  
+
+    glPushAttrib(GL_ENABLE_BIT);
+    glDisable(GL_COLOR_MATERIAL);
     glColor3f(1, 1, 0);
     
     for ( unsigned int i = 0; i < _instruments.size(); i++ )
       _instruments[i]->drawHotspots(state);
+
+    glPopAttrib();
+
     state.popStateSet();
     state.apply();
   }
index 57f3bdefd85baee38004c59570dafe0fb2248102..9ff0b45efcdd34d32b400c4cfce8294970d6927b 100644 (file)
@@ -111,6 +111,7 @@ public:
     setUseDisplayList(false);
 
     osg::StateSet* stateSet = getOrCreateStateSet();
+    stateSet->setRenderBinDetails(1001, "RenderBin");
     // speed optimization?
     stateSet->setMode(GL_CULL_FACE, osg::StateAttribute::OFF);
     // We can do translucent menus, so why not. :-)
@@ -124,7 +125,28 @@ public:
   virtual void drawImplementation(osg::State& state) const
   {
     state.pushStateSet(getStateSet());
+    state.apply();
+
+
+    if((fgGetBool("/sim/atc/enabled"))
+       || (fgGetBool("/sim/ai-traffic/enabled")))
+      globals->get_ATC_display()->update(delta_time_sec, state);
+
+
     puDisplay();
+
+    // Fade out the splash screen over the first three seconds.
+    double t = globals->get_sim_time_sec();
+    if (t <= 2.5) {
+      glPushAttrib(GL_ALL_ATTRIB_BITS);
+      glPushClientAttrib(~0u);
+
+      fgSplashUpdate((2.5 - t) / 2.5);
+
+      glPopClientAttrib();
+      glPopAttrib();
+    }
+
     state.popStateSet();
   }
 
@@ -134,6 +156,56 @@ public:
 private:
 };
 
+class SGHUDAndPanelDrawable : public osg::Drawable {
+public:
+  SGHUDAndPanelDrawable()
+  {
+    // Dynamic stuff, do not store geometry
+    setUseDisplayList(false);
+
+    osg::StateSet* stateSet = getOrCreateStateSet();
+    stateSet->setRenderBinDetails(1000, "RenderBin");
+
+    // speed optimization?
+    stateSet->setMode(GL_CULL_FACE, osg::StateAttribute::OFF);
+    stateSet->setAttribute(new osg::BlendFunc(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA));
+    stateSet->setMode(GL_BLEND, osg::StateAttribute::ON);
+    stateSet->setMode(GL_FOG, osg::StateAttribute::OFF);
+    stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
+  }
+  virtual void drawImplementation(osg::State& state) const
+  {
+    state.pushStateSet(getStateSet());
+    state.apply();
+
+    glPushAttrib(GL_ALL_ATTRIB_BITS);
+    glPushClientAttrib(~0u);
+
+    fgCockpitUpdate(&state);
+
+    FGInstrumentMgr *instr = static_cast<FGInstrumentMgr*>(globals->get_subsystem("instrumentation"));
+    HUD *hud = static_cast<HUD*>(instr->get_subsystem("hud"));
+    hud->draw(state);
+
+    // update the panel subsystem
+    if ( globals->get_current_panel() != NULL )
+        globals->get_current_panel()->update(state);
+    // We don't need a state here - can be safely removed when we can pick
+    // correctly
+    fgUpdate3DPanels();
+
+    glPopClientAttrib();
+    glPopAttrib();
+
+    state.popStateSet();
+  }
+
+  virtual osg::Object* cloneType() const { return new SGHUDAndPanelDrawable; }
+  virtual osg::Object* clone(const osg::CopyOp&) const { return new SGHUDAndPanelDrawable; }
+  
+private:
+};
+
 
 class FGSunLightUpdateCallback : public osg::StateAttribute::Callback {
 public:
@@ -406,6 +478,7 @@ FGRenderer::init( void ) {
     mRoot->addChild(guiCamera);
     osg::Geode* geode = new osg::Geode;
     geode->addDrawable(new SGPuDrawable);
+    geode->addDrawable(new SGHUDAndPanelDrawable);
     guiCamera->addChild(geode);
 
     mSceneCamera->addChild(globals->get_scenery()->get_scene_graph());
@@ -453,8 +526,14 @@ FGRenderer::update( bool refresh_camera_settings ) {
 
     if ( idle_state < 1000 || !scenery_loaded ) {
         // still initializing, draw the splash screen
+        glPushAttrib(GL_ALL_ATTRIB_BITS);
+        glPushClientAttrib(~0u);
+
         fgSplashUpdate(1.0);
 
+        glPopClientAttrib();
+        glPopAttrib();
+
         // Keep resetting sim time while the sim is initializing
         globals->set_sim_time_sec( 0.0 );
         return;
@@ -707,45 +786,6 @@ FGRenderer::update( bool refresh_camera_settings ) {
     sceneView->update();
     sceneView->cull();
     sceneView->draw();
-
-    glPushAttrib(GL_ALL_ATTRIB_BITS);
-    glPushClientAttrib(~0u);
-
-    // display HUD && Panel
-    glDisable( GL_FOG );
-    glDisable( GL_DEPTH_TEST );
-
-    fgCockpitUpdate(sceneView->getState());
-
-    FGInstrumentMgr *instr = static_cast<FGInstrumentMgr*>(globals->get_subsystem("instrumentation"));
-    HUD *hud = static_cast<HUD*>(instr->get_subsystem("hud"));
-    hud->draw(*sceneView->getState());
-
-    // update the panel subsystem
-    if ( globals->get_current_panel() != NULL )
-        globals->get_current_panel()->update(*sceneView->getState());
-    // We don't need a state here - can be safely removed when we can pick
-    // correctly
-    fgUpdate3DPanels();
-
-    if((fgGetBool("/sim/atc/enabled"))
-       || (fgGetBool("/sim/ai-traffic/enabled")))
-      globals->get_ATC_display()->update(delta_time_sec,
-                                         *sceneView->getState());
-
-    // We can do translucent menus, so why not. :-)
-    glDisable( GL_TEXTURE_2D ) ;
-    glDisable( GL_CULL_FACE ) ;
-    glEnable( GL_BLEND ) ;
-    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
-
-    // Fade out the splash screen over the first three seconds.
-    double t = globals->get_sim_time_sec();
-    if (t <= 2.5)
-        fgSplashUpdate((2.5 - t) / 2.5);
-
-    glPopClientAttrib();
-    glPopAttrib();
 }