From Michael Platings,

- Animations with equal priority are now weighted correctly relative to each other
- (minor) Channels no longer store their weight as the only time it's used is in update() when Animation can pass in the weight directly
From Cedric Pinson,
- I adjusted the quaternion blending to keep the commutativy property
This commit is contained in:
Cedric Pinson
2009-08-26 09:24:02 +00:00
parent c56dd6faa5
commit 3c45fb1e6c
9 changed files with 92 additions and 83 deletions

View File

@@ -1,5 +1,5 @@
/* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* 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
@@ -95,7 +95,7 @@ void Animation::setWeight (float weight)
_weight = weight;
}
bool Animation::update (float time)
bool Animation::update (float time, int priority)
{
if (!_duration) // if not initialized then do it
computeDuration();
@@ -138,8 +138,7 @@ bool Animation::update (float time)
ChannelList::const_iterator chan;
for( chan=_channels.begin(); chan!=_channels.end(); ++chan)
{
(*chan)->setWeight(_weight);
(*chan)->update(t);
(*chan)->update(t, _weight, priority);
}
return true;
}

View File

@@ -1,5 +1,5 @@
/* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* 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
@@ -90,10 +90,11 @@ void BasicAnimationManager::update (double time)
{
// update all animation
std::vector<int> toremove;
int priority = iterAnim->first;
AnimationList& list = iterAnim->second;
for (unsigned int i = 0; i < list.size(); i++)
{
if (! list[i]->update(time))
if (! list[i]->update(time, priority))
{
// debug
// std::cout << list[i]->getName() << " finished at " << time << std::endl;

View File

@@ -1,5 +1,5 @@
/* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* 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
@@ -15,12 +15,11 @@
#include <osgAnimation/Channel>
using namespace osgAnimation;
Channel::Channel() { _weight=1; }
Channel::Channel() {}
Channel::~Channel() {}
Channel::Channel(const Channel& channel) : osg::Referenced(channel),
_targetName(channel._targetName),
_name(channel._name),
_weight(channel._weight)
_name(channel._name)
{
}
@@ -29,7 +28,3 @@ void Channel::setName (const std::string& name) { _name = name; }
const std::string& Channel::getTargetName() const { return _targetName;}
void Channel::setTargetName (const std::string& name) { _targetName = name; }
float Channel::getWeight() const { return _weight;}
void Channel::setWeight(float w) { _weight = w;}

View File

@@ -202,7 +202,9 @@ void MorphGeometry::transformSoftwareMethod()
}
}
UpdateMorph::UpdateMorph(const UpdateMorph& apc,const osg::CopyOp& copyop) : AnimationUpdateCallback<osg::NodeCallback>(apc, copyop)
UpdateMorph::UpdateMorph(const UpdateMorph& apc,const osg::CopyOp& copyop) :
osg::Object(apc, copyop),
AnimationUpdateCallback<osg::NodeCallback>(apc, copyop)
{
}
@@ -271,7 +273,7 @@ bool UpdateMorph::link(osgAnimation::Channel* channel)
}
else
{
std::cerr << "Channel " << channel->getName() << " does not contain a valid symbolic name for this class" << std::endl;
osg::notify(osg::WARN) << "Channel " << channel->getName() << " does not contain a valid symbolic name for this class" << std::endl;
}
return false;
}

View File

@@ -1,5 +1,5 @@
/* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* 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
@@ -18,5 +18,5 @@
using namespace osgAnimation;
Target::Target() { reset();}
Target::Target() : _weight(0), _priorityWeight(0), _lastPriority(0) {}
Target::~Target() {}

View File

@@ -146,6 +146,7 @@ bool Animation_readChannel(osgAnimation::Channel* pChannel, Input& fr)
}
pChannel->setTargetName(target);
// we dont need this info
float weight = 1.0;
if (fr.matchSequence("weight %f"))
{
@@ -153,7 +154,7 @@ bool Animation_readChannel(osgAnimation::Channel* pChannel, Input& fr)
fr += 2;
iteratorAdvanced = true;
}
pChannel->setWeight(weight);
// pChannel->setWeight(weight);
return iteratorAdvanced;
}
@@ -546,7 +547,7 @@ void Animation_writeChannel(const std::string& channelString, ChannelType* pChan
fw.indent() << "name \"" << pChannel->getName() << "\"" << std::endl;
fw.indent() << "target \"" << pChannel->getTargetName() << "\"" << std::endl;
fw.indent() << "weight " << pChannel->getWeight() << std::endl;
// fw.indent() << "weight " << pChannel->getWeight() << std::endl;
ContainerType* kfc = pChannel->getSamplerTyped()->getKeyframeContainerTyped();
if (kfc)