// Misc.h

#ifndef _MISC_H_
#define _MISC_H_


#include "file.h"
#include "3dtypes.h"


#define CMD_END				0
#define CMD_TEXTURE		1
#define CMD_VERTICES	2
#define CMD_FACES			3
#define CMD_ALPHA			4
#define CMD_OPAQUE		5
#define CMD_NEGVERTS	6
#define CMD_ZTEST			7
#define CMD_ZUPDATE		8

#define FORMAT_I4			0
#define FORMAT_IA4		1
#define FORMAT_CI4		2
#define FORMAT_I8			3
#define FORMAT_IA8		4
#define FORMAT_CI8		5
#define FORMAT_IA16		6
#define FORMAT_RGBA16	7
#define FORMAT_YUV16	8
#define FORMAT_RGBA32	9


typedef struct RGBA16
{
	u16 r : 5;
	u16 g : 5;
	u16 b : 5;
	u16 a : 1;
} RGBA16;

typedef struct RGBA32
{
	u8
		r,
		g,
		b,
		a;
} RGBA32;

typedef struct SMtlFlags
{
	u32	pad			: 12;
	u32 Yflags	: 2;
	u32 Xflags	: 2;
	u32 Ymask		: 4;
	u32	Xmask		: 4;
	u32	PalNum	: 4;
	u32	Format	: 4;
} SMtlFlags;

typedef struct SMaterial
{
	u8
		*Texture;
	RGBA16
		*Palette;
	s16
		Width,
		Height;
	SMtlFlags
		Flags;
} SMaterial;

typedef struct VertexN64
{
	s16
		x,
		y,
		z,
		flag,
		u,
		v;
	u8
		r,
		g,
		b,
		a;
} VertexN64;

typedef struct Plane
{
	s16
		x,
		y,
		z,
		d;
} Plane;


extern s32
	FileSize;

extern Gfx
	ColModeCombine,
	TexModeCombine;

extern s32
	Paused,
	ColorDiff;


void srand( const u32 seed );
s32 rand();
s32 random( const s32 range );

void MatToN64( matrix *src, Mtx *dst );
void SetTransN64( Mtx *mat, s16 x, s16 y, s16 z );
void *AllocAndLoadFile( char *filename, const s32 mem_type );
Gfx *DrawObject( Gfx *gp, u8 *object, void *ml );
void Obj_CalcExtents( void *_obj, vector16 *min, vector16 *max );
s32 DotProduct( vector16 *va, vector16 *vb );

u8 Pal_FindColor( const u32 r, const u32 g, const u32 b, const RGBA16 *pal, const u32 count );
void Pal_SetAlpha( RGBA16 *pal, const u8 alpha, s32 count );


#endif
