Serious-Engine/Sources/WorldEditor/DlgPgPrimitive.cpp

807 lines
30 KiB
C++
Raw Normal View History

2016-03-12 01:20:51 +01:00
/* Copyright (c) 2002-2012 Croteam Ltd.
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
2016-03-11 14:57:17 +01:00
// DlgPgPrimitive.cpp : implementation file
//
#include "stdafx.h"
#include "DlgPgPrimitive.h"
#ifdef _DEBUG
#undef new
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static CTFileName _fnPrimitiveSettingsSavedAs;
BOOL _bForceRecreatePrimitive = FALSE;
/////////////////////////////////////////////////////////////////////////////
// CDlgPgPrimitive property page
IMPLEMENT_DYNCREATE(CDlgPgPrimitive, CPropertyPage)
CDlgPgPrimitive::CDlgPgPrimitive() : CPropertyPage(CDlgPgPrimitive::IDD)
{
//{{AFX_DATA_INIT(CDlgPgPrimitive)
m_fHeight = 0.0f;
m_fLenght = 0.0f;
m_fWidth = 0.0f;
m_fEdit1 = 0.0f;
m_fEdit2 = 0.0f;
m_fEdit3 = 0.0f;
m_fEdit4 = 0.0f;
m_fEdit5 = 0.0f;
m_bIfRoom = FALSE;
m_bIfSpiral = FALSE;
m_bIfOuter = FALSE;
m_strDisplacePicture = _T("");
m_bAutoCreateMipBrushes = FALSE;
//}}AFX_DATA_INIT
// set some initial colors;
m_colLastSectorColor = 0x12345678;
m_colLastPolygonColor = 0x12345678;
}
CDlgPgPrimitive::~CDlgPgPrimitive()
{
}
void CDlgPgPrimitive::DoDataExchange(CDataExchange* pDX)
{
if( theApp.m_bDisableDataExchange) return;
CPropertyPage::DoDataExchange(pDX);
// get active document
CWorldEditorDoc* pDoc = theApp.GetActiveDocument();
// if document doesn't yet exist, return
if( pDoc == NULL)
{
return;
}
// if dialog is recieving data
if( (pDX->m_bSaveAndValidate == FALSE) && (IsWindow(m_comboTopShape.m_hWnd)) )
{
m_fWidth = theApp.m_vfpCurrent.vfp_fXMax-theApp.m_vfpCurrent.vfp_fXMin;
m_fLenght = theApp.m_vfpCurrent.vfp_fZMax-theApp.m_vfpCurrent.vfp_fZMin;
m_fHeight = theApp.m_vfpCurrent.vfp_fYMax-theApp.m_vfpCurrent.vfp_fYMin;
m_SectorColor.SetColor( theApp.m_vfpCurrent.vfp_colSectorsColor);
m_PolygonColor.SetColor( theApp.m_vfpCurrent.vfp_colPolygonsColor);
m_bAutoCreateMipBrushes = theApp.m_vfpCurrent.vfp_bAutoCreateMipBrushes;
GetDlgItem(IDC_DISPLACE_T)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_DISPLACE_BROWSE)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_DISPLACE_NONE)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_DISPLACE_FILE)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_AUTO_CREATE_MIP_BRUSHES)->ShowWindow( SW_HIDE);
switch( theApp.m_vfpCurrent.vfp_ptPrimitiveType)
{
case PT_CONUS:
{
GetDlgItem(IDC_LENGHT)->EnableWindow( TRUE);
GetDlgItem(IDC_LENGHT_T)->EnableWindow( TRUE);
GetDlgItem(IDC_HEIGHT)->EnableWindow( TRUE);
GetDlgItem(IDC_HEIGHT_T)->EnableWindow( TRUE);
GetDlgItem(IDC_EDIT1)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT1_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT1_T)->SetWindowText( L"Shear x:");
GetDlgItem(IDC_EDIT2)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT2_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT2_T)->SetWindowText( L"Shear y:");
GetDlgItem(IDC_EDIT3)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT3_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT3_T)->SetWindowText( L"Base vtx:");
GetDlgItem(IDC_EDIT4)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT4_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT4_T)->SetWindowText( L"Stretch x:");
GetDlgItem(IDC_EDIT5)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT5_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT5_T)->SetWindowText( L"Stretch y:");
GetDlgItem(IDC_IF_SPIRAL)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_IF_OUTER)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_TOP_SHAPE)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_BOTTOM_SHAPE)->ShowWindow( SW_HIDE);
m_fEdit1 = theApp.m_vfpCurrent.vfp_fShearX;
m_fEdit2 = theApp.m_vfpCurrent.vfp_fShearZ;
m_fEdit3 = (float) theApp.m_vfpCurrent.vfp_avVerticesOnBaseOfPrimitive.Count();
m_fEdit4 = theApp.m_vfpCurrent.vfp_fStretchX;
m_fEdit5 = theApp.m_vfpCurrent.vfp_fStretchY;
m_bIfRoom = theApp.m_vfpCurrent.vfp_bClosed;
m_bIfOuter = theApp.m_vfpCurrent.vfp_bOuter;
break;
}
case PT_TORUS:
{
GetDlgItem(IDC_LENGHT)->EnableWindow( TRUE);
GetDlgItem(IDC_LENGHT_T)->EnableWindow( TRUE);
GetDlgItem(IDC_HEIGHT)->EnableWindow( TRUE);
GetDlgItem(IDC_HEIGHT_T)->EnableWindow( TRUE);
GetDlgItem(IDC_EDIT1)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT1_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT1_T)->SetWindowText( L"Slices in 360:");
GetDlgItem(IDC_EDIT2)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT2_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT2_T)->SetWindowText( L"No of slices:");
GetDlgItem(IDC_EDIT3)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT3_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT3_T)->SetWindowText( L"Base vtx:");
GetDlgItem(IDC_EDIT4)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT4_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT4_T)->SetWindowText( L"Radius:");
GetDlgItem(IDC_EDIT5)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_EDIT5_T)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_TOP_SHAPE)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_BOTTOM_SHAPE)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_IF_SPIRAL)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_IF_OUTER)->ShowWindow( SW_SHOW);
m_fEdit1 = (float)theApp.m_vfpCurrent.vfp_iSlicesIn360;
m_fEdit2 = (float)theApp.m_vfpCurrent.vfp_iNoOfSlices;
m_fEdit3 = (float)theApp.m_vfpCurrent.vfp_avVerticesOnBaseOfPrimitive.Count();
m_fEdit4 = theApp.m_vfpCurrent.vfp_fRadius;
m_bIfRoom = theApp.m_vfpCurrent.vfp_bClosed;
m_bIfOuter = theApp.m_vfpCurrent.vfp_bOuter;
break;
}
case PT_STAIRCASES:
{
GetDlgItem(IDC_HEIGHT)->EnableWindow( TRUE);
GetDlgItem(IDC_HEIGHT_T)->EnableWindow( TRUE);
GetDlgItem(IDC_EDIT2)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT2_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT2_T)->SetWindowText( L"No of stairs:");
GetDlgItem(IDC_EDIT3)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_EDIT3_T)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_EDIT4)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_EDIT4_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT4_T)->SetWindowText( L"Top:");
GetDlgItem(IDC_EDIT5)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_EDIT5_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT5_T)->SetWindowText( L"Bottom:");
GetDlgItem(IDC_TOP_SHAPE)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_BOTTOM_SHAPE)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_IF_SPIRAL)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_IF_SPIRAL)->SetWindowText( L"Spiral:");
if( theApp.m_vfpCurrent.vfp_bLinearStaircases)
{
GetDlgItem(IDC_LENGHT)->EnableWindow( TRUE);
GetDlgItem(IDC_LENGHT_T)->EnableWindow( TRUE);
GetDlgItem(IDC_EDIT1)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_EDIT1_T)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_IF_OUTER)->ShowWindow( SW_HIDE);
}
else
{
GetDlgItem(IDC_LENGHT)->EnableWindow( FALSE);
GetDlgItem(IDC_LENGHT_T)->EnableWindow( FALSE);
GetDlgItem(IDC_EDIT1)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT1_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT1_T)->SetWindowText( L"Slices in 360:");
GetDlgItem(IDC_EDIT3)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT3_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT3_T)->SetWindowText( L"Radius:");
GetDlgItem(IDC_IF_OUTER)->ShowWindow( SW_SHOW);
}
m_fEdit1 = (float)theApp.m_vfpCurrent.vfp_iSlicesIn360;
m_fEdit2 = (float)theApp.m_vfpCurrent.vfp_iNoOfSlices;
m_fEdit3 = theApp.m_vfpCurrent.vfp_fRadius;
m_bIfRoom = theApp.m_vfpCurrent.vfp_bClosed;
m_bIfSpiral = !theApp.m_vfpCurrent.vfp_bLinearStaircases;
m_bIfOuter = theApp.m_vfpCurrent.vfp_bOuter;
m_comboTopShape.SetCurSel( (int)theApp.m_vfpCurrent.vfp_iTopShape);
m_comboBottomShape.SetCurSel( (int)theApp.m_vfpCurrent.vfp_iBottomShape);
break;
}
case PT_SPHERE:
{
GetDlgItem(IDC_LENGHT)->EnableWindow( TRUE);
GetDlgItem(IDC_LENGHT_T)->EnableWindow( TRUE);
GetDlgItem(IDC_HEIGHT)->EnableWindow( TRUE);
GetDlgItem(IDC_HEIGHT_T)->EnableWindow( TRUE);
GetDlgItem(IDC_EDIT1)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT1_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT1_T)->SetWindowText( L"Meridians:");
GetDlgItem(IDC_EDIT2)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT2_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT2_T)->SetWindowText( L"Parallels:");
GetDlgItem(IDC_EDIT3)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_EDIT3_T)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_TOP_SHAPE)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_BOTTOM_SHAPE)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_IF_SPIRAL)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_IF_SPIRAL)->SetWindowText( L"Equal parallels:");
GetDlgItem(IDC_IF_OUTER)->ShowWindow( SW_HIDE);
m_fEdit1 = (float)theApp.m_vfpCurrent.vfp_iMeridians;
m_fEdit2 = (float)theApp.m_vfpCurrent.vfp_iParalels;
m_fEdit4 = theApp.m_fTerrainSwitchStart;
m_fEdit5 = theApp.m_fTerrainSwitchStep;
m_bIfRoom = theApp.m_vfpCurrent.vfp_bClosed;
m_bIfSpiral = theApp.m_vfpCurrent.vfp_bLinearStaircases;
break;
}
case PT_TERRAIN:
{
GetDlgItem(IDC_LENGHT)->EnableWindow( TRUE);
GetDlgItem(IDC_LENGHT_T)->EnableWindow( TRUE);
GetDlgItem(IDC_HEIGHT)->EnableWindow( TRUE);
GetDlgItem(IDC_HEIGHT_T)->EnableWindow( TRUE);
GetDlgItem(IDC_EDIT1)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT1_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT1_T)->SetWindowText( L"Slices per W:");
GetDlgItem(IDC_EDIT2)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT2_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT2_T)->SetWindowText( L"Slices per H");
GetDlgItem(IDC_EDIT4)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT4_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT4_T)->SetWindowText( L"Mip start");
GetDlgItem(IDC_EDIT5)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT5_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT5_T)->SetWindowText( L"Mip step");
GetDlgItem(IDC_TOP_SHAPE)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_BOTTOM_SHAPE)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_IF_SPIRAL)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_IF_OUTER)->ShowWindow( SW_HIDE);
GetDlgItem(IDC_AUTO_CREATE_MIP_BRUSHES)->ShowWindow( SW_SHOW);
m_fEdit1 = (float)theApp.m_vfpCurrent.vfp_iSlicesPerWidth;
m_fEdit2 = (float)theApp.m_vfpCurrent.vfp_iSlicesPerHeight;
m_fEdit3 = theApp.m_vfpCurrent.vfp_fAmplitude;
m_fEdit4 = theApp.m_vfpCurrent.vfp_fMipStart;
m_fEdit5 = theApp.m_vfpCurrent.vfp_fMipStep;
m_bIfRoom = theApp.m_vfpCurrent.vfp_bClosed;
GetDlgItem(IDC_DISPLACE_T)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_DISPLACE_BROWSE)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_DISPLACE_NONE)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_DISPLACE_FILE)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT3)->ShowWindow( SW_SHOW);
GetDlgItem(IDC_EDIT3_T)->SetWindowText( L"Amplitude:");
GetDlgItem(IDC_EDIT3_T)->ShowWindow( SW_SHOW);
m_strDisplacePicture =
theApp.m_vfpCurrent.vfp_fnDisplacement.FileName()+
theApp.m_vfpCurrent.vfp_fnDisplacement.FileExt();
if( m_strDisplacePicture == "")
{
GetDlgItem(IDC_EDIT3)->EnableWindow( FALSE);
GetDlgItem(IDC_EDIT3_T)->EnableWindow( FALSE);
GetDlgItem(IDC_DISPLACE_NONE)->EnableWindow( FALSE);
m_strDisplacePicture = "<none>";
}
else
{
GetDlgItem(IDC_EDIT3)->EnableWindow( TRUE);
GetDlgItem(IDC_EDIT3_T)->EnableWindow( TRUE);
GetDlgItem(IDC_DISPLACE_NONE)->EnableWindow( TRUE);
}
break;
}
default:
{
ASSERTALWAYS( "Invalid primitive type found!");
}
}
}
//{{AFX_DATA_MAP(CDlgPgPrimitive)
DDX_Control(pDX, IDC_PRIMITIVE_HISTORY, m_comboPrimitiveHistory);
DDX_Control(pDX, IDC_TOP_SHAPE, m_comboTopShape);
DDX_Control(pDX, IDC_BOTTOM_SHAPE, m_comboBottomShape);
DDX_Control(pDX, ID_SECTOR_COLOR, m_SectorColor);
DDX_Control(pDX, ID_POLYGON_COLOR, m_PolygonColor);
DDX_Text(pDX, IDC_HEIGHT, m_fHeight);
DDV_MinMaxFloat(pDX, m_fHeight, -256000.0f, 256000.0f);
DDX_Text(pDX, IDC_LENGHT, m_fLenght);
DDV_MinMaxFloat(pDX, m_fLenght, -256000.0f, 256000.0f);
DDX_Text(pDX, IDC_WIDTH, m_fWidth);
DDV_MinMaxFloat(pDX, m_fWidth, -256000.0f, 256000.0f);
DDX_Text(pDX, IDC_EDIT1, m_fEdit1);
DDX_Text(pDX, IDC_EDIT2, m_fEdit2);
DDX_Text(pDX, IDC_EDIT3, m_fEdit3);
DDX_Text(pDX, IDC_EDIT4, m_fEdit4);
DDX_Text(pDX, IDC_EDIT5, m_fEdit5);
DDX_Check(pDX, IDC_IF_ROOM, m_bIfRoom);
DDX_Check(pDX, IDC_IF_SPIRAL, m_bIfSpiral);
DDX_Check(pDX, IDC_IF_OUTER, m_bIfOuter);
DDX_Text(pDX, IDC_DISPLACE_FILE, m_strDisplacePicture);
DDX_Check(pDX, IDC_AUTO_CREATE_MIP_BRUSHES, m_bAutoCreateMipBrushes);
//}}AFX_DATA_MAP
// if dialog is giving data
if( pDX->m_bSaveAndValidate != FALSE)
{
CValuesForPrimitive vfpBeforeDDX = theApp.m_vfpCurrent;
theApp.m_vfpCurrent.vfp_bDummy = FALSE;
theApp.m_vfpCurrent.vfp_bAutoCreateMipBrushes = m_bAutoCreateMipBrushes;
theApp.m_vfpCurrent.vfp_colSectorsColor = m_SectorColor.GetColor();
theApp.m_vfpCurrent.vfp_colPolygonsColor = m_PolygonColor.GetColor();
#define PRIMITIVE_CHANGED_DELTA 0.01f
if( Abs(theApp.m_vfpCurrent.vfp_fXMax-theApp.m_vfpCurrent.vfp_fXMin-m_fWidth) > PRIMITIVE_CHANGED_DELTA)
{
theApp.m_vfpCurrent.vfp_fXMin = -m_fWidth/2;
theApp.m_vfpCurrent.vfp_fXMax = m_fWidth/2;
}
if( Abs(theApp.m_vfpCurrent.vfp_fYMax-theApp.m_vfpCurrent.vfp_fYMin-m_fHeight) > PRIMITIVE_CHANGED_DELTA)
{
theApp.m_vfpCurrent.vfp_fYMin = 0;
theApp.m_vfpCurrent.vfp_fYMax = m_fHeight;
}
if( Abs(theApp.m_vfpCurrent.vfp_fZMax-theApp.m_vfpCurrent.vfp_fZMin-m_fLenght) > PRIMITIVE_CHANGED_DELTA)
{
theApp.m_vfpCurrent.vfp_fZMin = -m_fLenght/2;
theApp.m_vfpCurrent.vfp_fZMax = m_fLenght/2;
}
if( ((theApp.m_vfpCurrent.vfp_ptPrimitiveType == PT_CONUS) ||
(theApp.m_vfpCurrent.vfp_ptPrimitiveType == PT_TORUS)) &&
(theApp.m_vfpCurrent.vfp_avVerticesOnBaseOfPrimitive.Count() != m_fEdit3) &&
((INDEX)(m_fEdit3) > 0) )
{
theApp.m_vfpCurrent.vfp_avVerticesOnBaseOfPrimitive.Clear();
theApp.m_vfpCurrent.vfp_avVerticesOnBaseOfPrimitive.New( Abs((INDEX) m_fEdit3));
}
theApp.m_vfpCurrent.vfp_fShearX = m_fEdit1;
theApp.m_vfpCurrent.vfp_iSlicesIn360 = (INDEX) m_fEdit1;
theApp.m_vfpCurrent.vfp_iMeridians = (INDEX) m_fEdit1;
theApp.m_vfpCurrent.vfp_iSlicesPerWidth = (INDEX) m_fEdit1;
theApp.m_vfpCurrent.vfp_fShearZ = m_fEdit2;
theApp.m_vfpCurrent.vfp_iNoOfSlices = (INDEX) m_fEdit2;
theApp.m_vfpCurrent.vfp_iParalels = (INDEX) m_fEdit2;
theApp.m_vfpCurrent.vfp_iSlicesPerHeight = (INDEX) m_fEdit2;
if( theApp.m_vfpCurrent.vfp_ptPrimitiveType == PT_TORUS)
{
theApp.m_vfpCurrent.vfp_fRadius = m_fEdit4;
}
if( theApp.m_vfpCurrent.vfp_ptPrimitiveType == PT_STAIRCASES)
{
theApp.m_vfpCurrent.vfp_fRadius = m_fEdit3;
theApp.m_vfpCurrent.vfp_bLinearStaircases = !m_bIfSpiral;
}
if( theApp.m_vfpCurrent.vfp_ptPrimitiveType == PT_TERRAIN)
{
theApp.m_vfpCurrent.vfp_fAmplitude = m_fEdit3;
theApp.m_vfpCurrent.vfp_fMipStart = m_fEdit4;
theApp.m_vfpCurrent.vfp_fMipStep = m_fEdit5;
}
else
{
theApp.m_vfpCurrent.vfp_fStretchX = m_fEdit4;
theApp.m_vfpCurrent.vfp_fStretchY = m_fEdit5;
}
theApp.m_vfpCurrent.vfp_bClosed = m_bIfRoom;
theApp.m_vfpCurrent.vfp_bOuter = m_bIfOuter;
theApp.m_vfpCurrent.vfp_iTopShape = m_comboTopShape.GetCurSel();
theApp.m_vfpCurrent.vfp_iBottomShape = m_comboBottomShape.GetCurSel();
// if anything changed
if( !(theApp.m_vfpCurrent == vfpBeforeDDX) || _bForceRecreatePrimitive)
{
_bForceRecreatePrimitive = FALSE;
// apply CSG change
ApplySCGChange();
}
}
}
BEGIN_MESSAGE_MAP(CDlgPgPrimitive, CPropertyPage)
//{{AFX_MSG_MAP(CDlgPgPrimitive)
ON_CBN_SELCHANGE(IDC_BOTTOM_SHAPE, OnSelchangeBottomShape)
ON_CBN_SELCHANGE(IDC_TOP_SHAPE, OnSelchangeTopShape)
ON_BN_CLICKED(IDC_IF_ROOM, OnIfRoom)
ON_BN_CLICKED(IDC_IF_SPIRAL, OnIfSpiral)
ON_BN_CLICKED(IDC_IF_OUTER, OnIfOuter)
ON_CBN_SELCHANGE(IDC_PRIMITIVE_HISTORY, OnSelchangePrimitiveHistory)
ON_CBN_DROPDOWN(IDC_PRIMITIVE_HISTORY, OnDropdownPrimitiveHistory)
ON_BN_CLICKED(IDC_DISPLACE_BROWSE, OnDisplaceBrowse)
ON_BN_CLICKED(IDC_DISPLACE_NONE, OnDisplaceNone)
ON_WM_CONTEXTMENU()
ON_COMMAND(ID_LOAD_PRIMITIVE_SETTINGS, OnLoadPrimitiveSettings)
ON_COMMAND(ID_SAVE_PRIMITIVE_SETTINGS, OnSavePrimitiveSettings)
ON_COMMAND(ID_SAVE_AS_PRIMITIVE_SETTINGS, OnSaveAsPrimitiveSettings)
ON_COMMAND(ID_RESET_PRIMITIVE, OnResetPrimitive)
ON_CBN_DROPDOWN(IDC_TOP_SHAPE, OnDropdownTopShape)
ON_CBN_DROPDOWN(IDC_BOTTOM_SHAPE, OnDropdownBottomShape)
ON_BN_CLICKED(IDC_AUTO_CREATE_MIP_BRUSHES, OnAutoCreateMipBrushes)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgPgPrimitive message handlers
BOOL CDlgPgPrimitive::OnIdle(LONG lCount)
{
COLOR colSectorColor = m_SectorColor.GetColor();
if( colSectorColor != m_colLastSectorColor)
{
// view the color change
UpdateData(TRUE);
GetDlgItem( ID_SECTOR_COLOR)->Invalidate();
}
// set new sector color
m_colLastSectorColor = colSectorColor;
COLOR colPolygonColor = m_PolygonColor.GetColor();
if( colPolygonColor != m_colLastPolygonColor)
{
// sector color is same as polygon color
m_SectorColor.SetColor( m_PolygonColor.GetColor());
// view the color change
UpdateData(TRUE);
GetDlgItem( ID_POLYGON_COLOR)->Invalidate();
GetDlgItem( ID_SECTOR_COLOR)->Invalidate();
}
// set new Polygon color
m_colLastPolygonColor = colPolygonColor;
return TRUE;
}
void CDlgPgPrimitive::ApplySCGChange()
{
// get active document
CWorldEditorDoc* pDoc = theApp.GetActiveDocument();
ASSERT( pDoc != NULL);
// snap all values to grid
pDoc->SnapPrimitiveValuesToGrid();
// recreate primitive with new values
pDoc->CreatePrimitive();
// update all views
pDoc->UpdateAllViews( NULL);
}
BOOL CDlgPgPrimitive::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)
{
// move data from page to primitive
UpdateData( TRUE);
// place snapped values back to dialog
UpdateData( FALSE);
// the message is handled
return TRUE;
}
return CPropertyPage::PreTranslateMessage(pMsg);
}
BOOL CDlgPgPrimitive::OnInitDialog()
{
_fnPrimitiveSettingsSavedAs = CTString("");
CPropertyPage::OnInitDialog();
// set last colors as curent ones so OnIdle would not copy polygon color over sector
m_colLastPolygonColor = m_PolygonColor.GetColor();
m_colLastSectorColor = m_SectorColor.GetColor();
if( !IsWindow( m_comboPrimitiveHistory.m_hWnd)) return TRUE;
INDEX iCt = 1;
// add descriptions of primitives from history list into combo
FOREACHINLIST( CPrimitiveInHistoryBuffer, pihb_lnNode, theApp.m_lhPrimitiveHistory, itPrim)
{
CTString strNo;
strNo.PrintF("%d) ", iCt);
CTString strDescription;
switch( itPrim->pihb_vfpPrimitive.vfp_ptPrimitiveType)
{
case PT_CONUS:
{
strDescription.PrintF("%d vtx, Size(%g,%g,%g) Shear(%g,%g) Stretch(%g,%g)",
itPrim->pihb_vfpPrimitive.vfp_avVerticesOnBaseOfPrimitive.Count(),
itPrim->pihb_vfpPrimitive.vfp_fXMax-itPrim->pihb_vfpPrimitive.vfp_fXMin,
itPrim->pihb_vfpPrimitive.vfp_fZMax-itPrim->pihb_vfpPrimitive.vfp_fZMin,
itPrim->pihb_vfpPrimitive.vfp_fYMax-itPrim->pihb_vfpPrimitive.vfp_fYMin,
itPrim->pihb_vfpPrimitive.vfp_fShearX, itPrim->pihb_vfpPrimitive.vfp_fShearZ,
itPrim->pihb_vfpPrimitive.vfp_fStretchX, itPrim->pihb_vfpPrimitive.vfp_fStretchY);
break;
}
case PT_TORUS:
{
strDescription.PrintF("%d vtx, Size(%g,%g) Radius(%g) Slices(%d,%d)",
itPrim->pihb_vfpPrimitive.vfp_avVerticesOnBaseOfPrimitive.Count(),
itPrim->pihb_vfpPrimitive.vfp_fXMax-itPrim->pihb_vfpPrimitive.vfp_fXMin,
itPrim->pihb_vfpPrimitive.vfp_fZMax-itPrim->pihb_vfpPrimitive.vfp_fZMin,
itPrim->pihb_vfpPrimitive.vfp_fRadius,
itPrim->pihb_vfpPrimitive.vfp_iSlicesIn360,
itPrim->pihb_vfpPrimitive.vfp_iNoOfSlices);
break;
}
case PT_STAIRCASES:
{
if( itPrim->pihb_vfpPrimitive.vfp_bLinearStaircases)
{
strDescription.PrintF("%d stairs, Size(%g,%g,%g)",
itPrim->pihb_vfpPrimitive.vfp_iNoOfSlices,
itPrim->pihb_vfpPrimitive.vfp_fXMax-itPrim->pihb_vfpPrimitive.vfp_fXMin,
itPrim->pihb_vfpPrimitive.vfp_fZMax-itPrim->pihb_vfpPrimitive.vfp_fZMin,
itPrim->pihb_vfpPrimitive.vfp_fYMax-itPrim->pihb_vfpPrimitive.vfp_fYMin);
}
else
{
strDescription.PrintF("Radius(%g), %d Slices %d Stairs Size(%g,%g)",
itPrim->pihb_vfpPrimitive.vfp_fRadius,
itPrim->pihb_vfpPrimitive.vfp_iSlicesIn360,
itPrim->pihb_vfpPrimitive.vfp_iNoOfSlices,
itPrim->pihb_vfpPrimitive.vfp_fXMax-itPrim->pihb_vfpPrimitive.vfp_fXMin,
itPrim->pihb_vfpPrimitive.vfp_fYMax-itPrim->pihb_vfpPrimitive.vfp_fYMin);
}
break;
}
case PT_SPHERE:
{
strDescription.PrintF("Size(%g,%g,%g) %d meridians %d parallels",
itPrim->pihb_vfpPrimitive.vfp_fXMax-itPrim->pihb_vfpPrimitive.vfp_fXMin,
itPrim->pihb_vfpPrimitive.vfp_fZMax-itPrim->pihb_vfpPrimitive.vfp_fZMin,
itPrim->pihb_vfpPrimitive.vfp_fYMax-itPrim->pihb_vfpPrimitive.vfp_fYMin,
itPrim->pihb_vfpPrimitive.vfp_iMeridians,
itPrim->pihb_vfpPrimitive.vfp_iParalels);
break;
}
case PT_TERRAIN:
{
strDescription.PrintF("Size(%g,%g,%g) Slices(%d,%d)",
itPrim->pihb_vfpPrimitive.vfp_fXMax-itPrim->pihb_vfpPrimitive.vfp_fXMin,
itPrim->pihb_vfpPrimitive.vfp_fZMax-itPrim->pihb_vfpPrimitive.vfp_fZMin,
itPrim->pihb_vfpPrimitive.vfp_fYMax-itPrim->pihb_vfpPrimitive.vfp_fYMin,
itPrim->pihb_vfpPrimitive.vfp_iSlicesPerWidth,
itPrim->pihb_vfpPrimitive.vfp_iSlicesPerHeight);
if( itPrim->pihb_vfpPrimitive.vfp_fnDisplacement != "")
{
strDescription.PrintF( "%s, Displ.: \"%s\", Amp. %g", strDescription,
(CTString&)(itPrim->pihb_vfpPrimitive.vfp_fnDisplacement.FileName()+
itPrim->pihb_vfpPrimitive.vfp_fnDisplacement.FileExt()),
itPrim->pihb_vfpPrimitive.vfp_fAmplitude);
}
else
{
strDescription.PrintF( "%s, No displacement picture", strDescription);
}
break;
}
default:
{
ASSERTALWAYS( "Invalid primitive type found!");
}
}
CTString strPosition;
strPosition.PrintF(", Pos(%g,%g,%g), Ang(%g,%g,%g)",
itPrim->pihb_vfpPrimitive.vfp_plPrimitive.pl_PositionVector(1),
itPrim->pihb_vfpPrimitive.vfp_plPrimitive.pl_PositionVector(2),
itPrim->pihb_vfpPrimitive.vfp_plPrimitive.pl_PositionVector(3),
DegAngle( itPrim->pihb_vfpPrimitive.vfp_plPrimitive.pl_OrientationAngle(1)),
DegAngle( itPrim->pihb_vfpPrimitive.vfp_plPrimitive.pl_OrientationAngle(2)),
DegAngle( itPrim->pihb_vfpPrimitive.vfp_plPrimitive.pl_OrientationAngle(3)));
CTString strTriangularisation;
switch( itPrim->pihb_vfpPrimitive.vfp_ttTriangularisationType)
{
case TT_NONE: strTriangularisation = ""; break;
case TT_CENTER_VERTEX: strTriangularisation = ", Triang:Center"; break;
case TT_FROM_VTX00: strTriangularisation = ", Triang:Vtx0"; break;
case TT_FROM_VTX01: strTriangularisation = ", Triang:Vtx1"; break;
case TT_FROM_VTX02: strTriangularisation = ", Triang:Vtx2"; break;
case TT_FROM_VTX03: strTriangularisation = ", Triang:Vtx3"; break;
case TT_FROM_VTX04: strTriangularisation = ", Triang:Vtx4"; break;
case TT_FROM_VTX05: strTriangularisation = ", Triang:Vtx5"; break;
case TT_FROM_VTX06: strTriangularisation = ", Triang:Vtx6"; break;
case TT_FROM_VTX07: strTriangularisation = ", Triang:Vtx7"; break;
case TT_FROM_VTX08: strTriangularisation = ", Triang:Vtx8"; break;
case TT_FROM_VTX09: strTriangularisation = ", Triang:Vtx9"; break;
case TT_FROM_VTX10: strTriangularisation = ", Triang:Vtx10"; break;
case TT_FROM_VTX11: strTriangularisation = ", Triang:Vtx11"; break;
case TT_FROM_VTX12: strTriangularisation = ", Triang:Vtx12"; break;
case TT_FROM_VTX13: strTriangularisation = ", Triang:Vtx13"; break;
case TT_FROM_VTX14: strTriangularisation = ", Triang:Vtx14"; break;
case TT_FROM_VTX15: strTriangularisation = ", Triang:Vtx15"; break;
}
INDEX iAddedAs = m_comboPrimitiveHistory.AddString(CString(
strNo+strDescription+strPosition+strTriangularisation));
m_comboPrimitiveHistory.SetItemData( iAddedAs, (ULONG) &itPrim->pihb_vfpPrimitive);
iCt++;
}
return TRUE;
}
void CDlgPgPrimitive::OnAutoCreateMipBrushes()
{
// move data from page to primitive
UpdateData( TRUE);
// place snapped values back to dialog
UpdateData( FALSE);
}
void CDlgPgPrimitive::OnSelchangeBottomShape()
{
// move data from page to primitive
UpdateData( TRUE);
// place snapped values back to dialog
UpdateData( FALSE);
}
void CDlgPgPrimitive::OnSelchangeTopShape()
{
// move data from page to primitive
UpdateData( TRUE);
// place snapped values back to dialog
UpdateData( FALSE);
}
void CDlgPgPrimitive::OnIfRoom()
{
// move data from page to primitive
UpdateData( TRUE);
// place snapped values back to dialog
UpdateData( FALSE);
}
void CDlgPgPrimitive::OnIfSpiral()
{
// move data from page to primitive
UpdateData( TRUE);
// place snapped values back to dialog
UpdateData( FALSE);
}
void CDlgPgPrimitive::OnIfOuter()
{
// move data from page to primitive
UpdateData( TRUE);
// place snapped values back to dialog
UpdateData( FALSE);
}
void CDlgPgPrimitive::OnSelchangePrimitiveHistory()
{
INDEX iSelected = m_comboPrimitiveHistory.GetCurSel();
if( iSelected == CB_ERR) return;
INDEX iCurrent = 0;
// write history primitives list
FOREACHINLIST( CPrimitiveInHistoryBuffer, pihb_lnNode, theApp.m_lhPrimitiveHistory, itPrim)
{
if( iCurrent == iSelected)
{
theApp.m_vfpCurrent = itPrim->pihb_vfpPrimitive;
break;
}
iCurrent++;
}
CWorldEditorDoc* pDoc = theApp.GetActiveDocument();
ASSERT( pDoc != NULL);
pDoc->ApplyCurrentPrimitiveSettings();
UpdateData( FALSE);
}
void CDlgPgPrimitive::OnDropdownPrimitiveHistory()
{
CRect rectCombo;
m_comboPrimitiveHistory.GetWindowRect( &rectCombo);
PIX pixScreenWidth = ::GetSystemMetrics(SM_CXSCREEN);
m_comboPrimitiveHistory.SetDroppedWidth( pixScreenWidth-rectCombo.left);
}
void CDlgPgPrimitive::OnDisplaceBrowse()
{
CTFileName fnDisplace = _EngineGUI.FileRequester(
"Choose picture for displacement", FILTER_TGA FILTER_PCX FILTER_ALL FILTER_END,
"Displacement pictures directory", "Textures\\",
theApp.m_vfpCurrent.vfp_fnDisplacement.FileName()+
theApp.m_vfpCurrent.vfp_fnDisplacement.FileExt());
if( fnDisplace == "") return;
theApp.m_vfpCurrent.vfp_fnDisplacement = fnDisplace;
_bForceRecreatePrimitive = TRUE;
// move data from page to primitive
UpdateData( TRUE);
// place snapped values back to dialog
UpdateData( FALSE);
}
void CDlgPgPrimitive::OnDisplaceNone()
{
theApp.m_vfpCurrent.vfp_fnDisplacement = CTString( "");
_bForceRecreatePrimitive = TRUE;
// move data from page to primitive
UpdateData( TRUE);
// place snapped values back to dialog
UpdateData( FALSE);
}
void CDlgPgPrimitive::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu menu;
if( menu.LoadMenu(IDR_PRIMITIVE_SETTINGS))
{
CMenu* pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_LEFTALIGN,
point.x, point.y, this);
}
}
void CDlgPgPrimitive::OnLoadPrimitiveSettings()
{
// call file requester for list containing worlds to convert
_fnPrimitiveSettingsSavedAs = _EngineGUI.FileRequester( "Choose file to load primitive settings",
"Primitive settings (*.prm)\0*.prm\0" FILTER_ALL FILTER_END, "Primitive settings", "", "", NULL, TRUE);
if( _fnPrimitiveSettingsSavedAs == "") return;
// read settings to current primitive
CTFileStream strmFile;
try
{
strmFile.Open_t( _fnPrimitiveSettingsSavedAs);
theApp.m_vfpCurrent.Read_t( strmFile);
}
catch( char *strError)
{
WarningMessage( strError);
return;
}
CWorldEditorDoc* pDoc = theApp.GetActiveDocument();
ASSERT( pDoc != NULL);
pDoc->ApplyCurrentPrimitiveSettings();
UpdateData( FALSE);
}
void CDlgPgPrimitive::OnSavePrimitiveSettings()
{
if( _fnPrimitiveSettingsSavedAs == "")
OnSaveAsPrimitiveSettings();
// save current primitive
CTFileStream strmFile;
try
{
strmFile.Create_t( _fnPrimitiveSettingsSavedAs);
theApp.m_vfpCurrent.Write_t( strmFile);
}
catch( char *strError)
{
WarningMessage( strError);
}
}
void CDlgPgPrimitive::OnSaveAsPrimitiveSettings()
{
// call file requester for list containing worlds to convert
_fnPrimitiveSettingsSavedAs = _EngineGUI.FileRequester( "Choose file to load primitive settings",
"Primitive settings (*.prm)\0*.prm\0" FILTER_ALL FILTER_END, "Primitive settings", "", "", NULL, FALSE);
if( _fnPrimitiveSettingsSavedAs == "") return;
OnSavePrimitiveSettings();
}
void CDlgPgPrimitive::OnResetPrimitive()
{
CWorldEditorDoc* pDoc = theApp.GetActiveDocument();
if( pDoc == NULL) return;
pDoc->ResetPrimitive();
}
void CDlgPgPrimitive::OnDropdownTopShape()
{
m_comboTopShape.SetDroppedWidth(256);
}
void CDlgPgPrimitive::OnDropdownBottomShape()
{
m_comboBottomShape.SetDroppedWidth(256);
}