diff --git a/apps/openmw_test_suite/nif/node.hpp b/apps/openmw_test_suite/nif/node.hpp index ce42faef08..70a1fe16be 100644 --- a/apps/openmw_test_suite/nif/node.hpp +++ b/apps/openmw_test_suite/nif/node.hpp @@ -6,9 +6,9 @@ namespace Nif::Testing { - inline void init(Transformation& value) + inline void init(NiTransform& value) { - value = Transformation::getIdentity(); + value = NiTransform::getIdentity(); } inline void init(Extra& value) diff --git a/apps/openmw_test_suite/nifloader/testbulletnifloader.cpp b/apps/openmw_test_suite/nifloader/testbulletnifloader.cpp index 7c675fd22d..2381d2d5a4 100644 --- a/apps/openmw_test_suite/nifloader/testbulletnifloader.cpp +++ b/apps/openmw_test_suite/nifloader/testbulletnifloader.cpp @@ -274,12 +274,12 @@ namespace using namespace Nif::Testing; using NifBullet::BulletNifLoader; - void copy(const btTransform& src, Nif::Transformation& dst) + void copy(const btTransform& src, Nif::NiTransform& dst) { - dst.pos = osg::Vec3f(src.getOrigin().x(), src.getOrigin().y(), src.getOrigin().z()); + dst.mTranslation = osg::Vec3f(src.getOrigin().x(), src.getOrigin().y(), src.getOrigin().z()); for (int row = 0; row < 3; ++row) for (int column = 0; column < 3; ++column) - dst.rotation.mValues[row][column] = src.getBasis().getRow(row)[column]; + dst.mRotation.mValues[row][column] = src.getBasis().getRow(row)[column]; } struct TestBulletNifLoader : Test @@ -740,7 +740,7 @@ namespace TEST_F(TestBulletNifLoader, for_tri_shape_root_node_and_filename_starting_with_x_should_return_animated_shape) { copy(mTransform, mNiTriShape.trafo); - mNiTriShape.trafo.scale = 3; + mNiTriShape.trafo.mScale = 3; Nif::NIFFile file("xtest.nif"); file.mRoots.push_back(&mNiTriShape); @@ -764,10 +764,10 @@ namespace TEST_F(TestBulletNifLoader, for_tri_shape_child_node_and_filename_starting_with_x_should_return_animated_shape) { copy(mTransform, mNiTriShape.trafo); - mNiTriShape.trafo.scale = 3; + mNiTriShape.trafo.mScale = 3; mNiTriShape.parents.push_back(&mNiNode); mNiNode.children = Nif::NodeList(std::vector({ Nif::NodePtr(&mNiTriShape) })); - mNiNode.trafo.scale = 4; + mNiNode.trafo.mScale = 4; Nif::NIFFile file("xtest.nif"); file.mRoots.push_back(&mNiNode); @@ -792,11 +792,11 @@ namespace TestBulletNifLoader, for_two_tri_shape_children_nodes_and_filename_starting_with_x_should_return_animated_shape) { copy(mTransform, mNiTriShape.trafo); - mNiTriShape.trafo.scale = 3; + mNiTriShape.trafo.mScale = 3; mNiTriShape.parents.push_back(&mNiNode); copy(mTransform, mNiTriShape2.trafo); - mNiTriShape2.trafo.scale = 3; + mNiTriShape2.trafo.mScale = 3; mNiTriShape2.parents.push_back(&mNiNode); mNiNode.children = Nif::NodeList(std::vector({ @@ -835,11 +835,11 @@ namespace mController.recType = Nif::RC_NiKeyframeController; mController.flags |= Nif::Controller::Flag_Active; copy(mTransform, mNiTriShape.trafo); - mNiTriShape.trafo.scale = 3; + mNiTriShape.trafo.mScale = 3; mNiTriShape.parents.push_back(&mNiNode); mNiTriShape.mController = Nif::ControllerPtr(&mController); mNiNode.children = Nif::NodeList(std::vector({ Nif::NodePtr(&mNiTriShape) })); - mNiNode.trafo.scale = 4; + mNiNode.trafo.mScale = 4; Nif::NIFFile file("test.nif"); file.mRoots.push_back(&mNiNode); @@ -865,17 +865,17 @@ namespace mController.recType = Nif::RC_NiKeyframeController; mController.flags |= Nif::Controller::Flag_Active; copy(mTransform, mNiTriShape.trafo); - mNiTriShape.trafo.scale = 3; + mNiTriShape.trafo.mScale = 3; mNiTriShape.parents.push_back(&mNiNode); copy(mTransform, mNiTriShape2.trafo); - mNiTriShape2.trafo.scale = 3; + mNiTriShape2.trafo.mScale = 3; mNiTriShape2.parents.push_back(&mNiNode); mNiTriShape2.mController = Nif::ControllerPtr(&mController); mNiNode.children = Nif::NodeList(std::vector({ Nif::NodePtr(&mNiTriShape), Nif::NodePtr(&mNiTriShape2), })); - mNiNode.trafo.scale = 4; + mNiNode.trafo.mScale = 4; Nif::NIFFile file("test.nif"); file.mRoots.push_back(&mNiNode); @@ -1352,12 +1352,12 @@ namespace TEST_F(TestBulletNifLoader, should_handle_node_with_multiple_parents) { copy(mTransform, mNiTriShape.trafo); - mNiTriShape.trafo.scale = 4; + mNiTriShape.trafo.mScale = 4; mNiTriShape.parents = { &mNiNode, &mNiNode2 }; mNiNode.children = Nif::NodeList(std::vector({ Nif::NodePtr(&mNiTriShape) })); - mNiNode.trafo.scale = 2; + mNiNode.trafo.mScale = 2; mNiNode2.children = Nif::NodeList(std::vector({ Nif::NodePtr(&mNiTriShape) })); - mNiNode2.trafo.scale = 3; + mNiNode2.trafo.mScale = 3; Nif::NIFFile file("xtest.nif"); file.mRoots.push_back(&mNiNode); diff --git a/components/nif/data.cpp b/components/nif/data.cpp index 799d0cbe43..6570ce6e5c 100644 --- a/components/nif/data.cpp +++ b/components/nif/data.cpp @@ -347,9 +347,7 @@ namespace Nif void NiSkinData::read(NIFStream* nif) { - nif->read(mTransform.rotation); - nif->read(mTransform.pos); - nif->read(mTransform.scale); + nif->read(mTransform); uint32_t numBones; nif->read(numBones); @@ -366,9 +364,7 @@ namespace Nif mBones.resize(numBones); for (BoneInfo& bi : mBones) { - nif->read(bi.mTransform.rotation); - nif->read(bi.mTransform.pos); - nif->read(bi.mTransform.scale); + nif->read(bi.mTransform); nif->read(bi.mBoundSphere); uint16_t numVertices; diff --git a/components/nif/data.hpp b/components/nif/data.hpp index 42f52ba5f1..d81f6de22f 100644 --- a/components/nif/data.hpp +++ b/components/nif/data.hpp @@ -1,33 +1,10 @@ -/* - OpenMW - The completely unofficial reimplementation of Morrowind - Copyright (C) 2008-2010 Nicolay Korslund - Email: < korslund@gmail.com > - WWW: https://openmw.org/ - - This file (data.h) is part of the OpenMW package. - - OpenMW is distributed as free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License - version 3, as published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - version 3 along with this program. If not, see - https://www.gnu.org/licenses/ . - - */ - #ifndef OPENMW_COMPONENTS_NIF_DATA_HPP #define OPENMW_COMPONENTS_NIF_DATA_HPP #include "nifkey.hpp" -#include "niftypes.hpp" // Transformation +#include "niftypes.hpp" // NiTransform +#include "node.hpp" #include "recordptr.hpp" -#include namespace Nif { @@ -278,12 +255,12 @@ namespace Nif struct BoneInfo { - Transformation mTransform; + NiTransform mTransform; osg::BoundingSpheref mBoundSphere; std::vector mWeights; }; - Transformation mTransform; + NiTransform mTransform; std::vector mBones; NiSkinPartitionPtr mPartitions; @@ -413,5 +390,5 @@ namespace Nif void read(NIFStream* nif) override; }; -} // Namespace +} #endif diff --git a/components/nif/nifstream.cpp b/components/nif/nifstream.cpp index c666a5edab..e33dc4f7b1 100644 --- a/components/nif/nifstream.cpp +++ b/components/nif/nifstream.cpp @@ -130,11 +130,11 @@ namespace Nif } template <> - void NIFStream::read(Transformation& t) + void NIFStream::read(NiTransform& transform) { - read(t.pos); - read(t.rotation); - read(t.scale); + read(transform.mRotation); + read(transform.mTranslation); + read(transform.mScale); } template <> @@ -192,7 +192,7 @@ namespace Nif } template <> - void NIFStream::read(Transformation* dest, size_t size) + void NIFStream::read(NiTransform* dest, size_t size) { readRange(*this, dest, size); } diff --git a/components/nif/nifstream.hpp b/components/nif/nifstream.hpp index 217d924059..f4c35e6625 100644 --- a/components/nif/nifstream.hpp +++ b/components/nif/nifstream.hpp @@ -159,7 +159,6 @@ namespace Nif osg::Vec4f getVector4() { return get(); } Matrix3 getMatrix3() { return get(); } osg::Quat getQuaternion() { return get(); } - Transformation getTrafo() { return get(); } bool getBoolean() { return get(); } std::string getString() { return get(); } }; @@ -177,7 +176,7 @@ namespace Nif template <> void NIFStream::read(osg::BoundingSpheref& sphere); template <> - void NIFStream::read(Transformation& t); + void NIFStream::read(NiTransform& transform); template <> void NIFStream::read(bool& data); template <> @@ -196,7 +195,7 @@ namespace Nif template <> void NIFStream::read(osg::BoundingSpheref* dest, size_t size); template <> - void NIFStream::read(Transformation* dest, size_t size); + void NIFStream::read(NiTransform* dest, size_t size); template <> void NIFStream::read(bool* dest, size_t size); template <> diff --git a/components/nif/niftypes.hpp b/components/nif/niftypes.hpp index b6a97b6ecb..3b2a4c1578 100644 --- a/components/nif/niftypes.hpp +++ b/components/nif/niftypes.hpp @@ -53,29 +53,29 @@ namespace Nif } }; - struct Transformation + struct NiTransform { - osg::Vec3f pos; - Matrix3 rotation; // this can contain scale components too, including negative and nonuniform scales - float scale; + Matrix3 mRotation; // this can contain scale components too, including negative and nonuniform scales + osg::Vec3f mTranslation; + float mScale; osg::Matrixf toMatrix() const { osg::Matrixf transform; - transform.setTrans(pos); + transform.setTrans(mTranslation); for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) - transform(j, i) = rotation.mValues[i][j] * scale; // NB column/row major difference + transform(j, i) = mRotation.mValues[i][j] * mScale; // NB column/row major difference return transform; } - bool isIdentity() const { return pos == osg::Vec3f(0, 0, 0) && rotation.isIdentity() && scale == 1.f; } + bool isIdentity() const { return mRotation.isIdentity() && mTranslation == osg::Vec3f() && mScale == 1.f; } - static const Transformation& getIdentity() + static const NiTransform& getIdentity() { - static const Transformation identity = { osg::Vec3f(), Matrix3(), 1.0f }; + static const NiTransform identity = { Matrix3(), osg::Vec3f(), 1.0f }; return identity; } }; diff --git a/components/nif/node.cpp b/components/nif/node.cpp index 733d5319e9..fba0e1a69a 100644 --- a/components/nif/node.cpp +++ b/components/nif/node.cpp @@ -80,7 +80,10 @@ namespace Nif NiObjectNET::read(nif); flags = nif->getBethVersion() <= 26 ? nif->getUShort() : nif->getUInt(); - trafo = nif->getTrafo(); + nif->read(trafo.mTranslation); + nif->read(trafo.mRotation); + nif->read(trafo.mScale); + if (nif->getVersion() <= NIFStream::generateVersion(4, 2, 2, 0)) velocity = nif->getVector3(); if (nif->getBethVersion() <= NIFFile::BethVersion::BETHVER_FO3) @@ -130,7 +133,7 @@ namespace Nif // We want to do this on world scene graph level rather than local scene graph level. if (0 == recIndex && !Misc::StringUtils::ciEqual(mName, "bip01")) { - trafo = Nif::Transformation::getIdentity(); + trafo = Nif::NiTransform::getIdentity(); } } diff --git a/components/nif/node.hpp b/components/nif/node.hpp index 129e74a617..2a1fcd9af6 100644 --- a/components/nif/node.hpp +++ b/components/nif/node.hpp @@ -83,7 +83,7 @@ namespace Nif // Node flags. Interpretation depends somewhat on the type of node. unsigned int flags; - Transformation trafo; + NiTransform trafo; osg::Vec3f velocity; // Unused? Might be a run-time game state PropertyList props; diff --git a/components/nifosg/matrixtransform.cpp b/components/nifosg/matrixtransform.cpp index 44eac28def..a59f10360a 100644 --- a/components/nifosg/matrixtransform.cpp +++ b/components/nifosg/matrixtransform.cpp @@ -2,10 +2,10 @@ namespace NifOsg { - MatrixTransform::MatrixTransform(const Nif::Transformation& trafo) - : osg::MatrixTransform(trafo.toMatrix()) - , mScale(trafo.scale) - , mRotationScale(trafo.rotation) + MatrixTransform::MatrixTransform(const Nif::NiTransform& transform) + : osg::MatrixTransform(transform.toMatrix()) + , mScale(transform.mScale) + , mRotationScale(transform.mRotation) { } diff --git a/components/nifosg/matrixtransform.hpp b/components/nifosg/matrixtransform.hpp index e1e7ff1828..4e42d00787 100644 --- a/components/nifosg/matrixtransform.hpp +++ b/components/nifosg/matrixtransform.hpp @@ -12,7 +12,7 @@ namespace NifOsg { public: MatrixTransform() = default; - MatrixTransform(const Nif::Transformation& trafo); + MatrixTransform(const Nif::NiTransform& transform); MatrixTransform(const MatrixTransform& copy, const osg::CopyOp& copyop); META_Node(NifOsg, MatrixTransform)