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

415 lines
12 KiB
C++

/*
///////////////////////////////////////////////////////////////////////////////////////////////////
// Description : LinkArc.cpp
//
// Definition of the circle arc
//
///////////////////////////////////////////////////////////////////////////////////////////////////
// inherit from : Link2D
///////////////////////////////////////////////////////////////////////////////////////////////////
// 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 "resource.h"
#include "incitf.h"
#include "incgam.h"
#define _ENG_CIRCLE_FRIEND_
#include "incai.h"
#undef _ENG_CIRCLE_FRIEND_
#include "WpObj.hpp"
#include "WayObj.hpp"
#include "LinkObj.hpp"
#include "CurObj.hpp"
#include "Link2D.hpp"
#include "LinkArc.hpp"
#include "LkArcDia.h"
#include "Inter.hpp"
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
char LinkArc::ms_cType = WP_ConnType_ucCircle;
char LinkArc::ms_szName [10] = "Arc";
int iJustToLinkCiArBidouille;
void JustToLinkCiAr (void) { iJustToLinkCiArBidouille=1; }
void LinkArc::fn_vRegisterObject (void)
{
tdst_LinkObject* pstLinkObject = new tdst_LinkObject;
strcpy ( pstLinkObject->szName, ms_szName );
pstLinkObject->cType = ms_cType;
pstLinkObject->fn_pConstruct = fn_pConstruct;
ms_oListLinkObject.AddTail (pstLinkObject);
JustToLinkCiAr ();
}
LinkArc::LinkArc ( CPA_ObjectDLLBase *p_oDLL, CPA_BaseObject *p_oOwner, WP_tdhLink hLink )
: Link2D ( p_oDLL, p_oOwner, hLink )
{
m_bInitCenter = FALSE;
MTH3D_tdstVector stNulVector = { 0, 0, 0 };
hLink = (WP_tdhLink)GetEngineStruct();
//-------------------------------------
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
m_hArcObject.CreateFromCurve
(
WP_fnv_Link_GetConnectionTypeCircleArcCurve (hLink),
EDWAY_C_ucModeNoObject,
NULL,
&WP_fnh_Link_GetEngineCircleArcObject(hLink)->m_dstListOfPoints
);
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
//-------------------------------------
m_bEditPlane = FALSE;
m_poCursor=NULL;
m_stCenterVertex=stNulVector;
m_bFirstEdition=TRUE;
}
LinkArc::LinkArc ( CPA_ObjectDLLBase *p_oDLL, CPA_BaseObject *p_oOwner )
: Link2D ( p_oDLL, p_oOwner )
{
m_bInitCenter = TRUE;
MTH3D_tdstVector stNulVector = { 0, 0, 0 };
WP_tdhLink hLink = (WP_tdhLink)GetEngineStruct();
// allocate circle structure
WP_fnv_Link_Allocate
(
hLink,
WP_ConnType_ucCircle,
WP_fneuc_Link_GetConnectionDynamicType (hLink)
);
//------------------------------------------------
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
m_hArcObject.CreateFromCurve
(
WP_fnv_Link_GetConnectionTypeCircleArcCurve (hLink),
EDWAY_C_ucModeNoObject,
NULL,
&WP_fnh_Link_GetEngineCircleArcObject(hLink)->m_dstListOfPoints
);
// init sampling rate values
WP_fnv_Link_SetCurrentSample (hLink, 15);
// EDWAY_fnb_CircleArcObject_ChangeSamplingRate ( m_hArcObject, 15 );
m_hArcObject.ChangeSamplingRate (15 );
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
//------------------------------------------------
m_bEditPlane = FALSE;
m_poCursor=NULL;
m_stCenterVertex=stNulVector;
m_bFirstEdition=TRUE;
}
CDialog* LinkArc::fn_pGetSpecificDialog (CWnd* pParentWnd)
{
ArcDia* pDialog = new ArcDia (this);
pDialog->Create ( IDD_ARC_DIALOG, pParentWnd );
pDialog->fn_vTutRegister ();
return (CDialog*) pDialog;
}
void LinkArc::fn_vFreeSpecificDialog (CDialog* pDialog)
{
((ArcDia*)pDialog)->fn_vTutUnregister ();
}
void LinkArc::fn_vConstructGraphic (void)
{
}
void LinkArc::fn_vRotationGraphic (BOOL bRotation)
{
Link::fn_vRotationGraphic (bRotation);
if (bRotation)
{
if (m_bEditPlane)
fn_vStopEdit ();
}
else
{
}
}
void LinkArc::fn_vDrawNormal (void)
{
fn_vComputeAxis ();
if (m_bEditPlane) {
fn_vDrawPlane ();
m_poCursor->fn_vDraw ();
fn_vSetEngineStructure ();
}
}
void LinkArc::fn_vDrawOutHierarchy (GLD_tdstViewportAttributes *pViewportAttributes)
{
if (m_bEditPlane)
{
fn_vUpdateCenter ();
}
fn_vSetEngineStructure ();
//----------------------------------------------
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
m_hArcObject.SetColor(0xFFFFFFFF);
m_hArcObject.SetViewPortAttributes (pViewportAttributes);
m_hArcObject.Draw();
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
//----------------------------------------------
}
void LinkArc::fn_vSetWaypoints ( WayPoint* poFirstWP, WayPoint* poSecondWP )
{
Link::fn_vSetWaypoints ( poFirstWP, poSecondWP );
}
void LinkArc::fn_vInitGraphic (void)
{
Link::fn_vInitGraphic ();
fn_vInitCenter (m_bInitCenter);
m_bInitCenter=FALSE;
}
void LinkArc::fn_vStartEdit (void)
{
if (m_bRotationMode) return;
fn_vSetDrawOutHierarchy (FALSE);
//---- plane
fn_vConstructPlane();
if (m_bFirstEdition)
{
fn_vInitPlaneOrientation ();
m_bFirstEdition=FALSE;
}
fn_vComputeAxis ();
m_bEditPlane = TRUE;
fn_vDrawPlane ();
//----- cursor
// create
m_poCursor= new Cursor ( GetInterface(), m_poGraphic, eCursorCircularLimit );
// insert in hierarchy
m_poCursor->GetSuperObject()->SetSuperObjectOwner (m_poGraphic);
GetInterface()->GetInterface()->fn_bInsertObjectInHierarchy ( m_poCursor->GetSuperObject(), m_poGraphic, FALSE, FALSE, FALSE );
m_poCursor->GetSuperObject()->SetEditProtected (TRUE);
// compute absolute matrix
GetInterface()->fn_vComputeAbsoluteMatrix (m_poCursor->GetSuperObject());
// compute the third point with the center
MTH3D_tdstVector stCursorVertex;
fn_vComputeCursorVertex ( &stCursorVertex );
m_poCursor->fn_vSetAbsoluteVertex (&stCursorVertex);
m_poCursor->fn_vDraw ();
fn_vSetDrawOutHierarchy (TRUE);
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
void LinkArc::fn_vStopEdit (void)
{
m_bEditPlane = FALSE;
fn_vDestroyPlane();
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
void LinkArc::fn_vSetEngineStructure (void)
{
MTH3D_tdstVector stStartPoint;
MTH3D_tdstVector stEndPoint;
MTH3D_tdstVector stCenterPoint;
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poFirstWP->GetEngineStruct()), &stStartPoint );
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poSecondWP->GetEngineStruct()), &stEndPoint );
fn_vGetAbsoluteCenter (&stCenterPoint);
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
// EDWAY_fnv_CircleArcObject_ChangeParams (m_hArcObject,&stStartPoint, &stEndPoint, &stCenterPoint);
m_hArcObject.ChangeParams (&stStartPoint, &stEndPoint, &stCenterPoint);
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
if ( m_poCursor )
if ( m_poCursor->fn_bCursorMove() ) fn_vWayNotifySave ();
}
void LinkArc::fn_vUpdateCenter (void)
{
MTH3D_tdstVector stStartPoint, stEndPoint;
MTH3D_tdstVector stLocalFirstVertex, stLocalSecondVertex, stLocalThirdVertex;
MTH3D_tdstVector stAbsoluteCenter;
MTH3D_tdstVector stCenter;
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poFirstWP->GetEngineStruct()), &stStartPoint );
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poSecondWP->GetEngineStruct()), &stEndPoint );
// local vertex
CPA_SuperObject* psoPlane = (CPA_SuperObject*)GetSuperObject()->GetHead();
GetInterface()->fn_vComputeAbsoluteMatrix (psoPlane);
GEO_tdxHandleToMatrix hAbsolutePlaneMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (psoPlane->GetStruct());
POS_tdstCompletePosition InvMatrix;
POS_fn_vSetIdentityMatrix(&InvMatrix);
POS_fn_vInvertMatrix( &InvMatrix , hAbsolutePlaneMatrix );
POS_fn_vMulMatrixVertex( &stLocalFirstVertex, &InvMatrix, &stStartPoint ) ;
POS_fn_vMulMatrixVertex( &stLocalSecondVertex, &InvMatrix, &stEndPoint ) ;
m_poCursor->fn_vGetAbsoluteVertex ( &stAbsoluteCenter );
POS_fn_vMulMatrixVertex( &stLocalThirdVertex, &InvMatrix, &stAbsoluteCenter ) ;
MTH3D_fnv_CircleArcCurve_FindCenter
(
&stLocalFirstVertex,
&stLocalSecondVertex,
&stLocalThirdVertex,
&stCenter
);
POS_fn_vMulMatrixVertex( &stAbsoluteCenter, hAbsolutePlaneMatrix, &stCenter );
fn_vSetAbsoluteCenter ( &stAbsoluteCenter );
}
void LinkArc::fn_vInitCenter (BOOL bInit)
{
if (bInit)
{
MTH3D_tdstVector stFirstVertex, stSecondVertex;
MTH3D_tdstVector u, v, w;
MTH3D_tdstVector stAbsoluteCenter;
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poFirstWP->GetEngineStruct()), &stFirstVertex );
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poSecondWP->GetEngineStruct()), &stSecondVertex );
u = stSecondVertex;
MTH3D_M_vSubVector(&u,&u,&stFirstVertex);
MTH3D_M_vMulScalarVector(&u,0.5f,&u);
MTH3D_M_vSetVectorElements ( &w, 0.f, 0.f, 1.f );
MTH3D_M_vCrossProductVector ( &v, &w, &u );
MTH3D_M_vNormalizeVector(&v,&v);
MTH3D_M_vMulScalarVector(&v,1e-3f,&v);
stAbsoluteCenter = stFirstVertex;
MTH3D_M_vAddVector(&stAbsoluteCenter,&stAbsoluteCenter,&u);
MTH3D_M_vAddVector(&stAbsoluteCenter,&stAbsoluteCenter,&v);
fn_vSetAbsoluteCenter (&stAbsoluteCenter);
}
else
{
MTH3D_tdstVector stFirstPoint, stSecondPoint, stCenterPoint;
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
// EDWAY_fnv_CircleArcObject_GetParams (m_hArcObject, &stFirstPoint, &stSecondPoint, &stCenterPoint);
m_hArcObject.GetParams (&stFirstPoint, &stSecondPoint, &stCenterPoint);
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
fn_vSetAbsoluteCenter (&stCenterPoint);
}
}
void LinkArc::fn_vGetAbsoluteCenter (MTH3D_tdstVector* pstCenter)
{
GetInterface()->fn_vComputeAbsoluteMatrix (GetSuperObject());
GEO_tdxHandleToMatrix hAbsoluteMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (GetSuperObject()->GetStruct());
POS_fn_vMulMatrixVertex( pstCenter, hAbsoluteMatrix, &m_stCenterVertex );
}
void LinkArc::fn_vSetAbsoluteCenter (MTH3D_tdstVector* pstCenter)
{
GetInterface()->fn_vComputeAbsoluteMatrix (GetSuperObject());
GEO_tdxHandleToMatrix hAbsoluteMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (GetSuperObject()->GetStruct());
POS_tdstCompletePosition InvMatrix;
POS_fn_vSetIdentityMatrix(&InvMatrix);
POS_fn_vInvertMatrix( &InvMatrix , hAbsoluteMatrix );
POS_fn_vMulMatrixVertex( &m_stCenterVertex, &InvMatrix, pstCenter );
}
void LinkArc::fn_vComputeCursorVertex ( MTH3D_tdstVector* pstCursorVertex )
{
MTH3D_tdstVector stFirstVertex, stSecondVertex;
MTH3D_tdstVector stCenterVertex;
MTH3D_tdstVector stMildVertex;
MTH3D_tdstVector stVector;
MTH3D_tdstVector stRadiusVector;
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poFirstWP->GetEngineStruct()), &stFirstVertex );
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poSecondWP->GetEngineStruct()), &stSecondVertex );
fn_vGetAbsoluteCenter ( &stCenterVertex );
stMildVertex = stFirstVertex;
MTH3D_M_vAddVector(&stMildVertex,&stMildVertex,&stSecondVertex);
MTH3D_M_vMulScalarVector(&stMildVertex,0.5f,&stMildVertex);
stVector = stMildVertex;
MTH3D_M_vSubVector(&stVector,&stVector,&stCenterVertex);
MTH3D_M_vNormalizeVector(&stVector,&stVector);
stRadiusVector = stFirstVertex;
MTH3D_M_vSubVector(&stRadiusVector,&stRadiusVector,&stCenterVertex);
MTH_tdxReal stRadius = GLI_M_Norme(&stRadiusVector);
MTH3D_M_vMulScalarVector(&stVector,stRadius,&stVector);
*pstCursorVertex = stCenterVertex;
MTH3D_M_vAddVector(pstCursorVertex,pstCursorVertex,&stVector);
}
void LinkArc::fn_vGetSaveInfo ( char dszParam [20][20], long& lNbParam )
{
unsigned char ucSamplingRate;
MTH3D_tdstVector stFirstPoint, stSecondPoint, stCenterPoint;
ucSamplingRate = WP_fnuc_Link_GetCurrentSample (GetStruct());
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
// EDWAY_fnv_CircleArcObject_GetParams (m_hArcObject, &stFirstPoint, &stSecondPoint, &stCenterPoint);
m_hArcObject.GetParams (&stFirstPoint, &stSecondPoint, &stCenterPoint);
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
strcpy ( dszParam [0], "Circle" );
lNbParam = 2;
sprintf ( dszParam[lNbParam++], "%d", ucSamplingRate);
sprintf ( dszParam[lNbParam++], "%f", MTH3D_M_xGetXofVector(&stCenterPoint) );
sprintf ( dszParam[lNbParam++], "%f", MTH3D_M_xGetYofVector(&stCenterPoint) );
sprintf ( dszParam[lNbParam++], "%f", MTH3D_M_xGetZofVector(&stCenterPoint) );
}
void LinkArc::fn_vInitPlaneOrientation (void)
{
MTH3D_tdstVector stFirstPoint, stSecondPoint, stCenterPoint;
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
// EDWAY_fnv_CircleArcObject_GetParams (m_hArcObject, &stFirstPoint, &stSecondPoint, &stCenterPoint);
m_hArcObject.GetParams (&stFirstPoint, &stSecondPoint, &stCenterPoint);
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
fn_vComputePlaneAxis ( &stCenterPoint );
}
*/
//ENDANNECY Shaitan Nettoyage }