Ignore:
Timestamp:
Mar 26, 2014 3:25:30 AM (10 years ago)
Author:
ldelgass
Message:

Add terrain options, get/set viewpoint

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/packages/vizservers/geovis/Renderer.cpp

    r4247 r4273  
    2323#include <osgEarth/Bounds>
    2424#include <osgEarth/Profile>
     25#include <osgEarth/Viewpoint>
    2526#include <osgEarth/TerrainLayer>
    2627#include <osgEarth/ImageLayer>
     
    8283    _manipulator = new osgEarth::Util::EarthManipulator;
    8384    _viewer->setCameraManipulator(_manipulator.get());
    84     _viewer->addEventHandler(new osgGA::StateSetManipulator(_viewer->getCamera()->getOrCreateStateSet()));
     85    _stateManip = new osgGA::StateSetManipulator(_viewer->getCamera()->getOrCreateStateSet());
     86    _viewer->addEventHandler(_stateManip);
    8587    _coordsCallback = new MouseCoordsCallback();
    8688    _mouseCoordsTool = new osgEarth::Util::MouseCoordsTool(mapNode);
     
    293295    mpOpt.color() = osg::Vec4(1, 1, 1, 1);
    294296    //mpOpt.minLOD() = 1;
     297    // Sets shader uniform for terrain renderer (config var defaults to false)
     298    mpOpt.enableLighting() = false;
    295299    osgEarth::MapNodeOptions mapNodeOpts(mpOpt);
    296     mapNodeOpts.enableLighting() = false;
     300    // Sets GL_LIGHTING state in MapNode's StateSet (config var defaults to true)
     301    mapNodeOpts.enableLighting() = true;
    297302    osgEarth::MapNode *mapNode = new osgEarth::MapNode(map, mapNodeOpts);
    298303    _mapNode = mapNode;
     
    328333    }
    329334    _needsRedraw = true;
     335}
     336
     337void Renderer::setLighting(bool state)
     338{
     339    if (_mapNode.valid()) {
     340        TRACE("Setting lighting: %d", state ? 1 : 0);
     341        _mapNode->getOrCreateStateSet()
     342            ->setMode(GL_LIGHTING, state ? 1 : 0);
     343    }
     344    _needsRedraw = true;
     345}
     346
     347void Renderer::setTerrainVerticalScale(double scale)
     348{
     349    if (_mapNode.valid()) {
     350        _mapNode->getTerrainEngine()->setVerticalScale(scale);
     351    }
     352    _needsRedraw = true;
     353}
     354
     355void Renderer::setTerrainLighting(bool state)
     356{
     357#if 1
     358    if (_mapNode.valid()) {
     359        // XXX: HACK alert
     360        // Find the terrain engine container (might be above one or more decorators)
     361        osg::Group *group = _mapNode->getTerrainEngine();
     362        while (group->getParent(0) != NULL && group->getParent(0) != _mapNode.get()) {
     363            group = group->getParent(0);
     364        }
     365        if (group != NULL && group->getParent(0) == _mapNode.get()) {
     366            TRACE("Setting terrain lighting: %d", state ? 1 : 0);
     367            if (group->getOrCreateStateSet()->getUniform("oe_mode_GL_LIGHTING") != NULL) {
     368                group->getStateSet()->getUniform("oe_mode_GL_LIGHTING")->set(state);
     369            } else {
     370                ERROR("Can't get terrain lighting uniform");
     371            }
     372        } else {
     373            ERROR("Can't get terrain lighting uniform");
     374        }
     375    }
     376#else
     377    if (_stateManip.valid()) {
     378        _stateManip->setLightingEnabled(state);
     379    }
     380#endif
     381    _needsRedraw = true;
     382}
     383
     384void Renderer::setTerrainWireframe(bool state)
     385{
     386#if 0
     387    if (_mapNode.valid()) {
     388        TRACE("Setting terrain wireframe: %d", state ? 1 : 0);
     389        osg::StateSet *state = _mapNode->getOrCreateStateSet();
     390        osg::PolygonMode *pmode = dynamic_cast< osg::PolygonMode* >(state->getAttribute(osg::StateAttribute::POLYGONMODE));
     391        if (pmode == NULL) {
     392            pmode = new osg::PolygonMode;
     393            state->setAttribute(pmode);
     394        }
     395        if (state) {
     396            pmode->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE);
     397        } else {
     398            pmode->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::FILL);
     399        }
     400    }
     401#else
     402    if (_stateManip.valid()) {
     403        _stateManip->setPolygonMode(state ? osg::PolygonMode::LINE : osg::PolygonMode::FILL);
     404    }
     405#endif
     406    _needsRedraw = true;
     407}
     408
     409void Renderer::setViewpoint(const osgEarth::Viewpoint& v, double durationSecs)
     410{
     411    if (_manipulator.valid()) {
     412        _manipulator->setViewpoint(v, durationSecs);
     413    }
     414    _needsRedraw = true;
     415}
     416
     417osgEarth::Viewpoint Renderer::getViewpoint()
     418{
     419    if (_manipulator.valid()) {
     420        return _manipulator->getViewpoint();
     421    } else {
     422        // Uninitialized, invalid viewpoint
     423        return osgEarth::Viewpoint();
     424    }
    330425}
    331426
     
    602697          x, y, (absolute ? 1 : 0));
    603698
     699    // Wants mouse delta x,y in normalized screen coords
    604700    _manipulator->pan(x, y);
    605701    _needsRedraw = true;
     
    628724    // FIXME: zoom here wants y mouse coords in normalized viewport coords
    629725
    630     _manipulator->zoom(0, z);
     726    //_manipulator->zoom(0, z);
     727
     728    double dist = _manipulator->getDistance();
     729    dist *= (1.0 + z);
     730    _manipulator->setDistance(dist);
     731
    631732    _needsRedraw = true;
    632733}
Note: See TracChangeset for help on using the changeset viewer.