/*
gl_dbghulls.c - loading & handling world and brushmodels
Copyright (C) 2016 Uncle Mike

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

#include "gl_local.h"
#include "mod_local.h"

#define list_entry( ptr, type, member ) \
	((type *)((char *)(ptr) - (size_t)(&((type *)0)->member)))

// iterate over each entry in the list
#define list_for_each_entry( pos, head, member )			\
	for( pos = list_entry( (head)->next, winding_t, member );	\
	     &pos->member != (head);				\
	     pos = list_entry( pos->member.next, winding_t, member ))

// REFTODO: rewrite in triapi
void R_DrawWorldHull( void )
{
	hull_model_t	*hull = &WORLD->hull_models[0];
	winding_t		*poly;
	int		i;

	if( FBitSet( r_showhull->flags, FCVAR_CHANGED ))
	{
		int val = bound( 0, (int)r_showhull->value, 3 );
		if( val ) gEngfuncs.Mod_CreatePolygonsForHull( val );
		ClearBits( r_showhull->flags, FCVAR_CHANGED );
	}

	if( !CVAR_TO_BOOL( r_showhull ))
		return;
	pglDisable( GL_TEXTURE_2D );

	list_for_each_entry( poly, &hull->polys, chain )
	{
		srand((unsigned int)poly);
		pglColor3f( rand() % 256 / 255.0, rand() % 256 / 255.0, rand() % 256 / 255.0 );
		pglBegin( GL_POLYGON );
		for( i = 0; i < poly->numpoints; i++ )
			pglVertex3fv( poly->p[i] );
		pglEnd();
	}
	pglEnable( GL_TEXTURE_2D );
}

void R_DrawModelHull( void )
{
	hull_model_t	*hull;
	winding_t		*poly;
	int		i;

	if( !CVAR_TO_BOOL( r_showhull ))
		return;

	if( !RI.currentmodel || RI.currentmodel->name[0] != '*' )
		return;

	i = atoi( RI.currentmodel->name + 1 );
	if( i < 1 || i >= WORLD->num_hull_models )
		return;

	hull = &WORLD->hull_models[i];

	pglPolygonOffset( 1.0f, 2.0 );
	pglEnable( GL_POLYGON_OFFSET_FILL );
	pglDisable( GL_TEXTURE_2D );
	list_for_each_entry( poly, &hull->polys, chain )
	{
		srand((unsigned int)poly);
		pglColor3f( rand() % 256 / 255.0, rand() % 256 / 255.0, rand() % 256 / 255.0 );
		pglBegin( GL_POLYGON );
		for( i = 0; i < poly->numpoints; i++ )
			pglVertex3fv( poly->p[i] );
		pglEnd();
	}
	pglEnable( GL_TEXTURE_2D );
	pglDisable( GL_POLYGON_OFFSET_FILL );
}