animateCollisionShape checks if the shape is really animated

openmw-38
scrawl 9 years ago
parent 894477849a
commit cbf344663f

@ -563,7 +563,7 @@ namespace MWPhysics
btCompoundShape* compound = dynamic_cast<btCompoundShape*>(mShapeInstance->getCollisionShape());
for (std::map<int, int>::const_iterator it = mShapeInstance->mAnimatedShapes.begin(); it != mShapeInstance->mAnimatedShapes.end(); ++it)
for (std::map<int, int>::iterator it = mShapeInstance->mAnimatedShapes.begin(); it != mShapeInstance->mAnimatedShapes.end();)
{
int recIndex = it->first;
int shapeIndex = it->second;
@ -578,6 +578,24 @@ namespace MWPhysics
osg::NodePath path = visitor.mFoundPath;
path.erase(path.begin());
// Attempt to remove "animated" shapes that are not actually animated
// We may get these because the BulletNifLoader does not know if a .kf file with additional controllers will be attached later on.
// On the first animateCollisionShapes call, we'll consider the graph completely loaded (with extra controllers and what not),
// so now we can better decide if the shape is really animated.
bool animated = false;
for (osg::NodePath::iterator nodePathIt = path.begin(); nodePathIt != path.end(); ++nodePathIt)
{
osg::Node* node = *nodePathIt;
if (node->getUpdateCallback())
animated = true;
}
if (!animated)
{
mShapeInstance->mAnimatedShapes.erase(it++);
break;
}
osg::Matrixf matrix = osg::computeLocalToWorld(path);
osg::Vec3f scale = matrix.getScale();
matrix.orthoNormalize(matrix);
@ -590,6 +608,8 @@ namespace MWPhysics
compound->getChildShape(shapeIndex)->setLocalScaling(compound->getLocalScaling() * toBullet(scale));
compound->updateChildTransform(shapeIndex, transform);
++it;
}
collisionWorld->updateSingleAabb(mCollisionObject.get());

Loading…
Cancel
Save