/***
 *
 *	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.
 *
 ****/


#include "cmdlib.h"
#include "mathlib.h"
#include "scriplib.h"
#include "polylib.h"
#include "threads.h"
#include "bspfile.h"

#include <windows.h>

#ifndef DOUBLEVEC_T
#error you must add -dDOUBLEVEC_T to the project!
#endif

#define BOGUS_RANGE 8192

typedef struct
{
	vec3_t normal;
	vec_t dist;
	int type;
	int iorigin[3];
	int inormal[3];
} plane_t;


extern plane_t mapplanes[MAX_MAP_PLANES];
extern int nummapplanes;

extern int g_nMapFileVersion; // map file version * 100 (ie 201), zero for pre-Worldcraft 2.0.1 maps

typedef struct
{
	vec3_t UAxis;
	vec3_t VAxis;
	vec_t shift[2];
	vec_t rotate;
	vec_t scale[2];
	char name[32];
} brush_texture_t;

typedef struct side_s
{
	brush_texture_t td;
	int planepts[3][3];
} side_t;

typedef struct bface_s
{
	struct bface_s* next;
	int planenum;
	plane_t* plane;
	winding_t* w;
	int texinfo;
	qboolean used; // just for face counting
	int contents, backcontents;
	vec3_t mins, maxs;
} bface_t;

#define NUM_HULLS 4 // no larger than MAX_MAP_HULLS
typedef struct
{
	vec3_t mins, maxs;
	bface_t* faces;
} brushhull_t;

typedef struct brush_s
{
	int entitynum;
	int brushnum;

	int firstside;
	int numsides;

	int contents;
	brushhull_t hulls[NUM_HULLS];
} brush_t;


extern int nummapbrushes;
extern brush_t mapbrushes[MAX_MAP_BRUSHES];

#define MAX_MAP_SIDES (MAX_MAP_BRUSHES * 6)

extern int numbrushplanes;
extern plane_t planes[MAX_MAP_PLANES];

extern int numbrushsides;
extern side_t brushsides[MAX_MAP_SIDES];

extern qboolean noclip;
extern qboolean wadtextures;

extern int nWadInclude;
extern char* pszWadInclude[];

void LoadMapFile(char* filename);

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

// textures.c

extern int nummiptex;
void WriteMiptex(void);
int FindMiptex(char* name);
int TexinfoForBrushTexture(plane_t* plane, brush_texture_t* bt, vec3_t origin);

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

// brush.c

void FindGCD(int* v);

brush_t* Brush_LoadEntity(entity_t* ent, int hullnum);
int PlaneTypeForNormal(vec3_t normal);

void CreateBrush(int brushnum);

int BrushContents(brush_t* b);

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

// csg.c

bface_t* NewFaceFromFace(bface_t* in);
extern qboolean onlyents;

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

// draw.c

extern vec3_t draw_mins, draw_maxs;
extern qboolean drawflag;

void Draw_ClearWindow(void);
void DrawWinding(winding_t* w);

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

// map.c

void TextureAxisFromPlane(plane_t* pln, vec3_t xv, vec3_t yv);

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

// hullfile.c

void CheckHullFile(qboolean hullfile, char* filename);
