/* ================== WriteMiptex ================== */ void WriteMiptex (void) { int i, len; byte *data; dmiptexlump_t *l; char *path; path = ValueForKey (&entities[0], "_wad"); if (!path || !path[0]) { path = ValueForKey (&entities[0], "wad"); if (!path || !path[0]) { printf ("WARNING: no wadfile specified\n"); texdatasize = 0; return; } } TEX_InitFromWad (path); AddAnimatingTextures (); l = (dmiptexlump_t *)dtexdata; data = (byte *)&l->dataofs[nummiptex]; l->nummiptex = nummiptex; for (i=0 ; i < nummiptex ; i++) { printf("miptex used: %s\n", miptex[i]); l->dataofs[i] = data - (byte *)l; len = LoadLump (miptex[i], data); if (data + len - dtexdata >= MAX_MAP_MIPTEX) Error ("Textures exceeded MAX_MAP_MIPTEX"); if (!len) l->dataofs[i] = -1; // didn't find the texture data += len; } texdatasize = data - dtexdata; }
/* ================== WriteMiptex ================== */ void WriteMiptex (void) { int i, len; int j; byte *data; unsigned int *ldata; dmiptexlump_t *l; char *path; char fullpath[1024]; #if 0 path = ValueForKey (&entities[0], "_wad"); if (!path || !path[0]) { path = ValueForKey (&entities[0], "wad"); if (!path || !path[0]) { printf ("WARNING: no wadfile specified\n"); texdatasize = 0; return; } } sprintf (fullpath, "%s/%s", gamedir, path); TEX_InitFromWad (fullpath); #endif AddAnimatingTextures (); l = (dmiptexlump_t *)dtexdata; data = (byte *)&l->dataofs[nummiptex]; l->nummiptex = nummiptex; for (i=0 ; i<nummiptex ; i++) { l->dataofs[i] = data - (byte *)l; len = LoadLump (miptex[i], data); if (!len) { #if 0 l->dataofs[i] = -1; // didn't find the texture #else l->dataofs[i] = (data - (byte *)l) | (1<<31); strncpy((char *)data, miptex[i], 16); data[15] = 0; for(j=0;data[j];j++) { data[j] = tolower(data[j]); } for(j=0;idtextures[j].name;j++) { if (strcmp((char *)data, idtextures[j].name) == 0) break; } if (!idtextures[j].name) { Error("Couldn't get dimensions for texture \"%s\"", data); } ldata = (unsigned int *)(data + 16); ldata[0] = LittleLong(idtextures[j].width); ldata[1] = LittleLong(idtextures[j].height); len = 24; #endif } if (data + len - dtexdata >= MAX_MAP_MIPTEX) Error ("Textures exceeded MAX_MAP_MIPTEX"); data += len; } texdatasize = data - dtexdata; }
bool cQuake3BSPFile::LoadMap(std::string filename) ///////////////////////////////////////////////////////////////////////////////////// { m_file = cFileManager::Singleton()->OpenFile(filename); sHeader header; cPlane *planes; sNode *nodes; int numNodes; sLeaf *leaves; int numLeaves; // Check if the file was loaded correctly if (!m_file) { LOG()->Print ("Couldn't open Q3 Map file %s.", filename.c_str()); return false; } // Read in the header m_file->Read (&header, sizeof(sHeader)); // Check the type of file if (header.magic != MAGIC_NUMBER || header.version != Q3BSP_VERSION) { LOG()->Print ("Invalid Q3 Map file %s.", filename.c_str()); cFileManager::Singleton()->CloseFile (m_file); return false; } // Load in the vertex lump m_numVertex = GetNumber(sizeof(cVertex), header.directory[q3VERTECIES]); m_vertex = (cVertex*)(LoadLump (header.directory[q3VERTECIES])); // Load in the face lump m_numFace = GetNumber (sizeof(sFace), header.directory[q3FACES]); m_face = (sFace*)(LoadLump (header.directory[q3FACES])); m_drawn = new bool[m_numFace]; // Load in the model lump m_numModel = GetNumber (sizeof(sModel), header.directory[q3MODELS]); m_model = (sModel*)(LoadLump (header.directory[q3MODELS])); // Load mesh vert lump m_numMeshVert = GetNumber (sizeof(sMeshVert), header.directory[q3MESHVERTS]); m_meshVert = (sMeshVert*)(LoadLump (header.directory[q3MESHVERTS])); // Load plane lump planes = (cPlane *)(LoadLump (header.directory[q3PLANES])); // Load node lump numNodes = GetNumber (sizeof(sNode), header.directory[q3NODES]); nodes = (sNode *)(LoadLump(header.directory[q3NODES])); // Load leaf lump numLeaves = GetNumber (sizeof(sLeaf), header.directory[q3LEAVES]); leaves = (sLeaf *)(LoadLump(header.directory[q3LEAVES])); // Load leafface m_numLeafFace = GetNumber (sizeof(int), header.directory[q3LEAFFACES]); m_leafFace = (int *)(LoadLump(header.directory[q3LEAFFACES])); // Convert the tree to our format ConvertTree (nodes, numNodes, planes, leaves, numLeaves); cFileManager::Singleton()->CloseFile (m_file); delete[] (void*)nodes; delete[] (void*)planes; delete[] (void*)leaves; return true; }
// ===================================================================================== // WriteMiptex // ===================================================================================== void WriteMiptex() { int len, texsize, totaltexsize = 0; byte* data; dmiptexlump_t* l; double start, end; g_texdatasize = 0; start = I_FloatTime(); { if (!TEX_InitFromWad()) return; AddAnimatingTextures(); } end = I_FloatTime(); Verbose("TEX_InitFromWad & AddAnimatingTextures elapsed time = %ldms\n", (long)(end - start)); start = I_FloatTime(); { int i; for (i = 0; i < nummiptex; i++) { lumpinfo_t* found; found = FindTexture(miptex + i); if (found) { miptex[i] = *found; } else { miptex[i].iTexFile = miptex[i].filepos = miptex[i].disksize = 0; } } } end = I_FloatTime(); Verbose("FindTextures elapsed time = %ldms\n", (long)(end - start)); start = I_FloatTime(); { int i; texinfo_t* tx = g_texinfo; // Sort them FIRST by wadfile and THEN by name for most efficient loading in the engine. qsort((void*)miptex, (size_t) nummiptex, sizeof(miptex[0]), lump_sorter_by_wad_and_name); // Sleazy Hack 104 Pt 2 - After sorting the miptex array, reset the texinfos to point to the right miptexs for (i = 0; i < g_numtexinfo; i++, tx++) { char* miptex_name = texmap64_retrieve(tx->miptex); tx->miptex = FindMiptex(miptex_name); // Free up the originally strdup()'ed miptex_name free(miptex_name); } } end = I_FloatTime(); Verbose("qsort(miptex) elapsed time = %ldms\n", (long)(end - start)); start = I_FloatTime(); { int i; // Now setup to get the miptex data (or just the headers if using -wadtextures) from the wadfile l = (dmiptexlump_t*)g_dtexdata; data = (byte*) & l->dataofs[nummiptex]; l->nummiptex = nummiptex; for (i = 0; i < nummiptex; i++) { l->dataofs[i] = data - (byte*) l; len = LoadLump(miptex + i, data, &texsize); if (!len) { l->dataofs[i] = -1; // didn't find the texture } else { totaltexsize += texsize; hlassume(totaltexsize < g_max_map_miptex, assume_MAX_MAP_MIPTEX); } data += len; } g_texdatasize = data - g_dtexdata; } end = I_FloatTime(); Log("Texture usage is at %1.2f mb (of %1.2f mb MAX)\n", (float)totaltexsize / (1024 * 1024), (float)g_max_map_miptex / (1024 * 1024)); Verbose("LoadLump() elapsed time = %ldms\n", (long)(end - start)); }