#if !defined(_TGS_COLLISION_BOX_H_)
#define _TGS_COLLISION_BOX_H_
#pragma once
namespace TGS {
namespace COL {
TPL TYPE F_DistSq( CR_(BOX,DIM), M_(VECTOR,DIM) );
TPL TYPE F_DistSq( CR_(BOX,DIM), CR_(LINE,DIM) );
TPL TYPE F_DistSq( CR_(BOX,DIM), CR_(RAY,DIM) );
TPL TYPE F_DistSq( CR_(BOX,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_DistSq( CR_(BOX,DIM), CR_(PLANE,DIM) );
TPL TYPE F_DistSq( CR_(BOX,DIM), CR_(SPHERE,DIM) );
TPL TYPE F_Dist( CR_(BOX,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Dist( CR_(BOX,DIM), CR_(LINE,DIM) );
TPL TYPE F_Dist( CR_(BOX,DIM), CR_(RAY,DIM) );
TPL TYPE F_Dist( CR_(BOX,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Dist( CR_(BOX,DIM), CR_(PLANE,DIM) );
TPL TYPE F_Dist( CR_(BOX,DIM), CR_(SPHERE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), CR_(BOX,DIM), M_(VECTOR,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(LINE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(RAY,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(PLANE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(SPHERE,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), CR_(BOX,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(LINE,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(RAY,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(PLANE,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(SPHERE,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*,TYPE*, CR_(BOX,DIM), M_(VECTOR,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*,TYPE*, TYPE*, CR_(BOX,DIM), CR_(LINE,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*,TYPE*, TYPE*, CR_(BOX,DIM), CR_(RAY,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*,TYPE*, TYPE*, CR_(BOX,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*,TYPE*, PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(PLANE,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*,TYPE*, PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(SPHERE,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*,TYPE*, CR_(BOX,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*,TYPE*, TYPE*, CR_(BOX,DIM), CR_(LINE,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*,TYPE*, TYPE*, CR_(BOX,DIM), CR_(RAY,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*,TYPE*, TYPE*, CR_(BOX,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*,TYPE*, PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(PLANE,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*,TYPE*, PC_(VECTOR,DIM), CR_(BOX,DIM), CR_(SPHERE,DIM) );
TPL TgRESULT F_Contact_Penetrate( PC_(CONTACT_PACKET,DIM), CR_(BOX,DIM), CR_(SPHERE,DIM) );
TPL TgRESULT F_Contact_Penetrate( PC_(CONTACT_PACKET,DIM), CR_(SPHERE,DIM), CR_(BOX,DIM) );
TPL TgRESULT F_Contact_Penetrate( PC_(CONTACT_PACKET,DIM), CR_(PLANE,DIM), CR_(BOX,DIM) );
TPL TgRESULT F_Contact_Penetrate( PC_(CONTACT_PACKET,DIM), CR_(STRI,DIM), CR_(BOX,DIM) );
TPL TgRESULT F_Clip( TYPE*, TYPE*, CR_(BOX,DIM), C_TgINT, CR_(LINE,DIM) );
TPL TgRESULT F_Clip( TYPE*, TYPE*, CR_(BOX,DIM), C_TgINT, CR_(RAY,DIM) );
TPL TgRESULT F_Clip( TYPE*, TYPE*, CR_(BOX,DIM), C_TgINT, CR_(SEGMENT,DIM) );
TPL TgRESULT F_Clip( PC_(CLIP_LIST,DIM), CR_(BOX,DIM), C_TgINT );
TPL TgRESULT F_Clip( PC_(CLIP_LIST,DIM), CR_(BOX,DIM), C_TgINT, CR_(PTRI,DIM) );
TPL TgRESULT F_Clip( TYPE*, TYPE*, CR_(BOX,DIM), CR_(LINE,DIM) );
TPL TgRESULT F_Clip( TYPE*, TYPE*, CR_(BOX,DIM), CR_(RAY,DIM) );
TPL TgRESULT F_Clip( TYPE*, TYPE*, CR_(BOX,DIM), CR_(SEGMENT,DIM) );
TPL TgRESULT F_Clip( PC_(CLIP_LIST,DIM), CR_(BOX,DIM), CR_(LINE,DIM) );
TPL TgRESULT F_Clip( PC_(CLIP_LIST,DIM), CR_(BOX,DIM), CR_(RAY,DIM) );
TPL TgRESULT F_Clip( PC_(CLIP_LIST,DIM), CR_(BOX,DIM), CR_(SEGMENT,DIM) );
TPL TgVOID F_Axis_ProjInfo( PC_(AXIS_PROJECT,DIM), M_(VECTOR,DIM), CR_(BOX,DIM) );
TPLN struct TTgCSQ_BXLN
{
static TYPE DO( TYPE*, TYPE*,TYPE*, TYPE*, CR_(BOX,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
static TYPE DO( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(BOX,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
};
TPLN struct TTgCLP_BXLN
{
static TgRESULT DO( PC_(CLIP_LIST,DIM), CR_(BOX,DIM), M_(VECTOR,DIM),M_(VECTOR,DIM) );
static TgRESULT DO( TYPE*, TYPE*, CR_(BOX,DIM), M_(VECTOR,DIM),M_(VECTOR,DIM) );
static TgRESULT DO( PC_(CLIP_LIST,DIM), CR_(BOX,DIM),C_TgINT, M_(VECTOR,DIM),M_(VECTOR,DIM) );
static TgRESULT DO( TYPE*, TYPE*, CR_(BOX,DIM),C_TgINT, M_(VECTOR,DIM),M_(VECTOR,DIM) );
};
TgVOID Unit_Test_Collision_Box();
};
};
#endif