- Timestamp:
- 02/26/07 14:01:17 (6 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/examples/osgmanipulator/osgmanipulator.cpp
r6148 r6277 1 // --c++-- 1 2 #include <osgDB/ReadFile> 2 3 #include <osgUtil/Optimizer> 3 #include <osg Producer/Viewer>4 #include <osgViewer/Viewer> 4 5 #include <osg/CoordinateSystemNode> 5 6 #include <osgText/Text> … … 14 15 #include <osgManipulator/TranslateAxisDragger> 15 16 17 #include <iostream> 18 16 19 osgManipulator::Dragger* createDragger(const std::string& name) 17 20 { … … 100 103 } 101 104 102 105 #if 0 103 106 bool computePixelCoords(osgProducer::Viewer* viewer,float x,float y,unsigned int cameraNum,float& pixel_x,float& pixel_y) 104 107 { … … 151 154 return true; 152 155 } 156 #endif 153 157 154 158 osg::Node* addDraggerToScene(osg::Node* scene, osgManipulator::CommandManager* cmdMgr, const std::string& name) … … 183 187 }; 184 188 185 PickModeHandler(osgProducer::Viewer *viewer) : osgGA::GUIEventHandler(), 186 _viewer(viewer), _mode(VIEW), _activeDragger(0) 189 PickModeHandler(): 190 _mode(VIEW), 191 _activeDragger(0) 187 192 { 188 193 } … … 191 196 osg::Object*, osg::NodeVisitor*) 192 197 { 198 osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa); 199 if (!view) return false; 200 193 201 if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Tab && 194 202 ea.getEventType() == osgGA::GUIEventAdapter::KEYDOWN && … … 200 208 if (VIEW == _mode) return false; 201 209 202 for(unsigned int i=0;i<_viewer->getNumberOfCameras();++i)210 switch (ea.getEventType()) 203 211 { 204 205 if ((ea.getEventType() == osgGA::GUIEventAdapter::PUSH) && 206 _viewer->computeIntersections(ea.getX(), ea.getY(), i, _pointer.hitList)) 212 case osgGA::GUIEventAdapter::PUSH: 207 213 { 208 float pixel_x,pixel_y; 209 if (computePixelCoords(_viewer,ea.getX(),ea.getY(),i,pixel_x,pixel_y)) 214 osgUtil::LineSegmentIntersector::Intersections intersections; 215 216 _pointer.reset(); 217 218 if (view->computeIntersections(ea.getX(),ea.getY(),intersections)) 210 219 { 211 Producer::Camera* camera=_viewer->getCamera(i); 212 213 osgProducer::OsgSceneHandler* sh = dynamic_cast<osgProducer::OsgSceneHandler*>(camera->getSceneHandler()); 214 osgUtil::SceneView* sv = sh ? sh->getSceneView() : 0; 215 if (! sv) continue; 216 217 _pointer.pixel_x = int(pixel_x+0.5); 218 _pointer.pixel_y = int(pixel_y+0.5); 219 _pointer.sv = sv; 220 _pointer.hitIter = _pointer.hitList.begin(); 221 222 for (osg::NodePath::iterator itr = _pointer.hitList.front().getNodePath().begin(); 223 itr != _pointer.hitList.front().getNodePath().end(); 220 _pointer.setCamera(view->getCamera()); 221 _pointer.setMousePosition(ea.getX(), ea.getY()); 222 223 for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin(); 224 hitr != intersections.end(); 225 ++hitr) 226 { 227 _pointer.addIntersection(hitr->nodePath, hitr->getLocalIntersectPoint()); 228 } 229 for (osg::NodePath::iterator itr = _pointer._hitList.front().first.begin(); 230 itr != _pointer._hitList.front().first.end(); 224 231 ++itr) 225 232 { … … 235 242 } 236 243 } 237 238 switch (ea.getEventType())244 case osgGA::GUIEventAdapter::DRAG: 245 case osgGA::GUIEventAdapter::RELEASE: 239 246 { 240 case osgGA::GUIEventAdapter::DRAG: 241 case osgGA::GUIEventAdapter::RELEASE: 242 if (_activeDragger) 243 { 244 float pixel_x,pixel_y; 245 if (computePixelCoords(_viewer,ea.getX(),ea.getY(),i,pixel_x,pixel_y)) 246 { 247 Producer::Camera* camera=_viewer->getCamera(i); 248 249 osgProducer::OsgSceneHandler* sh = dynamic_cast<osgProducer::OsgSceneHandler*>(camera->getSceneHandler()); 250 osgUtil::SceneView* sv = sh ? sh->getSceneView() : 0; 251 if (_activeDragger && sv) 252 { 253 _pointer.pixel_x = int(pixel_x+0.5); 254 _pointer.pixel_y = int(pixel_y+0.5); 255 _pointer.sv = sv; 256 _pointer.hitIter = _pointer.hitList.begin(); 257 258 _activeDragger->handle(_pointer, ea, aa); 259 } 260 } 261 } 262 break; 263 264 default: 265 break; 247 if (_activeDragger) 248 { 249 _pointer._hitIter = _pointer._hitList.begin(); 250 _pointer.setCamera(view->getCamera()); 251 _pointer.setMousePosition(ea.getX(), ea.getY()); 252 253 _activeDragger->handle(_pointer, ea, aa); 254 } 255 break; 266 256 } 267 if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE) 268 { 269 _activeDragger = 0; 270 _pointer.hitList.clear(); 271 } 257 default: 258 break; 272 259 } 260 261 if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE) 262 { 263 _activeDragger = 0; 264 _pointer.reset(); 265 } 266 273 267 return true; 274 268 } 275 269 276 270 private: 277 osgProducer::Viewer* _viewer;278 271 unsigned int _mode; 279 272 osgManipulator::Dragger* _activeDragger; 280 osgManipulator:: Dragger::PointerInfo _pointer;273 osgManipulator::PointerInfo _pointer; 281 274 }; 282 275 … … 302 295 303 296 // construct the viewer. 304 osgProducer::Viewer viewer(arguments); 305 306 // set up the value with sensible default event handlers. 307 viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS); 297 osgViewer::Viewer viewer; 308 298 309 299 // get details on keyboard and mouse bindings used by the viewer. … … 372 362 viewer.setSceneData(addDraggerToScene(loadedModel.get(), cmdMgr.get(), dragger_name)); 373 363 374 viewer.getEventHandlerList().push_front(new PickModeHandler(&viewer)); 375 376 // create the windows and run the threads. 377 viewer.realize(); 378 379 while( !viewer.done() ) 380 { 381 // wait for all cull and draw threads to complete. 382 viewer.sync(); 383 384 // update the scene by traversing it with the the update visitor which will 385 // call all node update callbacks and animations. 386 viewer.update(); 387 388 // fire off the cull and draw traversals of the scene. 389 viewer.frame(); 390 391 } 392 393 // wait for all cull and draw threads to complete. 394 viewer.sync(); 395 396 // run a clean up frame to delete all OpenGL objects. 397 viewer.cleanup_frame(); 398 399 // wait for all the clean up frame to complete. 400 viewer.sync(); 401 402 return 0; 403 } 404 364 viewer.addEventHandler(new PickModeHandler()); 365 366 return viewer.run(); 367 } 368
