reman3/Rayman_X/cpa/tempgrp/Opd/src/podialog.cpp

1206 lines
37 KiB
C++

/*
=======================================================================================
Name : podialog.cpp
Author : vincent lhullier Date :26/08/97
Description : implementation file for PO editor dialog boxes
=======================================================================================
Modification -> Author : Date :
Description :
=======================================================================================
*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include "stdafx.h"
#include "ACP_Base.h"
#include "ITF.h"
#include "TUT.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define D_PhysiCol_Define
#include "incGAM.h"
//#define PO_FRIEND
#include "PO.h"
//#undef PO_FRIEND
#undef D_PhysiCol_Define
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include "incOPD.h"
#include "podialog.h"
#include "x:\Cpa\Main\inc\_EditId.h"
#include "..\..\GLIGLOU\MULTIDRV\inc\VisuS_st.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
=======================================================================================
=======================================================================================
CPOVseModif
=======================================================================================
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : constructor
----------------------------------------------------------------------------------------
*/
CPOVseModif::CPOVseModif( EditorPO *_p_oPO, GEO_tdxHandleToVisualSet _hVSE, ACP_tdxIndex _xNbModifs ) : CPA_Modif( 0, "Vse treshold" )
{
ACP_tdxIndex xIndex;
m_p_oPO = _p_oPO;
m_hVisualSet = _hVSE;
m_xNbModifs = _xNbModifs;
if (m_xNbModifs)
{
m_d_xIndex = (ACP_tdxIndex *) malloc ( m_xNbModifs * sizeof( ACP_tdxIndex ) );
m_d_xDiff = (MTH_tdxReal *) malloc ( m_xNbModifs * sizeof( MTH_tdxReal ) );
for (xIndex = 0; xIndex < m_xNbModifs; xIndex++ )
m_d_xIndex[ xIndex ] = -1;
}
}
/*
----------------------------------------------------------------------------------------
Description : destructor
----------------------------------------------------------------------------------------
*/
CPOVseModif::~CPOVseModif( void )
{
if (m_xNbModifs)
{
free( m_d_xIndex );
free( m_d_xDiff );
}
}
/*
----------------------------------------------------------------------------------------
Description : Do the modif
----------------------------------------------------------------------------------------
*/
CPOVseModif::Do( void )
{
ACP_tdxIndex xModif;
MTH_tdxReal xTreshold;
ACP_tdxHandleOfObject xGeometric;
for ( xModif = 0; xModif < m_xNbModifs; xModif++)
{
if (m_d_xIndex[ xModif ] != -1)
{
GLI_vGetVisualSetLOD( m_hVisualSet, m_d_xIndex[ xModif ], &xTreshold, &xGeometric );
xTreshold += m_d_xDiff[ xModif ];
GLI_vSetVisualSetLOD( m_hVisualSet, m_d_xIndex[ xModif ], xTreshold, xGeometric );
}
}
if (m_p_oPO->fn_p_oGetVSESection())
m_p_oPO->fn_p_oGetVSESection()->fn_vWriteSection();
(((DEV_MultiDevice*)g_oFrameGest.ma_p_oWinArray[2][2]->GetActiveView())->DrawObject());
return TRUE;
}
/*
----------------------------------------------------------------------------------------
Description : UnDo the modif
----------------------------------------------------------------------------------------
*/
CPOVseModif::Undo( void )
{
ACP_tdxIndex xModif;
MTH_tdxReal xTreshold;
ACP_tdxHandleOfObject xGeometric;
for ( xModif = 0; xModif < m_xNbModifs; xModif++)
{
if (m_d_xIndex[ xModif ] != -1)
{
GLI_vGetVisualSetLOD( m_hVisualSet, m_d_xIndex[ xModif ], &xTreshold, &xGeometric );
xTreshold -= m_d_xDiff[ xModif ];
GLI_vSetVisualSetLOD( m_hVisualSet, m_d_xIndex[ xModif ], xTreshold, xGeometric );
}
}
return TRUE;
}
/*
----------------------------------------------------------------------------------------
Description : set modification for a given treshold
_xLod -> index of lod (treshold)
_xDiff -> difference between new and old treshold
----------------------------------------------------------------------------------------
*/
void CPOVseModif::m_fn_vSetDiff( ACP_tdxIndex _xLod, MTH_tdxReal _xDiff )
{
ACP_tdxIndex xModif;
for (xModif = 0; xModif < m_xNbModifs; xModif++)
if (m_d_xIndex[ xModif ] == -1)
break;
if (xModif == m_xNbModifs)
return;
m_d_xIndex[ xModif ] = _xLod;
m_d_xDiff[ xModif ] = _xDiff;
}
/*
=======================================================================================
=======================================================================================
CPODlgVse
=======================================================================================
=======================================================================================
*/
IMPLEMENT_DYNCREATE(CPODlgVse, CFormView)
/*
----------------------------------------------------------------------------------------
Description : constructor
----------------------------------------------------------------------------------------
*/
CPODlgVse::CPODlgVse(): CFormView(CPODlgVse::IDD)
{
//{{AFX_DATA_INIT(CPODlgVse)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_p_oParentDLL = NULL;
m_xSwapLod = -1;
}
/*
----------------------------------------------------------------------------------------
Description : destructor
----------------------------------------------------------------------------------------
*/
CPODlgVse::~CPODlgVse()
{
}
/*
----------------------------------------------------------------------------------------
Description : Message Map
----------------------------------------------------------------------------------------
*/
BEGIN_MESSAGE_MAP(CPODlgVse, CFormView)
//{{AFX_MSG_MAP(CPODlgVse)
ON_WM_DRAWITEM()
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_CURRENTLOD, OnDeltaposSpinCurrentlod)
ON_EN_KILLFOCUS(IDC_EDIT_CURRENTLOD, OnKillfocusEditCurrentlod)
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_FROM, OnDeltaposSpinFrom)
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_TO, OnDeltaposSpinTo)
ON_EN_KILLFOCUS(IDC_EDIT_FROM, OnKillfocusEditFrom)
ON_EN_KILLFOCUS(IDC_EDIT_TO, OnKillfocusEditTo)
ON_BN_CLICKED(IDC_BUTTON_APPLY, OnButtonApply)
ON_BN_CLICKED(IDC_BUTTON_TRESHOLD, OnButtonTreshold)
ON_BN_DOUBLECLICKED(IDC_BUTTON_TRESHOLD, OnDoubleclickedButtonTreshold)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*
----------------------------------------------------------------------------------------
Description : Creation of FormView, register window and control
----------------------------------------------------------------------------------------
*/
BOOL CPODlgVse::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
if ( !CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext) )
return FALSE;
TUT_M_vGetTutDll();
TUT_M_vRegisterControl( GetSafeHwnd(), "OPD_VisualSetEditionDialog", TUT_e_Window );
TUT_M_vRegisterControlID( IDC_BUTTON_APPLY, "OPD_Vse_ApplyModifButton", TUT_e_Button );
TUT_M_vRegisterControlID( IDC_BUTTON_TRESHOLD, "OPD_Vse_ThresholdBar", TUT_e_Button );
TUT_M_vRegisterControlID( IDC_EDIT_CURRENTLOD, "OPD_Vse_CurrentLod", TUT_e_TextEdit );
TUT_M_vRegisterControlID( IDC_EDIT_FROM, "OPD_Vse_EditThresholdStart", TUT_e_TextEdit );
TUT_M_vRegisterControlID( IDC_EDIT_NBLODS, "OPD_Vse_NumberOfLods", TUT_e_TextEdit );
TUT_M_vRegisterControlID( IDC_EDIT_TO, "OPD_Vse_EditThresholdEnd", TUT_e_TextEdit );
TUT_M_vRegisterControlID( IDC_SPIN_CURRENTLOD, "OPD_Vse_SpinCurrentLod", TUT_e_Spin );
TUT_M_vRegisterControlID( IDC_SPIN_FROM, "OPD_Vse_SpinThresholdStart", TUT_e_Spin );
TUT_M_vRegisterControlID( IDC_SPIN_TO, "OPD_Vse_SpinThresholdEnd", TUT_e_Spin );
return TRUE;
}
/*
----------------------------------------------------------------------------------------
Description : Unregister control from TUT
----------------------------------------------------------------------------------------
*/
void CPODlgVse::OnDestroy()
{
TUT_M_vGetTutDll();
TUT_M_vUnregisterControl( GetSafeHwnd() );
TUT_M_vUnregisterControlID( IDC_BUTTON_APPLY );
TUT_M_vUnregisterControlID( IDC_BUTTON_TRESHOLD );
TUT_M_vUnregisterControlID( IDC_EDIT_CURRENTLOD );
TUT_M_vUnregisterControlID( IDC_EDIT_FROM );
TUT_M_vUnregisterControlID( IDC_EDIT_NBLODS );
TUT_M_vUnregisterControlID( IDC_EDIT_TO );
TUT_M_vUnregisterControlID( IDC_SPIN_CURRENTLOD );
TUT_M_vUnregisterControlID( IDC_SPIN_FROM );
TUT_M_vUnregisterControlID( IDC_SPIN_TO );
CFormView::OnDestroy();
}
/*
=======================================================================================
CPODlgVse diagnostics
=======================================================================================
*/
#ifdef _DEBUG
void CPODlgVse::AssertValid() const
{
CFormView::AssertValid();
}
void CPODlgVse::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif //_DEBUG
/*
=======================================================================================
Specific functions
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : update info about a PO object
----------------------------------------------------------------------------------------
*/
void CPODlgVse::fn_vUpdateInfo(class EditorPO *_p_oPO)
{
m_fn_vSwapLOD( 0, TRUE, TRUE );
if ( (m_p_oPO = _p_oPO) != NULL)
{
PO_tdxHandleToPhysicalObject hPO;
hPO = _p_oPO->GetStruct();
if (hPO != NULL)
{
m_hVisualSet = PO_fn_hGetVisualSet( hPO );
m_hCollSet = PO_fn_hGetCollideSet( hPO );
}
else
m_p_oPO = NULL;
}
if (m_p_oPO == NULL)
{
m_hVisualSet = 0;
m_hCollSet = 0;
}
m_fn_vInitVisualSetData( m_hVisualSet );
m_fn_vShowCollideSet( m_hCollSet );
}
/*
----------------------------------------------------------------------------------------
Description : display info about the visual set
----------------------------------------------------------------------------------------
*/
void CPODlgVse::m_fn_vShowVisualSet( GEO_tdxHandleToVisualSet hVisualSet )
{
BOOL bVisible = ( hVisualSet != 0 );
char szNbLods[10];
m_xCurrentLod = 0;
GetDlgItem( IDC_BUTTON_TRESHOLD )->ShowWindow( bVisible );
GetDlgItem( IDC_STATIC_NBLODS )->ShowWindow( bVisible );
GetDlgItem( IDC_EDIT_NBLODS )->ShowWindow( bVisible );
GetDlgItem( IDC_STATIC_CURRENTLOD )->ShowWindow( bVisible );
GetDlgItem( IDC_STATIC_CURLOD )->ShowWindow( bVisible );
GetDlgItem( IDC_EDIT_CURRENTLOD )->ShowWindow( bVisible );
((CEdit *) GetDlgItem( IDC_EDIT_CURRENTLOD ))->SetReadOnly( m_xNbLods <= 1 );
GetDlgItem( IDC_SPIN_CURRENTLOD )->ShowWindow( bVisible && (m_xNbLods > 1));
GetDlgItem( IDC_STATIC_FROM )->ShowWindow( bVisible );
GetDlgItem( IDC_EDIT_FROM )->ShowWindow( bVisible );
GetDlgItem( IDC_SPIN_FROM )->ShowWindow( bVisible );
GetDlgItem( IDC_STATIC_TO )->ShowWindow( bVisible );
GetDlgItem( IDC_EDIT_TO )->ShowWindow( bVisible );
GetDlgItem( IDC_SPIN_TO )->ShowWindow( bVisible );
GetDlgItem( IDC_BUTTON_APPLY )->ShowWindow( bVisible );
if (!bVisible)
return;
GetDlgItem( IDC_EDIT_NBLODS )->SetWindowText( itoa( m_xNbLods, szNbLods, 10) );
m_fn_vShowCurrentLod();
}
/*
----------------------------------------------------------------------------------------
Description : initialize data about visual set
----------------------------------------------------------------------------------------
*/
void CPODlgVse::m_fn_vInitVisualSetData( GEO_tdxHandleToVisualSet hVisualSet )
{
if (hVisualSet == 0)
{
m_xCurrentLod = -1;
}
else
{
m_xNbLods = (ACP_tdxIndex) GLI_lGetVisualSetNumbertOfLOD( hVisualSet );
for( m_xCurrentLod = 0; m_xCurrentLod < m_xNbLods; m_xCurrentLod ++ )
GLI_vGetVisualSetLOD( hVisualSet, m_xCurrentLod, &m_a_xTresholds[m_xCurrentLod], &m_a_xGeometrics[m_xCurrentLod] );
m_a_xTresholds[ 0 ] = 0;
m_xCurrentLod = 0;
}
m_fn_vShowVisualSet( hVisualSet );
}
/*
----------------------------------------------------------------------------------------
Description : display info about current lod
----------------------------------------------------------------------------------------
*/
void CPODlgVse::m_fn_vShowCurrentLod( )
{
char szValue[10];
GetDlgItem( IDC_SPIN_FROM)->ShowWindow( m_xCurrentLod != 0 );
GetDlgItem( IDC_SPIN_TO)->ShowWindow( m_xCurrentLod != m_xNbLods - 1 );
GetDlgItem( IDC_EDIT_CURRENTLOD )->SetWindowText( itoa( m_xCurrentLod, szValue, 10 ) );
//GetDlgItem( IDC_EDIT_FROM )->SetWindowText( m_xCurrentLod == 0 ? "0" : ftoa ((int) m_a_xTresholds[m_xCurrentLod - 1], szValue, 10) );
sprintf( szValue, "%g", (m_xCurrentLod == 0) ? 0 : m_a_xTresholds[m_xCurrentLod] );
GetDlgItem( IDC_EDIT_FROM )->SetWindowText( szValue );
((CEdit *) GetDlgItem( IDC_EDIT_FROM ))->SetReadOnly( m_xCurrentLod == 0 );
//GetDlgItem( IDC_EDIT_TO )->SetWindowText( (m_xCurrentLod + 1 == m_xNbLods) ? "infini" : itoa( (int) m_a_xTresholds[m_xCurrentLod], szValue, 10) );
if (m_xCurrentLod + 1 == m_xNbLods )
strcpy( szValue, "infini");
else
sprintf( szValue, "%g", m_a_xTresholds[ m_xCurrentLod + 1] );
GetDlgItem( IDC_EDIT_TO )->SetWindowText( szValue );
((CEdit *) GetDlgItem( IDC_EDIT_TO ))->SetReadOnly( m_xCurrentLod+1 == m_xNbLods );
GetDlgItem( IDC_BUTTON_TRESHOLD )->Invalidate();
}
/*
----------------------------------------------------------------------------------------
Description : display info about collide set
----------------------------------------------------------------------------------------
*/
void CPODlgVse::m_fn_vShowCollideSet( PCS_tdxHandleToPhysicalCollSet hCollSet )
{
}
/*
----------------------------------------------------------------------------------------
Description : change value of a treshold
cIndex -> index of lod (and treshold)
xValue -> new treshold value
----------------------------------------------------------------------------------------
*/
void CPODlgVse::m_fn_vChangeTreshold( ACP_tdxIndex _xIndex, MTH_tdxReal _xValue)
{
MTH_tdxReal xMin, xMax;
if ( _xIndex == 0 )
_xValue = 0;
else
{
xMin = m_a_xTresholds[ _xIndex - 1 ];
xMax = (_xIndex == m_xNbLods - 1) ? -1 : m_a_xTresholds[ _xIndex + 1];
if (_xValue < xMin)
_xValue = xMin;
else if ( (xMax != -1) && (_xValue > xMax) )
_xValue = xMax;
}
m_a_xTresholds[ _xIndex ] = _xValue;
m_fn_vShowCurrentLod();
}
/*
----------------------------------------------------------------------------------------
Description : Get index of clicked lod in sheme drawn in IDC_BUTTON_TRESHOLD button
----------------------------------------------------------------------------------------
*/
ACP_tdxIndex CPODlgVse::m_fn_xGetClickedLodIndex( void )
{
CButton *p_oBt = (CButton *) GetDlgItem( IDC_BUTTON_TRESHOLD );
POINT stPoint;
RECT stRect;
long lHeight, lLodHeight, lY;
ACP_tdxIndex xLod = -1;
GetCursorPos( &stPoint );
p_oBt->ScreenToClient( &stPoint );
if ( (stPoint.x >= 5) && (stPoint.x <= 12) )
{
p_oBt->GetClientRect( &stRect );
lHeight = stRect.bottom - stRect.top;
lLodHeight = (lHeight - 9) / m_xNbLods;
lY = ( lHeight - (lLodHeight * m_xNbLods) ) / 2;
while (lY < stPoint.y)
{
if (++xLod == m_xNbLods)
{
xLod = -1;
break;
}
lY += lLodHeight;
}
}
return xLod;
}
/*
----------------------------------------------------------------------------------------
Description : swap/restore swap of LOD to force drawing of a given LOD
_xLod -> index of lod to force
_bRestore -> TRUE to restore initial Visual Set
_bRedraw -> TRUE if world must be redrawn
----------------------------------------------------------------------------------------
*/
void CPODlgVse::m_fn_vSwapLOD( ACP_tdxIndex _xLod, BOOL _bRestore, BOOL _bRedraw )
{
ACP_tdxHandleOfObject xGeometric0, xGeometric;
MTH_tdxReal xTreshold0, xTreshold;
if (_bRestore)
{
if (m_xSwapLod != -1)
{
((struct GEO_tdstVisualSet_ *) m_hVisualSet)->xNbLodDefinitions = m_xNbLods;
GLI_vGetVisualSetLOD( m_hVisualSet, 0, &xTreshold0, &xGeometric0 );
GLI_vGetVisualSetLOD( m_hVisualSet, m_xSwapLod, &xTreshold, &xGeometric );
GLI_vSetVisualSetLOD( m_hVisualSet, m_xSwapLod, xTreshold, xGeometric0 );
GLI_vSetVisualSetLOD( m_hVisualSet, 0, xTreshold0, xGeometric );
m_xSwapLod = -1;
}
}
else
{
if (m_xSwapLod != -1)
m_fn_vSwapLOD( 0, TRUE, FALSE );
GLI_vGetVisualSetLOD( m_hVisualSet, 0, &xTreshold0, &xGeometric0 );
GLI_vGetVisualSetLOD( m_hVisualSet, _xLod, &xTreshold, &xGeometric );
GLI_vSetVisualSetLOD( m_hVisualSet, _xLod, xTreshold, xGeometric0 );
GLI_vSetVisualSetLOD( m_hVisualSet, 0, xTreshold0, xGeometric );
((GEO_tdstVisualSet *) m_hVisualSet)->xNbLodDefinitions = 1;
m_xSwapLod = _xLod;
}
if (_bRedraw)
(((DEV_MultiDevice*)g_oFrameGest.ma_p_oWinArray[2][2]->GetActiveView())->DrawObject());
}
/*
=======================================================================================
MESSAGE HANDLER
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : WM_DRAWITEM
----------------------------------------------------------------------------------------
*/
void CPODlgVse::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
{
if (nIDCtl == IDC_BUTTON_TRESHOLD)
{
if (m_hVisualSet != 0)
{
// draw treshold bar
RECT rcLod;
RECT rcTreshold;
long lHeight;
long lLodHeight;
long lCurrentY;
ACP_tdxIndex xLod;
char szValue[10];
CBitmap oInfini;
CBrush oWhiteBrush(RGB(255,255,255));
CBrush oGrayBrush(RGB(128,128,128));
CBrush oBlackBrush(RGB(0,0,0));
CPen oRedPen( PS_SOLID, 1, RGB(255,0,0));
CPen oBlackPen( PS_SOLID, 1, RGB(0,0,0));
CPen oWhitePen( PS_SOLID, 1, RGB(255,255,255));
CDC *pDC = CDC::FromHandle( lpDIS->hDC );
lHeight = lpDIS->rcItem.bottom - lpDIS->rcItem.top;
lLodHeight = (lHeight - 9) / m_xNbLods;
lCurrentY = lpDIS->rcItem.top + (( lHeight - (lLodHeight * m_xNbLods) ) / 2);
rcLod.left = lpDIS->rcItem.left + 5;
rcLod.right = rcLod.left + 8;
rcTreshold.left = rcLod.right + 2;
rcTreshold.right = lpDIS->rcItem.right - 5;
for ( xLod = 0; xLod < m_xNbLods; xLod ++)
{
rcLod.top = lCurrentY;
rcLod.bottom = rcLod.top + lLodHeight - 1;
rcTreshold.top = lCurrentY - 5;
rcTreshold.bottom = rcTreshold.top + 12;
//itoa( xLod == 0 ? 0 : (int) m_a_xTresholds[xLod - 1], szValue, 10);
sprintf( szValue, "%g", /*(xLod == 0) ? 0 : */m_a_xTresholds[xLod] );
pDC->SelectObject( (xLod == m_xCurrentLod)?oRedPen:(xLod & 1)?oBlackPen:oWhitePen );
pDC->SelectObject( (xLod == m_xSwapLod) ? oGrayBrush : ((xLod & 1) ? oBlackBrush : oWhiteBrush) );
pDC->Rectangle( &rcLod );
pDC->DrawText( szValue, strlen( szValue ), &rcTreshold, DT_VCENTER | DT_LEFT );
lCurrentY += lLodHeight;
}
oInfini.LoadBitmap( IDB_BITMAP_INFINI );
pDC->DrawState( CPoint( rcTreshold.left, lCurrentY - 4), CSize(22,8) , &oInfini, DST_BITMAP|DSS_MONO, &oBlackBrush );
oInfini.DeleteObject();
oWhiteBrush.DeleteObject();
oBlackBrush.DeleteObject();
oWhitePen.DeleteObject();
oBlackPen.DeleteObject();
oRedPen.DeleteObject();
}
}
CFormView::OnDrawItem(nIDCtl, lpDIS);
}
/*
----------------------------------------------------------------------------------------
Description : UDN_DELTAPOS on IDC_SPIN_CURRENTLOD
----------------------------------------------------------------------------------------
*/
void CPODlgVse::OnDeltaposSpinCurrentlod(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
if ( pNMUpDown->iDelta < 0)
if (m_xCurrentLod == m_xNbLods - 1)
m_xCurrentLod = 0;
else
m_xCurrentLod++;
else
if (m_xCurrentLod == 0)
m_xCurrentLod = m_xNbLods - 1;
else
m_xCurrentLod--;
m_fn_vShowCurrentLod();
*pResult = 1;
}
/*
----------------------------------------------------------------------------------------
Description : EN_KILLFOCUS on IDC_EDIT_CURRENTLOD
----------------------------------------------------------------------------------------
*/
void CPODlgVse::OnKillfocusEditCurrentlod()
{
char szText[10];
GetDlgItem( IDC_EDIT_CURRENTLOD )->GetWindowText( szText, 10 );
m_xCurrentLod = atoi( szText );
if (m_xCurrentLod >= m_xNbLods )
m_xCurrentLod = m_xNbLods - 1;
else if( m_xCurrentLod < 0)
m_xCurrentLod = 0;
m_fn_vShowCurrentLod();
}
/*
----------------------------------------------------------------------------------------
Description : UDN_DELTAPOS on IDC_SPIN_FROM
----------------------------------------------------------------------------------------
*/
void CPODlgVse::OnDeltaposSpinFrom(NMHDR* pNMHDR, LRESULT* pResult)
{
MTH_tdxReal xValue;
MTH_tdxReal xDelta;
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
xDelta = -1 * (MTH_tdxReal) pNMUpDown->iDelta;
if (GetKeyState( VK_SHIFT) & 0x8000)
xDelta /= 10;
xValue = m_a_xTresholds[ m_xCurrentLod ] + xDelta;
m_fn_vChangeTreshold( m_xCurrentLod , xValue );
*pResult = 1;
}
/*
----------------------------------------------------------------------------------------
Description : EN_KILLFOCUS on IDC_EDIT_FROM
----------------------------------------------------------------------------------------
*/
void CPODlgVse::OnKillfocusEditFrom()
{
char szText[20];
GetDlgItem( IDC_EDIT_FROM )->GetWindowText( szText, 20 );
m_fn_vChangeTreshold( m_xCurrentLod, (float) atof( szText ) );
}
/*
----------------------------------------------------------------------------------------
Description : UDN_DELTAPOS on IDC_SPIN_TO
----------------------------------------------------------------------------------------
*/
void CPODlgVse::OnDeltaposSpinTo(NMHDR* pNMHDR, LRESULT* pResult)
{
MTH_tdxReal xValue;
MTH_tdxReal xDelta;
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
xDelta = -1 * (MTH_tdxReal) pNMUpDown->iDelta;
if (GetKeyState( VK_SHIFT) & 0x8000)
xDelta /= 10;
xValue = m_a_xTresholds[ m_xCurrentLod + 1] + xDelta;
m_fn_vChangeTreshold( m_xCurrentLod + 1, xValue );
*pResult = 1;
}
/*
----------------------------------------------------------------------------------------
Description : EN_KILLFOCUS on IDC_EDIT_TO
----------------------------------------------------------------------------------------
*/
void CPODlgVse::OnKillfocusEditTo()
{
char szText[20];
GetDlgItem( IDC_EDIT_TO )->GetWindowText( szText, 20 );
m_fn_vChangeTreshold( m_xCurrentLod + 1, (float) atof( szText ) );
}
/*
----------------------------------------------------------------------------------------
Description : BN_CLICKED on IDC_BUTTON_APPLY
----------------------------------------------------------------------------------------
*/
void CPODlgVse::OnButtonApply()
{
MTH_tdxReal a_xOldTreshold[ 10 ];
MTH_tdxReal xDiff;
ACP_tdxIndex xLod;
char cNbDiff;
for( cNbDiff = 0, xLod = 0; xLod < m_xNbLods; xLod++ )
{
GLI_vGetVisualSetLOD( m_hVisualSet, xLod, &a_xOldTreshold[ xLod ], &m_a_xGeometrics[xLod] );
if (a_xOldTreshold[ xLod ] != m_a_xTresholds[ xLod ])
cNbDiff++;
}
if ( !cNbDiff )
return;
/* create modif object */
CPOVseModif *p_oModif = new CPOVseModif( m_p_oPO, m_hVisualSet, cNbDiff );
for ( xLod = 0; xLod < m_xNbLods; xLod ++)
{
xDiff = m_a_xTresholds[ xLod ] - a_xOldTreshold[ xLod ];
if ( xDiff )
p_oModif->m_fn_vSetDiff( xLod, xDiff );
}
m_p_oParentDLL->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor( p_oModif );
}
/*
----------------------------------------------------------------------------------------
Description : BN_CLICKED on IDC_BUTTON_TRESHOLD
----------------------------------------------------------------------------------------
*/
void CPODlgVse::OnButtonTreshold()
{
ACP_tdxIndex xLod;
if ( (xLod = m_fn_xGetClickedLodIndex()) != -1)
{
m_xCurrentLod = xLod;
m_fn_vShowCurrentLod();
}
}
/*
----------------------------------------------------------------------------------------
Description : BN_DBLCLICKED on IDC_BUTTON_TRESHOLD
----------------------------------------------------------------------------------------
*/
void CPODlgVse::OnDoubleclickedButtonTreshold()
{
ACP_tdxIndex xLod;
if ( (xLod = m_fn_xGetClickedLodIndex()) != -1)
{
m_fn_vSwapLOD( xLod, (xLod == m_xSwapLod), TRUE );
GetDlgItem( IDC_BUTTON_TRESHOLD )->Invalidate();
}
}
/*
=======================================================================================
=======================================================================================
CPODlgList class
=======================================================================================
=======================================================================================
*/
IMPLEMENT_DYNCREATE(CPODlgList, CFormView)
/*
----------------------------------------------------------------------------------------
Description : constructor
----------------------------------------------------------------------------------------
*/
CPODlgList::CPODlgList() : CFormView(CPODlgList::IDD)
{
//{{AFX_DATA_INIT(CPODlgList)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
/*
----------------------------------------------------------------------------------------
Description : destructor
----------------------------------------------------------------------------------------
*/
CPODlgList::~CPODlgList()
{
}
/*
----------------------------------------------------------------------------------------
Description : Message Map
----------------------------------------------------------------------------------------
*/
BEGIN_MESSAGE_MAP(CPODlgList, CFormView)
//{{AFX_MSG_MAP(CPODlgList)
ON_WM_SIZE()
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_PO, OnSelchangedTreePos)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*
----------------------------------------------------------------------------------------
Description : Creation of FormView, register window and control
----------------------------------------------------------------------------------------
*/
BOOL CPODlgList::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
if ( !CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext) )
return FALSE;
TUT_M_vGetTutDll();
TUT_M_vRegisterControl( GetSafeHwnd(),"OPD_PhysicalObjectListDialog", TUT_e_Window );
TUT_M_vRegisterControlID( IDC_TREE_PO,"OPD_PhysicalObjectList", TUT_e_TreeCtrl );
return TRUE;
}
/*
----------------------------------------------------------------------------------------
Description : Unregister control from TUT
----------------------------------------------------------------------------------------
*/
void CPODlgList::OnDestroy()
{
TUT_M_vGetTutDll();
TUT_M_vUnregisterControl( GetSafeHwnd() );
TUT_M_vUnregisterControlID( IDC_TREE_PO );
CFormView::OnDestroy();
}
/*
=======================================================================================
Diagnostic functions
=======================================================================================
*/
#ifdef _DEBUG
void CPODlgList::AssertValid() const
{
CFormView::AssertValid();
}
void CPODlgList::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif //_DEBUG
/*
=======================================================================================
CPODlgList specific functions
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : search by name a child of a tree item
----------------------------------------------------------------------------------------
*/
HTREEITEM CPODlgList::fn_hSearchTreeChild( CTreeCtrl *_p_oTree, HTREEITEM _hParent, CString _cstrName )
{
HTREEITEM hChild;
hChild = _p_oTree->GetChildItem( _hParent );
while (hChild != NULL)
{
if ( _cstrName.CompareNoCase( _p_oTree->GetItemText( hChild ) ) == 0 )
break;
hChild = _p_oTree->GetNextSiblingItem( hChild );
}
return hChild;
}
/*
----------------------------------------------------------------------------------------
Description : search by Data a child of a tree item
----------------------------------------------------------------------------------------
*/
HTREEITEM CPODlgList::fn_hSearchTreeChild( CTreeCtrl *_p_oTree, HTREEITEM _hParent, DWORD _dwData )
{
HTREEITEM hChild;
hChild = _p_oTree->GetChildItem( _hParent );
while (hChild != NULL)
{
if ( _p_oTree->GetItemData( hChild ) == _dwData )
break;
hChild = _p_oTree->GetNextSiblingItem( hChild );
}
return hChild;
}
/*
----------------------------------------------------------------------------------------
Description : search in tree item that include given PO
_p_oTree -> tree
_p_oPO -> PO to search the parent
Returns (HTREEITEM) hItem of PO parent
----------------------------------------------------------------------------------------
*/
HTREEITEM CPODlgList::fn_hGetPOParentItem( CTreeCtrl *_p_oTree, EditorPO *_p_oPO )
{
CPA_BaseObject *p_oOwner;
CPA_BaseObject *p_oOwnerOwner;
HTREEITEM hCurrent;
HTREEITEM hFather;
/*
* Get parent HTREEITEM of PO
*/
if ((p_oOwner = _p_oPO->GetOwner()) == NULL)
return m_hWorldItem;
if ( strcmp( p_oOwner->fn_p_szGetType(), C_szObjectTableTypeName) == 0 )
{
if (m_hObjectTable != NULL)
{
p_oOwnerOwner = p_oOwner->GetOwner();
if (p_oOwnerOwner == NULL)
hCurrent = m_hWithoutActor;
else
hCurrent = fn_hSearchTreeChild( _p_oTree, m_hObjectTable, p_oOwnerOwner->GetName());
}
else
hCurrent = NULL;
}
else
{
hCurrent = m_hModelItem;
}
if (hCurrent != NULL)
hFather = fn_hSearchTreeChild( _p_oTree, hCurrent, p_oOwner->GetName());
else
hFather = NULL;
return hFather;
}
/*
----------------------------------------------------------------------------------------
Description : fill list of PO object present in memory
----------------------------------------------------------------------------------------
*/
void CPODlgList::fn_vRefreshListContent(void)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
CTreeCtrl *p_oTree = (CTreeCtrl *) GetDlgItem( IDC_TREE_PO );
HTREEITEM hCurrent;
HTREEITEM hFather;
HTREEITEM hSelected, hNewSelected = NULL;
DWORD dwSelectedData = 0;
CString cstrSelectedText = "";
CPA_BaseObjectList *p_oPOList;
CPA_BaseObject *p_oPO;
CPA_BaseObject *p_oOwner;
CPA_BaseObject *p_oOwnerOwner;
Position xPos;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* Init
*/
if ( (hSelected = p_oTree->GetSelectedItem()) != NULL)
{
dwSelectedData = p_oTree->GetItemData( hSelected );
cstrSelectedText = p_oTree->GetItemText( hSelected );
}
p_oTree->DeleteAllItems();
m_hWorldItem = m_hModelItem = m_hObjectTable = m_hWithoutActor = NULL;
p_oPOList = m_p_oParentDLL->GetMainWorld()->fn_p_oGetOriginalObjectList( C_szPhysicalObjectTypeName );
if (p_oPOList != NULL)
{
xPos = p_oPOList->GetHeadPosition();
while (xPos)
{
p_oPO = p_oPOList->GetNext( xPos );
ASSERT( p_oPO );
/*
* Get parent HTREEITEM of PO
*/
if ((p_oOwner = p_oPO->GetOwner()) == NULL)
{
if (m_hWorldItem == NULL)
if ( (m_hWorldItem = p_oTree->InsertItem( "World Physical objects" )) != NULL)
{
p_oTree->SetItemData( m_hWorldItem, 0 );
if ( (hSelected != NULL) && (dwSelectedData == 0) && (hNewSelected == NULL ) )
if (cstrSelectedText.CompareNoCase( "World Physical objects" ) == 0)
hNewSelected = m_hWorldItem;
}
hFather = m_hWorldItem;
}
else
{
if ( strcmp( p_oOwner->fn_p_szGetType(), C_szObjectTableTypeName) == 0 )
{
if (m_hObjectTable == NULL)
if ( (m_hObjectTable = p_oTree->InsertItem( "Object Tables" )) != NULL)
{
p_oTree->SetItemData( m_hObjectTable, 0 );
if ( (hSelected != NULL) && (dwSelectedData == 0) && (hNewSelected == NULL ) )
if (cstrSelectedText.CompareNoCase( "Object Tables" ) == 0)
hNewSelected = m_hObjectTable;
}
if (m_hObjectTable != NULL)
{
p_oOwnerOwner = p_oOwner->GetOwner();
if (p_oOwnerOwner == NULL)
{
if (m_hWithoutActor == NULL )
if ( (m_hWithoutActor = p_oTree->InsertItem( "Without owner", m_hObjectTable )) != NULL)
{
p_oTree->SetItemData( m_hWithoutActor, 0 );
if ( (hSelected != NULL) && (dwSelectedData == 0) && (hNewSelected == NULL ) )
if (cstrSelectedText.CompareNoCase( "Without owner" ) == 0)
hNewSelected = m_hWithoutActor;
}
hCurrent = m_hWithoutActor;
}
else
{
if ( (hCurrent = fn_hSearchTreeChild( p_oTree, m_hObjectTable, p_oOwnerOwner->GetName())) == NULL)
if ( (hCurrent = p_oTree->InsertItem( p_oOwnerOwner->GetName(), m_hObjectTable )) != NULL)
{
p_oTree->SetItemData( hCurrent, 0 );
if ( (hSelected != NULL) && (dwSelectedData == 0) && (hNewSelected == NULL ) )
if (cstrSelectedText.CompareNoCase( p_oOwnerOwner->GetName() ) == 0)
hNewSelected = hCurrent;
}
}
}
else
hCurrent = NULL;
}
else
{
if (m_hModelItem == NULL)
if ( (m_hModelItem = p_oTree->InsertItem( "Model PO" )) != NULL)
{
p_oTree->SetItemData( m_hModelItem, 0 );
if ( (hSelected != NULL) && (dwSelectedData == 0) && (hNewSelected == NULL ) )
if (cstrSelectedText.CompareNoCase( "Model PO" ) == 0)
hNewSelected = m_hModelItem;
}
hCurrent = m_hModelItem;
}
if (hCurrent != NULL)
{
if ( (hFather = fn_hSearchTreeChild( p_oTree, hCurrent, p_oOwner->GetName())) == NULL)
if ( (hFather = p_oTree->InsertItem( p_oOwner->GetName(), hCurrent )) != NULL)
{
p_oTree->SetItemData( hFather, 0 );
if ( (hSelected != NULL) && (dwSelectedData == 0) && (hNewSelected == NULL ) )
if (cstrSelectedText.CompareNoCase( p_oOwner->GetName() ) == 0)
hNewSelected = hFather;
}
}
}
/*
* add item
*/
if (hFather != NULL)
{
if ((hCurrent = p_oTree->InsertItem( p_oPO->GetName(), hFather )) != NULL)
{
p_oTree->SetItemData( hCurrent, (DWORD) p_oPO );
if ( (DWORD) p_oPO == dwSelectedData )
hNewSelected = hCurrent;
}
}
}
}
p_oTree->SelectItem( hNewSelected );
}
/*
----------------------------------------------------------------------------------------
Description : set current selected item in tree of PO
_p_oPO -> PO object
_p_oActor -> actor object
----------------------------------------------------------------------------------------
*/
void CPODlgList::fn_vSetCurrentItem( EditorPO *_p_oPO, CPA_BaseObject *_p_oActor )
{
CTreeCtrl *p_oTree = (CTreeCtrl *) GetDlgItem( IDC_TREE_PO );
HTREEITEM hItem = NULL;
if (_p_oActor)
{
CPA_BaseObject *p_oOwner;
if
(
( (hItem = m_hObjectTable) != NULL )
&& ( ( p_oOwner = _p_oActor->GetOwner() ) != NULL )
&& ( ( p_oOwner = p_oOwner->GetOwner() ) != NULL )
)
{
hItem = fn_hSearchTreeChild( p_oTree, hItem, p_oOwner->GetName() );
}
}
else if (_p_oPO)
{
if ( (hItem = fn_hGetPOParentItem( p_oTree, _p_oPO )) != NULL)
{
hItem = fn_hSearchTreeChild( p_oTree, hItem, (DWORD) _p_oPO );
}
}
p_oTree->SelectItem( hItem );
}
/*
=======================================================================================
CPODlgList message handlers
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : WM_SIZE
----------------------------------------------------------------------------------------
*/
void CPODlgList::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
CTreeCtrl *p_oTree = (CTreeCtrl *) GetDlgItem( IDC_TREE_PO );
if (p_oTree)
{
RECT stRect;
stRect.left = stRect.top = 5;
stRect.right = cx - 10;
stRect.bottom = cy - 10;
p_oTree->MoveWindow( &stRect );
}
}
/*
----------------------------------------------------------------------------------------
Description : TVN_SELCHANGED on IDC_TREE_PO
----------------------------------------------------------------------------------------
*/
void CPODlgList::OnSelchangedTreePos(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
CTreeCtrl *p_oTree = (CTreeCtrl *) GetDlgItem( IDC_TREE_PO );
EditorPO *p_oPO;
if (p_oTree)
{
if (hItem)
p_oPO = (EditorPO *) p_oTree->GetItemData( hItem );
else
p_oPO = NULL;
m_p_oParentDLL->fn_vDisplayPOInfo( p_oPO );
}
*pResult = 0;
}