aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-23 16:28:11 +0100
committerShauren <shauren.trinity@gmail.com>2024-03-23 16:28:11 +0100
commit8d45d1dd4824fb001b46aeb8ed79bc20b86f2265 (patch)
tree0eb78e40d2e9e460ede11587c7e56971aef9aac4
parent70290f320b5e03beec4c9de15f309e5a566fee5f (diff)
Tools/vmap_extractor: Support new 9.2 wmo group splits (child groups should inherit their parent wmo group id)
-rw-r--r--src/tools/vmap4_extractor/vmapexport.cpp12
-rw-r--r--src/tools/vmap4_extractor/wmo.cpp5
-rw-r--r--src/tools/vmap4_extractor/wmo.h5
3 files changed, 20 insertions, 2 deletions
diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp
index d8444bc6b84..00edf74987b 100644
--- a/src/tools/vmap4_extractor/vmapexport.cpp
+++ b/src/tools/vmap4_extractor/vmapexport.cpp
@@ -227,20 +227,30 @@ bool ExtractSingleWmo(std::string& fname)
int Wmo_nVertices = 0;
uint32 groupCount = 0;
//printf("root has %d groups\n", froot->nGroups);
+ std::vector<WMOGroup> groups;
+ groups.reserve(froot.groupFileDataIDs.size());
for (std::size_t i = 0; i < froot.groupFileDataIDs.size(); ++i)
{
std::string s = Trinity::StringFormat("FILE{:08X}.xxx", froot.groupFileDataIDs[i]);
- WMOGroup fgroup(s);
+ WMOGroup& fgroup = groups.emplace_back(s);
if (!fgroup.open(&froot))
{
printf("Could not open all Group file for: %s\n", plain_name);
file_ok = false;
break;
}
+ }
+ for (WMOGroup& fgroup : groups)
+ {
if (fgroup.ShouldSkip(&froot))
continue;
+ if (fgroup.mogpFlags2 & 0x80
+ && fgroup.parentOrFirstChildSplitGroupIndex >= 0
+ && fgroup.parentOrFirstChildSplitGroupIndex < groups.size())
+ fgroup.groupWMOID = groups[fgroup.parentOrFirstChildSplitGroupIndex].groupWMOID;
+
Wmo_nVertices += fgroup.ConvertToVMAPGroupWmo(output, preciseVectorData);
++groupCount;
for (uint16 groupReference : fgroup.DoodadReferences)
diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp
index 4301e758cb5..d883ab3597e 100644
--- a/src/tools/vmap4_extractor/wmo.cpp
+++ b/src/tools/vmap4_extractor/wmo.cpp
@@ -249,7 +249,10 @@ bool WMOGroup::open(WMORoot* rootWMO)
f.read(&nBatchC, 4);
f.read(&fogIdx, 4);
f.read(&groupLiquid, 4);
- f.read(&groupWMOID,4);
+ f.read(&groupWMOID, 4);
+ f.read(&mogpFlags2, 4);
+ f.read(&parentOrFirstChildSplitGroupIndex, 2);
+ f.read(&nextSplitChildGroupIndex, 2);
// according to WoW.Dev Wiki:
if (rootWMO->flags & 4)
diff --git a/src/tools/vmap4_extractor/wmo.h b/src/tools/vmap4_extractor/wmo.h
index 4e149c02422..4215b228b4e 100644
--- a/src/tools/vmap4_extractor/wmo.h
+++ b/src/tools/vmap4_extractor/wmo.h
@@ -141,6 +141,9 @@ public:
uint16 nBatchA;
uint16 nBatchB;
uint32 nBatchC, fogIdx, groupLiquid, groupWMOID;
+ uint32 mogpFlags2;
+ int16 parentOrFirstChildSplitGroupIndex;
+ int16 nextSplitChildGroupIndex;
int moba_size;
int LiquEx_size;
@@ -151,6 +154,8 @@ public:
std::vector<uint16> DoodadReferences;
WMOGroup(std::string const& filename);
+ WMOGroup(WMOGroup&&) = default;
+ WMOGroup& operator=(WMOGroup&&) = default;
~WMOGroup();
bool open(WMORoot* rootWMO);