From 66a1adc31eea6f2dd04cda74c92b86bf329e9f72 Mon Sep 17 00:00:00 2001 From: Alexei Dobrohotov Date: Tue, 27 Jul 2021 07:58:57 +0300 Subject: [PATCH] Handle NiExtraData *properly* --- components/nif/base.hpp | 3 ++- components/nif/extra.cpp | 7 +++++++ components/nif/extra.hpp | 7 +++++++ components/nif/niffile.cpp | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/components/nif/base.hpp b/components/nif/base.hpp index 022e5224a0..0728a46512 100644 --- a/components/nif/base.hpp +++ b/components/nif/base.hpp @@ -15,6 +15,7 @@ struct Extra : public Record { std::string name; ExtraPtr next; // Next extra data record in the list + unsigned int recordSize{0u}; void read(NIFStream *nif) override { @@ -23,7 +24,7 @@ struct Extra : public Record else if (nif->getVersion() <= NIFStream::generateVersion(4,2,2,0)) { next.read(nif); - nif->getUInt(); // Size of the record + recordSize = nif->getUInt(); } } diff --git a/components/nif/extra.cpp b/components/nif/extra.cpp index eeaf9d3ac4..a45ea8c50b 100644 --- a/components/nif/extra.cpp +++ b/components/nif/extra.cpp @@ -3,6 +3,13 @@ namespace Nif { +void NiExtraData::read(NIFStream *nif) +{ + Extra::read(nif); + if (recordSize) + nif->getChars(data, recordSize); +} + void NiStringExtraData::read(NIFStream *nif) { Extra::read(nif); diff --git a/components/nif/extra.hpp b/components/nif/extra.hpp index 6d345a18ea..f4ac1caff9 100644 --- a/components/nif/extra.hpp +++ b/components/nif/extra.hpp @@ -29,6 +29,13 @@ namespace Nif { +struct NiExtraData : public Extra +{ + std::vector data; + + void read(NIFStream *nif) override; +}; + struct NiVertWeightsExtraData : public Extra { void read(NIFStream *nif) override; diff --git a/components/nif/niffile.cpp b/components/nif/niffile.cpp index 6f7ed093c0..6863209988 100644 --- a/components/nif/niffile.cpp +++ b/components/nif/niffile.cpp @@ -79,7 +79,7 @@ static std::map makeFactory() factory["NiPointLight"] = {&construct , RC_NiLight }; factory["NiSpotLight"] = {&construct , RC_NiLight }; factory["NiTextureEffect"] = {&construct , RC_NiTextureEffect }; - factory["NiExtraData"] = {&construct , RC_NiExtraData }; + factory["NiExtraData"] = {&construct , RC_NiExtraData }; factory["NiVertWeightsExtraData"] = {&construct , RC_NiVertWeightsExtraData }; factory["NiTextKeyExtraData"] = {&construct , RC_NiTextKeyExtraData }; factory["NiStringExtraData"] = {&construct , RC_NiStringExtraData };