/*
 * Copyright (c) 2008-2009 Bill Whitacre http://rampancy.g0dsoft.com
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
*/

#include "hull.h"
#include "hull_particle.h"
#include "hull_circle.h"
#include "hull_polygon.h"

rat_hull_class rat_particle_class;
rat_hull_class rat_circle_class;
rat_hull_class rat_polygon_class;

static int are_classes_init=0;

void rat_init_hull_classes()
{
	if (!are_classes_init)
	{
		rat_particle_class.destroy=rat_hull_particle_destroy;
		rat_particle_class.update_cache=rat_hull_particle_update_cache;
		rat_particle_class.get_angle=rat_hull_particle_get_angle;
		rat_particle_class.set_angle=rat_hull_particle_set_angle;
		rat_particle_class.get_pos=rat_hull_particle_get_pos;
		rat_particle_class.set_pos=rat_hull_particle_set_pos;
		rat_particle_class.point_query=rat_hull_particle_point_query;

		rat_circle_class.destroy=rat_hull_circle_destroy;
		rat_circle_class.update_cache=rat_hull_circle_update_cache;
		rat_circle_class.get_angle=rat_hull_circle_get_angle;
		rat_circle_class.set_angle=rat_hull_circle_set_angle;
		rat_circle_class.get_pos=rat_hull_circle_get_center;
		rat_circle_class.set_pos=rat_hull_circle_set_center;
		rat_circle_class.point_query=rat_hull_circle_point_query;

		rat_polygon_class.destroy=rat_hull_polygon_destroy;
		rat_polygon_class.update_cache=rat_hull_polygon_update_cache;
		rat_polygon_class.get_angle=rat_hull_polygon_get_angle;
		rat_polygon_class.set_angle=rat_hull_polygon_set_angle;
		rat_polygon_class.get_pos=rat_hull_polygon_get_pos;
		rat_polygon_class.set_pos=rat_hull_polygon_set_pos;
		rat_polygon_class.point_query=rat_hull_polygon_point_query;

		are_classes_init=1;
	}
}

void rat_hull_destroy(rat_hull *hull)
{
	hull->clas->destroy(hull);
	rat_dealloc((void *)hull);
}

void rat_hull_update_cache(rat_hull *hull,int is_static)
{
	hull->clas->update_cache(hull,is_static);
}

rat_real rat_hull_get_angle(rat_hull *hull)
{
	return hull->clas->get_angle(hull);
}

vector2 rat_hull_get_pos(rat_hull *hull)
{
	return hull->clas->get_pos(hull);
}

void rat_hull_set_angle(rat_hull *hull,rat_real angle)
{
	hull->clas->set_angle(hull,fmod(angle,2.0*(rat_real)MATH_PI));
	hull->clas->update_cache(hull,0);
}

void rat_hull_set_pos(rat_hull *hull,vector2 pos)
{
	hull->clas->set_pos(hull,pos);
	hull->clas->update_cache(hull,0);
}

int rat_hull_point_query(rat_hull *hull,vector2 point)
{
	return hull->clas->point_query(hull,point);
}
