diff options
Diffstat (limited to 'contrib')
| -rw-r--r-- | contrib/extractor/System.cpp | 118 | ||||
| -rw-r--r-- | contrib/extractor/ad.exe | bin | 167936 -> 160768 bytes | |||
| -rw-r--r-- | contrib/extractor/adt.cpp | 532 | ||||
| -rw-r--r-- | contrib/extractor/adt.h | 141 | ||||
| -rw-r--r-- | contrib/vmap_extract_assembler_bin/vmap_assembler.exe | bin | 184320 -> 293888 bytes | |||
| -rw-r--r-- | contrib/vmap_extract_assembler_bin/vmapextract_v2.exe | bin | 233472 -> 217088 bytes | |||
| -rw-r--r-- | contrib/vmap_extractor_v2/vmapextract/model.cpp | 145 | ||||
| -rw-r--r-- | contrib/vmap_extractor_v2/vmapextract/model.h | 27 | ||||
| -rw-r--r-- | contrib/vmap_extractor_v2/vmapextract/modelheaders.h | 316 | ||||
| -rw-r--r-- | contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp | 6 |
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 Binary files differindex 2dc24c0872e..f483f3892f9 100644 --- a/contrib/extractor/ad.exe +++ b/contrib/extractor/ad.exe 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 Binary files differindex 5cb08f770aa..a6ef74dc086 100644 --- a/contrib/vmap_extract_assembler_bin/vmap_assembler.exe +++ b/contrib/vmap_extract_assembler_bin/vmap_assembler.exe diff --git a/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe b/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe Binary files differindex c38b6e64f64..03c76907658 100644 --- a/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe +++ b/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe 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()); |
