X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Frenderer.cxx;h=c952faed97b247241ffca1cad3f76f683b3afff1;hb=49030e700ba276d5cd6ffa4f4e661a266fa0105c;hp=f40a5045235bfead324b9292e93f57c20edf2886;hpb=b68b751fd46b633d6eb394b842690edc9be3c2f1;p=flightgear.git diff --git a/src/Main/renderer.cxx b/src/Main/renderer.cxx index f40a50452..c952faed9 100644 --- a/src/Main/renderer.cxx +++ b/src/Main/renderer.cxx @@ -23,12 +23,12 @@ # include #endif -#include - #ifdef HAVE_WINDOWS_H # include #endif +#include + #include #include #include @@ -41,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 @@ -99,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. @@ -106,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) : @@ -157,8 +158,6 @@ public: { drawImplementation(*renderInfo.getState()); } void drawImplementation(osg::State& state) const { - if (!fgOSIsMainContext(state.getGraphicsContext())) - return; state.setActiveTextureUnit(0); state.setClientActiveTextureUnit(0); @@ -202,8 +201,6 @@ public: { drawImplementation(*renderInfo.getState()); } void drawImplementation(osg::State& state) const { - if (!fgOSIsMainContext(state.getGraphicsContext())) - return; state.setActiveTextureUnit(0); state.setClientActiveTextureUnit(0); state.disableAllVertexArrays(); @@ -410,38 +407,6 @@ FGRenderer::splashinit( void ) { #endif } -namespace -{ -// Create a slave camera that will be used to render a fixed GUI-like -// element. -osg::Camera* -makeSlaveCamera(osg::Camera::RenderOrder renderOrder, int orderNum) -{ - using namespace osg; - Camera* camera = new osg::Camera; - GraphicsContext *gc = fgOSGetMainContext(); - - camera->setRenderOrder(renderOrder, orderNum); - camera->setClearMask(0); - camera->setInheritanceMask(CullSettings::ALL_VARIABLES - & ~(CullSettings::COMPUTE_NEAR_FAR_MODE - | CullSettings::CULLING_MODE)); - camera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR); - camera->setCullingMode(osg::CullSettings::NO_CULLING); - camera->setGraphicsContext(gc); - // Establish an initial viewport. This may be altered, - // particularly when drawing a 2d panel. - const GraphicsContext::Traits *traits = gc->getTraits(); - camera->setViewport(new Viewport(0, 0, traits->width, traits->height)); - camera->setProjectionResizePolicy(Camera::FIXED); - camera->setReferenceFrame(Transform::ABSOLUTE_RF); - camera->setAllowEventFocus(false); - globals->get_renderer()->getViewer()->addSlave(camera, false); - return camera; -} - -} - void FGRenderer::init( void ) { @@ -507,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 @@ -522,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); @@ -545,13 +508,13 @@ FGRenderer::init( void ) stateSet->setUpdateCallback(new FGFogEnableUpdateCallback); // plug in the GUI - osg::Camera* guiCamera = makeSlaveCamera(osg::Camera::POST_RENDER, 100); - guiCamera->setName("GUI"); - 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()); @@ -616,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(); @@ -747,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(), @@ -798,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) @@ -854,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