Merged pull request #1923

pull/541/head
Marc Zinnschlag 6 years ago
commit 107165d36d

@ -67,6 +67,7 @@
Bug #4431: "Lock 0" console command is a no-op Bug #4431: "Lock 0" console command is a no-op
Bug #4432: Guards behaviour is incorrect if they do not have AI packages Bug #4432: Guards behaviour is incorrect if they do not have AI packages
Bug #4433: Guard behaviour is incorrect with Alarm = 0 Bug #4433: Guard behaviour is incorrect with Alarm = 0
Bug #4437: Transformations for NiSkinInstance are ignored
Bug #4451: Script fails to compile when using "Begin, [ScriptName]" syntax Bug #4451: Script fails to compile when using "Begin, [ScriptName]" syntax
Bug #4452: Default terrain texture bleeds through texture transitions Bug #4452: Default terrain texture bleeds through texture transitions
Bug #4453: Quick keys behaviour is invalid for equipment Bug #4453: Quick keys behaviour is invalid for equipment

@ -1082,7 +1082,10 @@ namespace NifOsg
// Assign bone weights // Assign bone weights
osg::ref_ptr<SceneUtil::RigGeometry::InfluenceMap> map (new SceneUtil::RigGeometry::InfluenceMap); osg::ref_ptr<SceneUtil::RigGeometry::InfluenceMap> map (new SceneUtil::RigGeometry::InfluenceMap);
// We should take in account transformation of NiTriShape and NiSkinData
const Nif::NiSkinData *data = skin->data.getPtr(); const Nif::NiSkinData *data = skin->data.getPtr();
osg::Matrixf shapeTransforms = triShape->trafo.toMatrix() * data->trafo.toMatrix();
const Nif::NodeList &bones = skin->bones; const Nif::NodeList &bones = skin->bones;
for(size_t i = 0;i < bones.length();i++) for(size_t i = 0;i < bones.length();i++)
{ {
@ -1096,11 +1099,12 @@ namespace NifOsg
influence.mWeights.insert(indexWeight); influence.mWeights.insert(indexWeight);
} }
influence.mInvBindMatrix = data->bones[i].trafo.toMatrix(); influence.mInvBindMatrix = data->bones[i].trafo.toMatrix();
influence.mBoundSphere = osg::BoundingSpheref(data->bones[i].boundSphereCenter, data->bones[i].boundSphereRadius); influence.mBoundSphere = osg::BoundingSpheref(shapeTransforms * data->bones[i].boundSphereCenter, data->bones[i].boundSphereRadius);
map->mMap.insert(std::make_pair(boneName, influence)); map->mMap.insert(std::make_pair(boneName, influence));
} }
rig->setInfluenceMap(map); rig->setInfluenceMap(map);
rig->setRigTransforms(*&shapeTransforms);
parentNode->addChild(rig); parentNode->addChild(rig);
} }

@ -49,6 +49,7 @@ RigGeometry::RigGeometry(const RigGeometry &copy, const osg::CopyOp &copyop)
: Drawable(copy, copyop) : Drawable(copy, copyop)
, mSkeleton(NULL) , mSkeleton(NULL)
, mInfluenceMap(copy.mInfluenceMap) , mInfluenceMap(copy.mInfluenceMap)
, mRigTransforms(copy.mRigTransforms)
, mLastFrameNumber(0) , mLastFrameNumber(0)
, mBoundsFirstFrame(true) , mBoundsFirstFrame(true)
{ {
@ -214,6 +215,9 @@ void RigGeometry::cull(osg::NodeVisitor* nv)
if (mGeomToSkelMatrix) if (mGeomToSkelMatrix)
resultMat *= (*mGeomToSkelMatrix); resultMat *= (*mGeomToSkelMatrix);
if (!mRigTransforms.isIdentity())
resultMat *= mRigTransforms;
for (auto &vertex : pair.second) for (auto &vertex : pair.second)
{ {
(*positionDst)[vertex] = resultMat.preMult((*positionSrc)[vertex]); (*positionDst)[vertex] = resultMat.preMult((*positionSrc)[vertex]);
@ -309,6 +313,11 @@ void RigGeometry::setInfluenceMap(osg::ref_ptr<InfluenceMap> influenceMap)
mInfluenceMap = influenceMap; mInfluenceMap = influenceMap;
} }
void RigGeometry::setRigTransforms(osg::Matrixf& transform)
{
mRigTransforms = transform;
}
void RigGeometry::accept(osg::NodeVisitor &nv) void RigGeometry::accept(osg::NodeVisitor &nv)
{ {
if (!nv.validNodeMask(*this)) if (!nv.validNodeMask(*this))

@ -40,6 +40,7 @@ namespace SceneUtil
}; };
void setInfluenceMap(osg::ref_ptr<InfluenceMap> influenceMap); void setInfluenceMap(osg::ref_ptr<InfluenceMap> influenceMap);
void setRigTransforms(osg::Matrixf& transform);
/// Initialize this geometry from the source geometry. /// Initialize this geometry from the source geometry.
/// @note The source geometry will not be modified. /// @note The source geometry will not be modified.
@ -65,6 +66,7 @@ namespace SceneUtil
osg::ref_ptr<osg::RefMatrix> mGeomToSkelMatrix; osg::ref_ptr<osg::RefMatrix> mGeomToSkelMatrix;
osg::ref_ptr<InfluenceMap> mInfluenceMap; osg::ref_ptr<InfluenceMap> mInfluenceMap;
osg::Matrixf mRigTransforms;
typedef std::pair<Bone*, osg::Matrixf> BoneBindMatrixPair; typedef std::pair<Bone*, osg::Matrixf> BoneBindMatrixPair;

Loading…
Cancel
Save