aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-04-24 23:31:41 +0200
committerShauren <shauren.trinity@gmail.com>2021-04-25 00:11:42 +0200
commitd0ca535ab8e4461ae0c82608c49af55e5d0298d5 (patch)
tree03c4e0c6e54a39b58f7daa025410858c7a825f54
parente821693c163607fe84bf2ad6cc97bfbfd15c5975 (diff)
Core/Vmaps: Prepare vmaps for reading new WMO chunk - MOVX, replacement for MOVI using larger data type (currently unused in 9.0.5 client)
-rw-r--r--src/tools/vmap4_assembler/TileAssembler.cpp4
-rw-r--r--src/tools/vmap4_extractor/model.cpp10
-rw-r--r--src/tools/vmap4_extractor/model.h2
-rw-r--r--src/tools/vmap4_extractor/wmo.cpp39
-rw-r--r--src/tools/vmap4_extractor/wmo.h3
5 files changed, 31 insertions, 27 deletions
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<nindexes; i+=3)
triangles.push_back(MeshTriangle(indexarray[i], indexarray[i+1], indexarray[i+2]));
diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp
index 0ab2a8ad4b3..887e4425cf9 100644
--- a/src/tools/vmap4_extractor/model.cpp
+++ b/src/tools/vmap4_extractor/model.cpp
@@ -69,8 +69,10 @@ bool Model::open()
vertices[i] = fixCoordSystem(vertices[i]);
f.seek(m2start);
f.seekRelative(header.ofsBoundingTriangles);
- indices = new uint16[header.nBoundingTriangles];
- f.read(indices,header.nBoundingTriangles*2);
+ indices = new uint32[header.nBoundingTriangles];
+ std::unique_ptr<uint16[]> tempindices = std::make_unique<uint16[]>(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<uint32[]>(size / 2);
+ std::unique_ptr<uint16[]> MOVI = std::make_unique<uint16[]>(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<uint32[]>(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<uint32[]> MovxEx = std::make_unique<uint32[]>(nTriangles*3); // "worst case" size...
+ std::unique_ptr<uint32[]> IndexRenum = std::make_unique<uint32[]>(nVertices);
+ std::fill_n(IndexRenum.get(), nVertices, 0xFFFFFFFF);
for (int i=0; i<nTriangles; ++i)
{
// Skip no collision triangles
@@ -448,14 +455,14 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE* output, bool preciseVectorData)
// Use this triangle
for (int j=0; j<3; ++j)
{
- IndexRenum[MOVI[3*i + j]] = 1;
- MoviEx[3*nColTriangles + j] = MOVI[3*i + j];
+ IndexRenum[MOVX[3*i + j]] = 1;
+ MovxEx[3*nColTriangles + j] = MOVX[3*i + j];
}
++nColTriangles;
}
// assign new vertex index numbers
- int nColVertices = 0;
+ uint32 nColVertices = 0;
for (uint32 i=0; i<nVertices; ++i)
{
if (IndexRenum[i] == 1)
@@ -468,17 +475,17 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE* output, bool preciseVectorData)
// translate triangle indices to new numbers
for (int i=0; i<3*nColTriangles; ++i)
{
- ASSERT(MoviEx[i] < nVertices);
- MoviEx[i] = IndexRenum[MoviEx[i]];
+ ASSERT(MovxEx[i] < nVertices);
+ MovxEx[i] = IndexRenum[MovxEx[i]];
}
// write triangle indices
int INDX[] = {0x58444E49, nColTriangles*6+4, nColTriangles*3};
fwrite(INDX,4,3,output);
- fwrite(MoviEx,2,nColTriangles*3,output);
+ fwrite(MovxEx.get(),4,nColTriangles*3,output);
// write vertices
- int VERT[] = {0x54524556, nColVertices*3*static_cast<int>(sizeof(float))+4, nColVertices};// "VERT"
+ uint32 VERT[] = {0x54524556u, nColVertices*3*static_cast<uint32>(sizeof(float))+4, nColVertices};// "VERT"
int check = 3*nColVertices;
fwrite(VERT,4,3,output);
for (uint32 i=0; i<nVertices; ++i)
@@ -486,9 +493,6 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE* output, bool preciseVectorData)
check -= fwrite(MOVT+3*i, sizeof(float), 3, output);
ASSERT(check==0);
-
- delete [] MoviEx;
- delete [] IndexRenum;
}
//------LIQU------------------------
@@ -555,7 +559,6 @@ bool WMOGroup::ShouldSkip(WMORoot const* root) const
WMOGroup::~WMOGroup()
{
delete [] MOPY;
- delete [] MOVI;
delete [] MOVT;
delete [] MOBA;
delete hlq;
diff --git a/src/tools/vmap4_extractor/wmo.h b/src/tools/vmap4_extractor/wmo.h
index a2dc39a2e81..f5f364d2302 100644
--- a/src/tools/vmap4_extractor/wmo.h
+++ b/src/tools/vmap4_extractor/wmo.h
@@ -125,8 +125,7 @@ public:
// MOGP
char* MOPY;
- uint16* MOVI;
- uint16* MoviEx;
+ std::unique_ptr<uint32[]> MOVX;
float* MOVT;
uint16* MOBA;
int* MobaEx;