Image Asset

From COD Engine Research

Call of Duty 4 & World at War

union GfxTexture
{
	D3DBaseTexture *basemap;
	D3DTexture *map;
	D3DVolumeTexture *volmap;	// if GfxImageLoadDef::flags & 8
	D3DCubeTexture *cubemap;	// if GfxImageLoadDef::flags & 4
};

struct GfxImageLoadDef
{
	char levelCount;
	char flags;
	short dimensions[3];
	_D3DFormat format;
	GfxTexture texture;
};

struct GfxTextureLoad
{
	GfxImageLoadDef *loadDef;
};

struct GfxImage
{
	MapType mapType;
#ifdef PS3
	CellGcmTexture texture;	// size = 0x18
#elif defined XBOX
	GfxTextureLoad texture;
#endif
	CardMemory cardMemory;
	int size;
	unsigned short width;
	unsigned short height;
	unsigned short depth;
	char category;
	bool streaming;
	char *data;
#ifdef XBOX360
	char unknown[8];
#endif
	const char *name;
};

NOTE: In the zone file, if the streaming is set as true, then data is loaded at the end of the zone file.

Black Ops

union GfxTexture
{
	char *data;
	struct
	{
		char unknown[0x3C];
	};
};

struct GfxImage
{
#ifdef PS3
	CellGcmTexture texture; // size = 0x18
#endif
	char unknown1;
	char unknown2;
	char unknown3;
	char unknown4;
	int size;
	unsigned short height;
	unsigned short width;
	unsigned short depth;
	char unknown[6];
	GfxTexture textureDef;
	const char *name;
	int hash;
};

Modern Warfare 2 & 3 & Ghosts & Advanced Warfare

On Xbox 360 in the GfxTexture, the Common is either 0x03000000 or simply 3. A Common value of 0x03000000 implies that an endian swap (8IN32) needs to be performed on the entire GfxTexture. A value of 3 is the correct value.

struct CardMemory
{
  int platform[1];
};

union GfxTexture
{
#ifdef _XBOX //size = 0x34
  D3DBaseTexture basemap;
  D3DTexture map;
  D3DVolumeTexture volmap;
  D3DCubeTexture cubemap;
#elif defined(PS3) //size = 0x18
	CellGcmTexture texture;	// size = 0x18
#endif
};

struct GfxImage
{
  GfxTexture texture;
#ifdef _XBOX
  	char unknown[4];
#endif
  char mapType;
  char semantic;
  char category;
  char flags;
  CardMemory cardMemory;
  unsigned __int16 width;
  unsigned __int16 height;
  unsigned __int16 depth;
	char mipmap;
  bool streaming;
  char *pixels;
	char unknownData[0x20];
  const char *name;
};

NOTE: In the zone file, if streaming is set as true, then data will be found in PAK files.

Black Ops 2

struct GfxImage
{
#ifdef PS3
	char unknown1[6];
	CellGcmTexture texture;	// modified, missing 10 bytes, size = 0xE
#elif defined (_XBOX)
	D3DBaseTexture basemap;//size = 0x34
#endif
  char mapType;
	char unknown3;
	char unknown4;
	char unknown5;
	int size;
  unsigned __int16 width;
  unsigned __int16 height;
  unsigned __int16 depth;
  char levelCount;
  char streaming;
  unsigned int baseSize;
  char *pixels;
	char unknownData2[0x7C];
  char streamedPartCount;
  const char *name;
  unsigned int hash;
};

Black Ops 3

Black Ops 3 is the first game in the series so far to restructure the GfxImage asset. It appears that the major elements are still there, but are arranged in a more logical way. For instance name now appears at the beginning of the asset instead of the end. Note that this structure is from Xbox 360, and the other systems aren't reflected here yet.

struct GfxImagePixels
{
	char * a;//Size = (flags >> 22) & 0xFFFFFF;
}

typedef char GfxStreamedPartInfo;

struct GfxImage
{
	const char * name;
	D3DBaseTexture basemap;
	unsigned __int64 flags; //Not sure on the name. Size is clearly loaded from here for both pointers, and so is a flag. So not sure here.
	int unknown1[2]; //Most likely streaming, width, height and depth are all somewhere in here
	GfxImagePixels pixels;
	int unknown2[2];
	GfxStreamedPartInfo * streamingPartInfo; //This will probably be important for reading images that are stored in pak files. Size = ((flags >> 19) << 5) & 0x60 //This should be right
}