1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-12-24 16:53:08 +00:00

Reserve capacity for controller NIF collections

This commit is contained in:
Alexei Kotov 2025-12-14 22:31:12 +03:00
parent 02d9c26289
commit 3927eaef66

View file

@ -211,10 +211,9 @@ namespace Nif
nif->read(mSpawnMultiplier);
nif->read(mSpawnSpeedChaos);
nif->read(mSpawnDirChaos);
mParticles.resize(nif->get<uint16_t>());
const uint16_t numParticles = nif->get<uint16_t>();
nif->read(mNumValid);
for (NiParticleInfo& particle : mParticles)
particle.read(nif);
nif->readVectorOfRecords(numParticles, mParticles);
nif->skip(4); // NiEmitterModifier link
}
mModifier.read(nif);
@ -347,9 +346,7 @@ namespace Nif
{
NiInterpController::read(nif);
mExtraTargets.resize(nif->get<uint16_t>());
for (NiAVObjectPtr& extraTarget : mExtraTargets)
extraTarget.read(nif);
nif->readVectorOfRecords<uint16_t>(mExtraTargets);
}
void NiMultiTargetTransformController::post(Reader& nif)
@ -413,12 +410,13 @@ namespace Nif
return;
}
mInterpolators.resize(nif->get<uint32_t>());
mWeights.resize(mInterpolators.size());
for (size_t i = 0; i < mInterpolators.size(); i++)
const uint32_t numInterpolators = nif->get<uint32_t>();
mInterpolators.reserve(numInterpolators);
mWeights.reserve(numInterpolators);
for (size_t i = 0; i < numInterpolators; ++i)
{
mInterpolators[i].read(nif);
nif->read(mWeights[i]);
mInterpolators.emplace_back().read(nif);
nif->read(mWeights.emplace_back());
}
}
@ -733,7 +731,7 @@ namespace Nif
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 112))
{
nif->read(mFlags);
mItems.resize(nif->get<uint8_t>());
const uint8_t numItems = nif->get<uint8_t>();
nif->read(mWeightThreshold);
if (!(mFlags & Flag_ManagerControlled))
{
@ -745,17 +743,14 @@ namespace Nif
nif->read(mHighWeightsSum);
nif->read(mNextHighWeightsSum);
nif->read(mHighEaseSpinner);
for (Item& item : mItems)
item.read(nif);
nif->readVectorOfRecords(numItems, mItems);
}
return;
}
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 110))
{
mItems.resize(nif->get<uint8_t>());
for (Item& item : mItems)
item.read(nif);
nif->readVectorOfRecords<uint8_t>(mItems);
if (nif->get<bool>())
mFlags |= Flag_ManagerControlled;
nif->read(mWeightThreshold);
@ -770,10 +765,9 @@ namespace Nif
return;
}
mItems.resize(nif->get<uint16_t>());
const uint16_t numItems = nif->get<uint16_t>();
nif->read(mArrayGrowBy);
for (Item& item : mItems)
item.read(nif);
nif->readVectorOfRecords(numItems, mItems);
if (nif->get<bool>())
mFlags |= Flag_ManagerControlled;
nif->read(mWeightThreshold);