X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=wad.c;h=241c065ebd77dfc6dffe96912363b6a1a31b7662;hb=be8d986d89e9ac7408134d9570ec398e535536e8;hp=64d35d82ce46f132a599ccc42d0b00371cf99b6f;hpb=4ee1d4780706dc1ed70ec4f7aa8b7712518a5c4f;p=xonotic%2Fdarkplaces.git diff --git a/wad.c b/wad.c index 64d35d82..241c065e 100644 --- a/wad.c +++ b/wad.c @@ -158,11 +158,11 @@ void SwapPic (qpic_t *pic) } // LordHavoc: added alternate WAD2/WAD3 system for HalfLife texture wads -#define TEXWAD_MAXIMAGES 8192 +#define TEXWAD_MAXIMAGES 16384 typedef struct { char name[16]; - FILE *file; + QFile *file; int position; int size; } texwadlump_t; @@ -180,10 +180,10 @@ void W_LoadTextureWadFile (char *filename, int complain) wadinfo_t header; unsigned i, j; int infotableofs; - FILE *file; + QFile *file; int numlumps; - COM_FOpenFile (filename, &file, false); + COM_FOpenFile (filename, &file, false, false); if (!file) { if (complain) @@ -191,7 +191,7 @@ void W_LoadTextureWadFile (char *filename, int complain) return; } - if (fread(&header, sizeof(wadinfo_t), 1, file) != 1) + if (Qread(file, &header, sizeof(wadinfo_t)) != sizeof(wadinfo_t)) {Con_Printf ("W_LoadTextureWadFile: unable to read wad header");return;} if(header.identification[0] != 'W' @@ -204,14 +204,14 @@ void W_LoadTextureWadFile (char *filename, int complain) if (numlumps < 1 || numlumps > TEXWAD_MAXIMAGES) {Con_Printf ("W_LoadTextureWadFile: invalid number of lumps (%i)\n", numlumps);return;} infotableofs = LittleLong(header.infotableofs); - if (fseek(file, infotableofs, SEEK_SET)) + if (Qseek(file, infotableofs, SEEK_SET)) {Con_Printf ("W_LoadTextureWadFile: unable to seek to lump table");return;} if (!(lumps = qmalloc(sizeof(lumpinfo_t)*numlumps))) {Con_Printf ("W_LoadTextureWadFile: unable to allocate temporary memory for lump table");return;} - if (fread(lumps, sizeof(lumpinfo_t), numlumps, file) != numlumps) + if (Qread(file, lumps, sizeof(lumpinfo_t) * numlumps) != sizeof(lumpinfo_t) * numlumps) {Con_Printf ("W_LoadTextureWadFile: unable to read lump table");return;} - + for (i=0, lump_p = lumps ; iname, lump_p->name); @@ -236,7 +236,7 @@ void W_LoadTextureWadFile (char *filename, int complain) // leaves the file open } - +/* byte hlpalette[768] = { 0x00,0x00,0x00,0x0F,0x0F,0x0F,0x1F,0x1F,0x1F,0x2F,0x2F,0x2F,0x3F,0x3F,0x3F,0x4B, @@ -288,31 +288,78 @@ byte hlpalette[768] = 0xE7,0xFF,0xD7,0xFF,0xFF,0x67,0x00,0x00,0x8B,0x00,0x00,0xB3,0x00,0x00,0xD7,0x00, 0x00,0xFF,0x00,0x00,0xFF,0xF3,0x93,0xFF,0xF7,0xC7,0xFF,0xFF,0xFF,0x9F,0x5B,0x53, }; +*/ -byte *W_GetTexture(char *name, int matchwidth, int matchheight) +byte *W_ConvertWAD3Texture(miptex_t *tex) { - int i, c, datasize; - short colorcount; - FILE *file; - struct + byte *in, *data, *out, *pal; +// int palsize; + int d, p; + in = (byte *)((int) tex + tex->offsets[0]); + data = out = qmalloc(tex->width * tex->height * 4); + if (!data) + return NULL; + image_width = tex->width; + image_height = tex->height; + pal = in + (((image_width * image_height) * 85) >> 6); +// palsize = pal[1] * 0x100 + pal[0]; +// if (palsize >= 256) +// palsize = 256; + pal += 2; + for (d = 0;d < image_width * image_height;d++) { - char name[16]; - int width; - int height; - int ofs[4]; - } t; - byte pal[256][3], *indata, *outdata, *data; + p = *in++; + if (tex->name[0] == '{' && p == 255) + out[0] = out[1] = out[2] = out[3] = 0; + else + { + p *= 3; + out[0] = pal[p]; + out[1] = pal[p+1]; + out[2] = pal[p+2]; + out[3] = 255; + } + out += 4; + } + return data; +} + +byte *W_GetTexture(char *name) +{ +// int i, c, datasize; +// short colorcount; +// byte pal[256][3], *indata, *outdata, *data; + char texname[17]; + int i, j; + QFile *file; + miptex_t *tex; + byte *data; + texname[16] = 0; + W_CleanupName (name, texname); for (i = 0;i < TEXWAD_MAXIMAGES;i++) { if (texwadlump[i].name[0]) { - if (!strcmp(name, texwadlump[i].name)) // found it + if (!strcmp(texname, texwadlump[i].name)) // found it { file = texwadlump[i].file; - if (fseek(file, texwadlump[i].position, SEEK_SET)) - {Con_Printf("W_GetTexture: corrupt WAD3 file");return FALSE;} - if (fread(&t, sizeof(t), 1, file) != 1) - {Con_Printf("W_GetTexture: corrupt WAD3 file");return FALSE;} + if (Qseek(file, texwadlump[i].position, SEEK_SET)) + {Con_Printf("W_GetTexture: corrupt WAD3 file");return NULL;} + + tex = qmalloc(texwadlump[i].size); + if (!tex) + return NULL; + if (Qread(file, tex, texwadlump[i].size) < texwadlump[i].size) + {Con_Printf("W_GetTexture: corrupt WAD3 file");return NULL;} + + tex->width = LittleLong(tex->width); + tex->height = LittleLong(tex->height); + for (j = 0;j < MIPLEVELS;j++) + tex->offsets[j] = LittleLong(tex->offsets[j]); + data = W_ConvertWAD3Texture(tex); + qfree(tex); + return data; + /* image_width = LittleLong(t.width); image_height = LittleLong(t.height); if (matchwidth && image_width != matchwidth) @@ -320,23 +367,23 @@ byte *W_GetTexture(char *name, int matchwidth, int matchheight) if (matchheight && image_height != matchheight) continue; if (image_width & 15 || image_height & 15) - {Con_Printf("W_GetTexture: corrupt WAD3 file");return FALSE;} + {Con_Printf("W_GetTexture: corrupt WAD3 file");return NULL;} // allocate space for expanded image, // and load incoming image into upper area (overwritten as it expands) if (!(data = outdata = qmalloc(image_width*image_height*4))) - {Con_Printf("W_GetTexture: out of memory");return FALSE;} + {Con_Printf("W_GetTexture: out of memory");return NULL;} indata = outdata + image_width*image_height*3; datasize = image_width*image_height*85/64; // read the image data - if (fseek(file, texwadlump[i].position + sizeof(t), SEEK_SET)) - {Con_Printf("W_GetTexture: corrupt WAD3 file");return FALSE;} - if (fread(indata, 1, image_width*image_height, file) != image_width*image_height) - {Con_Printf("W_GetTexture: corrupt WAD3 file");return FALSE;} + if (Qseek(file, texwadlump[i].position + sizeof(t), SEEK_SET)) + {Con_Printf("W_GetTexture: corrupt WAD3 file");return NULL;} + if (Qread(file, indata, image_width*image_height) != image_width*image_height) + {Con_Printf("W_GetTexture: corrupt WAD3 file");return NULL;} // read the number of colors used (always 256) - if (fseek(file, texwadlump[i].position + sizeof(t) + datasize, SEEK_SET)) - {Con_Printf("W_GetTexture: corrupt WAD3 file");return FALSE;} - if (fread(&colorcount, 2, 1, file) != 1) - {Con_Printf("W_GetTexture: corrupt WAD3 file");return FALSE;} + if (Qseek(file, texwadlump[i].position + sizeof(t) + datasize, SEEK_SET)) + {Con_Printf("W_GetTexture: corrupt WAD3 file");return NULL;} + if (Qread(file, &colorcount, 2) != 2) + {Con_Printf("W_GetTexture: corrupt WAD3 file");return NULL;} if (texwadlump[i].size > (datasize + sizeof(t))) { colorcount = LittleShort(colorcount); @@ -344,9 +391,9 @@ byte *W_GetTexture(char *name, int matchwidth, int matchheight) if (colorcount < 0) colorcount = 0; if (colorcount > 256) colorcount = 256; // read the palette - // fseek(file, texwadlump[i].position + sizeof(t) + datasize + 2, SEEK_SET); - if (fread(&pal, 3, colorcount, file) != colorcount) - {Con_Printf("W_GetTexture: corrupt WAD3 file");return FALSE;} + // Qseek(file, texwadlump[i].position + sizeof(t) + datasize + 2, SEEK_SET); + if (Qread(file, &pal, 3 * colorcount) != 3 * colorcount) + {Con_Printf("W_GetTexture: corrupt WAD3 file");return NULL;} } else memcpy(&pal, hlpalette, 768); @@ -354,22 +401,19 @@ byte *W_GetTexture(char *name, int matchwidth, int matchheight) for (i = 0;i < image_width*image_height;i++) { c = *indata++; - if (c == 255) // transparent color - { - *outdata++ = 0; - *outdata++ = 0; - *outdata++ = 0; - *outdata++ = 0; - } + if (name[0] == '{' && c == 255) + outdata[0] = outdata[1] = outdata[2] = outdata[3] = 0; else { - *outdata++ = pal[c][0]; - *outdata++ = pal[c][1]; - *outdata++ = pal[c][2]; - *outdata++ = 255; + outdata[0] = pal[c][0]; + outdata[1] = pal[c][1]; + outdata[2] = pal[c][2]; + outdata[3] = 255; } + outdata += 4; } return data; + */ } } else