X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Frenderer.cxx;h=c952faed97b247241ffca1cad3f76f683b3afff1;hb=49030e700ba276d5cd6ffa4f4e661a266fa0105c;hp=ed715a9d2aa4a251d7843668876082fb08f04599;hpb=4dea9807f6e4f242af72f6fda2a45a187a059bdc;p=flightgear.git diff --git a/src/Main/renderer.cxx b/src/Main/renderer.cxx index ed715a9d2..c952faed9 100644 --- a/src/Main/renderer.cxx +++ b/src/Main/renderer.cxx @@ -18,20 +18,17 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -// $Id$ - #ifdef HAVE_CONFIG_H # include #endif -#include - #ifdef HAVE_WINDOWS_H # include #endif +#include + #include #include #include @@ -44,29 +41,25 @@ #include #include #include +#include #include #include #include #include -#include #include #include -#include -#include -#include #include #include #include -#include -#include #include #include #include #include #include +#include #include #include #include @@ -102,6 +95,7 @@ #include "splash.hxx" #include "renderer.hxx" #include "main.hxx" +#include "CameraGroup.hxx" #include "ViewPartitionNode.hxx" // XXX Make this go away when OSG 2.2 is released. @@ -109,6 +103,10 @@ #define UPDATE_VISITOR_IN_VIEWER 1 #endif +using namespace osg; +using namespace simgear; +using namespace flightgear; + class FGHintUpdateCallback : public osg::StateAttribute::Callback { public: FGHintUpdateCallback(const char* configNode) : @@ -160,13 +158,9 @@ public: { drawImplementation(*renderInfo.getState()); } void drawImplementation(osg::State& state) const { - if (!fgOSIsMainContext(state.getGraphicsContext())) - return; - - state.pushStateSet(getStateSet()); - state.apply(); state.setActiveTextureUnit(0); state.setClientActiveTextureUnit(0); + state.disableAllVertexArrays(); glPushAttrib(GL_ALL_ATTRIB_BITS); @@ -176,11 +170,6 @@ public: glPopClientAttrib(); glPopAttrib(); - - state.popStateSet(); - state.dirtyAllModes(); - state.dirtyAllAttributes(); - state.dirtyAllVertexArrays(); } virtual osg::Object* cloneType() const { return new SGPuDrawable; } @@ -212,12 +201,6 @@ public: { drawImplementation(*renderInfo.getState()); } void drawImplementation(osg::State& state) const { -// std::cout << state.getGraphicsContext() << std::endl; - if (!fgOSIsMainContext(state.getGraphicsContext())) - return; - - state.pushStateSet(getStateSet()); - state.apply(); state.setActiveTextureUnit(0); state.setClientActiveTextureUnit(0); state.disableAllVertexArrays(); @@ -241,10 +224,6 @@ public: glPopClientAttrib(); glPopAttrib(); - state.popStateSet(); - state.dirtyAllModes(); - state.dirtyAllAttributes(); - state.dirtyAllVertexArrays(); } virtual osg::Object* cloneType() const { return new SGHUDAndPanelDrawable; } @@ -429,11 +408,8 @@ FGRenderer::splashinit( void ) { } void -FGRenderer::init( void ) { - // The viewer can call this before the graphics context is current - // in the main thread; indeed, in a multithreaded setup it might - // never be current in the main thread. - fgMakeCurrent(); +FGRenderer::init( void ) +{ osgViewer::Viewer* viewer = globals->get_renderer()->getViewer(); osg::initNotifyLevel(); @@ -496,7 +472,6 @@ FGRenderer::init( void ) { //sceneGroup->addChild(thesky->getCloudRoot()); stateSet = sceneGroup->getOrCreateStateSet(); - stateSet->setMode(GL_BLEND, osg::StateAttribute::ON); stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON); // need to update the light on every frame @@ -511,7 +486,6 @@ FGRenderer::init( void ) { mRoot->addChild(lightSource); stateSet = globals->get_scenery()->get_scene_graph()->getOrCreateStateSet(); - stateSet->setMode(GL_BLEND, osg::StateAttribute::ON); stateSet->setMode(GL_ALPHA_TEST, osg::StateAttribute::ON); stateSet->setMode(GL_LIGHTING, osg::StateAttribute::ON); stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON); @@ -534,20 +508,13 @@ FGRenderer::init( void ) { stateSet->setUpdateCallback(new FGFogEnableUpdateCallback); // plug in the GUI - osg::Camera* guiCamera = new osg::Camera; - guiCamera->setRenderOrder(osg::Camera::POST_RENDER, 100); - guiCamera->setClearMask(0); - GLbitfield 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); - osg::Geode* geode = new osg::Geode; - geode->addDrawable(new SGPuDrawable); - geode->addDrawable(new SGHUDAndPanelDrawable); - guiCamera->addChild(geode); - + osg::Camera* guiCamera = getGUICamera(CameraGroup::getDefault()); + if (guiCamera) { + osg::Geode* geode = new osg::Geode; + geode->addDrawable(new SGPuDrawable); + geode->addDrawable(new SGHUDAndPanelDrawable); + guiCamera->addChild(geode); + } osg::Switch* sw = new osg::Switch; sw->setUpdateCallback(new FGScenerySwitchCallback); sw->addChild(mRoot.get()); @@ -556,7 +523,6 @@ FGRenderer::init( void ) { mRealRoot->addChild(viewPartition.get()); mRealRoot->addChild(FGCreateRedoutNode()); - mRealRoot->addChild(guiCamera); } @@ -613,14 +579,6 @@ FGRenderer::update( bool refresh_camera_settings ) { // update view port resize( fgGetInt("/sim/startup/xsize"), fgGetInt("/sim/startup/ysize") ); - - SGVec3d position = current__view->getViewPosition(); - SGQuatd attitude = current__view->getViewOrientation(); - SGVec3d osgPosition = attitude.transform(-position); - - FGManipulator *manipulator = globals->get_renderer()->getManipulator(); - manipulator->setPosition(position.osg()); - manipulator->setAttitude(attitude.osg()); } osg::Camera *camera = viewer->getCamera(); @@ -744,25 +702,6 @@ FGRenderer::update( bool refresh_camera_settings ) { } // sgEnviro.setLight(l->adj_fog_color()); - - double agl = current__view->getAltitudeASL_ft()*SG_FEET_TO_METER - - current__view->getSGLocation()->get_cur_elev_m(); - - float scene_nearplane, scene_farplane; - // XXX Given that the own airplane model is part of the scene - // graph, should this business be ripped out? The near plane is - // ignored by setCameraParameters. - if ( agl > 10.0 ) { - scene_nearplane = 10.0f; - scene_farplane = 120000.0f; - } else { - scene_nearplane = groundlevel_nearplane->getDoubleValue(); - scene_farplane = 120000.0f; - } - setCameraParameters(current__view->get_v_fov(), - current__view->get_aspect_ratio(), - scene_nearplane, scene_farplane); - // sgEnviro.startOfFrame(current__view->get_view_pos(), // current__view->get_world_up(), // current__view->getLongitude_deg(), @@ -795,8 +734,7 @@ FGRenderer::update( bool refresh_camera_settings ) { viewPartition->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 - & ~simgear::BACKGROUND_BIT); + osg::Node::NodeMask cullMask = ~simgear::LIGHTS_BITS & ~simgear::PICK_BIT; cullMask |= simgear::GroundLightManager::instance() ->getLightNodeMask(mUpdateVisitor.get()); if (hotspots) @@ -830,8 +768,6 @@ FGRenderer::resize( int width, int height ) { if (height != lastheight) fgSetInt("/sim/startup/ysize", lastheight = height); - guiInitMouse(width, height); - // for all views FGViewMgr *viewmgr = globals->get_viewmgr(); if (viewmgr) { @@ -853,44 +789,40 @@ void FGRenderer::setCameraParameters(float vfov, float aspectRatio, } bool -FGRenderer::pick( unsigned x, unsigned y, - std::vector& pickList, - const osgGA::GUIEventAdapter* ea ) +FGRenderer::pick(std::vector& pickList, + const osgGA::GUIEventAdapter* ea) { - osgViewer::Viewer* viewer = globals->get_renderer()->getViewer(); - // wipe out the return ... - pickList.resize(0); - - if (viewer) { - // just compute intersections in the viewers method ... + osgViewer::Viewer* viewer = globals->get_renderer()->getViewer(); + // wipe out the return ... + pickList.clear(); typedef osgUtil::LineSegmentIntersector::Intersections Intersections; Intersections intersections; - viewer->computeIntersections(ea->getX(), ea->getY(), intersections); - - Intersections::iterator hit; - for (hit = intersections.begin(); hit != intersections.end(); ++hit) { - const osg::NodePath& np = hit->nodePath; - osg::NodePath::const_reverse_iterator npi; - for (npi = np.rbegin(); npi != np.rend(); ++npi) { - SGSceneUserData* ud = SGSceneUserData::getSceneUserData(*npi); - if (!ud) - continue; - for (unsigned i = 0; i < ud->getNumPickCallbacks(); ++i) { - SGPickCallback* pickCallback = ud->getPickCallback(i); - if (!pickCallback) - continue; - SGSceneryPick sceneryPick; - sceneryPick.info.local = SGVec3d(hit->getLocalIntersectPoint()); - sceneryPick.info.wgs84 = SGVec3d(hit->getWorldIntersectPoint()); - sceneryPick.callback = pickCallback; - pickList.push_back(sceneryPick); + + if (!computeIntersections(CameraGroup::getDefault(), ea, intersections)) + return false; + for (Intersections::iterator hit = intersections.begin(), + e = intersections.end(); + hit != e; + ++hit) { + const osg::NodePath& np = hit->nodePath; + osg::NodePath::const_reverse_iterator npi; + for (npi = np.rbegin(); npi != np.rend(); ++npi) { + SGSceneUserData* ud = SGSceneUserData::getSceneUserData(*npi); + if (!ud) + continue; + for (unsigned i = 0; i < ud->getNumPickCallbacks(); ++i) { + SGPickCallback* pickCallback = ud->getPickCallback(i); + if (!pickCallback) + continue; + SGSceneryPick sceneryPick; + sceneryPick.info.local = SGVec3d(hit->getLocalIntersectPoint()); + sceneryPick.info.wgs84 = SGVec3d(hit->getWorldIntersectPoint()); + sceneryPick.callback = pickCallback; + pickList.push_back(sceneryPick); + } } - } } return !pickList.empty(); - } else { // we can get called early ... - return false; - } } void