/*
Copyright (C) 1999-2006 Id Software, Inc. and contributors.
For a list of contributors, see the accompanying CONTRIBUTORS file.

This file is part of GtkRadiant.

GtkRadiant is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

GtkRadiant is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GtkRadiant; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/


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

.FM triangle flexible model file format

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

#ifndef __FMODEL_HEADER
#define __FMODEL_HEADER

#include "bspfile.h"

//typedef unsigned char 		byte;
//typedef int	qboolean;
//typedef float vec3_t[3];

#define	MAX_FM_TRIANGLES	2048
#define MAX_FM_VERTS		2048
#define MAX_FM_FRAMES		2048
#define MAX_FM_SKINS		64
#define	MAX_FM_SKINNAME		64
#define MAX_FM_MESH_NODES	16		// also defined in game/qshared.h


#define DTRIVERTX_V0   0
#define DTRIVERTX_V1   1
#define DTRIVERTX_V2   2
#define DTRIVERTX_LNI  3
#define DTRIVERTX_SIZE 4

#define SKINPAGE_WIDTH 640
#define SKINPAGE_HEIGHT 480

#define ENCODED_WIDTH_X 92
#define ENCODED_WIDTH_Y 475
#define ENCODED_HEIGHT_X 128
#define ENCODED_HEIGHT_Y 475

#define SCALE_ADJUST_FACTOR 0.96

#define INFO_HEIGHT 5
#define INFO_Y (SKINPAGE_HEIGHT-INFO_HEIGHT)

extern byte		*BasePalette;
extern byte		*BasePixels,*TransPixels;
extern int		BaseWidth, BaseHeight, TransWidth, TransHeight;
extern int ScaleWidth, ScaleHeight;

int ExtractNumber(byte *pic, int x, int y);
void DrawTextChar(int x, int y, char *text);
void DrawLine(int x1, int y1, int x2, int y2);

// the glcmd format:
// a positive integer starts a tristrip command, followed by that many
// vertex structures.
// a negative integer starts a trifan command, followed by -x vertexes
// a zero indicates the end of the command list.
// a vertex consists of a floating point s, a floating point t,
// and an integer vertex index.


// Initial Header
#define FM_HEADER_NAME	"header"
#define FM_HEADER_VER	2

typedef struct
{
	int			skinwidth;
	int			skinheight;
	int			framesize;		// byte size of each frame

	int			num_skins;
	int			num_xyz;
	int			num_st;			// greater than num_xyz for seams
	int			num_tris;
	int			num_glcmds;		// dwords in strip/fan command list
	int			num_frames;
	int			num_mesh_nodes;
} fmheader_t;


// Skin Header
#define FM_SKIN_NAME	"skin"
#define FM_SKIN_VER		1


// ST Coord Header
#define FM_ST_NAME		"st coord"
#define FM_ST_VER		1

typedef struct
{
	short	s;
	short	t;
} fmstvert_t;


// Tri Header
#define FM_TRI_NAME		"tris"
#define FM_TRI_VER		1

typedef struct 
{
	short	index_xyz[3];
	short	index_st[3];
} fmtriangle_t;


// Frame Header
#define FM_FRAME_NAME	"frames"
#define FM_FRAME_VER	1

// Frame for compression, just the names
#define FM_SHORT_FRAME_NAME	"short frames"
#define FM_SHORT_FRAME_VER	1

// Normals for compressed frames
#define FM_NORMAL_NAME	"normals"
#define FM_NORMAL_VER	1

// Compressed Frame Data
#define FM_COMP_NAME	"comp data"
#define FM_COMP_VER	1

// GL Cmds Header
#define FM_GLCMDS_NAME	"glcmds"
#define FM_GLCMDS_VER	1


// Mesh Nodes Header
#define FM_MESH_NAME	"mesh nodes"
#define FM_MESH_VER		3

// Skeleton Header
#define FM_SKELETON_NAME "skeleton"
#define FM_SKELETON_VER	1

// References Header
#define FM_REFERENCES_NAME "references"
#define FM_REFERENCES_VER	1

typedef struct
{

	union
	{

	byte	tris[MAX_FM_TRIANGLES>>3];

	struct {
	short	*triIndicies;
	int		num_tris;
	};

	};

	byte	verts[MAX_FM_VERTS>>3];
	short	start_glcmds, num_glcmds;
} fmmeshnode_t;

//=================================================================

// Frame info
typedef struct
{
	byte	v[3];			// scaled byte to fit in frame mins/maxs
	byte	lightnormalindex;
} fmtrivertx_t;

typedef struct
{
	float			scale[3];		// multiply byte verts by this
	float			translate[3];	// then add this
	char			name[16];		// frame name from grabbing
	fmtrivertx_t	verts[1];		// variable sized
} fmaliasframe_t;


#endif // #define __FMODEL_HEADER
