1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2024-12-28 00:15:06 +00:00
OpenMW/components/nifosg/matrixtransform.cpp
2022-09-22 21:35:26 +03:00

75 lines
2.2 KiB
C++

#include "matrixtransform.hpp"
namespace NifOsg
{
MatrixTransform::MatrixTransform(const Nif::Transformation& trafo)
: osg::MatrixTransform(trafo.toMatrix())
, mScale(trafo.scale)
, mRotationScale(trafo.rotation)
{
}
MatrixTransform::MatrixTransform(const MatrixTransform& copy, const osg::CopyOp& copyop)
: osg::MatrixTransform(copy, copyop)
, mScale(copy.mScale)
, mRotationScale(copy.mRotationScale)
{
}
void MatrixTransform::setScale(float scale)
{
// Update the decomposed scale.
mScale = scale;
// Rescale the node using the known components.
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; ++j)
_matrix(i, j) = mRotationScale.mValues[j][i] * mScale; // NB: column/row major difference
_inverseDirty = true;
dirtyBound();
}
void MatrixTransform::setRotation(const osg::Quat& rotation)
{
// First override the rotation ignoring the scale.
_matrix.setRotate(rotation);
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
// Update the current decomposed rotation and restore the known scale.
mRotationScale.mValues[j][i] = _matrix(i, j); // NB: column/row major difference
_matrix(i, j) *= mScale;
}
}
_inverseDirty = true;
dirtyBound();
}
void MatrixTransform::setRotation(const Nif::Matrix3& rotation)
{
// Update the decomposed rotation.
mRotationScale = rotation;
// Reorient the node using the known components.
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; ++j)
_matrix(i, j) = mRotationScale.mValues[j][i] * mScale; // NB: column/row major difference
_inverseDirty = true;
dirtyBound();
}
void MatrixTransform::setTranslation(const osg::Vec3f& translation)
{
// The translation is independent from the rotation and scale so we can apply it directly.
_matrix.setTrans(translation);
_inverseDirty = true;
dirtyBound();
}
}