Ignore:
Timestamp:
Sep 19, 2014 12:04:45 PM (7 years ago)
Author:
ldelgass
Message:

screen coords command now takes a list of coordinates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • geovis/trunk/Renderer.cpp

    r4635 r4636  
    1212#include <cstdlib>
    1313
     14#include <limits>
    1415#include <set>
    1516
     
    986987}
    987988
     989bool Renderer::worldToScreen(std::vector<osg::Vec3d>& coords, bool invertY)
     990{
     991    if (!_viewer.valid()) {
     992        ERROR("No viewer");
     993        return false;
     994    }
     995    osg::Camera *cam = _viewer->getCamera();
     996    osg::Matrixd MVP = cam->getViewMatrix() * cam->getProjectionMatrix();
     997    const osg::Viewport *viewport = cam->getViewport();
     998    for (std::vector<osg::Vec3d>::iterator itr = coords.begin();
     999         itr != coords.end(); ++itr) {
     1000        // Get clip coords
     1001        osg::Vec4d pt;
     1002        pt = osg::Vec4d(*itr, 1.0) * MVP;
     1003        // Clip
     1004        if (pt.x() < -pt.w() ||
     1005            pt.x() > pt.w() ||
     1006            pt.y() < -pt.w() ||
     1007            pt.y() > pt.w() ||
     1008            pt.z() < -pt.w() ||
     1009            pt.z() > pt.w()) {
     1010            // Outside frustum
     1011            TRACE("invalid pt: %g,%g,%g,%g", pt.x(), pt.y(), pt.z(), pt.w());
     1012            itr->set(std::numeric_limits<double>::quiet_NaN(),
     1013                     std::numeric_limits<double>::quiet_NaN(),
     1014                     std::numeric_limits<double>::quiet_NaN());
     1015            continue;
     1016        }
     1017        TRACE("clip pt: %g,%g,%g,%g", pt.x(), pt.y(), pt.z(), pt.w());
     1018        // Perspective divide: now NDC
     1019        pt /= pt.w();
     1020#if 1
     1021        itr->x() = viewport->x() + viewport->width() * 0.5 + pt.x() * viewport->width() * 0.5;
     1022        itr->y() = viewport->y() + viewport->height() * 0.5 + pt.y() * viewport->height() * 0.5;
     1023        //double near = 0;
     1024        //double far = 1;
     1025        //itr->z() = (far + near) * 0.5 + (far - near) * 0.5 * pt.z();
     1026        itr->z() = 0.5 + 0.5 * pt.z();
     1027#else
     1028        *itr = osg::Vec3d(pt.x(), pt.y(), pt.z()) * viewport->computeWindowMatrix();
     1029#endif
     1030        if (invertY) {
     1031            itr->y() = viewport->height() - itr->y();
     1032        }
     1033        TRACE("screen: %g,%g,%g", itr->x(), itr->y(), itr->z());
     1034    }
     1035    return true;
     1036}
     1037
    9881038/**
    9891039 * \brief Map screen mouse coordinates to map coordinates
     
    10091059    osg::Vec3d world;
    10101060    if (_mapNode->getTerrain()->getWorldCoordsUnderMouse(_viewer->asView(), mouseX, mouseY, world)) {
    1011         map.fromWorld(_mapNode->getMapSRS(), world);
     1061        map.fromWorld(getMapSRS(), world);
    10121062        return true;
    10131063    }
Note: See TracChangeset for help on using the changeset viewer.