|
|
//========= Copyright � 1996-2005, 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_BN_CLICKED(IDC_SCULPT_BLEND, &CPaintSculptDlg::OnBnClickedSculptBlend) 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();
m_BlendOptions = new CSculptBlendOptions(); }
//-----------------------------------------------------------------------------
// Purpose: destructor
//-----------------------------------------------------------------------------
CPaintSculptDlg::~CPaintSculptDlg( ) { delete m_PushOptions; delete m_CarveOptions; // delete m_ProjectOptions;
delete m_BlendOptions; }
//-----------------------------------------------------------------------------
// 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 );
m_BlendOptions->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
if( !m_BlendOptions->Create( IDD_DISP_SCULPT_BLEND_OPTIONS, this ) ) { return FALSE; } 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_BlendOptions->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_BlendOptions->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); DDX_Control(pDX, IDC_SCULPT_BLEND, m_BlendButton); }
//-----------------------------------------------------------------------------
// 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(); if ( pDispTool != NULL ) { 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(); if ( pDispTool != NULL ) { 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(); if ( pDispTool != NULL ) { 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 );
CToolDisplace *pDispTool = GetDisplacementTool(); if( pDispTool ) { pDispTool->GetSelectedDisps(); // ensure we have a selection count!
CDialog *painter = dynamic_cast< CDialog * >( pDispTool->GetSculptPainter() );
if ( painter ) { painter->ShowWindow( SW_HIDE ); } }
#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 );
}
//-----------------------------------------------------------------------------
// Purpose: sets the active mode to blend
//-----------------------------------------------------------------------------
void CPaintSculptDlg::OnBnClickedSculptBlend( ) { SetActiveMode( SCULPT_MODE_BLEND ); }
#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 ); m_BlendButton.SetCheck( m_SculptMode == SCULPT_MODE_BLEND );
CToolDisplace *pDispTool = GetDisplacementTool(); if( pDispTool ) { pDispTool->GetSelectedDisps(); // ensure we have a selection count!
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
case SCULPT_MODE_BLEND: m_BlendOptions->ShowWindow( SW_SHOW ); pDispTool->SetSculptPainter( m_BlendOptions ); break; } } }
//=============================================================================
//
// 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(); }
|