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

357 lines
11 KiB
C++

/*
///////////////////////////////////////////////////////////////////////////////////////////////////
// Description : LinkBez.cpp
//
// Edit Bezier Link
//
///////////////////////////////////////////////////////////////////////////////////////////////////
// inherit from : Link
///////////////////////////////////////////////////////////////////////////////////////////////////
// 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 "resource.h"
#include "incitf.h"
#include "incgam.h"
#define _ENG_BEZ_FRIEND_
#include "incai.h"
#undef _ENG_BEZ_FRIEND_
#include "WpObj.hpp"
#include "WayObj.hpp"
#include "LinkObj.hpp"
#include "CurObj.hpp"
#include "Link2D.hpp"
#include "TanObj.hpp"
#include "LinkBez.hpp"
#include "LkBezDia.h"
#include "Inter.hpp"
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
char LinkBez::ms_cType = WP_ConnType_ucBezier;
char LinkBez::ms_szName [10] = "Bezier";
int iJustToLinkBezBidouille;
void fn_vJustToLinkBez (void) { iJustToLinkBezBidouille=1; }
void LinkBez::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);
fn_vJustToLinkBez ();
}
LinkBez::LinkBez ( CPA_ObjectDLLBase *p_oDLL, CPA_BaseObject *p_oOwner, WP_tdhLink hLink )
: Link ( p_oDLL, p_oOwner, hLink )
{
MTH3D_tdstVector stNulVector = { 0, 0, 0 };
hLink = (WP_tdhLink)GetEngineStruct();
ACP_tdstDynaParam stDynaParam;
WP_fnv_Link_GetDynamicParameter (hLink,&stDynaParam);
//-----------------------------------------------
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
m_hBezierObject.CreateWithCurve
(
WP_fnv_Link_GetConnectionTypeBezierCurve (hLink),
EDWAY_C_ucModeNoObject,
NULL,
&WP_M_hLinkGetEngineBezierObject(hLink)->m_dstListOfPoints
);
WP_fnv_Link_SetCurrentSample (hLink, 15);
m_hBezierObject.ChangeSamplingRate(15);
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
//-----------------------------------------------
m_pstStartTangent = new Tangent ( p_oDLL, this, eVariableLenghtTangent, eFixOrientationTangent, eControlUpChangeNeighbour );
m_pstFinishTangent = new Tangent ( p_oDLL, this, eVariableLenghtTangent, eFixOrientationTangent, eControlUpChangeNeighbour );
m_bFirstEdition = TRUE;
}
LinkBez::LinkBez ( CPA_ObjectDLLBase *p_oDLL, CPA_BaseObject *p_oOwner )
: Link ( p_oDLL, p_oOwner )
{
MTH3D_tdstVector stNulVector = { 0, 0, 0 };
WP_tdhLink hLink = (WP_tdhLink)GetEngineStruct();
// allocate bezier structure
WP_fnv_Link_Allocate
(
hLink,
WP_ConnType_ucBezier,
WP_fneuc_Link_GetConnectionDynamicType (hLink)
);
ACP_tdstDynaParam stDynaParam;
WP_fnv_Link_GetDynamicParameter (hLink,&stDynaParam);
//-------------------------------------------
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
m_hBezierObject.CreateWithCurve
(
WP_fnv_Link_GetConnectionTypeBezierCurve (hLink),
EDWAY_C_ucModeNoObject,
NULL,
&WP_M_hLinkGetEngineBezierObject(hLink)->m_dstListOfPoints
);
// init sampling rate values
WP_fnv_Link_SetCurrentSample (hLink, 15);
m_hBezierObject.ChangeSamplingRate(15);
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
//-------------------------------------------
// c'est comme ça -> pour allouer m_dstListOfPoints j'ai pas trouvé autre chose
// WP_fnv_Link_ChangeConnectionTypeBezier( hLink, EDWAY_fnh_BezierObject_GetBezierCurve(m_hBezierObject) );
// TEST
// ENG_fnv_BezierObject_BuildListOfPoints( WP_M_hLinkGetEngineBezierObject(hLink) );
// ((ENG_tdstBezierObject) WP_M_hLinkGetEngineBezierObject(hLink))->m_dstListOfPoints = NULL;
// ENG_fnv_BezierObject_SetListOfPoints ( WP_M_hLinkGetEngineBezierObject(hLink), NULL );
// EDWAY_fnv_BezierObject_Calculate (m_hBezierObject);
m_pstStartTangent = new Tangent ( p_oDLL, this, eVariableLenghtTangent, eFixOrientationTangent, eControlUpChangeNeighbour );
m_pstFinishTangent = new Tangent ( p_oDLL, this, eVariableLenghtTangent, eFixOrientationTangent, eControlUpChangeNeighbour );
m_bFirstEdition = TRUE;
}
void LinkBez::fn_vConstructGraphic (void)
{
Link::fn_vConstructGraphic();
m_pstStartTangent->GetSuperObject()->SetSuperObjectOwner (GetSuperObject());
m_pstFinishTangent->GetSuperObject()->SetSuperObjectOwner (GetSuperObject());
}
void LinkBez::fn_vRotationGraphic (BOOL bRotation)
{
Link::fn_vRotationGraphic (bRotation);
if (bRotation)
{
GetInterface()->GetInterface()->fn_bDeleteObjectInHierarchy (m_pstStartTangent->GetSuperObject(), FALSE, FALSE, FALSE, FALSE );
GetInterface()->GetInterface()->fn_bDeleteObjectInHierarchy (m_pstFinishTangent->GetSuperObject(), FALSE, FALSE, FALSE, FALSE );
}
else
{
GetInterface()->GetInterface()->fn_bInsertObjectInHierarchy (m_pstStartTangent->GetSuperObject(), GetSuperObject(),FALSE,FALSE,FALSE);
GetInterface()->GetInterface()->fn_bInsertObjectInHierarchy (m_pstFinishTangent->GetSuperObject(), GetSuperObject(),FALSE,FALSE,FALSE);
}
}
void LinkBez::fn_vInitGraphic (void)
{
Link::fn_vInitGraphic ();
if (!m_bFirstEdition) return;
m_bFirstEdition = FALSE;
// set the vertex of the Tangent object
MTH3D_tdstVector stFirstFixVertex, stSecondFixVertex;
MTH3D_tdstVector stFirstMoveVertex, stSecondMoveVertex;
MTH3D_tdstVector u;
MTH3D_tdstVector stStartPoint, stEndPoint;
MTH3D_tdstVector stStartVector, stEndVector;
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poFirstWP->GetEngineStruct()), &stFirstFixVertex );
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poSecondWP->GetEngineStruct()), &stSecondFixVertex );
stFirstMoveVertex = stFirstFixVertex;
stSecondMoveVertex = stSecondFixVertex;
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
// EDWAY_fnv_BezierObject_GetParams (m_hBezierObject,&stStartPoint, &stEndPoint, &stStartVector, &stEndVector);
m_hBezierObject.GetParams (&stStartPoint, &stEndPoint, &stStartVector, &stEndVector);
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
if ( (MTH3D_M_xNormVector(&stStartVector)>1e-10) && (MTH3D_M_xNormVector(&stEndVector)>1e-10) )
{
// init with load values
MTH3D_M_vAddVector(&stFirstMoveVertex,&stFirstMoveVertex,&stStartVector);
MTH3D_M_vAddVector(&stSecondMoveVertex,&stSecondMoveVertex,&stEndVector);
}
else
{
// set new init values
u = stSecondFixVertex;
MTH3D_M_vSubVector(&u, &u, &stFirstFixVertex );
MTH3D_M_vMulScalarVector(&u,0.15f,&u);
MTH_tdxReal xLenght = MTH3D_M_xNormVector (&u);
if (xLenght<0.1f) MTH3D_M_vMulScalarVector ( &u, 0.1f/xLenght, &u);
MTH3D_M_vAddVector(&stFirstMoveVertex,&stFirstMoveVertex,&u);
MTH3D_M_vMulScalarVector(&u,-1,&u);
MTH3D_M_vAddVector(&stSecondMoveVertex,&stSecondMoveVertex,&u);
}
GetSuperObject()->AddTail ( m_pstStartTangent->GetSuperObject() );
GetSuperObject()->AddTail ( m_pstFinishTangent->GetSuperObject() );
GetInterface()->GetInterface()->fn_vCancelCurrentSelection (FALSE);
m_pstStartTangent->fn_vSetAbsoluteVertex ( &stFirstFixVertex, &stFirstMoveVertex );
m_pstFinishTangent->fn_vSetAbsoluteVertex ( &stSecondFixVertex, &stSecondMoveVertex );
}
void LinkBez::fn_vDrawNormal (void)
{
fn_vComputeAxis ();
m_pstStartTangent->fn_vDraw ();
m_pstFinishTangent->fn_vDraw ();
fn_vSetEngineStructure ();
}
void LinkBez::fn_vDrawOutHierarchy (GLD_tdstViewportAttributes *pViewportAttributes)
{
fn_vSetEngineStructure ();
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
m_hBezierObject.SetViewPortAttributes( pViewportAttributes );
m_hBezierObject.SetColor (0xFFFFFFFF );
m_hBezierObject.Draw();
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
}
CDialog* LinkBez::fn_pGetSpecificDialog (CWnd* pParentWnd)
{
BezierDia* pDialog = new BezierDia (this);
pDialog->Create ( IDD_BEZIER_DIALOG, pParentWnd );
pDialog->fn_vTutRegister ();
return (CDialog*) pDialog;
}
void LinkBez::fn_vFreeSpecificDialog (CDialog* pDialog)
{
((BezierDia*)pDialog)->fn_vTutUnregister ();
}
void LinkBez::fn_vSetEngineStructure (void)
{
MTH3D_tdstVector stStartPoint;
MTH3D_tdstVector stEndPoint;
MTH3D_tdstVector stStartVector;
MTH3D_tdstVector stEndVector;
m_pstStartTangent->fn_pGetAbsoluteTangent (&stStartVector);
m_pstFinishTangent->fn_pGetAbsoluteTangent (&stEndVector);
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poFirstWP->GetEngineStruct()), &stStartPoint );
WP_fnv_WayPoint_ComputeLocation ( (WP_tdhWayPoint)(m_poSecondWP->GetEngineStruct()), &stEndPoint );
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
m_hBezierObject.ChangeParams(&stStartPoint, &stEndPoint, &stStartVector, &stEndVector);
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
}
void LinkBez::fn_vChangeNeighbourTangent (Tangent* pTangent)
{
Link::fn_vChangeNeighbourTangent (pTangent);
Link* pChangeLink;
if (m_pstStartTangent==pTangent)
{
pChangeLink = m_poParent->fn_pPrevLink (this);
if (pChangeLink)
if (pChangeLink->fn_cGetType()==WP_ConnType_ucBezier)
{
MTH3D_tdstVector stTangent;
pTangent->fn_pGetAbsoluteTangent(&stTangent);
((LinkBez*)pChangeLink)->fn_vSetTangent ( 2, &stTangent );
pChangeLink->fn_vDraw ();
}
}
else
{
pChangeLink = m_poParent->fn_pNextLink (this);
if (pChangeLink)
if (pChangeLink->fn_cGetType()==WP_ConnType_ucBezier)
{
MTH3D_tdstVector stTangent;
pTangent->fn_pGetAbsoluteTangent(&stTangent);
((LinkBez*)pChangeLink)->fn_vSetTangent ( 1, &stTangent );
pChangeLink->fn_vDraw ();
}
}
}
void LinkBez::fn_vSetTangent ( int iSide, MTH3D_tdstVector* pTangentVertex )
{
switch (iSide)
{
case 1 : m_pstStartTangent->fn_vSetTangentDirection (pTangentVertex,TRUE); break;
case 2 : m_pstFinishTangent->fn_vSetTangentDirection (pTangentVertex,TRUE); break;
}
}
void LinkBez::fn_vGetSaveInfo ( char dszParam [20][20], long& lNbParam )
{
unsigned char ucSamplingRate;
MTH3D_tdstVector stFirstPoint, stSecondPoint, stFirstVector, stSecondVector;
ucSamplingRate = WP_fnuc_Link_GetCurrentSample (GetStruct());
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
// EDWAY_fnv_BezierObject_GetParams ( m_hBezierObject, &stFirstPoint, &stSecondPoint, &stFirstVector, &stSecondVector );
m_hBezierObject.GetParams (&stFirstPoint, &stSecondPoint, &stFirstVector, &stSecondVector );
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
strcpy ( dszParam [0], "Bezier" );
lNbParam = 2;
sprintf ( dszParam[lNbParam++], "%d", ucSamplingRate);
sprintf ( dszParam[lNbParam++], "%f", MTH3D_M_xGetXofVector(&stFirstVector) );
sprintf ( dszParam[lNbParam++], "%f", MTH3D_M_xGetYofVector(&stFirstVector) );
sprintf ( dszParam[lNbParam++], "%f", MTH3D_M_xGetZofVector(&stFirstVector) );
sprintf ( dszParam[lNbParam++], "%f", MTH3D_M_xGetXofVector(&stSecondVector) );
sprintf ( dszParam[lNbParam++], "%f", MTH3D_M_xGetYofVector(&stSecondVector) );
sprintf ( dszParam[lNbParam++], "%f", MTH3D_M_xGetZofVector(&stSecondVector) );
}
void LinkBez::fn_vInitEditorFromEngine (void)
{
}
*/
//ENDANNECY Shaitan Nettoyage }