diff --git a/include/osgProducer/OsgCameraGroup b/include/osgProducer/OsgCameraGroup index 301badaa6..dc07f3582 100644 --- a/include/osgProducer/OsgCameraGroup +++ b/include/osgProducer/OsgCameraGroup @@ -1,13 +1,13 @@ -/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield * - * This library is open source and may be redistributed and/or modified under - * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or + * This library is open source and may be redistributed and/or modified under + * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ @@ -47,9 +47,9 @@ class OSGPRODUCER_EXPORT OsgCameraGroup : public Producer::CameraGroup void setApplicationUsage(osg::ApplicationUsage* au) { _applicationUsage = au; } - + osg::ApplicationUsage* getApplicationUsage() { return _applicationUsage; } - + const osg::ApplicationUsage* getApplicationUsage() const { return _applicationUsage; } @@ -59,17 +59,25 @@ class OSGPRODUCER_EXPORT OsgCameraGroup : public Producer::CameraGroup const SceneHandlerList& getSceneHandlerList() const { return _shvec;} - + /** Set the scene data to be rendered. The scene graph traversal during + * rendering will start at the node passed as parameter. + * @param scene The node to be used as the starting point during the + * rendering traversal of the scene graph. + */ void setSceneData( osg::Node *scene ); - + + /** Get the scene data being used for rendering. + * @return The node being used as the starting point during the + * rendering traversal of the scene graph. + */ osg::Node *getSceneData() { return _scene_data.get(); } const osg::Node *getSceneData() const { return _scene_data.get(); } - + void setSceneDecorator( osg::Group* decorator); - + osg::Group* getSceneDecorator() { return _scene_decorator.get(); } const osg::Group* getSceneDecorator() const { return _scene_decorator.get(); } @@ -80,25 +88,24 @@ class OSGPRODUCER_EXPORT OsgCameraGroup : public Producer::CameraGroup const osg::Node* getTopMostSceneData() const; - /** update internal structures w.r.t updated scene data.*/ + /** Update internal structures w.r.t updated scene data.*/ virtual void updatedSceneData(); void setDisplaySettings( osg::DisplaySettings *ds ) { _ds = ds; } osg::DisplaySettings *getDisplaySettings() { return _ds.get(); } - + const osg::DisplaySettings *getDisplaySettings() const { return _ds.get(); } - - + void setCullSettings( const osg::CullSettings& cs) { _cullSettings = cs; } - + osg::CullSettings& getCullSettings() { return _cullSettings; } - + const osg::CullSettings& getCullSettings() const { return _cullSettings; } - - - + + + void setFrameStamp( osg::FrameStamp* fs ); osg::FrameStamp *getFrameStamp() { return _frameStamp.get(); } @@ -145,7 +152,7 @@ class OSGPRODUCER_EXPORT OsgCameraGroup : public Producer::CameraGroup { public: virtual void operator()( OsgCameraGroup& cg, OsgSceneHandler& sh, const Producer::RenderSurface & rs) = 0; - + protected: virtual ~RealizeCallback(); // {} }; @@ -155,7 +162,7 @@ class OSGPRODUCER_EXPORT OsgCameraGroup : public Producer::CameraGroup /** Get the realize callback.*/ RealizeCallback* getRealizeCallback() { return _realizeCallback.get(); } - + /** Get the const realize callback.*/ const RealizeCallback* getRealizeCallback() const { return _realizeCallback.get(); } @@ -171,7 +178,7 @@ class OSGPRODUCER_EXPORT OsgCameraGroup : public Producer::CameraGroup /** Set the model view matrix of the camera group, * by individually set all the camera groups's camera.*/ virtual void setView(const osg::Matrixd& matrix); - + /** Get the model view martrix of the camera group, * taking its value for camera 0.*/ osg::Matrixd getViewMatrix() const; @@ -181,8 +188,7 @@ class OSGPRODUCER_EXPORT OsgCameraGroup : public Producer::CameraGroup /** Dispatch the cull and draw for each of the Camera's for this frame.*/ virtual void frame(); - - + protected : @@ -197,19 +203,19 @@ class OSGPRODUCER_EXPORT OsgCameraGroup : public Producer::CameraGroup osg::ref_ptr _global_stateset; osg::Vec4 _clear_color; - + osgUtil::SceneView::FusionDistanceMode _fusionDistanceMode; float _fusionDistanceValue; unsigned int _realizeSceneViewOptions; - + SceneHandlerList _shvec; - + osg::ref_ptr _realizeCallback; - + osg::ref_ptr _ds; bool _initialized; - + osg::CullSettings _cullSettings; unsigned int _frameNumber; diff --git a/include/osgProducer/Viewer b/include/osgProducer/Viewer index b46057703..ff807ec69 100644 --- a/include/osgProducer/Viewer +++ b/include/osgProducer/Viewer @@ -1,13 +1,13 @@ -/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield * - * This library is open source and may be redistributed and/or modified under - * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or + * This library is open source and may be redistributed and/or modified under + * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ @@ -33,6 +33,15 @@ namespace osgProducer { +/** A Producer-based viewer. Just like OpenGL, the core of OSG is independent of + * windowing system. The integration between OSG and some windowing system is + * delegated to other, non-core parts of OSG (users are also allowed to + * integrate OSG with any exotic windowing system they happen to use). + * \c Viewer implements the integration between OSG and Producer, AKA Open + * Producer (http://www.andesengineering.com/Producer), thus offering an + * out-of-the-box, scalable and multi-platform abstraction of the windowing + * system. + */ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIActionAdapter { public : @@ -47,20 +56,69 @@ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIAction virtual ~Viewer(); - + /** Specifies options to control some aspects of the + * \c Viewer behavior (using the \c setUpViewer() member + * function). + */ enum ViewerOptions { - NO_EVENT_HANDLERS = 0, - TRACKBALL_MANIPULATOR = 1, - DRIVE_MANIPULATOR = 2, - FLIGHT_MANIPULATOR = 4, + /** Do not activate any standard event handlers. + * If no event handlers are selected then the users would typically + * register their own custom event handlers to add user interaction via + * getEventHandlerList().push_back(myEventHandler) or addCameraManipulator(myCameraManipualtor).*/ + NO_EVENT_HANDLERS = 0, + + /** Add an \c osgGA::TrackballManipulator to manipulate the camera + * interactively. + */ + TRACKBALL_MANIPULATOR = 1, + + /** Add an \c osgGA::DriveManipulator to manipulate the camera + * interactively. + */ + DRIVE_MANIPULATOR = 2, + + /** Add an \c osgGA::FlightManipulator to manipulate the camera + * interactively. + */ + FLIGHT_MANIPULATOR = 4, + + /** Add an \c osgGA::TerrainManipulator to manipulate the camera + * interactively. + */ TERRAIN_MANIPULATOR = 8, + + /** Add an \c osgGA::StateSetManipulator to interactively toggle + * some bits of the renderer state (texturing, lightning...) + */ STATE_MANIPULATOR = 32, + + /** Add a light source some point near the camera. */ HEAD_LIGHT_SOURCE = 64, + + /** Add a light source above the scene; does nothing if + * \c HEAD_LIGHT_SOURCE is also used. + */ SKY_LIGHT_SOURCE = 128, + + /** Add peformance statistics reporting, currently implemented via VIEWER_MANPULATOR. */ STATS_MANIPULATOR = 256, + + /** Add an \c osgProducer::ViewerEventHandler that enables lots of + * tricks like performance statistics and writing the scene to a + * file. + */ VIEWER_MANIPULATOR = 512, + + /** Finish the viewer execution when the ESC key is pressed. */ ESCAPE_SETS_DONE = 1024, + + /** Enable a set of standard settings (\c TRACKBALL_MANIPULATOR, + * \c DRIVE_MANIPULATOR, \c FLIGHT_MANIPULATOR, + * \c TERRAIN_MANIPULATOR, \c STATE_MANIPULATOR, + * \c HEAD_LIGHT_SOURCE, \c STATS_MANIPULATOR, + * \c VIEWER_MANIPULATOR, \c ESCAPE_SETS_DONE). + */ STANDARD_SETTINGS = TRACKBALL_MANIPULATOR| DRIVE_MANIPULATOR | FLIGHT_MANIPULATOR | @@ -71,9 +129,13 @@ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIAction VIEWER_MANIPULATOR | ESCAPE_SETS_DONE }; - + + /** Set up the viewer, allowing to control some aspects of its behavior. + * @param options One or more of the options defined by the + * \c ViewerOptions enumeration, combined using the bitwise OR + * operator (``|''). + */ void setUpViewer(unsigned int options=STANDARD_SETTINGS); - /** Set the viewer so it sets done to true once the refrence time equals or exceeds specified elapsed time. * Automatically does a setDoneAtElapsedTimeEnabled(true). */ @@ -88,8 +150,6 @@ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIAction /** Get whether to use a elapsed time to limit the run of the viewer.*/ bool getDoneAtElapsedTimeEnabled() const { return _setDoneAtElapsedTimeEnabled; } - - /** Set the viewer so it sets done to true once the frame number equals or exceeds specified frame number. * Automatically does a setDoneAtFrameNumberEnabled(true). */ void setDoneAtFrameNumber(unsigned int frameNumber) { _setDoneAtFrameNumberEnabled = true; _setDoneAtFrameNumber = frameNumber; } @@ -102,26 +162,22 @@ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIAction /** Get whether to use a frame number to limit the run of the viewer.*/ bool getDoneAtFrameNumberEnabled() const { return _setDoneAtFrameNumberEnabled; } - - /** Set the done flag signalling that the viewer exit.*/ - void setDone(bool done) { _done = done; } - + void setDone(bool done) { _done = done; } + /** Get the done flag which signals that the viewer exit.*/ - bool getDone() const { return _done; } + bool getDone() const { return _done; } - /** return true if the application is done and should exit.*/ + /** Return true if the application is done and should exit.*/ virtual bool done() const; - /** Set the viewer to take an image snapshot on the last frame() when done is enabled.*/ void setWriteImageWhenDone(bool enabled) { _writeImageWhenDone = enabled; } /** Set the viewer to take an image snapshot on the last frame() when done is enabled.*/ bool getWriteImageWhenDone() const { return _writeImageWhenDone; } - /** Set the filename to write to when the viewer takes an image snapshot on the last frame() when done is enabled.*/ void setWriteImageFileName(const std::string& filename); @@ -129,7 +185,6 @@ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIAction const std::string& getWriteImageFileName() const; - /** Override the Producer::CameraGroup::setViewByMatrix to catch all changes to view.*/ virtual void setViewByMatrix( const Producer::Matrix & pm); @@ -140,23 +195,22 @@ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIAction /** Updated the scene. Handle any queued up events, do an update traversal and set the CameraGroup's setViewByMatrix if any camera manipulators are active.*/ virtual void update(); - - /** set the update visitor which does the update traversal of the scene graph. Automatically called by the update() method.*/ + + /** Set the update visitor which does the update traversal of the scene graph. Automatically called by the update() method.*/ void setUpdateVisitor(osg::NodeVisitor* nv) { _updateVisitor = nv; } - - /** get the update visitor.*/ + + /** Get the update visitor.*/ osg::NodeVisitor* getUpdateVisitor() { return _updateVisitor.get(); } - - /** get the const update visitor.*/ + + /** Get the const update visitor.*/ const osg::NodeVisitor* getUpdateVisitor() const { return _updateVisitor.get(); } - void computeActiveCoordindateSystemNodePath(); void setCoordindateSystemNodePath(const osg::RefNodePath& nodePath) { _coordinateSystemNodePath = nodePath; } - + void setCoordindateSystemNodePath(const osg::NodePath& nodePath); - + const osg::RefNodePath& getCoordindateSystemNodePath() const { return _coordinateSystemNodePath; } /** Dispatch the cull and draw for each of the Camera's for this frame.*/ @@ -167,22 +221,22 @@ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIAction virtual void requestWarpPointer(float x,float y); - /** compute, from normalized mouse coords, for sepecified Camera, the pixel coords relative to that Camera's RenderSurface.*/ + /** Compute, from normalized mouse coords, for sepecified Camera, the pixel coords relative to that Camera's RenderSurface.*/ bool computePixelCoords(float x,float y,unsigned int cameraNum,float& pixel_x,float& pixel_y); - /** compute, from normalized mouse coords, for sepecified Camera, the near and far points in worlds coords.*/ + /** Compute, from normalized mouse coords, for sepecified Camera, the near and far points in worlds coords.*/ bool computeNearFarPoints(float x,float y,unsigned int cameraNum,osg::Vec3& near, osg::Vec3& far); - - /** compute, from normalized mouse coords, for all Cameras, intersections with the specified subgraph.*/ + + /** Compute, from normalized mouse coords, for all Cameras, intersections with the specified subgraph.*/ bool computeIntersections(float x,float y,unsigned int cameraNum,osg::Node *node,osgUtil::IntersectVisitor::HitList& hits,osg::Node::NodeMask traversalMask = 0xffffffff); - /** compute, from normalized mouse coords, for sepecified Camera, intersections with the scene.*/ + /** Compute, from normalized mouse coords, for sepecified Camera, intersections with the scene.*/ bool computeIntersections(float x,float y,unsigned int cameraNum,osgUtil::IntersectVisitor::HitList& hits,osg::Node::NodeMask traversalMask = 0xffffffff); - /** compute, from normalized mouse coords, for all Cameras, intersections with specified subgraph.*/ + /** Compute, from normalized mouse coords, for all Cameras, intersections with specified subgraph.*/ bool computeIntersections(float x,float y,osg::Node *node,osgUtil::IntersectVisitor::HitList& hits,osg::Node::NodeMask traversalMask = 0xffffffff); - /** compute, from normalized mouse coords, for all Cameras, intersections with the scene.*/ + /** Compute, from normalized mouse coords, for all Cameras, intersections with the scene.*/ bool computeIntersections(float x,float y,osgUtil::IntersectVisitor::HitList& hits,osg::Node::NodeMask traversalMask = 0xffffffff); void setKeyboardMouse(Producer::KeyboardMouse* kbm); @@ -193,12 +247,10 @@ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIAction osgProducer::KeyboardMouseCallback* getKeyboardMouseCallback() { return _kbmcb.get(); } const osgProducer::KeyboardMouseCallback* getKeyboardMouseCallback() const { return _kbmcb.get(); } - - typedef std::list< osg::ref_ptr > EventHandlerList; EventHandlerList& getEventHandlerList() { return _eventHandlerList; } const EventHandlerList& getEventHandlerList() const { return _eventHandlerList; } - + osgGA::KeySwitchMatrixManipulator* getKeySwitchMatrixManipulator() { return _keyswitchManipulator.get(); } const osgGA::KeySwitchMatrixManipulator* getKeySwitchMatrixManipulator() const { return _keyswitchManipulator.get(); } @@ -222,7 +274,7 @@ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIAction /** Get the keyboard and mouse usage of this viewer.*/ virtual void getUsage(osg::ApplicationUsage& usage) const; - /** update internal structures w.r.t updated scene data.*/ + /** Update internal structures w.r.t updated scene data.*/ virtual void updatedSceneData(); protected :