reman3/Rayman_X/cpa/tempgrp/Owp/src/Link2D.cpp

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 }