Changeset 10588 for OpenSceneGraph/trunk/src/osgViewer/CompositeViewer.cpp
- Timestamp:
- 09/22/09 20:45:24 (4 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/src/osgViewer/CompositeViewer.cpp
r10520 r10588 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 */ … … 85 85 _frameStamp->setReferenceTime(0); 86 86 _frameStamp->setSimulationTime(0); 87 87 88 88 _eventVisitor = new osgGA::EventVisitor; 89 89 _eventVisitor->setFrameStamp(_frameStamp.get()); 90 90 91 91 _updateVisitor = new osgUtil::UpdateVisitor; 92 92 _updateVisitor->setFrameStamp(_frameStamp.get()); … … 100 100 101 101 stopThreading(); 102 102 103 103 Scenes scenes; 104 104 getScenes(scenes); 105 105 106 106 for(Scenes::iterator sitr = scenes.begin(); 107 107 sitr != scenes.end(); … … 149 149 150 150 bool alreadyRealized = isRealized(); 151 151 152 152 bool threadsWereRunning = _threadsRunning; 153 153 if (threadsWereRunning) stopThreading(); 154 154 155 155 _views.push_back(view); 156 156 157 157 view->_viewerBase = this; 158 158 159 159 if (view->getSceneData()) 160 { 160 { 161 161 // make sure that existing scene graph objects are allocated with thread safe ref/unref 162 if (getThreadingModel()!=ViewerBase::SingleThreaded) 162 if (getThreadingModel()!=ViewerBase::SingleThreaded) 163 163 { 164 164 view->getSceneData()->setThreadSafeRefUnref(true); 165 165 } 166 166 167 167 // update the scene graph so that it has enough GL object buffer memory for the graphics contexts that will be using it. 168 168 view->getSceneData()->resizeGLObjectBuffers(osg::DisplaySettings::instance()->getMaxNumberOfGraphicsContexts()); … … 170 170 171 171 view->setFrameStamp(_frameStamp.get()); 172 172 173 173 if (alreadyRealized) 174 174 { … … 197 197 198 198 } 199 199 200 200 if (threadsWereRunning) startThreading(); 201 201 } … … 237 237 if ((*citr)->isRealized()) ++numRealizedWindows; 238 238 } 239 239 240 240 return numRealizedWindows > 0; 241 241 } … … 281 281 } 282 282 } 283 283 284 284 setReleaseContextAtEndOfFrameHint(false); 285 285 … … 290 290 { 291 291 _startTick = tick; 292 292 293 293 for(RefViews::iterator vitr = _views.begin(); 294 294 vitr != _views.end(); … … 297 297 (*vitr)->setStartTick(tick); 298 298 } 299 299 300 300 Contexts contexts; 301 301 getContexts(contexts,false); … … 381 381 { 382 382 cameras.clear(); 383 383 384 384 for(RefViews::iterator vitr = _views.begin(); 385 385 vitr != _views.end(); … … 388 388 View* view = vitr->get(); 389 389 390 if (view->getCamera() && 390 if (view->getCamera() && 391 391 (!onlyActive || (view->getCamera()->getGraphicsContext() && view->getCamera()->getGraphicsContext()->valid())) ) cameras.push_back(view->getCamera()); 392 392 … … 400 400 } 401 401 } 402 402 403 403 void CompositeViewer::getScenes(Scenes& scenes, bool onlyValid) 404 404 { … … 442 442 OperationThreads operationThreads; 443 443 getOperationThreads(operationThreads); 444 444 445 445 for(OperationThreads::iterator itr = operationThreads.begin(); 446 446 itr != operationThreads.end(); … … 452 452 Scenes scenes; 453 453 getScenes(scenes); 454 454 455 455 for(Scenes::iterator sitr = scenes.begin(); 456 456 sitr != scenes.end(); … … 477 477 { 478 478 threads.clear(); 479 479 480 480 Contexts contexts; 481 481 getContexts(contexts); … … 485 485 { 486 486 osg::GraphicsContext* gc = *gcitr; 487 if (gc->getGraphicsThread() && 487 if (gc->getGraphicsThread() && 488 488 (!onlyActive || gc->getGraphicsThread()->isRunning()) ) 489 489 { … … 491 491 } 492 492 } 493 493 494 494 Cameras cameras; 495 495 getCameras(cameras); … … 499 499 { 500 500 osg::Camera* camera = *citr; 501 if (camera->getCameraThread() && 501 if (camera->getCameraThread() && 502 502 (!onlyActive || camera->getCameraThread()->isRunning()) ) 503 503 { … … 505 505 } 506 506 } 507 507 508 508 } 509 509 … … 511 511 { 512 512 //osg::notify(osg::INFO)<<"CompositeViewer::realize()"<<std::endl; 513 513 514 514 setCameraWithFocus(0); 515 515 … … 523 523 Contexts contexts; 524 524 getContexts(contexts); 525 525 526 526 if (contexts.empty()) 527 527 { 528 528 osg::notify(osg::INFO)<<"CompositeViewer::realize() - No valid contexts found, setting up view across all screens."<<std::endl; 529 530 // no windows are already set up so set up a default view 529 530 // no windows are already set up so set up a default view 531 531 _views[0]->setUpViewAcrossAllScreens(); 532 532 533 533 getContexts(contexts); 534 534 } … … 540 540 return; 541 541 } 542 542 543 unsigned int maxTexturePoolSize = osg::DisplaySettings::instance()->getMaxTexturePoolSize(); 544 unsigned int maxVBOPoolSize = osg::DisplaySettings::instance()->getMaxVBOPoolSize(); 545 unsigned int maxFBOPoolSize = osg::DisplaySettings::instance()->getMaxFBOPoolSize(); 546 543 547 for(Contexts::iterator citr = contexts.begin(); 544 548 citr != contexts.end(); … … 546 550 { 547 551 osg::GraphicsContext* gc = *citr; 552 553 // set the pool sizes, 0 the default will result in no GL object pools. 554 gc->getState()->setMaxTexturePoolSize(maxTexturePoolSize); 555 gc->getState()->setMaxVBOPoolSize(maxVBOPoolSize); 556 gc->getState()->setMaxFBOPoolSize(maxFBOPoolSize); 557 548 558 gc->realize(); 549 550 if (_realizeOperation.valid() && gc->valid()) 559 560 if (_realizeOperation.valid() && gc->valid()) 551 561 { 552 562 gc->makeCurrent(); 553 563 554 564 (*_realizeOperation)(gc); 555 565 556 566 gc->releaseContext(); 557 567 } 558 568 } 559 569 560 570 // attach contexts to _incrementalCompileOperation if attached. 561 571 if (_incrementalCompileOperation) _incrementalCompileOperation->assignContexts(contexts); … … 572 582 if (gw) 573 583 { 574 gw->grabFocusIfPointerInWindow(); 575 } 576 } 577 } 578 579 584 gw->grabFocusIfPointerInWindow(); 585 } 586 } 587 } 588 589 580 590 startThreading(); 581 591 … … 600 610 gc->getGraphicsThread()->setProcessorAffinity(processNum % numProcessors); 601 611 gc->getGraphicsThread()->startThread(); 602 612 603 613 ++processNum; 604 614 } … … 611 621 { 612 622 if (_done) return; 613 623 614 624 double prevousReferenceTime = _frameStamp->getReferenceTime(); 615 625 int previousFrameNumber = _frameStamp->getFrameNumber(); … … 628 638 _frameStamp->setSimulationTime(simulationTime); 629 639 } 630 640 631 641 if (getViewerStats() && getViewerStats()->collectStats("frame_rate")) 632 642 { … … 653 663 { 654 664 View* view = vitr->get(); 655 if (view->containsCamera(camera)) 665 if (view->containsCamera(camera)) 656 666 { 657 667 _viewWithFocus = view; … … 667 677 { 668 678 if (_done) return; 669 679 670 680 if (_views.empty()) return; 671 681 672 682 double beginEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick()); 673 683 674 684 // osg::notify(osg::NOTICE)<<"CompositeViewer::frameEventTraversal()."<<std::endl; 675 685 676 686 // need to copy events from the GraphicsWindow's into local EventQueue; 677 687 678 688 typedef std::map<osgViewer::View*, osgGA::EventQueue::Events> ViewEventsMap; 679 689 ViewEventsMap viewEventsMap; 680 690 681 691 Contexts contexts; 682 692 getContexts(contexts); … … 686 696 687 697 osgViewer::View* masterView = getViewWithFocus() ? getViewWithFocus() : _views[0].get(); 688 698 689 699 osg::Camera* masterCamera = masterView->getCamera(); 690 osgGA::GUIEventAdapter* eventState = masterView->getEventQueue()->getCurrentEventState(); 700 osgGA::GUIEventAdapter* eventState = masterView->getEventQueue()->getCurrentEventState(); 691 701 osg::Matrix masterCameraVPW = masterCamera->getViewMatrix() * masterCamera->getProjectionMatrix(); 692 if (masterCamera->getViewport()) 702 if (masterCamera->getViewport()) 693 703 { 694 704 osg::Viewport* viewport = masterCamera->getViewport(); … … 704 714 { 705 715 gw->checkEvents(); 706 716 707 717 osgGA::EventQueue::Events gw_events; 708 718 gw->getEventQueue()->takeEvents(gw_events); 709 719 710 720 osgGA::EventQueue::Events::iterator itr; 711 721 for(itr = gw_events.begin(); … … 714 724 { 715 725 osgGA::GUIEventAdapter* event = itr->get(); 716 726 717 727 //osg::notify(osg::NOTICE)<<"event->getGraphicsContext()="<<event->getGraphicsContext()<<std::endl; 718 728 719 729 bool pointerEvent = false; 720 730 721 731 float x = event->getX(); 722 732 float y = event->getY(); 723 733 724 734 bool invert_y = event->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS; 725 735 if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y; 726 736 727 737 switch(event->getEventType()) 728 738 { … … 736 746 { 737 747 pointerEvent = true; 738 748 739 749 if (event->getEventType()!=osgGA::GUIEventAdapter::DRAG || !getCameraWithFocus()) 740 750 { … … 745 755 { 746 756 osg::Camera* camera = *citr; 747 if (camera->getView() && 757 if (camera->getView() && 748 758 camera->getAllowEventFocus() && 749 759 camera->getRenderTargetImplementation()==osg::Camera::FRAME_BUFFER) 750 760 { 751 761 osg::Viewport* viewport = camera ? camera->getViewport() : 0; 752 if (viewport && 762 if (viewport && 753 763 x >= viewport->x() && y >= viewport->y() && 754 764 x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) ) … … 760 770 { 761 771 eventState->setGraphicsContext(gw); 762 eventState->setInputRange( viewport->x(), viewport->y(), 763 viewport->x()+viewport->width(),764 viewport->y()+viewport->height());772 eventState->setInputRange( viewport->x(), viewport->y(), 773 viewport->x()+viewport->width(), 774 viewport->y()+viewport->height()); 765 775 766 776 } … … 775 785 masterView = getViewWithFocus(); 776 786 masterCamera = masterView->getCamera(); 777 eventState = masterView->getEventQueue()->getCurrentEventState(); 787 eventState = masterView->getEventQueue()->getCurrentEventState(); 778 788 masterCameraVPW = masterCamera->getViewMatrix() * masterCamera->getProjectionMatrix(); 779 789 780 if (masterCamera->getViewport()) 790 if (masterCamera->getViewport()) 781 791 { 782 792 osg::Viewport* viewport = masterCamera->getViewport(); … … 789 799 { 790 800 eventState->setGraphicsContext(gw); 791 eventState->setInputRange( viewport->x(), viewport->y(), 792 viewport->x()+viewport->width(),793 viewport->y()+viewport->height());801 eventState->setInputRange( viewport->x(), viewport->y(), 802 viewport->x()+viewport->width(), 803 viewport->y()+viewport->height()); 794 804 795 805 } … … 802 812 } 803 813 } 804 814 805 815 break; 806 816 } … … 808 818 break; 809 819 } 810 820 811 821 if (pointerEvent) 812 822 { … … 822 832 823 833 x = new_coord.x(); 824 y = new_coord.y(); 834 y = new_coord.y(); 825 835 826 836 event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax()); … … 830 840 831 841 } 832 // pass along the new pointer events details to the eventState of the viewer 842 // pass along the new pointer events details to the eventState of the viewer 833 843 eventState->setX(x); 834 844 eventState->setY(y); … … 858 868 bool wasThreading = areThreadsRunning(); 859 869 if (wasThreading) stopThreading(); 860 870 861 871 gw->close(); 862 872 … … 874 884 } 875 885 } 876 886 877 887 878 888 // osg::notify(osg::NOTICE)<<"mouseEventState Xmin = "<<eventState->getXmin()<<" Ymin="<<eventState->getYmin()<<" xMax="<<eventState->getXmax()<<" Ymax="<<eventState->getYmax()<<std::endl; … … 887 897 view->getEventQueue()->takeEvents(viewEventsMap[view]); 888 898 } 889 899 890 900 891 901 // osg::notify(osg::NOTICE)<<"Events "<<events.size()<<std::endl; 892 902 893 903 if ((_keyEventSetsDone!=0) || _quitEventSetsDone) 894 904 { … … 918 928 } 919 929 } 920 930 921 931 if (_done) return; 922 932 … … 932 942 View* view = veitr->first; 933 943 _eventVisitor->setActionAdapter(view); 934 944 935 945 if (view->getSceneData()) 936 { 946 { 937 947 for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin(); 938 948 itr != veitr->second.end(); … … 964 974 } 965 975 } 966 976 967 977 } 968 978 … … 972 982 { 973 983 View* view = veitr->first; 974 984 975 985 for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin(); 976 986 itr != veitr->second.end(); … … 993 1003 { 994 1004 View* view = veitr->first; 995 1005 996 1006 for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin(); 997 1007 itr != veitr->second.end(); … … 1007 1017 } 1008 1018 1009 1019 1010 1020 1011 1021 if (getViewerStats() && getViewerStats()->collectStats("event")) … … 1024 1034 { 1025 1035 if (_done) return; 1026 1036 1027 1037 double beginUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick()); 1028 1038 … … 1085 1095 1086 1096 1087 if (view->getCameraManipulator()) 1097 if (view->getCameraManipulator()) 1088 1098 { 1089 1099 view->setFusionDistance( view->getCameraManipulator()->getFusionDistanceMode(), 1090 view->getCameraManipulator()->getFusionDistanceValue() );1091 1100 view->getCameraManipulator()->getFusionDistanceValue() ); 1101 1092 1102 view->getCamera()->setViewMatrix( view->getCameraManipulator()->getInverseMatrix()); 1093 1103 } … … 1095 1105 1096 1106 } 1097 1107 1098 1108 if (getViewerStats() && getViewerStats()->collectStats("update")) 1099 1109 {
