1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-28 15:39:48 +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
};
#pragma pack(push)
#pragma pack(1)
// Position and rotation
struct Position
{
@ -68,7 +65,6 @@ struct Position
return tuple(l) < tuple(r);
}
};
#pragma pack(pop)
bool inline operator== (const Position& left, const Position& right) noexcept
{

View file

@ -28,8 +28,15 @@ void ESM::ObjectState::load (ESMReader &esm)
mCount = 1;
esm.getHNOT (mCount, "COUN");
mPosition = mRef.mPos;
esm.getHNOT (mPosition, "POS_", 24);
if(esm.isNextSub("POS_"))
{
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"))
esm.skipHSub(); // local rotation, no longer used
@ -67,7 +74,12 @@ void ESM::ObjectState::save (ESMWriter &esm, bool inInventory) const
esm.writeHNT ("COUN", mCount);
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)
esm.writeHNT ("FLAG", mFlags);