/*
	Copyright (C) 1996-1997  Id Software, Inc.

	This program 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.

	This program 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 this program; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

	See file, 'COPYING', for details.

*/

#ifndef qfbsp_brush_h
#define qfbsp_brush_h

#include "QF/darray.h"
#include "QF/mathlib.h"

#include "bsp5.h"
#include "map.h"

/**	\defgroup qfbsp_brush Brush Functions
	\ingroup qfbsp
*/
///@{

#define	NUM_HULLS		2				// normal and +16

#define	NUM_CONTENTS	2				// solid and water

typedef struct brush_s {
	struct brush_s *next;
	vec3_t      mins, maxs;
	struct visfacet_s *faces;
	int         contents;
} brush_t;

typedef struct brushset_s {
	vec3_t      mins, maxs;
	brush_t    *brushes;			// NULL terminated list
} brushset_t;

typedef struct DARRAY_TYPE (plane_t) planeset_t;
extern planeset_t planes;

/**	Allocate a new brush.

	\return			Pointer to the new brush.
*/
brush_t *AllocBrush (void);

/**	Load the brushes from the entity.

	\param ent		The entity from which to load the brushes.
	\param hullnum	The number of the hull for which to load the brushes.
	\return			The brush set holding the brushes loaded from the entity.
*/
brushset_t *Brush_LoadEntity (entity_t *ent, int hullnum);

/**	Determine the primary axis of the normal.

	\param normal	Must be canonical.
*/
int	PlaneTypeForNormal (const vec3_t normal) __attribute__((pure));

/**	Make the plane canonical.

	A cononical plane is one whose normal points towards +inf on its primary
	axis. The primary axis is that which has the largest magnitude of the
	vector's components.

	\param dp		The plane to make canonical.
	\return			1 if the plane was flipped, otherwise 0.
*/
int NormalizePlane (plane_t *dp);

/**	Add a plane to the global list of planes.

	Make the plane canonical, and add it to the global list of planes if it
	does not duplicate a plane that is already in the list. If the plane is
	flipped while being made canonical, side will be set to 1, otherwise side
	will be 0.

	\param dplane	The plane to add.
	\param side		The side of the plane that will be front.
	\return			global plane number.
*/
int	FindPlane (const plane_t *dplane, int *side);

///@}

#endif//qfbsp_brush_h
