hl2_src-leak-2017/src/hammer/dispdlg.cpp

1881 lines
53 KiB
C++

//========= 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();
}