diff options
Diffstat (limited to 'hammer/dispdlg.cpp')
| -rw-r--r-- | hammer/dispdlg.cpp | 1880 |
1 files changed, 1880 insertions, 0 deletions
diff --git a/hammer/dispdlg.cpp b/hammer/dispdlg.cpp new file mode 100644 index 0000000..28d989f --- /dev/null +++ b/hammer/dispdlg.cpp @@ -0,0 +1,1880 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include <stdafx.h> +#include "hammer.h" +#include "MainFrm.h" +#include "FaceEditSheet.h" +#include "GlobalFunctions.h" +#include "DispDlg.h" +#include "MapFace.h" +#include "MapDisp.h" +#include "ToolDisplace.h" +#include "ToolManager.h" +#include "SculptOptions.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + + +#define DISPPAINT_DISTANCE_MIN 0 +#define DISPPAINT_DISTANCE_MAX 60 +#define DISPPAINT_SPATIALRADIUS_MIN 1 +#define DISPPAINT_SPATIALRADIUS_MAX 1024 +#define DISPPAINT_SPATIALRADIUS_STEP 16 + +//============================================================================= +// +// Displacement Create Dialog Functions +// +BEGIN_MESSAGE_MAP(CDispCreateDlg, CDialog) + //{{AFX_MSG_MAP(CDispCreateDlg) + ON_WM_VSCROLL() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +extern CToolDisplace* GetDisplacementTool(); + +//----------------------------------------------------------------------------- +// Purpose: constructor +//----------------------------------------------------------------------------- +CDispCreateDlg::CDispCreateDlg( CWnd *pParent ) : + CDialog( CDispCreateDlg::IDD, pParent ) +{ + m_Power = 0; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +BOOL CDispCreateDlg::OnInitDialog(void) +{ + CDialog::OnInitDialog(); + + // set the initial power "3" + SetDlgItemInt( ID_DISP_CREATE_POWER, 3 ); + + // setup the spinner - set range (range [2..4]) + m_spinPower.SetBuddy( &m_editPower ); + m_spinPower.SetRange( 2, 4 ); + m_spinPower.SetPos( 3 ); + + return TRUE; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDispCreateDlg::DoDataExchange( CDataExchange *pDX ) +{ + CDialog::DoDataExchange( pDX ); + //{{AFX_DATA_MAP(CDispCreateDlg) + DDX_Control( pDX, ID_DISP_CREATE_POWER_SPIN, m_spinPower ); + DDX_Control( pDX, ID_DISP_CREATE_POWER, m_editPower ); + DDX_Text( pDX, ID_DISP_CREATE_POWER, m_Power ); + //}}AFX_DATA_MAP + + // clamp the power + if( m_Power < 2 ) { m_Power = 2; } + if( m_Power > 4 ) { m_Power = 4; } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispCreateDlg::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar *pScrollBar ) +{ + m_spinPower.SetPos( nPos ); + SetDlgItemInt( ID_DISP_CREATE_POWER, nPos ); +} + + +//============================================================================= +// +// Displacement Noise Dialog Functions +// +BEGIN_MESSAGE_MAP(CDispNoiseDlg, CDialog) + //{{AFX_MSG_MAP(CDispNoiseDlg) + ON_NOTIFY( UDN_DELTAPOS, ID_DISP_NOISE_MIN_SPIN, OnSpinUpDown ) + ON_NOTIFY( UDN_DELTAPOS, ID_DISP_NOISE_MAX_SPIN, OnSpinUpDown ) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +//----------------------------------------------------------------------------- +// Purpose: constructor +//----------------------------------------------------------------------------- +CDispNoiseDlg::CDispNoiseDlg( CWnd *pParent ) : + CDialog( CDispNoiseDlg::IDD, pParent ) +{ + m_Min = m_Max = 0.0f; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +BOOL CDispNoiseDlg::OnInitDialog(void) +{ + CDialog::OnInitDialog(); + + // + // set min, max initially to zero!! + // + CString strZero = "0.0"; + SetDlgItemText( ID_DISP_NOISE_MIN, strZero ); + SetDlgItemText( ID_DISP_NOISE_MAX, strZero ); + + // + // setup spinners + // + m_spinMin.SetBuddy( &m_editMin ); + m_spinMax.SetBuddy( &m_editMax ); + + return TRUE; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDispNoiseDlg::DoDataExchange( CDataExchange *pDX ) +{ + CDialog::DoDataExchange( pDX ); + //{{AFX_DATA_MAP(CDispNoiseDlg) + DDX_Control( pDX, ID_DISP_NOISE_MIN_SPIN, m_spinMin ); + DDX_Control( pDX, ID_DISP_NOISE_MAX_SPIN, m_spinMax ); + DDX_Control( pDX, ID_DISP_NOISE_MIN, m_editMin ); + DDX_Control( pDX, ID_DISP_NOISE_MAX, m_editMax ); + DDX_Text( pDX, ID_DISP_NOISE_MIN, m_Min ); + DDX_Text( pDX, ID_DISP_NOISE_MAX, m_Max ); + //}}AFX_DATA_MAP +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDispNoiseDlg::OnSpinUpDown( NMHDR *pNMHDR, LRESULT *pResult ) +{ + // + // get scroll up down edit box + // + NM_UPDOWN *pNMUpDown = ( NM_UPDOWN* )pNMHDR; + switch( pNMUpDown->hdr.idFrom ) + { + case ID_DISP_NOISE_MIN_SPIN: + { + CEdit *pEdit = ( CEdit* )GetDlgItem( ID_DISP_NOISE_MIN ); + CString strMin; + pEdit->GetWindowText( strMin ); + m_Min = atof( strMin ); + m_Min += 0.5f * ( -pNMUpDown->iDelta ); + strMin.Format( "%4.2f", m_Min ); + pEdit->SetWindowText( strMin ); + *pResult = 0; + break; + } + + case ID_DISP_NOISE_MAX_SPIN: + { + CEdit *pEdit = ( CEdit* )GetDlgItem( ID_DISP_NOISE_MAX ); + CString strMax; + pEdit->GetWindowText( strMax ); + m_Max = atof( strMax ); + m_Max += 0.5f * ( -pNMUpDown->iDelta ); + strMax.Format( "%4.2f", m_Max ); + pEdit->SetWindowText( strMax ); + *pResult = 0; + break; + } + } +} + + +//============================================================================= +// +// Displacement Paint Distance Dialog Functions +// +BEGIN_MESSAGE_MAP(CDispPaintDistDlg, CDialog) + //{{AFX_MSG_MAP(CDispPaintDistDlg) + ON_BN_CLICKED( ID_DISP_PAINT_DIST_RAISELOWER, OnEffectRaiseLowerGeo ) + ON_BN_CLICKED( ID_DISP_PAINT_DIST_RAISETO, OnEffectRaiseToGeo ) + ON_BN_CLICKED( ID_DISP_PAINT_DIST_SMOOTH, OnEffectSmoothGeo ) + + ON_BN_CLICKED( ID_DISPPAINT_SOFTEDGE, OnBrushTypeSoftEdge ) + ON_BN_CLICKED( ID_DISPPAINT_HARDEDGE, OnBrushTypeHardEdge ) + + ON_BN_CLICKED( ID_DISP_PAINT_DIST_SPATIAL, OnCheckSpatial ) + ON_BN_CLICKED( ID_DISP_PAINT_DIST_AUTOSEW, OnCheckAutoSew ) + + ON_CBN_SELCHANGE( ID_DISP_PAINT_DIST_BRUSH, OnComboBoxBrushGeo ) + ON_CBN_SELCHANGE( ID_DISP_PAINT_DIST_AXIS, OnComboBoxAxis ) + + ON_WM_HSCROLL() + ON_EN_CHANGE( ID_DISP_PAINT_DIST_EDIT_DISTANCE, OnEditDistance ) + ON_EN_CHANGE( ID_DISP_PAINT_DIST_EDIT_RADIUS, OnEditRadius ) + + ON_WM_CLOSE() + ON_WM_DESTROY() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +//----------------------------------------------------------------------------- +// Purpose: constructor +//----------------------------------------------------------------------------- +CDispPaintDistDlg::CDispPaintDistDlg( CWnd *pParent ) : + CDialog( CDispPaintDistDlg::IDD, pParent ) +{ +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CDispPaintDistDlg::~CDispPaintDistDlg() +{ + if ( m_comboboxBrush.m_hWnd ) + { + m_comboboxBrush.Detach(); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +BOOL CDispPaintDistDlg::OnInitDialog( void ) +{ + static bool bInit = false; + + CDialog::OnInitDialog(); + + CToolDisplace *pTool = GetDisplacementTool(); + if ( !pTool ) + return FALSE; + + // Set spatial tool flag. + if ( !pTool->IsSpatialPainting() ) + { + pTool->ToggleSpatialPainting(); + } + + if ( !bInit ) + { + m_flPrevDistance = 1.0f; + m_flPrevRadius = 1.0f; + m_nPrevBrush = 0; + m_nPrevEffect = pTool->GetEffect(); + pTool->GetPaintAxis( m_nPrevPaintAxis, m_vecPrevPaintAxis ); + bInit = true; + } + else + { + SetWindowPos( &wndTop, m_DialogPosRect.left, m_DialogPosRect.top, + m_DialogPosRect.Width(), m_DialogPosRect.Height(), SWP_NOZORDER ); + } + + // Initialize the combo boxes. + InitComboBoxBrushGeo(); + InitComboBoxAxis(); + // Initialize the sliders. + InitDistance(); + InitRadius(); + + // Initialize the brush types. + InitBrushType(); + + return TRUE; +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::InitDistance( void ) +{ + // Set the slider range and initialize the "buddy." + m_sliderDistance.SetBuddy( &m_editDistance, FALSE ); + m_sliderDistance.SetRange( DISPPAINT_DISTANCE_MIN, DISPPAINT_DISTANCE_MAX ); + + // Get the displacement tool. + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + pTool->GetChannel( DISPPAINT_CHANNEL_POSITION, m_flPrevDistance ); + + // Initialize the distance slider and edit box. + UpdateSliderDistance( m_flPrevDistance, true ); + UpdateEditBoxDistance( m_flPrevDistance, true ); + } + else + { + // Init distance slider and edit box. + UpdateSliderDistance( 1.0f, true ); + UpdateEditBoxDistance( 1.0f, true ); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::InitRadius( void ) +{ + // Set the slider range and initialize the "buddy." + m_sliderRadius.SetBuddy( &m_editRadius, FALSE ); + m_sliderRadius.SetRange( DISPPAINT_SPATIALRADIUS_MIN, DISPPAINT_SPATIALRADIUS_MAX ); + m_sliderRadius.SetTicFreq( DISPPAINT_SPATIALRADIUS_STEP ); + // Get the displacement tool. + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + CButton *pcheckSpatial = ( CButton* )GetDlgItem( ID_DISP_PAINT_DIST_SPATIAL ); + if ( pTool->IsSpatialPainting() ) + { + pcheckSpatial->SetCheck( true ); + EnableSliderRadius(); + DisablePaintingComboBoxes(); + } + else + { + pcheckSpatial->SetCheck( false ); + DisableSliderRadius(); + EnablePaintingComboBoxes(); + } + } +} +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::EnableSliderRadius( void ) +{ + // Enable the radius slider and edit box. + m_sliderRadius.EnableWindow( TRUE ); + m_editRadius.EnableWindow( TRUE ); + + // Get the displacement tool and restore the radius. + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + m_flPrevRadius = pTool->GetSpatialRadius(); + + // Update the radius slider and edit box. + UpdateSliderRadius( m_flPrevRadius, true ); + UpdateEditBoxRadius( m_flPrevRadius, true ); + } + else + { + // Set the radius slider and edit box with default values. + UpdateSliderRadius( 1.0f, true ); + UpdateEditBoxRadius( 1.0f, true ); + } +} +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::DisableSliderRadius( void ) +{ + // Disable the radius slider and edit box. + m_sliderRadius.EnableWindow( FALSE ); + m_editRadius.EnableWindow( FALSE ); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::UpdateSpatialData( void ) +{ + // Get the displacement tool and restore the radius. + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + m_flPrevRadius = pTool->GetSpatialRadius(); + + // Update the radius slider and edit box. + UpdateSliderRadius( m_flPrevRadius, true ); + UpdateEditBoxRadius( m_flPrevRadius, true ); + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +bool CDispPaintDistDlg::InitComboBoxBrushGeo( void ) +{ + // + // get the displacement paint brush icon combo box + // + m_comboboxBrush.Attach( GetDlgItem( ID_DISP_PAINT_DIST_BRUSH )->m_hWnd ); + m_comboboxBrush.Init(); + + // reset the size of the combo box list item + m_comboboxBrush.SetItemHeight( -1, m_comboboxBrush.m_IconSize.cy + 2 ); + + // initialize the radio button/brush combo box geometry data + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + pTool->SetEffect( m_nPrevEffect ); + + switch ( m_nPrevEffect ) + { + case DISPPAINT_EFFECT_RAISELOWER: + { + pTool->SetEffect( DISPPAINT_EFFECT_RAISELOWER ); + SetEffectButtonGeo( DISPPAINT_EFFECT_RAISELOWER ); + FilterComboBoxBrushGeo( DISPPAINT_EFFECT_RAISELOWER, true ); + break; + } + case DISPPAINT_EFFECT_RAISETO: + { + pTool->SetEffect( DISPPAINT_EFFECT_RAISETO ); + SetEffectButtonGeo( DISPPAINT_EFFECT_RAISETO ); + FilterComboBoxBrushGeo( DISPPAINT_EFFECT_RAISETO, true ); + break; + } + case DISPPAINT_EFFECT_SMOOTH: + { + pTool->SetEffect( DISPPAINT_EFFECT_SMOOTH ); + SetEffectButtonGeo( DISPPAINT_EFFECT_SMOOTH ); + FilterComboBoxBrushGeo( DISPPAINT_EFFECT_SMOOTH, true ); + break; + } + default: + { + return false; + } + } + + OnComboBoxBrushGeo(); + } + else + { + OnEffectRaiseLowerGeo(); + OnComboBoxBrushGeo(); + } + + return true; +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::InitBrushType( void ) +{ + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + unsigned int uiBrushType = pTool->GetBrushType(); + switch ( uiBrushType ) + { + case DISPPAINT_BRUSHTYPE_SOFT: + { + SetBrushTypeButtonGeo( DISPPAINT_BRUSHTYPE_SOFT ); + break; + } + case DISPPAINT_BRUSHTYPE_HARD: + { + SetBrushTypeButtonGeo( DISPPAINT_BRUSHTYPE_HARD ); + break; + } + } + + if ( pTool->IsSpatialPainting() ) + { + EnableBrushTypeButtons(); + } + else + { + DisableBrushTypeButtons(); + } + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::FilterComboBoxBrushGeo( unsigned int nEffect, bool bInit ) +{ + // + // remove all the old combo box data + // + int count = m_comboboxBrush.GetCount(); + for ( int ndx = count - 1; ndx >= 0; ndx-- ) + { + m_comboboxBrush.DeleteIcon( ndx ); + } + + // + // add the new combo box data based on the current paint "effect" + // + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + CDispMapImageFilterManager *pFilterMgr; + switch ( nEffect ) + { + case DISPPAINT_EFFECT_RAISELOWER: { pFilterMgr = pTool->GetFilterRaiseLowerMgr(); break; } + case DISPPAINT_EFFECT_RAISETO: { pFilterMgr = pTool->GetFilterRaiseToMgr(); break; } + case DISPPAINT_EFFECT_SMOOTH: { pFilterMgr = pTool->GetFilterSmoothMgr(); break; } + default: return; + } + + if( pFilterMgr ) + { + // + // for each filter - add its icon to the icon combo box + // + for ( int iFilter = 0; iFilter < pFilterMgr->GetFilterCount(); iFilter++ ) + { + // get the current filter + CDispMapImageFilter *pFilter = pFilterMgr->GetFilter( iFilter ); + + // get the application directory + char appDir[MAX_PATH]; + APP()->GetDirectory( DIR_PROGRAM, appDir ); + + // append the filters directory name + strcat( appDir, "filters\\" ); + + // append the directory prefix to the icon name + CString iconFilename = appDir + pFilter->m_Name; + + // add the icon to the icon combo box + m_comboboxBrush.AddIcon( iconFilename ); + } + + // set initial paint brush + if( bInit ) + { + m_comboboxBrush.SetCurSel( m_nPrevBrush ); + } + else + { + m_comboboxBrush.SetCurSel( 0 ); + } + } + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +bool CDispPaintDistDlg::InitComboBoxAxis( void ) +{ + // + // add the paint types to the combo box -- keep them in their "defined" order + // + CString strPaintDir; + + // axial x direction + strPaintDir = "X-Axis"; + m_comboboxAxis.AddString( strPaintDir ); + + // axial y direction + strPaintDir = "Y-Axis"; + m_comboboxAxis.AddString( strPaintDir ); + + // axial z direction + strPaintDir = "Z-Axis"; + m_comboboxAxis.AddString( strPaintDir ); + + // subdivision direction + strPaintDir = "Subdiv Normal"; + m_comboboxAxis.AddString( strPaintDir ); + + // face normal direction + strPaintDir = "Face Normal"; + m_comboboxAxis.AddString( strPaintDir ); + + // set initial value + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + m_comboboxAxis.SetCurSel( m_nPrevPaintAxis ); + pTool->SetPaintAxis( m_nPrevPaintAxis, m_vecPrevPaintAxis ); + } + else + { + m_comboboxAxis.SetCurSel( 4 ); + OnComboBoxAxis(); + } + + return true; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::EnablePaintingComboBoxes( void ) +{ + m_comboboxBrush.EnableWindow( TRUE ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::DisablePaintingComboBoxes( void ) +{ + m_comboboxBrush.EnableWindow( FALSE ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::EnableBrushTypeButtons( void ) +{ + CButton *pRadioButton; + pRadioButton = ( CButton* )GetDlgItem( ID_DISPPAINT_SOFTEDGE ); + pRadioButton->EnableWindow( TRUE ); + pRadioButton = ( CButton* )GetDlgItem( ID_DISPPAINT_HARDEDGE ); + pRadioButton->EnableWindow( TRUE ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::DisableBrushTypeButtons( void ) +{ + CButton *pRadioButton; + pRadioButton = ( CButton* )GetDlgItem( ID_DISPPAINT_SOFTEDGE ); + pRadioButton->EnableWindow( FALSE ); + pRadioButton = ( CButton* )GetDlgItem( ID_DISPPAINT_HARDEDGE ); + pRadioButton->EnableWindow( FALSE ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::DoDataExchange( CDataExchange *pDX ) +{ + CDialog::DoDataExchange( pDX ); + //{{AFX_DATA_MAP(CDispPaintDistDlg) + DDX_Control( pDX, ID_DISP_PAINT_DIST_SLIDER_DISTANCE, m_sliderDistance ); + DDX_Control( pDX, ID_DISP_PAINT_DIST_SLIDER_RADIUS, m_sliderRadius ); + DDX_Control( pDX, ID_DISP_PAINT_DIST_EDIT_DISTANCE, m_editDistance ); + DDX_Control( pDX, ID_DISP_PAINT_DIST_EDIT_RADIUS, m_editRadius ); + DDX_Control( pDX, ID_DISP_PAINT_DIST_AXIS, m_comboboxAxis ); + //}}AFX_DATA_MAP +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnComboBoxBrushGeo( void ) +{ + // get the displacement's filter manager + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + // get current selection + int iSel = m_comboboxBrush.GetCurSel(); + if ( iSel == LB_ERR ) + return; + + unsigned int nEffect = pTool->GetEffect(); + CDispMapImageFilterManager *pFilterMgr; + switch ( nEffect ) + { + case DISPPAINT_EFFECT_RAISELOWER: { pFilterMgr = pTool->GetFilterRaiseLowerMgr(); break; } + case DISPPAINT_EFFECT_RAISETO: { pFilterMgr = pTool->GetFilterRaiseToMgr(); break; } + case DISPPAINT_EFFECT_SMOOTH: { pFilterMgr = pTool->GetFilterSmoothMgr(); break; } + default: return; + } + + if ( pFilterMgr ) + { + pFilterMgr->SetActiveFilter( iSel ); + } + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnComboBoxAxis( void ) +{ + // get the displacement tool + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + // + // get the current paint type selection + // + int ndxSel = m_comboboxAxis.GetCurSel(); + if ( ndxSel == LB_ERR ) + return; + + // update the paint type + UpdateAxis( ndxSel ); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::UpdateAxis( int nAxis ) +{ + // get the displacement tool + CToolDisplace *pTool = GetDisplacementTool(); + if ( !pTool ) + return; + + // + // update the paint type - direction + // + switch ( nAxis ) + { + case DISPPAINT_AXIS_X: { pTool->SetPaintAxis( nAxis, Vector( 1.0f, 0.0f, 0.0f ) ); return; } + case DISPPAINT_AXIS_Y: { pTool->SetPaintAxis( nAxis, Vector( 0.0f, 1.0f, 0.0f ) ); return; } + case DISPPAINT_AXIS_Z: { pTool->SetPaintAxis( nAxis, Vector( 0.0f, 0.0f, 1.0f ) ); return; } + case DISPPAINT_AXIS_SUBDIV: { pTool->SetPaintAxis( nAxis, Vector( 0.0f, 0.0f, 0.0f ) ); return; } + case DISPPAINT_AXIS_FACE: { pTool->SetPaintAxis( nAxis, Vector( 0.0f, 0.0f, 1.0f ) ); return; } + default: { return; } + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnCheckAutoSew( void ) +{ + // get the displacement tool + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + pTool->ToggleAutoSew(); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnCheckSpatial( void ) +{ + // Get the displacement tool and toggle the spatial painting bit. + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + pTool->ToggleSpatialPainting(); + if ( pTool->IsSpatialPainting() ) + { + EnableSliderRadius(); + DisablePaintingComboBoxes(); + EnableBrushTypeButtons(); + } + else + { + DisableSliderRadius(); + EnablePaintingComboBoxes(); + DisableBrushTypeButtons(); + } + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::SetEffectButtonGeo( unsigned int nEffect ) +{ + CButton *radiobutton; + radiobutton = ( CButton* )GetDlgItem( ID_DISP_PAINT_DIST_RAISELOWER ); + radiobutton->SetCheck( nEffect == DISPPAINT_EFFECT_RAISELOWER ); + radiobutton = ( CButton* )GetDlgItem( ID_DISP_PAINT_DIST_RAISETO ); + radiobutton->SetCheck( nEffect == DISPPAINT_EFFECT_RAISETO ); + radiobutton = ( CButton* )GetDlgItem( ID_DISP_PAINT_DIST_SMOOTH ); + radiobutton->SetCheck( nEffect == DISPPAINT_EFFECT_SMOOTH ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::SetBrushTypeButtonGeo( unsigned int uiBrushType ) +{ + CButton *pRadioButton; + pRadioButton = ( CButton* )GetDlgItem( ID_DISPPAINT_SOFTEDGE ); + pRadioButton->SetCheck( uiBrushType == DISPPAINT_BRUSHTYPE_SOFT ); + pRadioButton = ( CButton* )GetDlgItem( ID_DISPPAINT_HARDEDGE ); + pRadioButton->SetCheck( uiBrushType == DISPPAINT_BRUSHTYPE_HARD ); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnEffectRaiseLowerGeo( void ) +{ + // get the displacement tool + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + pTool->SetEffect( DISPPAINT_EFFECT_RAISELOWER ); + SetEffectButtonGeo( DISPPAINT_EFFECT_RAISELOWER ); + FilterComboBoxBrushGeo( DISPPAINT_EFFECT_RAISELOWER, false ); + OnComboBoxBrushGeo(); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnEffectRaiseToGeo( void ) +{ + // get the displacement tool + CToolDisplace *pTool = GetDisplacementTool(); + if( pTool ) + { + pTool->SetEffect( DISPPAINT_EFFECT_RAISETO ); + SetEffectButtonGeo( DISPPAINT_EFFECT_RAISETO ); + FilterComboBoxBrushGeo( DISPPAINT_EFFECT_RAISETO, false ); + OnComboBoxBrushGeo(); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnEffectSmoothGeo( void ) +{ + // get the displacement tool + CToolDisplace *pTool = GetDisplacementTool(); + if( pTool ) + { + pTool->SetEffect( DISPPAINT_EFFECT_SMOOTH ); + SetEffectButtonGeo( DISPPAINT_EFFECT_SMOOTH ); + FilterComboBoxBrushGeo( DISPPAINT_EFFECT_SMOOTH, false ); + OnComboBoxBrushGeo(); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnBrushTypeSoftEdge( void ) +{ + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + pTool->SetBrushType( DISPPAINT_BRUSHTYPE_SOFT ); + SetBrushTypeButtonGeo( DISPPAINT_BRUSHTYPE_SOFT ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnBrushTypeHardEdge( void ) +{ + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + pTool->SetBrushType( DISPPAINT_BRUSHTYPE_HARD ); + SetBrushTypeButtonGeo( DISPPAINT_BRUSHTYPE_HARD ); + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::UpdateSliderDistance( float flDistance, bool bForceInit ) +{ + if ( ( flDistance != m_flPrevDistance ) || bForceInit ) + { + int nDistance = ( int )flDistance; + + // clamp + if( nDistance < DISPPAINT_DISTANCE_MIN ) { nDistance = DISPPAINT_DISTANCE_MIN; } + if( nDistance > DISPPAINT_DISTANCE_MAX ) { nDistance = DISPPAINT_DISTANCE_MAX; } + + m_sliderDistance.SetPos( nDistance ); + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::UpdateEditBoxDistance( float flDistance, bool bForceInit ) +{ + if ( ( flDistance != m_flPrevDistance ) || bForceInit ) + { + CString strDistance; + strDistance.Format( "%4.2f", flDistance ); + m_editDistance.SetWindowText( strDistance ); + } +} +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::UpdateSliderRadius( float flRadius, bool bForceInit ) +{ + if ( ( flRadius != m_flPrevRadius ) || bForceInit ) + { + int nRadius = ( int )flRadius; + + // clamp + if( nRadius < DISPPAINT_SPATIALRADIUS_MIN ) { nRadius = DISPPAINT_SPATIALRADIUS_MIN; } + if( nRadius > DISPPAINT_SPATIALRADIUS_MAX ) { nRadius = DISPPAINT_SPATIALRADIUS_MAX; } + + m_sliderRadius.SetPos( nRadius ); + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::UpdateEditBoxRadius( float flRadius, bool bForceInit ) +{ + if ( ( flRadius != m_flPrevRadius ) || bForceInit ) + { + CString strRadius; + strRadius.Format( "%4.2f", flRadius ); + m_editRadius.SetWindowText( strRadius ); + } +} +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnHScroll( UINT nSBCode, UINT nPos, CScrollBar *pScrollBar ) +{ + // Get the displacement tool. + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + // Get the distance slider control. + CSliderCtrl *pDistSlider = ( CSliderCtrl* )GetDlgItem( ID_DISP_PAINT_DIST_SLIDER_DISTANCE ); + if ( pDistSlider ) + { + // Get the slider position. + int nDistPos = pDistSlider->GetPos(); + if ( nDistPos != m_flPrevDistance ) + { + // Update the displacement tool info. + pTool->SetChannel( DISPPAINT_CHANNEL_POSITION, ( float )nDistPos ); + + // Update the "buddy" edit box. + CString strDistance; + strDistance.Format( "%4.2f", ( float )nDistPos ); + m_editDistance.SetWindowText( strDistance ); + } + } + + // Get the radius slider control. + CSliderCtrl *pRadiusSlider = ( CSliderCtrl* )GetDlgItem( ID_DISP_PAINT_DIST_SLIDER_RADIUS ); + if ( pRadiusSlider ) + { + // Get the slider position. + int nRadiusPos = pRadiusSlider->GetPos(); + if ( nRadiusPos != m_flPrevRadius ) + { + // Update the displacement tool info. + pTool->SetSpatialRadius( ( float )nRadiusPos ); + + // Update the "buddy" edit box. + CString strRadius; + strRadius.Format( "%4.2f", ( float )nRadiusPos ); + m_editRadius.SetWindowText( strRadius ); + } + } + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnEditDistance( void ) +{ + // + // get the edit box distance data + // + CString strDistance; + m_editDistance.GetWindowText( strDistance ); + float flDistance = atof( strDistance ); + + // get the displacement tool + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + UpdateSliderDistance( flDistance, false ); + pTool->SetChannel( DISPPAINT_CHANNEL_POSITION, flDistance ); + // Save the change in the distance. + m_flPrevDistance = flDistance; + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnEditRadius( void ) +{ + // + // Get the edit box radius data. + // + CString strRadius; + m_editRadius.GetWindowText( strRadius ); + float flRadius = atof( strRadius ); + + // get the displacement tool + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + UpdateSliderRadius( flRadius, false ); + pTool->SetSpatialRadius( flRadius ); + + // Save the change in the spatial radius. + m_flPrevRadius = flRadius; + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnClose( void ) +{ + // get the displacement tool and set selection tool active + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->SetTool( DISPTOOL_SELECT ); + } + + // set "select" as the current tool - this should destroy this dialog!! + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if ( pSheet ) + { + pSheet->m_DispPage.SetTool( CFaceEditDispPage::FACEEDITTOOL_SELECT ); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDistDlg::OnDestroy( void ) +{ + // + // save the current dialog data - window position, effect, etc... + // + GetWindowRect( &m_DialogPosRect ); + + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + m_nPrevEffect = pTool->GetEffect(); + pTool->GetPaintAxis( m_nPrevPaintAxis, m_vecPrevPaintAxis ); + + // Reset spatial tool flag. + if ( pTool->IsSpatialPainting() ) + { + pTool->ToggleSpatialPainting(); + } + } + + m_nPrevBrush = m_comboboxBrush.GetCurSel(); + + // detach the brush combo box!! + m_comboboxBrush.Detach(); +} + + +//============================================================================= +// +// Paint Scult Dialog Functions +// +BEGIN_MESSAGE_MAP(CPaintSculptDlg, CDialog) + //{{AFX_MSG_MAP(CPaintSculptDlg) + ON_BN_CLICKED( ID_DISP_PAINT_DIST_AUTOSEW, OnCheckAutoSew ) + ON_WM_CLOSE() + ON_WM_DESTROY() + ON_BN_CLICKED(IDC_SCULPT_PUSH, &CPaintSculptDlg::OnBnClickedSculptPush) + ON_BN_CLICKED(IDC_SCULPT_CARVE, &CPaintSculptDlg::OnBnClickedSculptCarve) + ON_BN_CLICKED(IDC_SCULPT_PROJECT, &CPaintSculptDlg::OnBnClickedSculptProject) + ON_WM_LBUTTONUP() + ON_WM_LBUTTONDOWN() + ON_WM_MOUSEMOVE() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +//----------------------------------------------------------------------------- +// Purpose: constructor +//----------------------------------------------------------------------------- +CPaintSculptDlg::CPaintSculptDlg( CWnd *pParent ) : +CDialog( CPaintSculptDlg::IDD, pParent ) +{ + m_bAutoSew = true; + m_SculptMode = SCULPT_MODE_PUSH; + + m_PushOptions = new CSculptPushOptions(); + m_CarveOptions = new CSculptCarveOptions(); +// m_ProjectOptions = new CSculptProjectOptions(); +} + + +//----------------------------------------------------------------------------- +// Purpose: destructor +//----------------------------------------------------------------------------- +CPaintSculptDlg::~CPaintSculptDlg( ) +{ + delete m_PushOptions; + delete m_CarveOptions; +// delete m_ProjectOptions; +} + + +//----------------------------------------------------------------------------- +// Purpose: intialized the dialog +// Output : returns true if successful +//----------------------------------------------------------------------------- +BOOL CPaintSculptDlg::OnInitDialog( ) +{ + static bool bInit = false; + + CDialog::OnInitDialog(); + + CToolDisplace *pTool = GetDisplacementTool(); + if ( !pTool ) + { + return FALSE; + } + +#if 0 + // Set spatial tool flag. + if ( !pTool->IsSpatialPainting() ) + { + pTool->ToggleSpatialPainting(); + } +#endif + + if ( !bInit ) + { + bInit = true; + } + else + { + SetWindowPos( &wndTop, m_DialogPosRect.left, m_DialogPosRect.top, m_DialogPosRect.Width(), m_DialogPosRect.Height(), SWP_NOZORDER ); + } + + m_AutoSew.SetCheck( m_bAutoSew ); + + m_PushOptions->SetPaintOwner( this ); + m_CarveOptions->SetPaintOwner( this ); +// m_ProjectOptions->SetPaintOwner( this ); + + if( !m_PushOptions->Create( IDD_DISP_SCULPT_PUSH_OPTIONS, this ) ) + { + return FALSE; + } + + if( !m_CarveOptions->Create( IDD_DISP_SCULPT_CARVE_OPTIONS, this ) ) + { + return FALSE; + } + +#if 0 + if( !m_ProjectOptions->Create( IDD_DISP_SCULPT_PROJECT_OPTIONS, this ) ) + { + return FALSE; + } +#endif + + RECT OptionsLoc, ThisLoc; + + m_SculptOptionsLoc.GetWindowRect( &OptionsLoc ); + GetWindowRect( &ThisLoc ); + + m_PushOptions->SetWindowPos( NULL, 10, OptionsLoc.top - ThisLoc.top - 20, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW ); + m_CarveOptions->SetWindowPos( NULL, 10, OptionsLoc.top - ThisLoc.top - 20, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW ); +// m_ProjectOptions->SetWindowPos( NULL, 10, OptionsLoc.top - ThisLoc.top - 20, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW ); + + m_PushOptions->ShowWindow( SW_HIDE ); + m_CarveOptions->ShowWindow( SW_HIDE ); +// m_ProjectOptions->ShowWindow( SW_HIDE ); + + m_ProjectButton.EnableWindow( FALSE ); + + SetActiveMode( m_SculptMode ); + + return TRUE; +} + + +//----------------------------------------------------------------------------- +// Purpose: set up the data exchange between the dialog and variables +// Input : pDX - data exchange object +//----------------------------------------------------------------------------- +void CPaintSculptDlg::DoDataExchange( CDataExchange *pDX ) +{ + CDialog::DoDataExchange( pDX ); + //{{AFX_DATA_MAP(CPaintSculptDlg) + //}}AFX_DATA_MAP + DDX_Control(pDX, IDC_SCULPT_OPTIONS_LOC, m_SculptOptionsLoc); + DDX_Control(pDX, ID_DISP_PAINT_DIST_AUTOSEW, m_AutoSew); + DDX_Control(pDX, IDC_SCULPT_PUSH, m_PushButton); + DDX_Control(pDX, IDC_SCULPT_CARVE, m_CarveButton); + DDX_Control(pDX, IDC_SCULPT_PROJECT, m_ProjectButton); +} + + +//----------------------------------------------------------------------------- +// Purpose: Sets the autosew option +//----------------------------------------------------------------------------- +void CPaintSculptDlg::OnCheckAutoSew( ) +{ + m_bAutoSew = ( m_AutoSew.GetCheck() != 0 ); +} + + +//----------------------------------------------------------------------------- +// Purpose: handles shutting down the dialog +//----------------------------------------------------------------------------- +void CPaintSculptDlg::OnClose( ) +{ + // get the displacement tool and set selection tool active + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->SetTool( DISPTOOL_SELECT ); + } + + // set "select" as the current tool - this should destroy this dialog!! + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if ( pSheet ) + { + pSheet->m_DispPage.SetTool( CFaceEditDispPage::FACEEDITTOOL_SELECT ); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: Handles the left button up +// Input : nFlags - button flags +// point - the location of the click +//----------------------------------------------------------------------------- +void CPaintSculptDlg::OnLButtonUp( UINT nFlags, CPoint point ) +{ + CToolDisplace *pDispTool = GetDisplacementTool(); + CSculptPainter *painter = dynamic_cast< CSculptPainter * >( pDispTool->GetSculptPainter() ); + + if ( painter ) + { + painter->OnLButtonUpDialog( nFlags, point ); + } + + __super::OnLButtonUp(nFlags, point); +} + + +//----------------------------------------------------------------------------- +// Purpose: Handles the left button down +// Input : nFlags - button flags +// point - the location of the click +//----------------------------------------------------------------------------- +void CPaintSculptDlg::OnLButtonDown( UINT nFlags, CPoint point ) +{ + CToolDisplace *pDispTool = GetDisplacementTool(); + CSculptPainter *painter = dynamic_cast< CSculptPainter * >( pDispTool->GetSculptPainter() ); + + if ( painter ) + { + painter->OnLButtonDownDialog( nFlags, point ); + } + + __super::OnLButtonDown(nFlags, point); +} + + +//----------------------------------------------------------------------------- +// Purpose: Handles mouse move +// Input : nFlags - button flags +// point - the location of the click +//----------------------------------------------------------------------------- +void CPaintSculptDlg::OnMouseMove( UINT nFlags, CPoint point ) +{ + CToolDisplace *pDispTool = GetDisplacementTool(); + CSculptPainter *painter = dynamic_cast< CSculptPainter * >( pDispTool->GetSculptPainter() ); + + if ( painter ) + { + painter->OnMouseMoveDialog( nFlags, point ); + } + + __super::OnMouseMove(nFlags, point); +} + +//----------------------------------------------------------------------------- +// Purpose: handles the destruction of the window +//----------------------------------------------------------------------------- +void CPaintSculptDlg::OnDestroy( ) +{ + // + // save the current dialog data - window position, effect, etc... + // + GetWindowRect( &m_DialogPosRect ); + +#if 0 + CToolDisplace *pTool = GetDisplacementTool(); + if ( pTool ) + { + // Reset spatial tool flag. + if ( pTool->IsSpatialPainting() ) + { + pTool->ToggleSpatialPainting(); + } + } +#endif +} + +//----------------------------------------------------------------------------- +// Purpose: sets the active mode to push +//----------------------------------------------------------------------------- +void CPaintSculptDlg::OnBnClickedSculptPush( ) +{ + SetActiveMode( SCULPT_MODE_PUSH ); +} + + +//----------------------------------------------------------------------------- +// Purpose: sets the active mode to carve +//----------------------------------------------------------------------------- +void CPaintSculptDlg::OnBnClickedSculptCarve( ) +{ + SetActiveMode( SCULPT_MODE_CARVE ); +} + + +//----------------------------------------------------------------------------- +// Purpose: sets the active mode to sculpt +//----------------------------------------------------------------------------- +void CPaintSculptDlg::OnBnClickedSculptProject( ) +{ +// SetActiveMode( SCULPT_MODE_PROJECT ); +} + +#if 0 +//----------------------------------------------------------------------------- +// Purpose: +// Input : +// Output : +//----------------------------------------------------------------------------- +BOOL CPaintSculptDlg::PreTranslateMessage( MSG* pMsg ) +{ + return __super::PreTranslateMessage( pMsg ); +} +#endif + +//----------------------------------------------------------------------------- +// Purpose: sets the active mode +// Input : NewMode - the mode we are going to +//----------------------------------------------------------------------------- +void CPaintSculptDlg::SetActiveMode( SculptMode NewMode ) +{ + m_SculptMode = NewMode; + + m_PushButton.SetCheck( m_SculptMode == SCULPT_MODE_PUSH ); + m_CarveButton.SetCheck( m_SculptMode == SCULPT_MODE_CARVE ); + m_ProjectButton.SetCheck( m_SculptMode == SCULPT_MODE_PROJECT ); + + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + CDialog *painter = dynamic_cast< CDialog * >( pDispTool->GetSculptPainter() ); + + if ( painter ) + { + painter->ShowWindow( SW_HIDE ); + } + + switch( m_SculptMode ) + { + case SCULPT_MODE_PUSH: + m_PushOptions->ShowWindow( SW_SHOW ); + pDispTool->SetSculptPainter( m_PushOptions ); + break; + + case SCULPT_MODE_CARVE: + m_CarveOptions->ShowWindow( SW_SHOW ); + pDispTool->SetSculptPainter( m_CarveOptions ); + break; + +#if 0 + case SCULPT_MODE_PROJECT: + m_ProjectOptions->ShowWindow( SW_SHOW ); + pDispTool->SetSculptPainter( m_ProjectOptions ); + break; +#endif + } + } +} + + + + + + + + + + + + + + + + +//============================================================================= +// +// Set Paint Distance Dialog Functions +// +BEGIN_MESSAGE_MAP(CDispPaintDataDlg, CDialog) + //{{AFX_MSG_MAP(CDispPaintDataDlg) + ON_BN_CLICKED( ID_DISP_PAINT_DATA_RAISELOWER, OnEffectRaiseLowerData ) + ON_BN_CLICKED( ID_DISP_PAINT_DATA_RAISETO, OnEffectRaiseToData ) + ON_BN_CLICKED( ID_DISP_PAINT_DATA_SMOOTH, OnEffectSmoothData ) + + ON_CBN_SELCHANGE( ID_DISP_PAINT_DATA_BRUSH, OnComboBoxBrushData ) + ON_CBN_SELCHANGE( ID_DISP_PAINT_DATA_TYPE, OnComboBoxType ) + + ON_WM_HSCROLL() + ON_EN_CHANGE( ID_DISP_PAINT_DATA_EDIT_VALUE, OnEditValue ) + + ON_WM_CLOSE() + ON_WM_DESTROY() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +//----------------------------------------------------------------------------- +// Purpose: constructor +//----------------------------------------------------------------------------- +CDispPaintDataDlg::CDispPaintDataDlg( CWnd *pParent ) : + CDialog( CDispPaintDataDlg::IDD, pParent ) +{ +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CDispPaintDataDlg::~CDispPaintDataDlg() +{ + if( m_comboboxBrush.m_hWnd ) + { + m_comboboxBrush.Detach(); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +BOOL CDispPaintDataDlg::OnInitDialog(void) +{ + static bool bInit = false; + + CDialog::OnInitDialog(); + + if( !bInit ) + { + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + m_uiPrevEffect = pDispTool->GetEffect(); + pDispTool->GetChannel( DISPPAINT_CHANNEL_ALPHA, m_fPrevPaintValue ); + m_iPrevBrush = 0; + + bInit = true; + } + } + else + { + SetWindowPos( &wndTop, m_DialogPosRect.left, m_DialogPosRect.top, + m_DialogPosRect.Width(), m_DialogPosRect.Height(), SWP_NOZORDER ); + } + + // initialize the sliders + InitValue(); + + // initialize the combo boxes + InitComboBoxBrushData(); + InitComboBoxType(); + + return TRUE; +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::InitValue( void ) +{ + // init slider value + m_sliderValue.SetBuddy( &m_editValue, FALSE ); + m_sliderValue.SetRange( 1, 255 ); + m_sliderValue.SetTicFreq( 25 ); + + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->SetChannel( DISPPAINT_CHANNEL_ALPHA, m_fPrevPaintValue ); + + // init slider value + UpdateSliderValue( m_fPrevPaintValue ); + + // initialize the value edit box + CString strValue; + strValue.Format( "%4.2f", m_fPrevPaintValue ); + m_editValue.SetWindowText( strValue ); + } + else + { + UpdateSliderValue( 15.0f ); + + // initialize the value edit box + m_editValue.SetWindowText( "15.00" ); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +bool CDispPaintDataDlg::InitComboBoxBrushData( void ) +{ + // + // get the displacement paint brush icon combo box + // + m_comboboxBrush.Attach( GetDlgItem( ID_DISP_PAINT_DATA_BRUSH )->m_hWnd ); + m_comboboxBrush.Init(); + + // reset the size of the combo box list item + m_comboboxBrush.SetItemHeight( -1, m_comboboxBrush.m_IconSize.cy + 2 ); + + // set initial radio button/brush combo box data + // initialize the radio button/brush combo box geometry data + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->SetEffect( m_uiPrevEffect ); + + switch( m_uiPrevEffect ) + { + case DISPPAINT_EFFECT_RAISELOWER: + { + pDispTool->SetEffect( DISPPAINT_EFFECT_RAISELOWER ); + SetEffectButtonData( DISPPAINT_EFFECT_RAISELOWER ); + FilterComboBoxBrushData( DISPPAINT_EFFECT_RAISELOWER, true ); + break; + } + case DISPPAINT_EFFECT_RAISETO: + { + pDispTool->SetEffect( DISPPAINT_EFFECT_RAISETO ); + SetEffectButtonData( DISPPAINT_EFFECT_RAISETO ); + FilterComboBoxBrushData( DISPPAINT_EFFECT_RAISETO, true ); + break; + } + case DISPPAINT_EFFECT_SMOOTH: + { + pDispTool->SetEffect( DISPPAINT_EFFECT_SMOOTH ); + SetEffectButtonData( DISPPAINT_EFFECT_SMOOTH ); + FilterComboBoxBrushData( DISPPAINT_EFFECT_SMOOTH, true ); + break; + } + default: + { + return false; + } + } + + OnComboBoxBrushData(); + } + else + { + OnEffectRaiseLowerData(); + OnComboBoxBrushData(); + } + + return true; +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::FilterComboBoxBrushData( unsigned int uiEffect, bool bInit ) +{ + // + // remove all the old combo box data + // + int count = m_comboboxBrush.GetCount(); + for( int ndx = count - 1; ndx >= 0; ndx-- ) + { + m_comboboxBrush.DeleteIcon( ndx ); + } + + // + // add the new combo box data based on the current paint "effect" + // + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + CDispMapImageFilterManager *pFilterMgr; + switch( uiEffect ) + { + case DISPPAINT_EFFECT_RAISELOWER: { pFilterMgr = pDispTool->GetFilterRaiseLowerMgr(); break; } + case DISPPAINT_EFFECT_RAISETO: { pFilterMgr = pDispTool->GetFilterRaiseToMgr(); break; } + case DISPPAINT_EFFECT_SMOOTH: { pFilterMgr = pDispTool->GetFilterSmoothMgr(); break; } + default: return; + } + + if( pFilterMgr ) + { + // + // for each filter - add its icon to the icon combo box + // + for( int ndxFilter = 0; ndxFilter < pFilterMgr->GetFilterCount(); ndxFilter++ ) + { + // get the current filter + CDispMapImageFilter *pFilter = pFilterMgr->GetFilter( ndxFilter ); + + // get the application directory + char appDir[MAX_PATH]; + APP()->GetDirectory( DIR_PROGRAM, appDir ); + + // append the filters directory name + strcat( appDir, "filters\\" ); + + // append the directory prefix to the icon name + CString iconFilename = appDir + pFilter->m_Name; + + // add the icon to the icon combo box + m_comboboxBrush.AddIcon( iconFilename ); + } + + // set initial paint brush + if( bInit ) + { + m_comboboxBrush.SetCurSel( m_iPrevBrush ); + } + else + { + m_comboboxBrush.SetCurSel( 0 ); + } + } + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +bool CDispPaintDataDlg::InitComboBoxType( void ) +{ + // alpha type + CString strType = "Alpha"; + m_comboboxType.AddString( strType ); + m_comboboxType.SetCurSel( 0 ); + + // turn off for now + m_comboboxType.EnableWindow( FALSE ); + + return true; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::DoDataExchange( CDataExchange *pDX ) +{ + CDialog::DoDataExchange( pDX ); + //{{AFX_DATA_MAP(CDispPaintDistDlg) + DDX_Control( pDX, ID_DISP_PAINT_DATA_SLIDER_VALUE, m_sliderValue ); + DDX_Control( pDX, ID_DISP_PAINT_DATA_EDIT_VALUE, m_editValue ); + DDX_Control( pDX, ID_DISP_PAINT_DATA_TYPE, m_comboboxType ); + //}}AFX_DATA_MAP +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::OnComboBoxBrushData( void ) +{ + // get the displacement's filter manager + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + // get current selection + int iSel = m_comboboxBrush.GetCurSel(); + if( iSel == LB_ERR ) + return; + + unsigned int uiEffect = pDispTool->GetEffect(); + CDispMapImageFilterManager *pFilterMgr; + switch( uiEffect ) + { + case DISPPAINT_EFFECT_RAISELOWER: { pFilterMgr = pDispTool->GetFilterRaiseLowerMgr(); break; } + case DISPPAINT_EFFECT_RAISETO: { pFilterMgr = pDispTool->GetFilterRaiseToMgr(); break; } + case DISPPAINT_EFFECT_SMOOTH: { pFilterMgr = pDispTool->GetFilterSmoothMgr(); break; } + default: return; + } + + if( pFilterMgr ) + { + pFilterMgr->SetActiveFilter( iSel ); + } + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::OnComboBoxType( void ) +{ + return; +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::SetEffectButtonData( unsigned int effect ) +{ + CButton *radiobutton; + radiobutton = ( CButton* )GetDlgItem( ID_DISP_PAINT_DATA_RAISELOWER ); + radiobutton->SetCheck( effect == DISPPAINT_EFFECT_RAISELOWER ); + radiobutton = ( CButton* )GetDlgItem( ID_DISP_PAINT_DATA_RAISETO ); + radiobutton->SetCheck( effect == DISPPAINT_EFFECT_RAISETO ); + radiobutton = ( CButton* )GetDlgItem( ID_DISP_PAINT_DATA_SMOOTH ); + radiobutton->SetCheck( effect == DISPPAINT_EFFECT_SMOOTH ); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::OnEffectRaiseLowerData( void ) +{ + // get the displacement tool + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->SetEffect( DISPPAINT_EFFECT_RAISELOWER ); + SetEffectButtonData( DISPPAINT_EFFECT_RAISELOWER ); + FilterComboBoxBrushData( DISPPAINT_EFFECT_RAISELOWER, false ); + OnComboBoxBrushData(); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::OnEffectRaiseToData( void ) +{ + // get the displacement tool + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->SetEffect( DISPPAINT_EFFECT_RAISETO ); + SetEffectButtonData( DISPPAINT_EFFECT_RAISETO ); + FilterComboBoxBrushData( DISPPAINT_EFFECT_RAISETO, false ); + OnComboBoxBrushData(); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::OnEffectSmoothData( void ) +{ + // get the displacement tool + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->SetEffect( DISPPAINT_EFFECT_SMOOTH ); + SetEffectButtonData( DISPPAINT_EFFECT_SMOOTH ); + FilterComboBoxBrushData( DISPPAINT_EFFECT_SMOOTH, false ); + OnComboBoxBrushData(); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::UpdateSliderValue( float fValue ) +{ + int iValue = ( int )fValue; + + // clamp + if( iValue < 1 ) { iValue = 1; } + if( iValue > 255 ) { iValue = 255; } + + m_sliderValue.SetPos( iValue ); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::OnHScroll( UINT nSBCode, UINT nPos, CScrollBar *pScrollBar ) +{ + // get the displacement tool + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + // get the slider control + CSliderCtrl *pSlider = ( CSliderCtrl* )GetDlgItem( ID_DISP_PAINT_DATA_SLIDER_VALUE ); + if( pSlider ) + { + // get the slider position + int pos = pSlider->GetPos(); + + pDispTool->SetChannel( DISPPAINT_CHANNEL_ALPHA, ( float )pos ); + + // + // update "the buddy" the disp value cedit box + // + CString strValue; + strValue.Format( "%4.2f", ( float )pos ); + m_editValue.SetWindowText( strValue ); + } + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::OnEditValue( void ) +{ + // + // get the edit box distance data + // + CString strValue; + m_editValue.GetWindowText( strValue ); + float fValue = atof( strValue ); + + // get the displacement tool + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + UpdateSliderValue( fValue ); + pDispTool->SetChannel( DISPPAINT_CHANNEL_ALPHA, fValue ); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::OnClose( void ) +{ + // get the displacement tool and set selection tool active + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + pDispTool->SetTool( DISPTOOL_SELECT ); + } + + // set "select" as the current tool - this should destroy this dialog!! + CFaceEditSheet *pSheet = ( CFaceEditSheet* )GetParent(); + if( pSheet ) + { + pSheet->m_DispPage.SetTool( CFaceEditDispPage::FACEEDITTOOL_SELECT ); + } +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CDispPaintDataDlg::OnDestroy( void ) +{ + // save the current window position + GetWindowRect( &m_DialogPosRect ); + + CToolDisplace *pDispTool = GetDisplacementTool(); + if( pDispTool ) + { + m_uiPrevEffect = pDispTool->GetEffect(); + pDispTool->GetChannel( DISPPAINT_CHANNEL_ALPHA, m_fPrevPaintValue ); + } + + m_iPrevBrush = m_comboboxBrush.GetCurSel(); + + // detach the brush combo box!! + m_comboboxBrush.Detach(); +} |