mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-25 17:56:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			74 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			74 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();
 | |
|     }
 | |
| }
 |