Hi Jason,
The header file came through inline, I've tried to copy and paste it
to recreate it but alas the indentation etc has been messed up along
the way so I can't do a problem review. Could you send me the
submission again, this time zipped up.
Robert.
On Nov 15, 2007 10:31 PM, Jason Daly <[EMAIL PROTECTED]> wrote:
>
> The current implementation of osg::Sequence does not handle SWING
> animations properly. Instead of cycling back and forth through the
> entire sequence, it cycles from start to end, then alternates between
> the last two frames. This is illustrated by the attached .ive file.
>
> Fixes (made against the 2.2.0 release) are also attached.
>
> --
>
> --"J"
>
> "I'm a castaway stranded in a desolate land,
> I can see the footprints in the virtual sand."
> --Neil Peart
>
>
> /* -*-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.
> */
>
> #ifndef OSG_SEQUENCE
> #define OSG_SEQUENCE 1
>
> #include <osg/Group>
>
> namespace osg
> {
>
> /** Sequence is a Group node which allows automatic, time based
> switching between children.
> */
> class OSG_EXPORT Sequence : public Group
> {
> public :
>
> Sequence();
>
> /** Copy constructor using CopyOp to manage deep vs shallow copy.*/
> Sequence(const Sequence&, const CopyOp& copyop=CopyOp::SHALLOW_COPY);
>
> META_Node(osg, Sequence);
>
> virtual void traverse(NodeVisitor& nv);
>
> // the relationship between the _frameTime vector and the _children
> // vector is a bit of a mess. This is how it was in previous
> versions,
> // and there's no way out of it if upward compatability needs to be
> // maintained. New code should set defaultTime and use addChild, and
> // not mess with the setTime method
>
> virtual bool addChild( Node *child);
>
> virtual bool addChild( Node *child, double t);
>
> virtual bool insertChild( unsigned int index, Node *child);
>
> virtual bool insertChild( unsigned int index, Node *child, double t);
>
> virtual bool removeChild( Node *child );
>
> virtual bool removeChildren(unsigned int pos,unsigned int
> numChildrenToRemove);
>
>
> /** value is which child node is to be displayed */
> void setValue(int value) { _value = value ; }
> int getValue() const { return _value; }
>
> /** Set time in seconds for child. */
> void setTime(unsigned int frame, double t);
>
> /** Get time for child. */
> double getTime(unsigned int frame) const;
>
> /** Set default time in seconds for new child.
> if t<0, t=0 */
> void setDefaultTime(double t) {_defaultTime = (t<0.?0.:t);}
>
> /** Get default time in seconds for new child. */
> double getDefaultTime(void) const {return _defaultTime;};
>
> /** Set time of last frame of last loop, in seconds.
> if t<= 0, then ignored */
> void setLastFrameTime(double t) {_lastFrameTime = (t<0.?0.:t);}
>
> /** Get last frame time in seconds */
> double getLastFrameTime(void) const {return _lastFrameTime;};
>
> /** Get number of frames */
> inline unsigned int getNumFrames() const { return _frameTime.size(); }
>
> /** Interval modes. 'Loop' repeats frames 1-N; 'swing' repeats 1->N,
> (N-1)->1. */
> enum LoopMode
> {
> LOOP,
> SWING
> };
>
> /** Set sequence mode & interval (range of children to be displayed).
> */
> void setInterval(LoopMode mode, int begin, int end);
>
> /** Get sequence mode & interval. */
> inline void getInterval(LoopMode& mode, int& begin, int& end) const
> {
> mode = _loopMode;
> begin = _begin;
> end = _end;
> }
>
> /** Set duration: speed-up & number of repeats */
> void setDuration(float speed, int nreps = -1);
>
> /** Get duration & number of repeats. */
> inline void getDuration(float& speed, int& nreps) const
> {
> speed = _speed;
> nreps = _nreps;
> }
>
> /** Sequence modes. */
> enum SequenceMode
> {
> START,
> STOP,
> PAUSE,
> RESUME
> };
>
> /** Set sequence mode. Start/stop & pause/resume. */
> void setMode(SequenceMode mode);
>
> /** Get sequence mode. */
> inline SequenceMode getMode() const { return _mode; }
>
> /** If false (default), frames will not be sync'd to frameTime. If
> true, frames will be sync'd to frameTime. */
> void setSync(bool sync) { _sync = sync ; } ;
>
> /** Get sync value */
> inline void getSync(bool& sync) const { sync = _sync ; } ;
>
> /** If true, show no child nodes after stopping */
> void setClearOnStop(bool clearOnStop) { _clearOnStop = clearOnStop ;
> } ;
>
> /** If true, show no child nodes after stopping */
> inline void getClearOnStop(bool& clearOnStop) const { clearOnStop =
> _clearOnStop ; } ;
>
> protected :
>
> virtual ~Sequence() {}
>
> // get next _value in sequence
> int _getNextValue(void) ;
>
> // update local variables
> void _update(void) ;
>
> // init to -1 to mean "restart"
> int _value;
>
> // current time, set by traverse
> double _now ;
>
> // time this frame started. init to -1.0f- means get current time
> double _start;
>
> // a vector of frame times, one per value
> std::vector<double> _frameTime;
>
> // the total time for one sequence, from BEGIN to END
> double _totalTime ;
>
> // true if _totalTime needs to be recalculated because setTime or
> // setInterval was invoked, or a new child was added
> bool _resetTotalTime ;
>
> // store "loop mde", either LOOP or SWING
> // init to LOOP- set by setInterval
> LoopMode _loopMode;
>
> // first and last "values" to sequence through
> // begin inits to 0
> // end inits to -1- means to init to number of values
> int _begin, _end;
>
> // multiplier of real-time clock- set to N to go N times faster
> // init to 0- going nowhere
> float _speed;
>
> // _nreps: how many times to repeat- default param is -1, repeat
> forever
> // init to 0, no repetitions
> // _nrepsRemain: set to nreps and counts down every traversal,
> // stopping when it gets to zero. init to 0
> int _nreps, _nrepsRemain;
>
> // frame step (are we stepping forward or backward?)
> int _step;
>
> // default frame time for newly created frames or children- default
> is 1.
> // set by setDefaultTime
> double _defaultTime ;
>
> // special time to display last frame of last loop
> // <= zero means to not do anything special
> double _lastFrameTime ;
>
> // save the actual time of the last frame, and what value was stored
> double _saveRealLastFrameTime ;
> unsigned int _saveRealLastFrameValue ;
>
> // the current mode
> SequenceMode _mode;
>
> // the current sync value
> bool _sync ;
>
> // the current clearOnStop value
> bool _clearOnStop ;
>
> };
>
> }
>
> #endif
>
> _______________________________________________
> osg-submissions mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
>
>
_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org