1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-25 19:11:34 +00:00

Make ESM::Position not packed (should fix #6566)

This commit is contained in:
Petr Mikheev 2022-01-29 02:32:58 +01:00
parent 53f2dfd1c0
commit 68ef96410c
2 changed files with 15 additions and 7 deletions

View file

@ -41,9 +41,6 @@ enum RangeType
RT_Target = 2 RT_Target = 2
}; };
#pragma pack(push)
#pragma pack(1)
// Position and rotation // Position and rotation
struct Position struct Position
{ {
@ -68,7 +65,6 @@ struct Position
return tuple(l) < tuple(r); return tuple(l) < tuple(r);
} }
}; };
#pragma pack(pop)
bool inline operator== (const Position& left, const Position& right) noexcept bool inline operator== (const Position& left, const Position& right) noexcept
{ {

View file

@ -28,8 +28,15 @@ void ESM::ObjectState::load (ESMReader &esm)
mCount = 1; mCount = 1;
esm.getHNOT (mCount, "COUN"); esm.getHNOT (mCount, "COUN");
mPosition = mRef.mPos; if(esm.isNextSub("POS_"))
esm.getHNOT (mPosition, "POS_", 24); {
std::array<float, 6> pos;
esm.getHT(pos);
memcpy(mPosition.pos, pos.data(), sizeof(float) * 3);
memcpy(mPosition.rot, pos.data() + 3, sizeof(float) * 3);
}
else
mPosition = mRef.mPos;
if (esm.isNextSub("LROT")) if (esm.isNextSub("LROT"))
esm.skipHSub(); // local rotation, no longer used esm.skipHSub(); // local rotation, no longer used
@ -67,7 +74,12 @@ void ESM::ObjectState::save (ESMWriter &esm, bool inInventory) const
esm.writeHNT ("COUN", mCount); esm.writeHNT ("COUN", mCount);
if (!inInventory && mPosition != mRef.mPos) if (!inInventory && mPosition != mRef.mPos)
esm.writeHNT ("POS_", mPosition, 24); {
std::array<float, 6> pos;
memcpy(pos.data(), mPosition.pos, sizeof(float) * 3);
memcpy(pos.data() + 3, mPosition.rot, sizeof(float) * 3);
esm.writeHNT ("POS_", pos.data(), 24);
}
if (mFlags != 0) if (mFlags != 0)
esm.writeHNT ("FLAG", mFlags); esm.writeHNT ("FLAG", mFlags);