Changeset 4636 for geovis/trunk/Renderer.cpp
- Timestamp:
- Sep 19, 2014 12:04:45 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
geovis/trunk/Renderer.cpp
r4635 r4636 12 12 #include <cstdlib> 13 13 14 #include <limits> 14 15 #include <set> 15 16 … … 986 987 } 987 988 989 bool 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 988 1038 /** 989 1039 * \brief Map screen mouse coordinates to map coordinates … … 1009 1059 osg::Vec3d world; 1010 1060 if (_mapNode->getTerrain()->getWorldCoordsUnderMouse(_viewer->asView(), mouseX, mouseY, world)) { 1011 map.fromWorld( _mapNode->getMapSRS(), world);1061 map.fromWorld(getMapSRS(), world); 1012 1062 return true; 1013 1063 }
Note: See TracChangeset
for help on using the changeset viewer.