| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642 |
- /*
- ** 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/>.
- */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project Name : commando *
- * *
- * $Archive:: /Commando/Code/Commando/dlgconfigperformancetab.cpp $*
- * *
- * Author:: Patrick Smith *
- * *
- * $Modtime:: 1/08/02 3:03p $*
- * *
- * $Revision:: 11 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "dlgconfigperformancetab.h"
- #include "resource.h"
- #include "registry.h"
- #include "comboboxctrl.h"
- #include "sliderctrl.h"
- #include "rendobj.h"
- #include "phys.h"
- #include "ww3d.h"
- #include "pscene.h"
- #include "combat.h"
- #include "dx8wrapper.h"
- #include "dx8caps.h"
- #include "surfaceeffects.h"
- #include "_globals.h"
- #include "translatedb.h"
- #include "string_ids.h"
- /////////////////////////////////////////////////////////////////////////////
- // Structures and typedefs
- /////////////////////////////////////////////////////////////////////////////
- typedef struct _PERFORMANCE_SETTING
- {
- int ctrl_id;
- int value;
- } PERFORMANCE_SETTING;
- /////////////////////////////////////////////////////////////////////////////
- // Constants
- /////////////////////////////////////////////////////////////////////////////
- const int MAX_PERFORMANCE_LEVELS = 4;
- const int MAX_EXPERT_OPTIONS = 7;
- PERFORMANCE_SETTING _PerformanceLevels[MAX_PERFORMANCE_LEVELS][MAX_EXPERT_OPTIONS] =
- {
- //
- // Low detail
- //
- {
- {IDC_CHAR_SHADOWS_SLIDER, 0},
- {IDC_TEXTURE_DETAIL_SLIDER, 0},
- {IDC_PARTICLE_DETAIL_SLIDER, 0},
- {IDC_SURFACE_DETAIL_SLIDER, 0},
- {IDC_GEOMETRY_DETAIL_SLIDER, 0},
- {IDC_TERRAIN_SHADOW_CHECK, 0},
- {IDC_NPATCH_CHECK, 0}
- },
- {
- {IDC_CHAR_SHADOWS_SLIDER, 1},
- {IDC_TEXTURE_DETAIL_SLIDER, 1},
- {IDC_PARTICLE_DETAIL_SLIDER, 0},
- {IDC_SURFACE_DETAIL_SLIDER, 0},
- {IDC_GEOMETRY_DETAIL_SLIDER, 0},
- {IDC_TERRAIN_SHADOW_CHECK, 0},
- {IDC_NPATCH_CHECK, 0}
- },
- {
- {IDC_CHAR_SHADOWS_SLIDER, 2},
- {IDC_TEXTURE_DETAIL_SLIDER, 2},
- {IDC_PARTICLE_DETAIL_SLIDER, 1},
- {IDC_SURFACE_DETAIL_SLIDER, 1},
- {IDC_GEOMETRY_DETAIL_SLIDER, 1},
- {IDC_TERRAIN_SHADOW_CHECK, 1},
- {IDC_NPATCH_CHECK, 0}
- },
- //
- // High detail
- //
- {
- {IDC_CHAR_SHADOWS_SLIDER, 3},
- {IDC_TEXTURE_DETAIL_SLIDER, 2},
- {IDC_PARTICLE_DETAIL_SLIDER, 2},
- {IDC_SURFACE_DETAIL_SLIDER, 2},
- {IDC_GEOMETRY_DETAIL_SLIDER, 2},
- {IDC_TERRAIN_SHADOW_CHECK, 1},
- {IDC_NPATCH_CHECK, 0}
- },
- };
- const char *VALUE_NAME_DYN_LOD = "Dynamic_LOD_Budget";
- const char *VALUE_NAME_STATIC_LOD = "Static_LOD_Budget";
- const char *VALUE_NAME_DYN_SHADOWS = "Dynamic_Projectors";
- const char *VALUE_NAME_SHADOW_MODE = "Shadow_Mode";
- const char *VALUE_NAME_STATIC_SHADOWS = "Static_Projectors";
- const char *VALUE_NAME_TEXTURE_RES = "Texture_Resolution";
- const char *VALUE_NAME_PARTICLE_DETAIL = "Particle_Detail";
- const char *VALUE_NAME_NPATCHES = "NPatches";
- const int MAX_LOD_HIGH = 10000;
- const int MAX_LOD_MED = 5000;
- const int MAX_LOD_LOW = 0;
- ////////////////////////////////////////////////////////////////
- //
- // DlgConfigPerformanceTabClass
- //
- ////////////////////////////////////////////////////////////////
- DlgConfigPerformanceTabClass::DlgConfigPerformanceTabClass (void) :
- ChildDialogClass (IDD_CONFIG_PERFORMANCE)
- {
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // ~DlgConfigPerformanceTabClass
- //
- ////////////////////////////////////////////////////////////////
- DlgConfigPerformanceTabClass::~DlgConfigPerformanceTabClass (void)
- {
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // On_Init_Dialog
- //
- ////////////////////////////////////////////////////////////////
- void
- DlgConfigPerformanceTabClass::On_Init_Dialog (void)
- {
- //
- // Configure the dialog controls
- //
- Setup_Controls ();
- Load_Values ();
- Determine_Performance_Setting ();
- //
- // Set the visibility of the expert windows controls
- //
- Build_Expert_Window_List ();
- Display_Expert_Settings (false);
- ChildDialogClass::On_Init_Dialog ();
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Build_Expert_Window_List
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- DlgConfigPerformanceTabClass::Build_Expert_Window_List (void)
- {
- ExpertWindowList.Delete_All ();
- //
- // Find the y-position of the expert mode checkbox
- //
- RectClass rect = Get_Dlg_Item (IDC_EXPERT_CHECK)->Get_Window_Rect ();
- float y_pos = rect.Top;
- //
- // Loop over all the controls of the dialog
- //
- for ( int index = 0; index < Get_Control_Count (); index ++) {
- DialogControlClass *control = Get_Control (index);
- //
- // If this control is below the expert checkbox then its
- // part of the expert settings
- //
- rect = control->Get_Window_Rect ();
- if (rect.Top > y_pos) {
- ExpertWindowList.Add (control);
- }
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Display_Expert_Settings
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- DlgConfigPerformanceTabClass::Display_Expert_Settings (bool onoff)
- {
- //
- // Loop over all the expert settings controls and either
- // show or hide them...
- //
- for (int index = 0; index < ExpertWindowList.Count (); index ++) {
- ExpertWindowList[index]->Show (onoff);
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Setup_Controls
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- DlgConfigPerformanceTabClass::Setup_Controls (void)
- {
- //
- // Configure the main performance slider
- //
- SliderCtrlClass *performance_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_PERFORMANCE_SLIDER);
- performance_slider->Set_Range (0, MAX_PERFORMANCE_LEVELS - 1);
- //
- // Configure the individual detail-setting sliders
- //
- ((SliderCtrlClass *)Get_Dlg_Item (IDC_GEOMETRY_DETAIL_SLIDER))->Set_Range (0, 2);
- ((SliderCtrlClass *)Get_Dlg_Item (IDC_CHAR_SHADOWS_SLIDER))->Set_Range (0, 3);
- ((SliderCtrlClass *)Get_Dlg_Item (IDC_TEXTURE_DETAIL_SLIDER))->Set_Range (0, 2);
- ((SliderCtrlClass *)Get_Dlg_Item (IDC_SURFACE_DETAIL_SLIDER))->Set_Range (0, 2);
- ((SliderCtrlClass *)Get_Dlg_Item (IDC_PARTICLE_DETAIL_SLIDER))->Set_Range (0, 2);
- const WCHAR *PRELIT_MODE_NAMES[] =
- {
- TRANSLATE (IDS_MENU_VERTEX),
- TRANSLATE (IDS_MENU_MP_LIGHTMAPS),
- TRANSLATE (IDS_MENU_MT_LIGHTMAPS)
- };
-
- Set_Dlg_Item_Text (IDC_LIGHTING_MODE, PRELIT_MODE_NAMES [WW3D::Get_Prelit_Mode()]);
- Enable_Dlg_Item (IDC_LIGHTING_MODE, false);
- const WCHAR *TEXTURE_FILTER_NAMES[] =
- {
- TRANSLATE (IDS_BILINEAR),
- TRANSLATE (IDS_TRILINEAR),
- TRANSLATE (IDS_ANISOTROPIC)
- };
- Set_Dlg_Item_Text (IDC_TEXTURE_FILTER, TEXTURE_FILTER_NAMES [WW3D::Get_Texture_Filter()]);
- Enable_Dlg_Item (IDC_TEXTURE_FILTER, false);
- //
- // Disable the checkbox if NPatches aren't supported
- //
- if (DX8Wrapper::Get_Current_Caps() && DX8Wrapper::Get_Current_Caps()->Support_NPatches () == false) {
- Check_Dlg_Button (IDC_NPATCH_CHECK, false);
- Enable_Dlg_Item (IDC_NPATCH_CHECK, false);
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Load_Values
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- DlgConfigPerformanceTabClass::Load_Values (void)
- {
- SliderCtrlClass *geometry_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_GEOMETRY_DETAIL_SLIDER);
- SliderCtrlClass *char_shadows_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_CHAR_SHADOWS_SLIDER);
- SliderCtrlClass *texture_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_TEXTURE_DETAIL_SLIDER);
- SliderCtrlClass *surface_effect_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_SURFACE_DETAIL_SLIDER);
- SliderCtrlClass *particle_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_PARTICLE_DETAIL_SLIDER);
- //
- // Attempt to open the registry key
- //
- RegistryClass registry (APPLICATION_SUB_KEY_NAME_SYSTEM_SETTINGS);
- if (registry.Is_Valid ()) {
- //
- // Read the values from the registry
- //
- int static_shadows = registry.Get_Int (VALUE_NAME_STATIC_SHADOWS, 1);
- int shadow_mode = registry.Get_Int (VALUE_NAME_SHADOW_MODE, PhysicsSceneClass::SHADOW_MODE_BLOBS_PLUS);
- int texture_red = registry.Get_Int (VALUE_NAME_TEXTURE_RES, 0);
- int particle_detail = registry.Get_Int (VALUE_NAME_PARTICLE_DETAIL, 1);
- int npatches = registry.Get_Int (VALUE_NAME_NPATCHES, 0);
- //
- // Get the surface effect mode
- //
- int surface_effect = SurfaceEffectsManager::Get_Mode ();
- //
- // Get the LOD settings
- //
- int dynamic_lod = 0;
- int static_lod = 0;
- PhysicsSceneClass::Get_Instance()->Get_Polygon_Budgets (&static_lod, &dynamic_lod);
- //
- // Set the slider's positions to reflect the loaded values
- //
- char_shadows_slider->Set_Pos (min (shadow_mode, 3));
- texture_slider->Set_Pos (max (2 - texture_red, 0));
- surface_effect_slider->Set_Pos (surface_effect);
- particle_slider->Set_Pos (particle_detail);
- //
- // Choose a setting for the geometry slider based on
- // the dynamic and static LOD budgets
- //
- if (dynamic_lod < (MAX_LOD_LOW + 1000)) {
- geometry_slider->Set_Pos (0);
- } else if (dynamic_lod <= MAX_LOD_MED) {
- geometry_slider->Set_Pos (1);
- } else {
- geometry_slider->Set_Pos (2);
- }
- //
- // Check the checkbox controls (if necessary)
- //
- Check_Dlg_Button (IDC_TERRAIN_SHADOW_CHECK, bool(static_shadows != 0));
- Check_Dlg_Button (IDC_NPATCH_CHECK, bool(npatches != 0));
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Determine_Performance_Setting
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- DlgConfigPerformanceTabClass::Determine_Performance_Setting (void)
- {
- float option_levels[MAX_EXPERT_OPTIONS] = { 0 };
- int count_per_option[MAX_EXPERT_OPTIONS] = { 0 };
- //
- // Get the current values of each setting
- //
- DynamicVectorClass<int> option_values;
- Get_Settings (option_values);
- //
- // Find out which level each option is currently set at
- //
- for (int level = MAX_PERFORMANCE_LEVELS - 1; level >= 0; level --) {
- for (int index = 0; index < MAX_EXPERT_OPTIONS; index ++) {
- //
- // If the values match, then record the current level for this option
- //
- if (option_values[index] == _PerformanceLevels[level][index].value) {
- option_levels[index] += level;
- count_per_option[index] ++;
- }
- }
- }
- //
- // Add up all the levels
- //
- float level_sum = 0;
- for (int index = 0; index < MAX_EXPERT_OPTIONS; index ++) {
- level_sum += (option_levels[index] / count_per_option[index]);
- }
- //
- // Take the average rating
- //
- float level_rating = level_sum / MAX_EXPERT_OPTIONS;
- //
- // Set the slider's position
- //
- SliderCtrlClass *slider_ctrl = (SliderCtrlClass *)Get_Dlg_Item (IDC_PERFORMANCE_SLIDER);
- slider_ctrl->Set_Pos (min (int(level_rating + 0.4F), MAX_EXPERT_OPTIONS - 1), false);
- return ;
- }
- //////////////////////////////////////////////////////////////////////
- //
- // On_Command
- //
- //////////////////////////////////////////////////////////////////////
- void
- DlgConfigPerformanceTabClass::On_Command (int ctrl_id, int message_id, DWORD param)
- {
- switch (ctrl_id)
- {
- case IDC_EXPERT_CHECK:
- {
- bool enabled = Is_Dlg_Button_Checked (IDC_EXPERT_CHECK);
- Display_Expert_Settings (enabled);
- break;
- }
- }
- ChildDialogClass::On_Command (ctrl_id, message_id, param);
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Get_Settings
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- DlgConfigPerformanceTabClass::Get_Settings (DynamicVectorClass<int> &settings)
- {
- //
- // Determine what the value of each control is
- //
- for (int index = 0; index < MAX_EXPERT_OPTIONS; index ++) {
- //
- // Determine what the value of this control is
- //
- int curr_value = 0;
- int ctrl_id = _PerformanceLevels[0][index].ctrl_id;
- switch (ctrl_id) {
- //
- // Read any of the slider positions
- //
- case IDC_GEOMETRY_DETAIL_SLIDER:
- case IDC_CHAR_SHADOWS_SLIDER:
- case IDC_TEXTURE_DETAIL_SLIDER:
- case IDC_PARTICLE_DETAIL_SLIDER:
- case IDC_SURFACE_DETAIL_SLIDER:
- {
- SliderCtrlClass *slider_ctrl = (SliderCtrlClass *)Get_Dlg_Item (ctrl_id);
- curr_value = slider_ctrl->Get_Pos ();
- break;
- }
- //
- // Read the values from either checkbox
- //
- case IDC_TERRAIN_SHADOW_CHECK:
- case IDC_NPATCH_CHECK:
- curr_value = Is_Dlg_Button_Checked (ctrl_id);
- break;
- }
- //
- // Add this value to the list
- //
- settings.Add (curr_value);
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Update_Expert_Controls
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- DlgConfigPerformanceTabClass::Update_Expert_Controls (int level)
- {
- for (int index = 0; index < MAX_EXPERT_OPTIONS; index ++) {
- //
- // Determine which control we are updating
- //
- int ctrl_id = _PerformanceLevels[level][index].ctrl_id;
- switch (ctrl_id) {
- //
- // Update any of the sliders via the same mechanism
- //
- case IDC_GEOMETRY_DETAIL_SLIDER:
- case IDC_CHAR_SHADOWS_SLIDER:
- case IDC_TEXTURE_DETAIL_SLIDER:
- case IDC_PARTICLE_DETAIL_SLIDER:
- case IDC_SURFACE_DETAIL_SLIDER:
- {
- SliderCtrlClass *slider_ctrl = (SliderCtrlClass *)Get_Dlg_Item (ctrl_id);
- slider_ctrl->Set_Pos (_PerformanceLevels[level][index].value);
- break;
- }
- //
- // Update any of the check boxes via the same mechanism
- //
- case IDC_TERRAIN_SHADOW_CHECK:
- case IDC_NPATCH_CHECK:
- Check_Dlg_Button (ctrl_id, bool(_PerformanceLevels[level][index].value == 1));
- break;
- }
- }
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // On_SliderCtrl_Pos_Changed
- //
- ////////////////////////////////////////////////////////////////
- void
- DlgConfigPerformanceTabClass::On_SliderCtrl_Pos_Changed
- (
- SliderCtrlClass * slider_ctrl,
- int ctrl_id,
- int new_pos
- )
- {
- if (ctrl_id == IDC_PERFORMANCE_SLIDER) {
- Update_Expert_Controls (new_pos);
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // On_Apply
- //
- /////////////////////////////////////////////////////////////////////////////
- bool
- DlgConfigPerformanceTabClass::On_Apply (void)
- {
- SliderCtrlClass *geometry_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_GEOMETRY_DETAIL_SLIDER);
- SliderCtrlClass *char_shadows_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_CHAR_SHADOWS_SLIDER);
- SliderCtrlClass *texture_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_TEXTURE_DETAIL_SLIDER);
- SliderCtrlClass *surface_effect_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_SURFACE_DETAIL_SLIDER);
- SliderCtrlClass *particle_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_PARTICLE_DETAIL_SLIDER);
-
- //
- // Attempt to open the registry key
- //
- RegistryClass registry (APPLICATION_SUB_KEY_NAME_SYSTEM_SETTINGS);
- if (registry.Is_Valid ()) {
- //
- // Get the current settings from the dialog
- //
- int geometry_detail = geometry_slider->Get_Pos ();
- int shadow_mode = char_shadows_slider->Get_Pos ();
- int texture_red = texture_slider->Get_Pos ();
- int surface_effect = surface_effect_slider->Get_Pos ();
- int particle_detail = particle_slider->Get_Pos ();
- int static_shadows = Is_Dlg_Button_Checked (IDC_TERRAIN_SHADOW_CHECK);
- int npatches = Is_Dlg_Button_Checked (IDC_NPATCH_CHECK);
- //
- // Determine a good LOD budget to use
- //
- int lod_budget = 0;
- if (geometry_detail == 0) {
- lod_budget = 0;
- } else if (geometry_detail == 1) {
- lod_budget = MAX_LOD_MED;
- } else if (geometry_detail == 2) {
- lod_budget = MAX_LOD_HIGH;
- }
- //
- // Store the values in the registry
- //
- registry.Set_Int (VALUE_NAME_DYN_LOD, lod_budget);
- registry.Set_Int (VALUE_NAME_STATIC_LOD, lod_budget);
- registry.Set_Int (VALUE_NAME_DYN_SHADOWS, (shadow_mode != PhysicsSceneClass::SHADOW_MODE_NONE));
- registry.Set_Int (VALUE_NAME_STATIC_SHADOWS, static_shadows);
- registry.Set_Int (VALUE_NAME_SHADOW_MODE, shadow_mode);
- registry.Set_Int (VALUE_NAME_TEXTURE_RES, max (2 - texture_red, 0));
- registry.Set_Int (VALUE_NAME_PARTICLE_DETAIL, particle_detail);
- if (DX8Wrapper::Get_Current_Caps() && DX8Wrapper::Get_Current_Caps()->Support_NPatches ()) {
- registry.Set_Int (VALUE_NAME_NPATCHES, npatches);
- }
- //
- // Pass the values onto the game
- //
- COMBAT_SCENE->Set_Polygon_Budgets (lod_budget, lod_budget);
- COMBAT_SCENE->Enable_Dynamic_Projectors ((shadow_mode != PhysicsSceneClass::SHADOW_MODE_NONE));
- COMBAT_SCENE->Enable_Static_Projectors ((static_shadows != 0));
- // Note! It is important to invalidate all textures when
- // changing the amount of render targets, as render target
- // creation may have problems if the card is running low on
- // texture memory!
- if (COMBAT_SCENE->Get_Shadow_Mode()!=(PhysicsSceneClass::ShadowEnum)shadow_mode) {
- WW3D::_Invalidate_Textures();
- COMBAT_SCENE->Set_Shadow_Mode ((PhysicsSceneClass::ShadowEnum)shadow_mode);
- }
- WW3D::Set_Texture_Reduction (max (2 - texture_red, 0));
- SurfaceEffectsManager::Set_Mode ((SurfaceEffectsManager::MODE)surface_effect);
- }
- return true;
- }
|