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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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() {}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user