From 1436be9699975796ef80fa23e75d3442fe7aaaa7 Mon Sep 17 00:00:00 2001 From: ehofman Date: Fri, 14 May 2004 19:46:12 +0000 Subject: [PATCH] Solve the endless loop problem for the DC-3 and prevent a potential segmentation fault. --- simgear/scene/model/animation.cxx | 32 ++++++++++++++++++++++++------- simgear/scene/model/animation.hxx | 1 + simgear/scene/model/model.cxx | 7 ++++--- 3 files changed, 30 insertions(+), 10 deletions(-) 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 ) ); } } +} + +SGTimedAnimation::~SGTimedAnimation () +{ +} + +void +SGTimedAnimation::init() +{ 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 ); + 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); } -SGTimedAnimation::~SGTimedAnimation () -{ -} - 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(); -- 2.39.5