mirror of
https://github.com/id-Software/DOOM-iOS.git
synced 2024-11-10 06:31:53 +00:00
160 lines
4.7 KiB
C
160 lines
4.7 KiB
C
/*
|
|
* ipak.h
|
|
* General purpose data file management intended to be used
|
|
* as a read-only memory mapped file to play nice with iPhone OS's
|
|
* non-swapping and variable memory management.
|
|
*
|
|
* Created by John Carmack on 4/9/09.
|
|
* Copyright 2009 id Software. All rights reserved.
|
|
*
|
|
*/
|
|
|
|
//============================================================
|
|
//
|
|
// In-file structures
|
|
//
|
|
// These stuctures are in the mapped data file, and shared
|
|
// between the app and utility.
|
|
//
|
|
// Type headers are stored separately from the bulk data to minimize the
|
|
// number of active pages.
|
|
//
|
|
// The full hash of the name is stored in nameHash, and nameHash&(PK_HASH_BUCKETS-1) is
|
|
// used to chain structures of a particular type together.
|
|
//
|
|
//============================================================
|
|
|
|
#define MAX_PK_NAME 64
|
|
typedef struct {
|
|
int nameHash; // PK_HashName( name )
|
|
int nextOnHashChain; // -1 = end of chain
|
|
char name[MAX_PK_NAME]; // in canonical form: backslashes to slashes and lowercase
|
|
} pkName_t;
|
|
|
|
#define PK_HASH_CHAINS 256
|
|
typedef struct {
|
|
int tableOfs; // // &firstStruct = (byte *)dfHeader + tableOfs
|
|
int count;
|
|
int structSize; // sizeof( pkWavData_t ), etc
|
|
int hashChains[PK_HASH_CHAINS]; // -1 = end of chain
|
|
} pkType_t;
|
|
|
|
// dfWavData holds everything necessary to fully create an OpenAL sample buffer
|
|
typedef struct {
|
|
pkName_t name;
|
|
int wavDataOfs;
|
|
int wavChannels; // 1 or 2
|
|
int wavChannelBytes; // 1 or 2
|
|
int wavRate; // 22050, etc
|
|
int wavNumSamples; // each sample holds all the channels
|
|
// we may want looping information here later
|
|
} pkWavData_t;
|
|
|
|
// iPhone does not natively support palettized textures, but we
|
|
// might conceivably want to support luminance and intensity textures
|
|
// in the future.
|
|
typedef enum {
|
|
TF_565,
|
|
TF_5551,
|
|
TF_4444,
|
|
TF_8888,
|
|
TF_LA,
|
|
TF_PVR4,
|
|
TF_PVR4A,
|
|
TF_PVR2,
|
|
TF_PVR2A,
|
|
} textureFormat_t;
|
|
|
|
// dfImageData_t holds everything necessary to fully create an OpenGL texture object
|
|
typedef struct {
|
|
pkName_t name;
|
|
int picDataOfs; // the raw bits to pass to gl, mipmaps appended
|
|
// for PVR formats, the minimum size of each level is 32 bytes
|
|
|
|
int format;
|
|
int uploadWidth;
|
|
int uploadHeight;
|
|
int numLevels; // 1 for non mipmapped, otherwise log2( largest dimension )
|
|
|
|
// glTexParameters
|
|
int wrapS;
|
|
int wrapT;
|
|
int minFilter;
|
|
int magFilter;
|
|
int aniso;
|
|
|
|
// The upload sizes can be larger than the source sizes for
|
|
// non power of two sources, or for non square sources in the
|
|
// case of PVR compression.
|
|
int srcWidth;
|
|
int srcHeight;
|
|
|
|
float maxS; // srcWidth / uploadWidth
|
|
float maxT;
|
|
|
|
// Track the outlines of up to two boxes of non-transparent pixels
|
|
// to allow optimized drawing of sprites with large empty areas.
|
|
// The reason for two boxes is that the common lights have something
|
|
// at the top and something at the bottom, with nothing inbetween.
|
|
// These are inclusive bounds of the rows / columns in
|
|
// uploadWidth / uploadHeight with non-0 alpha
|
|
int numBounds;
|
|
int bounds[2][2][2];
|
|
} pkTextureData_t;
|
|
|
|
typedef struct {
|
|
pkName_t name;
|
|
int rawDataOfs; // (byte *)pkHeader + dataOfs
|
|
int rawDataLen; // there will always be a 0 byte appended to terminate strings
|
|
// that is not counted in this length
|
|
} pkRawData_t;
|
|
|
|
#define PKFILE_VERSION 0x12340002
|
|
typedef struct {
|
|
int version;
|
|
|
|
pkType_t textures;
|
|
pkType_t wavs;
|
|
pkType_t raws;
|
|
} pkHeader_t;
|
|
|
|
|
|
//============================================================
|
|
//
|
|
// In-memory, writable structures
|
|
//
|
|
//============================================================
|
|
|
|
typedef struct {
|
|
unsigned glTexNum;
|
|
const pkTextureData_t *textureData;
|
|
// we will need to add LRU links if texture caching is needed
|
|
} pkTexture_t;
|
|
|
|
typedef struct {
|
|
unsigned alBufferNum; // created with the staticBuffer extension directly in the mapped memory
|
|
const pkWavData_t *wavData;
|
|
} pkWav_t;
|
|
|
|
void PK_Init( const char *pakFileName );
|
|
const pkName_t *PK_FindType( const char *rawName, const pkType_t *type, int *index );
|
|
const byte * PK_FindRaw( const char *rawName, int *len ); // len can be NULL if you don't need it
|
|
pkTexture_t * PK_FindTexture( const char *imageName );
|
|
pkWav_t * PK_FindWav( const char *soundName );
|
|
|
|
// The name will be converted to canonical name (backslashes converted to slashes and lowercase)
|
|
// before generating a hash.
|
|
int PK_HashName( const char *name, char canonical[MAX_PK_NAME] );
|
|
|
|
void PK_BindTexture( pkTexture_t *tex );
|
|
void PK_DrawTexture( pkTexture_t *tex, int x, int y );
|
|
void PK_StretchTexture( pkTexture_t *tex, float x, float y, float w, float h );
|
|
|
|
extern pkHeader_t * pkHeader;
|
|
extern int pkSize;
|
|
|
|
// images and wavs have writable state, so they need separate
|
|
// structs that also point to the source in the pak file
|
|
extern pkTexture_t *pkTextures;
|
|
extern pkWav_t * pkWavs;
|
|
|