258 lines
8.5 KiB
C++
258 lines
8.5 KiB
C++
/*
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description : Link2D.cpp
|
|
//
|
|
// Definition of links defined in a 2D plane
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// inherit from : Link
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Creation date: 30 jan 1997 Author: J Thénoz
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Modification date: Author:
|
|
//
|
|
//
|
|
//
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
*/
|
|
//ANNECY Shaitan Nettoyage (12/05/98) {
|
|
/*
|
|
|
|
#include "stdafx.h"
|
|
#include "acp_base.h"
|
|
#include "incitf.h"
|
|
#include "incgam.h"
|
|
#include "incai.h"
|
|
#include "WPObj.hpp"
|
|
#include "WayObj.hpp"
|
|
#include "LinkObj.hpp"
|
|
#include "Inter.hpp"
|
|
#include "Link2D.hpp"
|
|
|
|
Link2D::Link2D ( CPA_ObjectDLLBase *p_oDLL, CPA_BaseObject *p_oOwner, WP_tdhLink hLink )
|
|
: Link ( p_oDLL, p_oOwner, hLink )
|
|
{
|
|
m_xe = 0.025f;
|
|
}
|
|
|
|
Link2D::Link2D ( CPA_ObjectDLLBase *p_oDLL, CPA_BaseObject *p_oOwner )
|
|
: Link ( p_oDLL, p_oOwner )
|
|
{
|
|
m_xe = 0.025f;
|
|
}
|
|
|
|
|
|
void Link2D::fn_vConstructPlane (void)
|
|
{
|
|
m_poGraphic = GetInterface()->fn_pGetNewPlaneGraphicObject();
|
|
m_poGraphic->SetSuperObjectOwner (GetSuperObject());
|
|
GetInterface()->GetInterface()->fn_bInsertObjectInHierarchy (m_poGraphic,GetSuperObject(),FALSE,FALSE,FALSE);
|
|
GEO_xComputeObjectNormals ( (ACP_tdxHandleOfObject)HIE_fn_hGetSuperObjectObject(m_poGraphic->GetStruct()));
|
|
m_poGraphic->SetEditProtected (TRUE);
|
|
}
|
|
|
|
|
|
void Link2D::fn_vDestroyPlane (void)
|
|
{
|
|
GetInterface()->fn_vSetModifDeleteOk (TRUE);
|
|
GetInterface()->GetInterface()->fn_bDeleteObjectInHierarchy (m_poGraphic,FALSE,FALSE,TRUE,FALSE);
|
|
GetInterface()->fn_vSetModifDeleteOk (FALSE);
|
|
m_poGraphic = NULL;
|
|
}
|
|
|
|
void Link2D::fn_vDrawPlane (void)
|
|
{
|
|
MTH3D_tdstVector stFirstVertex, stSecondVertex;
|
|
GLI_tdxValue d5, md5;
|
|
|
|
tdeLocalColor tdColor = GetSuperObject()->GetLocalColor ();
|
|
|
|
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poFirstWP->GetEngineStruct()), &stFirstVertex );
|
|
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poSecondWP->GetEngineStruct()), &stSecondVertex );
|
|
|
|
MTH3D_tdstVector n, u, v;
|
|
|
|
ACP_tdxHandleOfObject hMot = (ACP_tdxHandleOfObject) HIE_fn_hGetSuperObjectObject(m_poGraphic->GetStruct());
|
|
|
|
n = stSecondVertex;
|
|
MTH3D_M_vSubVector(&n,&n,&stFirstVertex);
|
|
GLI_tdxValue lenght = MTH3D_M_xNormVector( &n );
|
|
d5 = (GLI_tdxValue)(lenght*0.5);
|
|
md5 = -d5;
|
|
|
|
MTH3D_tdstVector a8_stPoint [24];
|
|
|
|
MTH3D_M_vSetVectorElements (a8_stPoint, 0,-0.5,m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+1, 1.,-0.5,m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+2, 1.,0.5,m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+3, 0,0.5,m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+4, 0,-0.5,-m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+5, 1.,-0.5,-m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+6, 1.,0.5,-m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+7, 0,0.5,-m_xe);
|
|
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+8, 0.4f, -0.6f, m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+9, 0.6f, -0.6f, m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+10, 0.6f, -0.5f, m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+11, 0.4f, -0.5f, m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+12, 0.4f, -0.6f, -m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+13, 0.6f, -0.6f, -m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+14, 0.6f, -0.5f, -m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+15, 0.4f, -0.5f, -m_xe);
|
|
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+16, 0.4f, 0.5f, m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+17, 0.6f, 0.5f, m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+18, 0.6f, 0.6f, m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+19, 0.4f, 0.6f, m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+20, 0.4f, 0.5f, -m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+21, 0.6f, 0.5f, -m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+22, 0.6f, 0.6f, -m_xe);
|
|
MTH3D_M_vSetVectorElements (a8_stPoint+23, 0.4f, 0.6f, -m_xe);
|
|
|
|
GEO_vSetListOfPointsOfObject
|
|
(
|
|
hMot,
|
|
a8_stPoint,
|
|
24,
|
|
0
|
|
);
|
|
GEO_xComputeObjectNormals ( hMot );
|
|
|
|
MTH3D_M_vNormalizeVector(&n,&n);
|
|
|
|
if (n.xX||n.xY) { MTH3D_M_vSetVectorElements ((&u),(-n.xY),(n.xX),0.); }
|
|
else { MTH3D_M_vSetVectorElements((&u),0.,(-n.xZ),n.xY); }
|
|
MTH3D_M_vNormalizeVector(&u,&u);
|
|
MTH3D_M_vCrossProductVector((&v),(&n),(&u));
|
|
|
|
fn_vComputePlaneAxis ();
|
|
}
|
|
|
|
// moves
|
|
void Link2D::fn_vStartMove ( MTH3D_tdstVector* pstStartVertex )
|
|
{
|
|
m_stPlaneVertex = *pstStartVertex;
|
|
fn_vDrawPlane ();
|
|
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
}
|
|
|
|
void Link2D::fn_vMove ( MTH3D_tdstVector* pstTranslation )
|
|
{
|
|
MTH3D_tdstVector stInitialValue = m_stPlaneVertex;
|
|
MTH3D_M_vAddVector(&m_stPlaneVertex,&m_stPlaneVertex,pstTranslation);
|
|
fn_vComputePlaneAxis (&m_stPlaneVertex);
|
|
fn_vProjVertex ( &m_stPlaneVertex );
|
|
|
|
|
|
fn_vDrawPlane ();
|
|
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
|
|
*pstTranslation = m_stPlaneVertex;
|
|
MTH3D_M_vSubVector(pstTranslation, pstTranslation, &stInitialValue);
|
|
}
|
|
|
|
void Link2D::fn_vEndMove (void)
|
|
{
|
|
fn_vWayNotifySave ();
|
|
}
|
|
|
|
void Link2D::fn_vComputePlaneAxis (MTH3D_tdstVector* pstVertex)
|
|
{
|
|
MTH3D_tdstVector stFirstVertex, stSecondVertex;
|
|
MTH3D_tdstVector Ox, Oy, Oz;
|
|
MTH3D_tdstVector v;
|
|
MTH3D_tdstVector stVectorU, stVectorV, stVectorN;
|
|
|
|
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poFirstWP->GetEngineStruct()), &stFirstVertex );
|
|
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poSecondWP->GetEngineStruct()), &stSecondVertex );
|
|
|
|
Ox = stSecondVertex;
|
|
MTH3D_M_vSubVector(&Ox,&Ox,&stFirstVertex);
|
|
GLI_tdxValue lenght = MTH3D_M_xNormVector( &Ox );
|
|
|
|
if (pstVertex)
|
|
{
|
|
v = *pstVertex;
|
|
MTH3D_M_vSubVector(&v,&v,&stFirstVertex);
|
|
MTH3D_M_vCrossProductVector((&Oz),(&Ox),(&v));
|
|
|
|
// we keep the normal on the same side !!
|
|
if (MTH3D_M_xDotProductVector(&Oz,&m_stNormalVertex)<=0) MTH3D_M_vMulScalarVector (&Oz,-1,&Oz);
|
|
}
|
|
else Oz = m_stNormalVertex;
|
|
|
|
MTH3D_M_vCrossProductVector((&Oy),(&Oz),(&Ox));
|
|
MTH3D_M_vCrossProductVector((&Oz),(&Ox),(&Oy));
|
|
|
|
MTH3D_M_vNormalizeVector(&Oy,&Oy);
|
|
MTH3D_M_vNormalizeVector(&Oz,&Oz);
|
|
MTH3D_M_vNormalizeVector(&Ox,&Ox);
|
|
|
|
GEO_tdxHandleToMatrix hAbsolutePlaneMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (m_poGraphic->GetStruct());
|
|
POS_fn_vSetIdentityMatrix( hAbsolutePlaneMatrix );
|
|
POS_fn_vSetTranslationVector( hAbsolutePlaneMatrix, &stFirstVertex );
|
|
POS_fn_vSetRotationMatrix( hAbsolutePlaneMatrix , &Ox, &Oy, &Oz );
|
|
|
|
POS_fn_vGetScaleMatrix( hAbsolutePlaneMatrix, &stVectorU, &stVectorV, &stVectorN );
|
|
|
|
MTH3D_M_vMulScalarVector( &stVectorU, lenght, &stVectorU);
|
|
MTH3D_M_vMulScalarVector( &stVectorV, lenght, &stVectorV);
|
|
POS_fn_vSetScaleMatrix( hAbsolutePlaneMatrix, &stVectorU, &stVectorV, &stVectorN );
|
|
|
|
POS_fn_vNormalizeMatrix( hAbsolutePlaneMatrix ) ;
|
|
GetInterface()->fn_vComputeNewRelativeMatrix (m_poGraphic->GetStruct());
|
|
|
|
m_stNormalVertex = Oz;
|
|
}
|
|
|
|
void Link2D::fn_vSetPlaneHorizontal (void)
|
|
{
|
|
MTH3D_M_vSetVectorElements (&m_stNormalVertex, 0., 0., 1.);
|
|
fn_vComputePlaneAxis ();
|
|
fn_vDrawPlane ();
|
|
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
}
|
|
|
|
void Link2D::fn_vSetPlaneVertical (void)
|
|
{
|
|
MTH3D_tdstVector Ox, Oy;
|
|
MTH3D_tdstVector stFirstVertex, stSecondVertex;
|
|
|
|
MTH3D_M_vSetVectorElements (&Oy, 0., 0., 1.);
|
|
|
|
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poFirstWP->GetEngineStruct()), &stFirstVertex );
|
|
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poSecondWP->GetEngineStruct()), &stSecondVertex );
|
|
|
|
Ox = stSecondVertex;
|
|
MTH3D_M_vSubVector(&Ox,&Ox,&stFirstVertex);
|
|
|
|
MTH3D_M_vCrossProductVector ( &m_stNormalVertex, &Ox, &Oy );
|
|
|
|
fn_vComputePlaneAxis ();
|
|
fn_vDrawPlane ();
|
|
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
}
|
|
|
|
void Link2D::fn_vProjVertex ( MTH3D_tdstVector* pstVertex )
|
|
{
|
|
POS_tdstCompletePosition stInvMatrix;
|
|
MTH3D_tdstVector stLocalVertex;
|
|
MTH_tdxReal sty;
|
|
|
|
POS_fn_vSetIdentityMatrix(&stInvMatrix);
|
|
GEO_tdxHandleToMatrix hAbsoluteMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (m_poGraphic->GetStruct());
|
|
POS_fn_vInvertMatrix( &stInvMatrix , hAbsoluteMatrix );
|
|
POS_fn_vMulMatrixVertex( &stLocalVertex, &stInvMatrix, pstVertex);
|
|
MTH3D_M_vSetXofVector(&stLocalVertex,0.5);
|
|
sty = MTH3D_M_xGetYofVector(&stLocalVertex);
|
|
if (sty>0.) MTH3D_M_vSetYofVector(&stLocalVertex,0.55f)
|
|
else MTH3D_M_vSetYofVector(&stLocalVertex,-0.55f);
|
|
MTH3D_M_vSetZofVector(&stLocalVertex,0.);
|
|
POS_fn_vMulMatrixVertex( pstVertex ,hAbsoluteMatrix, &stLocalVertex);
|
|
}
|
|
|
|
*/
|
|
//ENDANNECY Shaitan Nettoyage }
|
|
|