diff --git a/simgear/scene/model/animation.cxx b/simgear/scene/model/animation.cxx index 68cd908f..0e5e274e 100644 --- a/simgear/scene/model/animation.cxx +++ b/simgear/scene/model/animation.cxx @@ -441,21 +441,35 @@ SGTimedAnimation::SGTimedAnimation (SGPropertyNode_ptr props) rNode->getDoubleValue( "max", 1.0 ) ); } } - if ( !_use_personality ) { - for ( size_t i = 0; i < _branch_duration_specs.size(); i++ ) { - DurationSpec &sp = _branch_duration_specs[ i ]; - double v = sp._min + sg_random() * ( sp._max - sp._min ); - _branch_duration_sec.push_back( v ); - _total_duration_sec += v; - } - } - ((ssgSelector *)getBranch())->selectStep(_step); } SGTimedAnimation::~SGTimedAnimation () { } +void +SGTimedAnimation::init() +{ + if ( !_use_personality ) { + for ( size_t i = 0; i < getBranch()->getNumKids(); i++ ) { + double v; + if ( i < _branch_duration_specs.size() ) { + DurationSpec &sp = _branch_duration_specs[ i ]; + v = sp._min + sg_random() * ( sp._max - sp._min ); + } else { + v = _duration_sec; + } + _branch_duration_sec.push_back( v ); + _total_duration_sec += v; + } + // Sanity check : total duration shouldn't equal zero + if ( _total_duration_sec < 0.01 ) { + _total_duration_sec = 0.01; + } + } + ((ssgSelector *)getBranch())->selectStep(_step); +} + int SGTimedAnimation::update() { @@ -472,6 +486,10 @@ SGTimedAnimation::update() offset = v; total += v; } + // Sanity check : total duration shouldn't equal zero + if ( total < 0.01 ) { + total = 0.01; + } offset *= sg_random(); key->setDoubleValue( sim_time_sec - offset, this, LAST_TIME_SEC ); key->setDoubleValue( total, this, TOTAL_DURATION_SEC ); diff --git a/simgear/scene/model/animation.hxx b/simgear/scene/model/animation.hxx index 95807afb..0fcd229d 100644 --- a/simgear/scene/model/animation.hxx +++ b/simgear/scene/model/animation.hxx @@ -187,6 +187,7 @@ class SGTimedAnimation : public SGAnimation public: SGTimedAnimation (SGPropertyNode_ptr props); virtual ~SGTimedAnimation (); + virtual void init(); virtual int update(); private: bool _use_personality; diff --git a/simgear/scene/model/model.cxx b/simgear/scene/model/model.cxx index 3d7cf5f3..a9363596 100644 --- a/simgear/scene/model/model.cxx +++ b/simgear/scene/model/model.cxx @@ -192,10 +192,11 @@ sgMakeAnimation( ssgBranch * model, SG_LOG(SG_INPUT, SG_WARN, "Object " << name << " not found"); delete animation; animation = 0; + } else { + ssgBranch * oldParent = object->getParent(0); + branch->addKid(object); + oldParent->removeKid(object); } - ssgBranch * oldParent = object->getParent(0); - branch->addKid(object); - oldParent->removeKid(object); } animation->init();