Changeset 4382


Ignore:
Timestamp:
Jun 11, 2014 2:35:04 PM (7 years ago)
Author:
ldelgass
Message:

Error on missing file, set per-process cache directory, sky node fixes

Location:
trunk/packages/vizservers/geovis
Files:
3 edited

Legend:

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

    r4354 r4382  
    1212#include <cstdlib>
    1313
     14#include <sys/types.h>
     15#include <unistd.h> // For getpid()
     16
    1417#include <GL/gl.h>
    1518
     
    1821#endif
    1922
     23#include <osgDB/FileUtils>
     24#include <osgDB/FileNameUtils>
    2025#include <osgGA/StateSetManipulator>
    2126#include <osgGA/GUIEventAdapter>
     
    2328
    2429#include <osgEarth/Version>
     30#include <osgEarth/FileUtils>
     31#include <osgEarth/Cache>
     32#include <osgEarthDrivers/cache_filesystem/FileSystemCache>
    2533#include <osgEarth/MapNode>
    2634#include <osgEarth/Bounds>
     
    3139#include <osgEarth/ElevationLayer>
    3240#include <osgEarth/ModelLayer>
     41#include <osgEarth/DateTime>
    3342#include <osgEarthUtil/EarthManipulator>
    3443#if OSGEARTH_MIN_VERSION_REQUIRED(2, 5, 1)
     
    5059
    5160#include "Renderer.h"
     61#if 0
     62#include "SingleWindow.h"
     63#endif
    5264#include "ScaleBar.h"
     65#include "FileUtil.h"
    5366#include "Trace.h"
    5467
     
    145158    TRACE("Enter");
    146159
     160    removeDirectory(_cacheDir.c_str());
     161
    147162    TRACE("Leave");
     163}
     164
     165void Renderer::setupCache()
     166{
     167    std::ostringstream dir;
     168    dir << "/tmp/geovis_cache" << getpid();
     169    _cacheDir = dir.str();
     170    const char *path = _cacheDir.c_str();
     171    TRACE("Cache dir: %s", path);
     172    removeDirectory(path);
     173    if (!osgDB::makeDirectory(_cacheDir)) {
     174        ERROR("Failed to create directory '%s'", path);
     175    }
    148176}
    149177
     
    234262        return;
    235263    _viewer = new osgViewer::Viewer();
     264#if 1
     265    osg::DisplaySettings *ds = _viewer->getDisplaySettings();
     266    if (ds == NULL) {
     267        ds = osg::DisplaySettings::instance().get();
     268    }
     269    ds->setDoubleBuffer(false);
     270    ds->setMinimumNumAlphaBits(8);
     271    ds->setMinimumNumStencilBits(8);
     272    ds->setNumMultiSamples(0);
     273#endif
    236274    _viewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
    237275    _viewer->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(false, false);
     
    249287void Renderer::finalizeViewer() {
    250288    initViewer();
    251     int screen = 0;
    252     const char *displayEnv = getenv("DISPLAY");
    253     if (displayEnv != NULL) {
    254         // 3 parts: host, display, screen
    255         int part = 0;
    256         for (size_t c = 0; c < strlen(displayEnv); c++) {
    257             if (displayEnv[c] == ':') {
    258                 part = 1;
    259             } else if (part == 1 && displayEnv[c] == '.') {
    260                 part = 2;
    261             } else if (part == 2) {
    262                 screen = atoi(&displayEnv[c]);
    263                 break;
     289    TRACE("Before _viewer->isRealized()");
     290    if (!_viewer->isRealized()) {
     291        int screen = 0;
     292        const char *displayEnv = getenv("DISPLAY");
     293        if (displayEnv != NULL) {
     294            TRACE("DISPLAY: %s", displayEnv);
     295            // 3 parts: host, display, screen
     296            int part = 0;
     297            for (size_t c = 0; c < strlen(displayEnv); c++) {
     298                if (displayEnv[c] == ':') {
     299                    part = 1;
     300                } else if (part == 1 && displayEnv[c] == '.') {
     301                    part = 2;
     302                } else if (part == 2) {
     303                    screen = atoi(&displayEnv[c]);
     304                    break;
     305                }
    264306            }
    265307        }
    266     }
    267     if (!_viewer->isRealized()) {
     308        TRACE("Using screen: %d", screen);
    268309#ifdef USE_OFFSCREEN_RENDERING
    269310#ifdef USE_PBUFFER
     
    317358        _captureCallback = new ScreenCaptureCallback();
    318359        _viewer->getCamera()->setFinalDrawCallback(_captureCallback.get());
    319         //_viewer->getCamera()->getDisplaySettings()->setDoubleBuffer(false);
     360#if 1
    320361        _viewer->setUpViewInWindow(0, 0, _windowWidth, _windowHeight, screen);
     362#else
     363        SingleWindow *windowConfig = new SingleWindow(0, 0, _windowWidth, _windowHeight, screen);
     364        osg::DisplaySettings *ds = windowConfig->getActiveDisplaySetting(*_viewer.get());
     365        ds->setDoubleBuffer(false);
     366        ds->setMinimumNumAlphaBits(8);
     367        ds->setMinimumNumStencilBits(8);
     368        ds->setNumMultiSamples(0);
     369        windowConfig->setWindowDecoration(false);
     370        windowConfig->setOverrideRedirect(false);
     371        _viewer->apply(windowConfig);
     372#endif
    321373#endif
    322374        _viewer->realize();
     
    537589    _manipulator->setNode(NULL);
    538590    _manipulator->setNode(_sceneRoot.get());
    539     _manipulator->computeHomePosition();
     591    //_manipulator->computeHomePosition();
    540592}
    541593
     
    614666    }
    615667
     668    setupCache();
     669    osgEarth::Drivers::FileSystemCacheOptions cacheOpts;
     670    cacheOpts.rootPath() = _cacheDir;
     671    mapOpts.cache() = cacheOpts;
     672
    616673    initViewer();
    617674
     
    634691    _mapNode = mapNode;
    635692    if (_map->isGeocentric()) {
     693        osgEarth::DateTime now;
    636694#if OSGEARTH_MIN_VERSION_REQUIRED(2, 5, 1)
    637         osgEarth::Util::SkyNode *sky = new osgEarth::Util::SkyNode::create(mapNode);
    638         sky->addChild(mapNode.get());
    639         _sceneRoot = sky;
    640 #else
    641 #if 0
    642         // XXX: Crashes
    643         osgEarth::Util::SkyNode *sky = new osgEarth::Util::SkyNode(map);
    644         sky->addChild(mapNode.get());
     695        TRACE("Creating SkyNode");
     696        osgEarth::Util::SkyOptions sykOpts;
     697        skyOpts.setDriver("gl");
     698        skyOpts.hours() = now.hours();
     699        skyOpts.ambient() = 0.2f;
     700        osgEarth::Util::SkyNode *sky = new osgEarth::Util::SkyNode::create(skyOpts, mapNode);
     701        sky->addChild(mapNode);
     702        sky->attach(_viewer.get(), 0);
    645703        _sceneRoot = sky;
    646704#else
    647705        _sceneRoot = new osg::Group();
    648706        _sceneRoot->addChild(_mapNode.get());
    649 #endif
     707
     708        TRACE("Creating SkyNode");
     709        osgEarth::Util::SkyNode *sky = new osgEarth::Util::SkyNode(map);
     710        _sceneRoot->addChild(sky);
     711        sky->setAmbientBrightness(0.2f);
     712        sky->setDateTime(now);
     713        sky->attach(_viewer.get(), 0);
    650714#endif
    651715    } else {
     
    17101774    return scale;
    17111775}
     1776
     1777std::string Renderer::getCanonicalPath(const std::string& url) const
     1778{
     1779    std::string retStr;
     1780    std::string proto = osgDB::getServerProtocol(url);
     1781    if (proto.empty()) {
     1782        retStr = osgDB::getRealPath(url);
     1783        if (!osgDB::fileExists(retStr)) {
     1784            retStr = "";
     1785        }
     1786    }
     1787    return retStr;
     1788}
  • trunk/packages/vizservers/geovis/Renderer.h

    r4349 r4382  
    348348    void mapNodeUpdate();
    349349
     350    std::string getCanonicalPath(const std::string& url) const;
     351
    350352private:
    351353    typedef std::tr1::unordered_map<ColorMapId, osg::ref_ptr<osg::TransferFunction1D> > ColorMapHashmap;
    352354    typedef std::tr1::unordered_map<ViewpointId, osgEarth::Viewpoint> ViewpointHashmap;
    353355
     356    void setupCache();
     357
    354358    void initViewer();
    355359
     
    385389
    386390    std::string _baseURI;
     391    std::string _cacheDir;
    387392
    388393    osg::ref_ptr<osg::Group> _sceneRoot;
  • trunk/packages/vizservers/geovis/RendererCmd.cpp

    r4375 r4382  
    1818#include <sys/uio.h>
    1919#include <tcl.h>
     20
     21#include <osgDB/FileUtils>
     22#include <osgDB/FileNameUtils>
    2023
    2124#include <osgEarth/Registry>
     
    780783    if (type[0] == 'i' && strcmp(type, "image") == 0) {
    781784        char *driver = Tcl_GetString(objv[4]);
    782         char *url = NULL;
     785        std::string url;
    783786        if (objc > 6) {
    784             url =  Tcl_GetString(objv[5]);
     787            url = g_renderer->getCanonicalPath(std::string(Tcl_GetString(objv[5])));
     788            if (url.empty()) {
     789                Tcl_AppendResult(interp, "file not found: \"",
     790                                 url.c_str(), "\"", (char*)NULL);
     791                return TCL_ERROR;
     792            }
    785793        }
    786794        if (driver[0] == 'd' && strcmp(driver, "debug") == 0) {
     
    833841    } else if (type[0] == 'e' && strcmp(type, "elevation") == 0) {
    834842        char *driver = Tcl_GetString(objv[4]);
    835         char *url =  Tcl_GetString(objv[5]);
     843        std::string url = g_renderer->getCanonicalPath(std::string(Tcl_GetString(objv[5])));
     844        if (url.empty()) {
     845            Tcl_AppendResult(interp, "file not found: \"",
     846                             url.c_str(), "\"", (char*)NULL);
     847            return TCL_ERROR;
     848        }
    836849
    837850        if (driver[0] == 'g' && strcmp(driver, "gdal") == 0) {
     
    856869    } else if (type[0] == 'p' && strcmp(type, "point") == 0) {
    857870        osgEarth::Drivers::OGRFeatureOptions opts;
    858         char *url =  Tcl_GetString(objv[4]);
     871        std::string url = g_renderer->getCanonicalPath(std::string(Tcl_GetString(objv[4])));
     872        if (url.empty()) {
     873            Tcl_AppendResult(interp, "file not found: \"",
     874                             url.c_str(), "\"", (char*)NULL);
     875            return TCL_ERROR;
     876        }
    859877        char *name = Tcl_GetString(objv[5]);
    860878
     
    878896    } else if (type[0] == 'p' && strcmp(type, "polygon") == 0) {
    879897        osgEarth::Drivers::OGRFeatureOptions opts;
    880         char *url =  Tcl_GetString(objv[4]);
     898        std::string url = g_renderer->getCanonicalPath(std::string(Tcl_GetString(objv[4])));
     899        if (url.empty()) {
     900            Tcl_AppendResult(interp, "file not found: \"",
     901                             url.c_str(), "\"", (char*)NULL);
     902            return TCL_ERROR;
     903        }
    881904        char *name = Tcl_GetString(objv[5]);
    882905        opts.url() = url;
     
    898921    } else if (type[0] == 'l' && strcmp(type, "line") == 0) {
    899922        osgEarth::Drivers::OGRFeatureOptions opts;
    900         char *url =  Tcl_GetString(objv[4]);
     923        std::string url = g_renderer->getCanonicalPath(std::string(Tcl_GetString(objv[4])));
     924        if (url.empty()) {
     925            Tcl_AppendResult(interp, "file not found: \"",
     926                             url.c_str(), "\"", (char*)NULL);
     927            return TCL_ERROR;
     928        }
    901929        char *name = Tcl_GetString(objv[5]);
    902930        opts.url() = url;
     
    925953   } else if (type[0] == 't' && strcmp(type, "text") == 0) {
    926954        osgEarth::Drivers::OGRFeatureOptions opts;
    927         char *url =  Tcl_GetString(objv[4]);
     955        std::string url = g_renderer->getCanonicalPath(std::string(Tcl_GetString(objv[4])));
     956        if (url.empty()) {
     957            Tcl_AppendResult(interp, "file not found: \"",
     958                             url.c_str(), "\"", (char*)NULL);
     959            return TCL_ERROR;
     960        }
    928961        char *content = Tcl_GetString(objv[5]);
    929962        char *priority = Tcl_GetString(objv[6]);
Note: See TracChangeset for help on using the changeset viewer.