#if !defined(_TGS_COLLISION_LINEAR_H_)
#define _TGS_COLLISION_LINEAR_H_
#pragma once
namespace TGS {
namespace COL {
TPL TYPE F_DistSq( CR_(LINE,DIM), M_(VECTOR,DIM) );
TPL TYPE F_DistSq( CR_(RAY,DIM), M_(VECTOR,DIM) );
TPL TYPE F_DistSq( CR_(SEGMENT,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Dist( CR_(LINE,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Dist( CR_(RAY,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Dist( CR_(SEGMENT,DIM), M_(VECTOR,DIM) );
TPL TYPE F_DistSq( CR_(LINE,DIM), CR_(LINE,DIM) );
TPL TYPE F_DistSq( CR_(LINE,DIM), CR_(RAY,DIM) );
TPL TYPE F_DistSq( CR_(LINE,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_DistSq( CR_(RAY,DIM), CR_(LINE,DIM) );
TPL TYPE F_DistSq( CR_(RAY,DIM), CR_(RAY,DIM) );
TPL TYPE F_DistSq( CR_(RAY,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_DistSq( CR_(SEGMENT,DIM), CR_(LINE,DIM) );
TPL TYPE F_DistSq( CR_(SEGMENT,DIM), CR_(RAY,DIM) );
TPL TYPE F_DistSq( CR_(SEGMENT,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Dist( CR_(LINE,DIM), CR_(LINE,DIM) );
TPL TYPE F_Dist( CR_(LINE,DIM), CR_(RAY,DIM) );
TPL TYPE F_Dist( CR_(LINE,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Dist( CR_(RAY,DIM), CR_(LINE,DIM) );
TPL TYPE F_Dist( CR_(RAY,DIM), CR_(RAY,DIM) );
TPL TYPE F_Dist( CR_(RAY,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Dist( CR_(SEGMENT,DIM), CR_(LINE,DIM) );
TPL TYPE F_Dist( CR_(SEGMENT,DIM), CR_(RAY,DIM) );
TPL TYPE F_Dist( CR_(SEGMENT,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), CR_(LINE,DIM), M_(VECTOR,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), CR_(RAY,DIM), M_(VECTOR,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), CR_(SEGMENT,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), CR_(LINE,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), CR_(RAY,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), CR_(SEGMENT,DIM), M_(VECTOR,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(LINE,DIM), CR_(LINE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(LINE,DIM), CR_(RAY,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(LINE,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(RAY,DIM), CR_(LINE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(RAY,DIM), CR_(RAY,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(RAY,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SEGMENT,DIM), CR_(LINE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SEGMENT,DIM), CR_(RAY,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SEGMENT,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(LINE,DIM), CR_(LINE,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(LINE,DIM), CR_(RAY,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(LINE,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(RAY,DIM), CR_(LINE,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(RAY,DIM), CR_(RAY,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(RAY,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SEGMENT,DIM), CR_(LINE,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SEGMENT,DIM), CR_(RAY,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(SEGMENT,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_ClosestSq( TYPE*, CR_(LINE,DIM), M_(VECTOR,DIM) );
TPL TYPE F_ClosestSq( TYPE*, CR_(RAY,DIM), M_(VECTOR,DIM) );
TPL TYPE F_ClosestSq( TYPE*, CR_(SEGMENT,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Closest( TYPE*, CR_(LINE,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Closest( TYPE*, CR_(RAY,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Closest( TYPE*, CR_(SEGMENT,DIM), M_(VECTOR,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, CR_(LINE,DIM), CR_(LINE,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, CR_(LINE,DIM), CR_(RAY,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, CR_(LINE,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, CR_(RAY,DIM), CR_(LINE,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, CR_(RAY,DIM), CR_(RAY,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, CR_(RAY,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, CR_(SEGMENT,DIM), CR_(LINE,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, CR_(SEGMENT,DIM), CR_(RAY,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, CR_(SEGMENT,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, CR_(LINE,DIM), CR_(LINE,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, CR_(LINE,DIM), CR_(RAY,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, CR_(LINE,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, CR_(RAY,DIM), CR_(LINE,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, CR_(RAY,DIM), CR_(RAY,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, CR_(RAY,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, CR_(SEGMENT,DIM), CR_(LINE,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, CR_(SEGMENT,DIM), CR_(RAY,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, CR_(SEGMENT,DIM), CR_(SEGMENT,DIM) );
TPL TgBOOL F_Contact_Test( CR_(LINE,DIM), CR_(LINE,DIM) );
TPL TgBOOL F_Contact_Test( CR_(LINE,DIM), CR_(RAY,DIM) );
TPL TgBOOL F_Contact_Test( CR_(LINE,DIM), CR_(SEGMENT,DIM) );
TPL TgBOOL F_Contact_Test( CR_(RAY,DIM), CR_(LINE,DIM) );
TPL TgBOOL F_Contact_Test( CR_(RAY,DIM), CR_(RAY,DIM) );
TPL TgBOOL F_Contact_Test( CR_(RAY,DIM), CR_(SEGMENT,DIM) );
TPL TgBOOL F_Contact_Test( CR_(SEGMENT,DIM), CR_(LINE,DIM) );
TPL TgBOOL F_Contact_Test( CR_(SEGMENT,DIM), CR_(RAY,DIM) );
TPL TgBOOL F_Contact_Test( CR_(SEGMENT,DIM), CR_(SEGMENT,DIM) );
TPL TgINT F_Internal_Intersect( PC_(VECTOR,DIM), PC_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
TPL TgINT F_Internal_Parallel( PC_(VECTOR,DIM), PC_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
TPLN struct TTgFSQ_LNPT
{
static TYPE DO( M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
};
TPLN struct TTgCSQ_LNPT
{
static TYPE DO( TYPE*, M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
static TYPE DO( PC_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
};
template <typename TYPE, int DIM, bool bC0, bool bC1, bool bC2, bool bC3>
struct TTgFSQ_LNLN
{
static TYPE DO( M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
};
template <typename TYPE, int DIM, bool bC0, bool bC1, bool bC2, bool bC3>
struct TTgCSQ_LNLN
{
static TYPE DO( PC_(VECTOR,DIM), PC_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
static TYPE DO( TYPE*, TYPE*, M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
};
template <typename TYPE, int DIM, bool bC0, bool bC1, bool bC2, bool bC3>
struct TTgTST_LNLN
{
static TgBOOL DO( M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
};
TgVOID Unit_Test_Collision_Linear();
};
};
#endif