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

Reserve capacity for node NIF collections

This commit is contained in:
Alexei Kotov 2025-12-14 22:17:29 +03:00
parent 7332b4e232
commit 02d9c26289
2 changed files with 43 additions and 47 deletions

View file

@ -63,6 +63,16 @@ namespace
namespace Nif
{
namespace
{
void readBSDistantObjectInstanceTransform(NIFStream& stream, osg::Matrixf& value)
{
std::array<float, 16> mat;
stream.readArray(mat);
value.set(mat.data());
}
}
void BoundingVolume::read(NIFStream* nif)
{
nif->read(mType);
@ -200,12 +210,13 @@ namespace Nif
{
if (nif->getVersion() < NIFStream::generateVersion(10, 0, 1, 0))
return;
std::uint32_t numNames = 0;
if (nif->getVersion() >= NIFStream::generateVersion(20, 2, 0, 5))
mNames.resize(nif->get<uint32_t>());
numNames = nif->get<uint32_t>();
else if (nif->getVersion() <= NIFStream::generateVersion(20, 1, 0, 3))
mNames.resize(nif->get<bool>());
nif->readVector(mNames, mNames.size());
nif->readVector(mExtra, mNames.size());
numNames = nif->get<bool>();
nif->readVector(mNames, numNames);
nif->readVector(mExtra, numNames);
if (nif->getVersion() >= NIFStream::generateVersion(20, 2, 0, 5))
nif->read(mActive);
if (nif->getVersion() >= NIFFile::NIFVersion::VER_BGS)
@ -371,9 +382,7 @@ namespace Nif
{
NiTriShape::read(nif);
mSegments.resize(nif->get<uint32_t>());
for (SegmentData& segment : mSegments)
segment.read(nif);
nif->readVectorOfRecords<uint32_t>(mSegments);
}
void BSLODTriShape::read(NIFStream* nif)
@ -540,17 +549,19 @@ namespace Nif
mAlphaProperty.read(nif);
mVertDesc.read(nif);
size_t numTriangleIndices;
if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_FO4)
mTriangles.resize(nif->get<uint32_t>() * 3);
numTriangleIndices = nif->get<uint32_t>() * 3;
else
mTriangles.resize(nif->get<uint16_t>() * 3);
mVertData.resize(nif->get<uint16_t>());
numTriangleIndices = nif->get<uint16_t>() * 3;
nif->read(mNumVertices);
mVertData.reserve(mNumVertices);
nif->read(mDataSize);
if (mDataSize > 0)
{
for (auto& vertex : mVertData)
vertex.read(nif, mVertDesc.mFlags);
nif->readVector(mTriangles, mTriangles.size());
for (uint16_t i = 0; i < mNumVertices; ++i)
mVertData.emplace_back().read(nif, mVertDesc.mFlags);
nif->readVector(mTriangles, numTriangleIndices);
}
if (nif->getBethVersion() == NIFFile::BethVersion::BETHVER_SSE)
@ -558,9 +569,9 @@ namespace Nif
nif->read(mParticleDataSize);
if (mParticleDataSize > 0)
{
nif->readVector(mParticleVerts, mVertData.size() * 3);
nif->readVector(mParticleNormals, mVertData.size() * 3);
nif->readVector(mParticleTriangles, mTriangles.size());
nif->readVector(mParticleVerts, mNumVertices * 3);
nif->readVector(mParticleNormals, mNumVertices * 3);
nif->readVector(mParticleTriangles, numTriangleIndices);
}
}
}
@ -582,8 +593,8 @@ namespace Nif
nif->read(mDynamicDataSize);
// nifly style.
// Consider complaining if mDynamicDataSize * 16 != mVertData.size()?
nif->readVector(mDynamicData, mVertData.size());
// Consider complaining if mDynamicDataSize * 16 != mNumVertices?
nif->readVector(mDynamicData, mNumVertices);
}
void BSMeshLODTriShape::read(NIFStream* nif)
@ -606,9 +617,7 @@ namespace Nif
nif->read(mStartIndex);
nif->read(mNumPrimitives);
nif->read(mParentArrayIndex);
mSubSegments.resize(nif->get<uint32_t>());
for (SubSegment& subsegment : mSubSegments)
subsegment.read(nif);
nif->readVectorOfRecords<uint32_t>(mSubSegments);
}
void BSSubIndexTriShape::SubSegmentDataRecord::read(NIFStream* nif)
@ -622,22 +631,19 @@ namespace Nif
{
uint32_t numArrayIndices;
nif->read(numArrayIndices);
mDataRecords.resize(nif->get<uint32_t>());
const uint32_t numRecords = nif->get<uint32_t>();
nif->readVector(mArrayIndices, numArrayIndices);
for (SubSegmentDataRecord& dataRecord : mDataRecords)
dataRecord.read(nif);
nif->readVectorOfRecords(numRecords, mDataRecords);
mSSFFile = nif->getSizedString(nif->get<uint16_t>());
}
void BSSubIndexTriShape::Segmentation::read(NIFStream* nif)
{
nif->read(mNumPrimitives);
mSegments.resize(nif->get<uint32_t>());
const uint32_t numSegments = nif->get<uint32_t>();
nif->read(mNumTotalSegments);
for (Segment& segment : mSegments)
segment.read(nif);
if (mSegments.size() < mNumTotalSegments)
nif->readVectorOfRecords(numSegments, mSegments);
if (numSegments < mNumTotalSegments)
mSubSegmentData.read(nif);
}
@ -646,11 +652,7 @@ namespace Nif
BSTriShape::read(nif);
if (nif->getBethVersion() == NIFFile::BethVersion::BETHVER_SSE)
{
mSegments.resize(nif->get<uint32_t>());
for (BSSegmentedTriShape::SegmentData& segment : mSegments)
segment.read(nif);
}
nif->readVectorOfRecords<uint32_t>(mSegments);
else if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_FO4 && mDataSize > 0)
mSegmentation.read(nif);
}
@ -752,30 +754,23 @@ namespace Nif
{
mResourceID.read(nif);
nif->skip(12 * nif->get<uint32_t>()); // Unknown data
mTransforms.resize(nif->get<uint32_t>());
for (osg::Matrixf& transform : mTransforms)
{
std::array<float, 16> mat;
nif->readArray(mat);
transform.set(mat.data());
}
nif->readVectorOfRecords<uint32_t>(readBSDistantObjectInstanceTransform, mTransforms);
}
void BSShaderTextureArray::read(NIFStream* nif)
{
nif->skip(1); // Unknown
mTextureArrays.resize(nif->get<uint32_t>());
for (std::vector<std::string>& textureArray : mTextureArrays)
nif->getSizedStrings(textureArray, nif->get<uint32_t>());
const uint32_t numArrays = nif->get<uint32_t>();
mTextureArrays.reserve(numArrays);
for (uint32_t i = 0; i < numArrays; ++i)
nif->getSizedStrings(mTextureArrays.emplace_back(), nif->get<uint32_t>());
}
void BSDistantObjectInstancedNode::read(NIFStream* nif)
{
BSMultiBoundNode::read(nif);
mInstances.resize(nif->get<uint32_t>());
for (BSDistantObjectInstance& instance : mInstances)
instance.read(nif);
nif->readVectorOfRecords<uint32_t>(mInstances);
for (BSShaderTextureArray& textureArray : mShaderTextureArrays)
textureArray.read(nif);
}

View file

@ -385,6 +385,7 @@ namespace Nif
NiAlphaPropertyPtr mAlphaProperty;
BSVertexDesc mVertDesc;
uint32_t mDataSize;
uint16_t mNumVertices;
std::vector<BSVertexData> mVertData;
std::vector<unsigned short> mTriangles;
uint32_t mParticleDataSize;