Merge branch 'anothersettlementneedsyourhelp' into 'master'

Read all official Fallout 4 NIF files

See merge request OpenMW/openmw!3506
macos_ci_fix
Evil Eye 1 year ago
commit 536a167bb4

@ -162,4 +162,50 @@ namespace Nif
nif->getSizedStrings(mPointNames, nif->get<uint32_t>()); nif->getSizedStrings(mPointNames, nif->get<uint32_t>());
} }
void BSPackedGeomDataCombined::read(NIFStream* nif)
{
nif->read(mGrayscaleToPaletteScale);
nif->read(mTransform);
nif->read(mBoundingSphere);
}
void BSPackedGeomObject::read(NIFStream* nif)
{
nif->read(mFileHash);
nif->read(mDataOffset);
}
void BSPackedSharedGeomData::read(NIFStream* nif)
{
nif->read(mNumVertices);
nif->read(mLODLevels);
nif->read(mLOD0TriCount);
nif->read(mLOD0TriOffset);
nif->read(mLOD1TriCount);
nif->read(mLOD1TriOffset);
nif->read(mLOD2TriCount);
nif->read(mLOD2TriOffset);
mCombined.resize(nif->get<uint32_t>());
for (BSPackedGeomDataCombined& data : mCombined)
data.read(nif);
mVertexDesc.read(nif);
}
void BSPackedCombinedSharedGeomDataExtra::read(NIFStream* nif)
{
NiExtraData::read(nif);
mVertexDesc.read(nif);
nif->read(mNumVertices);
nif->read(mNumTriangles);
nif->read(mFlags1);
nif->read(mFlags2);
mObjects.resize(nif->get<uint32_t>());
for (BSPackedGeomObject& object : mObjects)
object.read(nif);
mObjectData.resize(mObjects.size());
for (BSPackedSharedGeomData& objectData : mObjectData)
objectData.read(nif);
}
} }

@ -2,6 +2,7 @@
#define OPENMW_COMPONENTS_NIF_EXTRA_HPP #define OPENMW_COMPONENTS_NIF_EXTRA_HPP
#include "base.hpp" #include "base.hpp"
#include "node.hpp"
namespace Nif namespace Nif
{ {
@ -199,5 +200,51 @@ namespace Nif
}; };
}; };
struct BSPackedGeomDataCombined
{
float mGrayscaleToPaletteScale;
NiTransform mTransform;
osg::BoundingSpheref mBoundingSphere;
void read(NIFStream* nif);
};
struct BSPackedGeomObject
{
uint32_t mFileHash;
uint32_t mDataOffset;
void read(NIFStream* nif);
};
struct BSPackedSharedGeomData
{
uint32_t mNumVertices;
uint32_t mLODLevels;
uint32_t mLOD0TriCount;
uint32_t mLOD0TriOffset;
uint32_t mLOD1TriCount;
uint32_t mLOD1TriOffset;
uint32_t mLOD2TriCount;
uint32_t mLOD2TriOffset;
std::vector<BSPackedGeomDataCombined> mCombined;
BSVertexDesc mVertexDesc;
void read(NIFStream* nif);
};
struct BSPackedCombinedSharedGeomDataExtra : NiExtraData
{
BSVertexDesc mVertexDesc;
uint32_t mNumVertices;
uint32_t mNumTriangles;
uint32_t mFlags1;
uint32_t mFlags2;
std::vector<BSPackedGeomObject> mObjects;
std::vector<BSPackedSharedGeomData> mObjectData;
void read(NIFStream* nif) override;
};
} }
#endif #endif

@ -156,6 +156,8 @@ namespace Nif
&construct<BSEffectShaderPropertyColorController, RC_BSLightingShaderPropertyColorController> }, &construct<BSEffectShaderPropertyColorController, RC_BSLightingShaderPropertyColorController> },
{ "BSLightingShaderPropertyFloatController", { "BSLightingShaderPropertyFloatController",
&construct<BSEffectShaderPropertyFloatController, RC_BSLightingShaderPropertyFloatController> }, &construct<BSEffectShaderPropertyFloatController, RC_BSLightingShaderPropertyFloatController> },
{ "BSLightingShaderPropertyUShortController",
&construct<BSEffectShaderPropertyFloatController, RC_BSLightingShaderPropertyUShortController> },
{ "bhkBlendController", &construct<bhkBlendController, RC_bhkBlendController> }, { "bhkBlendController", &construct<bhkBlendController, RC_bhkBlendController> },
{ "NiBSBoneLODController", &construct<NiBoneLODController, RC_NiBoneLODController> }, { "NiBSBoneLODController", &construct<NiBoneLODController, RC_NiBoneLODController> },
{ "NiLightRadiusController", &construct<NiFloatInterpController, RC_NiLightRadiusController> }, { "NiLightRadiusController", &construct<NiFloatInterpController, RC_NiLightRadiusController> },
@ -254,6 +256,8 @@ namespace Nif
{ "BSDistantObjectLargeRefExtraData", { "BSDistantObjectLargeRefExtraData",
&construct<BSDistantObjectLargeRefExtraData, RC_BSDistantObjectLargeRefExtraData> }, &construct<BSDistantObjectLargeRefExtraData, RC_BSDistantObjectLargeRefExtraData> },
{ "BSEyeCenterExtraData", &construct<BSEyeCenterExtraData, RC_BSEyeCenterExtraData> }, { "BSEyeCenterExtraData", &construct<BSEyeCenterExtraData, RC_BSEyeCenterExtraData> },
{ "BSPackedCombinedSharedGeomDataExtra",
&construct<BSPackedCombinedSharedGeomDataExtra, RC_BSPackedCombinedSharedGeomDataExtra> },
{ "BSPositionData", &construct<BSPositionData, RC_BSPositionData> }, { "BSPositionData", &construct<BSPositionData, RC_BSPositionData> },
{ "BSWArray", &construct<BSWArray, RC_BSWArray> }, { "BSWArray", &construct<BSWArray, RC_BSWArray> },
{ "BSXFlags", &construct<NiIntegerExtraData, RC_BSXFlags> }, { "BSXFlags", &construct<NiIntegerExtraData, RC_BSXFlags> },
@ -280,6 +284,7 @@ namespace Nif
{ "BSLODTriShape", &construct<BSLODTriShape, RC_BSLODTriShape> }, { "BSLODTriShape", &construct<BSLODTriShape, RC_BSLODTriShape> },
{ "BSMeshLODTriShape", &construct<BSMeshLODTriShape, RC_BSMeshLODTriShape> }, { "BSMeshLODTriShape", &construct<BSMeshLODTriShape, RC_BSMeshLODTriShape> },
{ "BSSegmentedTriShape", &construct<BSSegmentedTriShape, RC_BSSegmentedTriShape> }, { "BSSegmentedTriShape", &construct<BSSegmentedTriShape, RC_BSSegmentedTriShape> },
{ "BSSubIndexTriShape", &construct<BSSubIndexTriShape, RC_BSSubIndexTriShape> },
// PARTICLES // PARTICLES

@ -218,17 +218,20 @@ namespace Nif
} }
} }
void BSSegmentedTriShape::SegmentData::read(NIFStream* nif)
{
nif->read(mFlags);
nif->read(mStartIndex);
nif->read(mNumTriangles);
}
void BSSegmentedTriShape::read(NIFStream* nif) void BSSegmentedTriShape::read(NIFStream* nif)
{ {
NiTriShape::read(nif); NiTriShape::read(nif);
mSegments.resize(nif->get<uint32_t>()); mSegments.resize(nif->get<uint32_t>());
for (SegmentData& segment : mSegments) for (SegmentData& segment : mSegments)
{ segment.read(nif);
nif->read(segment.mFlags);
nif->read(segment.mStartIndex);
nif->read(segment.mNumTriangles);
}
} }
void BSLODTriShape::read(NIFStream* nif) void BSLODTriShape::read(NIFStream* nif)
@ -447,6 +450,68 @@ namespace Nif
nif->readArray(mLOD); nif->readArray(mLOD);
} }
void BSSubIndexTriShape::SubSegment::read(NIFStream* nif)
{
nif->read(mStartIndex);
nif->read(mNumPrimitives);
nif->read(mArrayIndex);
nif->skip(4); // Unknown
}
void BSSubIndexTriShape::Segment::read(NIFStream* nif)
{
nif->read(mStartIndex);
nif->read(mNumPrimitives);
nif->read(mParentArrayIndex);
mSubSegments.resize(nif->get<uint32_t>());
for (SubSegment& subsegment : mSubSegments)
subsegment.read(nif);
}
void BSSubIndexTriShape::SubSegmentDataRecord::read(NIFStream* nif)
{
nif->read(mUserSlotID);
nif->read(mMaterial);
nif->readVector(mExtraData, nif->get<uint32_t>());
}
void BSSubIndexTriShape::SubSegmentData::read(NIFStream* nif)
{
uint32_t numArrayIndices;
nif->read(numArrayIndices);
mDataRecords.resize(nif->get<uint32_t>());
nif->readVector(mArrayIndices, numArrayIndices);
for (SubSegmentDataRecord& dataRecord : mDataRecords)
dataRecord.read(nif);
mSSFFile = nif->getSizedString(nif->get<uint16_t>());
}
void BSSubIndexTriShape::Segmentation::read(NIFStream* nif)
{
nif->read(mNumPrimitives);
mSegments.resize(nif->get<uint32_t>());
nif->read(mNumTotalSegments);
for (Segment& segment : mSegments)
segment.read(nif);
if (mSegments.size() < mNumTotalSegments)
mSubSegmentData.read(nif);
}
void BSSubIndexTriShape::read(NIFStream* 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);
}
else if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_FO4 && mDataSize > 0)
mSegmentation.read(nif);
}
void BSVertexDesc::read(NIFStream* nif) void BSVertexDesc::read(NIFStream* nif)
{ {
uint64_t data; uint64_t data;

@ -164,6 +164,8 @@ namespace Nif
uint8_t mFlags; uint8_t mFlags;
uint32_t mStartIndex; uint32_t mStartIndex;
uint32_t mNumTriangles; uint32_t mNumTriangles;
void read(NIFStream* nif);
}; };
std::vector<SegmentData> mSegments; std::vector<SegmentData> mSegments;
@ -396,6 +398,61 @@ namespace Nif
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
struct BSSubIndexTriShape : BSTriShape
{
struct SubSegment
{
uint32_t mStartIndex;
uint32_t mNumPrimitives;
uint32_t mArrayIndex;
void read(NIFStream* nif);
};
struct Segment
{
uint32_t mStartIndex;
uint32_t mNumPrimitives;
uint32_t mParentArrayIndex;
std::vector<SubSegment> mSubSegments;
void read(NIFStream* nif);
};
struct SubSegmentDataRecord
{
uint32_t mUserSlotID;
uint32_t mMaterial;
std::vector<float> mExtraData;
void read(NIFStream* nif);
};
struct SubSegmentData
{
std::vector<uint32_t> mArrayIndices;
std::vector<SubSegmentDataRecord> mDataRecords;
std::string mSSFFile;
void read(NIFStream* nif);
};
struct Segmentation
{
uint32_t mNumPrimitives;
uint32_t mNumTotalSegments;
std::vector<Segment> mSegments;
SubSegmentData mSubSegmentData;
void read(NIFStream* nif);
};
std::vector<BSSegmentedTriShape::SegmentData> mSegments; // SSE
Segmentation mSegmentation; // FO4
void read(NIFStream* nif) override;
};
struct BSValueNode : NiNode struct BSValueNode : NiNode
{ {
enum Flags enum Flags

@ -98,6 +98,7 @@ namespace Nif
RC_BSLightingShaderProperty, RC_BSLightingShaderProperty,
RC_BSLightingShaderPropertyColorController, RC_BSLightingShaderPropertyColorController,
RC_BSLightingShaderPropertyFloatController, RC_BSLightingShaderPropertyFloatController,
RC_BSLightingShaderPropertyUShortController,
RC_BSLODTriShape, RC_BSLODTriShape,
RC_BSMaterialEmittanceMultController, RC_BSMaterialEmittanceMultController,
RC_BSMeshLODTriShape, RC_BSMeshLODTriShape,
@ -107,6 +108,7 @@ namespace Nif
RC_BSMultiBoundSphere, RC_BSMultiBoundSphere,
RC_BSNiAlphaPropertyTestRefController, RC_BSNiAlphaPropertyTestRefController,
RC_BSPackedAdditionalGeometryData, RC_BSPackedAdditionalGeometryData,
RC_BSPackedCombinedSharedGeomDataExtra,
RC_BSParentVelocityModifier, RC_BSParentVelocityModifier,
RC_BSPositionData, RC_BSPositionData,
RC_BSProceduralLightningController, RC_BSProceduralLightningController,
@ -132,6 +134,7 @@ namespace Nif
RC_BSSkinBoneData, RC_BSSkinBoneData,
RC_BSSkinInstance, RC_BSSkinInstance,
RC_BSSkyShaderProperty, RC_BSSkyShaderProperty,
RC_BSSubIndexTriShape,
RC_BSTriShape, RC_BSTriShape,
RC_BSWArray, RC_BSWArray,
RC_BSWaterShaderProperty, RC_BSWaterShaderProperty,

@ -109,6 +109,7 @@ namespace
case Nif::RC_BSTriShape: case Nif::RC_BSTriShape:
case Nif::RC_BSDynamicTriShape: case Nif::RC_BSDynamicTriShape:
case Nif::RC_BSMeshLODTriShape: case Nif::RC_BSMeshLODTriShape:
case Nif::RC_BSSubIndexTriShape:
return true; return true;
} }
return false; return false;

Loading…
Cancel
Save