Ignore:
Timestamp:
Apr 6, 2014, 5:58:05 PM (10 years ago)
Author:
ldelgass
Message:

Add map coords command to convert screen/mouse x/y to map coords

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

Legend:

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

    r4307 r4320  
    560560
    561561            length = snprintf(mesg, sizeof(mesg),
    562                               "nv>dataset coords %g %g %g\n", x, y, z);
     562                              "nv>map coords %g %g %g\n", x, y, z);
    563563
    564564            queueResponse(mesg, length, Response::VOLATILE);
  • trunk/packages/vizservers/geovis/Renderer.cpp

    r4319 r4320  
    2020#include <osgGA/StateSetManipulator>
    2121#include <osgGA/GUIEventAdapter>
     22#include <osgViewer/ViewerEventHandlers>
    2223
    2324#include <osgEarth/Version>
     
    128129        osgViewer::ViewerBase::Windows windows;
    129130        _viewer->getWindows(windows);
    130         return windows[0]->getEventQueue();
    131     } else {
    132         return NULL;
    133     }
     131        if (windows.size() > 0) {
     132            return windows[0]->getEventQueue();
     133        }
     134    }
     135    return NULL;
    134136}
    135137
     
    242244    //_viewer->setLightingMode(osg::View::SKY_LIGHT);
    243245    _viewer->getCamera()->setClearColor(osg::Vec4(_bgColor[0], _bgColor[1], _bgColor[2], 1));
     246    _viewer->getCamera()->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    244247    _viewer->getCamera()->setNearFarRatio(0.00002);
    245248    _viewer->getCamera()->setSmallFeatureCullingPixelSize(-1.0f);
    246249    _stateManip = new osgGA::StateSetManipulator(_viewer->getCamera()->getOrCreateStateSet());
    247250    _viewer->addEventHandler(_stateManip);
     251    //_viewer->addEventHandler(new osgViewer::StatsHandler());
    248252}
    249253
     
    251255    initViewer();
    252256    if (!_viewer->isRealized()) {
     257#ifdef USE_OFFSCREEN_RENDERING
     258#ifdef USE_PBUFFER
     259        osg::ref_ptr<osg::GraphicsContext> pbuffer;
     260        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
     261        traits->x = 0;
     262        traits->y = 0;
     263        traits->width = _windowWidth;
     264        traits->height = _windowHeight;
     265        traits->red = 8;
     266        traits->green = 8;
     267        traits->blue = 8;
     268        traits->alpha = 8;
     269        traits->windowDecoration = false;
     270        traits->pbuffer = true;
     271        traits->doubleBuffer = true;
     272        traits->sharedContext = 0;
     273
     274        pbuffer = osg::GraphicsContext::createGraphicsContext(traits.get());
     275        if (pbuffer.valid()) {
     276            TRACE("Pixel buffer has been created successfully.");
     277        } else {
     278            ERROR("Pixel buffer has not been created successfully.");
     279        }
     280        osg::Camera *camera = new osg::Camera;
     281        camera->setGraphicsContext(pbuffer.get());
     282        camera->setViewport(new osg::Viewport(0, 0, _windowWidth, _windowHeight));
     283        GLenum buffer = pbuffer->getTraits()->doubleBuffer ? GL_BACK : GL_FRONT;
     284        camera->setDrawBuffer(buffer);
     285        camera->setReadBuffer(buffer);
     286        _captureCallback = new ScreenCaptureCallback();
     287        camera->setFinalDrawCallback(_captureCallback.get());
     288        _viewer->addSlave(camera, osg::Matrixd(), osg::Matrixd());
     289#else
     290        _viewer->getCamera()->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
     291        osg::Texture2D* texture2D = new osg::Texture2D;
     292        texture2D->setTextureSize(_windowWidth, _windowHeight);
     293        texture2D->setInternalFormat(GL_RGBA);
     294        texture2D->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::NEAREST);
     295        texture2D->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::NEAREST);
     296
     297        _viewer->getCamera()->setImplicitBufferAttachmentMask(0, 0);
     298        _viewer->getCamera()->attach(osg::Camera::COLOR_BUFFER0, texture2D);
     299        //_viewer->getCamera()->attach(osg::Camera::DEPTH_BUFFER, GL_DEPTH_COMPONENT24);
     300        _viewer->getCamera()->attach(osg::Camera::PACKED_DEPTH_STENCIL_BUFFER, GL_DEPTH24_STENCIL8_EXT);
     301        _captureCallback = new ScreenCaptureCallback(texture2D);
     302        _viewer->getCamera()->setFinalDrawCallback(_captureCallback.get());
     303        _viewer->setUpViewInWindow(0, 0, _windowWidth, _windowHeight);
     304#endif
     305#else
    253306        _captureCallback = new ScreenCaptureCallback();
    254307        _viewer->getCamera()->setFinalDrawCallback(_captureCallback.get());
     308        //_viewer->getCamera()->getDisplaySettings()->setDoubleBuffer(false);
    255309        _viewer->setUpViewInWindow(0, 0, _windowWidth, _windowHeight);
     310#endif
    256311        _viewer->realize();
    257312        initColorMaps();
     
    618673bool Renderer::mapMouseCoords(float mouseX, float mouseY, osgEarth::GeoPoint& map)
    619674{
    620     if (!_mapNode.valid()) {
    621         ERROR("No map");
     675    if (!_mapNode.valid() || _mapNode->getTerrain() == NULL) {
     676        ERROR("No map");
     677        return false;
     678    }
     679    if (!_viewer.valid()) {
     680        ERROR("No Viewer");
    622681        return false;
    623682    }
     
    914973    _windowHeight = height;
    915974    if (_viewer.valid()) {
     975#ifdef USE_OFFSCREEN_RENDERING
     976#ifdef USE_PBUFFER
     977        osg::ref_ptr<osg::GraphicsContext> pbuffer;
     978        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
     979        traits->x = 0;
     980        traits->y = 0;
     981        traits->width = _windowWidth;
     982        traits->height = _windowHeight;
     983        traits->red = 8;
     984        traits->green = 8;
     985        traits->blue = 8;
     986        traits->alpha = 8;
     987        traits->windowDecoration = false;
     988        traits->pbuffer = true;
     989        traits->doubleBuffer = true;
     990        traits->sharedContext = 0;
     991
     992        pbuffer = osg::GraphicsContext::createGraphicsContext(traits.get());
     993        if (pbuffer.valid()) {
     994            TRACE("Pixel buffer has been created successfully.");
     995        } else {
     996            ERROR("Pixel buffer has not been created successfully.");
     997        }
     998        osg::Camera *camera = new osg::Camera;
     999        camera->setGraphicsContext(pbuffer.get());
     1000        camera->setViewport(new osg::Viewport(0, 0, _windowWidth, _windowHeight));
     1001        GLenum buffer = pbuffer->getTraits()->doubleBuffer ? GL_BACK : GL_FRONT;
     1002        camera->setDrawBuffer(buffer);
     1003        camera->setReadBuffer(buffer);
     1004        camera->setFinalDrawCallback(_captureCallback.get());
     1005        _viewer->addSlave(camera, osg::Matrixd(), osg::Matrixd());
     1006        _viewer->realize();
     1007#else
     1008        if (_captureCallback.valid()) {
     1009            _captureCallback->getTexture()->setTextureSize(_windowWidth, _windowHeight);
     1010        }
    9161011        osgViewer::ViewerBase::Windows windows;
    9171012        _viewer->getWindows(windows);
     
    9211016            ERROR("Num windows: %lu", windows.size());
    9221017        }
     1018#endif
     1019#else
     1020        osgViewer::ViewerBase::Windows windows;
     1021        _viewer->getWindows(windows);
     1022        if (windows.size() == 1) {
     1023            windows[0]->setWindowRectangle(0, 0, _windowWidth, _windowHeight);
     1024        } else {
     1025            ERROR("Num windows: %lu", windows.size());
     1026        }
     1027#endif
    9231028        _needsRedraw = true;
    9241029    }
  • trunk/packages/vizservers/geovis/Renderer.h

    r4319 r4320  
    4949{
    5050public:
    51     ScreenCaptureCallback() :
    52         osg::Camera::DrawCallback()
     51    ScreenCaptureCallback(osg::Texture2D *texture = NULL) :
     52        osg::Camera::DrawCallback(),
     53        _texture(texture)
    5354    {
    5455        _image = new osg::Image;
     
    7071        height = (int)renderInfo.getCurrentCamera()->getViewport()->height();
    7172        TRACE("readPixels: %d x %d", width, height);
     73#if 0 //USE_OFFSCREEN_FRAMEBUFFER
     74        _image = _texture->getImage();
     75#else
    7276#ifdef RENDER_TARGA
    7377        _image->readPixels(0, 0, width, height,
     
    7781                           GL_RGB, GL_UNSIGNED_BYTE);
    7882#endif
     83#endif
    7984    }
    8085
     
    8489    }
    8590
     91    osg::Texture2D *getTexture()
     92    {
     93        return _texture.get();
     94    }
     95
    8696private:
     97    osg::ref_ptr<osg::Texture2D> _texture;
    8798    osg::ref_ptr<osg::Image> _image;
    8899};
  • trunk/packages/vizservers/geovis/RendererCmd.cpp

    r4319 r4320  
    667667    }
    668668    return (*proc) (clientData, interp, objc, objv);
     669}
     670
     671static int
     672MapCoordsOp(ClientData clientData, Tcl_Interp *interp, int objc,
     673            Tcl_Obj *const *objv)
     674{
     675    int x, y;
     676    if (Tcl_GetIntFromObj(interp, objv[2], &x) != TCL_OK ||
     677        Tcl_GetIntFromObj(interp, objv[3], &y) != TCL_OK) {
     678        return TCL_ERROR;
     679    }
     680
     681    osgEarth::GeoPoint mapPoint;
     682    size_t length;
     683    char mesg[256];
     684    if (g_renderer->mapMouseCoords(x, y, mapPoint)) {
     685        // send coords to client
     686        length = snprintf(mesg, sizeof(mesg),
     687                          "nv>map coords %g %g %g %d %d\n",
     688                          mapPoint.x(), mapPoint.y(), mapPoint.z(),
     689                          x, y);
     690
     691        queueResponse(mesg, length, Response::VOLATILE);
     692    } else {
     693        // Out of range
     694        length = snprintf(mesg, sizeof(mesg),
     695                          "nv>map coords invalid %d %d\n", x, y);
     696
     697        queueResponse(mesg, length, Response::VOLATILE);
     698    }
     699    return TCL_OK;
    669700}
    670701
     
    951982    std::ostringstream oss;
    952983    size_t len = 0;
    953     oss << "nv>dataset names {";
     984    oss << "nv>map names {";
    954985    len += 18;
    955986    for (size_t i = 0; i < layers.size(); i++) {
     
    12221253
    12231254static CmdSpec mapOps[] = {
     1255    {"coords",   1, MapCoordsOp,      4, 4, "x y"},
    12241256    {"grid",     1, MapGraticuleOp,   3, 4, "bool ?type?"},
    12251257    {"layer",    2, MapLayerOp,       3, 0, "op ?params...?"},
  • trunk/packages/vizservers/geovis/geovis_protocol.txt

    r4282 r4320  
    2929== General dataset, scene and renderer commands ==
    3030
     31camera delete <name>
     32       Delete named viewpoint
     33camera dist <distance>
     34       Set camera distance from focal point
     35camera get
     36       Request camera parameters
    3137camera orient <quatW> <quatX> <quatY> <quatZ>
    3238       Set scene orientation using a quaternion
     
    3844camera reset <?all?>
    3945       Option all resets orientation/rotation as well as pan/zoom/clip range
     46camera restore <name> <?duration?>
     47       Set viewpoint to a named viewpoint, with optional animation duration in seconds
    4048camera rotate <x> <y>
    4149       Specify relative rotation in viewport coordinates
    42 camera zoom <z>
    43        Specify zoom ratio.  z > 1 is a zoom in, z < 1 is zoom out. z = 1
    44        resets to default.
     50camera save <name>
     51       Save current viewpoint to a named viewpoint
     52camera set <x> <y> <z> <heading> <pitch> <distance> <?duration?> <?srs?> <?vertDatum?>
     53       Explicitly set camera parameters, with optional animation duration in seconds
     54       <x>, <y> = Map coordinates of focal point
     55       <z> = Altitude of focal point (see vertDatum)
     56       <heading> = Azimuth in degrees
     57       <pitch> = Elevation in degrees
     58       <distance> = Distance of camera from focal point in map units(?)
     59       <srs> = coordinate system, defaults to map coordinate system
     60       <vertDatum> = vertical datum for interpreting z coordinate
     61camera zoom <y>
     62       Specify zoom by viewport coordinates (i.e. normalized y mouse coords)
    4563
    4664clientinfo <list>
     65
     66key press <key>
     67key release <key>
    4768
    4869mouse click <button> <x> <y>
     
    5980screen size <width> <height>
    6081
     82map coords <x> <y>
     83    Translate screen/mouse coordinates into map coordinates
     84
    6185General form:
    62 map layer add <type> <url> ... <layerName>
    63     <type> = image|wms|tms|elevation|point|polygon|line|text
     86map layer add <type> <driver> <url> ... <layerName>
     87    <type> = image|elevation|line|point|polygon|text
     88    <driver> = gdal|wms|tms
    6489
    6590Specific layer types:
    66 map layer add image <url> <layerName>
     91map layer add image gdal <url> <layerName>
    6792    Add a GDAL image layer from a file or URL
    68 map layer add wms <url> <layers> <format> <transparent> <layerName>
     93map layer add image wms <url> <layers> <format> <transparent> <layerName>
    6994    Add a WMS image layer from a URL + layer string
    7095    <url> = URL of WMS service
     
    7297    <format> = Image format to return (e.g. 'png')
    7398    <transparent> = bool
    74 map layer add tms <url> <layerName>
     99map layer add image tms <url> <layerName>
    75100    Add a TMS image layer from a URL
    76101    <url> = URL of TMS service
    77 map layer add elevation <url> <layerName>
    78     Add a GDAL elevation image layer from a file or URL
     102map layer add elevation <driver> <url> <layerName>
     103    Add an elevation image layer from a file or URL
     104    <driver> = gdal|tms|wms
    79105map layer add point <url> <layerName>
    80106    Add a point feature layer from a file or URL
Note: See TracChangeset for help on using the changeset viewer.