#if !defined(_TGS_COLLISION_SPHERE_H_)
#define _TGS_COLLISION_SPHERE_H_
#pragma once
namespace TGS {
namespace COL {
TPL TYPE F_DistSq( CR_(SPHERE,DIM), M_(VECTOR,DIM) );
TPL TYPE F_DistSq( CR_(SPHERE,DIM), CR_(LINE,DIM) );
TPL TYPE F_DistSq( CR_(SPHERE,DIM), CR_(RAY,DIM) );
TPL TYPE F_DistSq( CR_(SPHERE,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_DistSq( CR_(SPHERE,DIM), CR_(SPHERE,DIM) );
TPL TYPE F_DistSq( CR_(SPHERE,DIM), CR_(ETRI,DIM) );
TPL TYPE F_DistSq( CR_(SPHERE,DIM), CR_(PLANE,DIM) );
TPL TYPE F_Dist( CR_(SPHERE,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Dist( CR_(SPHERE,DIM), CR_(LINE,DIM) );
TPL TYPE F_Dist( CR_(SPHERE,DIM), CR_(RAY,DIM) );
TPL TYPE F_Dist( CR_(SPHERE,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Dist( CR_(SPHERE,DIM), CR_(SPHERE,DIM) );
TPL TYPE F_Dist( CR_(SPHERE,DIM), CR_(ETRI,DIM) );
TPL TYPE F_Dist( CR_(SPHERE,DIM), CR_(PLANE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), CR_(SPHERE,DIM), M_(VECTOR,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(LINE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(RAY,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(SPHERE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(ETRI,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(PLANE,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), CR_(SPHERE,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(LINE,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(RAY,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(SPHERE,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(ETRI,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(PLANE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), TYPE*, CR_(SPHERE,DIM), CR_(LINE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), TYPE*, CR_(SPHERE,DIM), CR_(RAY,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), TYPE*, CR_(SPHERE,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), TYPE*, TYPE*, CR_(SPHERE,DIM), CR_(ETRI,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), TYPE*, CR_(SPHERE,DIM), CR_(LINE,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), TYPE*, CR_(SPHERE,DIM), CR_(RAY,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), TYPE*, CR_(SPHERE,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), TYPE*, TYPE*, CR_(SPHERE,DIM), CR_(ETRI,DIM) );
TPL TgBOOL F_Contact_Test( CR_(SPHERE,DIM), CR_(LINE,DIM) );
TPL TgBOOL F_Contact_Test( CR_(SPHERE,DIM), CR_(RAY,DIM) );
TPL TgBOOL F_Contact_Test( CR_(SPHERE,DIM), CR_(SEGMENT,DIM) );
TPL TgBOOL F_Contact_Test( CR_(SPHERE,DIM), CR_(SPHERE,DIM), M_(VECTOR,DIM), const TYPE );
TPL TgBOOL F_Contact_Test( CR_(SPHERE,DIM), CR_(SPHERE,DIM) );
TPL TgBOOL F_Contact_Test( CR_(SPHERE,DIM), CR_(ETRI,DIM) );
TPL TgBOOL F_Contact_Test( CR_(SPHERE,DIM), CR_(PLANE,DIM) );
TPL TgRESULT F_Contact_Intersect( PC_(CONTACT_PACKET,DIM), CR_(SPHERE,DIM), CR_(LINE,DIM) );
TPL TgRESULT F_Contact_Intersect( PC_(CONTACT_PACKET,DIM), CR_(SPHERE,DIM), CR_(RAY,DIM) );
TPL TgRESULT F_Contact_Intersect( PC_(CONTACT_PACKET,DIM), CR_(SPHERE,DIM), CR_(SEGMENT,DIM) );
TPL TgRESULT F_Contact_Penetrate( PC_(CONTACT_PACKET,DIM), M_(VECTOR,DIM), CR_(SPHERE,DIM) );
TPL TgRESULT F_Contact_Penetrate( PC_(CONTACT_PACKET,DIM), CR_(LINE,DIM), CR_(SPHERE,DIM) );
TPL TgRESULT F_Contact_Penetrate( PC_(CONTACT_PACKET,DIM), CR_(RAY,DIM), CR_(SPHERE,DIM) );
TPL TgRESULT F_Contact_Penetrate( PC_(CONTACT_PACKET,DIM), CR_(SEGMENT,DIM), CR_(SPHERE,DIM) );
TPL TgRESULT F_Contact_Penetrate( PC_(CONTACT_PACKET,DIM), CR_(SPHERE,DIM), CR_(SPHERE,DIM) );
TPL TgRESULT F_Contact_Penetrate( PC_(CONTACT_PACKET,DIM), CR_(CTRI,DIM), CR_(SPHERE,DIM) );
TPL TgRESULT F_Contact_Penetrate( PC_(CONTACT_PACKET,DIM), CR_(PLANE,DIM), CR_(SPHERE,DIM) );
TPL TgRESULT F_Contact_Penetrate( PC_(CONTACT_PACKET,DIM), CR_(SPHERE,DIM), CR_(PLANE,DIM) );
TPL TgRESULT F_Contact_Sweep( PC_(CONTACT_PACKET,DIM), TYPE*, M_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(DELTA,DIM) );
TPL TgRESULT F_Contact_Sweep( PC_(CONTACT_PACKET,DIM), TYPE*, CR_(SPHERE,DIM), M_(VECTOR,DIM), CR_(DELTA,DIM) );
TPL TgRESULT F_Contact_Sweep( PC_(CONTACT_PACKET,DIM), TYPE*, CR_(LINE,DIM), CR_(SPHERE,DIM), CR_(DELTA,DIM) );
TPL TgRESULT F_Contact_Sweep( PC_(CONTACT_PACKET,DIM), TYPE*, CR_(RAY,DIM), CR_(SPHERE,DIM), CR_(DELTA,DIM) );
TPL TgRESULT F_Contact_Sweep( PC_(CONTACT_PACKET,DIM), TYPE*, CR_(SEGMENT,DIM), CR_(SPHERE,DIM), CR_(DELTA,DIM) );
TPL TgRESULT F_Contact_Sweep( PC_(CONTACT_PACKET,DIM), TYPE*, CR_(SPHERE,DIM), CR_(SPHERE,DIM), CR_(DELTA,DIM) );
TPL TgRESULT F_Contact_Sweep( PC_(CONTACT_PACKET,DIM), TYPE*, CR_(STRI,DIM), CR_(SPHERE,DIM), CR_(DELTA,DIM) );
TPL TgRESULT F_Contact_Sweep( PC_(CONTACT_PACKET,DIM), TYPE*, CR_(PLANE,DIM), CR_(SPHERE,DIM), CR_(DELTA,DIM) );
TPL TgRESULT F_Internal_Penetrate( PC_(CONTACT_PACKET,DIM), M_(VECTOR,DIM), CR_(SPHERE,DIM), M_(VECTOR,DIM), const TYPE );
TPL TgRESULT F_Internal_Penetrate( PC_(CONTACT_PACKET,DIM), CR_(CTRI,DIM), CR_(SPHERE,DIM) );
TPL TgRESULT F_Clip( TYPE*, TYPE*, CR_(SPHERE,DIM), CR_(LINE,DIM) );
TPL TgRESULT F_Clip( TYPE*, TYPE*, CR_(SPHERE,DIM), CR_(RAY,DIM) );
TPL TgRESULT F_Clip( TYPE*, TYPE*, CR_(SPHERE,DIM), CR_(SEGMENT,DIM) );
TPL TgRESULT F_Clip( PC_(CLIP_LIST,DIM), CR_(SPHERE,DIM), CR_(LINE,DIM) );
TPL TgRESULT F_Clip( PC_(CLIP_LIST,DIM), CR_(SPHERE,DIM), CR_(RAY,DIM) );
TPL TgRESULT F_Clip( PC_(CLIP_LIST,DIM), CR_(SPHERE,DIM), CR_(SEGMENT,DIM) );
TPLN struct TTgINT_SPLN
{
static TgRESULT DO( PC_(CONTACT_PACKET,DIM), CR_(SPHERE,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
};
TPLN struct TTgSWP_SPLN
{
static TgRESULT DO( PC_(CONTACT_PACKET,DIM), TYPE*, M_(VECTOR,DIM), M_(VECTOR,DIM), CR_(SPHERE,DIM), CR_(DELTA,DIM) );
};
TPLN struct TTgCLP_SPLN
{
static TgRESULT DO( PC_(CLIP_LIST,DIM), CR_(SPHERE,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
static TgRESULT DO( TYPE*,TYPE*, CR_(SPHERE,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
};
TPLN struct TTgINL_SPLN
{
static TgRESULT DO( TYPE*,TYPE*, PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SPHERE,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
};
TgVOID Unit_Test_Collision_Sphere();
};
};
#endif