Core/Vmaps: Prepare vmaps for reading new WMO chunk - MOVX, replacement for MOVI using larger data type (currently unused in 9.0.5 client)

This commit is contained in:
Shauren
2021-04-24 23:31:41 +02:00
parent e821693c16
commit d0ca535ab8
5 changed files with 31 additions and 27 deletions

View File

@@ -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]));

View File

@@ -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);

View File

@@ -43,7 +43,7 @@ private:
public:
ModelHeader header;
Vec3D* vertices;
uint16* indices;
uint32* indices;
AaBox3D bounds;
bool open();

View File

@@ -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;

View File

@@ -125,8 +125,7 @@ public:
// MOGP
char* MOPY;
uint16* MOVI;
uint16* MoviEx;
std::unique_ptr<uint32[]> MOVX;
float* MOVT;
uint16* MOBA;
int* MobaEx;