/* ================== 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; }
// ===================================================================================== // 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)); }