mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-19 21:23:52 +00:00
Pre-transform the mesh vertices when there's no skinning or skeleton
This commit is contained in:
parent
61f32eca77
commit
b1f7fd9f7b
2 changed files with 24 additions and 3 deletions
|
@ -213,7 +213,7 @@ void NiSkinInstance::post(NIFFile *nif)
|
|||
|
||||
Ogre::Matrix4 Node::getLocalTransform()
|
||||
{
|
||||
Ogre::Matrix4 mat4;
|
||||
Ogre::Matrix4 mat4(Ogre::Matrix4::IDENTITY);
|
||||
mat4.makeTransform(trafo.pos, Ogre::Vector3(trafo.scale), Ogre::Quaternion(trafo.rotation));
|
||||
return mat4;
|
||||
}
|
||||
|
|
|
@ -533,12 +533,33 @@ class NIFMeshLoader : Ogre::ManualResourceLoader
|
|||
srcNorms = newNorms;
|
||||
#endif
|
||||
}
|
||||
else if(!mHasSkel)
|
||||
{
|
||||
// No skinning and no skeleton, so just transform the vertices and
|
||||
// normals into position.
|
||||
Ogre::Matrix4 mat4 = shape->getWorldTransform();
|
||||
for(size_t i = 0;i < srcVerts.size();i++)
|
||||
{
|
||||
Ogre::Vector4 vec4(srcVerts[i].x, srcVerts[i].y, srcVerts[i].z, 1.0f);
|
||||
vec4 = mat4*vec4;
|
||||
srcVerts[i] = Ogre::Vector3(&vec4[0]);
|
||||
}
|
||||
for(size_t i = 0;i < srcNorms.size();i++)
|
||||
{
|
||||
Ogre::Vector4 vec4(srcNorms[i].x, srcNorms[i].y, srcNorms[i].z, 0.0f);
|
||||
vec4 = mat4*vec4;
|
||||
srcNorms[i] = Ogre::Vector3(&vec4[0]);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the bounding box first
|
||||
BoundsFinder bounds;
|
||||
bounds.add(&srcVerts[0][0], srcVerts.size());
|
||||
mesh->_setBounds(Ogre::AxisAlignedBox(bounds.minX(), bounds.minY(), bounds.minZ(),
|
||||
bounds.maxX(), bounds.maxY(), bounds.maxZ()));
|
||||
// No idea why this offset is needed. It works fine without it if the
|
||||
// vertices weren't transformed first, but otherwise it fails later on
|
||||
// when the object is being inserted into the scene.
|
||||
mesh->_setBounds(Ogre::AxisAlignedBox(bounds.minX()-0.5f, bounds.minY()-0.5f, bounds.minZ()-0.5f,
|
||||
bounds.maxX()+0.5f, bounds.maxY()+0.5f, bounds.maxZ()+0.5f));
|
||||
mesh->_setBoundingSphereRadius(bounds.getRadius());
|
||||
|
||||
// This function is just one long stream of Ogre-barf, but it works
|
||||
|
|
Loading…
Reference in a new issue