diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/faceedit_disppage.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'hammer/faceedit_disppage.cpp')
| -rw-r--r-- | hammer/faceedit_disppage.cpp | 1531 |
1 files changed, 1531 insertions, 0 deletions
diff --git a/hammer/faceedit_disppage.cpp b/hammer/faceedit_disppage.cpp new file mode 100644 index 0000000..26c533e --- /dev/null +++ b/hammer/faceedit_disppage.cpp @@ -0,0 +1,1531 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include <stdafx.h> +#include <afxcmn.h> +#include "hammer.h" +#include "MainFrm.h" +#include "GlobalFunctions.h" +#include "MapDoc.h" +#include "FaceEdit_DispPage.h" +#include "MapSolid.h" +#include "MapFace.h" +#include "MapDisp.h" +#include "FaceEditSheet.h" +#include "MapView3D.h" +#include "History.h" +#include "ToolDisplace.h" +#include "ToolManager.h" +#include "DispSew.h" +#include "builddisp.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + +CToolDisplace* GetDisplacementTool() { return dynamic_cast<CToolDisplace*>(ToolManager()->GetToolForID(TOOL_FACEEDIT_DISP)); } + +//============================================================================= + +IMPLEMENT_DYNAMIC( CFaceEditDispPage, CPropertyPage ) + +BEGIN_MESSAGE_MAP( CFaceEditDispPage, CPropertyPage ) + //{{AFX_MSG_MAP( CFaceEditDispPage ) + ON_BN_CLICKED( ID_DISP_MASK_SELECT, OnCheckMaskSelect ) + ON_BN_CLICKED( ID_DISP_MASK_GRID, OnCheckMaskGrid ) + + ON_BN_CLICKED( ID_DISP_NOPHYSICS_COLL, OnCheckNoPhysicsCollide ) + ON_BN_CLICKED( ID_DISP_NOHULL_COLL, OnCheckNoHullCollide ) + ON_BN_CLICKED( ID_DISP_NORAY_COLL, OnCheckNoRayCollide ) + + ON_BN_CLICKED( ID_DISP_SELECT2, OnButtonSelect ) + ON_BN_CLICKED( ID_DISP_CREATE, OnButtonCreate ) + ON_BN_CLICKED( ID_DISP_DESTROY, OnButtonDestroy ) + ON_BN_CLICKED( ID_DISP_NOISE, OnButtonNoise ) + ON_BN_CLICKED( ID_DISP_SUBDIVIDE, OnButtonSubdivide ) + ON_BN_CLICKED( ID_DISP_SEW, OnButtonSew ) + ON_BN_CLICKED( ID_DISP_PAINT_GEO, OnButtonPaintGeo ) + ON_BN_CLICKED( ID_DISP_PAINT_DATA, OnButtonPaintData ) + ON_BN_CLICKED( ID_DISP_TAG_WALK, OnButtonTagWalkable ) + ON_BN_CLICKED( ID_DISP_TAG_BUILD, OnButtonTagBuildable ) + ON_BN_CLICKED( ID_DISP_TAG_REMOVE, OnButtonTagRemove ) + ON_BN_CLICKED( ID_DISP_INVERT_ALPHA, OnButtonInvertAlpha ) + ON_BN_CLICKED( IDC_SELECT_ADJACENT, OnSelectAdjacent ) + + ON_NOTIFY( UDN_DELTAPOS, ID_SPIN_DISP_POWER, OnSpinUpDown ) + ON_NOTIFY( UDN_DELTAPOS, ID_SPIN_DISP_ELEVATION, OnSpinUpDown ) + ON_BN_CLICKED( ID_DISP_APPLY, OnButtonApply ) + //}}AFX_MSG_MAP + ON_BN_CLICKED(ID_DISP_SCULPT_PAINT, &CFaceEditDispPage::OnBnClickedDispSculptPaint) +END_MESSAGE_MAP() + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +CFaceEditDispPage::CFaceEditDispPage() : CPropertyPage( IDD ) +{ + m_uiTool = FACEEDITTOOL_SELECT; + + m_bForceShowWalkable = false; + m_bForceShowBuildable = false; +} + +//----------------------------------------------------------------------------- +// Purpose: Deconstructor +//----------------------------------------------------------------------------- +CFaceEditDispPage::~CFaceEditDispPage() +{ +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +inline void CFaceEditDispPage::PostToolUpdate( void ) +{ + // update the mapdoc views + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if( pDoc ) + { + pDoc->SetModifiedFlag(); + } + + // update the dialogs data + UpdateDialogData(); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::ClickFace( CMapSolid *pSolid, int faceIndex, int cmd, int clickMode ) +{ + m_bIsEditable = ( pSolid ? pSolid->IsEditable() : true ); + + UpdateDialogData(); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::UpdateEditControls( bool bAllDisps, bool bHasFace ) +{ + // + // masks - always active!! + // + CButton *pcheckSelect = ( CButton* )GetDlgItem( ID_DISP_MASK_SELECT ); + CButton *pcheckGrid = ( CButton* )GetDlgItem( ID_DISP_MASK_GRID ); + pcheckSelect->EnableWindow( TRUE ); + pcheckGrid->EnableWindow( TRUE ); + + // + // tool buttons + // + CButton *pbuttonSelect = ( CButton* )GetDlgItem( ID_DISP_SELECT2 ); + CButton *pbuttonCreate = ( CButton* )GetDlgItem( ID_DISP_CREATE ); + CButton *pbuttonDestroy = ( CButton* )GetDlgItem( ID_DISP_DESTROY ); + CButton *pbuttonPaintGeo = ( CButton* )GetDlgItem( ID_DISP_PAINT_GEO ); + CButton *pbuttonPaintSculpt = ( CButton* )GetDlgItem( ID_DISP_SCULPT_PAINT ); + CButton *pbuttonPaintData = ( CButton* )GetDlgItem( ID_DISP_PAINT_DATA ); + CButton *pbuttonSubdiv = ( CButton* )GetDlgItem( ID_DISP_SUBDIVIDE ); + CButton *pbuttonSew = ( CButton* )GetDlgItem( ID_DISP_SEW ); + CButton *pbuttonNoise = ( CButton* )GetDlgItem( ID_DISP_NOISE ); + CButton *pButtonWalk = ( CButton* )GetDlgItem( ID_DISP_TAG_WALK ); + CButton *pButtonBuild = ( CButton* )GetDlgItem( ID_DISP_TAG_BUILD ); + + pbuttonSelect->EnableWindow( TRUE ); + pbuttonCreate->EnableWindow( FALSE ); + pbuttonDestroy->EnableWindow( FALSE ); + pbuttonPaintGeo->EnableWindow( FALSE ); + pbuttonPaintSculpt->EnableWindow( FALSE ); + pbuttonPaintData->EnableWindow( FALSE ); + pbuttonSubdiv->EnableWindow( FALSE ); + pbuttonSew->EnableWindow( FALSE ); + pbuttonNoise->EnableWindow( FALSE ); + pButtonWalk->EnableWindow( TRUE ); + pButtonBuild->EnableWindow( TRUE ); + + // + // attributes (displacement info) + // + CEdit *peditPower = ( CEdit* )GetDlgItem( ID_DISP_POWER ); + CSpinButtonCtrl *pspinPower = ( CSpinButtonCtrl* )GetDlgItem( ID_SPIN_DISP_POWER ); + CEdit *peditElevation = ( CEdit* )GetDlgItem( ID_DISP_ELEVATION ); + CSpinButtonCtrl *pspinElevation = ( CSpinButtonCtrl* )GetDlgItem( ID_SPIN_DISP_ELEVATION ); + CEdit *peditScale = ( CEdit* )GetDlgItem( ID_DISP_SCALE ); + CButton *pbuttonApply = ( CButton* )GetDlgItem( ID_DISP_APPLY ); + CButton *pbuttonInvertAlpha = ( CButton* )GetDlgItem( ID_DISP_INVERT_ALPHA ); + CButton *pCheckNoPhysicsColl = ( CButton* )GetDlgItem( ID_DISP_NOPHYSICS_COLL ); + CButton *pCheckNoHullColl = ( CButton* )GetDlgItem( ID_DISP_NOHULL_COLL ); + CButton *pCheckNoRayColl = ( CButton* )GetDlgItem( ID_DISP_NORAY_COLL ); + + peditPower->EnableWindow( FALSE ); + pspinPower->EnableWindow( FALSE ); + peditElevation->EnableWindow( FALSE ); + pspinElevation->EnableWindow( FALSE ); + peditScale->EnableWindow( FALSE ); + pbuttonApply->EnableWindow( FALSE ); + pbuttonInvertAlpha->EnableWindow( FALSE ); + pCheckNoPhysicsColl->EnableWindow( FALSE ); + pCheckNoHullColl->EnableWindow( FALSE ); + pCheckNoRayColl->EnableWindow( FALSE ); + + // if there aren't any faces selected then the only active item should be selection + if( !bHasFace ) + return; + + // + // if not all selected faces are displacements then highlight only + // SELECTION, CREATE, DESTROY, and SEW + // + if ( m_bIsEditable ) + { + if( !bAllDisps ) + { + pbuttonCreate->EnableWindow( TRUE ); + pbuttonDestroy->EnableWindow( TRUE ); + pbuttonSew->EnableWindow( TRUE ); + } + // highlight all tool buttons, but CREATE + else + { + pbuttonDestroy->EnableWindow( TRUE ); + pbuttonPaintGeo->EnableWindow( TRUE ); + pbuttonPaintSculpt->EnableWindow( TRUE ); + pbuttonPaintData->EnableWindow( TRUE ); + pbuttonSubdiv->EnableWindow( TRUE ); + pbuttonSew->EnableWindow( TRUE ); + pbuttonNoise->EnableWindow( TRUE ); + } + + // active attributes if in selection mode + if( m_uiTool == FACEEDITTOOL_SELECT ) + { + peditPower->EnableWindow( TRUE ); + pspinPower->EnableWindow( TRUE ); + peditElevation->EnableWindow( TRUE ); + pspinElevation->EnableWindow( TRUE ); + peditScale->EnableWindow( TRUE ); + pbuttonApply->EnableWindow( TRUE ); + pbuttonInvertAlpha->EnableWindow( TRUE ); + pCheckNoPhysicsColl->EnableWindow( TRUE ); + pCheckNoHullColl->EnableWindow( TRUE ); + pCheckNoRayColl->EnableWindow( TRUE ); + } + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::FillEditControls( bool bAllDisps ) +{ + CString strText; + + // + // if all selected face have displacements + // + if( bAllDisps ) + { + int power = 0; + bool bAllPower = true; + + float elevation = 0.0f; + bool bAllElevation = true; + + float scale = 1.0f; + bool bAllScale = true; + + bool bAllNoPhysics = true; + bool bAllNoHull = true; + bool bAllNoRay = true; + + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + int faceCount = pSheet->GetFaceListCount(); + if( faceCount > 0 ) + { + CMapFace *pFace = pSheet->GetFaceListDataFace( 0 ); + EditDispHandle_t handle = pFace->GetDisp(); + CMapDisp *pDisp = EditDispMgr()->GetDisp( handle ); + + power = pDisp->GetPower(); + elevation = pDisp->GetElevation(); + scale = pDisp->GetScale(); + } + + // + // test all faces for "equal" attributes + // + for( int faceIndex = 0; faceIndex < faceCount; faceIndex++ ) + { + CMapFace *pFace = pSheet->GetFaceListDataFace( faceIndex ); + EditDispHandle_t handle = pFace->GetDisp(); + CMapDisp *pDisp = EditDispMgr()->GetDisp( handle ); + + // test power, elevation, and scale + if( power != pDisp->GetPower() ) { bAllPower = false; } + if( elevation != pDisp->GetElevation() ) { bAllElevation = false; } + if( scale != pDisp->GetScale() ) { bAllScale = false; } + + if ( !pDisp->CheckFlags( CCoreDispInfo::SURF_NOPHYSICS_COLL ) ) { bAllNoPhysics = false; } + if ( !pDisp->CheckFlags( CCoreDispInfo::SURF_NOHULL_COLL ) ) { bAllNoHull = false; } + if ( !pDisp->CheckFlags( CCoreDispInfo::SURF_NORAY_COLL ) ) { bAllNoRay = false; } + } + + // set displacement power value to 3 - 9x9 + SetDlgItemText( ID_DISP_POWER, "" ); + if( bAllPower ) + { + SetDlgItemInt( ID_DISP_POWER, power ); + } + + // set elevation value + SetDlgItemText( ID_DISP_ELEVATION, "" ); + if( bAllElevation ) + { + strText.Format( "%4.2f", elevation ); + SetDlgItemText( ID_DISP_ELEVATION, strText ); + } + + // set scale value + SetDlgItemText( ID_DISP_SCALE, "" ); + if( bAllScale ) + { + strText.Format( "%4.4f", scale ); + SetDlgItemText( ID_DISP_SCALE, strText ); + } + + CButton *pCheckBox; + pCheckBox = ( CButton* )GetDlgItem( ID_DISP_NOPHYSICS_COLL ); + pCheckBox->SetCheck( FALSE ); + if ( bAllNoPhysics ) + { + pCheckBox->SetCheck( TRUE ); + } + + pCheckBox = ( CButton* )GetDlgItem( ID_DISP_NOHULL_COLL ); + pCheckBox->SetCheck( FALSE ); + if ( bAllNoHull ) + { + pCheckBox->SetCheck( TRUE ); + } + + pCheckBox = ( CButton* )GetDlgItem( ID_DISP_NORAY_COLL ); + pCheckBox->SetCheck( FALSE ); + if ( bAllNoRay ) + { + pCheckBox->SetCheck( TRUE ); + } + } + } + else + { + // set initial displacement power value to 3 - 9x9 + CSpinButtonCtrl *pSpin = ( CSpinButtonCtrl* )GetDlgItem( ID_SPIN_DISP_POWER ); + pSpin->SetPos( 0 ); + SetDlgItemInt( ID_DISP_POWER, 0 ); + + // set initial elevation value + pSpin = ( CSpinButtonCtrl* )GetDlgItem( ID_SPIN_DISP_ELEVATION ); + pSpin->SetPos( 0 ); + SetDlgItemText( ID_DISP_ELEVATION, "" ); + + // set initial scale value + SetDlgItemText( ID_DISP_SCALE, "" ); + } + + // + // get tool specific data for page + // + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + CButton *checkBox; + checkBox = ( CButton* )GetDlgItem( ID_DISP_MASK_SELECT ); + checkBox->SetCheck( pDispTool->HasSelectMask() ); + checkBox = ( CButton* )GetDlgItem( ID_DISP_MASK_GRID ); + checkBox->SetCheck( pDispTool->HasGridMask() ); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::UpdateDialogData( void ) +{ + bool bAllDisps = false; + bool bHasFace = false; + + // + // get face and displacement info + // + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + int faceCount = pSheet->GetFaceListCount(); + if( faceCount > 0 ) + { + bHasFace = true; + bAllDisps = true; + } + + for( int i = 0; i < faceCount; i++ ) + { + CMapFace *pFace = pSheet->GetFaceListDataFace( i ); + if( !pFace->HasDisp() ) + { + bAllDisps = false; + } + } + } + + // fill in edit controls + FillEditControls( bAllDisps ); + + // update the edit controls + UpdateEditControls( bAllDisps, bHasFace ); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::UpdatePaintDialogs( void ) +{ + m_PaintDistDlg.UpdateSpatialData(); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnCheckMaskSelect( void ) +{ + // get the displacement tool + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->ToggleSelectMask(); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnCheckMaskGrid( void ) +{ + // get the displacement tool + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->ToggleGridMask(); + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnCheckNoPhysicsCollide( void ) +{ + // Toggle marked faces as collidable. + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + // Check for a face list. + int nFaceCount = pSheet->GetFaceListCount(); + if( nFaceCount == 0 ) + return; + + // Are we setting or reseting the collision flag? + CButton *pCheckNoCollide = ( CButton* )GetDlgItem( ID_DISP_NOPHYSICS_COLL ); + bool bReset = false; + if ( !pCheckNoCollide->GetCheck() ) + { + bReset = true; + } + + // Get faces with displacements and toggle the collide flag. + int iFace = 0; + for( iFace = 0; iFace < nFaceCount; iFace++ ) + { + CMapFace *pFace = pSheet->GetFaceListDataFace( iFace ); + if( !pFace || !pFace->HasDisp() ) + continue; + + EditDispHandle_t hDisp = pFace->GetDisp(); + CMapDisp *pDisp = EditDispMgr()->GetDisp( hDisp ); + if( pDisp ) + { + if ( bReset ) + { + int nFlags = pDisp->GetFlags(); + nFlags &= ~CCoreDispInfo::SURF_NOPHYSICS_COLL; + pDisp->SetFlags( nFlags ); + } + else + { + int nFlags = pDisp->GetFlags(); + nFlags |= CCoreDispInfo::SURF_NOPHYSICS_COLL; + pDisp->SetFlags( nFlags ); + } + } + } + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnCheckNoHullCollide( void ) +{ + // Toggle marked faces as collidable. + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + // Check for a face list. + int nFaceCount = pSheet->GetFaceListCount(); + if( nFaceCount == 0 ) + return; + + // Are we setting or reseting the collision flag? + CButton *pCheckNoCollide = ( CButton* )GetDlgItem( ID_DISP_NOHULL_COLL ); + bool bReset = false; + if ( !pCheckNoCollide->GetCheck() ) + { + bReset = true; + } + + // Get faces with displacements and toggle the collide flag. + int iFace = 0; + for( iFace = 0; iFace < nFaceCount; iFace++ ) + { + CMapFace *pFace = pSheet->GetFaceListDataFace( iFace ); + if( !pFace || !pFace->HasDisp() ) + continue; + + EditDispHandle_t hDisp = pFace->GetDisp(); + CMapDisp *pDisp = EditDispMgr()->GetDisp( hDisp ); + if( pDisp ) + { + if ( bReset ) + { + int nFlags = pDisp->GetFlags(); + nFlags &= ~CCoreDispInfo::SURF_NOHULL_COLL; + pDisp->SetFlags( nFlags ); + } + else + { + int nFlags = pDisp->GetFlags(); + nFlags |= CCoreDispInfo::SURF_NOHULL_COLL; + pDisp->SetFlags( nFlags ); + } + } + } + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnCheckNoRayCollide( void ) +{ + // Toggle marked faces as collidable. + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + // Check for a face list. + int nFaceCount = pSheet->GetFaceListCount(); + if( nFaceCount == 0 ) + return; + + // Are we setting or reseting the collision flag? + CButton *pCheckNoCollide = ( CButton* )GetDlgItem( ID_DISP_NORAY_COLL ); + bool bReset = false; + if ( !pCheckNoCollide->GetCheck() ) + { + bReset = true; + } + + // Get faces with displacements and toggle the collide flag. + int iFace = 0; + for( iFace = 0; iFace < nFaceCount; iFace++ ) + { + CMapFace *pFace = pSheet->GetFaceListDataFace( iFace ); + if( !pFace || !pFace->HasDisp() ) + continue; + + EditDispHandle_t hDisp = pFace->GetDisp(); + CMapDisp *pDisp = EditDispMgr()->GetDisp( hDisp ); + if( pDisp ) + { + if ( bReset ) + { + int nFlags = pDisp->GetFlags(); + nFlags &= ~CCoreDispInfo::SURF_NORAY_COLL; + pDisp->SetFlags( nFlags ); + } + else + { + int nFlags = pDisp->GetFlags(); + nFlags |= CCoreDispInfo::SURF_NORAY_COLL; + pDisp->SetFlags( nFlags ); + } + } + } + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::SetTool( unsigned int tool ) +{ + if( m_uiTool == FACEEDITTOOL_PAINTGEO ) + { + m_PaintDistDlg.DestroyWindow(); + } + + if( m_uiTool == FACEEDITTOOL_PAINTSCULPT ) + { + m_PaintSculptDlg.DestroyWindow(); + } + + if( m_uiTool == FACEEDITTOOL_PAINTDATA ) + { + m_PaintDataDlg.DestroyWindow(); + } + + if ( ( m_uiTool == FACEEDITTOOL_TAG_WALK ) || + ( m_uiTool == FACEEDITTOOL_TAG_BUILD ) || + ( m_uiTool == FACEEDITTOOL_TAG_REMOVE ) ) + { + ResetForceShows(); + } + + m_uiTool = tool; + + // set button checked + CButton *pbuttonSelect = ( CButton* )GetDlgItem( ID_DISP_SELECT2 ); + CButton *pbuttonCreate = ( CButton* )GetDlgItem( ID_DISP_CREATE ); + CButton *pbuttonDestroy = ( CButton* )GetDlgItem( ID_DISP_DESTROY ); + CButton *pbuttonPaintGeo = ( CButton* )GetDlgItem( ID_DISP_PAINT_GEO ); + CButton *pbuttonPaintSculpt = ( CButton* )GetDlgItem( ID_DISP_SCULPT_PAINT ); + CButton *pbuttonPaintData = ( CButton* )GetDlgItem( ID_DISP_PAINT_DATA ); + CButton *pbuttonSubdiv = ( CButton* )GetDlgItem( ID_DISP_SUBDIVIDE ); + CButton *pbuttonSew = ( CButton* )GetDlgItem( ID_DISP_SEW ); + CButton *pbuttonNoise = ( CButton* )GetDlgItem( ID_DISP_NOISE ); + CButton *pButtonWalk = ( CButton* )GetDlgItem( ID_DISP_TAG_WALK ); + CButton *pButtonBuild = ( CButton* )GetDlgItem( ID_DISP_TAG_BUILD ); + CButton *pButtonRemove = ( CButton* )GetDlgItem( ID_DISP_TAG_REMOVE ); + + pbuttonSelect->SetCheck( m_uiTool == FACEEDITTOOL_SELECT ); + pbuttonCreate->SetCheck( m_uiTool == FACEEDITTOOL_CREATE ); + pbuttonDestroy->SetCheck( m_uiTool == FACEEDITTOOL_DESTROY ); + pbuttonPaintGeo->SetCheck( m_uiTool == FACEEDITTOOL_PAINTGEO ); + pbuttonPaintSculpt->SetCheck( m_uiTool == FACEEDITTOOL_PAINTSCULPT ); + pbuttonPaintData->SetCheck( m_uiTool == FACEEDITTOOL_PAINTDATA ); + pbuttonSubdiv->SetCheck( m_uiTool == FACEEDITTOOL_SUBDIV ); + pbuttonSew->SetCheck( m_uiTool == FACEEDITTOOL_SEW ); + pbuttonNoise->SetCheck( m_uiTool == FACEEDITTOOL_NOISE ); + pButtonWalk->SetCheck( m_uiTool == FACEEDITTOOL_TAG_WALK ); + pButtonBuild->SetCheck( m_uiTool == FACEEDITTOOL_TAG_BUILD ); + pButtonRemove->SetCheck( m_uiTool == FACEEDITTOOL_TAG_REMOVE ); + + // Update button state, etc. + UpdateDialogData(); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonSelect( void ) +{ + // set selection tool + SetTool( FACEEDITTOOL_SELECT ); + + // get the displacement tool and set selection tool active + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->SetTool( DISPTOOL_SELECT ); + UpdateDialogData(); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonCreate( void ) +{ + // set creation tool + SetTool( FACEEDITTOOL_CREATE ); + + // + // "create" all selected faces + // + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + // check for faces to create + int faceCount = pSheet->GetFaceListCount(); + if( faceCount == 0 ) + return; + + // + // open the dialog and get the desired creation power + // + if( m_CreateDlg.DoModal() == IDCANCEL ) + { + // reset selection tool + SetTool( FACEEDITTOOL_SELECT ); + + return; + } + + // clamped the "power" (range [2..4]) + int power = m_CreateDlg.m_Power; + + // + // get the active map doc and displacement manager + // + IWorldEditDispMgr *pDispMgr = GetActiveWorldEditDispManager(); + if( !pDispMgr ) + return; + + // + // create faces + // + for( int ndxFace = 0; ndxFace < faceCount; ndxFace++ ) + { + CMapFace *pFace = pSheet->GetFaceListDataFace( ndxFace ); + if( !pFace ) + continue; + + // make sure the face has the appropriate point count + if( pFace->GetPointCount() != 4 ) + continue; + + // check to see if the face already has a displacement, + // ignore it if so + if( pFace->HasDisp() ) + continue; + + EditDispHandle_t dispHandle = EditDispMgr()->Create(); + CMapDisp *pDisp = EditDispMgr()->GetDisp( dispHandle ); + if( pDisp ) + { + // set dependencies + pFace->SetDisp( dispHandle ); + pDisp->SetParent( pFace ); + + // get surface data + pDisp->InitDispSurfaceData( pFace, true ); + + // add displacement to world list (this should be done automatically!) + pDispMgr->AddToWorld( dispHandle ); + + // create a new displacement surface based on data + pDisp->InitData( power ); + pDisp->Create(); + + // Post a change to the solid. + CMapSolid *pSolid = ( CMapSolid* )pFace->GetParent(); + pSolid->PostUpdate( Notify_Changed ); + + // Update autovisgroups for the solid + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + pDoc->RemoveFromAutoVisGroups( pSolid ); + pDoc->AddToAutoVisGroup( pSolid ); + } + } + } + + // reset selection tool + SetTool( FACEEDITTOOL_SELECT ); + + // update + PostToolUpdate(); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonDestroy( void ) +{ + // set destruction tool + SetTool( FACEEDITTOOL_DESTROY ); + + // + // "destroy" all selected faces + // + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + // check for faces to destroy + int faceCount = pSheet->GetFaceListCount(); + if( faceCount == 0 ) + return; + + // get the displacement manager + IWorldEditDispMgr *pDispMgr = GetActiveWorldEditDispManager(); + if( !pDispMgr ) + return; + + // mark history position + pDispMgr->PreUndo( "Displacement Destroy" ); + + for( int ndxFace = 0; ndxFace < faceCount; ndxFace++ ) + { + // get the current displacement + // get current displacement + CMapFace *pFace = pSheet->GetFaceListDataFace( ndxFace ); + if( !pFace || !pFace->HasDisp() ) + continue; + + CMapSolid *pSolid = ( CMapSolid* )pFace->GetParent(); + if ( pSolid && !pSolid->IsVisible() ) + continue; + + EditDispHandle_t handle = pFace->GetDisp(); + + // setup for undo + pDispMgr->Undo( handle, false ); + + pDispMgr->RemoveFromWorld( handle ); + pFace->SetDisp( EDITDISPHANDLE_INVALID ); + + // Post a change to the solid. + pSolid->PostUpdate( Notify_Changed ); + + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + pDoc->RemoveFromAutoVisGroups( pSolid ); + pDoc->AddToAutoVisGroup( pSolid ); + } + + pDispMgr->PostUndo(); + } + + // reset selection tool + SetTool( FACEEDITTOOL_SELECT ); + + // update + PostToolUpdate(); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonNoise( void ) +{ + // set noise tool + SetTool( FACEEDITTOOL_NOISE ); + + // + // "noise" all selected faces + // + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + // check for faces to add noise to + int faceCount = pSheet->GetFaceListCount(); + if( faceCount == 0 ) + return; + + // + // open the dialog and get the desired noise parameters + // + if( m_NoiseDlg.DoModal() == IDCANCEL ) + { + // reset selection tool + SetTool( FACEEDITTOOL_SELECT ); + + return; + } + + // mark for undo + // get the displacement manager + IWorldEditDispMgr *pDispMgr = GetActiveWorldEditDispManager(); + if( !pDispMgr ) + return; + + pDispMgr->PreUndo( "Displacement Noise" ); + + for( int ndxFace = 0; ndxFace < faceCount; ndxFace++ ) + { + // get current displacement + CMapFace *pFace = pSheet->GetFaceListDataFace( ndxFace ); + if( pFace ) + { + if( pFace->HasDisp() ) + { + EditDispHandle_t handle = pFace->GetDisp(); + + // setup for undo + pDispMgr->Undo( handle, false ); + + CMapDisp *pDisp = EditDispMgr()->GetDisp( handle ); + pDisp->ApplyNoise( m_NoiseDlg.m_Min, m_NoiseDlg.m_Max, 1.0f ); + } + } + } + + pDispMgr->PostUndo(); + } + + // reset selection tool + SetTool( FACEEDITTOOL_SELECT ); + + // update + PostToolUpdate(); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonSubdivide( void ) +{ + // set subdivision tool + SetTool( FACEEDITTOOL_SUBDIV ); + + // + // create selection list + // + IWorldEditDispMgr *pDispMgr = GetActiveWorldEditDispManager(); + if( !pDispMgr ) + return; + + pDispMgr->SelectClear(); + + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + // check for faces to subdivide + int faceCount = pSheet->GetFaceListCount(); + if( faceCount == 0 ) + return; + + for( int ndxFace = 0; ndxFace < faceCount; ndxFace++ ) + { + // get current displacement + CMapFace *pFace = pSheet->GetFaceListDataFace( ndxFace ); + if( pFace ) + { + if( pFace->HasDisp() ) + { + EditDispHandle_t handle = pFace->GetDisp(); + pDispMgr->AddToSelect( handle ); + + CMapDisp *pDisp = EditDispMgr()->GetDisp( handle ); + pDisp->ResetTexelHitIndex(); + } + } + } + } + + // subdivide + pDispMgr->CatmullClarkSubdivide(); + + // reset selection tool + SetTool( FACEEDITTOOL_SELECT ); + + // update + PostToolUpdate(); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonSew( void ) +{ + // set sew tool + SetTool( FACEEDITTOOL_SEW ); + + // + // "sew" all selected faces + // + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + // check for faces to sew + int faceCount = pSheet->GetFaceListCount(); + if( faceCount == 0 ) + return; + + // get the displacement manager + IWorldEditDispMgr *pDispMgr = GetActiveWorldEditDispManager(); + if( !pDispMgr ) + return; + + // mark history position + pDispMgr->PreUndo( "Displacement Sewing" ); + + for( int ndxFace = 0; ndxFace < faceCount; ndxFace++ ) + { + // get the current displacement + // get current displacement + CMapFace *pFace = pSheet->GetFaceListDataFace( ndxFace ); + if( pFace ) + { + if( pFace->HasDisp() ) + { + EditDispHandle_t handle = pFace->GetDisp(); + + // setup for undo + pDispMgr->Undo( handle, false ); + } + } + } + + pDispMgr->PostUndo(); + + // sew faces + FaceListSewEdges(); + + // update the parents - force a rebuild + for( int ndxFace = 0; ndxFace < faceCount; ndxFace++ ) + { + // get current displacement + CMapFace *pFace = pSheet->GetFaceListDataFace( ndxFace ); + if( pFace ) + { + if( pFace->HasDisp() ) + { + CMapSolid *pSolid = ( CMapSolid* )pFace->GetParent(); + pSolid->PostUpdate( Notify_Rebuild ); + } + } + } + } + + // reset selection tool + SetTool( FACEEDITTOOL_SELECT ); + + // update + PostToolUpdate(); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonPaintGeo( void ) +{ + // set selection tool + SetTool( FACEEDITTOOL_PAINTGEO ); + + // get the displacement tool and set the paint tool active + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->SetTool( DISPTOOL_PAINT ); + UpdateDialogData(); + } + + if( !m_PaintDistDlg.Create( IDD_DISP_PAINT_DIST, this ) ) + return; + + m_PaintDistDlg.ShowWindow( SW_SHOW ); +} + + +//----------------------------------------------------------------------------- +// Purpose: handles the user clicking on the sculpt button +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnBnClickedDispSculptPaint( ) +{ + // set selection tool + SetTool( FACEEDITTOOL_PAINTSCULPT ); + + // get the displacement tool and set the paint tool active + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->SetTool( DISPTOOL_PAINT_SCULPT ); + UpdateDialogData(); + } + + if( !m_PaintSculptDlg.Create( IDD_DISP_PAINT_SCULPT, this ) ) + return; + + m_PaintSculptDlg.ShowWindow( SW_SHOW ); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonPaintData( void ) +{ + // set selection tool + SetTool( FACEEDITTOOL_PAINTDATA ); + + // get the displacement tool and set the paint tool active + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->SetTool( DISPTOOL_PAINT ); + UpdateDialogData(); + } + + if( !m_PaintDataDlg.Create( IDD_DISP_PAINT_DATA, this ) ) + return; + + m_PaintDataDlg.ShowWindow( SW_SHOW ); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonTagWalkable( void ) +{ + // Set walkalbe faces viewable -- if they are not already. + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if ( !pDoc ) + return; + + CToolDisplace *pDispTool = GetDisplacementTool(); + if( !pDispTool ) + return; + + // Toggle the functionality. + if ( GetTool() == FACEEDITTOOL_TAG_WALK ) + { + // Set the select tool. + SetTool( FACEEDITTOOL_SELECT ); + pDispTool->SetTool( DISPTOOL_SELECT_DISP_FACE ); + + if ( m_bForceShowWalkable ) + { + pDoc->SetDispDrawWalkable( false ); + m_bForceShowWalkable = false; + } + } + else + { + // Set the tag walkable tool. + SetTool( FACEEDITTOOL_TAG_WALK ); + pDispTool->SetTool( DISPTOOL_TAG_WALKABLE ); + + if ( !pDoc->IsDispDrawWalkable() ) + { + pDoc->SetDispDrawWalkable( true ); + m_bForceShowWalkable = true; + } + } + + UpdateDialogData(); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonTagBuildable( void ) +{ + // Set buildalbe faces viewable -- if they are not already. + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if ( !pDoc ) + return; + + CToolDisplace *pDispTool = GetDisplacementTool(); + if( !pDispTool ) + return; + + // Toggle the functionality. + if ( GetTool() == FACEEDITTOOL_TAG_BUILD ) + { + // Set the select tool. + SetTool( FACEEDITTOOL_SELECT ); + pDispTool->SetTool( DISPTOOL_SELECT_DISP_FACE ); + + if ( m_bForceShowBuildable ) + { + pDoc->SetDispDrawBuildable( false ); + m_bForceShowBuildable = false; + } + } + else + { + // Set the tag buildable tool. + SetTool( FACEEDITTOOL_TAG_BUILD ); + pDispTool->SetTool( DISPTOOL_TAG_BUILDABLE ); + + if ( !pDoc->IsDispDrawBuildable() ) + { + pDoc->SetDispDrawBuildable( true ); + m_bForceShowBuildable = true; + } + } + + UpdateDialogData(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonTagRemove( void ) +{ + // Set removed faces viewable -- if they are not already. + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + if ( !pDoc ) + return; + + CToolDisplace *pDispTool = GetDisplacementTool(); + if( !pDispTool ) + return; + + // Toggle the functionality. + if ( GetTool() == FACEEDITTOOL_TAG_REMOVE ) + { + // Set the select tool. + SetTool( FACEEDITTOOL_SELECT ); + pDispTool->SetTool( DISPTOOL_SELECT_DISP_FACE ); + pDoc->SetDispDrawRemove( false ); + } + else + { + // Set the tag remove tool. + SetTool( FACEEDITTOOL_TAG_REMOVE ); + pDispTool->SetTool( DISPTOOL_TAG_REMOVE ); + if ( !pDoc->IsDispDrawRemove() ) + { + pDoc->SetDispDrawRemove( true ); + } + } + + UpdateDialogData(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonInvertAlpha( void ) +{ + // Invert the alpha channel on all the selected displacements. + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + int nFaceCount = pSheet->GetFaceListCount(); + for( int iFace = 0; iFace < nFaceCount; ++iFace ) + { + CMapFace *pFace = pSheet->GetFaceListDataFace( iFace ); + if( pFace ) + { + if( pFace->HasDisp() ) + { + EditDispHandle_t handle = pFace->GetDisp(); + CMapDisp *pDisp = EditDispMgr()->GetDisp( handle ); + pDisp->InvertAlpha(); + } + } + } + } + + // Update + PostToolUpdate(); +} + +//----------------------------------------------------------------------------- +// Purpose: Select any displacement faces adjacent to the already-selected ones. +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnSelectAdjacent() +{ + IWorldEditDispMgr *pDispMgr = GetActiveWorldEditDispManager(); + + bool bSelectedAny = false; + + // For all selected displacements... + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( !pSheet ) + return; + + // check for faces + int faceCount = pSheet->GetFaceListCount(); + if( faceCount == 0 ) + return; + + for( int ndxFace = 0; ndxFace < faceCount; ndxFace++ ) + { + // get current displacement + CMapFace *pFace = pSheet->GetFaceListDataFace( ndxFace ); + if( !pFace || !pFace->HasDisp() ) + continue; + + EditDispHandle_t handle = pFace->GetDisp(); + CMapDisp *pDisp = EditDispMgr()->GetDisp( handle ); + + // Now test all other disps in the world. We could do the code commented below, but then + // we won't be selecting adjacent neighbors of a different power. + // + //for ( int iEdge=0; iEdge < 4; iEdge++ ) + //{ + // EditDispHandle_t hNeighbor = pDisp->GetEdgeNeighbor( iEdge ); + + int totalDispCount = pDispMgr->WorldCount(); + for ( int iTestDisp=0; iTestDisp < totalDispCount; iTestDisp++ ) + { + int edge1[4], edge2[4]; + CMapDisp *pNeighbor = pDispMgr->GetFromWorld( iTestDisp ); + if ( !pNeighbor || pNeighbor == pDisp || pDispMgr->NumSharedPoints( pDisp, pNeighbor, edge1, edge2 ) != 2 ) + continue; + + // Get its map face and solid. + pFace = dynamic_cast< CMapFace* >( pNeighbor->GetParent() ); + if ( !pFace || pFace->GetSelectionState() != SELECT_NONE ) + continue; + + CMapSolid *pSolid = dynamic_cast< CMapSolid* >( pFace->GetParent() ); + if ( !pSolid || !pSolid->IsVisible() ) + continue; + + // The function we use to select a face wants the face's index into its CMapSolid, so we need that. + int iFaceIndex = pSolid->GetFaceIndex( pFace ); + if ( iFaceIndex == -1 ) + continue; + + // Finally, select the face. + pSheet->ClickFace( pSolid, iFaceIndex, CFaceEditSheet::cfSelect, CFaceEditSheet::ModeSelect ); + bSelectedAny = true; + } + } + + if ( bSelectedAny ) + { + CMapDoc::GetActiveMapDoc()->UpdateAllViews( MAPVIEW_UPDATE_TOOL ); + } +} + +//----------------------------------------------------------------------------- +// Resample +//----------------------------------------------------------------------------- +void CFaceEditDispPage::UpdatePower( CMapDisp *pDisp ) +{ + // input check + if( !pDisp ) + return; + + // + // get the power from the power edit box + // + CString strPower; + GetDlgItemText( ID_DISP_POWER, strPower ); + int power = atoi( strPower ); + + if( power < 2 ) { power = 2; } + if( power > 4 ) { power = 4; } + + // check for a change and resample if need be + if( power != pDisp->GetPower() ) + { + pDisp->Resample( power ); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::UpdateElevation( CMapDisp *pDisp ) +{ + // input check + if( !pDisp ) + return; + + // + // get current elevation value + // + CString strElevation; + GetDlgItemText( ID_DISP_ELEVATION, strElevation ); + int elevation = atof( strElevation ); + + // check for change and set new elevation if need be + if( elevation != pDisp->GetElevation() ) + { + pDisp->Elevate( elevation ); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : pNMHDR - +// pResult - +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnSpinUpDown( NMHDR *pNMHDR, LRESULT *pResult ) +{ + // + // get scroll up down edit box + // + NM_UPDOWN *pNMUpDown = ( NM_UPDOWN* )pNMHDR; + switch( pNMUpDown->hdr.idFrom ) + { + case ID_SPIN_DISP_POWER: + { + CEdit *pEdit = ( CEdit* )GetDlgItem( ID_DISP_POWER ); + CString strPower; + pEdit->GetWindowText( strPower ); + int power = atoi( strPower ); + power += ( -pNMUpDown->iDelta ); + if( power < 2 ) { power = 2; } + if( power > 4 ) { power = 4; } + strPower.Format( "%d", power ); + pEdit->SetWindowText( strPower ); + *pResult = 0; + break; + } + + case ID_SPIN_DISP_ELEVATION: + { + CEdit *pEdit = ( CEdit* )GetDlgItem( ID_DISP_ELEVATION ); + CString strElevation; + pEdit->GetWindowText( strElevation ); + float elevation = atof( strElevation ); + elevation += 0.5f * ( -pNMUpDown->iDelta ); + strElevation.Format( "%4.2f", elevation ); + pEdit->SetWindowText( strElevation ); + *pResult = 0; + break; + } + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::UpdateScale( CMapDisp *pDisp ) +{ + if( !pDisp ) + return; + + // + // get the current scale value + // + CString strScale; + GetDlgItemText( ID_DISP_SCALE, strScale ); + float scale = atof( strScale ); + + // check for change and set new scale if need be + if( scale != pDisp->GetScale() ) + { + pDisp->Scale( scale ); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::OnButtonApply( void ) +{ + // + // "create" all selected faces + // + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + int faceCount = pSheet->GetFaceListCount(); + for( int ndxFace = 0; ndxFace < faceCount; ndxFace++ ) + { + // get current face + CMapFace *pFace = pSheet->GetFaceListDataFace( ndxFace ); + if( pFace ) + { + if( pFace->HasDisp() ) + { + EditDispHandle_t handle = pFace->GetDisp(); + CMapDisp *pDisp = EditDispMgr()->GetDisp( handle ); + + // update attribs + UpdatePower( pDisp ); + UpdateElevation( pDisp ); + UpdateScale( pDisp ); + } + } + } + } + + // update + PostToolUpdate(); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::CloseAllDialogs( void ) +{ + if( m_uiTool == FACEEDITTOOL_PAINTGEO ) + { + m_PaintDistDlg.DestroyWindow(); + } + + if( m_uiTool == FACEEDITTOOL_PAINTSCULPT ) + { + m_PaintSculptDlg.DestroyWindow(); + } + + if( m_uiTool == FACEEDITTOOL_PAINTDATA ) + { + m_PaintDataDlg.DestroyWindow(); + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CFaceEditDispPage::ResetForceShows( void ) +{ + // Get the active map doc. + CMapDoc *pDoc = CMapDoc::GetActiveMapDoc(); + + // Walkable + if ( m_bForceShowWalkable ) + { + if ( pDoc ) + { + pDoc->SetDispDrawWalkable( false ); + } + m_bForceShowWalkable = false; + } + + // Buildable + if ( m_bForceShowBuildable ) + { + if ( pDoc ) + { + pDoc->SetDispDrawBuildable( false ); + } + m_bForceShowBuildable = false; + } + + // Always force this off! + if ( pDoc ) + { + pDoc->SetDispDrawRemove( false ); + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +BOOL CFaceEditDispPage::OnSetActive( void ) +{ + ToolManager()->SetTool( TOOL_FACEEDIT_DISP ); + + // set the selection as the tool to use!!! + OnButtonSelect(); + + return CPropertyPage::OnSetActive(); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +BOOL CFaceEditDispPage::OnKillActive( void ) +{ + CloseAllDialogs(); + ResetForceShows(); + return TRUE; +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +BOOL CFaceEditDispPage::PreTranslateMessage( MSG *pMsg ) +{ + HACCEL hAccel = GetMainWnd()->GetAccelTable(); + if( !(hAccel && ::TranslateAccelerator( GetMainWnd()->m_hWnd, hAccel, pMsg ) ) ) + { + return CPropertyPage::PreTranslateMessage( pMsg ); + } + else + { + return TRUE; + } +} + |