From d5f1fefe7f6772b11e9fbb052bfd36be9bda98e2 Mon Sep 17 00:00:00 2001 From: killerwife Date: Sat, 24 Apr 2021 14:58:16 +0200 Subject: Vmap: Introduce skipping of antiportals and unreachable mogp (#26331) * Vmap: Introduce skipping of antiportals and unreachable mogp * Reduce differences with master branch * Update VMAP and MMAP versions * Update MMAPs version Co-authored-by: jackpoz --- src/tools/vmap4_extractor/vmapexport.cpp | 7 +++++++ src/tools/vmap4_extractor/wmo.cpp | 24 +++++++++++++++++++++--- src/tools/vmap4_extractor/wmo.h | 2 ++ 3 files changed, 30 insertions(+), 3 deletions(-) (limited to 'src/tools') diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp index 8c0e59e8f9d..23223a9a212 100644 --- a/src/tools/vmap4_extractor/vmapexport.cpp +++ b/src/tools/vmap4_extractor/vmapexport.cpp @@ -144,6 +144,7 @@ bool ExtractSingleWmo(std::string& fname) WMODoodadData& doodads = WmoDoodads[plain_name]; std::swap(doodads, froot.DoodadData); int Wmo_nVertices = 0; + uint32 groupCount = 0; //printf("root has %d groups\n", froot->nGroups); if (froot.nGroups !=0) { @@ -161,7 +162,11 @@ bool ExtractSingleWmo(std::string& fname) break; } + if (fgroup.ShouldSkip(&froot)) + continue; + Wmo_nVertices += fgroup.ConvertToVMAPGroupWmo(output, preciseVectorData); + ++groupCount; for (uint16 groupReference : fgroup.DoodadReferences) { if (groupReference >= doodads.Spawns.size()) @@ -178,6 +183,8 @@ bool ExtractSingleWmo(std::string& fname) fseek(output, 8, SEEK_SET); // store the correct no of vertices fwrite(&Wmo_nVertices,sizeof(int),1,output); + // store the correct no of groups + fwrite(&groupCount, sizeof(uint32), 1, output); fclose(output); // Delete the extracted file in the case of an error diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp index 13900f9b80d..beb48e231a6 100644 --- a/src/tools/vmap4_extractor/wmo.cpp +++ b/src/tools/vmap4_extractor/wmo.cpp @@ -106,6 +106,11 @@ bool WMORoot::open() DoodadData.Spawns.resize(size / sizeof(WMO::MODD)); f.read(DoodadData.Spawns.data(), size); } + else if (!strcmp(fourcc, "MOGN")) + { + GroupNames.resize(size); + f.read(GroupNames.data(), size); + } /* else if (!strcmp(fourcc,"MOTX")) { @@ -113,9 +118,6 @@ bool WMORoot::open() else if (!strcmp(fourcc,"MOMT")) { } - else if (!strcmp(fourcc,"MOGN")) - { - } else if (!strcmp(fourcc,"MOGI")) { } @@ -498,6 +500,22 @@ uint32 WMOGroup::GetLiquidTypeId(uint32 liquidTypeId) return liquidTypeId; } +bool WMOGroup::ShouldSkip(WMORoot const* root) const +{ + // skip unreachable + if (mogpFlags & 0x80) + return true; + + // skip antiportals + if (mogpFlags & 0x4000000) + return true; + + if (groupName < int32(root->GroupNames.size()) && !strcmp(&root->GroupNames[groupName], "antiportal")) + return true; + + return false; +} + WMOGroup::~WMOGroup() { delete [] MOPY; diff --git a/src/tools/vmap4_extractor/wmo.h b/src/tools/vmap4_extractor/wmo.h index a00e26b91a1..f4d98cfebf6 100644 --- a/src/tools/vmap4_extractor/wmo.h +++ b/src/tools/vmap4_extractor/wmo.h @@ -84,6 +84,7 @@ public: float bbcorn1[3]; float bbcorn2[3]; + std::vector GroupNames; WMODoodadData DoodadData; std::unordered_set ValidDoodadNames; @@ -153,6 +154,7 @@ public: bool open(WMORoot* rootWMO); int ConvertToVMAPGroupWmo(FILE* output, bool preciseVectorData); uint32 GetLiquidTypeId(uint32 liquidTypeId); + bool ShouldSkip(WMORoot const* root) const; }; namespace MapObject -- cgit v1.2.3