ModelInstance::ModelInstance(CASCFile& f, char const* ModelInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile) : id(0), scale(0), flags(0) { float ff[3]; f.read(&id, 4); f.read(ff, 12); pos = fixCoords(Vec3D(ff[0], ff[1], ff[2])); f.read(ff, 12); rot = Vec3D(ff[0], ff[1], ff[2]); f.read(&scale, 2); f.read(&flags, 2); // scale factor - divide by 1024. blizzard devs must be on crack, why not just use a float? sc = scale / 1024.0f; char tempname[512]; sprintf(tempname, "%s/%s", szWorkDirWmo, ModelInstName); FILE* input = fopen(tempname, "r+b"); if (!input) { //printf("ModelInstance::ModelInstance couldn't open %s\n", tempname); return; } fseek(input, 8, SEEK_SET); // get the correct no of vertices int nVertices; int count = fread(&nVertices, sizeof (int), 1, input); fclose(input); if (count != 1 || nVertices == 0) return; uint16 adtId = 0;// not used for models uint32 tcflags = MOD_M2; if (tileX == 65 && tileY == 65) tcflags |= MOD_WORLDSPAWN; //write mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, name fwrite(&mapID, sizeof(uint32), 1, pDirfile); fwrite(&tileX, sizeof(uint32), 1, pDirfile); fwrite(&tileY, sizeof(uint32), 1, pDirfile); fwrite(&tcflags, sizeof(uint32), 1, pDirfile); fwrite(&adtId, sizeof(uint16), 1, pDirfile); fwrite(&id, sizeof(uint32), 1, pDirfile); fwrite(&pos, sizeof(float), 3, pDirfile); fwrite(&rot, sizeof(float), 3, pDirfile); fwrite(&sc, sizeof(float), 1, pDirfile); uint32 nlen = strlen(ModelInstName); fwrite(&nlen, sizeof(uint32), 1, pDirfile); fwrite(ModelInstName, sizeof(char), nlen, pDirfile); /* int realx1 = (int) ((float) pos.x / 533.333333f); int realy1 = (int) ((float) pos.z / 533.333333f); int realx2 = (int) ((float) pos.x / 533.333333f); int realy2 = (int) ((float) pos.z / 533.333333f); fprintf(pDirfile,"%s/%s %f,%f,%f_%f,%f,%f %f %d %d %d,%d %d\n", MapName, ModelInstName, (float) pos.x, (float) pos.y, (float) pos.z, (float) rot.x, (float) rot.y, (float) rot.z, sc, nVertices, realx1, realy1, realx2, realy2 ); */ }
WMOInstance::WMOInstance(CASCFile& f, char const* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, uint32 originalMapId, FILE* pDirfile, std::vector<ADTOutputCache>* dirfileCache) : currx(0), curry(0), wmo(NULL), doodadset(0), pos(), indx(0), id(0) { float ff[3]; f.read(&id, 4); f.read(ff,12); pos = Vec3D(ff[0],ff[1],ff[2]); f.read(ff,12); rot = Vec3D(ff[0],ff[1],ff[2]); f.read(ff,12); pos2 = Vec3D(ff[0],ff[1],ff[2]); // bounding box corners f.read(ff,12); pos3 = Vec3D(ff[0],ff[1],ff[2]); // bounding box corners uint16 fflags; f.read(&fflags, 2); uint16 doodadSet; f.read(&doodadSet, 2); uint16 trash,adtId; f.read(&adtId,2); f.read(&trash,2); // destructible wmo, do not dump. we can handle the vmap for these // in dynamic tree (gameobject vmaps) if ((fflags & 0x01) != 0) return; //-----------add_in _dir_file---------------- char tempname[512]; sprintf(tempname, "%s/%s", szWorkDirWmo, WmoInstName); FILE *input; input = fopen(tempname, "r+b"); if(!input) { printf("WMOInstance::WMOInstance: couldn't open %s\n", tempname); return; } fseek(input, 8, SEEK_SET); // get the correct no of vertices int nVertices; int count = fread(&nVertices, sizeof (int), 1, input); fclose(input); if (count != 1 || nVertices == 0) return; float x,z; x = pos.x; z = pos.z; if(x==0 && z == 0) { pos.x = 533.33333f*32; pos.z = 533.33333f*32; } pos = fixCoords(pos); pos2 = fixCoords(pos2); pos3 = fixCoords(pos3); float scale = 1.0f; uint32 flags = MOD_HAS_BOUND; if (tileX == 65 && tileY == 65) flags |= MOD_WORLDSPAWN; if (mapID != originalMapId) flags |= MOD_PARENT_SPAWN; //write mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, Bound_lo, Bound_hi, name fwrite(&mapID, sizeof(uint32), 1, pDirfile); fwrite(&tileX, sizeof(uint32), 1, pDirfile); fwrite(&tileY, sizeof(uint32), 1, pDirfile); fwrite(&flags, sizeof(uint32), 1, pDirfile); fwrite(&adtId, sizeof(uint16), 1, pDirfile); fwrite(&id, sizeof(uint32), 1, pDirfile); fwrite(&pos, sizeof(float), 3, pDirfile); fwrite(&rot, sizeof(float), 3, pDirfile); fwrite(&scale, sizeof(float), 1, pDirfile); fwrite(&pos2, sizeof(float), 3, pDirfile); fwrite(&pos3, sizeof(float), 3, pDirfile); uint32 nlen = strlen(WmoInstName); fwrite(&nlen, sizeof(uint32), 1, pDirfile); fwrite(WmoInstName, sizeof(char), nlen, pDirfile); if (dirfileCache) { dirfileCache->emplace_back(); ADTOutputCache& cacheModelData = dirfileCache->back(); cacheModelData.Flags = flags & ~MOD_PARENT_SPAWN; cacheModelData.Data.resize( sizeof(uint16) + // adtId sizeof(uint32) + // id sizeof(float) * 3 + // pos sizeof(float) * 3 + // rot sizeof(float) + // scale sizeof(float) * 3 + // pos2 sizeof(float) * 3 + // pos3 sizeof(uint32) + // nlen nlen); // WmoInstName uint8* cacheData = cacheModelData.Data.data(); #define CACHE_WRITE(value, size, count, dest) memcpy(dest, value, size * count); dest += size * count; CACHE_WRITE(&adtId, sizeof(uint16), 1, cacheData); CACHE_WRITE(&id, sizeof(uint32), 1, cacheData); CACHE_WRITE(&pos, sizeof(float), 3, cacheData); CACHE_WRITE(&rot, sizeof(float), 3, cacheData); CACHE_WRITE(&scale, sizeof(float), 1, cacheData); CACHE_WRITE(&pos2, sizeof(float), 3, cacheData); CACHE_WRITE(&pos3, sizeof(float), 3, cacheData); CACHE_WRITE(&nlen, sizeof(uint32), 1, cacheData); CACHE_WRITE(WmoInstName, sizeof(char), nlen, cacheData); #undef CACHE_WRITE } /* fprintf(pDirfile,"%s/%s %f,%f,%f_%f,%f,%f 1.0 %d %d %d,%d %d\n", MapName, WmoInstName, (float) x, (float) pos.y, (float) z, (float) rot.x, (float) rot.y, (float) rot.z, nVertices, realx1, realy1, realx2, realy2 ); */ // fclose(dirfile); }