Hi Robert, For a scene with a lot of animated agents I did some small 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.
Cheers, Pjotr
/* -*-c++-*- * Copyright (C) 2009 Cedric Pinson <[email protected]> * * 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 <osg/NodeVisitor> #include <osgAnimation/Bone> #include <osgAnimation/UpdateBone> using namespace osgAnimation; UpdateBone::UpdateBone(const std::string& name) : UpdateMatrixTransform(name) { } UpdateBone::UpdateBone(const UpdateBone& apc,const osg::CopyOp& copyop) : osg::Object(apc,copyop), UpdateMatrixTransform(apc, copyop) { } /** Callback method called by the NodeVisitor when visiting a node.*/ void UpdateBone::operator()(osg::Node* node, osg::NodeVisitor* nv) { if (nv && nv->getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR) { Bone* b = dynamic_cast<Bone*>(node); if (!b) { OSG_WARN << "Warning: UpdateBone set on non-Bone object." << std::endl; return; } // here we would prefer to have a flag inside transform stack in order to avoid update and a dirty state in matrixTransform if it's not require. _transforms.update(); const osg::Matrix& matrix = _transforms.getMatrix(); b->setMatrix(matrix); Bone* parent = b->getBoneParent(); if (parent) b->setMatrixInSkeletonSpace(matrix * parent->getMatrixInSkeletonSpace()); else b->setMatrixInSkeletonSpace(matrix); } traverse(node,nv); }
/* -*-c++-*- * Copyright (C) 2009 Cedric Pinson <[email protected]> * * 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; }
Interpolator
Description: Binary data
_______________________________________________ osg-submissions mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
