?? dxmut.cs
字號:
}
// Change to a Direct3D device created from the new device settings
// If there is an existing device, either reset or recreate
ChangeDevice(settings, null, false);
}
/// <summary>
/// Creates a Direct3D device. If CreateWindow or SetWindow has not already
/// been called, it will call CreateWindow with default parameters.
/// Instead of calling this, you can call SetDevice or CreateDeviceFromSettings
/// This is the CLS compliant version
/// </summary>
public void CreateDevice(int adapterOridinal, bool windowed, int suggestedWidth,
int suggestedHeight, IDeviceCreation callback)
{
CreateDevice((uint)adapterOridinal, windowed, suggestedWidth,
suggestedHeight, callback);
}
/// <summary>
/// Passes a previously created Direct3D device for use by the framework.
/// If CreateWindow() has not already been called, it will call it with the
/// default parameters. Instead of calling this, you can call CreateDevice() or
/// CreateDeviceFromSettings()
/// </summary>
public void SetDevice(Device device)
{
if (device == null)
throw new ArgumentNullException("device", "You cannot pass in a null device to SetDevice");
if (State.IsInsideDeviceCallback)
throw new InvalidOperationException("You cannot set a device from inside a callback.");
// Was the window created? If not, create it now
if (!State.WasWindowCreated)
{
// If CreateWindow or SetWindow was already called and failed, then fail again.
if (State.WasWindowCreateCalled)
{
throw new InvalidOperationException("CreateWindow was already called and failed.");
}
// Create a default window
CreateWindow("Direct3D Window", null, null, -1, -1);
}
DeviceSettings deviceSettings = new DeviceSettings();
// Get the present parameters from the swap chain
using(Surface backBuffer = device.GetBackBuffer(0, 0, BackBufferType.Mono))
{
using (SwapChain swap = backBuffer.GetContainer(InterfaceGuid.SwapChain) as SwapChain)
{
deviceSettings.presentParams = swap.PresentParameters;
System.Diagnostics.Debug.Assert(deviceSettings.presentParams != null, "You must have valid present parameters here.");
}
}
DeviceCreationParameters creationParams = device.CreationParameters;
// Fill out the device settings structure now
deviceSettings.AdapterOrdinal = (uint)creationParams.AdapterOrdinal;
deviceSettings.DeviceType = creationParams.DeviceType;
deviceSettings.AdapterFormat = FindAdapterFormat(deviceSettings.AdapterOrdinal,
deviceSettings.DeviceType, deviceSettings.presentParams.BackBufferFormat,
deviceSettings.presentParams.Windowed);
deviceSettings.BehaviorFlags = creationParams.Behavior.Value;
// Change to the Direct3D device passed in
ChangeDevice(deviceSettings, device, false);
}
/// <summary>
/// Tells the framework to change to a device created from the passed in device settings
/// If CreateWindow() has not already been called, it will call it with the
/// default parameters. Instead of calling this, you can call CreateDevice()
/// or SetDevice()
/// </summary>
public void CreateDeviceFromSettings(DeviceSettings deviceSettings, bool preserveInput)
{
// Set the state since this was called
State.WasDeviceCreateCalled = true;
// Was the window created? If not, create it now
if (!State.WasWindowCreated)
{
// If CreateWindow or SetWindow was already called and failed, then fail again.
if (State.WasWindowCreateCalled)
{
throw new InvalidOperationException("CreateWindow was already called and failed.");
}
// Create a default window
CreateWindow("Direct3D Window", null, null, -1, -1);
}
if (!preserveInput)
{
// If not preserving the input, the find the closest valid to it
MatchOptions match = new MatchOptions();
match.AdapterOrdinal = MatchType.ClosestToInput;
match.DeviceType = MatchType.ClosestToInput;
match.Windowed = MatchType.ClosestToInput;
match.AdapterFormat = MatchType.ClosestToInput;
match.VertexProcessing = MatchType.ClosestToInput;
match.Resolution = MatchType.ClosestToInput;
match.BackBufferFormat = MatchType.ClosestToInput;
match.BackBufferCount = MatchType.ClosestToInput;
match.MultiSample = MatchType.ClosestToInput;
match.SwapEffect = MatchType.ClosestToInput;
match.DepthFormat = MatchType.ClosestToInput;
match.StencilFormat = MatchType.ClosestToInput;
match.PresentFlags = MatchType.ClosestToInput;
match.RefreshRate = MatchType.ClosestToInput;
match.PresentInterval = MatchType.ClosestToInput;
try
{
deviceSettings = FindValidDeviceSettings(deviceSettings, match);
}
catch(Exception e)
{
// Display any error message
DisplayErrorMessage(e);
throw;
}
// Change to a Direct3D device created from the new device settings.
// If there is an existing device, then either reset or recreate the scene
ChangeDevice(deviceSettings, null, false);
}
}
/// <summary>
/// Tells the framework to change to a device created from the passed in device settings
/// If CreateWindow() has not already been called, it will call it with the
/// default parameters. Instead of calling this, you can call CreateDevice()
/// or SetDevice()
/// </summary>
public void CreateDeviceFromSettings(DeviceSettings deviceSettings) { CreateDeviceFromSettings(deviceSettings, false); }
/// <summary>
/// Toggle between full screen and windowed
/// </summary>
public void ToggleFullscreen()
{
// Pause the application
Pause(true, true);
// Get the current device settings and flip the windowed state then
// find the closest valid device settings with this change
DeviceSettings currentSettings = State.CurrentDeviceSettings.Clone();
currentSettings.presentParams.Windowed = !currentSettings.presentParams.Windowed;
MatchOptions match = new MatchOptions();
match.AdapterOrdinal = MatchType.PreserveInput;
match.DeviceType = MatchType.ClosestToInput;
match.Windowed = MatchType.PreserveInput;
match.AdapterFormat = MatchType.IgnoreInput;
match.VertexProcessing = MatchType.ClosestToInput;
match.BackBufferFormat = MatchType.IgnoreInput;
match.BackBufferCount = MatchType.ClosestToInput;
match.MultiSample = MatchType.ClosestToInput;
match.SwapEffect = MatchType.ClosestToInput;
match.DepthFormat = MatchType.ClosestToInput;
match.StencilFormat = MatchType.ClosestToInput;
match.PresentFlags = MatchType.ClosestToInput;
match.RefreshRate = MatchType.IgnoreInput;
match.PresentInterval = MatchType.IgnoreInput;
System.Drawing.Rectangle windowClient;
if (currentSettings.presentParams.Windowed)
windowClient = State.ClientRectangle;
else
windowClient = State.FullScreenClientRectangle;
if (windowClient.Width > 0 && windowClient.Height > 0)
{
match.Resolution = MatchType.ClosestToInput;
currentSettings.presentParams.BackBufferWidth = windowClient.Width;
currentSettings.presentParams.BackBufferHeight = windowClient.Height;
}
else
{
match.Resolution = MatchType.IgnoreInput;
}
try
{
if ( (!currentSettings.presentParams.Windowed) && (State.IsMaximized))
{
if (WindowForm != null)
{
WindowForm.WindowState = System.Windows.Forms.FormWindowState.Normal;
}
toggleMaximized = true;
}
currentSettings = FindValidDeviceSettings(currentSettings, match);
ChangeDevice(currentSettings, null, false);
Window.Size = State.WindowBoundsRectangle.Size;
Window.Location = State.WindowBoundsRectangle.Location;
if (currentSettings.presentParams.Windowed)
{
if (toggleMaximized)
{
if (WindowForm != null)
{
WindowForm.WindowState = System.Windows.Forms.FormWindowState.Maximized;
}
}
toggleMaximized = false;
}
}
finally
{
// Well, unpause no matter what
Pause(false, false);
State.CurrentDeviceSettings = currentSettings;
}
}
/// <summary>
/// Toggle between Hardware and Reference
/// </summary>
public void ToggleReference()
{
// Get the current device settings
DeviceSettings currentSettings = State.CurrentDeviceSettings.Clone();
if (currentSettings.DeviceType == DeviceType.Hardware)
currentSettings.DeviceType = DeviceType.Reference;
else if (currentSettings.DeviceType == DeviceType.Reference)
currentSettings.DeviceType = DeviceType.Hardware;
MatchOptions match = new MatchOptions();
match.AdapterOrdinal = MatchType.PreserveInput;
match.DeviceType = MatchType.PreserveInput;
match.Windowed = MatchType.ClosestToInput;
match.AdapterFormat = MatchType.ClosestToInput;
match.VertexProcessing = MatchType.ClosestToInput;
match.Resolution = MatchType.ClosestToInput;
match.BackBufferFormat = MatchType.ClosestToInput;
match.BackBufferCount = MatchType.ClosestToInput;
match.MultiSample = MatchType.ClosestToInput;
match.SwapEffect = MatchType.ClosestToInput;
match.DepthFormat = MatchType.ClosestToInput;
match.StencilFormat = MatchType.ClosestToInput;
match.PresentFlags = MatchType.ClosestToInput;
match.RefreshRate = MatchType.ClosestToInput;
match.PresentInterval = MatchType.ClosestToInput;
try
{
currentSettings = FindValidDeviceSettings(currentSettings, match);
ChangeDevice(currentSettings, null, false);
}
#if(DEBUG)
catch (Exception e)
{
// In debug mode show this error (maybe - depending on settings)
DisplayErrorMessage(e);
#else
catch
{
// In release mode fail silently
#endif
}
finally
{
// Update the current settings
State.CurrentDeviceSettings = currentSettings;
}
}
/// <summary>
/// This function tries to find valid device settings based upon the input device settings
/// struct and the match options. For each device setting a match option in the
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -