/* drawing.m */
#include "idbsp.h"

/* id 			window_i, view_i; */
STORAGE *window_i,*view_i;
float		scale = 0.125;
NXRect		worldbounds;

/*
================
=
= IDRectFromPoints
=
= Makes the rectangle just touch the two points
=
================
*/

void IDRectFromPoints(NXRect *rect, NXPoint const *p1, NXPoint const *p2 )
{
/* return a rectangle that encloses the two points */
	if (p1->x < p2->x)
	{
		rect->origin.x = p1->x;
		rect->size.width = p2->x - p1->x + 1;
	}
	else
	{
		rect->origin.x = p2->x;
		rect->size.width = p1->x - p2->x + 1;
	}

	if (p1->y < p2->y)
	{
		rect->origin.y = p1->y;
		rect->size.height = p2->y - p1->y + 1;
	}
	else
	{
		rect->origin.y = p2->y;
		rect->size.height = p1->y - p2->y + 1;
	}
}


/*
==================
=
= IDEnclosePoint
=
= Make the rect enclose the point if it doesn't allready
=
==================
*/

void IDEnclosePoint (NXRect *rect, NXPoint const *point)
{
	float	right, top;

	right = rect->origin.x + rect->size.width - 1;
	top = rect->origin.y + rect->size.height - 1;

	if (point->x < rect->origin.x)
		rect->origin.x = point->x;
	if (point->y < rect->origin.y)
		rect->origin.y = point->y;
	if (point->x > right)
		right = point->x;
	if (point->y > top)
		top = point->y;

	rect->size.width = right - rect->origin.x + 1;
	rect->size.height = top - rect->origin.y + 1;
}


/*
===========
=
= BoundLineStore
=
===========
*/

/* void BoundLineStore (id lines_i, NXRect *r) */
void BoundLineStore(STORAGE *lines_i,NXRect *r)
{
	int				i,c;
	worldline_t		*line_p;

/*	c = [lines_i count]; */
	c = lines_i->count;
	if (!c)
		Error ("BoundLineStore: empty list");

/* line_p = [lines_i elementAt:0]; */
	line_p = lines_i->data;
	IDRectFromPoints (r, &line_p->p1, &line_p->p2);

	for (i=1 ; i<c ; i++)
	{
/*		line_p = [lines_i elementAt:i]; */
		line_p = (worldline_t *)lines_i->data + i;
		IDEnclosePoint (r, &line_p->p1);
		IDEnclosePoint (r, &line_p->p2);
	}
}


/*
===========
=
= DrawLineStore
=
= Draws all of the lines in the given storage object
=
===========
*/

/* void DrawLineStore (id lines_i) */
void DrawLineStore(STORAGE *lines_i)
{
#if 0
	int				i,c;
	worldline_t		*line_p;

	if (!draw)
		return;

/*	c = [lines_i count]; */
	c = lines_i->count;

	for (i=0 ; i<c ; i++)
	{
/*		line_p = [lines_i elementAt:i]; */
		line_p = (worldline_t *)lines_i->data + i;
		PSmoveto (line_p->p1.x, line_p->p1.y);
		PSlineto (line_p->p2.x, line_p->p2.y);
		PSstroke ();
	}
	NXPing ();
#endif
}

/*
===========
=
= DrawLine
=
= Draws all of the lines in the given storage object
=
===========
*/

void DrawLineDef (maplinedef_t *ld)
{
#if 0
	mapvertex_t		*v1, *v2;

	if (!draw)
		return;
/*
	v1 = [mapvertexstore_i elementAt: ld->v1];
	v2 = [mapvertexstore_i elementAt: ld->v2];
*/
	v1 = mapvertexstore_i->data + ld->v1;
	v2 = mapvertexstore_i->data + ld->v2;
	PSmoveto (v1->x, v1->y);
	PSlineto (v2->x, v2->y);
	PSstroke ();
	NXPing ();
#endif
}


/*
===========
=
= DrawMap
=
===========
*/

void DrawMap (void)
{
	NXRect	scaled;

	BoundLineStore (linestore_i, &worldbounds);
	worldbounds.origin.x -= 8;
	worldbounds.origin.y -= 8;
	worldbounds.size.width += 16;
	worldbounds.size.height += 16;

#if 0
	if (!draw)
		return;

	scaled.origin.x = 300;
	scaled.origin.y = 80;
	scaled.size.width = worldbounds.size.width*scale;
	scaled.size.height = worldbounds.size.height* scale;
/*
	window_i =
	[[Window alloc]
		initContent:	&scaled
		style:			NX_TITLEDSTYLE
		backing:		NX_RETAINED
		buttonMask:		0
		defer:			NO
	];

	[window_i display];
	[window_i orderFront: nil];
	view_i = [window_i contentView];

	[view_i
		setDrawSize:	worldbounds.size.width
		:				worldbounds.size.height];
	[view_i
		setDrawOrigin:	worldbounds.origin.x
		: 				worldbounds.origin.y];

	[view_i lockFocus];
	PSsetgray (NX_BLACK);
	DrawLineStore (linestore_i);
*/
#endif
}


/*
===========
=
= EraseWindow
=
===========
*/

void EraseWindow (void)
{
#if 0
	if (!draw)
		return;

	NXEraseRect (&worldbounds);
	NXPing ();
#endif
}


/*
============================
=
= DrawDivLine
=
============================
*/

void DrawDivLine (divline_t *div)
{
#if 0
	float	vx,vy, dist;

	if (!draw)
		return;

	PSsetgray (NX_BLACK);

	dist = sqrt (pow(div->dx,2)+pow(div->dy,2));
	vx = div->dx/dist;
	vy = div->dy/dist;

	dist = MAX(worldbounds.size.width,worldbounds.size.height);

	PSmoveto (div->pt.x - vx*dist, div->pt.y - vy*dist);
	PSlineto (div->pt.x + vx*dist, div->pt.y + vy*dist);
	PSstroke ();
	NXPing ();
#endif
}

