From: frohlich Date: Sun, 12 Nov 2006 12:38:57 +0000 (+0000) Subject: Modified Files: X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=29778f14968da07376a734a9105348c6d5d1b6ca;p=flightgear.git Modified Files: src/Main/main.cxx src/Main/renderer.cxx: Avoid an extra clear of of the color buffer. --- diff --git a/src/Main/main.cxx b/src/Main/main.cxx index 66963c2b5..e90777a83 100644 --- a/src/Main/main.cxx +++ b/src/Main/main.cxx @@ -613,13 +613,6 @@ static void fgMainLoop( void ) { globals->get_soundmgr()->set_volume(init_volume); } - // OSGFIXME: with osg>1.2 remove this, osg::LightModel does the trick... -// if (fgGetBool("/sim/rendering/specular-highlight")) { -// glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); -// } else { -// glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR); -// } - fgRequestRedraw(); SG_LOG( SG_ALL, SG_DEBUG, "" ); diff --git a/src/Main/renderer.cxx b/src/Main/renderer.cxx index 1e0569701..5ef05948b 100644 --- a/src/Main/renderer.cxx +++ b/src/Main/renderer.cxx @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include @@ -102,6 +103,37 @@ #include "renderer.hxx" #include "main.hxx" +class SGPuDrawable : public osg::Drawable { +public: + SGPuDrawable() + { + // Dynamic stuff, do not store geometry + setUseDisplayList(false); + + osg::StateSet* stateSet = getOrCreateStateSet(); + // speed optimization? + stateSet->setMode(GL_CULL_FACE, osg::StateAttribute::OFF); + // We can do translucent menus, so why not. :-) + stateSet->setAttribute(new osg::BlendFunc(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA)); + stateSet->setMode(GL_BLEND, osg::StateAttribute::ON); + stateSet->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::OFF); + + 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()); + puDisplay(); + state.popStateSet(); + } + + virtual osg::Object* cloneType() const { return new SGPuDrawable; } + virtual osg::Object* clone(const osg::CopyOp&) const { return new SGPuDrawable; } + +private: +}; + class FGSunLightUpdateCallback : public osg::StateAttribute::Callback { public: @@ -280,10 +312,11 @@ FGRenderer::init( void ) { 1, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 1)); - - sceneView->getCamera()->setClearMask(0); + sceneView->getCamera()->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR); + sceneView->getCamera()->setClearMask(GL_COLOR_BUFFER_BIT); osg::StateSet* stateSet = mRoot->getOrCreateStateSet(); + stateSet->setRenderingHint(osg::StateSet::OPAQUE_BIN); stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF); @@ -300,9 +333,13 @@ FGRenderer::init( void ) { // this will be set below stateSet->setMode(GL_NORMALIZE, osg::StateAttribute::OFF); -// osg::Material* material = new osg::Material; -// stateSet->setAttribute(material); + osg::Material* material = new osg::Material; + stateSet->setAttribute(material); + stateSet->setTextureAttribute(0, new osg::TexEnv); + stateSet->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::OFF); + + // stateSet->setAttribute(new osg::CullFace(osg::CullFace::BACK)); // stateSet->setMode(GL_CULL_FACE, osg::StateAttribute::ON); @@ -318,7 +355,7 @@ FGRenderer::init( void ) { // this is the topmost scenegraph node for osg mBackGroundCamera->addChild(thesky->getPreRoot()); - mBackGroundCamera->setClearMask(GL_COLOR_BUFFER_BIT); + mBackGroundCamera->setClearMask(0); GLbitfield inheritanceMask = osg::CullSettings::ALL_VARIABLES; inheritanceMask &= ~osg::CullSettings::COMPUTE_NEAR_FAR_MODE; @@ -332,9 +369,6 @@ FGRenderer::init( void ) { mRoot->addChild(mBackGroundCamera.get()); - - sceneView->getCamera()->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR); - mSceneCamera->setClearMask(GL_DEPTH_BUFFER_BIT); inheritanceMask = osg::CullSettings::ALL_VARIABLES; inheritanceMask &= ~osg::CullSettings::COMPUTE_NEAR_FAR_MODE; @@ -361,6 +395,21 @@ FGRenderer::init( void ) { mRoot->addChild(mSceneCamera.get()); + // plug in the GUI + osg::CameraNode* guiCamera = new osg::CameraNode; + guiCamera->setRenderOrder(osg::CameraNode::POST_RENDER); + guiCamera->setClearMask(0); + inheritanceMask = osg::CullSettings::ALL_VARIABLES; + inheritanceMask &= ~osg::CullSettings::COMPUTE_NEAR_FAR_MODE; + inheritanceMask &= ~osg::CullSettings::CULLING_MODE; + guiCamera->setInheritanceMask(inheritanceMask); + guiCamera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR); + guiCamera->setCullingMode(osg::CullSettings::NO_CULLING); + mRoot->addChild(guiCamera); + osg::Geode* geode = new osg::Geode; + geode->addDrawable(new SGPuDrawable); + guiCamera->addChild(geode); + mSceneCamera->addChild(globals->get_scenery()->get_scene_graph()); stateSet = mSceneCamera->getOrCreateStateSet(); @@ -479,11 +528,11 @@ FGRenderer::update( bool refresh_camera_settings ) { if ( skyblend ) { if ( fgGetBool("/sim/rendering/textures") ) { SGVec4f clearColor(l->adj_fog_color()); - mBackGroundCamera->setClearColor(clearColor.osg()); + sceneView->getCamera()->setClearColor(clearColor.osg()); } } else { SGVec4f clearColor(l->sky_color()); - mBackGroundCamera->setClearColor(clearColor.osg()); + sceneView->getCamera()->setClearColor(clearColor.osg()); } // update fog params if visibility has changed @@ -691,7 +740,6 @@ FGRenderer::update( bool refresh_camera_settings ) { glDisable( GL_CULL_FACE ) ; glEnable( GL_BLEND ) ; glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ; - puDisplay(); // Fade out the splash screen over the first three seconds. double t = globals->get_sim_time_sec();