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

372 lines
12 KiB
C++

/*
///////////////////////////////////////////////////////////////////////////////////////////////////
// Description : TanObj.cpp
//
// Definition of the tangent objects
//
///////////////////////////////////////////////////////////////////////////////////////////////////
// inherit from : CPA_Object
// CPA_EdMot<ACP_tdxHandleOfLink>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Creation date: 29 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 "TanObj.hpp"
#include "Inter.hpp"
#include "LinkBez.hpp"
long Tangent::ms_lNbTangent=0;
Waypoint_Interface* Tangent::ms_poInterface;
//------ static
void Tangent::fn_vInitObject (Waypoint_Interface* poInterface)
{
ms_poInterface = poInterface;
}
Tangent::Tangent( CPA_ObjectDLLBase *p_oDLL, CPA_BaseObject *p_oOwner, eTangentLenghtMode eLenghtMode, eTangentOrientationMode eOrientationMode, eTangentNeighbourMode eNeighbourMode, eTangentChangeAllMode eChangeAllMode, GEO_tdstColor* pstColor ):
CPA_BaseObject ( p_oDLL, "Tangent" )
{
CPA_SuperObject* poSuperTangent = ms_poInterface->GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_NoType );
poSuperTangent->SetObject(this);
SetSuperObject (poSuperTangent);
poSuperTangent->SetTypeSO (C_Protected);
// name
CString csName;
csName.Format ("Tangent%d", ms_lNbTangent);
ms_lNbTangent++;
fn_eRename (csName);
// init
MTH3D_M_vNullVector(&m_stFixVertex);
MTH3D_M_vNullVector(&m_stTangentVector);
m_xDim = 0.05f;
m_bOrientationAllow=FALSE;
m_bNotifyWay=FALSE;
// color
if (pstColor) m_stColor = *pstColor;
else
{
m_stColor.xR = 0.f;
m_stColor.xG = 0.8f;
m_stColor.xB = 0.f;
}
m_eTangentLenghtMode = eLenghtMode;
m_eTangentOrientationMode = eOrientationMode;
m_eTangentNeighbourMode = eNeighbourMode;
m_eTangentChangeAllMode = eChangeAllMode;
// graphic object
CPA_SuperObject* poGraphic = GetInterface()->fn_pGetNewTangentGraphicObject (&m_stColor);
poGraphic->SetSuperObjectOwner (GetSuperObject());
GetSuperObject()->AddTail (poGraphic);
GEO_xComputeObjectNormals ( (ACP_tdxHandleOfObject)HIE_fn_hGetSuperObjectObject(poGraphic->GetStruct()));
poGraphic->SetEditProtected (TRUE);
m_poParent = (Link*)p_oOwner;
}
long Tangent::GetDataType (void)
{
return C_ucTangent;
}
void* Tangent::GetData (void)
{
return NULL;
}
void Tangent::fn_vSetAbsoluteVertex ( MTH3D_tdstVector* pstFixAbsoluteVertex, MTH3D_tdstVector* pstMoveAbsoluteVertex )
{
POS_tdstCompletePosition InvMatrix;
POS_fn_vSetIdentityMatrix(&InvMatrix);
GetInterface()->fn_vComputeAbsoluteMatrix (GetSuperObject());
GEO_tdxHandleToMatrix hAbsoluteLineMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (GetSuperObject()->GetStruct());
POS_fn_vInvertMatrix( &InvMatrix, hAbsoluteLineMatrix );
POS_fn_vMulMatrixVertex( &m_stFixVertex, &InvMatrix, pstFixAbsoluteVertex ) ;
m_stTangentVector = *pstMoveAbsoluteVertex;
m_stMoveVertex = *pstMoveAbsoluteVertex;
MTH3D_M_vSubVector( &m_stTangentVector, &m_stTangentVector, pstFixAbsoluteVertex );
m_bOrientationAllow=TRUE;
fn_vDraw ();
m_bOrientationAllow=FALSE;
}
void Tangent::fn_vSetTangent ( MTH3D_tdstVector* pstMoveAbsoluteVertex )
{
MTH3D_tdstVector st_FixVertex;
GetInterface()->fn_vComputeAbsoluteMatrix (GetSuperObject());
GEO_tdxHandleToMatrix hAbsoluteLineMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (GetSuperObject()->GetStruct());
POS_fn_vMulMatrixVertex( &st_FixVertex, hAbsoluteLineMatrix, &m_stFixVertex ) ;
switch (m_eTangentLenghtMode)
{
case eVariableLenghtTangent:
m_stTangentVector = *pstMoveAbsoluteVertex;
MTH3D_M_vSubVector(&m_stTangentVector, &m_stTangentVector, &st_FixVertex );
break;
case eFixLenghtTangent:
{
GLI_tdxValue xLenght, xModifLenght, xRatio;
xLenght = MTH3D_M_xNormVector( &m_stTangentVector );
m_stTangentVector = *pstMoveAbsoluteVertex;
MTH3D_M_vSubVector( &m_stTangentVector, &m_stTangentVector, &st_FixVertex );
xModifLenght = MTH3D_M_xNormVector( &m_stTangentVector );
xRatio = xModifLenght>0 ? xLenght/xModifLenght : 1.f;
MTH3D_M_vMulScalarVector(&m_stTangentVector,xRatio, &m_stTangentVector);
} break;
}
m_bOrientationAllow=TRUE;
m_poParent->fn_vDraw ();
m_bOrientationAllow=FALSE;
}
void Tangent::fn_vSetTangentDirection ( MTH3D_tdstVector* pstAbsoluteDirectionVertex, BOOL bOppositeDirection )
{
MTH_tdxReal xLenght = MTH3D_M_xNormVector( &m_stTangentVector );
m_stTangentVector = *pstAbsoluteDirectionVertex;
MTH3D_M_vNormalizeVector(&m_stTangentVector,&m_stTangentVector);
if(bOppositeDirection) MTH3D_M_vMulScalarVector( &m_stTangentVector, -xLenght, &m_stTangentVector )
else MTH3D_M_vMulScalarVector( &m_stTangentVector, xLenght, &m_stTangentVector );
m_bOrientationAllow=TRUE;
fn_vDraw ();
m_bOrientationAllow=FALSE;
}
void Tangent::fn_pGetAbsoluteTangent (MTH3D_tdstVector* pstTangent)
{
*pstTangent = m_stTangentVector;
}
void Tangent::fn_vConstructGraphic (void)
{
CPA_SuperObject* poGraphic = GetInterface()->fn_pGetNewTangentGraphicObject(&m_stColor);
poGraphic->SetSuperObjectOwner (GetSuperObject());
GetSuperObject()->AddTail (poGraphic);
GEO_xComputeObjectNormals ( (ACP_tdxHandleOfObject)HIE_fn_hGetSuperObjectObject(poGraphic->GetStruct()));
poGraphic->SetEditProtected (TRUE);
}
void Tangent::fn_vDraw (void)
{
if (m_eTangentOrientationMode==eVariableOrientationTangent && !m_bOrientationAllow)
{
MTH3D_tdstVector stU, stV;
GEO_tdxHandleToMatrix hAbsoluteMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (GetSuperObject()->GetStruct());
GLI_tdxValue xlenght = MTH3D_M_xNormVector( &m_stTangentVector );
POS_fn_vGetRotationMatrix( hAbsoluteMatrix , &stU, &stV, &m_stTangentVector );
MTH3D_M_vMulScalarVector ( &m_stTangentVector, xlenght, &m_stTangentVector );
return;
}
MTH3D_tdstVector stAbsoluteFixVertex, stAbsoluteMoveVertex;
GEO_tdxHandleToMatrix hAbsoluteMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (GetSuperObject()->GetStruct());
GetInterface()->fn_vComputeAbsoluteMatrix (GetSuperObject());
POS_fn_vNormalizeMatrix( hAbsoluteMatrix ) ;
POS_fn_vMulMatrixVertex( &stAbsoluteFixVertex, hAbsoluteMatrix, &m_stFixVertex ) ;
stAbsoluteMoveVertex = stAbsoluteFixVertex;
MTH3D_M_vAddVector(&stAbsoluteMoveVertex, &stAbsoluteMoveVertex, &m_stTangentVector );
tdeLocalColor tdColor = GetSuperObject()->GetLocalColor ();
CPA_SuperObject* psoObject = (CPA_SuperObject*)GetSuperObject()->GetHead();
GLI_tdxValue d=m_xDim;
GLI_tdxValue md=-m_xDim;
GLI_tdxValue d2=(GLI_tdxValue)(m_xDim*2.);
GLI_tdxValue md2=(GLI_tdxValue)(-m_xDim*2.);
GLI_tdxValue zero=0.;
MTH3D_tdstVector n, u, v;
MTH3D_tdstVector Ox = { 1., 0., 0. };
// Version finale
ACP_tdxHandleOfObject hMot = (ACP_tdxHandleOfObject) HIE_fn_hGetSuperObjectObject(psoObject->GetStruct());
n = stAbsoluteMoveVertex;
MTH3D_M_vSubVector(&n,&n,&stAbsoluteFixVertex);
GLI_tdxValue lenght = MTH3D_M_xNormVector( &n );
GLI_tdxValue lenght8 = (GLI_tdxValue)(lenght*0.8);
MTH3D_tdstVector a8_stPoint [13];
MTH3D_M_vSetVectorElements (a8_stPoint, md,md,zero);
MTH3D_M_vSetVectorElements (a8_stPoint+1, d,md,zero);
MTH3D_M_vSetVectorElements (a8_stPoint+2, d,d,zero);
MTH3D_M_vSetVectorElements (a8_stPoint+3, md,d,zero);
MTH3D_M_vSetVectorElements (a8_stPoint+4, md,md,lenght8);
MTH3D_M_vSetVectorElements (a8_stPoint+5, d,md,lenght8);
MTH3D_M_vSetVectorElements (a8_stPoint+6, d,d,lenght8);
MTH3D_M_vSetVectorElements (a8_stPoint+7, md,d,lenght8);
MTH3D_M_vSetVectorElements (a8_stPoint+8, md2,md2,lenght8);
MTH3D_M_vSetVectorElements (a8_stPoint+9, d2,md2,lenght8);
MTH3D_M_vSetVectorElements (a8_stPoint+10, d2,d2,lenght8);
MTH3D_M_vSetVectorElements (a8_stPoint+11, md2,d2,lenght8);
MTH3D_M_vSetVectorElements (a8_stPoint+12, 0,0,lenght);
GEO_vSetListOfPointsOfObject
(
hMot,
a8_stPoint,
13,
0
);
MTH3D_M_vNormalizeVector(&n,&n);
// here : to rotate the beam around its principal axis
// by defaults find section align with plan z=0
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));
// change the local matrix
GEO_tdxHandleToMatrix hAbsoluteLineMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (psoObject->GetStruct());
POS_fn_vSetIdentityMatrix( hAbsoluteLineMatrix );
POS_fn_vSetTranslationVector( hAbsoluteLineMatrix, &stAbsoluteFixVertex );
POS_fn_vSetRotationMatrix( hAbsoluteLineMatrix , &u, &v, &n );
GetInterface()->fn_vComputeNewRelativeMatrix (psoObject->GetStruct());
}
Waypoint_Interface* Tangent::GetInterface (void)
{
return ms_poInterface;
}
void Tangent::fn_vStartMove ( MTH3D_tdstVector* pstStartVertex, BOOL bShift, BOOL bControl )
{
MTH3D_tdstVector stExtremVector, stPickVector;
MTH3D_tdstVector st_FixVertex;
GetInterface()->fn_vComputeAbsoluteMatrix (GetSuperObject());
GEO_tdxHandleToMatrix hAbsoluteLineMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (GetSuperObject()->GetStruct());
POS_fn_vMulMatrixVertex( &st_FixVertex, hAbsoluteLineMatrix, &m_stFixVertex ) ;
stExtremVector = m_stMoveVertex;
stPickVector = *pstStartVertex;
MTH3D_M_vSubVector( &stExtremVector, &stExtremVector, &st_FixVertex);
MTH3D_M_vSubVector( &stPickVector, &stPickVector, &st_FixVertex);
m_xMoveRatio = MTH3D_M_xNormVector(&stExtremVector)/MTH3D_M_xNormVector(&stPickVector);
fn_vChangeNeighbourTangent (bShift, bControl);
fn_vChangeAllTangent (bShift, bControl);
GetInterface()->fn_vEdit (m_poParent);
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
void Tangent::fn_vMove ( MTH3D_tdstVector* pstTranslation, BOOL bShift, BOOL bControl )
{
MTH3D_tdstVector stTranslation = * pstTranslation;
MTH3D_M_vMulScalarVector(&stTranslation,m_xMoveRatio, &stTranslation);
MTH3D_M_vAddVector(&m_stMoveVertex, &m_stMoveVertex, &stTranslation);
fn_vSetTangent ( &m_stMoveVertex );
fn_vChangeNeighbourTangent (bShift, bControl);
fn_vChangeAllTangent (bShift, bControl);
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
m_bNotifyWay=TRUE;
}
void Tangent::fn_vEndMove (void)
{
if (m_bNotifyWay)
{
m_poParent->fn_vWayNotifySave();
m_bNotifyWay=FALSE;
}
}
void Tangent::fn_vChangeNeighbourTangent (BOOL bShift, BOOL bControl)
{
switch (m_eTangentNeighbourMode)
{
case eAlwaysChangeNeighbour :
m_poParent->fn_vChangeNeighbourTangent (this);
break;
case eShiftDownChangeNeighbour :
if (bShift) m_poParent->fn_vChangeNeighbourTangent (this);
break;
case eControlDownChangeNeighbour :
if (bControl) m_poParent->fn_vChangeNeighbourTangent (this);
break;
case eShiftUpChangeNeighbour :
if (!bShift) m_poParent->fn_vChangeNeighbourTangent (this);
break;
case eControlUpChangeNeighbour :
if (!bControl) m_poParent->fn_vChangeNeighbourTangent (this);
break;
}
}
void Tangent::fn_vChangeAllTangent (void)
{
m_poParent->fn_vChangeAllTangent (this);
}
void Tangent::fn_vChangeAllTangent (BOOL bShift, BOOL bControl)
{
switch (m_eTangentChangeAllMode)
{
case eAlwaysChangeAll :
m_poParent->fn_vChangeAllTangent (this);
break;
case eShiftDownChangeAll :
if (bShift) m_poParent->fn_vChangeAllTangent (this);
break;
case eControlDownChangeAll :
if (bControl) m_poParent->fn_vChangeAllTangent (this);
break;
case eShiftUpChangeAll :
if (!bShift) m_poParent->fn_vChangeAllTangent (this);
break;
case eControlUpChangeAll :
if (!bControl) m_poParent->fn_vChangeAllTangent (this);
break;
}
}
*/
//ENDANNECY Shaitan Nettoyage }