262 lines
7.2 KiB
C++
262 lines
7.2 KiB
C++
// TerrainModifyPanel.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "TerrainModifyPanel.h"
|
|
#include "TerrainModifyTool.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTerrainModifyPanel dialog
|
|
|
|
|
|
CTerrainModifyPanel::CTerrainModifyPanel(CTerrainModifyTool *tool,CWnd* pParent /*=NULL*/)
|
|
: CDialog(CTerrainModifyPanel::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CTerrainModifyPanel)
|
|
//}}AFX_DATA_INIT
|
|
|
|
Create( IDD,pParent );
|
|
|
|
assert( tool != 0 );
|
|
m_tool = tool;
|
|
}
|
|
|
|
void CTerrainModifyPanel::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CTerrainModifyPanel)
|
|
DDX_Control(pDX, IDC_BRUSH_TYPE, m_brushType);
|
|
DDX_Control(pDX, IDC_NOISE_FREQ_SLIDER, m_noiseFreqSlider);
|
|
DDX_Control(pDX, IDC_NOISE_SCALE_SLIDER, m_noiseScaleSlider);
|
|
DDX_Control(pDX, IDC_BRUSH_HARDNESS_SLIDER, m_hardnessSlider);
|
|
DDX_Control(pDX, IDC_BRUSH_HEIGHT_SLIDER, m_heightSlider);
|
|
DDX_Control(pDX, IDC_BRUSH_RADIUS_SLIDER, m_radiusSlider);
|
|
DDX_Control(pDX, IDC_BRUSH_RADIUS_SLIDER2, m_radiusSlider2);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CTerrainModifyPanel, CDialog)
|
|
//{{AFX_MSG_MAP(CTerrainModifyPanel)
|
|
ON_WM_HSCROLL()
|
|
ON_EN_UPDATE(IDC_BRUSH_RADIUS, OnUpdateNumbers)
|
|
ON_EN_UPDATE(IDC_BRUSH_RADIUS2, OnUpdateNumbers)
|
|
ON_BN_CLICKED(IDC_BRUSH_NOISE, OnBrushNoise)
|
|
ON_CBN_SELENDOK(IDC_BRUSH_TYPE, OnSelendokBrushType)
|
|
ON_EN_UPDATE(IDC_BRUSH_HEIGHT, OnUpdateNumbers)
|
|
ON_EN_UPDATE(IDC_BRUSH_HARDNESS, OnUpdateNumbers)
|
|
ON_EN_UPDATE(IDC_NOISE_SCALE, OnUpdateNumbers)
|
|
ON_EN_UPDATE(IDC_NOISE_FREQ, OnUpdateNumbers)
|
|
ON_BN_CLICKED(IDC_REPOSITION_OBJECTS, OnRepositionObjects)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTerrainModifyPanel message handlers
|
|
|
|
BOOL CTerrainModifyPanel::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
m_brushRadius.Create( this,IDC_BRUSH_RADIUS );
|
|
m_brushRadius.SetRange( 1,200 );
|
|
|
|
m_brushRadius2.Create( this,IDC_BRUSH_RADIUS2 );
|
|
m_brushRadius2.SetRange( 0,200 );
|
|
|
|
m_brushHeight.Create( this,IDC_BRUSH_HEIGHT );
|
|
m_brushHeight.SetRange( 0,255 );
|
|
|
|
m_brushHardness.Create( this,IDC_BRUSH_HARDNESS );
|
|
m_brushHardness.SetRange( 0,1 );
|
|
|
|
m_noiseScale.Create( this,IDC_NOISE_SCALE );
|
|
m_noiseScale.SetRange( 0,100 );
|
|
|
|
m_noiseFreq.Create( this,IDC_NOISE_FREQ );
|
|
m_noiseFreq.SetRange( 0,100 );
|
|
|
|
m_radiusSlider.SetRange( 1,200 );
|
|
m_radiusSlider2.SetRange( 0,200 );
|
|
m_heightSlider.SetRange( 0,255 );
|
|
m_hardnessSlider.SetRange( 0,100 );
|
|
|
|
m_noiseScaleSlider.SetRange( 0,100 );
|
|
m_noiseFreqSlider.SetRange( 0,100 );
|
|
|
|
m_brushType.AddString( "Flatten" );
|
|
m_brushType.AddString( "Smooth" );
|
|
m_brushType.AddString( "Rise/Lower" );
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTerrainModifyPanel::SetBrush( CTerrainBrush &br )
|
|
{
|
|
m_brushHeight.SetRange( 0,255 );
|
|
m_heightSlider.SetRange( 0,255 );
|
|
if (br.type == eBrushFlatten)
|
|
{
|
|
m_brushType.SetCurSel(0);
|
|
m_heightSlider.EnableWindow(TRUE);
|
|
m_brushHeight.EnableWindow(TRUE);
|
|
m_radiusSlider2.EnableWindow(TRUE);
|
|
m_brushRadius2.EnableWindow(TRUE);
|
|
}
|
|
if (br.type == eBrushSmooth)
|
|
{
|
|
m_brushType.SetCurSel(1);
|
|
br.bNoise = false;
|
|
m_heightSlider.EnableWindow(FALSE);
|
|
m_brushHeight.EnableWindow(FALSE);
|
|
m_radiusSlider2.EnableWindow(FALSE);
|
|
m_brushRadius2.EnableWindow(FALSE);
|
|
}
|
|
if (br.type == eBrushRiseLower)
|
|
{
|
|
m_brushType.SetCurSel(2);
|
|
m_heightSlider.EnableWindow(TRUE);
|
|
m_brushHeight.EnableWindow(TRUE);
|
|
m_radiusSlider2.EnableWindow(TRUE);
|
|
m_brushRadius2.EnableWindow(TRUE);
|
|
m_brushHeight.SetRange( -255,255 );
|
|
m_heightSlider.SetRange( -50,50 );
|
|
}
|
|
m_brushRadius.SetValue( br.radius );
|
|
m_brushRadius2.SetValue( br.radiusInside );
|
|
m_brushHeight.SetValue( br.height );
|
|
m_brushHardness.SetValue( br.hardness );
|
|
m_noiseFreq.SetValue( br.noiseFreq );
|
|
m_noiseScale.SetValue( br.noiseScale );
|
|
|
|
m_radiusSlider.SetPos( br.radius );
|
|
m_radiusSlider2.SetPos( br.radiusInside );
|
|
m_heightSlider.SetPos( br.height );
|
|
m_hardnessSlider.SetPos( br.hardness*100.0f );
|
|
m_noiseScaleSlider.SetPos( br.noiseScale );
|
|
m_noiseFreqSlider.SetPos( br.noiseFreq );
|
|
|
|
m_noiseScaleSlider.EnableWindow(br.bNoise);
|
|
m_noiseFreqSlider.EnableWindow(br.bNoise);
|
|
m_noiseScale.EnableWindow(br.bNoise);
|
|
m_noiseFreq.EnableWindow(br.bNoise);
|
|
|
|
CheckDlgButton( IDC_BRUSH_NOISE,(br.bNoise)?BST_CHECKED:BST_UNCHECKED );
|
|
CheckDlgButton( IDC_REPOSITION_OBJECTS,(br.bRepositionObjects)?BST_CHECKED:BST_UNCHECKED );
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTerrainModifyPanel::OnUpdateNumbers()
|
|
{
|
|
CTerrainBrush br;
|
|
m_tool->GetBrush(br);
|
|
float prevRadius = br.radius;
|
|
float prevRadiusInside = br.radiusInside;
|
|
br.radius = m_brushRadius.GetValue();
|
|
br.radiusInside = m_brushRadius2.GetValue();
|
|
if (br.radius < br.radiusInside)
|
|
{
|
|
if (prevRadiusInside != br.radiusInside) // Check if changing inside radius.
|
|
br.radius = br.radiusInside;
|
|
else
|
|
br.radiusInside = br.radius; // Changing outside radius;
|
|
}
|
|
br.height = m_brushHeight.GetValue();
|
|
br.hardness = m_brushHardness.GetValue();
|
|
br.noiseFreq = m_noiseFreq.GetValue();
|
|
br.noiseScale = m_noiseScale.GetValue();
|
|
SetBrush( br );
|
|
m_tool->SetBrush(br);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTerrainModifyPanel::OnBrushNoise()
|
|
{
|
|
BOOL noise = IsDlgButtonChecked(IDC_BRUSH_NOISE);
|
|
CTerrainBrush br;
|
|
m_tool->GetBrush(br);
|
|
br.bNoise = (noise)?true:false;
|
|
SetBrush( br );
|
|
m_tool->SetBrush(br);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTerrainModifyPanel::OnHScroll( UINT nSBCode,UINT nPos,CScrollBar* pScrollBar )
|
|
{
|
|
CSliderCtrl *pSliderCtrl = (CSliderCtrl*)pScrollBar;
|
|
CTerrainBrush br;
|
|
m_tool->GetBrush(br);
|
|
if (pSliderCtrl == &m_hardnessSlider)
|
|
{
|
|
br.hardness = (float)m_hardnessSlider.GetPos()/100.0f;
|
|
}
|
|
else if (pSliderCtrl == &m_heightSlider)
|
|
{
|
|
br.height = m_heightSlider.GetPos();
|
|
}
|
|
else if (pSliderCtrl == &m_radiusSlider)
|
|
{
|
|
br.radius = m_radiusSlider.GetPos();
|
|
if (br.radius < br.radiusInside)
|
|
br.radiusInside = br.radius;
|
|
}
|
|
else if (pSliderCtrl == &m_radiusSlider2)
|
|
{
|
|
br.radiusInside = m_radiusSlider2.GetPos();
|
|
if (br.radius < br.radiusInside)
|
|
br.radius = br.radiusInside;
|
|
}
|
|
else if (pSliderCtrl == &m_noiseScaleSlider)
|
|
{
|
|
br.noiseScale = m_noiseScaleSlider.GetPos();
|
|
}
|
|
else if (pSliderCtrl == &m_noiseFreqSlider)
|
|
{
|
|
br.noiseFreq = m_noiseFreqSlider.GetPos();
|
|
}
|
|
SetBrush( br );
|
|
m_tool->SetBrush(br);
|
|
}
|
|
|
|
void CTerrainModifyPanel::OnSelendokBrushType()
|
|
{
|
|
int sel = m_brushType.GetCurSel();
|
|
if (sel != LB_ERR)
|
|
{
|
|
switch (sel)
|
|
{
|
|
case 0:
|
|
m_tool->SetActiveBrushType(eBrushFlatten);
|
|
break;
|
|
case 1:
|
|
m_tool->SetActiveBrushType(eBrushSmooth);
|
|
break;
|
|
case 2:
|
|
m_tool->SetActiveBrushType(eBrushRiseLower);
|
|
break;
|
|
}
|
|
}
|
|
CTerrainBrush br;
|
|
m_tool->GetBrush(br);
|
|
SetBrush( br );
|
|
}
|
|
|
|
void CTerrainModifyPanel::OnRepositionObjects()
|
|
{
|
|
BOOL noise = IsDlgButtonChecked(IDC_REPOSITION_OBJECTS);
|
|
CTerrainBrush br;
|
|
m_tool->GetBrush(br);
|
|
br.bRepositionObjects = (noise)?true:false;
|
|
SetBrush( br );
|
|
m_tool->SetBrush(br);
|
|
|
|
}
|