//-------------------------------------------------------------------------------------- // File: DXMUTSettingsDlg.cs // // Dialog for selection of device settings // // Copyright (c) Microsoft Corporation. All rights reserved. //-------------------------------------------------------------------------------------- using System; using System.IO; using System.Collections; using System.Runtime.InteropServices; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; namespace Microsoft.Samples.DirectX.UtilityToolkit { #region Control Ids public enum SettingsDialogControlIds { Static = -1, None, OK, Cancel, Adapter, DeviceType, Windowed, Fullscreen, AdapterFormat, AdapterFormatLabel, Resolution, ResolutionLabel, RefreshRate, RefreshRateLabel, BackBufferFormat, DepthStencil, MultisampleType, MultisampleQuality, VertexProcessing, PresentInterval, DeviceClip, RadioButtonGroup = 0x100, } #endregion /// /// Dialog for selection of device settings /// public class SettingsDialog { #region Creation /// Creates a new settings dialog public SettingsDialog(Framework sample) { parent = sample; windowWidth = Framework.DefaultSizeWidth; windowHeight = Framework.DefaultSizeHeight; CreateControls(); } #endregion #region Class Data private Framework parent; // Parent framework for this dialog private Dialog dialog; // Dialog that will be rendered private uint windowWidth; // Width of window private uint windowHeight; // Height of window private DeviceSettings globalSettings; // Device settings private StateBlock state; // state block for device #endregion #region Control variables // Combo boxes private ComboBox resolution; private ComboBox adapterCombo; private ComboBox deviceCombo; private ComboBox adapterFormatCombo; private ComboBox refreshCombo; private ComboBox backBufferCombo; private ComboBox depthStencilCombo; private ComboBox multiSampleTypeCombo; private ComboBox multiSampleQualityCombo; private ComboBox vertexCombo; private ComboBox presentCombo; // Check boxes private Checkbox clipBox; // Radio buttons private RadioButton windowedButton; private RadioButton fullscreenButton; // Static controls that are cared about private StaticText adapterFormatStatic; private StaticText resolutionStatic; private StaticText refreshStatic; #endregion /// /// Creates the controls for use in the dialog /// private void CreateControls() { dialog = new Dialog(parent); dialog.IsUsingKeyboardInput = true; dialog.SetFont(0, "Arial", 15, FontWeight.Normal); dialog.SetFont(1, "Arial", 28, FontWeight.Bold); // Right justify static controls Element e = dialog.GetDefaultElement(ControlType.StaticText, 0); e.textFormat = DrawTextFormat.VerticalCenter | DrawTextFormat.Right; // Title StaticText title = dialog.AddStatic((int)SettingsDialogControlIds.Static, "Direct3D Settings", 10, 5, 400, 50); e = title[0]; e.FontIndex = 1; e.textFormat = DrawTextFormat.Top | DrawTextFormat.Left; // Adapter dialog.AddStatic((int)SettingsDialogControlIds.Static, "Display Adapter", 10, 50, 180, 23); adapterCombo = dialog.AddComboBox((int)SettingsDialogControlIds.Adapter, 200, 50, 300, 23); // Device Type dialog.AddStatic((int)SettingsDialogControlIds.Static, "Render Device", 10, 75, 180, 23); deviceCombo = dialog.AddComboBox((int)SettingsDialogControlIds.DeviceType, 200, 75, 300, 23); // Windowed / Fullscreen windowedButton = dialog.AddRadioButton((int)SettingsDialogControlIds.Windowed, (int)SettingsDialogControlIds.RadioButtonGroup, "Windowed", 240, 105, 300, 16, false); clipBox = dialog.AddCheckBox((int)SettingsDialogControlIds.DeviceClip, "Clip to device when window spans across multiple monitors", 250, 126, 400, 16, false); fullscreenButton = dialog.AddRadioButton((int)SettingsDialogControlIds.Fullscreen, (int)SettingsDialogControlIds.RadioButtonGroup, "Full Screen", 240, 147, 300, 16, false); // Adapter Format adapterFormatStatic = dialog.AddStatic((int)SettingsDialogControlIds.AdapterFormatLabel, "Adapter Format", 10, 180, 180, 23); adapterFormatCombo = dialog.AddComboBox((int)SettingsDialogControlIds.AdapterFormat, 200, 180, 300, 23); // Resolution resolutionStatic = dialog.AddStatic((int)SettingsDialogControlIds.ResolutionLabel, "Resolution", 10, 205, 180, 23); resolution = dialog.AddComboBox((int)SettingsDialogControlIds.Resolution, 200, 205, 300, 23); resolution.SetDropHeight(106); // Refresh Rate refreshStatic = dialog.AddStatic((int)SettingsDialogControlIds.RefreshRateLabel, "Refresh Rate", 10, 230, 180, 23); refreshCombo = dialog.AddComboBox((int)SettingsDialogControlIds.RefreshRate, 200, 230, 300, 23); // BackBuffer Format dialog.AddStatic((int)SettingsDialogControlIds.Static, "Back Buffer Format", 10, 265, 180, 23 ); backBufferCombo = dialog.AddComboBox((int)SettingsDialogControlIds.BackBufferFormat, 200, 265, 300, 23 ); // Depth Stencil dialog.AddStatic((int)SettingsDialogControlIds.Static, "Depth/Stencil Format", 10, 290, 180, 23 ); depthStencilCombo = dialog.AddComboBox((int)SettingsDialogControlIds.DepthStencil, 200, 290, 300, 23 ); // Multisample Type dialog.AddStatic((int)SettingsDialogControlIds.Static, "Multisample Type", 10, 315, 180, 23 ); multiSampleTypeCombo = dialog.AddComboBox((int)SettingsDialogControlIds.MultisampleType, 200, 315, 300, 23 ); // Multisample Quality dialog.AddStatic((int)SettingsDialogControlIds.Static, "Multisample Quality", 10, 340, 180, 23 ); multiSampleQualityCombo = dialog.AddComboBox((int)SettingsDialogControlIds.MultisampleQuality, 200, 340, 300, 23 ); // Vertex Processing dialog.AddStatic((int)SettingsDialogControlIds.Static, "Vertex Processing", 10, 365, 180, 23 ); vertexCombo = dialog.AddComboBox((int)SettingsDialogControlIds.VertexProcessing, 200, 365, 300, 23 ); // Present Interval dialog.AddStatic((int)SettingsDialogControlIds.Static, "Present Interval", 10, 390, 180, 23 ); presentCombo = dialog.AddComboBox((int)SettingsDialogControlIds.PresentInterval, 200, 390, 300, 23 ); // Add the ok/cancel buttons Button okButton = dialog.AddButton((int)SettingsDialogControlIds.OK, "OK", 230,435,73,31); Button cancelButton = dialog.AddButton((int)SettingsDialogControlIds.Cancel, "Cancel", 315,435,73,31,0, true); okButton.Click += new EventHandler(OnOkClicked); cancelButton.Click += new EventHandler(OnCancelClicked); } /// Changes the UI defaults to the current device settings public void Refresh() { // Get some information globalSettings = parent.DeviceSettings.Clone(); System.Drawing.Rectangle client = parent.WindowClientRectangle; windowWidth = (uint)client.Width; windowHeight = (uint)client.Height; // Fill the UI with the current settings if (!deviceCombo.ContainsItem(globalSettings.DeviceType.ToString())) deviceCombo.AddItem(globalSettings.DeviceType.ToString(), globalSettings.DeviceType.ToString()); SetWindowed(globalSettings.presentParams.Windowed); clipBox.IsChecked = ((globalSettings.presentParams.PresentFlag & PresentFlag.DeviceClip) != 0); if (!adapterFormatCombo.ContainsItem(globalSettings.AdapterFormat.ToString())) adapterFormatCombo.AddItem(globalSettings.AdapterFormat.ToString(), globalSettings.AdapterFormat); AddResolution((short)globalSettings.presentParams.BackBufferWidth, (short)globalSettings.presentParams.BackBufferHeight); AddRefreshRate(globalSettings.presentParams.FullScreenRefreshRateInHz); if (!backBufferCombo.ContainsItem(globalSettings.presentParams.BackBufferFormat.ToString())) backBufferCombo.AddItem(globalSettings.presentParams.BackBufferFormat.ToString(), globalSettings.presentParams.BackBufferFormat); if (!depthStencilCombo.ContainsItem(globalSettings.presentParams.AutoDepthStencilFormat.ToString())) depthStencilCombo.AddItem(globalSettings.presentParams.AutoDepthStencilFormat.ToString(), globalSettings.presentParams.AutoDepthStencilFormat); if (!multiSampleTypeCombo.ContainsItem(globalSettings.presentParams.MultiSample.ToString())) multiSampleTypeCombo.AddItem(globalSettings.presentParams.MultiSample.ToString(), globalSettings.presentParams.MultiSample); if (!multiSampleQualityCombo.ContainsItem(globalSettings.presentParams.MultiSampleQuality.ToString())) multiSampleQualityCombo.AddItem(globalSettings.presentParams.MultiSampleQuality.ToString(), globalSettings.presentParams.MultiSampleQuality); if (!presentCombo.ContainsItem(globalSettings.presentParams.PresentationInterval.ToString())) presentCombo.AddItem(globalSettings.presentParams.PresentationInterval.ToString(), globalSettings.presentParams.PresentationInterval); BehaviorFlags flags = new BehaviorFlags(globalSettings.BehaviorFlags); if (flags.PureDevice) AddVertexProcessing(CreateFlags.PureDevice); else if (flags.HardwareVertexProcessing) AddVertexProcessing(CreateFlags.HardwareVertexProcessing); else if (flags.SoftwareVertexProcessing) AddVertexProcessing(CreateFlags.SoftwareVertexProcessing); else if (flags.MixedVertexProcessing) AddVertexProcessing(CreateFlags.MixedVertexProcessing); // Get the adapters list from Enumeration object ArrayList adapterInfoList = Enumeration.AdapterInformationList; if (adapterInfoList.Count == 0) throw new NoCompatibleDevicesException(); adapterCombo.Clear(); // Add all of the adapters for (int iAdapter = 0; iAdapter < adapterInfoList.Count; iAdapter++) { EnumAdapterInformation adapterInfo = adapterInfoList[iAdapter] as EnumAdapterInformation; if (!adapterCombo.ContainsItem(adapterInfo.UniqueDescription)) adapterCombo.AddItem(adapterInfo.UniqueDescription, iAdapter); } adapterCombo.SetSelectedByData(globalSettings.AdapterOrdinal); // The adapter changed, call the handler OnAdapterChanged(adapterCombo, EventArgs.Empty); Dialog.SetRefreshTime((float)FrameworkTimer.GetTime()); } /// Render the dialog public void OnRender(float elapsedTime) { state.Capture(); parent.Device.RenderState.FillMode = FillMode.Solid; dialog.OnRender(elapsedTime); state.Apply(); } /// Hand messages off to dialog public void HandleMessages(IntPtr hWnd, NativeMethods.WindowMessage msg, IntPtr wParam, IntPtr lParam) { dialog.MessageProc(hWnd, msg, wParam, lParam); } #region Device event callbacks /// /// Called when the device is created /// public void OnCreateDevice(Device d) { // Hook all the events we care about resolution.Changed += new EventHandler(OnResolutionChanged); adapterCombo.Changed += new EventHandler(OnAdapterChanged); deviceCombo.Changed += new EventHandler(OnDeviceChanged); adapterFormatCombo.Changed += new EventHandler(OnAdapterFormatChange); refreshCombo.Changed += new EventHandler(OnRefreshRateChanged); backBufferCombo.Changed += new EventHandler(OnBackBufferChanged); depthStencilCombo.Changed += new EventHandler(OnDepthStencilChanged); multiSampleTypeCombo.Changed += new EventHandler(OnMultisampleTypeChanged); multiSampleQualityCombo.Changed += new EventHandler(OnMultisampleQualityChanged); vertexCombo.Changed += new EventHandler(OnVertexProcessingChanged); presentCombo.Changed += new EventHandler(OnPresentIntervalChanged); clipBox.Changed += new EventHandler(OnClipWindowChanged); windowedButton.Changed += new EventHandler(OnWindowedFullscreenChanged); fullscreenButton.Changed += new EventHandler(OnWindowedFullscreenChanged); } /// /// Called when the device is reset /// public void OnResetDevice() { SurfaceDescription desc = parent.BackBufferSurfaceDescription; // Set up the dialog dialog.SetLocation(0, 0); dialog.SetSize(desc.Width, desc.Height); dialog.SetBackgroundColors(new ColorValue((float)98/255, (float)138/255, (float)206/255), new ColorValue((float)54/255, (float)105/255, (float)192/255), new ColorValue((float)54/255, (float)105/255, (float)192/255), new ColorValue((float)10/255, (float)73/255, (float)179/255) ); Device device = parent.Device; device.BeginStateBlock(); device.RenderState.FillMode = FillMode.Solid; state = device.EndStateBlock(); } /// /// Called when the device is lost /// public void OnLostDevice() { if (state != null) state.Dispose(); state = null; } /// Destroy any resources public void OnDestroyDevice(object sender, EventArgs e) { // Clear the focus Dialog.ClearFocus(); // Unhook all the events we care about resolution.Changed -= new EventHandler(OnResolutionChanged); adapterCombo.Changed -= new EventHandler(OnAdapterChanged); deviceCombo.Changed -= new EventHandler(OnDeviceChanged); adapterFormatCombo.Changed -= new EventHandler(OnAdapterFormatChange); refreshCombo.Changed -= new EventHandler(OnRefreshRateChanged); backBufferCombo.Changed -= new EventHandler(OnBackBufferChanged); depthStencilCombo.Changed -= new EventHandler(OnDepthStencilChanged); multiSampleTypeCombo.Changed -= new EventHandler(OnMultisampleTypeChanged); multiSampleQualityCombo.Changed -= new EventHandler(OnMultisampleQualityChanged); vertexCombo.Changed -= new EventHandler(OnVertexProcessingChanged); presentCombo.Changed -= new EventHandler(OnPresentIntervalChanged); clipBox.Changed -= new EventHandler(OnClipWindowChanged); windowedButton.Changed -= new EventHandler(OnWindowedFullscreenChanged); fullscreenButton.Changed -= new EventHandler(OnWindowedFullscreenChanged); } #endregion /// Returns the current device information private EnumDeviceInformation GetCurrentDeviceInfo() { return Enumeration.GetDeviceInfo(globalSettings.AdapterOrdinal, globalSettings.DeviceType); } /// Returns the current adapter information private EnumAdapterInformation GetCurrentAdapterInfo() { return Enumeration.GetAdapterInformation(globalSettings.AdapterOrdinal); } /// Returns the current adapter information private EnumDeviceSettingsCombo GetCurrentDeviceSettingsCombo() { return Enumeration.GetDeviceSettingsCombo(globalSettings.AdapterOrdinal, globalSettings.DeviceType, globalSettings.AdapterFormat, globalSettings.presentParams.BackBufferFormat, globalSettings.presentParams.Windowed); } // TODO: SetDeviceSettingsFromUI #region Update UI Methods /// Sets whether this is running in windowed or fullscreen mode private void SetWindowed(bool windowed) { windowedButton.IsChecked = windowed; fullscreenButton.IsChecked = !windowed; } /// Adds a resolution to the combo box private void AddResolution(short width, short height) { string itemText = string.Format("{0} by {1}", width, height); // Store the resolution in a single variable uint resolutionData = NativeMethods.MakeUInt32(width, height); // Add this item if (!resolution.ContainsItem(itemText)) resolution.AddItem(itemText, resolutionData); } /// Adds a refresh rate to the combo box private void AddRefreshRate(int rate) { string itemText = (rate == 0) ? "Default Rate" : string.Format("{0} Hz", rate); // Add this item if (!refreshCombo.ContainsItem(itemText)) refreshCombo.AddItem(itemText, rate); } /// Adds a vertex processing type to the combo box private void AddVertexProcessing(CreateFlags flags) { string itemText = "Unknown vertex processing type"; switch(flags) { case CreateFlags.PureDevice: itemText = "Pure hardware vertex processing"; break; case CreateFlags.HardwareVertexProcessing: itemText = "Hardware vertex processing"; break; case CreateFlags.SoftwareVertexProcessing: itemText = "Software vertex processing"; break; case CreateFlags.MixedVertexProcessing: itemText = "Mixed vertex processing"; break; } // Add this item if (!vertexCombo.ContainsItem(itemText)) vertexCombo.AddItem(itemText, flags); } #endregion #region Event handlers for the controls /// Called when the resolution changes private void OnResolutionChanged(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; // Set the resolution uint data = (uint)cb.GetSelectedData(); int width = NativeMethods.LoWord(data); int height = NativeMethods.HiWord(data); globalSettings.presentParams.BackBufferWidth = width; globalSettings.presentParams.BackBufferHeight = height; int refreshRate = globalSettings.presentParams.FullScreenRefreshRateInHz; // Update the refresh rate list refreshCombo.Clear(); EnumAdapterInformation adapterInfo = GetCurrentAdapterInfo(); Format adapterFormat = globalSettings.AdapterFormat; foreach(DisplayMode dm in adapterInfo.displayModeList) { if (dm.Format == adapterFormat && dm.Width == width && dm.Height == height) { AddRefreshRate(dm.RefreshRate); } } // select and update refreshCombo.SetSelectedByData(refreshRate); OnRefreshRateChanged(refreshCombo, e); } /// Called when the adapter changes private void OnAdapterChanged(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; // Store the adapter index globalSettings.AdapterOrdinal = (uint)(int)cb.GetSelectedData(); // Remove all the items from the device type deviceCombo.Clear(); // Get the adapter information EnumAdapterInformation adapterInfo = GetCurrentAdapterInfo(); // Add each device type to the combo list foreach(EnumDeviceInformation edi in adapterInfo.deviceInfoList) { if (!deviceCombo.ContainsItem(edi.DeviceType.ToString())) deviceCombo.AddItem(edi.DeviceType.ToString(), edi.DeviceType); } deviceCombo.SetSelectedByData(globalSettings.DeviceType); // Device type was changed update OnDeviceChanged(deviceCombo, e); } /// Called when the device type changes private void OnDeviceChanged(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; globalSettings.DeviceType = (DeviceType)cb.GetSelectedData(); // Update windowed/full screen radio buttons bool hasWindowCombo = false; bool hasFullscreen = false; EnumDeviceInformation edi = GetCurrentDeviceInfo(); // See if there are any windowed/fullscreen combos foreach(EnumDeviceSettingsCombo edsc in edi.deviceSettingsList) { if (edsc.IsWindowed) hasWindowCombo = true; else hasFullscreen = true; } // Set the controls enable/disable property based on whether they are available or not dialog.SetControlEnable((int)SettingsDialogControlIds.Windowed, hasWindowCombo); dialog.SetControlEnable((int)SettingsDialogControlIds.Fullscreen, hasFullscreen); SetWindowed(globalSettings.presentParams.Windowed && hasWindowCombo); OnWindowedFullscreenChanged(null, e); } /// Called when the adapter format changes private void OnAdapterFormatChange(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; Format adapterFormat = (Format)cb.GetSelectedData(); // Resolutions resolution.Clear(); EnumAdapterInformation adapterInfo = GetCurrentAdapterInfo(); foreach(DisplayMode dm in adapterInfo.displayModeList) { if (dm.Format == adapterFormat) AddResolution((short)dm.Width, (short)dm.Height); } uint currentResolution = NativeMethods.MakeUInt32( (short)globalSettings.presentParams.BackBufferWidth, (short)globalSettings.presentParams.BackBufferHeight); resolution.SetSelectedByData(currentResolution); // Resolution changed OnResolutionChanged(resolution, e); // Back buffer formats backBufferCombo.Clear(); EnumDeviceInformation edi = GetCurrentDeviceInfo(); bool hasWindowedBackBuffer = false; bool isWindowed = windowedButton.IsChecked; foreach(EnumDeviceSettingsCombo edsc in edi.deviceSettingsList) { if (edsc.IsWindowed == isWindowed && edsc.AdapterFormat == globalSettings.AdapterFormat) { hasWindowedBackBuffer = true; if (!backBufferCombo.ContainsItem(edsc.BackBufferFormat.ToString())) backBufferCombo.AddItem(edsc.BackBufferFormat.ToString(), edsc.BackBufferFormat); } } // Update back buffer backBufferCombo.SetSelectedByData(globalSettings.presentParams.BackBufferFormat); OnBackBufferChanged(backBufferCombo, e); if (!hasWindowedBackBuffer) { dialog.SetControlEnable((int)SettingsDialogControlIds.Windowed, false); if (globalSettings.presentParams.Windowed) { SetWindowed(false); OnWindowedFullscreenChanged(null, e); } } } /// Called when the refresh rate changes private void OnRefreshRateChanged(object sender, EventArgs e) { ComboBox c = sender as ComboBox; globalSettings.presentParams.FullScreenRefreshRateInHz = (int)c.GetSelectedData(); } /// Called when the back buffer format changes private void OnBackBufferChanged(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; globalSettings.presentParams.BackBufferFormat = (Format)backBufferCombo.GetSelectedData(); // Store formats Format adapterFormat = globalSettings.AdapterFormat; Format backFormat = globalSettings.presentParams.BackBufferFormat; EnumDeviceInformation edi = GetCurrentDeviceInfo(); // Get possible vertex processing bool isAllowSoftware = Enumeration.IsSoftwareVertexProcessingPossible; bool isAllowHardware = Enumeration.IsHardwareVertexProcessingPossible; bool isAllowPure = Enumeration.IsPureHardwareVertexProcessingPossible; bool isAllowMixed = Enumeration.IsMixedVertexProcessingPossible; foreach(EnumDeviceSettingsCombo edsc in edi.deviceSettingsList) { if (edsc.IsWindowed == globalSettings.presentParams.Windowed && edsc.AdapterFormat == adapterFormat && edsc.BackBufferFormat == backFormat) { // Clear the depth stencil buffer depthStencilCombo.Clear(); depthStencilCombo.IsEnabled = (globalSettings.presentParams.EnableAutoDepthStencil); if (globalSettings.presentParams.EnableAutoDepthStencil) { foreach(Format f in edsc.depthStencilFormatList) { if (!depthStencilCombo.ContainsItem(f.ToString())) depthStencilCombo.AddItem(f.ToString(), f); } depthStencilCombo.SetSelectedByData(globalSettings.presentParams.AutoDepthStencilFormat); } else { if (!depthStencilCombo.ContainsItem("(not used)") ) depthStencilCombo.AddItem("(not used)", null); } OnDepthStencilChanged(depthStencilCombo, e); // Now remove all the vertex processing information vertexCombo.Clear(); if (isAllowPure) AddVertexProcessing(CreateFlags.PureDevice); if (isAllowHardware) AddVertexProcessing(CreateFlags.HardwareVertexProcessing); if (isAllowSoftware) AddVertexProcessing(CreateFlags.SoftwareVertexProcessing); if (isAllowMixed) AddVertexProcessing(CreateFlags.MixedVertexProcessing); // Select the right one BehaviorFlags flags = new BehaviorFlags(globalSettings.BehaviorFlags); if (flags.PureDevice) vertexCombo.SetSelectedByData(CreateFlags.PureDevice); else if (flags.HardwareVertexProcessing) vertexCombo.SetSelectedByData(CreateFlags.HardwareVertexProcessing); else if (flags.SoftwareVertexProcessing) vertexCombo.SetSelectedByData(CreateFlags.SoftwareVertexProcessing); else if (flags.MixedVertexProcessing) vertexCombo.SetSelectedByData(CreateFlags.MixedVertexProcessing); OnVertexProcessingChanged(vertexCombo, e); // Now present intervals presentCombo.Clear(); foreach(PresentInterval pf in edsc.presentIntervalList) { if (!presentCombo.ContainsItem(pf.ToString())) presentCombo.AddItem(pf.ToString(), pf); } presentCombo.SetSelectedByData(globalSettings.presentParams.PresentationInterval); OnPresentIntervalChanged(presentCombo, e); } } } /// Called when the depth stencil changes private void OnDepthStencilChanged(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; DepthFormat stencilFormat = (DepthFormat)cb.GetSelectedData(); if (globalSettings.presentParams.EnableAutoDepthStencil) globalSettings.presentParams.AutoDepthStencilFormat = stencilFormat; EnumDeviceSettingsCombo combo = GetCurrentDeviceSettingsCombo(); // Remove all of the multisample items and add the new ones multiSampleTypeCombo.Clear(); foreach(MultiSampleType mst in combo.multiSampleTypeList) { bool conflictFound = false; foreach(EnumDepthStencilMultisampleConflict c in combo.depthStencilConflictList) { if (c.DepthStencilFormat == stencilFormat && c.MultisampleType == mst) { conflictFound = true; break; } } if (!conflictFound) { if (!multiSampleTypeCombo.ContainsItem(mst.ToString())) multiSampleTypeCombo.AddItem(mst.ToString(), mst); } } // Select the correct multisampling type multiSampleTypeCombo.SetSelectedByData(globalSettings.presentParams.MultiSample); OnMultisampleTypeChanged(multiSampleTypeCombo, e); } /// Called when the multisample type changes private void OnMultisampleTypeChanged(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; MultiSampleType mst = (MultiSampleType)cb.GetSelectedData(); globalSettings.presentParams.MultiSample = mst; EnumDeviceSettingsCombo combo = GetCurrentDeviceSettingsCombo(); int maxQuality = 0; for (int i = 0; i < combo.multiSampleTypeList.Count; i++) { MultiSampleType msType = (MultiSampleType)combo.multiSampleTypeList[i]; if (msType == mst) { maxQuality = (int)combo.multiSampleQualityList[i]; } } // We have the max quality now, add to our list multiSampleQualityCombo.Clear(); for(int i = 0; i < maxQuality; i++) { if (!multiSampleQualityCombo.ContainsItem(i.ToString())) multiSampleQualityCombo.AddItem(i.ToString(), i); } multiSampleQualityCombo.SetSelectedByData(globalSettings.presentParams.MultiSampleQuality); OnMultisampleQualityChanged(multiSampleQualityCombo, e); } /// Called when the multisample quality changes private void OnMultisampleQualityChanged(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; globalSettings.presentParams.MultiSampleQuality = (int)cb.GetSelectedData(); } /// Called when the vertex processing changes private void OnVertexProcessingChanged(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; CreateFlags behavior = globalSettings.BehaviorFlags; // Clear flags behavior &= ~CreateFlags.HardwareVertexProcessing; behavior &= ~CreateFlags.SoftwareVertexProcessing; behavior &= ~CreateFlags.PureDevice; behavior &= ~CreateFlags.MixedVertexProcessing; // Determine new flags CreateFlags newFlags = (CreateFlags)vertexCombo.GetSelectedData(); if ((newFlags & CreateFlags.PureDevice) != 0) newFlags |= CreateFlags.HardwareVertexProcessing; // Make changes globalSettings.BehaviorFlags = behavior | newFlags; } /// Called when the presentation interval changes private void OnPresentIntervalChanged(object sender, EventArgs e) { ComboBox cb = sender as ComboBox; globalSettings.presentParams.PresentationInterval = (PresentInterval)cb.GetSelectedData(); } /// Called when the clip to window state changes private void OnClipWindowChanged(object sender, EventArgs e) { Checkbox cb = sender as Checkbox; if (cb.IsChecked) globalSettings.presentParams.PresentFlag |= PresentFlag.DeviceClip; else globalSettings.presentParams.PresentFlag &= ~PresentFlag.DeviceClip; } /// Called when the fullscreen or windowed item changes private void OnWindowedFullscreenChanged(object sender, EventArgs e) { bool isWindowed = windowedButton.IsChecked; globalSettings.presentParams.Windowed = isWindowed; // Set the control enabled or disabled properties dialog.SetControlEnable((int)SettingsDialogControlIds.AdapterFormatLabel, !isWindowed); dialog.SetControlEnable((int)SettingsDialogControlIds.ResolutionLabel, !isWindowed); dialog.SetControlEnable((int)SettingsDialogControlIds.RefreshRateLabel, !isWindowed); dialog.SetControlEnable((int)SettingsDialogControlIds.AdapterFormat, !isWindowed); dialog.SetControlEnable((int)SettingsDialogControlIds.Resolution, !isWindowed); dialog.SetControlEnable((int)SettingsDialogControlIds.RefreshRate, !isWindowed); dialog.SetControlEnable((int)SettingsDialogControlIds.DeviceClip, isWindowed); bool deviceClip = ((globalSettings.presentParams.PresentFlag & PresentFlag.DeviceClip) != 0); // If windowed, get the appropriate adapter format from Direct3D if (globalSettings.presentParams.Windowed) { DisplayMode mode = Manager.Adapters[(int)globalSettings.AdapterOrdinal].CurrentDisplayMode; globalSettings.AdapterFormat = mode.Format; globalSettings.presentParams.BackBufferWidth = mode.Width; globalSettings.presentParams.BackBufferHeight = mode.Height; globalSettings.presentParams.FullScreenRefreshRateInHz = mode.RefreshRate; } // Update the clip check box clipBox.IsChecked = deviceClip; // Update the adapter format list adapterFormatCombo.Clear(); EnumDeviceInformation edi = GetCurrentDeviceInfo(); if (isWindowed) { if (!adapterFormatCombo.ContainsItem(globalSettings.AdapterFormat.ToString())) adapterFormatCombo.AddItem(globalSettings.AdapterFormat.ToString(), globalSettings.AdapterFormat); } else { // Add all the supported formats foreach(EnumDeviceSettingsCombo edsc in edi.deviceSettingsList) { if (!adapterFormatCombo.ContainsItem(edsc.AdapterFormat.ToString())) adapterFormatCombo.AddItem(edsc.AdapterFormat.ToString(), edsc.AdapterFormat); } } adapterFormatCombo.SetSelectedByData(globalSettings.AdapterFormat); // Adapter format changed, update there OnAdapterFormatChange(adapterFormatCombo, EventArgs.Empty); // Update resolution if (isWindowed) { resolution.Clear(); AddResolution((short)globalSettings.presentParams.BackBufferWidth, (short)globalSettings.presentParams.BackBufferHeight); } resolution.SetSelectedByData(NativeMethods.MakeUInt32( (short)globalSettings.presentParams.BackBufferWidth, (short)globalSettings.presentParams.BackBufferHeight)); // Resolution changed OnResolutionChanged(resolution, EventArgs.Empty); // Update refresh if (isWindowed) { refreshCombo.Clear(); AddRefreshRate(globalSettings.presentParams.FullScreenRefreshRateInHz); } // Select the correct refresh rate refreshCombo.SetSelectedByData(globalSettings.presentParams.FullScreenRefreshRateInHz); // refresh rate changed OnRefreshRateChanged(refreshCombo, EventArgs.Empty); } /// Called when the cancel button is clicked private void OnCancelClicked(object sender, EventArgs e) { // Nothing left to do, quit showing the screen parent.ShowSettingsDialog(false); } /// Called when the ok button is clicked private void OnOkClicked(object sender, EventArgs e) { // The device needs to be updated if (globalSettings.presentParams.Windowed) { globalSettings.presentParams.FullScreenRefreshRateInHz = 0; globalSettings.presentParams.BackBufferWidth = (int)windowWidth; globalSettings.presentParams.BackBufferHeight = (int)windowHeight; } if (globalSettings.presentParams.MultiSample != MultiSampleType.None) { globalSettings.presentParams.PresentFlag &= ~PresentFlag.LockableBackBuffer; } // Create a device parent.CreateDeviceFromSettings(globalSettings); // Stop showing the dialog now parent.ShowSettingsDialog(false); } #endregion } }