#if !defined(_TGS_COLLISION_LINEAR_POINT_INL_)
#define _TGS_COLLISION_LINEAR_POINT_INL_
#pragma once
namespace TGS {
namespace COL {
template <typename TYPE, int DIM> struct TTgFSQ_LNPT<TYPE,DIM,0,0>
{
TgFORCEINLINE static const TYPE DO( M_(VECTOR,DIM) tvS0, M_(VECTOR,DIM) tvD0, M_(VECTOR,DIM) tvS1 )
{
C_(VECTOR,DIM) tvDS = MATH::F_SUB( tvS1, tvS0 );
const TYPE tyD0_D0 = MATH::F_LSQ( tvD0 );
TgASSERT( tyD0_D0 > LIMITS<TYPE>::EPSILON );
const TYPE tyDS_DS = MATH::F_LSQ( tvDS );
const TYPE tyDS_D0 = MATH::F_DOT(tvDS,tvD0);
return (tyDS_DS - tyDS_D0*(tyDS_D0 / tyD0_D0));
};
};
template <typename TYPE, int DIM> struct TTgFSQ_LNPT<TYPE,DIM,1,0>
{
TgFORCEINLINE static const TYPE DO( M_(VECTOR,DIM) tvS0, M_(VECTOR,DIM) tvD0, M_(VECTOR,DIM) tvS1 )
{
C_(VECTOR,DIM) tvDS = MATH::F_SUB( tvS1, tvS0 );
const TYPE tyD0_D0 = MATH::F_LSQ( tvD0 );
TgASSERT( tyD0_D0 > LIMITS<TYPE>::EPSILON );
const TYPE tyDS_DS = MATH::F_LSQ( tvDS );
const TYPE tyDS_D0 = MATH::F_DOT(tvDS,tvD0);
return (tyDS_DS - P::FSEL( tyDS_D0, tyDS_D0*(tyDS_D0 / tyD0_D0), TYPE(0.0) ));
};
};
template <typename TYPE, int DIM> struct TTgFSQ_LNPT<TYPE,DIM,1,1>
{
TgFORCEINLINE static const TYPE DO( M_(VECTOR,DIM) tvS0, M_(VECTOR,DIM) tvD0, M_(VECTOR,DIM) tvS1 )
{
C_(VECTOR,DIM) tvDS = MATH::F_SUB( tvS1, tvS0 );
const TYPE tyD0_D0 = MATH::F_LSQ( tvD0 );
TgASSERT( tyD0_D0 > LIMITS<TYPE>::EPSILON );
const TYPE tyDS_DS = MATH::F_LSQ( tvDS );
const TYPE tyDS_D0 = MATH::F_DOT(tvDS,tvD0);
const TYPE tyTA = P::FSEL( tyD0_D0 - tyDS_D0, tyDS_D0*(tyDS_D0 / tyD0_D0), TYPE(2.0)*tyDS_D0 + tyD0_D0 );
return (tyDS_DS - P::FSEL( tyDS_D0, tyTA, TYPE(0.0) ));
};
};
template <typename TYPE, int DIM> struct TTgCSQ_LNPT<TYPE,DIM,0,0>
{
TgFORCEINLINE static const TYPE DO( TYPE *ptyLN0, M_(VECTOR,DIM) tvS0, M_(VECTOR,DIM) tvD0, M_(VECTOR,DIM) tvS1 )
{
C_(VECTOR,DIM) tvDS = MATH::F_SUB( tvS1, tvS0 );
const TYPE tyD0_D0 = MATH::F_LSQ( tvD0 );
TgASSERT( tyD0_D0 > LIMITS<TYPE>::EPSILON );
const TYPE tyDS_DS = MATH::F_LSQ( tvDS );
const TYPE tyDS_D0 = MATH::F_DOT(tvDS,tvD0);
const TYPE tyLN0 = tyDS_D0 / tyD0_D0;
*ptyLN0 = tyLN0;
return (tyDS_DS - tyDS_D0*tyLN0);
};
TgFORCEINLINE static const TYPE DO( PC_(VECTOR,DIM) ptvT0, M_(VECTOR,DIM) tvS0, M_(VECTOR,DIM) tvD0, M_(VECTOR,DIM) tvS1 )
{
register TYPE tyT0;
const TYPE tyDistSq = DO( &tyT0, tvS0,tvD0, tvS1 );
*ptvT0 = MATH::F_ADD( tvS0, MATH::F_MUL( tyT0, tvD0 ) );
return (tyDistSq);
};
};
template <typename TYPE, int DIM> struct TTgCSQ_LNPT<TYPE,DIM,1,0>
{
TgFORCEINLINE static const TYPE DO( TYPE *ptyRY0, M_(VECTOR,DIM) tvS0, M_(VECTOR,DIM) tvD0, M_(VECTOR,DIM) tvS1 )
{
C_(VECTOR,DIM) tvDS = MATH::F_SUB( tvS1, tvS0 );
const TYPE tyD0_D0 = MATH::F_LSQ( tvD0 );
TgASSERT( tyD0_D0 > LIMITS<TYPE>::EPSILON );
const TYPE tyDS_DS = MATH::F_LSQ( tvDS );
const TYPE tyDS_D0 = MATH::F_DOT(tvDS,tvD0);
const TYPE tyRY0 = P::FSEL( tyDS_D0, tyDS_D0/tyD0_D0, TYPE(0.0) );
*ptyRY0 = tyRY0;
return (tyDS_DS - tyDS_D0*tyRY0);
};
TgFORCEINLINE static const TYPE DO( PC_(VECTOR,DIM) ptvT0, M_(VECTOR,DIM) tvS0, M_(VECTOR,DIM) tvD0, M_(VECTOR,DIM) tvS1 )
{
register TYPE tyT0;
const TYPE tyDistSq = DO( &tyT0, tvS0,tvD0, tvS1 );
*ptvT0 = MATH::F_ADD( tvS0, MATH::F_MUL( tyT0, tvD0 ) );
return (tyDistSq);
};
};
template <typename TYPE, int DIM> struct TTgCSQ_LNPT<TYPE,DIM,1,1>
{
TgFORCEINLINE static const TYPE DO( TYPE *ptySG0, M_(VECTOR,DIM) tvS0, M_(VECTOR,DIM) tvD0, M_(VECTOR,DIM) tvS1 )
{
C_(VECTOR,DIM) tvDS = MATH::F_SUB( tvS1, tvS0 );
const TYPE tyD0_D0 = MATH::F_LSQ( tvD0 );
TgASSERT( tyD0_D0 > LIMITS<TYPE>::EPSILON );
const TYPE tyDS_DS = MATH::F_LSQ( tvDS );
const TYPE tyDS_D0 = MATH::F_DOT(tvDS,tvD0);
const TYPE tyTA = P::FSEL( tyD0_D0 - tyDS_D0, tyDS_D0/tyD0_D0, TYPE(1.0) );
const TYPE tySG0 = P::FSEL( tyDS_D0, tyTA, TYPE(0.0) );
*ptySG0 = tySG0;
return (tyDS_DS - tyDS_D0*tySG0 + P::FSEL( tyD0_D0 - tyDS_D0, TYPE(0.0), tyD0_D0 - tyDS_D0 ));
};
TgFORCEINLINE static const TYPE DO( PC_(VECTOR,DIM) ptvT0, M_(VECTOR,DIM) tvS0, M_(VECTOR,DIM) tvD0, M_(VECTOR,DIM) tvS1 )
{
register TYPE tyT0;
const TYPE tyDistSq = DO( &tyT0, tvS0,tvD0, tvS1 );
*ptvT0 = MATH::F_ADD( tvS0, MATH::F_MUL( tyT0, tvD0 ) );
return (tyDistSq);
};
};
};
};
#endif