diff options
Diffstat (limited to 'contrib')
| -rw-r--r-- | contrib/extractor/System.cpp | 118 | ||||
| -rw-r--r-- | contrib/extractor/ad.exe | bin | 160768 -> 167936 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 | 293888 -> 184320 bytes | |||
| -rw-r--r-- | contrib/vmap_extract_assembler_bin/vmapextract_v2.exe | bin | 217088 -> 233472 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, 758 insertions, 527 deletions
diff --git a/contrib/extractor/System.cpp b/contrib/extractor/System.cpp index 1753f40801a..197c4d35416 100644 --- a/contrib/extractor/System.cpp +++ b/contrib/extractor/System.cpp @@ -16,24 +16,21 @@ extern unsigned int iRes; extern ArchiveSet gOpenArchives; -bool ConvertADT(char*, char*); +bool ConvertADT(char*,char*); -typedef struct -{ +typedef struct{ char name[64]; - uint32 id; -} map_id; + unsigned int id; +}map_id; typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; -map_id *map_ids; -uint16 *areas; -uint16 *LiqType; -char output_path[128] = "."; -char input_path[128] = "."; -uint32 maxAreaId = 0; +map_id * map_ids; +uint16 * areas; +char output_path[128]="."; +char input_path[128]="."; enum Extract { @@ -69,45 +66,46 @@ 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]); } @@ -124,12 +122,12 @@ uint32 ReadMapDBC() DBCFile dbc("DBFilesClient\\Map.dbc"); dbc.open(); - size_t map_count = dbc.getRecordCount(); - map_ids = new map_id[map_count]; - for(uint32 x = 0; x < map_count; ++x) + uint32 map_count=dbc.getRecordCount(); + map_ids=new map_id[map_count]; + for(unsigned int 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; @@ -137,39 +135,20 @@ uint32 ReadMapDBC() void ReadAreaTableDBC() { - printf("Read AreaTable.dbc file..."); + printf("Read AreaTable.dbc file... "); DBCFile dbc("DBFilesClient\\AreaTable.dbc"); dbc.open(); - 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) + 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) 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]; @@ -180,28 +159,27 @@ 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(uint32 x = 0; x < ADT_RES; ++x) + for(unsigned int x = 0; x < ADT_RES; ++x) { - for(uint32 y = 0; y < ADT_RES; ++y) + for(unsigned int y = 0; y < ADT_RES; ++y) { - for(uint32 z = 0; z < map_count; ++z) + for(unsigned int 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 progress bar - printf("Processing........................%d%%\r", (100 * done) / total); + //draw progess bar + printf("Processing........................%d%%\r",(100*done)/total); } } @@ -244,7 +222,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()); @@ -283,9 +261,7 @@ void LoadCommonMPQFiles() { char filename[512]; - sprintf(filename,"%s/Data/common-2.MPQ", input_path); - new MPQArchive(filename); - sprintf(filename,"%s/Data/lichking.MPQ", input_path); + sprintf(filename,"%s/Data/common.MPQ", input_path); new MPQArchive(filename); sprintf(filename,"%s/Data/expansion.MPQ", input_path); new MPQArchive(filename); @@ -295,7 +271,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 f483f3892f9..2dc24c0872e 100644 --- a/contrib/extractor/ad.exe +++ b/contrib/extractor/ad.exe diff --git a/contrib/extractor/adt.cpp b/contrib/extractor/adt.cpp index 71cbf88a37b..26adaa28537 100644 --- a/contrib/extractor/adt.cpp +++ b/contrib/extractor/adt.cpp @@ -15,15 +15,16 @@ #include "adt.h" #include "mpq_libmpq.h" -uint32 iRes = 256; -extern uint16 *areas; -extern uint16 *LiqType; -extern uint32 maxAreaId; +//#include <windows.h> +unsigned int iRes=256; +extern uint16*areas; vec wmoc; -Cell *cell; +Cell * cell; +uint32 wmo_count; mcell *mcells; + int holetab_h[4] = {0x1111, 0x2222, 0x4444, 0x8888}; int holetab_v[4] = {0x000F, 0x00F0, 0x0F00, 0xF000}; @@ -34,84 +35,56 @@ bool LoadADT(char* filename) if(mf.isEof()) { - //printf("No such file %s\n", filename); + //printf("No such file.\n"); return false; } + mcells=new mcell; - 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; + wmoc.x =65*TILESIZE; + wmoc.z =65*TILESIZE; size_t mcnk_offsets[256], mcnk_sizes[256]; - chunk_num = 0; - k = 0; - m = 0; + wmo_count=0; + bool found=false; + //uint32 fs=mf.getSize()-3; + //while (mf.getPos()<fs) while (!mf.isEof()) { uint32 fourcc; - mf.read(&fourcc, 4); + mf.read(&fourcc,4); mf.read(&size, 4); size_t nextpos = mf.getPos() + size; - - //if(fourcc==0x4d484452) // MHDR header - //if(fourcc==0x4d564552) // MVER - if(fourcc == 0x4d43494e) // MCIN + switch(fourcc) { - for (uint32 i = 0; i < 256; ++i) + case 0x4d43494e: // MCIN { - mf.read(&mcnk_offsets[i], 4); - mf.read(&mcnk_sizes[i], 4); - mf.seekRelative(8); + //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; } - } - //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) + case 0x4d4f4446: // MODF { - mf.read(LiqOffsData, 0x0C); - header_pos = mf.getPos(); - if(LiqOffsData->offsData1 != 0) // если данные в Data1 о воде есть, то их надо конвертировать + /* + if(size) { - // переходим по смещению из 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) + //printf("\nwmo count %d\n",size/64); + wmo_count =size/64; + for (int i=0; i<wmo_count; i++) { - ChunkLiqHeight[j] = -999999; // no liquid/water + int id; + mf.read(&id, 4); + WMO *wmo = (WMO*)wmomanager.items[wmomanager.get(wmos[id])]; + WMOInstance inst(wmo, mf); + wmois.push_back(inst); } -<<<<<<< HEAD:contrib/extractor/adt.cpp }*/ break; @@ -125,38 +98,14 @@ 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 { - 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 - } + std::string path(p); + p+=strlen(p)+1; + fixname(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; + wmomanager.add(path); + wmos.push_back(path); } -<<<<<<< HEAD:contrib/extractor/adt.cpp delete[] buf; }*/ break; @@ -177,50 +126,77 @@ 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 - chunk_num = 0; - k = 0; - m = 0; - for (int j = 0; j < 16; ++j) - { - for (int i = 0; i < 16; ++i) + 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])); - ++chunk_num; + mf.seek((int)mcnk_offsets[j*16+i]); + LoadMapChunk(mf,&(mcells->ch[i][j])); } - } + + /* + 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; @@ -231,267 +207,295 @@ inline void LoadMapChunk(MPQFile &mf, chunk *_chunk) mf.read(&size, 4); size_t lastpos = mf.getPos() + size; - mf.read(&header, 0x80); // what if header size got changed? - _chunk->area_id = header.areaid; + mf.read(&header, 0x80); + _chunk->area_id =header.areaid ; + _chunk->flag =0; 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; - //printf("LMC: flags %X\n", chunkflags); - float zmin = 999999999.0f; - float zmax = -999999999.0f; - // must be there, bl!zz uses some crazy format + float zmin=999999999.0f; + float zmax=-999999999.0f; + //must be there, bl!zz uses some crazy format + int nTextures; while (mf.getPos() < lastpos) { - mf.read(&fourcc, 4); + mf.read(&fourcc,4); mf.read(&size, 4); - size_t nextpos = mf.getPos() + size; - if(fourcc == 0x4d435654) // MCVT + //if(size!=580) + // printf("\n sz=%d",size); + 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) // не будем учитывать если уже были данные в MH2O, перестраховка :) // MCLQ + else if(fourcc==0x4d434c51) // MCLQ { // liquid / water level + //bool haswater; char fcc1[5]; - mf.read(fcc1, 4); + mf.read(fcc1,4); flipcc(fcc1); - fcc1[4] = 0; - float *ChunkLiqHeight = new float[81]; + fcc1[4]=0; - if (!strcmp(fcc1, "MCSE")) + if (!strcmp(fcc1,"MCSE")) { - for(int j = 0; j < 81; ++j) - { - ChunkLiqHeight[j] = -999999; // no liquid/water - } + for(int i=0;i<9;i++) + for(int j=0;j<9;j++) + _chunk->waterlevel[i][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); - if(liq.height > maxheight) - ChunkLiqHeight[j] = -999999; - else - ChunkLiqHeight[j] = h; - } + 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(chunkflags & 4 || chunkflags & 8) - MapLiqFlag[chunk_num] |= 1; // water + _chunk->flag |=1; 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.0f; + v[1].x=UNITSIZE; + v[1].y =cell->v9[xc+1][zc]; + v[1].z=0; } else { - v[1].x = 0.0f; - v[1].y = cell->v9[xc][zc + 1]; - v[1].z = UNITSIZE; + v[1].x=0.0; + 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.0f; - v[2].y = cell->v9[xc][zc]; - v[2].z = 0.0f; + v[2].x=0; + v[2].y=cell->v9[xc][zc]; + v[2].z=0; } - return -solve(v, &p); + return -solve(v,&p); } } -inline void TransformData() +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() { - cell = new Cell; + cell= new Cell; - for(uint32 x = 0; x < 128; ++x) + for(int x=0;x<128;x++) { - for(uint32 y = 0; y < 128; ++y) + for(int 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.01"; +const char MAP_MAGIC[] = "MAP_2.00"; -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); - delete [] MapLiqHeight; - delete [] MapLiqFlag; + printf("Can't create the output file '%s'\n",filename2); return false; } // write magic header - fwrite(MAP_MAGIC, 1, 8, output); + fwrite(MAP_MAGIC,1,8,output); - for(uint32 x = 0; x < 16; ++x) + for(unsigned int x=0;x<16;x++) { - for(uint32 y = 0; y < 16; ++y) + for(unsigned int y=0;y<16;y++) { - if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id <= maxAreaId) + if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id < 0x102D) { - 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); } } } - fwrite(MapLiqFlag, 1, 256, output); - delete [] MapLiqFlag; + 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(MapLiqHeight, sizeof(float), 16384, output); - delete [] MapLiqHeight; + TransformWaterData(); + 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(uint32 x = 0; x < iRes; ++x) + for(unsigned int x=0;x<iRes;x++) + for(unsigned int y=0;y<iRes;y++) { - for(uint32 y = 0; y < iRes; ++y) - { - float z = (float)GetZ( - (((double)(y)) * TILESIZE) / ((double)(iRes - 1)), - (((double)(x)) * TILESIZE) / ((double)(iRes - 1))); + 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 ec607c9d7bc..6e079461a66 100644 --- a/contrib/extractor/adt.h +++ b/contrib/extractor/adt.h @@ -9,121 +9,46 @@ 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; - -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; +}triangle; -typedef struct -{ - chunk ch[16][16]; -} mcell; +typedef struct{ +float v9[16*8+1][16*8+1]; +float v8[16*8][16*8]; +}Cell; -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; -}; +typedef struct{ +double v9[9][9]; +double v8[8][8]; +uint16 area_id; +//Liquid *lq; +float waterlevel[9][9]; +uint8 flag; +}chunk; -typedef struct -{ - uint32 offsData1; - uint32 used; - uint32 offsData2; -} MH2O_offsData; +class WMO; +class WMOManager; +void fixname(std::string &name); typedef struct { - 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 -}; - +chunk ch[16][16]; +}mcell; class MPQFile; - -float *MapLiqHeight; -uint8 *MapLiqFlag; -uint32 k, m, chunk_num; -void LoadMapChunk(MPQFile &, chunk*); +void LoadMapChunk(MPQFile &,chunk*); +bool LoadWMO(char* filename); #endif diff --git a/contrib/vmap_extract_assembler_bin/vmap_assembler.exe b/contrib/vmap_extract_assembler_bin/vmap_assembler.exe Binary files differindex a6ef74dc086..5cb08f770aa 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 03c76907658..c38b6e64f64 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 1d0c17d52e6..7dca7841d74 100644 --- a/contrib/vmap_extractor_v2/vmapextract/model.cpp +++ b/contrib/vmap_extractor_v2/vmapextract/model.cpp @@ -1,7 +1,11 @@ +//#include "common.h" #include "model.h" +//#include "world.h" #include <cassert> #include <algorithm> +//int globalTime = 0; + Model::Model(std::string &filename) : filename(filename) { } @@ -20,31 +24,121 @@ bool Model::open() } memcpy(&header, f.getBuffer(), sizeof(ModelHeader)); - 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++) + if(header.nBoundingTriangles > 0) { + +#if 0 + animated = isAnimated(f); + if(animated) { - vertices[i] = fixCoordSystem(vertices[i]); + 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++) + { + indices[i] = indexLookup[triangles[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) { @@ -57,8 +151,7 @@ bool Model::ConvertToVMAPModel(char * outfilename) return false; } fwrite("VMAP002",8,1,output); - uint32 nVertices = 0; - nVertices = header.nBoundingVertices; + int nVertices = header.nVertices; fwrite(&nVertices, sizeof(int), 1, output); uint32 nofgroups = 1; fwrite(&nofgroups,sizeof(uint32), 1, output); @@ -69,16 +162,15 @@ bool Model::ConvertToVMAPModel(char * outfilename) wsize = sizeof(branches) + sizeof(uint32) * branches; fwrite(&wsize, sizeof(int), 1, output); fwrite(&branches,sizeof(branches), 1, output); - uint32 nIndexes = 0; - nIndexes = header.nBoundingTriangles; - fwrite(&nIndexes,sizeof(uint32), 1, output); + uint32 nIdexes = (uint32) nIndices; + fwrite(&nIndices,sizeof(uint32), 1, output); fwrite("INDX",4, 1, output); - wsize = sizeof(uint32) + sizeof(unsigned short) * nIndexes; + wsize = sizeof(uint32) + sizeof(unsigned short) * nIdexes; fwrite(&wsize, sizeof(int), 1, output); - fwrite(&nIndexes, sizeof(uint32), 1, output); - if(nIndexes >0) + fwrite(&nIdexes, sizeof(uint32), 1, output); + if(nIdexes >0) { - fwrite(indices, sizeof(unsigned short), nIndexes, output); + fwrite(indices, sizeof(unsigned short), nIdexes, output); } fwrite("VERT",4, 1, output); wsize = sizeof(int) + sizeof(float) * 3 * nVertices; @@ -86,7 +178,7 @@ bool Model::ConvertToVMAPModel(char * outfilename) fwrite(&nVertices, sizeof(int), 1, output); if(nVertices >0) { - for(uint32 vpos=0; vpos <nVertices; ++vpos) + for(int vpos=0; vpos <nVertices; ++vpos) { float sy = vertices[vpos].y; vertices[vpos].y = vertices[vpos].z; @@ -97,6 +189,7 @@ 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 a2bdee9465b..0af492f922c 100644 --- a/contrib/vmap_extractor_v2/vmapextract/model.h +++ b/contrib/vmap_extractor_v2/vmapextract/model.h @@ -4,6 +4,7 @@ #include "vec3d.h" #include "mpq.h" #include "modelheaders.h" +//#include "quaternion.h" #include <vector> class Model; @@ -17,14 +18,18 @@ Vec3D fixCoordSystem(Vec3D v); class Model { public: - ModelHeader header; + ModelAnimation *anims; + int *globalSequences; public: + bool animGeometry,animTextures,animBones; + bool animated; - uint32 offsBB_vertices, offsBB_indices; - Vec3D *BB_vertices, *vertices; - uint16 *BB_indices, *indices; + bool isAnimated(MPQFile &f); + ModelVertex *origVertices; + Vec3D *vertices, *normals; + uint16 *indices; size_t nIndices; bool open(); @@ -33,6 +38,12 @@ public: public: bool ok; + bool ind; + + float rad; + float trans; + bool animcalc; + int anim, animtime; Model(std::string &filename); ~Model(); @@ -48,9 +59,15 @@ public: Model *model; int id; + Vec3D pos, rot; unsigned int d1, scale; - float w,sc; + + float frot,w,sc; + + int light; + Vec3D ldir; + Vec3D lcol; 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 c35b983c19b..7d5e800e796 100644 --- a/contrib/vmap_extractor_v2/vmapextract/modelheaders.h +++ b/contrib/vmap_extractor_v2/vmapextract/modelheaders.h @@ -15,67 +15,289 @@ struct ModelHeader { uint8 version[4]; uint32 nameLength; uint32 nameOfs; - uint32 type; + uint32 type; + uint32 nGlobalSequences; uint32 ofsGlobalSequences; uint32 nAnimations; uint32 ofsAnimations; - uint32 nAnimationLookup; - uint32 ofsAnimationLookup; - uint32 nBones; - uint32 ofsBones; - uint32 nKeyBoneLookup; - uint32 ofsKeyBoneLookup; + uint32 nC; + uint32 ofsC; + uint32 nD; + uint32 ofsD; + uint32 nBones; + uint32 ofsBones; + uint32 nF; + uint32 ofsF; + uint32 nVertices; uint32 ofsVertices; uint32 nViews; + uint32 ofsViews; + uint32 nColors; uint32 ofsColors; + uint32 nTextures; uint32 ofsTextures; - uint32 nTransparency; + + uint32 nTransparency; // H uint32 ofsTransparency; - 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; + 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; }; + +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 0d2b39f8d06..dfc7cddcfdd 100644 --- a/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp +++ b/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp @@ -421,10 +421,6 @@ 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); @@ -436,8 +432,6 @@ 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()); |
