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

233 lines
6.8 KiB
C++

/*
///////////////////////////////////////////////////////////////////////////////////////////////////
// Description : CurObj.cpp
//
// Definition of the cursor object
//
///////////////////////////////////////////////////////////////////////////////////////////////////
// inherit from : CPA_Object
// CPA_EdMot<ACP_tdxHandleOfLink>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Creation date: 5 feb 1997 Author: J Thénoz
///////////////////////////////////////////////////////////////////////////////////////////////////
// Modification date: Author:
//
//
//
//
///////////////////////////////////////////////////////////////////////////////////////////////////
*/
#include "stdafx.h"
#include "acp_base.h"
#include "incitf.h"
#include "incgam.h"
#include "incai.h"
#include "WPObj.hpp"
//ANNECY Shaitan Nettoyage (12/05/98) {
/*
#include "WayObj.hpp"
#include "LinkObj.hpp"
*/
//ENDANNECY Shaitan Nettoyage }
#include "CurObj.hpp"
#include "Inter.hpp"
//-------- static init
long Cursor::ms_lNbCursor=0;
Waypoint_Interface* Cursor::ms_poInterface;
//------ static
void Cursor::fn_vInitObject (Waypoint_Interface* poInterface)
{
ms_poInterface = poInterface;
}
Cursor::Cursor( CPA_ObjectDLLBase *p_oDLL, CPA_BaseObject *p_oOwner, eCursorMouseMoveLimit elimit ):
CPA_BaseObject ( p_oDLL, "Cursor" )
{
CPA_SuperObject* poSuperCursor = ms_poInterface->GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_NoType );
m_poSuperObject = poSuperCursor;
poSuperCursor->SetTypeSO (C_Protected);
poSuperCursor->SetObject(this);
SetSuperObject (poSuperCursor);
// name
CString csName;
csName.Format ("Cursor%d", ms_lNbCursor);
ms_lNbCursor++;
fn_eRename (csName);
// init
MTH3D_M_vNullVector(&m_stVertex);
m_xDim=0.05f;
m_poParent = (CPA_SuperObject*)p_oOwner;
m_eMouseMoveLimit = elimit;
m_bCursorMove = FALSE;
// graphic object
CPA_SuperObject* poGraphic = GetInterface()->fn_pGetNewCursorGraphicObject();
poGraphic->SetSuperObjectOwner (GetSuperObject());
GetSuperObject()->AddTail (poGraphic);
GEO_xComputeObjectNormals ( (ACP_tdxHandleOfObject)HIE_fn_hGetSuperObjectObject(poGraphic->GetStruct()));
poGraphic->SetEditProtected (TRUE);
}
long Cursor::GetDataType (void)
{
return C_ucCursor;
}
void* Cursor::GetData (void)
{
return NULL;
}
Waypoint_Interface* Cursor::GetInterface (void)
{
return ms_poInterface;
}
void Cursor::fn_vDraw (void)
{
MTH3D_tdstVector stAbsoluteVertex;
tdeLocalColor tdColor = GetSuperObject()->GetLocalColor ();
CPA_SuperObject* psoObject = (CPA_SuperObject*)GetSuperObject()->GetHead();
fn_vGetAbsoluteVertex ( &stAbsoluteVertex );
ACP_tdxHandleOfObject hMot = (ACP_tdxHandleOfObject) HIE_fn_hGetSuperObjectObject(psoObject->GetStruct());
MTH3D_tdstVector a8_stPoint [13];
MTH3D_M_vSetVectorElements (a8_stPoint, m_xDim,m_xDim,-m_xDim);
MTH3D_M_vSetVectorElements (a8_stPoint+1, m_xDim,-m_xDim,-m_xDim);
MTH3D_M_vSetVectorElements (a8_stPoint+2, -m_xDim,-m_xDim,-m_xDim);
MTH3D_M_vSetVectorElements (a8_stPoint+3, -m_xDim,m_xDim,-m_xDim);
MTH3D_M_vSetVectorElements (a8_stPoint+4, m_xDim,m_xDim,m_xDim);
MTH3D_M_vSetVectorElements (a8_stPoint+5, m_xDim,-m_xDim,m_xDim);
MTH3D_M_vSetVectorElements (a8_stPoint+6, -m_xDim,-m_xDim,m_xDim);
MTH3D_M_vSetVectorElements (a8_stPoint+7, -m_xDim,m_xDim,m_xDim);
GEO_vSetListOfPointsOfObject
(
hMot,
a8_stPoint,
8,
0
);
GEO_xComputeObjectNormals ( hMot );
// change the local matrix
GEO_tdxHandleToMatrix hAbsoluteObjectMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (psoObject->GetStruct());
GEO_tdxHandleToMatrix hAbsoluteFatherMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (m_poParent->GetStruct());
POS_fn_vSetIdentityMatrix( hAbsoluteObjectMatrix );
MTH3D_tdstVector stOx, stOy, stOz;
POS_fn_vGetRotationMatrix( hAbsoluteFatherMatrix ,
&stOx, &stOy, &stOz );
POS_fn_vSetRotationMatrix( hAbsoluteObjectMatrix ,
&stOx, &stOy, &stOz );
POS_fn_vSetTranslationVector( hAbsoluteObjectMatrix, &stAbsoluteVertex );
GetInterface()->fn_vComputeNewRelativeMatrix (psoObject->GetStruct());
}
void Cursor::fn_vSetAbsoluteVertex ( MTH3D_tdstVector* pAbsoluteVertex )
{
POS_tdstCompletePosition stInvMatrix;
POS_fn_vSetIdentityMatrix(&stInvMatrix);
GEO_tdxHandleToMatrix hAbsoluteLineMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (m_poParent->GetStruct());
POS_fn_vInvertMatrix( &stInvMatrix , hAbsoluteLineMatrix );
POS_fn_vMulMatrixVertex( &m_stVertex, &stInvMatrix, pAbsoluteVertex) ;
m_stVertex.xZ=0.;
}
void Cursor::fn_vGetAbsoluteVertex ( MTH3D_tdstVector* pAbsoluteVertex )
{
GEO_tdxHandleToMatrix hAbsoluteLineMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (m_poParent->GetStruct());
POS_fn_vMulMatrixVertex( pAbsoluteVertex, hAbsoluteLineMatrix, &m_stVertex) ;
}
void Cursor::fn_vStartMove ( MTH3D_tdstVector* pstStartVertex )
{
fn_vSetAbsoluteVertex (pstStartVertex);
fn_vDraw ();
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
void Cursor::fn_vMove ( MTH3D_tdstVector* pstTranslation )
{
MTH3D_tdstVector stVertex, stInitialVertex;
fn_vGetAbsoluteVertex ( &stVertex );
stInitialVertex = stVertex;
MTH3D_M_vAddVector(&stVertex, &stVertex, pstTranslation);
if (fn_bCanMove(&stVertex))
{
fn_vSetAbsoluteVertex ( &stVertex );
fn_vGetAbsoluteVertex ( pstTranslation );
MTH3D_M_vSubVector(pstTranslation, pstTranslation, &stInitialVertex );
fn_vDraw ();
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
else MTH3D_M_vSetVectorElements (pstTranslation, 0., 0., 0.);
}
void Cursor::fn_vEndMove (void)
{
m_bCursorMove = TRUE;
}
BOOL Cursor::fn_bCanMove ( MTH3D_tdstVector* pstVertex )
{
switch (m_eMouseMoveLimit)
{
case eCursorCircularLimit:
{
MTH3D_tdstVector stLocalA, stLocalC;
MTH3D_tdstVector stAB, stBC, stAC;
MTH_tdxReal lAB, lBC, lAC;
MTH3D_M_vSetVectorElements (&stLocalA, 0., 0., 0.);
MTH3D_M_vSetVectorElements (&stLocalC, 1., 0., 0.);
GEO_tdxHandleToMatrix hAbsoluteMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (m_poParent->GetStruct());
MTH3D_tdstVector stFirstVertex, stSecondVertex;
POS_fn_vMulMatrixVertex( &stFirstVertex, hAbsoluteMatrix, &stLocalA );
POS_fn_vMulMatrixVertex( &stSecondVertex, hAbsoluteMatrix, &stLocalC );
stAB=*pstVertex;
MTH3D_M_vSubVector(&stAB,&stAB,&stFirstVertex);
stBC=stSecondVertex;
MTH3D_M_vSubVector(&stBC,&stBC,pstVertex);
stAC=stSecondVertex;
MTH3D_M_vSubVector(&stAC,&stAC,&stFirstVertex);
lAB = MTH3D_M_xNormVector(&stAB);
lBC = MTH3D_M_xNormVector(&stBC);
lAC = MTH3D_M_xNormVector(&stAC);
lAB *= lAB;
lBC *= lBC;
lAC *= lAC;
return (lAB+lBC<=lAC);
}
default : return TRUE;
}
}
BOOL Cursor::fn_bCursorMove (void)
{
BOOL bReturnCursorMove = m_bCursorMove;
m_bCursorMove = FALSE;
return bReturnCursorMove;
}