62 for (MapData::iterator map_iter =
mapData.begin(); map_iter !=
mapData.end() && success; ++map_iter)
65 std::vector<ModelSpawn*> mapSpawns;
66 UniqueEntryMap::iterator entry;
67 printf(
"Calculating model bounds for map %u...\n", map_iter->first);
68 for (entry = map_iter->second->UniqueEntries.begin(); entry != map_iter->second->UniqueEntries.end(); ++entry)
71 if (entry->second.flags &
MOD_M2)
80 entry->second.iBound = entry->second.iBound + Vector3(533.33333f*32, 533.33333f*32, 0.f);
82 mapSpawns.push_back(&(entry->second));
86 printf(
"Creating map tree for map %u...\n", map_iter->first);
91 pTree.
build(mapSpawns, BoundsTrait<ModelSpawn*>::getBounds);
93 catch (std::exception& e)
95 printf(
"Exception ""%s"" when calling pTree.build", e.what());
100 std::map<uint32, uint32> modelNodeIdx;
101 for (
uint32 i=0; i<mapSpawns.size(); ++i)
102 modelNodeIdx.insert(pair<uint32, uint32>(mapSpawns[i]->ID, i));
105 std::stringstream mapfilename;
106 mapfilename <<
iDestDir <<
'/' << std::setfill(
'0') << std::setw(4) << map_iter->first <<
".vmtree";
107 FILE* mapfile = fopen(mapfilename.str().c_str(),
"wb");
111 printf(
"Cannot open %s\n", mapfilename.str().c_str());
116 if (success && fwrite(
VMAP_MAGIC, 1, 8, mapfile) != 8) success =
false;
118 pair<TileMap::iterator, TileMap::iterator> globalRange = map_iter->second->TileEntries.equal_range(globalTileID);
119 char isTiled = globalRange.first == globalRange.second;
120 if (success && fwrite(&isTiled,
sizeof(
char), 1, mapfile) != 1) success =
false;
122 if (success && fwrite(
"NODE", 4, 1, mapfile) != 1) success =
false;
125 if (success && fwrite(
"GOBJ", 4, 1, mapfile) != 1) success =
false;
127 for (TileMap::iterator glob=globalRange.first; glob != globalRange.second && success; ++glob)
137 TileMap &tileEntries = map_iter->second->TileEntries;
138 TileMap::iterator tile;
139 for (tile = tileEntries.begin(); tile != tileEntries.end(); ++tile)
141 const ModelSpawn &spawn = map_iter->second->UniqueEntries[tile->second];
144 uint32 nSpawns = tileEntries.count(tile->first);
145 std::stringstream tilefilename;
146 tilefilename.fill(
'0');
147 tilefilename <<
iDestDir <<
'/' << std::setw(4) << map_iter->first <<
'_';
150 tilefilename << std::setw(2) << x <<
'_' << std::setw(2) << y <<
".vmtile";
151 if (FILE* tilefile = fopen(tilefilename.str().c_str(),
"wb"))
154 if (success && fwrite(
VMAP_MAGIC, 1, 8, tilefile) != 8) success =
false;
156 if (success && fwrite(&nSpawns,
sizeof(
uint32), 1, tilefile) != 1) success =
false;
158 for (
uint32 s=0; s<nSpawns; ++s)
162 const ModelSpawn &spawn2 = map_iter->second->UniqueEntries[tile->second];
165 std::map<uint32, uint32>::iterator nIdx = modelNodeIdx.find(spawn2.
ID);
166 if (success && fwrite(&nIdx->second,
sizeof(
uint32), 1, tilefile) != 1) success =
false;
177 std::cout <<
"\nConverting Model Files" << std::endl;
180 std::cout <<
"Converting " << *mfile << std::endl;
183 std::cout <<
"error converting " << *mfile << std::endl;
190 for (MapData::iterator map_iter =
mapData.begin(); map_iter !=
mapData.end(); ++map_iter)
192 delete map_iter->second;
199 std::string fname =
iSrcDir +
"/dir_bin";
200 FILE* dirf = fopen(fname.c_str(),
"rb");
203 printf(
"Could not read dir_bin file!\n");
206 printf(
"Read coordinate mapping...\n");
207 uint32 mapID, tileX, tileY, check=0;
214 check += fread(&mapID,
sizeof(
uint32), 1, dirf);
217 check += fread(&tileX,
sizeof(
uint32), 1, dirf);
218 check += fread(&tileY,
sizeof(
uint32), 1, dirf);
223 MapData::iterator map_iter =
mapData.find(mapID);
226 printf(
"spawning Map %d\n", mapID);
229 else current = (*map_iter).second;
230 current->
UniqueEntries.insert(pair<uint32, ModelSpawn>(spawn.
ID, spawn));
233 bool success = (ferror(dirf) == 0);
333 FILE*
model_list = fopen((
iSrcDir +
"/" +
"temp_gameobject_models").c_str(),
"rb");
338 if (!model_list_copy)
344 uint32 name_length, displayId;
353 || name_length >=
sizeof(buff)
354 || fread(&buff,
sizeof(
char), name_length,
model_list) != name_length)
356 std::cout <<
"\nFile 'temp_gameobject_models' seems to be corrupted" << std::endl;
360 std::string model_name(buff, name_length);
363 if (!raw_model.
Read((
iSrcDir +
"/" + model_name).c_str()))
368 bool boundEmpty =
true;
371 std::vector<Vector3>& vertices = raw_model.
groupsArray[g].vertexArray;
373 uint32 nvectors = vertices.size();
374 for (
uint32 i = 0; i < nvectors; ++i)
376 Vector3& v = vertices[i];
378 bounds = AABox(v, v), boundEmpty =
false;
384 if (bounds.isEmpty())
386 std::cout <<
"\nModel " << std::string(buff, name_length) <<
" has empty bounding box" << std::endl;
390 if (!bounds.isFinite())
392 std::cout <<
"\nModel " << std::string(buff, name_length) <<
" has invalid bounding box" << std::endl;
395 fwrite(&displayId,
sizeof(
uint32), 1, model_list_copy);
396 fwrite(&name_length,
sizeof(
uint32), 1, model_list_copy);
397 fwrite(&buff,
sizeof(
char), name_length, model_list_copy);
398 fwrite(&bounds.low(),
sizeof(Vector3), 1, model_list_copy);
399 fwrite(&bounds.high(),
sizeof(Vector3), 1, model_list_copy);
403 fclose(model_list_copy);