/***
*
*	Copyright (c) 1996-2002, Valve LLC. All rights reserved.
*
*	This product contains software technology licensed from Id
*	Software, Inc. ("Id Technology").  Id Technology (c) 1996 Id Software, Inc.
*	All Rights Reserved.
*
*   Use, distribution, and modification of this source code and/or resulting
*   object code is restricted to non-commercial enhancements to products from
*   Valve LLC.  All other use, distribution, or modification is prohibited
*   without written permission from Valve LLC.
*
****/

#ifndef ALIAS_H
#define ALIAS_H

#include "build.h"
#include STDINT_H
#include "synctype.h"

/*
==============================================================================

ALIAS MODELS

Alias models are position independent, so the cache manager can move them.
==============================================================================
*/

#define IDALIASHEADER	(('O'<<24)+('P'<<16)+('D'<<8)+'I')	// little-endian "IDPO"

#define ALIAS_VERSION	6

// client-side model flags
#define ALIAS_ROCKET		0x0001	// leave a trail
#define ALIAS_GRENADE		0x0002	// leave a trail
#define ALIAS_GIB			0x0004	// leave a trail
#define ALIAS_ROTATE		0x0008	// rotate (bonus items)
#define ALIAS_TRACER		0x0010	// green split trail
#define ALIAS_ZOMGIB		0x0020	// small blood trail
#define ALIAS_TRACER2		0x0040	// orange split trail + rotate
#define ALIAS_TRACER3		0x0080	// purple trail

typedef enum
{
	ALIAS_SINGLE = 0,
	ALIAS_GROUP
} aliasframetype_t;

typedef enum
{
	ALIAS_SKIN_SINGLE = 0,
	ALIAS_SKIN_GROUP
} aliasskintype_t;

typedef struct
{
	int32_t		ident;
	int32_t		version;
	vec3_t		scale;
	vec3_t		scale_origin;
	float		boundingradius;
	vec3_t		eyeposition;
	int32_t		numskins;
	int32_t		skinwidth;
	int32_t		skinheight;
	int32_t		numverts;
	int32_t		numtris;
	int32_t		numframes;
	uint32_t	synctype; // was synctype_t
	int32_t		flags;
	float		size;
} daliashdr_t;

STATIC_ASSERT( sizeof( daliashdr_t ) == 84, "invalid daliashdr_t size" );

typedef struct
{
	int32_t		onseam;
	int32_t		s;
	int32_t		t;
} stvert_t;

STATIC_ASSERT( sizeof( stvert_t ) == 12, "invalid stvert_t size" );

typedef struct dtriangle_s
{
	int32_t		facesfront;
	int32_t		vertindex[3];
} dtriangle_t;

STATIC_ASSERT( sizeof( dtriangle_t ) == 16, "invalid dtriangle_t size" );

#define DT_FACES_FRONT	0x0010
#define ALIAS_ONSEAM	0x0020

typedef struct
{
	trivertex_t	bboxmin;	// lightnormal isn't used
	trivertex_t	bboxmax;	// lightnormal isn't used
	char		name[16];	// frame name from grabbing
} daliasframe_t;

STATIC_ASSERT( sizeof( daliasframe_t ) == 24, "invalid daliasframe_t size" );

typedef struct
{
	int32_t		numframes;
	trivertex_t	bboxmin;	// lightnormal isn't used
	trivertex_t	bboxmax;	// lightnormal isn't used
} daliasgroup_t;

STATIC_ASSERT( sizeof( daliasgroup_t ) == 12, "invalid daliasgrou_t size" );

typedef struct
{
	int32_t		numskins;
} daliasskingroup_t;

STATIC_ASSERT( sizeof( daliasskingroup_t ) == 4, "invalid daliasskingroup_t size" );

typedef struct
{
	float		interval;
} daliasinterval_t;

STATIC_ASSERT( sizeof( daliasinterval_t ) == 4, "invalid daliasinterval_t size" );

typedef struct
{
	float		interval;
} daliasskininterval_t;

STATIC_ASSERT( sizeof( daliasskininterval_t ) == 4, "invalid daliasskininterval_t size" );

typedef struct
{
	uint32_t	type; // was aliasframetype_t
} daliasframetype_t;

STATIC_ASSERT( sizeof( daliasframetype_t ) == 4, "invalid daliasframetype_t size" );

typedef struct
{
	uint32_t	type; // was aliasskintype_t
} daliasskintype_t;

STATIC_ASSERT( sizeof( daliasskintype_t ) == 4, "invalid daliasskintype_t size" );

#endif//ALIAS_H