From d0ca535ab8e4461ae0c82608c49af55e5d0298d5 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 24 Apr 2021 23:31:41 +0200 Subject: Core/Vmaps: Prepare vmaps for reading new WMO chunk - MOVX, replacement for MOVI using larger data type (currently unused in 9.0.5 client) --- src/tools/vmap4_assembler/TileAssembler.cpp | 4 +-- src/tools/vmap4_extractor/model.cpp | 10 +++++--- src/tools/vmap4_extractor/model.h | 2 +- src/tools/vmap4_extractor/wmo.cpp | 39 ++++++++++++++++------------- src/tools/vmap4_extractor/wmo.h | 3 +-- 5 files changed, 31 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/tools/vmap4_assembler/TileAssembler.cpp b/src/tools/vmap4_assembler/TileAssembler.cpp index ed9406eca96..0fadabd6f54 100644 --- a/src/tools/vmap4_assembler/TileAssembler.cpp +++ b/src/tools/vmap4_assembler/TileAssembler.cpp @@ -427,8 +427,8 @@ namespace VMAP READ_OR_RETURN(&nindexes, sizeof(uint32)); if (nindexes >0) { - uint16 *indexarray = new uint16[nindexes]; - READ_OR_RETURN_WITH_DELETE(indexarray, nindexes*sizeof(uint16)); + uint32 *indexarray = new uint32[nindexes]; + READ_OR_RETURN_WITH_DELETE(indexarray, nindexes*sizeof(uint32)); triangles.reserve(nindexes / 3); for (uint32 i=0; i tempindices = std::make_unique(header.nBoundingTriangles); + f.read(tempindices.get(), header.nBoundingTriangles * 2); + std::copy_n(tempindices.get(), header.nBoundingTriangles, indices); f.close(); } else @@ -117,12 +119,12 @@ bool Model::ConvertToVMAPModel(const char * outfilename) { if ((i % 3) - 1 == 0 && i + 1 < nIndexes) { - uint16 tmp = indices[i]; + uint32 tmp = indices[i]; indices[i] = indices[i + 1]; indices[i + 1] = tmp; } } - fwrite(indices, sizeof(unsigned short), nIndexes, output); + fwrite(indices, sizeof(uint32), nIndexes, output); } fwrite("VERT", 4, 1, output); diff --git a/src/tools/vmap4_extractor/model.h b/src/tools/vmap4_extractor/model.h index 5dc3b95ae69..8a494229919 100644 --- a/src/tools/vmap4_extractor/model.h +++ b/src/tools/vmap4_extractor/model.h @@ -43,7 +43,7 @@ private: public: ModelHeader header; Vec3D* vertices; - uint16* indices; + uint32* indices; AaBox3D bounds; bool open(); diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp index 9da996bc923..af5355b6db6 100644 --- a/src/tools/vmap4_extractor/wmo.cpp +++ b/src/tools/vmap4_extractor/wmo.cpp @@ -203,7 +203,7 @@ bool WMORoot::ConvertToVMAPRootWmo(FILE* pOutfile) } WMOGroup::WMOGroup(const std::string &filename) : - filename(filename), MOPY(nullptr), MOVI(nullptr), MoviEx(nullptr), MOVT(nullptr), MOBA(nullptr), MobaEx(nullptr), + filename(filename), MOPY(nullptr), MOVX(nullptr), MOVT(nullptr), MOBA(nullptr), MobaEx(nullptr), hlq(nullptr), LiquEx(nullptr), LiquBytes(nullptr), groupName(0), descGroupName(0), mogpFlags(0), moprIdx(0), moprNItems(0), nBatchA(0), nBatchB(0), nBatchC(0), fogIdx(0), groupLiquid(0), groupWMOID(0), mopy_size(0), moba_size(0), LiquEx_size(0), @@ -268,8 +268,15 @@ bool WMOGroup::open(WMORoot* rootWMO) } else if (!strcmp(fourcc,"MOVI")) { - MOVI = new uint16[size/2]; - f.read(MOVI, size); + MOVX = std::make_unique(size / 2); + std::unique_ptr MOVI = std::make_unique(size / 2); + f.read(MOVI.get(), size); + std::copy_n(MOVI.get(), size / 2, MOVX.get()); + } + else if (!strcmp(fourcc,"MOVX")) + { + MOVX = std::make_unique(size / 2); + f.read(MOVX.get(), size); } else if (!strcmp(fourcc,"MOVT")) { @@ -379,7 +386,7 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE* output, bool preciseVectorData) } if(nIdexes >0) { - if(fwrite(MOVI, sizeof(unsigned short), nIdexes, output) != nIdexes) + if (fwrite(MOVX.get(), sizeof(uint32), nIdexes, output) != nIdexes) { printf("Error while writing file indexarray"); exit(0); @@ -433,9 +440,9 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE* output, bool preciseVectorData) //-------INDX------------------------------------ //-------MOPY-------- - MoviEx = new uint16[nTriangles*3]; // "worst case" size... - int *IndexRenum = new int[nVertices]; - memset(IndexRenum, 0xFF, nVertices*sizeof(int)); + std::unique_ptr MovxEx = std::make_unique(nTriangles*3); // "worst case" size... + std::unique_ptr IndexRenum = std::make_unique(nVertices); + std::fill_n(IndexRenum.get(), nVertices, 0xFFFFFFFF); for (int i=0; i(sizeof(float))+4, nColVertices};// "VERT" + uint32 VERT[] = {0x54524556u, nColVertices*3*static_cast(sizeof(float))+4, nColVertices};// "VERT" int check = 3*nColVertices; fwrite(VERT,4,3,output); for (uint32 i=0; i MOVX; float* MOVT; uint16* MOBA; int* MobaEx; -- cgit v1.2.3