| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- /*
- ** 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/>.
- */
- // TerrainLODPage.cpp : implementation file
- //
- #include "stdafx.h"
- #include "leveledit.h"
- #include "TerrainLODPage.h"
- #include "LODSettingsDialog.H"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- //
- // Constants
- //
- /////////////////////////////////////////////////////////////////////////////
- static const int COL_NAME = 0;
- static const int COL_DISTANCE = 1;
- /////////////////////////////////////////////////////////////////////////////
- //
- // TerrainLODPageClass
- //
- /////////////////////////////////////////////////////////////////////////////
- TerrainLODPageClass::TerrainLODPageClass (void)
- : m_bFinishedInit (false),
- DockableFormClass(TerrainLODPageClass::IDD)
- {
- //{{AFX_DATA_INIT(TerrainLODPageClass)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // ~TerrainLODPageClass
- //
- /////////////////////////////////////////////////////////////////////////////
- TerrainLODPageClass::~TerrainLODPageClass (void)
- {
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // DoDataExchange
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- TerrainLODPageClass::DoDataExchange (CDataExchange *pDX)
- {
- DockableFormClass::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(TerrainLODPageClass)
- DDX_Control(pDX, IDC_LOD_LIST, m_LODListCtrl);
- DDX_Control(pDX, IDC_LOD_COUNT_SPIN, m_LODCountSpin);
- //}}AFX_DATA_MAP
- return ;
- }
- BEGIN_MESSAGE_MAP(TerrainLODPageClass, DockableFormClass)
- //{{AFX_MSG_MAP(TerrainLODPageClass)
- ON_NOTIFY(NM_DBLCLK, IDC_LOD_LIST, OnDblclkLodList)
- ON_EN_UPDATE(IDC_LOD_COUNT_EDIT, OnUpdateLodCountEdit)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // TerrainLODPageClass message handlers
- /////////////////////////////////////////////////////////////////////////////
- //
- // HandleInitDialog
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- TerrainLODPageClass::HandleInitDialog (void)
- {
- //
- // Setup the lod-count controls
- //
- SetDlgItemInt (IDC_LOD_COUNT_EDIT, 0);
- m_LODCountSpin.SetRange (0, 10);
- m_LODCountSpin.SetPos (m_SettingsList.Count ());
- //
- // Setup the list control
- //
- m_LODListCtrl.InsertColumn (COL_NAME, "Level");
- m_LODListCtrl.InsertColumn (COL_DISTANCE, "Switch Distance");
-
- CRect rect;
- m_LODListCtrl.GetClientRect (&rect);
- m_LODListCtrl.SetColumnWidth (COL_NAME, rect.Width () >> 1);
- m_LODListCtrl.SetColumnWidth (COL_DISTANCE, rect.Width () >> 1);
- //
- // Loop through all the distances and add them to the list control.
- //
- for (int index = 0; index < m_SettingsList.Count (); index ++) {
- unsigned int distance = m_SettingsList[index];
-
- CString text;
- text.Format ("LOD %d", index + 1);
- int real_index = m_LODListCtrl.InsertItem (index + 1, text);
- if (real_index >= 0) {
- text.Format ("%d meters", distance);
- m_LODListCtrl.SetItemText (real_index, COL_DISTANCE, text);
- m_LODListCtrl.SetItemData (real_index, distance);
- }
- }
- m_bFinishedInit = true;
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Apply_Changes
- //
- /////////////////////////////////////////////////////////////////////////////
- bool
- TerrainLODPageClass::Apply_Changes (void)
- {
- m_SettingsList.Delete_All ();
- //
- // Build a list of switching distances (could just be an array, but I'm feeling lazy).
- //
- for (int index = 0; index < m_LODListCtrl.GetItemCount (); index ++) {
- m_SettingsList.Add ((unsigned int)m_LODListCtrl.GetItemData (index));
- }
- return true;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnDblclkLodList
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- TerrainLODPageClass::OnDblclkLodList
- (
- NMHDR *pNMHDR,
- LRESULT *pResult
- )
- {
- (*pResult) = 0;
- //
- // Get the index of the selected item
- //
- int index = m_LODListCtrl.GetNextItem (-1, LVNI_ALL | LVNI_SELECTED);
- if (index >= 0) {
- unsigned int distance = (unsigned int)m_LODListCtrl.GetItemData (index);
- //
- // Display the dialog
- //
- LODSettingsDialogClass dialog (distance);
- if (dialog.DoModal () == IDOK) {
- distance = dialog.Get_Distance ();
- //
- // Pass the new distance information onto the list control
- //
- CString text;
- text.Format ("%d meters", distance);
- m_LODListCtrl.SetItemText (index, COL_DISTANCE, text);
- m_LODListCtrl.SetItemData (index, distance);
- }
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // On_Count_Change
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- TerrainLODPageClass::On_Count_Change (void)
- {
- if (m_bFinishedInit) {
- //
- // Get the new count
- //
- int new_lod_count = GetDlgItemInt (IDC_LOD_COUNT_EDIT);
- new_lod_count = max (0, new_lod_count);
-
- //
- // Get the current count
- //
- int current_count = m_LODListCtrl.GetItemCount ();
- //
- // Determine if we should add or remove entries
- //
- if (new_lod_count < current_count) {
-
- //
- // Remove the unnecessary entries from the list control
- //
- for (int index = new_lod_count; index < current_count; index ++) {
- m_LODListCtrl.DeleteItem (new_lod_count);
- }
- } else if (new_lod_count > current_count) {
-
- //
- // Add the new entries to the list control
- //
- for (int index = current_count; index < new_lod_count; index ++) {
- CString name;
- name.Format ("LOD %d", index + 1);
- int real_index = m_LODListCtrl.InsertItem (index + 1, name);
- m_LODListCtrl.SetItemText (real_index, COL_DISTANCE, "0 meters");
- m_LODListCtrl.SetItemData (real_index, 0);
- }
- }
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnUpdateLodCountEdit
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- TerrainLODPageClass::OnUpdateLodCountEdit (void)
- {
- On_Count_Change ();
- return ;
- }
|