#if !defined(_TGS_COLLISION_PARALLELOGRAM_H_)
#define _TGS_COLLISION_PARALLELOGRAM_H_
#pragma once
namespace TGS {
namespace COL {
TPL TYPE F_DistSq( CR_(PARALLELOGRAM,DIM), M_(VECTOR,DIM) );
TPL TYPE F_DistSq( CR_(PARALLELOGRAM,DIM), CR_(LINE,DIM) );
TPL TYPE F_DistSq( CR_(PARALLELOGRAM,DIM), CR_(RAY,DIM) );
TPL TYPE F_DistSq( CR_(PARALLELOGRAM,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_DistSq( CR_(PARALLELOGRAM,DIM), CR_(STRI,DIM) );
TPL TYPE F_DistSq( CR_(PARALLELOGRAM,DIM), CR_(RECTANGLE,DIM) );
TPL TYPE F_DistSq( CR_(PARALLELOGRAM,DIM), CR_(PARALLELOGRAM,DIM) );
TPL TYPE F_Dist( CR_(PARALLELOGRAM,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Dist( CR_(PARALLELOGRAM,DIM), CR_(LINE,DIM) );
TPL TYPE F_Dist( CR_(PARALLELOGRAM,DIM), CR_(RAY,DIM) );
TPL TYPE F_Dist( CR_(PARALLELOGRAM,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Dist( CR_(PARALLELOGRAM,DIM), CR_(STRI,DIM) );
TPL TYPE F_Dist( CR_(PARALLELOGRAM,DIM), CR_(RECTANGLE,DIM) );
TPL TYPE F_Dist( CR_(PARALLELOGRAM,DIM), CR_(PARALLELOGRAM,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), M_(VECTOR,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), CR_(LINE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), CR_(RAY,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), CR_(STRI,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), CR_(RECTANGLE,DIM) );
TPL TYPE F_ClosestSq( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), CR_(PARALLELOGRAM,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), CR_(LINE,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), CR_(RAY,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), CR_(STRI,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), CR_(RECTANGLE,DIM) );
TPL TYPE F_Closest( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), CR_(PARALLELOGRAM,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), M_(VECTOR,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(LINE,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(RAY,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(STRI,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(RECTANGLE,DIM) );
TPL TYPE F_ClosestSq( TYPE*, TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(PARALLELOGRAM,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), M_(VECTOR,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(LINE,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(RAY,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(SEGMENT,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(STRI,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(RECTANGLE,DIM) );
TPL TYPE F_Closest( TYPE*, TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(PARALLELOGRAM,DIM) );
TPL TgBOOL F_Contact_Test( CR_(PARALLELOGRAM,DIM), CR_(LINE,DIM) );
TPL TgBOOL F_Contact_Test( CR_(PARALLELOGRAM,DIM), CR_(RAY,DIM) );
TPL TgBOOL F_Contact_Test( CR_(PARALLELOGRAM,DIM), CR_(SEGMENT,DIM) );
TPL TgRESULT F_Clip( TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(LINE,DIM) );
TPL TgRESULT F_Clip( TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(RAY,DIM) );
TPL TgRESULT F_Clip( TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), CR_(SEGMENT,DIM) );
TPL TgRESULT F_Clip( PC_(CLIP_LIST,DIM), CR_(PARALLELOGRAM,DIM) );
TPL TgRESULT F_Clip( PC_(CLIP_LIST,DIM), CR_(PARALLELOGRAM,DIM), CR_(LINE,DIM) );
TPL TgRESULT F_Clip( PC_(CLIP_LIST,DIM), CR_(PARALLELOGRAM,DIM), CR_(RAY,DIM) );
TPL TgRESULT F_Clip( PC_(CLIP_LIST,DIM), CR_(PARALLELOGRAM,DIM), CR_(SEGMENT,DIM) );
TPLN struct TTgCSQ_PELN
{
static TYPE DO( TYPE*, TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
static TYPE DO( PC_(VECTOR,DIM), PC_(VECTOR,DIM), CR_(PARALLELOGRAM,DIM), M_(VECTOR,DIM), M_(VECTOR,DIM) );
};
TPLN struct TTgTST_PELN
{
static TgBOOL DO( CR_(PARALLELOGRAM,DIM), M_(VECTOR,DIM),M_(VECTOR,DIM) );
};
TPLN struct TTgCLP_PELN
{
static TgRESULT DO( PC_(CLIP_LIST,DIM), CR_(PARALLELOGRAM,DIM), M_(VECTOR,DIM),M_(VECTOR,DIM) );
static TgRESULT DO( TYPE*, TYPE*, CR_(PARALLELOGRAM,DIM), M_(VECTOR,DIM),M_(VECTOR,DIM) );
};
TgVOID Unit_Test_Collision_Parallelogram();
};
};
#endif