mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-20 05:53:50 +00:00
Merged pull request #1923
This commit is contained in:
commit
107165d36d
4 changed files with 17 additions and 1 deletions
|
@ -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 ©, const osg::CopyOp ©op)
|
||||||
: 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…
Reference in a new issue