Solve the endless loop problem for the DC-3 and prevent a potential segmentation fault.
This commit is contained in:
@@ -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 );
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user