Changeset 4009


Ignore:
Timestamp:
Oct 25, 2013 1:30:07 AM (9 years ago)
Author:
ldelgass
Message:

Updates to geovis server: image capture, load earth file

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

Legend:

Unmodified
Added
Removed
  • trunk/packages/vizservers/geovis/Makefile.in

    r3998 r4009  
    11DEBUG                   = #yes
    2 TRACE                   = #yes
     2DEBUG_WRITE_FRAME_FILE  = #yes
     3TRACE                   = yes
    34USE_OFFSCREEN_RENDERING = #yes
    45USE_THREADS             = yes
     
    3637TCL_INC_SPEC    = @TCL_INC_SPEC@
    3738
    38 OSG_LIB_DIR     = @OSG_LIB_DIR@
    39 OSG_INC_SPEC    = @OSG_INC_SPEC@
     39OSG_LIB_DIR     =
     40OSG_INC_SPEC    =
    4041OSG_LIB_SPEC    = \
    4142                -losg \
    4243                -losgDB \
    43                 -losgViewer
     44                -losgViewer \
     45                -lOpenThreads
     46
     47OSGEARTH_LIB_DIR  =
     48OSGEARTH_INC_SPEC =
     49OSGEARTH_LIB_SPEC = \
     50                  -losgEarth \
     51                  -losgEarthUtil
    4452
    4553LD_RUN_PATH     = $(libdir)
     
    4755LIBS            = \
    4856                $(TCL_LIB_SPEC) \
     57                $(OSGEARTH_LIB_SPEC) \
    4958                $(OSG_LIB_SPEC) \
    5059                $(GL_LIB_SPEC) \
     
    5665                -I$(srcdir) \
    5766                $(TCL_INC_SPEC) \
     67                $(OSGEARTH_INC_SPEC) \
    5868                $(OSG_INC_SPEC)
    5969
     
    6575DEFINES         += -DDEBUG
    6676CXXFLAGS        = -O0 -g
     77endif
     78ifdef DEBUG_WRITE_FRAME_FILE
     79DEFINES         += -DDEBUG_WRITE_FRAME_FILE
    6780endif
    6881ifdef TRACE
  • trunk/packages/vizservers/geovis/RenderServer.cpp

    r3998 r4009  
    5353queueFrame(ResponseQueue *queue, const unsigned char *imgData)
    5454{
    55 #ifdef DEBUG
     55#ifdef DEBUG_WRITE_FRAME_FILE
    5656
    5757#ifdef RENDER_TARGA
     
    6666                 g_renderer->getWindowWidth(),
    6767                 g_renderer->getWindowHeight(),
    68                  TARGA_BYTES_PER_PIXEL,
    69                  true);
     68                 TARGA_BYTES_PER_PIXEL);
    7069#endif  /*RENDER_TARGA*/
    7170
     
    381380        logName = (char *)calloc(logNameLen, sizeof(char));
    382381        strncpy(logName, "/tmp/geovis_log.txt", logNameLen);
    383     }
    384     else {
     382    } else {
    385383        logNameLen = 16+strlen(user)+4+1;
    386384        logName = (char *)calloc(logNameLen, sizeof(char));
     
    490488
    491489        if (g_renderer->render()) {
    492             TRACE("Rendering new frame");
    493             g_renderer->getRenderedFrame(imgData.get());
     490            TRACE("Rendered new frame");
     491            imgData = g_renderer->getRenderedFrame();
     492            if (imgData == NULL) {
     493                ERROR("Empty image");
     494            } else {
     495                TRACE("Image: %d x %d", imgData->s(), imgData->t());
     496            }
    494497#ifdef USE_THREADS
    495498            queueFrame(g_queue, imgData->data());
  • trunk/packages/vizservers/geovis/Renderer.cpp

    r3998 r4009  
    1717#endif
    1818
     19#include <osgEarth/Version>
     20#include <osgEarth/MapNode>
     21#include <osgEarth/TerrainLayer>
     22#include <osgEarth/ImageLayer>
     23#include <osgEarthUtil/EarthManipulator>
     24
    1925#include "Renderer.h"
    2026#include "Trace.h"
     
    3541    _bgColor[2] = 0;
    3642    _viewer = new osgViewer::Viewer();
     43    _viewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
     44    _viewer->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(false, false);
     45    _viewer->setReleaseContextAtEndOfFrameHint(false);
     46    setBackgroundColor(_bgColor);
     47    _captureCallback = new ScreenCaptureCallback();
     48    _viewer->getCamera()->setPostDrawCallback(_captureCallback.get());
     49    _sceneRoot = new osg::Node;
     50    _viewer->setSceneData(_sceneRoot.get());
     51    _manipulator = new osgEarth::Util::EarthManipulator;
     52    _viewer->setCameraManipulator(_manipulator);
     53    _viewer->getCamera()->setNearFarRatio(0.00002);
     54    _viewer->getCamera()->setSmallFeatureCullingPixelSize(-1.0f);
    3755    _viewer->setUpViewInWindow(0, 0, _windowWidth, _windowHeight);
    38     setBackgroundColor(_bgColor);
    3956    _viewer->realize();
     57    if (_viewer->getViewerStats() != NULL) {
     58        TRACE("Enabling stats");
     59        _viewer->getViewerStats()->collectStats("scene", true);
     60    }
    4061}
    4162
     
    4566
    4667    TRACE("Leave");
     68}
     69
     70void Renderer::loadEarthFile(const char *path)
     71{
     72    TRACE("Loading %s", path);
     73    _sceneRoot = osgDB::readNodeFile(path);
     74    osgEarth::MapNode *mapNode = osgEarth::MapNode::findMapNode(_sceneRoot.get());
     75    if (mapNode == NULL) {
     76        ERROR("Couldn't find MapNode");
     77    } else {
     78        _map = mapNode->getMap();
     79    }
     80    _viewer->setSceneData(_sceneRoot.get());
     81    _manipulator->setNode(NULL);
     82    _manipulator->setNode(_sceneRoot.get());
     83    _manipulator->computeHomePosition();
     84    _viewer->home();
     85    _needsRedraw = true;
     86}
     87
     88void Renderer::addImageLayer(const char *name, const osgEarth::TileSourceOptions& opts)
     89{
     90    osgEarth::ImageLayerOptions layerOpts(name, opts);
     91    _map->addImageLayer(new osgEarth::ImageLayer(layerOpts));
     92}
     93
     94void Renderer::removeImageLayer(const char *name)
     95{
     96    osgEarth::ImageLayer *layer = _map->getImageLayerByName(name);
     97    _map->removeImageLayer(layer);
     98}
     99
     100void Renderer::moveImageLayer(const char *name, int pos)
     101{
     102    osgEarth::ImageLayer *layer = _map->getImageLayerByName(name);
     103    _map->moveImageLayer(layer, pos);
     104}
     105
     106void Renderer::setImageLayerOpacity(const char *name, double opacity)
     107{
     108    osgEarth::ImageLayer *layer = _map->getImageLayerByName(name);
     109    layer->setOpacity(opacity);
     110}
     111
     112void Renderer::setImageLayerVisibility(const char *name, bool state)
     113{
     114#if OSGEARTH_MIN_VERSION_REQUIRED(2, 4, 0)
     115    osgEarth::ImageLayer *layer = _map->getImageLayerByName(name);
     116    layer->setVisible(state);
     117#endif
    47118}
    48119
     
    62133    _windowWidth = width;
    63134    _windowHeight = height;
    64     _viewer->setUpViewInWindow(0, 0, _windowWidth, _windowHeight);
    65 
     135    osgViewer::ViewerBase::Windows windows;
     136    _viewer->getWindows(windows);
     137    if (windows.size() == 1) {
     138        windows[0]->setWindowRectangle(0, 0, _windowWidth, _windowHeight);
     139    } else {
     140        ERROR("Num windows: %lu", windows.size());
     141    }
    66142    _needsRedraw = true;
    67143}
     
    87163{
    88164    TRACE("Enter: resetOrientation=%d", resetOrientation ? 1 : 0);
    89 
     165    _viewer->home();
    90166    _needsRedraw = true;
    91167}
     
    109185          x, y, (absolute ? 1 : 0));
    110186
     187    _manipulator->pan(x, y);
     188    _needsRedraw = true;
     189}
     190
     191void Renderer::rotateCamera(double x, double y, bool absolute)
     192{
     193    TRACE("Enter: %g %g, abs: %d",
     194          x, y, (absolute ? 1 : 0));
     195
     196    _manipulator->rotate(x, y);
    111197    _needsRedraw = true;
    112198}
     
    123209          z, (absolute ? 1 : 0));
    124210
     211    // FIXME: zoom here wants y mouse coords in normalized viewport coords
     212
     213    _manipulator->zoom(0, z);
    125214    _needsRedraw = true;
    126215}
     
    159248
    160249    if (_needsRedraw) {
    161         // TODO: render
     250        double _runMaxFrameRate = 60.0;
     251        double minFrameTime = _runMaxFrameRate>0.0 ? 1.0/_runMaxFrameRate : 0.0;
     252        osg::Timer_t startFrameTick = osg::Timer::instance()->tick();
     253        TRACE("Before frame()");
    162254        _viewer->frame();
     255        TRACE("After frame()");
     256        osg::Timer_t endFrameTick = osg::Timer::instance()->tick();
     257        double frameTime = osg::Timer::instance()->delta_s(startFrameTick, endFrameTick);
     258        TRACE("Frame time: %g sec", frameTime);
     259        if (frameTime < minFrameTime) {
     260            TRACE("Sleeping for %g secs", minFrameTime-frameTime);
     261            OpenThreads::Thread::microSleep(static_cast<unsigned int>(1000000.0*(minFrameTime-frameTime)));
     262        }
     263        if (_viewer->getViewerStats() != NULL) {
     264            _viewer->getViewerStats()->report(std::cerr, _viewer->getViewerStats()->getLatestFrameNumber());
     265        }
    163266        _needsRedraw = false;
    164267        return true;
     
    170273 * \brief Read back the rendered framebuffer image
    171274 */
    172 void Renderer::getRenderedFrame(osg::Image *image)
    173 {
    174    
    175 }
     275osg::Image *Renderer::getRenderedFrame()
     276{
     277    return _captureCallback->getImage();
     278}
  • trunk/packages/vizservers/geovis/Renderer.h

    r3998 r4009  
    1919#include <osgViewer/Viewer>
    2020
     21#include <osgEarth/Map>
     22#include <osgEarth/ImageLayer>
     23#include <osgEarth/TileSource>
     24#include <osgEarthUtil/EarthManipulator>
     25
    2126#include "Types.h"
    2227#include "Trace.h"
    2328
    2429// Controls if TGA format is sent to client
    25 //#define RENDER_TARGA
     30#define RENDER_TARGA
    2631#define TARGA_BYTES_PER_PIXEL 3
    2732
    2833namespace GeoVis {
     34
     35class ScreenCaptureCallback : public osg::Camera::DrawCallback
     36{
     37public:
     38    ScreenCaptureCallback() :
     39        osg::Camera::DrawCallback()
     40    {
     41        _image = new osg::Image;
     42    }
     43
     44    virtual void operator()(osg::RenderInfo &renderInfo) const
     45    {
     46        TRACE("Enter");
     47        int width, height;
     48        if (renderInfo.getCurrentCamera() == NULL) {
     49            ERROR("No camera");
     50            return;
     51        }
     52        if (renderInfo.getCurrentCamera()->getViewport() == NULL) {
     53            ERROR("No viewport");
     54            return;
     55        }
     56        width = (int)renderInfo.getCurrentCamera()->getViewport()->width();
     57        height = (int)renderInfo.getCurrentCamera()->getViewport()->height();
     58        TRACE("readPixels: %d x %d", width, height);
     59#ifdef RENDER_TARGA
     60        _image->readPixels(0, 0, width, height,
     61                           GL_BGR, GL_UNSIGNED_BYTE);
     62#else
     63        _image->readPixels(0, 0, width, height,
     64                           GL_RGB, GL_UNSIGNED_BYTE);
     65#endif
     66    }
     67
     68    osg::Image *getImage()
     69    {
     70        return _image.get();
     71    }
     72
     73private:
     74    osg::ref_ptr<osg::Image> _image;
     75};
    2976
    3077/**
     
    3683    Renderer();
    3784    virtual ~Renderer();
     85
     86    // Scene
     87
     88    void loadEarthFile(const char *path);
     89
     90    // Image raster layers
     91
     92    void addImageLayer(const char *name, const osgEarth::TileSourceOptions& opts);
     93
     94    void removeImageLayer(const char *name);
     95
     96    void moveImageLayer(const char *name, int pos);
     97
     98    void setImageLayerOpacity(const char *name, double opacity);
     99
     100    void setImageLayerVisibility(const char *name, bool state);
     101
     102    // Elevation raster layers
     103
     104   
     105
     106    // Model layers
     107
     108   
    38109
    39110    // Render window
     
    55126    void setCameraOrientation(const double quat[4], bool absolute = true);
    56127
    57     void panCamera(double x, double y, bool absolute = true);
     128    void panCamera(double x, double y, bool absolute = false);
    58129
    59     void zoomCamera(double z, bool absolute = true);
     130    void rotateCamera(double x, double y, bool absolute = false);
     131
     132    void zoomCamera(double z, bool absolute = false);
    60133
    61134    // Rendering an image
     
    67140    bool render();
    68141
    69     void getRenderedFrame(osg::Image *image);
     142    osg::Image *getRenderedFrame();
    70143
    71144private:
     
    77150
    78151    osg::ref_ptr<osg::Node> _sceneRoot;
    79     //osgEarth::Map *_map;
     152    osg::ref_ptr<osgEarth::Map> _map;
    80153    osg::ref_ptr<osgViewer::Viewer> _viewer;
     154    osg::ref_ptr<ScreenCaptureCallback> _captureCallback;
     155    osg::ref_ptr<osgEarth::Util::EarthManipulator> _manipulator;
    81156};
    82157
  • trunk/packages/vizservers/geovis/RendererCmd.cpp

    r3998 r4009  
    177177
    178178static int
     179CameraRotateOp(ClientData clientData, Tcl_Interp *interp, int objc,
     180               Tcl_Obj *const *objv)
     181{
     182    double x, y;
     183
     184    if (Tcl_GetDoubleFromObj(interp, objv[2], &x) != TCL_OK ||
     185        Tcl_GetDoubleFromObj(interp, objv[3], &y) != TCL_OK) {
     186        return TCL_ERROR;
     187    }
     188
     189    g_renderer->rotateCamera(x, y);
     190    return TCL_OK;
     191}
     192
     193static int
    179194CameraZoomOp(ClientData clientData, Tcl_Interp *interp, int objc,
    180195            Tcl_Obj *const *objv)
     
    191206
    192207static Rappture::CmdSpec cameraOps[] = {
    193     {"orient", 3, CameraOrientOp, 6, 6, "qw qx qy qz"},
     208    {"orient", 1, CameraOrientOp, 6, 6, "qw qx qy qz"},
    194209    {"pan",    1, CameraPanOp, 4, 4, "panX panY"},
    195210    {"reset",  2, CameraResetOp, 2, 3, "?all?"},
     211    {"rotate", 2, CameraRotateOp, 4, 4, "azimuth elevation"},
    196212    {"zoom",   1, CameraZoomOp, 3, 3, "zoomAmount"}
    197213};
     
    296312
    297313static int
     314RendererLoadOp(ClientData clientData, Tcl_Interp *interp, int objc,
     315               Tcl_Obj *const *objv)
     316{
     317    g_renderer->loadEarthFile(Tcl_GetString(objv[2]));
     318    return TCL_OK;
     319}
     320
     321static int
    298322RendererRenderOp(ClientData clientData, Tcl_Interp *interp, int objc,
    299323                 Tcl_Obj *const *objv)
     
    304328
    305329static Rappture::CmdSpec rendererOps[] = {
    306     {"render",     1, RendererRenderOp, 2, 2, ""}
     330    {"load",       1, RendererLoadOp, 3, 3, "path"},
     331    {"render",     1, RendererRenderOp, 2, 2, ""},
    307332};
    308333static int nRendererOps = NumCmdSpecs(rendererOps);
Note: See TracChangeset for help on using the changeset viewer.