Serious-Engine/Sources/WorldEditor/DlgWorldSettings.cpp

352 lines
13 KiB
C++
Raw Normal View History

2016-03-11 14:57:17 +01:00
/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */
// DlgWorldSettings.cpp : implementation file
//
#include "stdafx.h"
#include "DlgWorldSettings.h"
#ifdef _DEBUG
#undef new
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgWorldSettings dialog
CDlgWorldSettings::CDlgWorldSettings(CWnd* pParent /*=NULL*/)
: CDialog(CDlgWorldSettings::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgWorldSettings)
m_fnBackgroundPicture = _T("");
m_strMissionDescription = _T("");
m_fFrontViewCenterX = 0.0f;
m_fFrontViewCenterY = 0.0f;
m_fFrontViewHeight = 0.0f;
m_strFrontViewPicture = _T("");
m_fFrontViewWidth = 0.0f;
m_fRightViewCenterX = 0.0f;
m_fRightViewCenterY = 0.0f;
m_fRightViewHeight = 0.0f;
m_strRightViewPicture = _T("");
m_fRightViewWidth = 0.0f;
m_fTopViewCenterX = 0.0f;
m_fTopViewCenterY = 0.0f;
m_fTopViewHeight = 0.0f;
m_strTopViewPicture = _T("");
m_fTopViewWidth = 0.0f;
m_strBackdropObject = _T("");
m_strLevelName = _T("");
//}}AFX_DATA_INIT
}
#define DDX_SPAWN_FLAG_GET(mask, ctrl) \
if( ulSpawnFlags & (mask)) {\
((CButton *)GetDlgItem( ctrl))->SetCheck( TRUE);\
} else {\
((CButton *)GetDlgItem( ctrl))->SetCheck( FALSE);}
#define DDX_SPAWN_FLAG_SET(mask, ctrl) \
if( ((CButton *)GetDlgItem( ctrl) )->GetCheck() == 1) {\
ulSpawnFlags |= (mask);\
} else {\
ulSpawnFlags &= ~(mask);\
}
void CDlgWorldSettings::DoDataExchange(CDataExchange* pDX)
{
// if dialog is recieving data
if( pDX->m_bSaveAndValidate == FALSE)
{
if( m_fnBackgroundPicture == "")
{
// disable ok button
//GetDlgItem( IDOK)->EnableWindow( FALSE);
}
CWorldEditorDoc *pDoc = theApp.GetDocument();
// obtain data for pictures used as view background
m_strTopViewPicture = pDoc->m_woWorld.wo_strBackdropUp;
m_fTopViewWidth = pDoc->m_woWorld.wo_fUpW;
m_fTopViewHeight = pDoc->m_woWorld.wo_fUpL;
m_fTopViewCenterX = pDoc->m_woWorld.wo_fUpCX;
m_fTopViewCenterY = pDoc->m_woWorld.wo_fUpCZ;
m_strFrontViewPicture = pDoc->m_woWorld.wo_strBackdropFt;
m_fFrontViewWidth = pDoc->m_woWorld.wo_fFtW;
m_fFrontViewHeight = pDoc->m_woWorld.wo_fFtH;
m_fFrontViewCenterX = pDoc->m_woWorld.wo_fFtCX;
m_fFrontViewCenterY = pDoc->m_woWorld.wo_fFtCY;
m_strRightViewPicture = pDoc->m_woWorld.wo_strBackdropRt;
m_fRightViewWidth = pDoc->m_woWorld.wo_fRtL;
m_fRightViewHeight = pDoc->m_woWorld.wo_fRtH;
m_fRightViewCenterX = pDoc->m_woWorld.wo_fRtCZ;
m_fRightViewCenterY = pDoc->m_woWorld.wo_fRtCY;
m_strBackdropObject = pDoc->m_woWorld.wo_strBackdropObject;
m_strLevelName = pDoc->m_woWorld.GetName();
// get spawn flags
ULONG ulSpawnFlags = pDoc->m_woWorld.GetSpawnFlags();
DDX_SPAWN_FLAG_GET( SPF_EASY, IDC_EASY);
DDX_SPAWN_FLAG_GET( SPF_NORMAL, IDC_NORMAL);
DDX_SPAWN_FLAG_GET( SPF_HARD, IDC_HARD);
DDX_SPAWN_FLAG_GET( SPF_EXTREME, IDC_EXTREME);
DDX_SPAWN_FLAG_GET( SPF_EXTREME<<1, IDC_DIFFICULTY_1B);
DDX_SPAWN_FLAG_GET( SPF_EXTREME<<2, IDC_DIFFICULTY_2B);
DDX_SPAWN_FLAG_GET( SPF_EXTREME<<3, IDC_DIFFICULTY_3B);
DDX_SPAWN_FLAG_GET( SPF_EXTREME<<4, IDC_DIFFICULTY_4B);
DDX_SPAWN_FLAG_GET( SPF_EXTREME<<5, IDC_DIFFICULTY_5B);
DDX_SPAWN_FLAG_GET( SPF_SINGLEPLAYER, IDC_SINGLE);
DDX_SPAWN_FLAG_GET( SPF_DEATHMATCH, IDC_DEATHMATCH);
DDX_SPAWN_FLAG_GET( SPF_COOPERATIVE, IDC_COOPERATIVE);
DDX_SPAWN_FLAG_GET( SPF_COOPERATIVE<<1, IDC_GAME_MODE_1B);
DDX_SPAWN_FLAG_GET( SPF_COOPERATIVE<<2, IDC_GAME_MODE_2B);
DDX_SPAWN_FLAG_GET( SPF_COOPERATIVE<<3, IDC_GAME_MODE_3B);
DDX_SPAWN_FLAG_GET( SPF_COOPERATIVE<<4, IDC_GAME_MODE_4B);
DDX_SPAWN_FLAG_GET( SPF_COOPERATIVE<<5, IDC_GAME_MODE_5B);
DDX_SPAWN_FLAG_GET( SPF_COOPERATIVE<<6, IDC_GAME_MODE_6B);
}
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgWorldSettings)
DDX_Control(pDX, IDC_BACKGROUND_COLOR, m_BackgroundColor);
DDX_Text(pDX, IDC_PICTURE_FILE_T, m_fnBackgroundPicture);
DDX_Text(pDX, IDC_MISSION_DESCRIPTION, m_strMissionDescription);
DDX_Text(pDX, IDC_FRONT_VIEW_CENTER_X, m_fFrontViewCenterX);
DDX_Text(pDX, IDC_FRONT_VIEW_CENTER_Y, m_fFrontViewCenterY);
DDX_Text(pDX, IDC_FRONT_VIEW_HEIGHT, m_fFrontViewHeight);
DDX_Text(pDX, IDC_FRONT_VIEW_PICTURE_T, m_strFrontViewPicture);
DDX_Text(pDX, IDC_FRONT_VIEW_WIDTH, m_fFrontViewWidth);
DDX_Text(pDX, IDC_RIGHT_VIEW_CENTER_X, m_fRightViewCenterX);
DDX_Text(pDX, IDC_RIGHT_VIEW_CENTER_Y, m_fRightViewCenterY);
DDX_Text(pDX, IDC_RIGHT_VIEW_HEIGHT, m_fRightViewHeight);
DDX_Text(pDX, IDC_RIGHT_VIEW_PICTURE_T, m_strRightViewPicture);
DDX_Text(pDX, IDC_RIGHT_VIEW_WIDTH, m_fRightViewWidth);
DDX_Text(pDX, IDC_TOP_VIEW_CENTER_X, m_fTopViewCenterX);
DDX_Text(pDX, IDC_TOP_VIEW_CENTER_Y, m_fTopViewCenterY);
DDX_Text(pDX, IDC_TOP_VIEW_HEIGHT, m_fTopViewHeight);
DDX_Text(pDX, IDC_TOP_VIEW_PICTURE_T, m_strTopViewPicture);
DDX_Text(pDX, IDC_TOP_VIEW_WIDTH, m_fTopViewWidth);
DDX_Text(pDX, IDC_BACKDROP_OBJECT_T, m_strBackdropObject);
DDX_Text(pDX, IDC_EDIT_LEVEL_NAME, m_strLevelName);
//}}AFX_DATA_MAP
// if dialog is giving data
if( pDX->m_bSaveAndValidate != FALSE)
{
CWorldEditorDoc *pDoc = theApp.GetDocument();
pDoc->m_woWorld.wo_strBackdropUp = CStringA(m_strTopViewPicture);
pDoc->m_woWorld.wo_fUpW = m_fTopViewWidth;
pDoc->m_woWorld.wo_fUpL = m_fTopViewHeight;
pDoc->m_woWorld.wo_fUpCX = m_fTopViewCenterX;
pDoc->m_woWorld.wo_fUpCZ = m_fTopViewCenterY;
pDoc->m_woWorld.wo_strBackdropFt = CStringA(m_strFrontViewPicture);
pDoc->m_woWorld.wo_fFtW = m_fFrontViewWidth;
pDoc->m_woWorld.wo_fFtH = m_fFrontViewHeight;
pDoc->m_woWorld.wo_fFtCX = m_fFrontViewCenterX;
pDoc->m_woWorld.wo_fFtCY = m_fFrontViewCenterY;
pDoc->m_woWorld.wo_strBackdropRt = CStringA(m_strRightViewPicture);
pDoc->m_woWorld.wo_fRtL = m_fRightViewWidth;
pDoc->m_woWorld.wo_fRtH = m_fRightViewHeight;
pDoc->m_woWorld.wo_fRtCZ = m_fRightViewCenterX;
pDoc->m_woWorld.wo_fRtCY = m_fRightViewCenterY;
pDoc->m_woWorld.wo_strBackdropObject = CStringA(m_strBackdropObject);
// try to load object for backdrops
if( pDoc->m_woWorld.wo_strBackdropObject != "")
{
// try to
try
{
pDoc->m_o3dBackdropObject.Clear();
// load 3D object
FLOATmatrix3D mStretch;
mStretch.Diagonal(1.0f);
pDoc->m_o3dBackdropObject.LoadAny3DFormat_t( pDoc->m_woWorld.wo_strBackdropObject, mStretch);
}
// catch and
catch( char *strError)
{
// report errors
AfxMessageBox( CString(strError));
return;
}
}
if( m_fnBackgroundPicture != "")
{
theApp.WriteProfileString( L"World editor prefs", L"Default background picture",
m_fnBackgroundPicture);
}
char chrColor[ 16];
sprintf( chrColor, "0x%08x", m_BackgroundColor.GetColor());
_strupr( chrColor);
theApp.WriteProfileString( L"World editor prefs", L"Default background color", CString(chrColor));
pDoc->m_woWorld.SetName( CTString(CStringA(m_strLevelName)));
// apply new spawn flags
ULONG ulSpawnFlags = 0;
DDX_SPAWN_FLAG_SET( SPF_EASY, IDC_EASY);
DDX_SPAWN_FLAG_SET( SPF_NORMAL, IDC_NORMAL);
DDX_SPAWN_FLAG_SET( SPF_HARD, IDC_HARD);
DDX_SPAWN_FLAG_SET( SPF_EXTREME, IDC_EXTREME);
DDX_SPAWN_FLAG_SET( SPF_EXTREME<<1, IDC_DIFFICULTY_1B);
DDX_SPAWN_FLAG_SET( SPF_EXTREME<<2, IDC_DIFFICULTY_2B);
DDX_SPAWN_FLAG_SET( SPF_EXTREME<<3, IDC_DIFFICULTY_3B);
DDX_SPAWN_FLAG_SET( SPF_EXTREME<<4, IDC_DIFFICULTY_4B);
DDX_SPAWN_FLAG_SET( SPF_EXTREME<<5, IDC_DIFFICULTY_5B);
DDX_SPAWN_FLAG_SET( SPF_SINGLEPLAYER, IDC_SINGLE);
DDX_SPAWN_FLAG_SET( SPF_DEATHMATCH, IDC_DEATHMATCH);
DDX_SPAWN_FLAG_SET( SPF_COOPERATIVE, IDC_COOPERATIVE);
DDX_SPAWN_FLAG_SET( SPF_COOPERATIVE<<1, IDC_GAME_MODE_1B);
DDX_SPAWN_FLAG_SET( SPF_COOPERATIVE<<2, IDC_GAME_MODE_2B);
DDX_SPAWN_FLAG_SET( SPF_COOPERATIVE<<3, IDC_GAME_MODE_3B);
DDX_SPAWN_FLAG_SET( SPF_COOPERATIVE<<4, IDC_GAME_MODE_4B);
DDX_SPAWN_FLAG_SET( SPF_COOPERATIVE<<5, IDC_GAME_MODE_5B);
DDX_SPAWN_FLAG_SET( SPF_COOPERATIVE<<6, IDC_GAME_MODE_6B);
pDoc->m_woWorld.SetSpawnFlags(ulSpawnFlags);
}
}
BEGIN_MESSAGE_MAP(CDlgWorldSettings, CDialog)
//{{AFX_MSG_MAP(CDlgWorldSettings)
ON_BN_CLICKED(IDC_BROWSE_BACKGROUND_PICTURE, OnBrowseBackgroundPicture)
ON_BN_CLICKED(IDC_BROWSE_FRONT_VIEW_PICTURE, OnBrowseFrontViewPicture)
ON_BN_CLICKED(IDC_BROWSE_RIGHT_VIEW_PICTURE, OnBrowseRightViewPicture)
ON_BN_CLICKED(IDC_BROWSE_TOP_VIEW_PICTURE, OnBrowseTopViewPicture)
ON_BN_CLICKED(IDC_BROWSE_BACKDROP_OBJECT, OnBrowseBackdropObject)
ON_BN_CLICKED(ID_APPLY, OnApply)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgWorldSettings message handlers
void CDlgWorldSettings::OnBrowseBackgroundPicture()
{
CTFileName fnChoosedFile = _EngineGUI.FileRequester( "Select background texture",
FILTER_TEX FILTER_ALL FILTER_END, KEY_NAME_BACKGROUND_TEXTURE_DIR, "Textures\\Background");
if( fnChoosedFile == "") return;
// substract last two letters of background's file name
char achrShortenedBcgName[ PATH_MAX];
strcpy( achrShortenedBcgName, fnChoosedFile.FileDir()+fnChoosedFile.FileName());
// there must be at least two letters in selected texture name
if( strlen( achrShortenedBcgName) > 2)
{
// shorten file name for two letters
achrShortenedBcgName[ strlen( achrShortenedBcgName)-2] = 0;
// assign new background texture name
m_fnBackgroundPicture = CTString(achrShortenedBcgName)+fnChoosedFile.FileExt();
}
// enable ok button
//GetDlgItem( IDOK)->EnableWindow( TRUE);
UpdateData( FALSE);
}
// setups background settings dialog
void CDlgWorldSettings::SetupBcgSettings( BOOL bOnNewDocument)
{
char chrColor[ 16];
COLOR colBackground;
// if change bcg settings dialog was called on new document
if( bOnNewDocument)
{
// obtain background color form INI file
strcpy( chrColor, CStringA(theApp.GetProfileString( L"World editor prefs",
L"Default background color", L"0XFF000000")));
sscanf( chrColor, "0X%08x", &colBackground);
// set background color to color button
m_BackgroundColor.SetColor( colBackground);
// set default texture for background
m_fnBackgroundPicture = "Textures\\Editor\\Default.tex";
// set default mission description
m_strMissionDescription = "No mission description";
}
else
{
CWorldEditorDoc *pDoc = theApp.GetDocument();
// obtain picture used for background from world
m_fnBackgroundPicture = CTString(); //!!!!pDoc->m_woWorld.GetBackgroundTexture();
// set world's background color to color button
m_BackgroundColor.SetColor( pDoc->m_woWorld.GetBackgroundColor());
// pick-up mission description from world
m_strMissionDescription = pDoc->m_woWorld.GetDescription();
}
}
BOOL CDlgWorldSettings::OnInitDialog()
{
CDialog::OnInitDialog();
// call MFC color picker (windows)
m_BackgroundColor.SetPickerType( CColoredButton::PT_MFC);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDlgWorldSettings::OnBrowseTopViewPicture()
{
CTFileName fnPicture = _EngineGUI.FileRequester( "Picture for top view",
FILTER_PICTURES FILTER_ALL FILTER_END, "Picture for view directory", "");
if( fnPicture == "") return;
GetDlgItem( IDC_TOP_VIEW_PICTURE_T)->SetWindowText( CString(fnPicture));
m_strTopViewPicture = fnPicture;
CWorldEditorDoc *pDoc = theApp.GetDocument();
pDoc->SetupBackdropTextureObject( CTString(CStringA(m_strTopViewPicture)), pDoc->m_toBackdropUp);
}
void CDlgWorldSettings::OnBrowseFrontViewPicture()
{
CTFileName fnPicture = _EngineGUI.FileRequester( "Picture for front view",
FILTER_PICTURES FILTER_ALL FILTER_END, "Picture for view directory", "");
if( fnPicture == "") return;
GetDlgItem( IDC_FRONT_VIEW_PICTURE_T)->SetWindowText( CString(fnPicture));
m_strFrontViewPicture = fnPicture;
CWorldEditorDoc *pDoc = theApp.GetDocument();
pDoc->SetupBackdropTextureObject( CTString(CStringA(m_strFrontViewPicture)), pDoc->m_toBackdropFt);
}
void CDlgWorldSettings::OnBrowseRightViewPicture()
{
CTFileName fnPicture = _EngineGUI.FileRequester( "Picture for right view",
FILTER_PICTURES FILTER_ALL FILTER_END, "Picture for view directory", "");
if( fnPicture == "") return;
GetDlgItem( IDC_RIGHT_VIEW_PICTURE_T)->SetWindowText( CString(fnPicture));
m_strRightViewPicture = fnPicture;
CWorldEditorDoc *pDoc = theApp.GetDocument();
pDoc->SetupBackdropTextureObject( CTString(CStringA(m_strRightViewPicture)), pDoc->m_toBackdropRt);
}
void CDlgWorldSettings::OnBrowseBackdropObject()
{
CTFileName fnObject = _EngineGUI.FileRequester( "Select background object",
FILTER_3DOBJ FILTER_LWO FILTER_OBJ FILTER_3DS FILTER_ALL FILTER_END, "Backdrop object directory", "");
if( fnObject == "") return;
GetDlgItem( IDC_BACKDROP_OBJECT_T)->SetWindowText( CString(fnObject));
m_strBackdropObject = fnObject;
}
void CDlgWorldSettings::OnOK()
{
}
void CDlgWorldSettings::OnApply()
{
CDialog::OnOK();
}