gtkradiant/plugins/vfswad/unwad.h
2012-03-17 15:01:54 -05:00

111 lines
2.7 KiB
C

#ifndef _WAD3_H_
#define _WAD3_H_
// WAD3 (Half-Life) Header and mip structs
// WAD2 (Quake) Header and mip structs added by LordHavoc
#define WADBUFSIZE 32768
#define WAD2_TYPE_MIP 0x44
#define WAD2_ID ( 'W' | 'A' << 8 | 'D' << 16 | '2' << 24 )
#define WAD3_TYPE_MIP 0x43
#define WAD3_ID ( 'W' | 'A' << 8 | 'D' << 16 | '3' << 24 )
#define GET_MIP_DATA_SIZE( WIDTH, HEIGHT ) ( ( WIDTH * HEIGHT ) + ( WIDTH * HEIGHT / 4 ) + ( WIDTH * HEIGHT / 16 ) + ( WIDTH * HEIGHT / 64 ) )
/*
WAD3 pseudo-structure:
WAD3 Header
Mip section
First mip
Mip header
First mip (width * height)
Second mip (width * height / 4)
Third mip (width * height / 16)
Fourth mip (width * height / 64)
Palette size (WORD)
Palette (Palette size * 3)
Padding (WORD)
[...]
Last mip
Lump table
First lump entry
Lump header
[...]
Last lump entry
WAD2 pseudo-structure:
WAD2 Header
Mip section
First mip
Mip header
First mip (width * height)
Second mip (width * height / 4)
Third mip (width * height / 16)
Fourth mip (width * height / 64)
[...]
Last mip
Lump table
First lump entry
Lump header
[...]
Last lump entry
*/
#define DWORD unsigned int
#define BYTE unsigned char
#define WORD unsigned short int
typedef struct
{
DWORD identification;
DWORD numlumps;
DWORD infotableofs; // Lump table
} WAD3_HEADER, *LPWAD3_HEADER;
typedef struct
{
DWORD filepos;
DWORD disksize;
DWORD size; // uncompressed
BYTE type;
BYTE compression;
BYTE pad1, pad2;
char name[16]; // must be null terminated
} WAD3_LUMP, *LPWAD3_LUMP;
typedef struct
{
char name[16];
DWORD width, height;
DWORD offsets[4]; // four mip maps stored
} WAD3_MIP, *LPWAD3_MIP;
typedef struct wadFile_s
{
FILE * fin;
LPWAD3_HEADER lpHeader;
LPWAD3_LUMP lpLump;
LPWAD3_MIP lpMip;
DWORD FileSize;
unsigned long currentfile;
char *wadfilename;
} wadFile_t;
wadFile_t *wadOpen( const char* path );
wadFile_t *wadCleanup( wadFile_t *wf );
int wadGoToFirstFile( wadFile_t *wf );
int wadGetCurrentFileInfo( wadFile_t *wf, char *szFileName, unsigned long fileNameBufferSize, unsigned long *filesize );
int wadGoToNextFile( wadFile_t *wf );
int wadOpenCurrentFileByNum( wadFile_t *wf, unsigned long filenumber );
void wadCloseCurrentFile( wadFile_t *wf );
unsigned long wadReadCurrentFile( wadFile_t *wf, char *bufferptr, unsigned long size );
#endif // #ifndef _WAD3_H_