123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 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
- * (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
- * OpenSceneGraph Public License for more details.
- */
- //osgManipulator - Copyright (C) 2007 Fugro-Jason B.V.
- #ifndef OSGMANIPULATOR_COMMAND
- #define OSGMANIPULATOR_COMMAND 1
- #include <osgManipulator/Constraint>
- #include <osg/LineSegment>
- #include <osg/Plane>
- #include <osg/Vec2>
- #include <vector>
- namespace osgManipulator {
- /** Base class for motion commands that are generated by draggers. */
- class OSGMANIPULATOR_EXPORT MotionCommand : public osg::Referenced
- {
- public:
- /**
- * Motion command are based on click-drag-release actions. So each
- * command needs to indicate which stage of the motion the command
- * represents.
- */
- enum Stage
- {
- NONE,
- /** Click or pick start. */
- START,
- /** Drag or pick move. */
- MOVE,
- /** Release or pick finish. */
- FINISH
- };
- MotionCommand();
- /** create a MotionCommand that is the inverse of this command, and if applied will undo this commands changes. */
- virtual MotionCommand* createCommandInverse() = 0;
- /**
- * Gets the matrix for transforming the object being dragged. This matrix is in the
- * command's coordinate systems.
- */
- virtual osg::Matrix getMotionMatrix() const = 0;
- virtual void accept(const Constraint& constraint) { constraint.constrain(*this); }
- virtual void accept(DraggerCallback& callback) { callback.receive(*this); }
- /**
- * Sets the matrix for transforming the command's local coordinate
- * system to the world/object coordinate system.
- */
- void setLocalToWorldAndWorldToLocal(const osg::Matrix& localToWorld, const osg::Matrix& worldToLocal)
- {
- _localToWorld = localToWorld;
- _worldToLocal = worldToLocal;
- }
- /**
- * Gets the matrix for transforming the command's local coordinate
- * system to the world/object coordinate system.
- */
- inline const osg::Matrix& getLocalToWorld() const { return _localToWorld; }
- /**
- * Gets the matrix for transforming the command's world/object
- * coordinate system to the command's local coordinate system.
- */
- inline const osg::Matrix& getWorldToLocal() const { return _worldToLocal; }
- void setStage(const Stage s) { _stage = s; }
- Stage getStage() const { return _stage; }
- protected:
- virtual ~MotionCommand();
- private:
- osg::Matrix _localToWorld;
- osg::Matrix _worldToLocal;
- Stage _stage;
- };
- /**
- * Command for translating in a line.
- */
- class OSGMANIPULATOR_EXPORT TranslateInLineCommand : public MotionCommand
- {
- public:
- TranslateInLineCommand();
- TranslateInLineCommand(const osg::LineSegment::vec_type& s, const osg::LineSegment::vec_type& e);
- virtual void accept(const Constraint& constraint) {constraint.constrain(*this); }
- virtual void accept(DraggerCallback& callback) { callback.receive(*this); }
- virtual MotionCommand* createCommandInverse();
- inline void setLine(const osg::LineSegment::vec_type& s, const osg::LineSegment::vec_type& e) { _line->start() = s; _line->end() = e; }
- inline const osg::LineSegment::vec_type& getLineStart() const { return _line->start(); }
- inline const osg::LineSegment::vec_type& getLineEnd() const { return _line->end(); }
- inline void setTranslation(const osg::Vec3d& t) { _translation = t; }
- inline const osg::Vec3d& getTranslation() const { return _translation; }
- virtual osg::Matrix getMotionMatrix() const
- {
- return osg::Matrix::translate(_translation);
- }
- protected:
- virtual ~TranslateInLineCommand();
- private:
- osg::ref_ptr<osg::LineSegment> _line;
- osg::Vec3d _translation;
- };
- /**
- * Command for translating in a plane.
- */
- class OSGMANIPULATOR_EXPORT TranslateInPlaneCommand : public MotionCommand
- {
- public:
- TranslateInPlaneCommand();
- TranslateInPlaneCommand(const osg::Plane& plane);
- virtual void accept(const Constraint& constraint) {constraint.constrain(*this); }
- virtual void accept(DraggerCallback& callback) { callback.receive(*this); }
- virtual MotionCommand* createCommandInverse();
- inline void setPlane(const osg::Plane& plane) { _plane = plane; }
- inline const osg::Plane& getPlane() const { return _plane; }
- inline void setTranslation(const osg::Vec3d& t) { _translation = t; }
- inline const osg::Vec3d& getTranslation() const { return _translation; }
- /** ReferencePoint is used only for snapping. */
- inline void setReferencePoint(const osg::Vec3d& rp) { _referencePoint = rp; }
- inline const osg::Vec3d& getReferencePoint() const { return _referencePoint; }
- virtual osg::Matrix getMotionMatrix() const
- {
- return osg::Matrix::translate(_translation);
- }
- protected:
- virtual ~TranslateInPlaneCommand();
- private:
- osg::Plane _plane;
- osg::Vec3d _translation;
- osg::Vec3d _referencePoint;
- };
- /**
- * Command for 1D scaling.
- */
- class OSGMANIPULATOR_EXPORT Scale1DCommand : public MotionCommand
- {
- public:
- Scale1DCommand();
- virtual void accept(const Constraint& constraint) {constraint.constrain(*this); }
- virtual void accept(DraggerCallback& callback) { callback.receive(*this); }
- virtual MotionCommand* createCommandInverse();
- inline void setScale(double s) { _scale = s; }
- inline double getScale() const { return _scale; }
- inline void setScaleCenter(double center) { _scaleCenter = center; }
- inline double getScaleCenter() const { return _scaleCenter; }
- /** ReferencePoint is used only for snapping. */
- inline void setReferencePoint(double rp) { _referencePoint = rp; }
- inline double getReferencePoint() const { return _referencePoint; }
- inline void setMinScale(double min) { _minScale = min; }
- inline double getMinScale() const { return _minScale; }
- virtual osg::Matrix getMotionMatrix() const
- {
- return (osg::Matrix::translate(-_scaleCenter,0.0,0.0)
- * osg::Matrix::scale(_scale,1.0,1.0)
- * osg::Matrix::translate(_scaleCenter,0.0,0.0));
- }
- protected:
- virtual ~Scale1DCommand();
- private:
- double _scale;
- double _scaleCenter;
- double _referencePoint;
- double _minScale;
- };
- /**
- * Command for 2D scaling.
- */
- class OSGMANIPULATOR_EXPORT Scale2DCommand : public MotionCommand
- {
- public:
- Scale2DCommand();
- virtual void accept(const Constraint& constraint) {constraint.constrain(*this); }
- virtual void accept(DraggerCallback& callback) { callback.receive(*this); }
- virtual MotionCommand* createCommandInverse();
- inline void setScale(const osg::Vec2d& s) { _scale = s; }
- inline const osg::Vec2d& getScale() const { return _scale; }
- inline void setScaleCenter(const osg::Vec2d& center) { _scaleCenter = center; }
- inline const osg::Vec2d& getScaleCenter() const { return _scaleCenter; }
- /** ReferencePoint is used only for snapping. */
- inline void setReferencePoint(const osg::Vec2d& rp) { _referencePoint = rp; }
- inline const osg::Vec2d& getReferencePoint() const { return _referencePoint; }
- inline void setMinScale(const osg::Vec2d& min) { _minScale = min; }
- inline const osg::Vec2d& getMinScale() const { return _minScale; }
- virtual osg::Matrix getMotionMatrix() const
- {
- return (osg::Matrix::translate(-_scaleCenter[0],0.0,-_scaleCenter[1])
- * osg::Matrix::scale(_scale[0],1.0,_scale[1])
- * osg::Matrix::translate(_scaleCenter[0],0.0,_scaleCenter[1]));
- }
- protected:
- virtual ~Scale2DCommand();
- private:
- osg::Vec2d _scale;
- osg::Vec2d _scaleCenter;
- osg::Vec2d _referencePoint;
- osg::Vec2d _minScale;
- };
- /**
- * Command for uniform 3D scaling.
- */
- class OSGMANIPULATOR_EXPORT ScaleUniformCommand : public MotionCommand
- {
- public:
- ScaleUniformCommand();
- virtual void accept(const Constraint& constraint) {constraint.constrain(*this); }
- virtual void accept(DraggerCallback& callback) { callback.receive(*this); }
- virtual MotionCommand* createCommandInverse();
- inline void setScale(double s) { _scale = s; }
- inline double getScale() const { return _scale; }
- inline void setScaleCenter(const osg::Vec3d& center) { _scaleCenter = center; }
- inline const osg::Vec3d& getScaleCenter() const { return _scaleCenter; }
- virtual osg::Matrix getMotionMatrix() const
- {
- return (osg::Matrix::translate(-_scaleCenter)
- * osg::Matrix::scale(_scale,_scale,_scale)
- * osg::Matrix::translate(_scaleCenter));
- }
- protected:
- virtual ~ScaleUniformCommand();
- private:
- double _scale;
- osg::Vec3d _scaleCenter;
- };
- /**
- * Command for rotation in 3D.
- */
- class OSGMANIPULATOR_EXPORT Rotate3DCommand : public MotionCommand
- {
- public:
- Rotate3DCommand();
- virtual void accept(const Constraint& constraint) {constraint.constrain(*this); }
- virtual void accept(DraggerCallback& callback) { callback.receive(*this); }
- virtual MotionCommand* createCommandInverse();
- inline void setRotation(const osg::Quat& rotation) { _rotation = rotation; }
- inline const osg::Quat& getRotation() const { return _rotation; }
- virtual osg::Matrix getMotionMatrix() const
- {
- return osg::Matrix::rotate(_rotation);
- }
- protected:
- virtual ~Rotate3DCommand();
- private:
- osg::Quat _rotation;
- };
- }
- #endif
|