Changeset 13041 for OpenSceneGraph/trunk/src/osgSim/OverlayNode.cpp
- Timestamp:
- 03/21/12 18:36:20 (14 months ago)
- Files:
-
- 1 modified
-
OpenSceneGraph/trunk/src/osgSim/OverlayNode.cpp (modified) (91 diffs)
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/src/osgSim/OverlayNode.cpp
r12389 r13041 1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield 1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield 2 2 * 3 * This library is open source and may be redistributed and/or modified under 4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or 3 * This library is open source and may be redistributed and/or modified under 4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or 5 5 * (at your option) any later version. The full license is in LICENSE file 6 6 * included with this distribution, and on the openscenegraph.org website. 7 * 7 * 8 8 * This library is distributed in the hope that it will be useful, 9 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 11 * OpenSceneGraph Public License for more details. 12 12 */ … … 60 60 const osg::Vec3d v101(1.0,-1.0,1.0); 61 61 const osg::Vec3d v111(1.0,1.0,1.0); 62 62 63 63 _faces.clear(); 64 64 … … 67 67 face.name = "left"; 68 68 face.plane.set(1.0,0.0,0.0,1.0); 69 face.vertices.reserve(4); 69 face.vertices.reserve(4); 70 70 face.vertices.push_back(v000); 71 71 face.vertices.push_back(v001); … … 106 106 face.vertices.push_back(v110); 107 107 } 108 108 109 109 if (withNear) 110 110 { // near plane … … 117 117 face.vertices.push_back(v110); 118 118 face.vertices.push_back(v100); 119 } 120 119 } 120 121 121 if (withFar) 122 122 { // far plane … … 129 129 face.vertices.push_back(v111); 130 130 face.vertices.push_back(v011); 131 } 131 } 132 132 133 133 } … … 135 135 void setToBoundingBox(const osg::BoundingBox& bb) 136 136 { 137 #if 0 137 #if 0 138 138 OSG_NOTICE<<"setToBoundingBox xrange "<<bb.xMin()<<" "<<bb.xMax()<<std::endl; 139 139 OSG_NOTICE<<" "<<bb.yMin()<<" "<<bb.yMax()<<std::endl; 140 140 OSG_NOTICE<<" "<<bb.zMin()<<" "<<bb.zMax()<<std::endl; 141 #endif 141 #endif 142 142 const osg::Vec3d v000(bb.xMin(),bb.yMin(), bb.zMin()); 143 143 const osg::Vec3d v010(bb.xMin(),bb.yMax(), bb.zMin()); … … 148 148 const osg::Vec3d v101(bb.xMax(),bb.yMin(), bb.zMax()); 149 149 const osg::Vec3d v111(bb.xMax(),bb.yMax(), bb.zMax()); 150 150 151 151 _faces.clear(); 152 152 … … 203 203 face.vertices.push_back(v110); 204 204 face.vertices.push_back(v100); 205 } 206 205 } 206 207 207 { // z max plane 208 208 Face& face = createFace(); … … 214 214 face.vertices.push_back(v111); 215 215 face.vertices.push_back(v011); 216 } 217 216 } 217 218 218 } 219 219 … … 232 232 *vitr = *vitr * matrix; 233 233 } 234 } 234 } 235 235 } 236 236 … … 239 239 { 240 240 // OSG_NOTICE<<"Inserting vertex "<<vertex<<std::endl; 241 241 242 242 Faces removedFaces; 243 243 244 244 Faces::iterator itr; 245 245 for(itr = _faces.begin(); … … 258 258 } 259 259 } 260 261 if (removedFaces.empty()) return; 260 261 if (removedFaces.empty()) return; 262 262 263 263 typedef std::pair<osg::Vec3d, osg::Vec3d> Edge; … … 265 265 Edges edges; 266 266 267 double numVerticesAdded=0.0; 267 double numVerticesAdded=0.0; 268 268 osg::Vec3d center; 269 269 for(itr = removedFaces.begin(); … … 279 279 if (a<b) ++edges[Edge(a,b)]; 280 280 else ++edges[Edge(b,a)]; 281 281 282 282 center += a; 283 283 numVerticesAdded += 1.0; 284 284 } 285 285 } 286 286 287 287 if (numVerticesAdded==0.0) return; 288 288 center /= numVerticesAdded; 289 289 290 290 typedef std::set<osg::Vec3> VertexSet; 291 291 VertexSet uniqueVertices; 292 292 293 293 for(Edges::iterator eitr = edges.begin(); 294 294 eitr != edges.end(); 295 295 ++eitr) 296 296 { 297 if (eitr->second==1) 297 if (eitr->second==1) 298 298 { 299 299 // OSG_NOTICE<<" edge Ok"<<std::endl; … … 307 307 if (face.plane.distance(center)<0.0) face.plane.flip(); 308 308 _faces.push_back(face); 309 309 310 310 uniqueVertices.insert(edge.first); 311 311 uniqueVertices.insert(edge.second); … … 329 329 baseVertices.push_back(point - normal * (height - minHeight)); 330 330 } 331 331 332 332 //compute centroid of the base vertices 333 333 osg::Vec3d center; … … 346 346 osg::Vec3d normal(center); 347 347 normal.normalize(); 348 348 349 349 osg::Plane basePlane(normal, center); 350 350 351 351 cut(basePlane,"basePlane"); 352 352 } 353 353 354 354 355 355 // OSG_NOTICE<<" Removed faces "<<removedFaces.size()<<std::endl; … … 362 362 363 363 Faces removedFaces; 364 364 365 365 Faces::iterator itr; 366 366 for(itr = _faces.begin(); … … 379 379 } 380 380 } 381 382 if (removedFaces.empty()) return; 381 382 if (removedFaces.empty()) return; 383 383 384 384 typedef std::pair<osg::Vec3d, osg::Vec3d> Edge; … … 386 386 Edges edges; 387 387 388 double numVerticesAdded=0.0; 388 double numVerticesAdded=0.0; 389 389 osg::Vec3d center; 390 390 for(itr = removedFaces.begin(); … … 400 400 if (a<b) ++edges[Edge(a,b)]; 401 401 else ++edges[Edge(b,a)]; 402 402 403 403 center += a; 404 404 numVerticesAdded += 1.0; 405 405 } 406 406 } 407 407 408 408 if (numVerticesAdded==0.0) return; 409 409 center /= numVerticesAdded; 410 410 411 411 typedef std::set<osg::Vec3> VertexSet; 412 412 VertexSet uniqueVertices; 413 413 414 414 for(Edges::iterator eitr = edges.begin(); 415 415 eitr != edges.end(); 416 416 ++eitr) 417 417 { 418 if (eitr->second==1) 418 if (eitr->second==1) 419 419 { 420 420 // OSG_NOTICE<<" edge Ok"<<std::endl; 421 421 const Edge& edge = eitr->first; 422 422 423 423 double h_first = (edge.first-control) * normal; 424 424 osg::Vec3d projected_first = edge.first - normal * h_first; 425 425 426 426 double h_second = (edge.second-control) * normal; 427 427 osg::Vec3d projected_second = edge.second - normal * h_second; 428 428 429 429 Face face; 430 430 face.name = "baseSide"; … … 437 437 if (face.plane.distance(center)<0.0) face.plane.flip(); 438 438 _faces.push_back(face); 439 439 440 440 uniqueVertices.insert(projected_first); 441 441 uniqueVertices.insert(projected_second); 442 442 } 443 443 } 444 444 445 445 Face newFace; 446 446 newFace.name = "basePlane"; 447 447 newFace.plane.set(normal,control); 448 449 osg::Vec3d side = ( fabs(normal.x()) < fabs(normal.y()) ) ? 448 449 osg::Vec3d side = ( fabs(normal.x()) < fabs(normal.y()) ) ? 450 450 osg::Vec3(1.0, 0.0, 0.0) : 451 451 osg::Vec3(0.0, 1.0, 0.0); … … 475 475 newFace.vertices.push_back(aitr->second); 476 476 } 477 477 478 478 _faces.push_back(newFace); 479 479 480 480 481 481 } 482 482 … … 490 490 EdgeMap edgeMap; 491 491 492 492 493 493 for(Faces::iterator itr = _faces.begin(); 494 494 itr != _faces.end(); … … 504 504 } 505 505 } 506 506 507 507 typedef std::set<osg::Vec3> VertexSet; 508 508 VertexSet uniqueVertices; 509 509 510 510 for(EdgeMap::iterator eitr = edgeMap.begin(); 511 511 eitr != edgeMap.end(); … … 520 520 else if (edgeFaces.size()==2) 521 521 { 522 522 523 523 double dotProduct0 = edgeFaces[0]->plane.getNormal() * normal; 524 524 double dotProduct1 = edgeFaces[1]->plane.getNormal() * normal; … … 533 533 // OSG_NOTICE<<" Non silhoette edge found "<<edgeFaces[0]->name<<" "<<edgeFaces[1]->name<<std::endl; 534 534 } 535 535 536 536 } 537 537 else … … 553 553 } 554 554 center /= (double)(uniqueVertices.size()); 555 556 555 556 557 557 // compute the ordered points around silhoette 558 osg::Vec3d side = ( fabs(normal.x()) < fabs(normal.y()) ) ? 558 osg::Vec3d side = ( fabs(normal.x()) < fabs(normal.y()) ) ? 559 559 osg::Vec3(1.0, 0.0, 0.0) : 560 560 osg::Vec3(0.0, 1.0, 0.0); … … 584 584 vertices.push_back(aitr->second); 585 585 } 586 587 586 587 588 588 } 589 589 … … 618 618 Distances distances; 619 619 Vertices newVertices; 620 620 621 621 for(Faces::iterator itr = _faces.begin(); 622 622 itr != _faces.end(); … … 627 627 if (intersect==1) 628 628 { 629 // OSG_NOTICE<<" Face inside"<<std::endl; 629 // OSG_NOTICE<<" Face inside"<<std::endl; 630 630 ++itr; 631 631 } … … 633 633 { 634 634 // OSG_NOTICE<<" Face intersecting - before "<<face.vertices.size()<<std::endl; 635 635 636 636 Vertices& vertices = face.vertices; 637 637 newVertices.clear(); … … 645 645 distances.push_back(plane.distance(*vitr)); 646 646 } 647 647 648 648 for(unsigned int i=0; i<vertices.size(); ++i) 649 649 { … … 657 657 658 658 // add point to new face if point exactly on a plane 659 if (distance_a==0.0) newFace.vertices.push_back(vertices[i]); 659 if (distance_a==0.0) newFace.vertices.push_back(vertices[i]); 660 660 661 661 // does edge intersect plane … … 666 666 newVertices.push_back(intersection); 667 667 newFace.vertices.push_back(intersection); 668 669 // OSG_NOTICE<<" intersection distance "<<plane.distance(intersection)<<std::endl; 668 669 // OSG_NOTICE<<" intersection distance "<<plane.distance(intersection)<<std::endl; 670 670 } 671 671 } 672 672 673 673 vertices.swap(newVertices); 674 674 675 675 // OSG_NOTICE<<" intersecting - after "<<face.vertices.size()<<std::endl; 676 676 … … 679 679 else if (intersect==-1) 680 680 { 681 // OSG_NOTICE<<" Face outside"<<_faces.size()<<std::endl; 681 // OSG_NOTICE<<" Face outside"<<_faces.size()<<std::endl; 682 682 itr = _faces.erase(itr); 683 683 } 684 684 } 685 685 686 686 if (!newFace.vertices.empty()) 687 687 { … … 692 692 Vertices& vertices = newFace.vertices; 693 693 694 osg::Vec3d side = ( fabs(plane.getNormal().x()) < fabs(plane.getNormal().y()) ) ? 694 osg::Vec3d side = ( fabs(plane.getNormal().x()) < fabs(plane.getNormal().y()) ) ? 695 695 osg::Vec3(1.0, 0.0, 0.0) : 696 696 osg::Vec3(0.0, 1.0, 0.0); 697 697 698 698 osg::Vec3 v = plane.getNormal() ^ side; 699 699 v.normalize(); 700 700 701 701 osg::Vec3 u = v ^ plane.getNormal(); 702 702 u.normalize(); … … 724 724 } 725 725 726 726 727 727 newVertices.clear(); 728 728 newVertices.reserve(anglePositions.size()); … … 733 733 newVertices.push_back(aitr->second); 734 734 } 735 735 736 736 newVertices.swap(vertices); 737 737 738 738 // OSG_NOTICE<<" after angle sort "<<newFace.vertices.size()<<std::endl; 739 739 … … 768 768 } 769 769 } 770 770 771 771 for(VerticesSet::iterator sitr = verticesSet.begin(); 772 772 sitr != verticesSet.end(); … … 797 797 } 798 798 } 799 799 800 800 osg::Vec4Array* colours = new osg::Vec4Array; 801 801 colours->push_back(colour); 802 802 geometry->setColorArray(colours); 803 803 geometry->setColorBinding(osg::Geometry::BIND_OVERALL); 804 804 805 805 osg::StateSet* stateset = geometry->getOrCreateStateSet(); 806 806 stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF); 807 807 stateset->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::OFF); 808 808 stateset->setTextureMode(1, GL_TEXTURE_2D, osg::StateAttribute::OFF); 809 809 810 810 return geometry; 811 811 } … … 816 816 Faces _faces; 817 817 818 818 819 819 }; 820 820 … … 850 850 _renderTargetImpl(copy._renderTargetImpl) 851 851 { 852 setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()+1); 852 setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()+1); 853 853 init(); 854 854 } … … 884 884 { 885 885 osg::Group::setThreadSafeRefUnref(threadSafe); 886 886 887 887 if (_overlaySubgraph.valid()) _overlaySubgraph->setThreadSafeRefUnref(threadSafe); 888 888 … … 912 912 { 913 913 osg::Group::releaseGLObjects(state); 914 914 915 915 if (_overlaySubgraph.valid()) _overlaySubgraph->releaseGLObjects(state); 916 916 … … 926 926 { 927 927 if (_overlayTechnique==technique) return; 928 928 929 929 _overlayTechnique = technique; 930 930 931 931 init(); 932 932 } … … 952 952 OverlayDataMap::iterator itr = _overlayDataMap.find(cv); 953 953 if (itr != _overlayDataMap.end()) return itr->second.get(); 954 954 955 955 _overlayDataMap[cv] = new OverlayData; 956 956 957 957 OverlayData* overlayData = _overlayDataMap[cv].get(); 958 959 958 959 960 960 unsigned int tex_width = _textureSizeHint; 961 961 unsigned int tex_height = _textureSizeHint; 962 963 if (!overlayData->_texture) 964 { 962 963 if (!overlayData->_texture) 964 { 965 965 // OSG_NOTICE<<" setting up texture"<<std::endl; 966 966 … … 978 978 #endif 979 979 overlayData->_texture = texture; 980 } 980 } 981 981 982 982 // set up the render to texture camera. … … 987 987 // create the camera 988 988 overlayData->_camera = new osg::Camera; 989 989 990 990 overlayData->_camera->setClearColor(_overlayClearColor); 991 991 … … 994 994 // set viewport 995 995 overlayData->_camera->setViewport(0,0,tex_width,tex_height); 996 996 997 997 overlayData->_camera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR); 998 998 … … 1005 1005 // attach the texture and use it as the color buffer. 1006 1006 overlayData->_camera->attach(osg::Camera::COLOR_BUFFER, overlayData->_texture.get()); 1007 1007 1008 1008 if (_overlaySubgraph.valid()) overlayData->_camera->addChild(_overlaySubgraph.get()); 1009 1009 } … … 1018 1018 if (!overlayData->_lightingEnabled) overlayData->_lightingEnabled = new osg::Uniform("lightingEnabled",true); 1019 1019 1020 if (!overlayData->_overlayStateSet) 1020 if (!overlayData->_overlayStateSet) 1021 1021 { 1022 1022 overlayData->_overlayStateSet = new osg::StateSet; … … 1035 1035 else 1036 1036 { 1037 char vertexShaderSource[] = 1037 char vertexShaderSource[] = 1038 1038 "uniform float y0; \n" 1039 1039 "uniform bool lightingEnabled; \n" … … 1111 1111 program->addShader(vertex_shader); 1112 1112 } 1113 1113 1114 1114 } 1115 1115 … … 1126 1126 else 1127 1127 { 1128 char fragmentShaderSource[] = 1128 char fragmentShaderSource[] = 1129 1129 "uniform sampler2D texture_0; \n" 1130 1130 "uniform sampler2D texture_1; \n" … … 1159 1159 } 1160 1160 1161 if (!overlayData->_mainSubgraphStateSet) 1161 if (!overlayData->_mainSubgraphStateSet) 1162 1162 { 1163 1163 overlayData->_mainSubgraphStateSet = new osg::StateSet; … … 1173 1173 overlayData->_mainSubgraphStateSet->setTextureMode(_textureUnit, GL_TEXTURE_GEN_Q, osg::StateAttribute::ON); 1174 1174 1175 if (_texEnvMode!=GL_NONE) 1175 if (_texEnvMode!=GL_NONE) 1176 1176 { 1177 1177 overlayData->_mainSubgraphStateSet->setTextureAttribute(_textureUnit, new osg::TexEnv((osg::TexEnv::Mode)_texEnvMode)); … … 1201 1201 { 1202 1202 OSG_INFO<<"OverlayNode::init() - OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY"<<std::endl; 1203 1203 1204 1204 // force initialization of _overlayDataMap for the key 0 (or NULL) 1205 1205 getOverlayData(0); … … 1244 1244 if (_continuousUpdate || _updateCamera) 1245 1245 { 1246 1247 1246 1247 1248 1248 // now compute the camera's view and projection matrix to point at the shadower (the camera's children) 1249 1249 osg::BoundingSphere bs; … … 1267 1267 osg::EllipsoidModel* em = csn ? csn->getEllipsoidModel() : 0; 1268 1268 1269 1269 1270 1270 if (em) 1271 1271 { … … 1307 1307 // compute the matrix which takes a vertex from local coords into tex coords 1308 1308 // will use this later to specify osg::TexGen.. 1309 osg::Matrix MVP = camera->getViewMatrix() * 1309 osg::Matrix MVP = camera->getViewMatrix() * 1310 1310 camera->getProjectionMatrix(); 1311 1311 … … 1338 1338 return; 1339 1339 } 1340 1341 1340 1341 1342 1342 unsigned int contextID = cv->getState()!=0 ? cv->getState()->getContextID() : 0; 1343 1343 … … 1349 1349 _textureObjectValidList[contextID] = 1; 1350 1350 } 1351 1352 1351 1352 1353 1353 // now set up the drawing of the main scene. 1354 1354 { 1355 1355 1356 1356 overlayData._texgenNode->accept(*cv); 1357 1357 1358 1358 const osg::Matrix modelView = *(cv->getModelViewMatrix()); 1359 1359 osg::Polytope viewTextureFrustum; … … 1362 1362 cv->getProjectionCullingStack().back().addStateFrustum(overlayData._mainSubgraphStateSet.get(), viewTextureFrustum); 1363 1363 cv->getCurrentCullingSet().addStateFrustum(overlayData._mainSubgraphStateSet.get(), overlayData._textureFrustum); 1364 1364 1365 1365 // push the stateset. 1366 1366 // cv->pushStateSet(_mainSubgraphStateSet.get()); … … 1392 1392 return; 1393 1393 } 1394 1394 1395 1395 OverlayData& overlayData = *getOverlayData(cv); 1396 1396 osg::Camera* camera = overlayData._camera.get(); 1397 1397 1398 if (_overlaySubgraph.valid()) 1398 if (_overlaySubgraph.valid()) 1399 1399 { 1400 1400 … … 1404 1404 overlayData._geode = new osg::Geode; 1405 1405 } 1406 #endif 1406 #endif 1407 1407 // see if we are within a coordinate system node. 1408 1408 osg::CoordinateSystemNode* csn = 0; … … 1422 1422 cv->pushStateSet(overlayData._mainSubgraphStateSet.get()); 1423 1423 1424 Group::traverse(nv); 1424 Group::traverse(nv); 1425 1425 1426 1426 cv->popStateSet(); 1427 1427 1428 1428 osg::Matrix pm = *(cv->getProjectionMatrix()); 1429 1429 1430 1430 double znear = cv->getCalculatedNearPlane(); 1431 1431 double zfar = cv->getCalculatedFarPlane(); 1432 1432 1433 1433 // OSG_NOTICE<<" before znear ="<<znear<<"\t zfar ="<<zfar<<std::endl; 1434 1434 1435 1435 cv->computeNearPlane(); 1436 1436 1437 1437 znear = cv->getCalculatedNearPlane(); 1438 1438 zfar = cv->getCalculatedFarPlane(); … … 1443 1443 1444 1444 cv->clampProjectionMatrixImplementation(pm, znear,zfar); 1445 1445 1446 1446 // OSG_NOTICE<<" after clamp pm="<<pm<<std::endl; 1447 1447 1448 1448 osg::Matrix MVP = *(cv->getModelViewMatrix()) * pm; 1449 1449 osg::Matrix inverseMVP; … … 1458 1458 #endif 1459 1459 frustum.transform(inverseMVP, MVP); 1460 1460 1461 1461 1462 1462 // create polytope for the overlay subgraph in local coords 1463 1463 CustomPolytope overlayPolytope; 1464 1464 1465 // get the bounds of the model. 1465 // get the bounds of the model. 1466 1466 osg::ComputeBoundsVisitor cbbv(osg::NodeVisitor::TRAVERSE_ACTIVE_CHILDREN); 1467 1467 _overlaySubgraph->accept(cbbv); 1468 1468 overlayPolytope.setToBoundingBox(cbbv.getBoundingBox()); 1469 1469 1470 1470 if (em) 1471 1471 { … … 1477 1477 } 1478 1478 1479 1479 1480 1480 if (overlayData._geode.valid() && overlayData._geode->getNumDrawables()>100) 1481 1481 { 1482 1482 overlayData._geode->removeDrawables(0, 3); 1483 } 1483 } 1484 1484 1485 1485 if (overlayData._geode.valid()) … … 1489 1489 } 1490 1490 1491 1491 1492 1492 1493 1493 … … 1495 1495 // OSG_NOTICE<<"AFTER CUT corners = "<<corners.size()<<std::endl; 1496 1496 1497 1497 1498 1498 osg::Vec3d center = _overlaySubgraph->getBound().center(); 1499 1499 1500 1500 osg::Vec3d lookVector(0.0,0.0,-1.0); 1501 1501 if (em) … … 1507 1507 osg::Vec3d sideVectorLV = lookVector ^ cv->getLookVectorLocal(); 1508 1508 osg::Vec3d sideVectorUP = lookVector ^ cv->getUpLocal(); 1509 1509 1510 1510 osg::Vec3d sideVector = sideVectorLV.length() > sideVectorUP.length() ? 1511 1511 sideVectorLV : 1512 1512 sideVectorUP; 1513 1513 1514 1514 sideVector.normalize(); 1515 1515 1516 1516 osg::Vec3d upVector = sideVector ^ lookVector; 1517 1517 upVector.normalize(); 1518 1518 1519 1519 osg::Vec3d overlayLookVector = upVector ^ sideVector; 1520 1520 overlayLookVector.normalize(); 1521 1522 1521 1522 1523 1523 overlayPolytope.cut(frustum); 1524 1524 … … 1541 1541 overlayData._geode->addDrawable(overlayPolytope.createDrawable(osg::Vec4d(1.0f,1.0f,1.0f,1.0f))); 1542 1542 } 1543 1543 1544 1544 1545 1545 // OSG_NOTICE<<" lookVector ="<<lookVector<<std::endl; 1546 1546 1547 1547 double min_side = DBL_MAX; 1548 1548 double max_side = -DBL_MAX; … … 1557 1557 typedef std::vector<osg::Vec2d> ProjectedVertices; 1558 1558 ProjectedVertices projectedVertices; 1559 1559 1560 1560 osg::Vec3 eyeLocal = cv->getEyeLocal(); 1561 1561 1562 1562 1563 1563 // computed the expected near/far ratio … … 1585 1585 if (distance_up>max_up) max_up = distance_up; 1586 1586 } 1587 1587 1588 1588 double mid_side = (min_side + max_side) * 0.5; 1589 1589 double ratio = min_distanceEye / max_distanceEye; … … 1607 1607 if (side_over_up > max_side_over_up) max_side_over_up = side_over_up; 1608 1608 } 1609 osg::Vec3d v000 = osg::Vec3d(-1.0, -1.0, -1.0) * inverseMVP; 1610 osg::Vec3d v010 = osg::Vec3d(-1.0, 1.0, -1.0) * inverseMVP; 1611 osg::Vec3d v100 = osg::Vec3d(1.0, -1.0, -1.0) * inverseMVP; 1612 osg::Vec3d v110 = osg::Vec3d(1.0, 1.0, -1.0) * inverseMVP; 1613 1614 osg::Vec3d v001 = osg::Vec3d(-1.0, -1.0, 1.0) * inverseMVP; 1615 osg::Vec3d v011 = osg::Vec3d(-1.0, 1.0, 1.0) * inverseMVP; 1616 osg::Vec3d v101 = osg::Vec3d(1.0, -1.0, 1.0) * inverseMVP; 1617 osg::Vec3d v111 = osg::Vec3d(1.0, 1.0, 1.0) * inverseMVP; 1609 osg::Vec3d v000 = osg::Vec3d(-1.0, -1.0, -1.0) * inverseMVP; 1610 osg::Vec3d v010 = osg::Vec3d(-1.0, 1.0, -1.0) * inverseMVP; 1611 osg::Vec3d v100 = osg::Vec3d(1.0, -1.0, -1.0) * inverseMVP; 1612 osg::Vec3d v110 = osg::Vec3d(1.0, 1.0, -1.0) * inverseMVP; 1613 1614 osg::Vec3d v001 = osg::Vec3d(-1.0, -1.0, 1.0) * inverseMVP; 1615 osg::Vec3d v011 = osg::Vec3d(-1.0, 1.0, 1.0) * inverseMVP; 1616 osg::Vec3d v101 = osg::Vec3d(1.0, -1.0, 1.0) * inverseMVP; 1617 osg::Vec3d v111 = osg::Vec3d(1.0, 1.0, 1.0) * inverseMVP; 1618 1618 1619 1619 … … 1626 1626 edgeTopLeft.normalize(); 1627 1627 edgeTopRight.normalize(); 1628 1629 1628 1629 1630 1630 double frustumDiagonal = osg::RadiansToDegrees(acos(edgeBottomLeft * edgeBottomRight)); 1631 1632 1631 1632 1633 1633 //OSG_NOTICE<<" width ratio = "<<new_width/original_width<<std::endl; 1634 1634 //OSG_NOTICE<<" near ratio = "<<ratio * new_width/original_width<<std::endl; … … 1639 1639 { 1640 1640 double maxHalfAngle = osg::DegreesToRadians(30.0); 1641 1641 1642 1642 // move ratio back 1643 1643 max_side_over_up = tan(maxHalfAngle); 1644 1644 double lowest_up = min_up; 1645 1645 1646 1646 for(i=0; i< projectedVertices.size(); ++i) 1647 1647 { 1648 1648 double delta_side = fabs(projectedVertices[i].x() - mid_side); 1649 double delta_up = delta_side / max_side_over_up; 1649 double delta_up = delta_side / max_side_over_up; 1650 1650 double local_base_up = projectedVertices[i].y() - delta_up; 1651 1651 if (local_base_up < lowest_up) … … 1655 1655 } 1656 1656 } 1657 1657 1658 1658 double new_ratio = (min_up-lowest_up)/(max_up-lowest_up); 1659 1659 1660 1660 //OSG_NOTICE<<" originalRatio = "<<ratio<<" new_ratio="<<new_ratio<<std::endl; 1661 1661 1662 1662 if (new_ratio > ratio) ratio = new_ratio; 1663 1663 1664 1664 base_up = lowest_up; 1665 1665 … … 1669 1669 min_side = mid_side - max_half_width; 1670 1670 max_side = mid_side + max_half_width; 1671 1671 1672 1672 // double new_width = max_side-min_side; 1673 1673 1674 1674 1675 1675 double y0 = (1.0 + ratio) / (1.0 - ratio); 1676 1676 overlayData._y0->set(static_cast<float>(y0)); 1677 1677 1678 1678 1679 1679 // OSG_NOTICE<<"y0 = "<<y0<<std::endl; 1680 1680 1681 1681 overlayData._mainSubgraphStateSet->setAttribute(overlayData._mainSubgraphProgram.get()); 1682 1682 1683 1683 osg::Matrixd projection; 1684 1684 projection.makeOrtho(min_side,max_side,min_up,max_up,zNear ,zFar); 1685 1685 1686 1686 camera->setProjectionMatrix(projection); 1687 1687 1688 1688 } 1689 1689 else … … 1697 1697 double width = max_side-min_side; 1698 1698 double height = max_up-min_up; 1699 double area = width*height; 1699 double area = width*height; 1700 1700 1701 1701 OSG_NOTICE<<"width = "<<width<<"\t height = "<<height<<"\t area = "<<area<<std::endl; … … 1706 1706 OSG_NOTICE<<"a max_up = "<<max_up<<std::endl; 1707 1707 #endif 1708 1708 1709 1709 if (em) 1710 1710 { … … 1739 1739 { 1740 1740 cv->pushStateSet(overlayData._overlayStateSet.get()); 1741 1741 1742 1742 typedef std::list<const osg::StateSet*> StateSetStack; 1743 1743 StateSetStack statesetStack; 1744 1744 1745 1745 osgUtil::StateGraph* sg = cv->getCurrentStateGraph(); 1746 1746 while(sg) … … 1750 1750 { 1751 1751 statesetStack.push_front(stateset); 1752 } 1752 } 1753 1753 sg = sg->_parent; 1754 1754 } 1755 1755 1756 1756 osg::StateAttribute::GLModeValue base_mode = osg::StateAttribute::ON; 1757 1757 for(StateSetStack::iterator itr = statesetStack.begin(); … … 1769 1769 } 1770 1770 } 1771 1771 1772 1772 overlayData._lightingEnabled->set((base_mode & osg::StateAttribute::ON)!=0); 1773 1773 } 1774 1774 1775 1775 // if we need to redraw then do cull traversal on camera. 1776 1776 camera->setClearColor(_overlayClearColor); … … 1792 1792 else 1793 1793 { 1794 Group::traverse(nv); 1795 } 1796 1794 Group::traverse(nv); 1795 } 1796 1797 1797 // OSG_NOTICE<<" "<<&overlayData<<std::endl; 1798 1798 } … … 1851 1851 if (_textureSizeHint == size) return; 1852 1852 1853 _textureSizeHint = size; 1853 _textureSizeHint = size; 1854 1854 1855 1855 … … 1877 1877 1878 1878 osg::StateSet* mainSubgraphStateSet = itr->second->_mainSubgraphStateSet.get(); 1879 if (mainSubgraphStateSet) 1879 if (mainSubgraphStateSet) 1880 1880 { 1881 1881 mainSubgraphStateSet->clear(); … … 1886 1886 mainSubgraphStateSet->setTextureMode(_textureUnit, GL_TEXTURE_GEN_Q, osg::StateAttribute::ON); 1887 1887 1888 if (_texEnvMode!=GL_NONE) 1888 if (_texEnvMode!=GL_NONE) 1889 1889 { 1890 1890 mainSubgraphStateSet->setTextureAttribute(_textureUnit, new osg::TexEnv((osg::TexEnv::Mode)_texEnvMode));
