Framework:

Updates to mode switching under windows plus a little refactoring.
This commit is contained in:
the_fiddler 2006-10-17 19:34:49 +00:00
parent 5728bf0aa5
commit fdd693a4f1
12 changed files with 191 additions and 102 deletions

View file

@ -65,6 +65,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Specifications", "Specifica
Source\OpenGL\Specifications\wglext.spec = Source\OpenGL\Specifications\wglext.spec
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Framework", "Framework", "{91C9E74A-12CE-4770-82F4-C257CC4A4046}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GLSL.Lesson02", "Source\Examples\OpenGL\GLSL\Lesson02\GLSL.Lesson02.csproj", "{8814A9FE-F6B2-4BE1-82D5-1E9F02BD9B4B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -95,6 +99,10 @@ Global
{26B55626-4EAB-4CAE-82FE-93CD6564D9EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{26B55626-4EAB-4CAE-82FE-93CD6564D9EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{26B55626-4EAB-4CAE-82FE-93CD6564D9EA}.Release|Any CPU.Build.0 = Release|Any CPU
{8814A9FE-F6B2-4BE1-82D5-1E9F02BD9B4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8814A9FE-F6B2-4BE1-82D5-1E9F02BD9B4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8814A9FE-F6B2-4BE1-82D5-1E9F02BD9B4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8814A9FE-F6B2-4BE1-82D5-1E9F02BD9B4B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -114,7 +122,9 @@ Global
{1EDDE592-3923-4898-9006-3D69579E1745} = {2F3FEAD4-0FBD-48CC-AFA0-29FFF28284C2}
{D26F26AC-2154-4900-93EB-66E5A7761D05} = {2F3FEAD4-0FBD-48CC-AFA0-29FFF28284C2}
{70FA6EE8-62C6-437F-AD82-117F2D9CDE68} = {C6E60A87-12B4-444A-BE03-7E980EAC0172}
{91C9E74A-12CE-4770-82F4-C257CC4A4046} = {C6E60A87-12B4-444A-BE03-7E980EAC0172}
{46980D11-67FA-4B33-903F-BC9D8A4FE60F} = {70FA6EE8-62C6-437F-AD82-117F2D9CDE68}
{8814A9FE-F6B2-4BE1-82D5-1E9F02BD9B4B} = {70FA6EE8-62C6-437F-AD82-117F2D9CDE68}
{26B55626-4EAB-4CAE-82FE-93CD6564D9EA} = {508EF114-8C2A-470D-89FE-5AC15B336B4C}
EndGlobalSection
EndGlobal

View file

@ -17,9 +17,10 @@ using OpenTK.OpenGL;
namespace OpenTK.Examples.OpenGL.GLSL
{
public partial class Cube : OpenTK.Frameworks.Framework
public class Cube : OpenTK.Frameworks.Framework
{
#region Shaders
string[] vertex_shader_source =
{
"void main() {",
@ -32,6 +33,7 @@ namespace OpenTK.Examples.OpenGL.GLSL
{
"void main() { gl_FragColor = gl_Color; }\0"
};
#endregion
static float angle;
@ -153,7 +155,7 @@ namespace OpenTK.Examples.OpenGL.GLSL
break;
case Keys.F1:
//this.Fullscreen = !this.Fullscreen;
this.SetResolution(this.Width, this.Height, this.ColorDepth, !this.Fullscreen);
break;
}
}

View file

@ -28,7 +28,7 @@ namespace OpenTK.Frameworks
public GLContext Context
{
get { return _context; }
protected set { _context = value; }
private set { _context = value; }
}
#endregion
@ -52,7 +52,7 @@ namespace OpenTK.Frameworks
public OpenTK.OpenGL.ColorDepth ColorDepth
{
get { return _color_depth; }
set { _color_depth = value; }
private set { _color_depth = value; }
}
#endregion
@ -64,7 +64,7 @@ namespace OpenTK.Frameworks
public int ZDepth
{
get { return _z_depth; }
set { _z_depth = value; }
private set { _z_depth = value; }
}
#endregion
@ -76,7 +76,7 @@ namespace OpenTK.Frameworks
public int StencilDepth
{
get { return _stencil_depth; }
set { _stencil_depth = value; }
private set { _stencil_depth = value; }
}
#endregion
@ -88,7 +88,7 @@ namespace OpenTK.Frameworks
public Size DesktopResolution
{
get { return _desktop_resolution; }
protected set { _desktop_resolution = value; }
private set { _desktop_resolution = value; }
}
#endregion
@ -100,7 +100,19 @@ namespace OpenTK.Frameworks
public float DesktopRefreshRate
{
get { return _desktop_refresh_rate; }
protected set { _desktop_refresh_rate = value; }
private set { _desktop_refresh_rate = value; }
}
#endregion
#region DesktopColorDepth property
private OpenTK.OpenGL.ColorDepth _desktop_color_depth;
public OpenTK.OpenGL.ColorDepth DesktopColorDepth
{
get { return _desktop_color_depth; }
private set { _desktop_color_depth = value; }
}
#endregion
@ -113,7 +125,7 @@ namespace OpenTK.Frameworks
public Framework()
{
Setup(null, 640, 480, new OpenTK.OpenGL.ColorDepth(8, 8, 8, 8), 16, 0, false);
Setup(null, 800, 600, new OpenTK.OpenGL.ColorDepth(8, 8, 8, 8), 16, 0, false);
}
@ -124,13 +136,10 @@ namespace OpenTK.Frameworks
#endregion
public void Setup(string title, int width, int height, OpenTK.OpenGL.ColorDepth color, int depth, int stencil, bool fullscreen)
#region Setup(string title, int width, int height, OpenTK.OpenGL.ColorDepth color, int depth, int stencil, bool fullscreen)
private void Setup(string title, int width, int height, OpenTK.OpenGL.ColorDepth color, int depth, int stencil, bool fullscreen)
{
// Initialise components.
ColorDepth = color;
ZDepth = depth;
StencilDepth = stencil;
// Set platform.
try
{
@ -140,7 +149,8 @@ namespace OpenTK.Frameworks
}
else if (Environment.OSVersion.Platform == PlatformID.Unix)
{
Implementation = new X11Implementation();
//Implementation = new X11Implementation();
throw new PlatformNotSupportedException("The platform on which you are trying to run this program is not currently supported. Sorry for the inconvenience.");
}
else
{
@ -162,6 +172,11 @@ namespace OpenTK.Frameworks
// //Context.MakeCurrent();
//}
// Initialise components.
ColorDepth = color;
ZDepth = depth;
StencilDepth = stencil;
Context = GLContext.Create(this, color, depth, stencil);
// Code taken from NeHe tutorials
@ -172,9 +187,7 @@ namespace OpenTK.Frameworks
//this.SetStyle(ControlStyles.ResizeRedraw, true); // Redraw On Resize
this.SetStyle(ControlStyles.UserPaint, true); // We'll Handle Painting Ourselves
this.Size = new Size(width, height);
Fullscreen = Implementation.SetResolution(fullscreen);
this.Size = new Size(width, height); // Force the window to change to the requested resolution.
Implementation.SetResolution(width, height, color, fullscreen);
if (title == null)
title = "OpenTK Windows application";
@ -183,6 +196,8 @@ namespace OpenTK.Frameworks
Application.Idle += new EventHandler(OnIdle);
}
#endregion
#region Event Handlers
/// <summary>
@ -194,14 +209,32 @@ namespace OpenTK.Frameworks
{
while (Implementation.IsIdle())
{
if (ActiveForm != this)
Thread.Sleep(100);
//if (ActiveForm != this)
// Thread.Sleep(100);
OnPaint(null);
}
}
#endregion
#region Public member functions
/// <summary>
/// Requests mode change. The parameters are hints for the mode, which may or may not be
/// possible according to the hardware.
/// </summary>
/// <param name="width">The horizontal resolution in pixels.</param>
/// <param name="height">The vertical resolution in pixels.</param>
/// <param name="color">The color depth.</param>
/// <param name="fullscreen">Set to true to set a fullscreen mode or false to set a windowed mode.</param>
/// <returns>True if the mode set was fullscreen, false otherwise.</returns></returns>
public void SetResolution(int width, int height, OpenTK.OpenGL.ColorDepth color, bool fullscreen)
{
Implementation.SetResolution(width, height, color, fullscreen);
}
#endregion
#region IDisposable Members
void IDisposable.Dispose()

View file

@ -19,8 +19,7 @@ namespace OpenTK.Frameworks
public abstract bool IsIdle();
public abstract void Setup();
//abstract public void CloseWindow();
public abstract bool SetResolution(int width, int height, OpenTK.OpenGL.ColorDepth color, bool fullscreen);
public abstract bool SetResolution(bool fullscreen);
public abstract void SetResolution(int width, int height, OpenTK.OpenGL.ColorDepth color, bool fullscreen);
}
}
}

View file

@ -47,9 +47,6 @@
<Compile Include="WindowsImplementation.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="X11Implementation.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenGL\OpenGL\OpenTK.OpenGL.csproj">

View file

@ -48,20 +48,41 @@ namespace OpenTK.Frameworks
override public void Setup()
{
Api.DeviceMode device_mode = new Api.DeviceMode();
Api.EnumDisplaySettings(null, Api.Constants.ENUM_REGISTRY_SETTINGS, device_mode);
framework.DesktopResolution = new Size(device_mode.PelsWidth, device_mode.PelsHeight);
framework.DesktopRefreshRate = device_mode.DisplayFrequency;
framework.DesktopColorDepth = new OpenTK.OpenGL.ColorDepth(device_mode.BitsPerPel);
}
public override bool SetResolution(int width, int height, OpenTK.OpenGL.ColorDepth color, bool fullscreen)
public override void SetResolution(int width, int height, OpenTK.OpenGL.ColorDepth color, bool fullscreen)
{
if (framework.Size == new Size(width, height) && framework.ColorDepth == color && framework.Fullscreen == fullscreen)
return;
// If we want to change to a fullscreen mode
if (fullscreen)
{
Application.Idle -= framework.OnIdle;
//framework.Context.Dispose();
Api.DeviceMode ScreenSettings = new Api.DeviceMode(); // Device Mode
ScreenSettings.Size = (short)Marshal.SizeOf(ScreenSettings); // Size Of The Devmode Structure
ScreenSettings.PelsWidth = width; // Selected Screen Width
ScreenSettings.PelsHeight = height; // Selected Screen Height
ScreenSettings.BitsPerPel = color.Alpha + // Selected Bits Per Pixel
if (framework.WindowState == FormWindowState.Maximized)
{
Rectangle bounds = framework.RestoreBounds;
framework.WindowState = FormWindowState.Normal;
width = bounds.Width;
height = bounds.Height;
//framework.Size = new Size(bounds.Width, bounds.Height);
//framework.Bounds = new Rectangle(0, 0, bounds.Width, bounds.Height);
}
//if (color != framework.ColorDepth)
// framework.Context.Dispose();
Api.DeviceMode ScreenSettings = new Api.DeviceMode();
ScreenSettings.PelsWidth = width; // Selected Screen Width
ScreenSettings.PelsHeight = height; // Selected Screen Height
ScreenSettings.BitsPerPel = color.Alpha + // Selected Bits Per Pixel
color.Red +
color.Green +
color.Blue;
@ -71,8 +92,10 @@ namespace OpenTK.Frameworks
Application.Idle += framework.OnIdle;
// Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
if (Api.ChangeDisplaySettings(ref ScreenSettings, Api.Constants.CDS_FULLSCREEN) == Api.Constants.DISP_CHANGE_SUCCESSFUL)
if (Api.ChangeDisplaySettings(ScreenSettings, Api.Constants.CDS_FULLSCREEN) == Api.Constants.DISP_CHANGE_SUCCESSFUL)
{
framework.Fullscreen = true;
framework.FormBorderStyle = FormBorderStyle.None;
framework.StartPosition = FormStartPosition.Manual;
framework.Location = new System.Drawing.Point(0, 0);
@ -82,60 +105,36 @@ namespace OpenTK.Frameworks
Cursor.Hide();
framework.Size = new Size(width, height);
return true;
}
else
{
return false;
// If mode change wasn't possible.
framework.Fullscreen = false;
framework.Size = new Size(width, height);
}
}
framework.Size = new Size(width, height);
return false;
}
public override bool SetResolution(bool fullscreen)
{
if (fullscreen)
else
{
Application.Idle -= framework.OnIdle;
//framework.Context.Dispose();
// If we already are in fullscreen mode and we want to change to windowed mode.
Api.DeviceMode ScreenSettings = new Api.DeviceMode(); // Device Mode
ScreenSettings.Size = (short)Marshal.SizeOf(ScreenSettings); // Size Of The Devmode Structure
ScreenSettings.PelsWidth = framework.Width; // Selected Screen Width
ScreenSettings.PelsHeight = framework.Height; // Selected Screen Height
ScreenSettings.BitsPerPel = framework.ColorDepth.Alpha + // Selected Bits Per Pixel
framework.ColorDepth.Red +
framework.ColorDepth.Green +
framework.ColorDepth.Blue;
ScreenSettings.Fields = Api.Constants.DM_BITSPERPEL | Api.Constants.DM_PELSWIDTH | Api.Constants.DM_PELSHEIGHT;
//framework.Context = GLContext.Create(framework, framework.ColorDepth, 16, 0);
Application.Idle += framework.OnIdle;
// Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
if (Api.ChangeDisplaySettings(ref ScreenSettings, Api.Constants.CDS_FULLSCREEN) == Api.Constants.DISP_CHANGE_SUCCESSFUL)
if (framework.Fullscreen)
{
framework.FormBorderStyle = FormBorderStyle.None;
framework.StartPosition = FormStartPosition.Manual;
framework.Location = new System.Drawing.Point(0, 0);
//framework.Region = new Region(new Rectangle(0, 0, width, height));
framework.Capture = true;
Application.Idle -= framework.OnIdle;
// Restore display settings
Api.ChangeDisplaySettings(null, 0);
framework.FormBorderStyle = FormBorderStyle.Sizable;
framework.StartPosition = FormStartPosition.WindowsDefaultLocation;
framework.Capture = false;
framework.SetTopLevel(true);
Cursor.Hide();
Cursor.Show();
return true;
}
else
{
return false;
Application.Idle += framework.OnIdle;
}
framework.Fullscreen = false;
framework.Size = new Size(width, height);
}
return false;
}
}
}

View file

@ -48,11 +48,6 @@ namespace OpenTK.Frameworks
{
throw new Exception("The method or operation is not implemented.");
}
public override bool SetResolution(bool fullscreen)
{
throw new Exception("The method or operation is not implemented.");
}
}
}
}

View file

@ -17888,4 +17888,3 @@ namespace OpenTK.OpenGL
#endregion static Constructor
}
}

View file

@ -12,6 +12,28 @@ namespace OpenTK.OpenGL
public struct ColorDepth
{
public ColorDepth(int bpp)
{
Red = Green = Blue = Alpha = 0;
switch (bpp)
{
case 32:
Red = Green = Blue = Alpha = 8;
break;
case 24:
Red = Green = Blue = 8;
break;
case 16:
Red = Blue = 5;
Green = 6;
break;
case 15:
Red = Green = Blue = 5;
break;
}
}
public ColorDepth(byte red, byte green, byte blue, byte alpha)
{
Red = red;
@ -21,6 +43,19 @@ namespace OpenTK.OpenGL
}
public byte Red, Green, Blue, Alpha;
public static bool operator ==(ColorDepth left, ColorDepth right)
{
return left.Red == right.Red &&
left.Green == right.Green &&
left.Blue == right.Blue &&
left.Alpha == right.Alpha;
}
public static bool operator !=(ColorDepth left, ColorDepth right)
{
return !(left == right);
}
}
#endregion

View file

@ -56,6 +56,7 @@ namespace OpenTK.Platform.Windows
public const int DISP_CHANGE_FAILED = -1;
// (found in WinUSER.h)
public const int ENUM_REGISTRY_SETTINGS = -2;
public const int ENUM_CURRENT_SETTINGS = -1;
}
#endregion
@ -400,10 +401,17 @@ namespace OpenTK.Platform.Windows
/// <param name="flags"></param>
/// <returns></returns>
[DllImport("user32.dll", SetLastError = true)]
public static extern int ChangeDisplaySettings(ref DeviceMode device_mode, int flags);
public static extern int ChangeDisplaySettings(DeviceMode device_mode, int flags);
#endregion int ChangeDisplaySettings(ref Gdi.DEVMODE devMode, int flags)
#region EnumDisplaySettings
[DllImport("user32.dll", SetLastError = true)]
public static extern int EnumDisplaySettings([MarshalAs(UnmanagedType.LPTStr)] string device_name, int graphics_mode, DeviceMode device_mode);
#endregion
// *********** Never use GetLastError! ************
//#region GetLastError
@ -579,15 +587,21 @@ namespace OpenTK.Platform.Windows
}
#endregion
#region DeviceMode struct
#region DeviceMode class
[StructLayout(LayoutKind.Sequential)]
public struct DeviceMode
public class DeviceMode
{
public DeviceMode()
{
Size = (short)Marshal.SizeOf(this);
}
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
public string DeviceName;
public short SpecVersion;
public short DriverVersion;
public short Size;
private short Size;
public short DriverExtra;
public int Fields;
public short Orientation;
@ -620,16 +634,21 @@ namespace OpenTK.Platform.Windows
public int PanningWidth;
public int PanningHeight;
}
#endregion
#endregion DeviceMode class
#endregion
#region Callbacks
[UnmanagedFunctionPointerAttribute(CallingConvention.Winapi)]
public delegate void WindowProcedureEventHandler(object sender, WindowProcedureEventArgs e);
public class WindowProcedureEventArgs : EventArgs
{
public System.Windows.Forms.Message Msg;
public Message Msg;
}
#endregion
}
}

View file

@ -3,10 +3,16 @@ OpenTK 0.3.6
OpenTK 0.3.5 -> 0.3.6
+ Updates to OpenTK.OpenGL.Bind (see that changelog for more info).
+ Revamped GL class (is self contained)
+ Revamped GL class (it is self contained now).
+ Revamped GLContext class (it is no longer bound to the GL class initialisation).
+ Directory structure updates (Documentation folder for each project, plus main Documentation folder)
+ Framework updates (cleaner implementation, new namespace).
+ Directory structure updates.
+ Now every project has its own documentation.
+ The spec files for OpenGL now reside in the Source/OpenTK/OpenGL directory.
+ Framework updates:
+ Cleaner implementation.
+ New namespace.
+ Supports basic mode sswitching under windows (the code is not robust enough, yet).
+ Added very basic GLX and X bindings, just enough to create a basic OpenGL window.
OpenTK 0.3.4 -> 0.3.5

View file

@ -1,18 +1,13 @@
Todo:
+ + + Update directory structure (specs shouldn't reside in the top directory)
+ + + Restore the Extensions.
+ + + Fully implement Framework class.
+ + + Correct the Dispose methods to correctly clean resources (they should also call GC.SupressFinalize(true))
+ + + Add basic GLX bindings (in progress)
+ + + Add basic X bindings (in progress)
+ + + Add context creation support for X (needs fixing)
+ + + Test X support.
+ + + Fix X support in the framework.
+ + + Add the CLS compliant attribute to the GL class.
+ + + Clean up the build system for windows .Net, and add build system for linux Mono and windows Mono.
+ + Add docs to each project.
+ + Add cross-platform way for defining the Application.Idle handler (needs testing)
+ Probably something like Nant?
+ + Document projects (source and manuals).
+ + Add more constructors to the Context classes.
+ + Add comments and documentation (faqs, pitfalls, best practices).
+ + Add a cross-platform build system (probably NAnt?)
+ Add more examples.
+ Find out what is needed for the MacOS platform (how to do function loading and window management without X11).
+ Add full bindings for glu, wgl, glx and agl (probably generated automatically).