From cfac6a780925ade343a2894f7ed1c8ea9d717bc7 Mon Sep 17 00:00:00 2001 From: Cedric Pinson Date: Thu, 1 Oct 2009 17:08:16 +0000 Subject: [PATCH] From Michael Platings, In Target, the default constructor is explicitly called on _target. This is necessary for FloatTarget and DoubleTarget so that _target is initialised to 0, otherwise you get a junk value. In MorphGeometry.cpp, UpdateMorph::link now links channels of the same index to the same target. Previously a new FloatTarget was created for each channel, so multiple animations didn't work. --- include/osgAnimation/Target | 2 +- src/osgAnimation/MorphGeometry.cpp | 31 ++++++++++++++++-------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/include/osgAnimation/Target b/include/osgAnimation/Target index 8b5400a0d..c7c43362b 100644 --- a/include/osgAnimation/Target +++ b/include/osgAnimation/Target @@ -50,7 +50,7 @@ namespace osgAnimation { public: - TemplateTarget() {} + TemplateTarget() : _target() {} TemplateTarget(const T& v) { setValue(v); } TemplateTarget(const TemplateTarget& v) { setValue(v.getValue()); } diff --git a/src/osgAnimation/MorphGeometry.cpp b/src/osgAnimation/MorphGeometry.cpp index 934661abc..d2d36c7e0 100644 --- a/src/osgAnimation/MorphGeometry.cpp +++ b/src/osgAnimation/MorphGeometry.cpp @@ -261,19 +261,22 @@ bool UpdateMorph::link(osgAnimation::Channel* channel) if (weightIndex >= 0) { - osgAnimation::FloatLinearChannel* fc = dynamic_cast(channel); - if (fc) - { - osgAnimation::FloatTarget* ft = new osgAnimation::FloatTarget; - _weightTargets[weightIndex] = ft; - ft->setValue(-1); - fc->setTarget(ft); - return true; - } - } + osgAnimation::FloatLinearChannel* fc = dynamic_cast(channel); + if (fc) + { + osgAnimation::FloatTarget* ft = _weightTargets[weightIndex].get(); + if (ft == 0) + { + ft = new osgAnimation::FloatTarget; + _weightTargets[weightIndex] = ft; + } + fc->setTarget(ft); + return true; + } + } else - { - osg::notify(osg::WARN) << "Channel " << channel->getName() << " does not contain a valid symbolic name for this class" << std::endl; - } - return false; + { + osg::notify(osg::WARN) << "Channel " << channel->getName() << " does not contain a valid symbolic name for this class" << std::endl; + } + return false; }