OSDN Git Service

DTXManiaソリューション、DTXManiaプロジェクト、DTXCreatorプロジェクト、FDKプロジェクトについて英語化。
[dtxmania/dtxmania.git] / FDK / コード / 01.フレームワーク / DeviceSettings / DeviceSettings.cs
diff --git a/FDK/コード/01.フレームワーク/DeviceSettings/DeviceSettings.cs b/FDK/コード/01.フレームワーク/DeviceSettings/DeviceSettings.cs
new file mode 100644 (file)
index 0000000..efeb5a5
--- /dev/null
@@ -0,0 +1,285 @@
+/*
+* Copyright (c) 2007-2009 SlimDX Group
+* 
+* Permission is hereby granted, free of charge, to any person obtaining a copy
+* of this software and associated documentation files (the "Software"), to deal
+* in the Software without restriction, including without limitation the rights
+* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+* copies of the Software, and to permit persons to whom the Software is
+* furnished to do so, subject to the following conditions:
+* 
+* The above copyright notice and this permission notice shall be included in
+* all copies or substantial portions of the Software.
+* 
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+* THE SOFTWARE.
+*/
+using System;
+using SharpDX.Direct3D9;
+namespace SampleFramework
+{
+    /// <summary>
+    /// Contains settings for creating a 3D device.
+    /// </summary>
+    public class DeviceSettings : ICloneable
+    {
+        /// <summary>
+        /// Gets or sets the adapter ordinal.
+        /// </summary>
+        /// <value>The adapter ordinal.</value>
+        public int AdapterOrdinal
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets the type of the device.
+        /// </summary>
+        /// <value>The type of the device.</value>
+        public DeviceType DeviceType
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets the refresh rate.
+        /// </summary>
+        /// <value>The refresh rate.</value>
+        public int RefreshRate
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets the width of the back buffer.
+        /// </summary>
+        /// <value>The width of the back buffer.</value>
+        public int BackBufferWidth
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets the height of the back buffer.
+        /// </summary>
+        /// <value>The height of the back buffer.</value>
+        public int BackBufferHeight
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets the back buffer format.
+        /// </summary>
+        /// <value>The back buffer format.</value>
+        public Format BackBufferFormat
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets the back buffer count.
+        /// </summary>
+        /// <value>The back buffer count.</value>
+        public int BackBufferCount
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether the device is windowed.
+        /// </summary>
+        /// <value><c>true</c> if windowed; otherwise, <c>false</c>.</value>
+        public bool Windowed
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether VSync is enabled.
+        /// </summary>
+        /// <value><c>true</c> if VSync is enabled; otherwise, <c>false</c>.</value>
+        public bool EnableVSync
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether this <see cref="DeviceSettings"/> is multithreaded.
+        /// </summary>
+        /// <value><c>true</c> if multithreaded; otherwise, <c>false</c>.</value>
+        /// <remarks>This only has an effect for Direct3D9 devices.</remarks>
+        public bool Multithreaded
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets the multisample type.
+        /// </summary>
+        /// <value>The multisample type.</value>
+        public MultisampleType MultisampleType
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets the multisample quality.
+        /// </summary>
+        /// <value>The multisample quality.</value>
+        public int MultisampleQuality
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets the depth stencil format.
+        /// </summary>
+        /// <value>The depth stencil format.</value>
+        public Format DepthStencilFormat
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Gets or sets the Direct3D9 specific settings.
+        /// </summary>
+        /// <value>The Direct3D9 specific settings.</value>
+        internal Direct3D9Settings Direct3D9
+        {
+            get;
+            set;
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="DeviceSettings"/> class.
+        /// </summary>
+        public DeviceSettings()
+        {
+            // set sane defaults
+            DeviceType = DeviceType.Hardware;
+            BackBufferFormat = Format.Unknown;
+            BackBufferCount = 1;
+            MultisampleType = MultisampleType.None;
+            DepthStencilFormat = Format.Unknown;
+            Windowed = true;
+            EnableVSync = true;
+        }
+
+        /// <summary>
+        /// Creates a new object that is a copy of the current instance.
+        /// </summary>
+        /// <returns>
+        /// A new object that is a copy of this instance.
+        /// </returns>
+        public DeviceSettings Clone()
+        {
+            DeviceSettings result = new DeviceSettings();
+            result.DeviceType = DeviceType;
+            result.RefreshRate = RefreshRate;
+            result.BackBufferCount = BackBufferCount;
+            result.BackBufferFormat = BackBufferFormat;
+            result.BackBufferHeight = BackBufferHeight;
+            result.BackBufferWidth = BackBufferWidth;
+            result.DepthStencilFormat = DepthStencilFormat;
+            result.MultisampleQuality = MultisampleQuality;
+            result.MultisampleType = MultisampleType;
+            result.Windowed = Windowed;
+            result.EnableVSync = EnableVSync;
+            result.AdapterOrdinal = AdapterOrdinal;
+            result.Multithreaded = Multithreaded;
+
+            if (Direct3D9 != null)
+                result.Direct3D9 = Direct3D9.Clone();
+
+            return result;
+        }
+
+        /// <summary>
+        /// Creates a new object that is a copy of the current instance.
+        /// </summary>
+        /// <returns>
+        /// A new object that is a copy of this instance.
+        /// </returns>
+        object ICloneable.Clone()
+        {
+            return Clone();
+        }
+
+        /// <summary>
+        /// Finds valid device settings based upon the desired settings.
+        /// </summary>
+        /// <param name="settings">The desired settings.</param>
+        /// <returns>The best valid device settings matching the input settings.</returns>
+               public static DeviceSettings FindValidSettings( DeviceSettings settings )
+               {
+                       try
+                       {
+                               GraphicsDeviceManager.EnsureD3D9();
+                       }
+                       catch( Exception e )
+                       {
+                               throw new NoCompatibleDevicesException( "Could not initialize Direct3D9.", e );
+                       }
+
+                       if( !Enumeration9.HasEnumerated )
+                               Enumeration9.Enumerate();
+
+                       DeviceSettings newSettings = settings.Clone();
+                       Direct3D9Settings d3d9 = FindValidD3D9Settings( settings );
+                       newSettings.Direct3D9 = d3d9;
+                       return newSettings;
+               }
+
+        static Direct3D9Settings FindValidD3D9Settings(DeviceSettings settings)
+        {
+            Direct3D9Settings optimal = Direct3D9Settings.BuildOptimalSettings(settings);
+
+            SettingsCombo9 bestCombo = null;
+            float bestRanking = -1.0f;
+
+            foreach (AdapterInfo9 adapterInfo in Enumeration9.Adapters)
+            {
+                DisplayMode desktopMode = GraphicsDeviceManager.Direct3D9Object.GetAdapterDisplayMode(adapterInfo.AdapterOrdinal);
+                foreach (DeviceInfo9 deviceInfo in adapterInfo.Devices)
+                {
+                    foreach (SettingsCombo9 combo in deviceInfo.DeviceSettings)
+                    {
+                        if (combo.Windowed && combo.AdapterFormat != desktopMode.Format)
+                            continue;
+
+                        float ranking = Direct3D9Settings.RankSettingsCombo(combo, optimal, desktopMode);
+                        if (ranking > bestRanking)
+                        {
+                            bestCombo = combo;
+                            bestRanking = ranking;
+                        }
+                    }
+                }
+            }
+
+            if (bestCombo == null)
+                throw new NoCompatibleDevicesException("No compatible Direct3D9 devices found.");
+
+            return Direct3D9Settings.BuildValidSettings(bestCombo, optimal);
+        }
+    }
+}