optimizations to reduce cpu overhead: 1) Avoid a load-hit-store in UpdateBone. b->getMatrixInBoneSpace() returns the same matrix that was just stored with b->setMatrix() 2) Avoid calling element->isIdentity() for the whole transform stack (can be expensive is element is a matrix) 3) Make the key frame interpolator use binary search instead of a linear one. This is very noticeable in scenes where some geometry has long repeating animations that start at the same time, you will see the update time grow then reset and grow again." git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14294 16af8721-9629-0410-8352-f15c8da7e697
67 lines
1.9 KiB
C++
67 lines
1.9 KiB
C++
/* -*-c++-*-
|
|
* Copyright (C) 2009 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
|
|
* (at your option) any later version. The full license is in LICENSE file
|
|
* included with this distribution, and on the openscenegraph.org website.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* OpenSceneGraph Public License for more details.
|
|
*/
|
|
|
|
#include <osgAnimation/StackedTransform>
|
|
|
|
using namespace osgAnimation;
|
|
|
|
StackedTransform::StackedTransform() {}
|
|
|
|
StackedTransform::StackedTransform(const StackedTransform& rhs, const osg::CopyOp& co)
|
|
{
|
|
reserve(rhs.size());
|
|
for (StackedTransform::const_iterator it = rhs.begin(); it != rhs.end(); ++it)
|
|
{
|
|
const StackedTransformElement* element = it->get();
|
|
if (element)
|
|
push_back(osg::clone(element,co));
|
|
}
|
|
}
|
|
|
|
|
|
void StackedTransform::update(float t)
|
|
{
|
|
bool dirty = false;
|
|
for (StackedTransform::iterator it = begin(); it != end(); ++it)
|
|
{
|
|
StackedTransformElement* element = it->get();
|
|
if (!element)
|
|
continue;
|
|
// update and check if there are changes
|
|
element->update(t);
|
|
if (!dirty && !element->isIdentity()){
|
|
dirty = true;
|
|
}
|
|
}
|
|
|
|
if (!dirty)
|
|
return;
|
|
|
|
|
|
// dirty update matrix
|
|
_matrix.makeIdentity();
|
|
for (StackedTransform::iterator it = begin(); it != end(); ++it)
|
|
{
|
|
StackedTransformElement* element = it->get();
|
|
if (!element || element->isIdentity())
|
|
continue;
|
|
element->applyToMatrix(_matrix);
|
|
}
|
|
}
|
|
|
|
const osg::Matrix& StackedTransform::getMatrix() const
|
|
{
|
|
return _matrix;
|
|
}
|