Home

Resume

Blog

Teikitu


// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= //
//  »Project«   Teikitu Gaming System (TgS) (∂)
//  »File«      TgS Common - Geometry 3D - Line.i_inc
//  »Author«    Andrew Aye (EMail: mailto:andrew.aye@gmail.com, Web: http://www.andrewaye.com)
//  »Version«   4.0
// ------------------------------------------------------------------------------------------------------------------------------ //
//  Copyright: © 2002-2010, Andrew Aye.  All Rights Reserved.
//  This software is free for non-commercial use. Redistribution and use in source and binary forms, with or without modification,
//  are permitted provided that the following conditions are met: 
//    Redistributions of source code must retain this copyright notice, this list of conditions and the following disclaimers. 
//    Redistributions in binary form must reproduce this copyright notice, this list of conditions and the following
//      disclaimers in the documentation and other materials provided with the distribution. 
//  Neither the names of the copyright owner nor the names of its contributors may be used to endorse or promote products derived
//  from this software without specific prior written permission. 
//  The intellectual property rights of the algorithms used reside with Andrew Aye.  You may not use this software, in whole or
//  in part, in support of any commercial product without the express written consent of the author.
//  There is no warranty or other guarantee of fitness of this software for any purpose. It is provided solely "as is".
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= //
// == Geometry ================================================================================================================== //

TgINLINE TgVOID V(tgGM_Constructor_LN)( V(PCU_TgLINE) psLN0 )
{
    V(tgGM_Reset_LN)( psLN0 );
}


TgINLINE TgVOID V(tgGM_Reset_LN)( V(PCU_TgLINE) psLN0 )
{
    psLN0->m_vOrigin = V(F_SETP_ELEM)( MKL(0.0), MKL(0.0), MKL(0.0) );
    psLN0->m_vDirN = V(F_SETV_ELEM)( MKL(0.0), MKL(0.0), MKL(0.0) );
}


TgINLINE TgBOOL V(tgGM_Is_Valid_LN)( V(CPCU_TgLINE) psLN1 )
{
    if (!V(F_Is_Point_Valid)( &psLN1->m_vOrigin ))
    {
        return (TgFALSE);
    };

    if (!V(F_Is_Vector_Valid)( &psLN1->m_vDirN ))
    {
        return (TgFALSE);
    };

    return (TgTRUE);
}


TgINLINE TgVOID V(tgGM_BA_LN)( V(PCU_TgBOXAA) psBA0, V(CPCU_TgLINE) psLN )
{
    V(tgGM_Set_Invalid_BA)( psBA0 );
}


TgINLINE TgVOID V(tgGM_Sweep_BA_LN)( V(PCU_TgBOXAA) psBA0, V(CPCU_TgLINE) psLN, V(CPCU_TgVEC) pvDT )
{
    V(tgGM_Set_Invalid_BA)( psBA0 );
}


TgINLINE TgVOID V(tgGM_Project_LN)( PCU_TYPE ptyMin, PCU_TYPE ptyMax, V(CPCU_TgLINE) psLN1, V(CPCU_TgVEC) pvDN )
{
    TgGEOM_ASSERT_PARAM(0 != ptyMin && 0 != ptyMax && V(tgGM_Is_Valid_LN)( psLN1 ) && V(F_Is_Vector_Valid)( pvDN ));

    *ptyMin = -F(KTgMAX);
    *ptyMax =  F(KTgMAX);
}


TgINLINE TgBOOL V(tgGM_Is_Contained_LN)( V(CPCU_TgLINE) psLN1, V(CPCU_TgVEC) pvS0 )
{
    V(C_TgVEC)                          vDS = V(F_SUB_VV)( pvS0, &psLN1->m_vOrigin );
    const TYPE                          fDS = V(F_DOT_VV)( &vDS, &psLN1->m_vDirN );
    V(C_TgVEC)                          tvS1 = V(F_MUL_SV)( fDS, &psLN1->m_vDirN );
    V(C_TgVEC)                          tvS2 = V(F_ADD_VV)( &tvS1, &psLN1->m_vOrigin );
    V(C_TgVEC)                          tvS3 = V(F_SUB_VV)( pvS0, &tvS2 );

    return (F(tgCM_NR0)( V(F_LEN)( &tvS3 ) ));
}


TgINLINE TgVOID V(tgGM_TX_LN)( V(PCU_TgLINE) psLN0, M34(CPCU_TgMAT) pxM0 )
{
    TgGEOM_ASSERT_PARAM(!M34(F_NaN)( pxM0 ));

    psLN0->m_vOrigin = V(F_TX_P_34)( pxM0, &psLN0->m_vOrigin );
    psLN0->m_vDirN = V(F_TX_V_34)( pxM0, &psLN0->m_vDirN );
}


TgINLINE TgVOID V(tgGM_Copy_TX_LN)( V(PCU_TgLINE) psLN0, V(CPCU_TgLINE) psLN1, M34(CPCU_TgMAT) pxM0 )
{
    TgGEOM_ASSERT_PARAM(V(tgGM_Is_Valid_LN)( psLN1 ) && !M34(F_NaN)( pxM0 ));

    psLN0->m_vOrigin = V(F_TX_P_34)( pxM0, &psLN1->m_vOrigin );
    psLN0->m_vDirN = V(F_TX_V_34)( pxM0, &psLN1->m_vDirN );
}


TgINLINE TgVOID V(tgGM_Init_LN)( V(PCU_TgLINE) psLN0, V(CPCU_TgVEC) pvS0, V(CPCU_TgVEC) pvDN )
{
    TgGEOM_ASSERT_PARAM(V(F_Is_Point_Valid)( pvS0 ) && V(F_Is_Vector_Valid)( pvDN ));

    psLN0->m_vOrigin = *pvS0;
    psLN0->m_vDirN = *pvDN;
}


TgINLINE TgVOID V(tgGM_Copy_LN)( V(PCU_TgLINE) psLN0, V(CPCU_TgLINE) psLN1 )
{
    TgGEOM_ASSERT_PARAM(V(tgGM_Is_Valid_LN)( psLN1 ));

    psLN0->m_vOrigin = psLN1->m_vOrigin;
    psLN0->m_vDirN = psLN1->m_vDirN;
}


TgINLINE TgVOID V(tgGM_Set_Origin_LN)( V(PCU_TgLINE) psLN0, V(CPCU_TgVEC) pvS0 )
{
    TgGEOM_ASSERT_PARAM(V(F_Is_Point_Valid)( pvS0 ));
    psLN0->m_vOrigin = *pvS0;
}


TgINLINE TgVOID V(tgGM_Set_DirN_LN)( V(PCU_TgLINE) psLN0, V(CPCU_TgVEC) pvDN )
{
    TgGEOM_ASSERT_PARAM(V(F_Is_Vector_Valid)( pvDN ));
    psLN0->m_vDirN = *pvDN;
}


TgINLINE V(CP_TgVEC) V(tgGM_Query_Origin_LN)( V(CPCU_TgLINE) psLN1 )
{
    return (&psLN1->m_vOrigin);
}


TgINLINE V(CP_TgVEC) V(tgGM_Query_DirN_LN)( V(CPCU_TgLINE) psLN1 )
{
    return (&psLN1->m_vDirN);
}


//TgINLINE TgVOID V(tgGM_M_TX_LN)( V(PCU_TgLINE) psLN0, M34(CPCU_TgMAT) pxM0 )
//{
//    TgGEOM_ASSERT_PARAM(!M34(F_NaN)( pxM0 ));
//
//    psLN0->m_vOrigin = V(tgGM_M_TX)( pxM0, psLN0->m_vOrigin );
//    psLN0->m_vDirN = V(tgGM_M_TX)( pxM0, psLN0->m_vDirN );
//};
//
//
//TgINLINE TgVOID V(tgGM_M_TX_LN)( V(PCU_TgLINE) psLN0, V(CPCU_TgLINE) psLN1, M34(CPCU_TgMAT) pxM0 )
//{
//    TgGEOM_ASSERT_PARAM(Is_Valid( psLN1 ) && !M34(F_NaN)( pxM0 ));
//
//    psLN0->m_vOrigin = V(tgGM_M_TX)( pxM0, psLN1->m_vOrigin );
//    psLN0->m_vDirN = V(tgGM_M_TX)( pxM0, psLN1->m_vDirN );
//};