diff --git a/components/nif/niffile.cpp b/components/nif/niffile.cpp index 748c8bea42..dcce055984 100644 --- a/components/nif/niffile.cpp +++ b/components/nif/niffile.cpp @@ -249,7 +249,9 @@ namespace Nif // Bethesda { "BSDismemberSkinInstance", &construct }, { "BSTriShape", &construct }, + { "BSDynamicTriShape", &construct }, { "BSLODTriShape", &construct }, + { "BSMeshLODTriShape", &construct }, // PARTICLES diff --git a/components/nif/node.cpp b/components/nif/node.cpp index ac99a06a1b..9a40acc99a 100644 --- a/components/nif/node.cpp +++ b/components/nif/node.cpp @@ -414,6 +414,23 @@ namespace Nif mAlphaProperty.post(nif); } + void BSDynamicTriShape::read(NIFStream* nif) + { + BSTriShape::read(nif); + + nif->read(mDynamicDataSize); + // nifly style. + // Consider complaining if mDynamicDataSize * 16 != mVertData.size()? + nif->readVector(mDynamicData, mVertData.size()); + } + + void BSMeshLODTriShape::read(NIFStream* nif) + { + BSTriShape::read(nif); + + nif->readArray(mLOD); + } + void BSVertexDesc::read(NIFStream* nif) { uint64_t data; @@ -448,21 +465,9 @@ namespace Nif if (hasVertex) { if (fullPrecision) - { nif->read(mVertex); - if (hasTangent) - nif->read(mBitangentX); - else - nif->skip(4); // Unused - } else - { nif->readArray(mHalfVertex); - if (hasTangent) - nif->read(mHalfBitangentX); - else - nif->skip(2); // Unused - } } if (hasUV) @@ -471,12 +476,8 @@ namespace Nif if (hasNormal) { nif->readArray(mNormal); - nif->read(mBitangentY); if (hasTangent) - { nif->readArray(mTangent); - nif->read(mBitangentZ); - } } if (hasVertexColor) diff --git a/components/nif/node.hpp b/components/nif/node.hpp index 0d2edad9a6..d2857752c3 100644 --- a/components/nif/node.hpp +++ b/components/nif/node.hpp @@ -338,15 +338,11 @@ namespace Nif struct BSVertexData { - osg::Vec3f mVertex; - std::array mHalfVertex; - float mBitangentX; - Misc::float16_t mHalfBitangentX; + osg::Vec4f mVertex; // Bitangent X is stored in the fourth component + std::array mHalfVertex; // Ditto std::array mUV; - std::array mNormal; - char mBitangentY; - std::array mTangent; - char mBitangentZ; + std::array mNormal; // Bitangent Y is stored in the fourth component + std::array mTangent; // Bitangent Z is stored in the fourth component std::array mVertColor; std::array mBoneWeights; std::array mBoneIndices; @@ -372,6 +368,21 @@ namespace Nif void post(Reader& nif) override; }; + struct BSDynamicTriShape : BSTriShape + { + uint32_t mDynamicDataSize; + std::vector mDynamicData; + + void read(NIFStream* nif) override; + }; + + struct BSMeshLODTriShape : BSTriShape + { + std::array mLOD; + + void read(NIFStream* nif) override; + }; + struct BSValueNode : NiNode { enum Flags diff --git a/components/nif/property.cpp b/components/nif/property.cpp index fbdb273cfd..3fc726132a 100644 --- a/components/nif/property.cpp +++ b/components/nif/property.cpp @@ -349,7 +349,7 @@ namespace Nif break; case BSLightingShaderType::ShaderType_SkinTint: nif->read(mSkinTintColor); - if (nif->getBethVersion() > NIFFile::BethVersion::BETHVER_FO4) + if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_FO4) nif->read(mSkinTintAlpha); break; case BSLightingShaderType::ShaderType_HairTint: diff --git a/components/nif/record.hpp b/components/nif/record.hpp index ba13554571..0505f0a30f 100644 --- a/components/nif/record.hpp +++ b/components/nif/record.hpp @@ -60,6 +60,7 @@ namespace Nif RC_BSBoneLODExtraData, RC_BSClothExtraData, RC_BSDecalPlacementVectorExtraData, + RC_BSDynamicTriShape, RC_BSDismemberSkinInstance, RC_BSDistantObjectExtraData, RC_BSDistantObjectLargeRefExtraData, @@ -74,6 +75,7 @@ namespace Nif RC_BSLightingShaderPropertyFloatController, RC_BSLODTriShape, RC_BSMaterialEmittanceMultController, + RC_BSMeshLODTriShape, RC_BSMultiBound, RC_BSMultiBoundOBB, RC_BSMultiBoundSphere,