diff --git a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperXModel.cpp b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperXModel.cpp index 2b058174..34433ea9 100644 --- a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperXModel.cpp +++ b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperXModel.cpp @@ -11,6 +11,24 @@ using namespace IW5; +namespace IW5 +{ + class SurfsDumpingZoneState final : public IZoneAssetDumperState + { + std::set m_dumped_surfs; + + public: + bool ShouldDumpTechnique(const XModelSurfs* surfs) + { + if (m_dumped_surfs.find(surfs) != m_dumped_surfs.end()) + return false; + + m_dumped_surfs.emplace(surfs); + return true; + } + }; +} + bool AssetDumperXModel::ShouldDump(XAssetInfo* asset) { return !asset->m_name.empty() && asset->m_name[0] != ','; @@ -234,10 +252,14 @@ void AssetDumperXModel::DumpObjLod(const AssetDumpingContext& context, XAssetInf void AssetDumperXModel::DumpObj(AssetDumpingContext& context, XAssetInfo* asset) { const auto* model = asset->Asset(); + auto* surfZoneState = context.GetZoneAssetDumperState(); DumpObjMat(context, asset); for (auto currentLod = 0u; currentLod < model->numLods; currentLod++) { + if (!model->lodInfo[currentLod].modelSurfs || !surfZoneState->ShouldDumpTechnique(model->lodInfo[currentLod].modelSurfs)) + continue; + DumpObjLod(context, asset, currentLod); } } @@ -592,11 +614,14 @@ void AssetDumperXModel::DumpXModelExportLod(const AssetDumpingContext& context, writer->Write(*assetFile); } -void AssetDumperXModel::DumpXModelExport(const AssetDumpingContext& context, XAssetInfo* asset) +void AssetDumperXModel::DumpXModelExport(AssetDumpingContext& context, XAssetInfo* asset) { + auto* surfZoneState = context.GetZoneAssetDumperState(); const auto* model = asset->Asset(); for (auto currentLod = 0u; currentLod < model->numLods; currentLod++) { + if (!model->lodInfo[currentLod].modelSurfs || !surfZoneState->ShouldDumpTechnique(model->lodInfo[currentLod].modelSurfs)) + continue; DumpXModelExportLod(context, asset, currentLod); } } diff --git a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperXModel.h b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperXModel.h index 8874d8b9..823c7387 100644 --- a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperXModel.h +++ b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperXModel.h @@ -30,7 +30,7 @@ namespace IW5 static void AddXModelVertexBoneWeights(AbstractXModelWriter& writer, const XModelSurfs* modelSurfs, XModelVertexBoneWeightCollection& weightCollection); static void AddXModelFaces(AbstractXModelWriter& writer, const DistinctMapper& materialMapper, const XModelSurfs* modelSurfs, int baseSurfaceIndex); static void DumpXModelExportLod(const AssetDumpingContext& context, XAssetInfo* asset, unsigned lod); - static void DumpXModelExport(const AssetDumpingContext& context, XAssetInfo* asset); + static void DumpXModelExport(AssetDumpingContext& context, XAssetInfo* asset); protected: bool ShouldDump(XAssetInfo* asset) override;