aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/extractor/System.cpp118
-rw-r--r--contrib/extractor/ad.exebin167936 -> 160768 bytes
-rw-r--r--contrib/extractor/adt.cpp532
-rw-r--r--contrib/extractor/adt.h141
-rw-r--r--contrib/vmap_extract_assembler_bin/vmap_assembler.exebin184320 -> 293888 bytes
-rw-r--r--contrib/vmap_extract_assembler_bin/vmapextract_v2.exebin233472 -> 217088 bytes
-rw-r--r--contrib/vmap_extractor_v2/vmapextract/model.cpp145
-rw-r--r--contrib/vmap_extractor_v2/vmapextract/model.h27
-rw-r--r--contrib/vmap_extractor_v2/vmapextract/modelheaders.h316
-rw-r--r--contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp6
10 files changed, 527 insertions, 758 deletions
diff --git a/contrib/extractor/System.cpp b/contrib/extractor/System.cpp
index 197c4d35416..1753f40801a 100644
--- a/contrib/extractor/System.cpp
+++ b/contrib/extractor/System.cpp
@@ -16,21 +16,24 @@
extern unsigned int iRes;
extern ArchiveSet gOpenArchives;
-bool ConvertADT(char*,char*);
+bool ConvertADT(char*, char*);
-typedef struct{
+typedef struct
+{
char name[64];
- unsigned int id;
-}map_id;
+ uint32 id;
+} map_id;
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
-map_id * map_ids;
-uint16 * areas;
-char output_path[128]=".";
-char input_path[128]=".";
+map_id *map_ids;
+uint16 *areas;
+uint16 *LiqType;
+char output_path[128] = ".";
+char input_path[128] = ".";
+uint32 maxAreaId = 0;
enum Extract
{
@@ -66,46 +69,45 @@ bool FileExists( const char* FileName )
void Usage(char* prg)
{
- printf("Usage:\n%s -[var] [value]\n-i set input path\n-o set output path\n-r set resolution\n-e extract only MAP(1)/DBC(2) - standard: both(3)\nExample: %s -r 256 -i \"c:\\games\\game\"",
- prg,prg);
+ printf("Usage:\n%s -[var] [value]\n-i set input path\n-o set output path\n-r set resolution\n-e extract only MAP(1)/DBC(2) - standard: both(3)\nExample: %s -r 256 -i \"c:\\games\\game\"", prg, prg);
exit(1);
}
void HandleArgs(int argc, char * arg[])
{
- for(int c=1;c<argc;c++)
+ for(int c = 1; c < argc; ++c)
{
- //i - input path
- //o - output path
- //r - resolution, array of (r * r) heights will be created
- //e - extract only MAP(1)/DBC(2) - standard both(3)
+ // i - input path
+ // o - output path
+ // r - resolution, array of (r * r) heights will be created
+ // e - extract only MAP(1)/DBC(2) - standard both(3)
if(arg[c][0] != '-')
Usage(arg[0]);
switch(arg[c][1])
{
case 'i':
- if(c+1<argc)//all ok
- strcpy(input_path,arg[(c++) +1]);
+ if(c + 1 < argc) // all ok
+ strcpy(input_path, arg[(c++) + 1]);
else
Usage(arg[0]);
break;
case 'o':
- if(c+1<argc)//all ok
- strcpy(output_path,arg[(c++) +1]);
+ if(c + 1 < argc) // all ok
+ strcpy(output_path, arg[(c++) + 1]);
else
Usage(arg[0]);
break;
case 'r':
- if(c+1<argc)//all ok
- iRes=atoi(arg[(c++) +1]);
+ if(c + 1 < argc) // all ok
+ iRes=atoi(arg[(c++) + 1]);
else
Usage(arg[0]);
break;
case 'e':
- if(c+1<argc)//all ok
+ if(c + 1 < argc) // all ok
{
- extract=atoi(arg[(c++) +1]);
+ extract=atoi(arg[(c++) + 1]);
if(!(extract > 0 && extract < 4))
Usage(arg[0]);
}
@@ -122,12 +124,12 @@ uint32 ReadMapDBC()
DBCFile dbc("DBFilesClient\\Map.dbc");
dbc.open();
- uint32 map_count=dbc.getRecordCount();
- map_ids=new map_id[map_count];
- for(unsigned int x=0;x<map_count;x++)
+ size_t map_count = dbc.getRecordCount();
+ map_ids = new map_id[map_count];
+ for(uint32 x = 0; x < map_count; ++x)
{
- map_ids[x].id=dbc.getRecord(x).getUInt(0);
- strcpy(map_ids[x].name,dbc.getRecord(x).getString(1));
+ map_ids[x].id = dbc.getRecord(x).getUInt(0);
+ strcpy(map_ids[x].name, dbc.getRecord(x).getString(1));
}
printf("Done! (%u maps loaded)\n", map_count);
return map_count;
@@ -135,20 +137,39 @@ uint32 ReadMapDBC()
void ReadAreaTableDBC()
{
- printf("Read AreaTable.dbc file... ");
+ printf("Read AreaTable.dbc file...");
DBCFile dbc("DBFilesClient\\AreaTable.dbc");
dbc.open();
- unsigned int area_count=dbc.getRecordCount();
- uint32 maxid = dbc.getMaxId();
- areas=new uint16[maxid + 1];
- memset(areas, 0xff, sizeof(areas));
- for(unsigned int x=0; x<area_count;++x)
+ size_t area_count = dbc.getRecordCount();
+ size_t maxid = dbc.getMaxId();
+ areas = new uint16[maxid + 1];
+ memset(areas, 0xff, (maxid + 1) * sizeof(uint16));
+
+ for(uint32 x = 0; x < area_count; ++x)
areas[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
+ maxAreaId = dbc.getMaxId();
+
printf("Done! (%u areas loaded)\n", area_count);
}
+void ReadLiquidTypeTableDBC()
+{
+ printf("Read LiquidType.dbc file...");
+ DBCFile dbc("DBFilesClient\\LiquidType.dbc");
+ dbc.open();
+ size_t LiqType_count = dbc.getRecordCount();
+ size_t LiqType_maxid = dbc.getMaxId();
+ LiqType = new uint16[LiqType_maxid + 1];
+ memset(LiqType, 0xff, (LiqType_maxid + 1) * sizeof(uint16));
+
+ for(uint32 x = 0; x < LiqType_count; ++x)
+ LiqType[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
+
+ printf("Done! (%u LiqTypes loaded)\n", LiqType_count);
+}
+
void ExtractMapsFromMpq()
{
char mpq_filename[1024];
@@ -159,27 +180,28 @@ void ExtractMapsFromMpq()
uint32 map_count = ReadMapDBC();
ReadAreaTableDBC();
+ ReadLiquidTypeTableDBC();
- unsigned int total=map_count*ADT_RES*ADT_RES;
- unsigned int done=0;
+ unsigned int total = map_count * ADT_RES * ADT_RES;
+ unsigned int done = 0;
std::string path = output_path;
path += "/maps/";
CreateDir(path);
- for(unsigned int x = 0; x < ADT_RES; ++x)
+ for(uint32 x = 0; x < ADT_RES; ++x)
{
- for(unsigned int y = 0; y < ADT_RES; ++y)
+ for(uint32 y = 0; y < ADT_RES; ++y)
{
- for(unsigned int z = 0; z < map_count; ++z)
+ for(uint32 z = 0; z < map_count; ++z)
{
- sprintf(mpq_filename,"World\\Maps\\%s\\%s_%u_%u.adt",map_ids[z].name,map_ids[z].name,x,y);
- sprintf(output_filename,"%s/maps/%03u%02u%02u.map",output_path,map_ids[z].id,y,x);
- ConvertADT(mpq_filename,output_filename);
+ sprintf(mpq_filename, "World\\Maps\\%s\\%s_%u_%u.adt", map_ids[z].name, map_ids[z].name, x, y);
+ sprintf(output_filename, "%s/maps/%03u%02u%02u.map", output_path, map_ids[z].id, y, x);
+ ConvertADT(mpq_filename, output_filename);
done++;
}
- //draw progess bar
- printf("Processing........................%d%%\r",(100*done)/total);
+ // draw progress bar
+ printf("Processing........................%d%%\r", (100 * done) / total);
}
}
@@ -222,7 +244,7 @@ void ExtractDBCFiles(int locale, bool basicLocale)
string filename = path;
filename += (iter->c_str() + strlen("DBFilesClient\\"));
- FILE *output=fopen(filename.c_str(), "wb");
+ FILE *output = fopen(filename.c_str(), "wb");
if(!output)
{
printf("Can't create the output file '%s'\n", filename.c_str());
@@ -261,7 +283,9 @@ void LoadCommonMPQFiles()
{
char filename[512];
- sprintf(filename,"%s/Data/common.MPQ", input_path);
+ sprintf(filename,"%s/Data/common-2.MPQ", input_path);
+ new MPQArchive(filename);
+ sprintf(filename,"%s/Data/lichking.MPQ", input_path);
new MPQArchive(filename);
sprintf(filename,"%s/Data/expansion.MPQ", input_path);
new MPQArchive(filename);
@@ -271,7 +295,7 @@ void LoadCommonMPQFiles()
if(i > 1)
sprintf(ext, "-%i", i);
- sprintf(filename,"%s/Data/patch%s.MPQ", input_path, ext);
+ sprintf(filename, "%s/Data/patch%s.MPQ", input_path, ext);
if(FileExists(filename))
new MPQArchive(filename);
}
diff --git a/contrib/extractor/ad.exe b/contrib/extractor/ad.exe
index 2dc24c0872e..f483f3892f9 100644
--- a/contrib/extractor/ad.exe
+++ b/contrib/extractor/ad.exe
Binary files differ
diff --git a/contrib/extractor/adt.cpp b/contrib/extractor/adt.cpp
index 26adaa28537..71cbf88a37b 100644
--- a/contrib/extractor/adt.cpp
+++ b/contrib/extractor/adt.cpp
@@ -15,16 +15,15 @@
#include "adt.h"
#include "mpq_libmpq.h"
-//#include <windows.h>
-unsigned int iRes=256;
-extern uint16*areas;
+uint32 iRes = 256;
+extern uint16 *areas;
+extern uint16 *LiqType;
+extern uint32 maxAreaId;
vec wmoc;
-Cell * cell;
-uint32 wmo_count;
+Cell *cell;
mcell *mcells;
-
int holetab_h[4] = {0x1111, 0x2222, 0x4444, 0x8888};
int holetab_v[4] = {0x000F, 0x00F0, 0x0F00, 0xF000};
@@ -35,56 +34,84 @@ bool LoadADT(char* filename)
if(mf.isEof())
{
- //printf("No such file.\n");
+ //printf("No such file %s\n", filename);
return false;
}
- mcells=new mcell;
- wmoc.x =65*TILESIZE;
- wmoc.z =65*TILESIZE;
+ MapLiqFlag = new uint8[256];
+ for(uint32 j = 0; j < 256; ++j)
+ MapLiqFlag[j] = 0; // no water
+
+ MapLiqHeight = new float[16384];
+ for(uint32 j = 0; j < 16384; ++j)
+ MapLiqHeight[j] = -999999; // no water
+
+ mcells = new mcell;
+
+ wmoc.x = 65 * TILESIZE;
+ wmoc.z = 65 * TILESIZE;
size_t mcnk_offsets[256], mcnk_sizes[256];
- wmo_count=0;
- bool found=false;
- //uint32 fs=mf.getSize()-3;
- //while (mf.getPos()<fs)
+ chunk_num = 0;
+ k = 0;
+ m = 0;
while (!mf.isEof())
{
uint32 fourcc;
- mf.read(&fourcc,4);
+ mf.read(&fourcc, 4);
mf.read(&size, 4);
size_t nextpos = mf.getPos() + size;
- switch(fourcc)
+
+ //if(fourcc==0x4d484452) // MHDR header
+ //if(fourcc==0x4d564552) // MVER
+ if(fourcc == 0x4d43494e) // MCIN
{
- case 0x4d43494e: // MCIN
+ for (uint32 i = 0; i < 256; ++i)
{
- //printf("Found chunks info\n");
- // mapchunk offsets/sizes
- for (int i=0; i<256; i++)
- {
- mf.read(&mcnk_offsets[i],4);
- mf.read(&mcnk_sizes[i],4);
- mf.seekRelative(8);
- }
- break;
+ mf.read(&mcnk_offsets[i], 4);
+ mf.read(&mcnk_sizes[i], 4);
+ mf.seekRelative(8);
}
- case 0x4d4f4446: // MODF
+ }
+ //if(fourcc == 0x4d544558) // MTEX textures (strings)
+ //if(fourcc == 0x4d4d4458) // MMDX m2 models (strings)
+ //if(fourcc == 0x4d4d4944) // MMID offsets for strings in MMDX
+ //if(fourcc == 0x4d574d4f) // MWMO
+ //if(fourcc == 0x4d574944) // MWID offsets for strings in MWMO
+ //if(fourcc == 0x4d444446) // MDDF
+ //if(fourcc == 0x4d4f4446) // MODF
+ if(fourcc == 0x4d48324f) // MH2O new in WotLK
+ {
+ // здесь надо запомнить базовую позицию в файле тк все смещения будут от него
+ uint32 base_pos = mf.getPos();
+ uint32 header_pos = 0;
+ MH2O_offsData *LiqOffsData = new MH2O_offsData;
+ MH2O_Data1 *LiqChunkData1 = new MH2O_Data1;
+ float *ChunkLiqHeight = new float[81];
+ for(chunk_num = 0; chunk_num < 256; ++chunk_num)
{
- /*
- if(size)
+ mf.read(LiqOffsData, 0x0C);
+ header_pos = mf.getPos();
+ if(LiqOffsData->offsData1 != 0) // если данные в Data1 о воде есть, то их надо конвертировать
{
- //printf("\nwmo count %d\n",size/64);
- wmo_count =size/64;
- for (int i=0; i<wmo_count; i++)
+ // переходим по смещению из offsData1 ОТ НАЧАЛА куска
+ mf.seek(base_pos + LiqOffsData->offsData1);
+ mf.read(LiqChunkData1, 0x18); // считываем сами данные в структуру типа MH2O_Data1
+ // заносим данные флага для куска
+ if(LiqType[LiqChunkData1->LiquidTypeId] == 0xffff)
+ printf("\nCan't find Liquid type for map %s\nchunk %d\n", filename, chunk_num);
+ else if(LiqType[LiqChunkData1->LiquidTypeId] == LIQUID_TYPE_WATER || LiqType[LiqChunkData1->LiquidTypeId] == LIQUID_TYPE_OCEAN)
+ MapLiqFlag[chunk_num] |= 1; // water/ocean
+ else if(LiqType[LiqChunkData1->LiquidTypeId] == LIQUID_TYPE_MAGMA || LiqType[LiqChunkData1->LiquidTypeId] == LIQUID_TYPE_SLIME)
+ MapLiqFlag[chunk_num] |= 2; // magma/slime
+ // предварительно заполняем весь кусок данными - нет воды
+ for(int j = 0; j < 81; ++j)
{
- int id;
- mf.read(&id, 4);
- WMO *wmo = (WMO*)wmomanager.items[wmomanager.get(wmos[id])];
- WMOInstance inst(wmo, mf);
- wmois.push_back(inst);
+ ChunkLiqHeight[j] = -999999; // no liquid/water
}
+<<<<<<< HEAD:contrib/extractor/adt.cpp
}*/
break;
@@ -98,14 +125,38 @@ bool LoadADT(char* filename)
mf.read(buf, size);
char *p=buf;
while (p<buf+size)
+=======
+ // теперь вычисляем те что с водой и перезаписываем их в куске
+ for(int b = 0; b <= LiqChunkData1->height; ++b)
+>>>>>>> upstream/master:contrib/extractor/adt.cpp
{
- std::string path(p);
- p+=strlen(p)+1;
- fixname(path);
+ for(int c = LiqChunkData1->xOffset; c <= (LiqChunkData1->xOffset + LiqChunkData1->width); ++c)
+ {
+ int n = (9 * (LiqChunkData1->yOffset + b)) + c;
+ ChunkLiqHeight[n] = LiqChunkData1->heightLevel1;
+ }
+ }
+ mf.seek(header_pos); // и не забыть вернуться на исходную позицию именно В ХИДЕРЕ
+ }
+ else // если данных в Data1 нет, то надо заполнить весь кусок, но данными - нет воды
+ {
+ for(int j = 0; j < 81; ++j)
+ ChunkLiqHeight[j] = -999999; // no liquid/water
+ }
- wmomanager.add(path);
- wmos.push_back(path);
+ if(!(chunk_num % 16))
+ m = 1024 * (chunk_num / 16); // смещение по рядам кусков с перекрытием = 1024
+ k = m + (chunk_num % 16) * 8; // устанавливаемся на начальный индекс для заполнения ряда
+ // заносим данные куска в массив для карты, с перекрытием и обрезанием кусков тк данных 81
+ // это аналог старого обрезания граничных правых-боковых и нижних данных
+ for(int p = 0; p < 72; p += 9) // нижние 8 не заносим тк они дублируется след куском
+ {
+ for(int s = 0; s < 8; ++s) // 9 значение в строке не заносим тк оно дублируется след куском, а в правых-боковых обрезается для 128х128
+ {
+ MapLiqHeight[k] = ChunkLiqHeight[p + s];
+ ++k;
}
+<<<<<<< HEAD:contrib/extractor/adt.cpp
delete[] buf;
}*/
break;
@@ -126,77 +177,50 @@ bool LoadADT(char* filename)
// mf.seekRelative(-3);
printf("Unhandled map chunk: %u\n",fourcc);
break;
+=======
+ k = k + 120;
+ }
+>>>>>>> upstream/master:contrib/extractor/adt.cpp
}
+ delete LiqOffsData;
+ delete LiqChunkData1;
+ delete []ChunkLiqHeight;
+
}
+ //case 0x4d434e4b: // MCNK
+ //case 0x4d46424f: // MFBO new in BC
+ //case 0x4d545846: // MTXF new in WotLK
mf.seek(nextpos);
}
//printf("Loading chunks info\n");
// read individual map chunks
- for (int j=0; j<16; j++)
- for (int i=0; i<16; i++)
+ chunk_num = 0;
+ k = 0;
+ m = 0;
+ for (int j = 0; j < 16; ++j)
+ {
+ for (int i = 0; i < 16; ++i)
{
- mf.seek((int)mcnk_offsets[j*16+i]);
- LoadMapChunk(mf,&(mcells->ch[i][j]));
+ mf.seek((int)mcnk_offsets[j * 16 + i]);
+ LoadMapChunk(mf, &(mcells->ch[i][j]));
+ ++chunk_num;
}
-
- /*
- for(uint32 t=0;t<wmo_count ;t++)
- {
- wmois[t].draw();
- }*/
-
+ }
mf.close();
return true;
}
-struct MapChunkHeader {
- uint32 flags;
- uint32 ix;
- uint32 iy;
- uint32 nLayers;
- uint32 nDoodadRefs;
- uint32 ofsHeight;
- uint32 ofsNormal;
- uint32 ofsLayer;
- uint32 ofsRefs;
- uint32 ofsAlpha;
- uint32 sizeAlpha;
- uint32 ofsShadow;
- uint32 sizeShadow;
- uint32 areaid;
- uint32 nMapObjRefs;
- uint32 holes;
- uint16 s1;
- uint16 s2;
- uint32 d1;
- uint32 d2;
- uint32 d3;
- uint32 predTex;
- uint32 nEffectDoodad;
- uint32 ofsSndEmitters;
- uint32 nSndEmitters;
- uint32 ofsLiquid;
- uint32 sizeLiquid;
- float zpos;
- float xpos;
- float ypos;
- uint32 textureId;
- uint32 props;
- uint32 effectId;
-};
-
bool isHole(int holes, int i, int j)
{
- int testi = i/2;
- int testj = j/4;
- if(testi>3) testi = 3;
- if(testj>3) testj = 3;
- return (holes & holetab_h[testi] & holetab_v[testj])!=0;
+ int testi = i / 2;
+ int testj = j / 4;
+ if(testi > 3) testi = 3;
+ if(testj > 3) testj = 3;
+ return (holes & holetab_h[testi] & holetab_v[testj]) != 0;
}
-inline
-void LoadMapChunk(MPQFile & mf, chunk*_chunk)
+inline void LoadMapChunk(MPQFile &mf, chunk *_chunk)
{
float h;
uint32 fourcc;
@@ -207,295 +231,267 @@ void LoadMapChunk(MPQFile & mf, chunk*_chunk)
mf.read(&size, 4);
size_t lastpos = mf.getPos() + size;
- mf.read(&header, 0x80);
- _chunk->area_id =header.areaid ;
- _chunk->flag =0;
+ mf.read(&header, 0x80); // what if header size got changed?
+ _chunk->area_id = header.areaid;
float xbase = header.xpos;
float ybase = header.ypos;
float zbase = header.zpos;
- zbase = TILESIZE*32-zbase;
- xbase = TILESIZE*32-xbase;
- if(wmoc.x >xbase)wmoc.x =xbase;
- if(wmoc.z >zbase)wmoc.z =zbase;
+ zbase = TILESIZE * 32 - zbase;
+ xbase = TILESIZE * 32 - xbase;
+ if(wmoc.x > xbase) wmoc.x = xbase;
+ if(wmoc.z > zbase) wmoc.z = zbase;
int chunkflags = header.flags;
- float zmin=999999999.0f;
- float zmax=-999999999.0f;
- //must be there, bl!zz uses some crazy format
- int nTextures;
+ //printf("LMC: flags %X\n", chunkflags);
+ float zmin = 999999999.0f;
+ float zmax = -999999999.0f;
+ // must be there, bl!zz uses some crazy format
while (mf.getPos() < lastpos)
{
- mf.read(&fourcc,4);
+ mf.read(&fourcc, 4);
mf.read(&size, 4);
- //if(size!=580)
- // printf("\n sz=%d",size);
- size_t nextpos = mf.getPos() + size;
- if(fourcc==0x4d435654) // MCVT
+ size_t nextpos = mf.getPos() + size;
+ if(fourcc == 0x4d435654) // MCVT
{
- for (int j=0; j<17; j++)
- for (int i=0; i<((j%2)?8:9); i++)
+ for (int j = 0; j < 17; ++j)
+ {
+ for (int i = 0; i < ((j % 2) ? 8 : 9); ++i)
{
- mf.read(&h,4);
- float z=h+ybase;
- if (j%2)
+ mf.read(&h, 4);
+ float z = h + ybase;
+ if (j % 2)
{
- if(isHole(header.holes,i,j))
- _chunk->v8[i][j/2] = -1000;
+ if(isHole(header.holes, i, j))
+ _chunk->v8[i][j / 2] = -1000;
else
- _chunk->v8[i][j/2] = z;
+ _chunk->v8[i][j / 2] = z;
}
else
{
- if(isHole(header.holes,i,j))
- _chunk->v9[i][j/2] = -1000;
+ if(isHole(header.holes, i, j))
+ _chunk->v9[i][j / 2] = -1000;
else
- _chunk->v9[i][j/2] = z;
+ _chunk->v9[i][j / 2] = z;
}
- if(z>zmax)zmax=z;
- //if(z<zmin)zmin=z;
+ if(z > zmax) zmax = z;
+ //if(z < zmin) zmin = z;
}
+ }
}
- else if(fourcc==0x4d434e52) // MCNR
+ else if(fourcc == 0x4d434e52) // MCNR
{
- nextpos = mf.getPos() + 0x1C0; // size fix
+ nextpos = mf.getPos() + 0x1C0; // size fix
}
- else if(fourcc==0x4d434c51) // MCLQ
+ else if(fourcc == 0x4d434c51) // не будем учитывать если уже были данные в MH2O, перестраховка :) // MCLQ
{
// liquid / water level
- //bool haswater;
char fcc1[5];
- mf.read(fcc1,4);
+ mf.read(fcc1, 4);
flipcc(fcc1);
- fcc1[4]=0;
+ fcc1[4] = 0;
+ float *ChunkLiqHeight = new float[81];
- if (!strcmp(fcc1,"MCSE"))
+ if (!strcmp(fcc1, "MCSE"))
{
- for(int i=0;i<9;i++)
- for(int j=0;j<9;j++)
- _chunk->waterlevel[i][j]=-999999; // no liquid/water
+ for(int j = 0; j < 81; ++j)
+ {
+ ChunkLiqHeight[j] = -999999; // no liquid/water
+ }
}
else
{
float maxheight;
mf.read(&maxheight, 4);
+ for(int j = 0; j < 81; ++j)
+ {
+ LiqData liq;
+ mf.read(&liq, 8);
- for(int j=0;j<9;j++)
- for(int i=0;i<9;i++)
- {
- mf.read(&h, 4);
- mf.read(&h, 4);
- if(h > maxheight)
- _chunk->waterlevel[i][j]=-999999;
- else
- _chunk->waterlevel[i][j]=h;
- }
+ if(liq.height > maxheight)
+ ChunkLiqHeight[j] = -999999;
+ else
+ ChunkLiqHeight[j] = h;
+ }
if(chunkflags & 4 || chunkflags & 8)
- _chunk->flag |=1;
+ MapLiqFlag[chunk_num] |= 1; // water
if(chunkflags & 16)
+<<<<<<< HEAD:contrib/extractor/adt.cpp
_chunk->flag |=2;
+=======
+ MapLiqFlag[chunk_num] |= 2; // magma/slime
}
+ // заполнем так же как в MH2O
+ if(!(chunk_num % 16))
+ m = 1024 * (chunk_num / 16);
+ k = m + (chunk_num % 16) * 8;
+
+ for(int p = 0; p < 72; p += 9)
+ {
+ for(int s = 0; s < 8; ++s)
+ {
+ MapLiqHeight[k] = ChunkLiqHeight[p + s];
+ ++k;
+ }
+ k = k + 120;
+>>>>>>> upstream/master:contrib/extractor/adt.cpp
+ }
+ delete []ChunkLiqHeight;
break;
}
- else if (fourcc==0x4d434c59) // MCLY
- {
- // texture info
- nTextures = (int)size;
- }
- else if (fourcc==0x4d43414c) // MCAL
- {
- if (nTextures<=0)
- continue;
- }
-
mf.seek(nextpos);
}
}
double solve (vec *v,vec *p)
{
- double a = v[0].y *(v[1].z - v[2].z) + v[1].y *(v[2].z - v[0].z) + v[2].y *(v[0].z - v[1].z);
- double b = v[0].z *(v[1].x - v[2].x) + v[1].z *(v[2].x - v[0].x) + v[2].z *(v[0].x - v[1].x);
- double c = v[0].x *(v[1].y - v[2].y) + v[1].x *(v[2].y - v[0].y) + v[2].x *(v[0].y - v[1].y);
- double d = v[0].x *(v[1].y*v[2].z - v[2].y*v[1].z) + v[1].x* (v[2].y*v[0].z - v[0].y*v[2].z) + v[2].x* (v[0].y*v[1].z - v[1].y*v[0].z);
- //-d
+ double a = v[0].y * (v[1].z - v[2].z) + v[1].y * (v[2].z - v[0].z) + v[2].y * (v[0].z - v[1].z);
+ double b = v[0].z * (v[1].x - v[2].x) + v[1].z * (v[2].x - v[0].x) + v[2].z * (v[0].x - v[1].x);
+ double c = v[0].x * (v[1].y - v[2].y) + v[1].x * (v[2].y - v[0].y) + v[2].x * (v[0].y - v[1].y);
+ double d = v[0].x * (v[1].y * v[2].z - v[2].y * v[1].z) + v[1].x * (v[2].y * v[0].z - v[0].y * v[2].z) + v[2].x * (v[0].y * v[1].z - v[1].y * v[0].z);
+ // -d
- //plane equation ax+by+cz+d=0
+ // plane equation ax+by+cz+d=0
return ((a*p->x+c*p->z-d)/b);
}
-inline
-double GetZ(double x,double z)
+inline double GetZ(double x, double z)
{
vec v[3];
vec p;
-
- //bool inWMO=false;
-
- //if(!inWMO)
{
- //find out quadrant
- int xc=(int)(x/UNITSIZE);
- int zc=(int)(z/UNITSIZE);
- if(xc>127)xc=127;
- if(zc>127)zc=127;
-
- double lx=x-xc*UNITSIZE;
- double lz=z-zc*UNITSIZE;
- p.x=lx;
- p.z=lz;
-
- v[0].x=UNITSIZE/2;
- v[0].y =cell->v8[xc][zc];
- v[0].z=UNITSIZE/2;
-
- if(lx>lz)
+ // find out quadrant
+ int xc = (int)(x / UNITSIZE);
+ int zc = (int)(z / UNITSIZE);
+ if(xc > 127) xc = 127;
+ if(zc > 127) zc = 127;
+
+ double lx = x - xc * UNITSIZE;
+ double lz = z - zc * UNITSIZE;
+ p.x = lx;
+ p.z = lz;
+
+ v[0].x = UNITSIZE / 2;
+ v[0].y = cell->v8[xc][zc];
+ v[0].z = UNITSIZE / 2;
+
+ if(lx > lz)
{
- v[1].x=UNITSIZE;
- v[1].y =cell->v9[xc+1][zc];
- v[1].z=0;
+ v[1].x = UNITSIZE;
+ v[1].y = cell->v9[xc + 1][zc];
+ v[1].z = 0.0f;
}
else
{
- v[1].x=0.0;
- v[1].y =cell->v9[xc][zc+1];
- v[1].z=UNITSIZE;
+ v[1].x = 0.0f;
+ v[1].y = cell->v9[xc][zc + 1];
+ v[1].z = UNITSIZE;
}
- if(lz>UNITSIZE-lx)
+ if(lz > UNITSIZE - lx)
{
- v[2].x=UNITSIZE;
- v[2].y =cell->v9[xc+1][zc+1];
- v[2].z=UNITSIZE;
+ v[2].x = UNITSIZE;
+ v[2].y = cell->v9[xc + 1][zc + 1];
+ v[2].z = UNITSIZE;
}
else
{
- v[2].x=0;
- v[2].y=cell->v9[xc][zc];
- v[2].z=0;
+ v[2].x = 0.0f;
+ v[2].y = cell->v9[xc][zc];
+ v[2].z = 0.0f;
}
- return -solve(v,&p);
+ return -solve(v, &p);
}
}
-inline
-void TransformWaterData()
-{
- cell= new Cell;
-
- for(int x=0;x<128;x++)
- for(int y=0;y<128;y++)
- cell->v9[x][y] = mcells->ch[x/8][y/8].waterlevel[x%8][y%8];
-
- //and the last 1
- cell->v9[128][128] = mcells->ch[15][15].waterlevel[8][8];
-}
-
-inline
-void TransformData()
+inline void TransformData()
{
- cell= new Cell;
+ cell = new Cell;
- for(int x=0;x<128;x++)
+ for(uint32 x = 0; x < 128; ++x)
{
- for(int y=0;y<128;y++)
+ for(uint32 y = 0; y < 128; ++y)
{
- cell->v8[x][y] = (float)mcells->ch[x/8][y/8].v8[x%8][y%8];
- cell->v9[x][y] = (float)mcells->ch[x/8][y/8].v9[x%8][y%8];
+ cell->v8[x][y] = (float)mcells->ch[x / 8][y / 8].v8[x % 8][y % 8];
+ cell->v9[x][y] = (float)mcells->ch[x / 8][y / 8].v9[x % 8][y % 8];
}
- //extra 1 point on bounds
- cell->v9[x][128] = (float)mcells->ch[x/8][15].v9[x%8][8];
- //x==y
- cell->v9[128][x] = (float)mcells->ch[15][x/8].v9[8][x%8];
+ // extra 1 point on bounds
+ cell->v9[x][128] = (float)mcells->ch[x / 8][15].v9[x % 8][8];
+ // x == y
+ cell->v9[128][x] = (float)mcells->ch[15][x / 8].v9[8][x % 8];
}
- //and the last 1
+ // and the last 1
cell->v9[128][128] = (float)mcells->ch[15][15].v9[8][8];
delete mcells;
}
-const char MAP_MAGIC[] = "MAP_2.00";
+const char MAP_MAGIC[] = "MAP_2.01";
-bool ConvertADT(char * filename,char * filename2)
+bool ConvertADT(char *filename, char *filename2)
{
- //if(!strstr(filename,"oth_32_48"))return false;
if(!LoadADT(filename))
return false;
- FILE *output=fopen(filename2,"wb");
+ FILE *output=fopen(filename2, "wb");
if(!output)
{
- printf("Can't create the output file '%s'\n",filename2);
+ printf("Can't create the output file '%s'\n", filename2);
+ delete [] MapLiqHeight;
+ delete [] MapLiqFlag;
return false;
}
// write magic header
- fwrite(MAP_MAGIC,1,8,output);
+ fwrite(MAP_MAGIC, 1, 8, output);
- for(unsigned int x=0;x<16;x++)
+ for(uint32 x = 0; x < 16; ++x)
{
- for(unsigned int y=0;y<16;y++)
+ for(uint32 y = 0; y < 16; ++y)
{
- if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id < 0x102D)
+ if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id <= maxAreaId)
{
- if(areas[mcells->ch[y][x].area_id]==0xffff)
- printf("\nCan't find area flag for areaid %u.\n",mcells->ch[y][x].area_id);
+ if(areas[mcells->ch[y][x].area_id] == 0xffff)
+ printf("\nCan't find area flag for areaid %u.\n", mcells->ch[y][x].area_id);
- fwrite(&areas[mcells->ch[y][x].area_id],1,2,output);
+ fwrite(&areas[mcells->ch[y][x].area_id], 1, 2, output);
}
else
{
- uint16 flag=0xffff;
- fwrite(&flag,1,2,output);
+ uint16 flag = 0xffff;
+ fwrite(&flag, 1, 2, output);
}
}
}
- for(unsigned int x=0;x<16;x++)
- for(unsigned int y=0;y<16;y++)
- fwrite(&mcells->ch[y][x].flag,1,1,output);
+ fwrite(MapLiqFlag, 1, 256, output);
+ delete [] MapLiqFlag;
- TransformWaterData();
+ fwrite(MapLiqHeight, sizeof(float), 16384, output);
+ delete [] MapLiqHeight;
- for(unsigned int x=0;x<128;x++)
- for(unsigned int y=0;y<128;y++)
- fwrite(&cell->v9[y][x],1,sizeof(float),output);
-
- delete cell;
TransformData();
- for(unsigned int x=0;x<iRes;x++)
- for(unsigned int y=0;y<iRes;y++)
+ for(uint32 x = 0; x < iRes; ++x)
{
- float z=(float)GetZ(
- (((double)(y))*TILESIZE)/((double)(iRes-1)),
- (((double)(x))*TILESIZE)/((double)(iRes-1)));
+ for(uint32 y = 0; y < iRes; ++y)
+ {
+ float z = (float)GetZ(
+ (((double)(y)) * TILESIZE) / ((double)(iRes - 1)),
+ (((double)(x)) * TILESIZE) / ((double)(iRes - 1)));
- fwrite(&z,1,sizeof(z),output);
+ fwrite(&z, 1, sizeof(z), output);
+ }
}
fclose(output);
delete cell;
-/*
- for (std::vector<std::string>::iterator it = wmos.begin(); it != wmos.end(); ++it)
- wmomanager.delbyname(*it);
-
- wmos.clear();
- wmois.clear();
-
- for (std::vector<model>::iterator it = wmomodel.begin(); it != wmomodel.end(); ++it)
- {
- it->tr.clear();
-
- }
- //printf("\n %d \n",in);
- wmomodel.clear();
- //polygons.clear();*/
+
return true;
}
diff --git a/contrib/extractor/adt.h b/contrib/extractor/adt.h
index 6e079461a66..ec607c9d7bc 100644
--- a/contrib/extractor/adt.h
+++ b/contrib/extractor/adt.h
@@ -9,46 +9,121 @@ typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
class Liquid;
-typedef struct {
-float x;
-float y;
-float z;
-}svec;
-
-typedef struct {
-double x;
-double y;
-double z;
-}vec;
-
-typedef struct{
+typedef struct
+{
+ float x;
+ float y;
+ float z;
+} svec;
+
+typedef struct
+{
+ double x;
+ double y;
+ double z;
+} vec;
+
+typedef struct
+{
vec v[3];
-}triangle;
+} triangle;
+
+typedef struct
+{
+ float v9[16 * 8 + 1][16 * 8 + 1];
+ float v8[16 * 8][16 * 8];
+} Cell;
+
+typedef struct
+{
+ double v9[9][9];
+ double v8[8][8];
+ uint16 area_id;
+} chunk;
-typedef struct{
-float v9[16*8+1][16*8+1];
-float v8[16*8][16*8];
-}Cell;
+typedef struct
+{
+ chunk ch[16][16];
+} mcell;
-typedef struct{
-double v9[9][9];
-double v8[8][8];
-uint16 area_id;
-//Liquid *lq;
-float waterlevel[9][9];
-uint8 flag;
-}chunk;
+struct MapChunkHeader
+{
+ uint32 flags;
+ uint32 ix;
+ uint32 iy;
+ uint32 nLayers;
+ uint32 nDoodadRefs;
+ uint32 ofsHeight;
+ uint32 ofsNormal;
+ uint32 ofsLayer;
+ uint32 ofsRefs;
+ uint32 ofsAlpha;
+ uint32 sizeAlpha;
+ uint32 ofsShadow;
+ uint32 sizeShadow;
+ uint32 areaid;
+ uint32 nMapObjRefs;
+ uint32 holes;
+ uint16 s1;
+ uint16 s2;
+ uint32 d1;
+ uint32 d2;
+ uint32 d3;
+ uint32 predTex;
+ uint32 nEffectDoodad;
+ uint32 ofsSndEmitters;
+ uint32 nSndEmitters;
+ uint32 ofsLiquid; // not use in WotLK
+ uint32 sizeLiquid; // not use in WotLK
+ float zpos;
+ float xpos;
+ float ypos;
+ uint32 textureId; // new offsColorValues in WotLK
+ uint32 props;
+ uint32 effectId;
+};
-class WMO;
-class WMOManager;
-void fixname(std::string &name);
+typedef struct
+{
+ uint32 offsData1;
+ uint32 used;
+ uint32 offsData2;
+} MH2O_offsData;
typedef struct
{
-chunk ch[16][16];
-}mcell;
+ uint16 LiquidTypeId;
+ uint16 type;
+ float heightLevel1;
+ float heightLevel2;
+ uint8 xOffset;
+ uint8 yOffset;
+ uint8 width;
+ uint8 height;
+ uint32 ofsData2a;
+ uint32 ofsData2b;
+} MH2O_Data1;
+
+typedef struct
+{
+ uint16 unk1;
+ uint16 unk2;
+ float height;
+} LiqData;
+
+enum LiquidType
+{
+ LIQUID_TYPE_WATER = 0,
+ LIQUID_TYPE_OCEAN = 1,
+ LIQUID_TYPE_MAGMA = 2,
+ LIQUID_TYPE_SLIME = 3
+};
+
class MPQFile;
-void LoadMapChunk(MPQFile &,chunk*);
-bool LoadWMO(char* filename);
+
+float *MapLiqHeight;
+uint8 *MapLiqFlag;
+uint32 k, m, chunk_num;
+void LoadMapChunk(MPQFile &, chunk*);
#endif
diff --git a/contrib/vmap_extract_assembler_bin/vmap_assembler.exe b/contrib/vmap_extract_assembler_bin/vmap_assembler.exe
index 5cb08f770aa..a6ef74dc086 100644
--- a/contrib/vmap_extract_assembler_bin/vmap_assembler.exe
+++ b/contrib/vmap_extract_assembler_bin/vmap_assembler.exe
Binary files differ
diff --git a/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe b/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe
index c38b6e64f64..03c76907658 100644
--- a/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe
+++ b/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe
Binary files differ
diff --git a/contrib/vmap_extractor_v2/vmapextract/model.cpp b/contrib/vmap_extractor_v2/vmapextract/model.cpp
index 7dca7841d74..1d0c17d52e6 100644
--- a/contrib/vmap_extractor_v2/vmapextract/model.cpp
+++ b/contrib/vmap_extractor_v2/vmapextract/model.cpp
@@ -1,11 +1,7 @@
-//#include "common.h"
#include "model.h"
-//#include "world.h"
#include <cassert>
#include <algorithm>
-//int globalTime = 0;
-
Model::Model(std::string &filename) : filename(filename)
{
}
@@ -24,121 +20,31 @@ bool Model::open()
}
memcpy(&header, f.getBuffer(), sizeof(ModelHeader));
- if(header.nBoundingTriangles > 0) {
-
-#if 0
- animated = isAnimated(f);
- if(animated)
- {
- f.close();
- return false;
- }
-#endif
- trans = 1.0f;
- origVertices = (ModelVertex*)(f.getBuffer() + header.ofsVertices);
-
- vertices = new Vec3D[header.nVertices];
- normals = new Vec3D[header.nVertices];
-
- for (size_t i=0; i<header.nVertices; i++)
- {
- origVertices[i].pos = fixCoordSystem(origVertices[i].pos);
- origVertices[i].normal = fixCoordSystem(origVertices[i].normal);
- vertices[i] = origVertices[i].pos;
- normals[i] = origVertices[i].normal.normalize();
- }
-
- ModelView *view = (ModelView*)(f.getBuffer() + header.ofsViews);
-
- uint16 *indexLookup = (uint16*)(f.getBuffer() + view->ofsIndex);
- uint16 *triangles = (uint16*)(f.getBuffer() + view->ofsTris);
-
- nIndices = view->nTris;
- indices = new uint16[nIndices];
- for (size_t i = 0; i<nIndices; i++)
+ if(header.nBoundingTriangles > 0)
+ {
+ f.seek(0);
+ f.seekRelative(header.ofsBoundingVertices);
+ vertices = new Vec3D[header.nBoundingVertices];
+ f.read(vertices,header.nBoundingVertices*12);
+ for (uint32 i=0; i<header.nBoundingVertices; i++)
{
- indices[i] = indexLookup[triangles[i]];
+ vertices[i] = fixCoordSystem(vertices[i]);
}
+ f.seek(0);
+ f.seekRelative(header.ofsBoundingTriangles);
+ indices = new uint16[header.nBoundingTriangles];
+ f.read(indices,header.nBoundingTriangles*2);
f.close();
- } else {
+ }
+ else
+ {
//printf("not included %s\n", filename.c_str());
+ f.close();
return false;
}
return true;
-
}
-bool Model::isAnimated(MPQFile &f)
-{
- // see if we have any animated bones
- ModelBoneDef *bo = (ModelBoneDef*)(f.getBuffer() + header.ofsBones);
-
- animGeometry = false;
- animBones = false;
- ind = false;
-
- ModelVertex *verts = (ModelVertex*)(f.getBuffer() + header.ofsVertices);
- for (size_t i=0; i<header.nVertices && !animGeometry; i++) {
- for (size_t b=0; b<4; b++) {
- if (verts[i].weights[b]>0) {
- ModelBoneDef &bb = bo[verts[i].bones[b]];
- if (bb.translation.type || bb.rotation.type || bb.scaling.type || (bb.flags&8)) {
- if (bb.flags&8) {
- // if we have billboarding, the model will need per-instance animation
- ind = true;
- }
- animGeometry = true;
- break;
- }
- }
- }
- }
-
- if (animGeometry) animBones = true;
- else {
- for (size_t i=0; i<header.nBones; i++) {
- ModelBoneDef &bb = bo[i];
- if (bb.translation.type || bb.rotation.type || bb.scaling.type) {
- animBones = true;
- break;
- }
- }
- }
-
- animTextures = header.nTexAnims > 0;
-
- bool animMisc = header.nCameras>0 || // why waste time, pretty much all models with cameras need animation
- header.nLights>0 || // same here
- header.nParticleEmitters>0 ||
- header.nRibbonEmitters>0;
-
- if (animMisc) animBones = true;
-
- // animated colors
- if (header.nColors) {
- ModelColorDef *cols = (ModelColorDef*)(f.getBuffer() + header.ofsColors);
- for (size_t i=0; i<header.nColors; i++) {
- if (cols[i].color.type!=0 || cols[i].opacity.type!=0) {
- animMisc = true;
- break;
- }
- }
- }
-
- // animated opacity
- if (header.nTransparency && !animMisc) {
- ModelTransDef *trs = (ModelTransDef*)(f.getBuffer() + header.ofsTransparency);
- for (size_t i=0; i<header.nTransparency; i++) {
- if (trs[i].trans.type!=0) {
- animMisc = true;
- break;
- }
- }
- }
-
- // guess not...
- return animGeometry || animTextures || animMisc;
-}
bool Model::ConvertToVMAPModel(char * outfilename)
{
@@ -151,7 +57,8 @@ bool Model::ConvertToVMAPModel(char * outfilename)
return false;
}
fwrite("VMAP002",8,1,output);
- int nVertices = header.nVertices;
+ uint32 nVertices = 0;
+ nVertices = header.nBoundingVertices;
fwrite(&nVertices, sizeof(int), 1, output);
uint32 nofgroups = 1;
fwrite(&nofgroups,sizeof(uint32), 1, output);
@@ -162,15 +69,16 @@ bool Model::ConvertToVMAPModel(char * outfilename)
wsize = sizeof(branches) + sizeof(uint32) * branches;
fwrite(&wsize, sizeof(int), 1, output);
fwrite(&branches,sizeof(branches), 1, output);
- uint32 nIdexes = (uint32) nIndices;
- fwrite(&nIndices,sizeof(uint32), 1, output);
+ uint32 nIndexes = 0;
+ nIndexes = header.nBoundingTriangles;
+ fwrite(&nIndexes,sizeof(uint32), 1, output);
fwrite("INDX",4, 1, output);
- wsize = sizeof(uint32) + sizeof(unsigned short) * nIdexes;
+ wsize = sizeof(uint32) + sizeof(unsigned short) * nIndexes;
fwrite(&wsize, sizeof(int), 1, output);
- fwrite(&nIdexes, sizeof(uint32), 1, output);
- if(nIdexes >0)
+ fwrite(&nIndexes, sizeof(uint32), 1, output);
+ if(nIndexes >0)
{
- fwrite(indices, sizeof(unsigned short), nIdexes, output);
+ fwrite(indices, sizeof(unsigned short), nIndexes, output);
}
fwrite("VERT",4, 1, output);
wsize = sizeof(int) + sizeof(float) * 3 * nVertices;
@@ -178,7 +86,7 @@ bool Model::ConvertToVMAPModel(char * outfilename)
fwrite(&nVertices, sizeof(int), 1, output);
if(nVertices >0)
{
- for(int vpos=0; vpos <nVertices; ++vpos)
+ for(uint32 vpos=0; vpos <nVertices; ++vpos)
{
float sy = vertices[vpos].y;
vertices[vpos].y = vertices[vpos].z;
@@ -189,7 +97,6 @@ bool Model::ConvertToVMAPModel(char * outfilename)
delete[] vertices;
delete[] indices;
- delete[] normals;
fclose(output);
diff --git a/contrib/vmap_extractor_v2/vmapextract/model.h b/contrib/vmap_extractor_v2/vmapextract/model.h
index 0af492f922c..a2bdee9465b 100644
--- a/contrib/vmap_extractor_v2/vmapextract/model.h
+++ b/contrib/vmap_extractor_v2/vmapextract/model.h
@@ -4,7 +4,6 @@
#include "vec3d.h"
#include "mpq.h"
#include "modelheaders.h"
-//#include "quaternion.h"
#include <vector>
class Model;
@@ -18,18 +17,14 @@ Vec3D fixCoordSystem(Vec3D v);
class Model
{
public:
+
ModelHeader header;
- ModelAnimation *anims;
- int *globalSequences;
public:
- bool animGeometry,animTextures,animBones;
- bool animated;
- bool isAnimated(MPQFile &f);
- ModelVertex *origVertices;
- Vec3D *vertices, *normals;
- uint16 *indices;
+ uint32 offsBB_vertices, offsBB_indices;
+ Vec3D *BB_vertices, *vertices;
+ uint16 *BB_indices, *indices;
size_t nIndices;
bool open();
@@ -38,12 +33,6 @@ public:
public:
bool ok;
- bool ind;
-
- float rad;
- float trans;
- bool animcalc;
- int anim, animtime;
Model(std::string &filename);
~Model();
@@ -59,15 +48,9 @@ public:
Model *model;
int id;
-
Vec3D pos, rot;
unsigned int d1, scale;
-
- float frot,w,sc;
-
- int light;
- Vec3D ldir;
- Vec3D lcol;
+ float w,sc;
ModelInstance() {}
ModelInstance(MPQFile &f,const char* ModelInstName,const char*MapName, FILE *pDirfile);
diff --git a/contrib/vmap_extractor_v2/vmapextract/modelheaders.h b/contrib/vmap_extractor_v2/vmapextract/modelheaders.h
index 7d5e800e796..c35b983c19b 100644
--- a/contrib/vmap_extractor_v2/vmapextract/modelheaders.h
+++ b/contrib/vmap_extractor_v2/vmapextract/modelheaders.h
@@ -15,289 +15,67 @@ struct ModelHeader {
uint8 version[4];
uint32 nameLength;
uint32 nameOfs;
- uint32 type;
-
+ uint32 type;
uint32 nGlobalSequences;
uint32 ofsGlobalSequences;
uint32 nAnimations;
uint32 ofsAnimations;
- uint32 nC;
- uint32 ofsC;
- uint32 nD;
- uint32 ofsD;
- uint32 nBones;
- uint32 ofsBones;
- uint32 nF;
- uint32 ofsF;
-
+ uint32 nAnimationLookup;
+ uint32 ofsAnimationLookup;
+ uint32 nBones;
+ uint32 ofsBones;
+ uint32 nKeyBoneLookup;
+ uint32 ofsKeyBoneLookup;
uint32 nVertices;
uint32 ofsVertices;
uint32 nViews;
- uint32 ofsViews;
-
uint32 nColors;
uint32 ofsColors;
-
uint32 nTextures;
uint32 ofsTextures;
-
- uint32 nTransparency; // H
+ uint32 nTransparency;
uint32 ofsTransparency;
- uint32 nI; // always unused ?
- uint32 ofsI;
- uint32 nTexAnims; // J
- uint32 ofsTexAnims;
- uint32 nK;
- uint32 ofsK;
-
- uint32 nTexFlags;
- uint32 ofsTexFlags;
- uint32 nY;
- uint32 ofsY;
-
- uint32 nTexLookup;
- uint32 ofsTexLookup;
-
- uint32 nTexUnitLookup; // L
- uint32 ofsTexUnitLookup;
- uint32 nTransparencyLookup; // M
- uint32 ofsTransparencyLookup;
- uint32 nTexAnimLookup;
- uint32 ofsTexAnimLookup;
-
- float floats[14];
-
- uint32 nBoundingTriangles;
- uint32 ofsBoundingTriangles;
- uint32 nBoundingVertices;
- uint32 ofsBoundingVertices;
- uint32 nBoundingNormals;
- uint32 ofsBoundingNormals;
-
- uint32 nO;
- uint32 ofsO;
- uint32 nP;
- uint32 ofsP;
- uint32 nQ;
- uint32 ofsQ;
- uint32 nLights; // R
- uint32 ofsLights;
- uint32 nCameras; // S
- uint32 ofsCameras;
- uint32 nT;
- uint32 ofsT;
- uint32 nRibbonEmitters; // U
- uint32 ofsRibbonEmitters;
- uint32 nParticleEmitters; // V
- uint32 ofsParticleEmitters;
-
-};
-
-// block B - animations
-struct ModelAnimation {
- uint32 animID;
- uint32 timeStart;
- uint32 timeEnd;
-
- float moveSpeed;
-
- uint32 loopType;
- uint32 flags;
- uint32 d1;
- uint32 d2;
- uint32 playSpeed; // note: this can't be play speed because it's 0 for some models
-
- Vec3D boxA, boxB;
- float rad;
-
- int16 s[2];
-};
-
-
-// sub-block in block E - animation data
-struct AnimationBlock {
- int16 type; // interpolation type (0=none, 1=linear, 2=hermite)
- int16 seq; // global sequence id or -1
- uint32 nRanges;
- uint32 ofsRanges;
- uint32 nTimes;
- uint32 ofsTimes;
- uint32 nKeys;
- uint32 ofsKeys;
-};
-
-// block E - bones
-struct ModelBoneDef {
- int32 animid;
- int32 flags;
- int16 parent; // parent bone index
- int16 geoid;
- // new int added to the bone definitions. Added in WoW 2.0
- int32 unknown;
- AnimationBlock translation;
- AnimationBlock rotation;
- AnimationBlock scaling;
- Vec3D pivot;
-};
-
-struct ModelTexAnimDef {
- AnimationBlock trans, rot, scale;
-};
-
-struct ModelVertex {
- Vec3D pos;
- uint8 weights[4];
- uint8 bones[4];
- Vec3D normal;
- Vec2D texcoords;
- int unk1, unk2; // always 0,0 so this is probably unused
-};
-
-struct ModelView {
- uint32 nIndex, ofsIndex; // Vertices in this model (index into vertices[])
- uint32 nTris, ofsTris; // indices
- uint32 nProps, ofsProps; // additional vtx properties
- uint32 nSub, ofsSub; // materials/renderops/submeshes
- uint32 nTex, ofsTex; // material properties/textures
- int32 lod; // LOD bias?
-};
-
-
-/// One material + render operation
-struct ModelGeoset {
- uint16 d1; // mesh part id?
- uint16 d2; // ?
- uint16 vstart; // first vertex
- uint16 vcount; // num vertices
- uint16 istart; // first index
- uint16 icount; // num indices
- uint16 d3; // number of bone indices
- uint16 d4; // offset into bone index list
- uint16 d5; // ?
- uint16 d6; // root bone?
- Vec3D v;
- float unknown[4]; // Added in WoW 2.0?
-};
-
-/// A texture unit (sub of material)
-struct ModelTexUnit{
- // probably the texture units
- // size always >=number of materials it seems
- uint16 flags; // Flags
- uint16 order; // ?
- uint16 op; // Material this texture is part of (index into mat)
- uint16 op2; // Always same as above?
- int16 colorIndex; // color or -1
- uint16 flagsIndex; // more flags...
- uint16 texunit; // Texture unit (0 or 1)
- uint16 d4; // ? (seems to be always 1)
- uint16 textureid; // Texture id (index into global texture list)
- uint16 texunit2; // copy of texture unit value?
- uint16 transid; // transparency id (index into transparency list)
- uint16 texanimid; // texture animation id
-};
-
-// block X - render flags
-struct ModelRenderFlags {
- uint16 flags;
- uint16 blend;
-};
-
-// block G - color defs
-struct ModelColorDef {
- AnimationBlock color;
- AnimationBlock opacity;
-};
-
-// block H - transp defs
-struct ModelTransDef {
- AnimationBlock trans;
-};
-
-struct ModelTextureDef {
- uint32 type;
- uint32 flags;
- uint32 nameLen;
- uint32 nameOfs;
-};
-
-struct ModelLightDef {
- int16 type;
- int16 bone;
- Vec3D pos;
- AnimationBlock ambColor;
- AnimationBlock ambIntensity;
- AnimationBlock color;
- AnimationBlock intensity;
- AnimationBlock attStart;
- AnimationBlock attEnd;
- AnimationBlock unk1;
-};
-
-struct ModelCameraDef {
- int32 id;
- float fov, farclip, nearclip;
- AnimationBlock transPos;
- Vec3D pos;
- AnimationBlock transTarget;
- Vec3D target;
- AnimationBlock rot;
-};
-
-
-struct ModelParticleParams {
- float mid;
- uint32 colors[3];
- float sizes[3];
- int16 d[10];
- float unk[3];
- float scales[3];
- float slowdown;
- float rotation;
- float f2[16];
-};
-
-struct ModelParticleEmitterDef {
- int32 id;
- int32 flags;
- Vec3D pos;
- int16 bone;
- int16 texture;
- int32 nZero1;
- int32 ofsZero1;
- int32 nZero2;
- int32 ofsZero2;
- int16 blend;
- int16 type;
- int16 s1;
- int16 s2;
- int16 cols;
- int16 rows;
- AnimationBlock params[10];
- ModelParticleParams p;
- AnimationBlock unk;
+ uint32 nTextureanimations;
+ uint32 ofsTextureanimations;
+ uint32 nTexReplace;
+ uint32 ofsTexReplace;
+ uint32 nRenderFlags;
+ uint32 ofsRenderFlags;
+ uint32 nBoneLookupTable;
+ uint32 ofsBoneLookupTable;
+ uint32 nTexLookup;
+ uint32 ofsTexLookup;
+ uint32 nTexUnits;
+ uint32 ofsTexUnits;
+ uint32 nTransLookup;
+ uint32 ofsTransLookup;
+ uint32 nTexAnimLookup;
+ uint32 ofsTexAnimLookup;
+ float floats[14];
+ uint32 nBoundingTriangles;
+ uint32 ofsBoundingTriangles;
+ uint32 nBoundingVertices;
+ uint32 ofsBoundingVertices;
+ uint32 nBoundingNormals;
+ uint32 ofsBoundingNormals;
+ uint32 nAttachments;
+ uint32 ofsAttachments;
+ uint32 nAttachLookup;
+ uint32 ofsAttachLookup;
+ uint32 nAttachments_2;
+ uint32 ofsAttachments_2;
+ uint32 nLights;
+ uint32 ofsLights;
+ uint32 nCameras;
+ uint32 ofsCameras;
+ uint32 nCameraLookup;
+ uint32 ofsCameraLookup;
+ uint32 nRibbonEmitters;
+ uint32 ofsRibbonEmitters;
+ uint32 nParticleEmitters;
+ uint32 ofsParticleEmitters;
};
-
-struct ModelRibbonEmitterDef {
- int32 id;
- int32 bone;
- Vec3D pos;
- int32 nTextures;
- int32 ofsTextures;
- int32 nUnknown;
- int32 ofsUnknown;
- AnimationBlock color;
- AnimationBlock opacity;
- AnimationBlock above;
- AnimationBlock below;
- float res, length, unk;
- int16 s1, s2;
- AnimationBlock unk1;
- AnimationBlock unk2;
-};
-
-
#pragma pack(pop)
diff --git a/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp b/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp
index dfc7cddcfdd..0d2b39f8d06 100644
--- a/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp
+++ b/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp
@@ -421,6 +421,10 @@ bool fillArchiveNameVector(std::vector<std::string>& pArchiveNames) {
// open expansion and common files
printf("Opening data files from data directory.\n");
+ sprintf(path, "%slichking.mpq", input_path);
+ pArchiveNames.push_back(path);
+ sprintf(path, "%scommon-2.mpq", input_path);
+ pArchiveNames.push_back(path);
sprintf(path, "%sexpansion.mpq", input_path);
pArchiveNames.push_back(path);
sprintf(path, "%scommon.mpq", input_path);
@@ -432,6 +436,8 @@ bool fillArchiveNameVector(std::vector<std::string>& pArchiveNames) {
for (std::vector<std::string>::iterator i = locales.begin(); i != locales.end(); i++)
{
printf("Locale: %s\n", i->c_str());
+ sprintf(path, "%s%s\\lichking-locale-%s.mpq", input_path, i->c_str(), i->c_str());
+ pArchiveNames.push_back(path);
sprintf(path, "%s%s\\expansion-locale-%s.mpq", input_path, i->c_str(), i->c_str());
pArchiveNames.push_back(path);
sprintf(path, "%s%s\\locale-%s.mpq", input_path, i->c_str(), i->c_str());