This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Tools/LevelEdit/HeightfieldMaterialSettingsDialog.cpp

214 lines
5.6 KiB
C++

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** 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, see <http://www.gnu.org/licenses/>.
*/
// HeightfieldMaterialSettingsDialog.cpp : implementation file
//
#include "stdafx.h"
#include "leveledit.h"
#include "heightfieldmaterialsettingsdialog.h"
#include "heightfieldeditor.h"
#include "terrainmaterial.h"
#include "utils.h"
#include "filemgr.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
// HeightfieldMaterialSettingsDialogClass
//
/////////////////////////////////////////////////////////////////////////////
HeightfieldMaterialSettingsDialogClass::HeightfieldMaterialSettingsDialogClass (CWnd *pParent) :
MaterialIndex (0),
CDialog(HeightfieldMaterialSettingsDialogClass::IDD, pParent)
{
//{{AFX_DATA_INIT(HeightfieldMaterialSettingsDialogClass)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// DoDataExchange
//
/////////////////////////////////////////////////////////////////////////////
void
HeightfieldMaterialSettingsDialogClass::DoDataExchange (CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(HeightfieldMaterialSettingsDialogClass)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
return ;
}
BEGIN_MESSAGE_MAP(HeightfieldMaterialSettingsDialogClass, CDialog)
//{{AFX_MSG_MAP(HeightfieldMaterialSettingsDialogClass)
ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// OnInitDialog
//
/////////////////////////////////////////////////////////////////////////////
BOOL
HeightfieldMaterialSettingsDialogClass::OnInitDialog (void)
{
CDialog::OnInitDialog ();
//
// Lookup the material we're editing
//
TerrainMaterialClass *material = HeightfieldEditorClass::Peek_Material (MaterialIndex);
if (material != NULL) {
//
// Fill in the controls
//
SetDlgItemText (IDC_TEXTURE_FILENAME, material->Get_Texture_Name ());
::SetDlgItemFloat (m_hWnd, IDC_METERS_PER_TILE_EDIT, material->Get_Meters_Per_Tile ());
CheckDlgButton (IDC_MIRROR_CHECK, material->Are_UVs_Mirrored ());
//
// Select the right surface type
//
SendDlgItemMessage (IDC_SURFACE_TYPE_COMBO, CB_SETCURSEL, material->Get_Surface_Type (), 0L);
} else {
::SetDlgItemFloat (m_hWnd, IDC_METERS_PER_TILE_EDIT, 10.0F);
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnOK
//
/////////////////////////////////////////////////////////////////////////////
void
HeightfieldMaterialSettingsDialogClass::OnOK (void)
{
bool is_ok = true;
//
// Get the texture path
//
CString texture_path;
GetDlgItemText (IDC_TEXTURE_FILENAME, texture_path);
//
// Is the texture path valid?
//
bool is_rel_path = ::Is_Path_Relative (texture_path);
if ((is_rel_path == true) || ((is_rel_path == false) && ::Get_File_Mgr ()->Is_Path_Valid (texture_path))) {
float meters_per_tile = ::GetDlgItemFloat (m_hWnd, IDC_METERS_PER_TILE_EDIT);
//
// Get (or create) the material we're editing
//
TerrainMaterialClass *material = HeightfieldEditorClass::Peek_Material (MaterialIndex);
if (material == NULL) {
//
// Create the material and add it to the manager
//
material = new TerrainMaterialClass;
HeightfieldEditorClass::Set_Material (MaterialIndex, material);
material->Release_Ref ();
}
//
// Configure the material
//
material->Set_Texture (texture_path);
material->Set_Meters_Per_Tile (meters_per_tile);
material->Mirror_UVs (IsDlgButtonChecked (IDC_MIRROR_CHECK) == 1);
material->Set_Surface_Type (SendDlgItemMessage (IDC_SURFACE_TYPE_COMBO, CB_GETCURSEL));
} else {
//
// Let the user know this path is invalid
//
CString message;
CString title;
message.Format (IDS_INVALID_MODEL_PATH_MSG, (LPCTSTR)::Get_File_Mgr()->Get_Base_Path ());
title.LoadString (IDS_INVALID_MODEL_PATH_TITLE);
::MessageBox (m_hWnd, message, title, MB_ICONERROR | MB_OK);
is_ok = false;
}
if (is_ok) {
CDialog::OnOK ();
}
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnBrowse
//
/////////////////////////////////////////////////////////////////////////////
void
HeightfieldMaterialSettingsDialogClass::OnBrowse (void)
{
//
// Get the current texture path
//
CString texture_path;
GetDlgItemText (IDC_TEXTURE_FILENAME, texture_path);
CFileDialog dialog (TRUE, ".tga", texture_path,
OFN_HIDEREADONLY | OFN_EXPLORER,
"Texture Files (*.tga)|*.tga||", ::AfxGetMainWnd ());
//
// Ask the user what texture they wish to use
//
if (dialog.DoModal () == IDOK) {
//
// Reset the texture filename as a "relative" path
//
CString full_texture_path = dialog.GetPathName ();
CString rel_texture_path = ::Get_File_Mgr ()->Make_Relative_Path (full_texture_path);
SetDlgItemText (IDC_TEXTURE_FILENAME, rel_texture_path);
}
return ;
}