Updated BindStreamWriter to better handle endlines. Reverted WinRawInput to standard reads.

This commit is contained in:
the_fiddler 2007-09-22 14:59:33 +00:00
parent e277e3b272
commit 26f5d0dff4
10 changed files with 7838 additions and 2121 deletions

View file

@ -55,7 +55,7 @@ namespace Bind
public void Write(Bind.Structures.Enum e)
{
foreach (string s in splitLines.Split(e.ToString()))
WriteLine(s);
WriteLine(s.TrimEnd('\r', '\n'));
}
public void Write(Bind.Structures.Function f)

View file

@ -94,7 +94,7 @@ namespace Bind.Structures
sb.Append(c.ToString());
sb.AppendLine(",");
}
sb.AppendLine("}");
sb.Append("}");
return sb.ToString();
}

View file

@ -297,7 +297,7 @@ namespace Bind.Structures
{
sb.AppendLine(" " + s);
}
sb.AppendLine("}");
sb.Append("}");
return sb.ToString();
}

View file

@ -16,6 +16,7 @@ using OpenTK;
using OpenTK.Platform;
using OpenTK.Input;
using System.Diagnostics;
using System.Threading;
namespace Examples.Tests
{
@ -95,13 +96,13 @@ namespace Examples.Tests
k.KeyUp += new KeyUpEvent(LogKeyUp);
}
//PollTimer.Tick += new EventHandler(PollTimer_Tick);
//PollTimer.Start();
Application.Idle += new EventHandler(Application_Idle);
Application.Idle += new EventHandler(UpdateDevices);
}
void Application_Idle(object sender, EventArgs e)
void UpdateDevices(object sender, EventArgs e)
{
driver.Poll();
// Update mouse coordinates.
MouseXText.Text = driver.Mouse[ChooseMouse.SelectedIndex].X.ToString();
MouseYText.Text = driver.Mouse[ChooseMouse.SelectedIndex].Y.ToString();
@ -113,14 +114,14 @@ namespace Examples.Tests
void LogMouseButtonDown(IMouse sender, MouseButton button)
{
Trace.WriteLine(String.Format("Mouse button down: {0} on device: {1}", button, sender.DeviceID));
//Trace.WriteLine(String.Format("Mouse button down: {0} on device: {1}", button, sender.DeviceID));
if (sender.DeviceID == driver.Mouse[ChooseMouse.SelectedIndex].DeviceID)
MouseButtons.Items.Add(button);
}
void LogMouseButtonUp(IMouse sender, MouseButton button)
{
Trace.WriteLine(String.Format("Mouse button up: {0} on device: {1}", button, sender.DeviceID));
//Trace.WriteLine(String.Format("Mouse button up: {0} on device: {1}", button, sender.DeviceID));
if (sender.DeviceID == driver.Mouse[ChooseMouse.SelectedIndex].DeviceID)
MouseButtons.Items.Remove(button);
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,6 @@ using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using OpenTK.Platform;
using System.Diagnostics;
using System.Reflection.Emit;
@ -218,7 +217,7 @@ namespace OpenTK.OpenGL
{
MethodInfo m;
return
Utilities.GetExtensionDelegate(name, signature) ??
GetExtensionDelegate(name, signature) ??
/*((m = importsClass.GetMethod(name.Substring(2), BindingFlags.Static | BindingFlags.NonPublic)) != null ?*/
(Imports.import.TryGetValue((name.Substring(2)), out m) ?
Delegate.CreateDelegate(signature, m) : null);
@ -349,5 +348,126 @@ namespace OpenTK.OpenGL
}
#endregion
#region --- GetProcAddress ---
private static IGetProcAddress getProcAddress;
internal interface IGetProcAddress
{
IntPtr GetProcAddress(string function);
}
internal class GetProcAddressWindows : IGetProcAddress
{
public IntPtr GetProcAddress(string function)
{
return OpenTK.Platform.Windows.Wgl.Imports.GetProcAddress(function);
}
}
internal class GetProcAddressX11 : IGetProcAddress
{
public IntPtr GetProcAddress(string function)
{
return X11.Glx.GetProcAddress(function);
}
}
internal class GetProcAddressOSX : IGetProcAddress
{
public IntPtr GetProcAddress(string function)
{
string fname = "_" + function;
if (!OSX.Functions.NSIsSymbolNameDefined(fname))
return IntPtr.Zero;
IntPtr symbol = OSX.Functions.NSLookupAndBindSymbol(fname);
if (symbol != IntPtr.Zero)
symbol = OSX.Functions.NSAddressOfSymbol(symbol);
return symbol;
}
}
#region private static IntPtr GetAddress(string function)
/// <summary>
/// Retrieves the entry point for a dynamically exported OpenGL function.
/// </summary>
/// <param name="name">The function string for the OpenGL function (eg. "glNewList")</param>
/// <returns>
/// An IntPtr contaning the address for the entry point, or IntPtr.Zero if the specified
/// OpenGL function is not dynamically exported.
/// </returns>
/// <remarks>
/// <para>
/// The Marshal.GetDelegateForFunctionPointer method can be used to turn the return value
/// into a call-able delegate.
/// </para>
/// <para>
/// This function is cross-platform. It determines the underlying platform and uses the
/// correct wgl, glx or agl GetAddress function to retrieve the function pointer.
/// </para>
/// <see cref="Marshal.GetDelegateForFunctionPointer"/>
/// <seealso cref="Gl.GetDelegateForExtensionMethod"/>
/// </remarks>
private static IntPtr GetAddress(string function)
{
if (getProcAddress == null)
{
if (System.Environment.OSVersion.Platform == PlatformID.Win32NT ||
System.Environment.OSVersion.Platform == PlatformID.Win32S ||
System.Environment.OSVersion.Platform == PlatformID.Win32Windows ||
System.Environment.OSVersion.Platform == PlatformID.WinCE)
{
getProcAddress = new GetProcAddressWindows();
}
else if (System.Environment.OSVersion.Platform == PlatformID.Unix)
{
getProcAddress = new GetProcAddressX11();
}
else
{
throw new PlatformNotSupportedException(
"Extension loading is only supported under X11 and Windows. We are sorry for the inconvience.");
}
}
return getProcAddress.GetProcAddress(function);
}
#endregion
#region private static Delegate GetExtensionDelegate(string name, Type signature)
/// <summary>
/// Creates a System.Delegate that can be used to call a dynamically exported OpenGL function.
/// </summary>
/// <param name="name">The name of the OpenGL function (eg. "glNewList")</param>
/// <param name="signature">The signature of the OpenGL function.</param>
/// <returns>
/// A System.Delegate that can be used to call this OpenGL function or null
/// if the function is not available in the current OpenGL context.
/// </returns>
private static Delegate GetExtensionDelegate(string name, Type signature)
{
IntPtr address = GetAddress(name);
if (address == IntPtr.Zero ||
address == new IntPtr(1) || // Workaround for buggy nvidia drivers which return
address == new IntPtr(2)) // 1 or 2 instead of IntPtr.Zero for some extensions.
{
return null;
}
else
{
return Marshal.GetDelegateForFunctionPointer(address, signature);
}
}
#endregion
#endregion
}
}

View file

@ -21,147 +21,6 @@ namespace OpenTK.Platform
/// </summary>
public static class Utilities
{
#region --- LoadAddress ---
internal interface ILoadAddress
{
IntPtr LoadAddress(string function);
}
internal class LoadAddressWindows : ILoadAddress
{
public IntPtr LoadAddress(string function)
{
return OpenTK.Platform.Windows.Wgl.Imports.GetProcAddress(function);
}
}
internal class LoadAddressX11 : ILoadAddress
{
public IntPtr LoadAddress(string function)
{
return X11.Glx.GetProcAddress(function);
}
}
internal class LoadAddressOSX : ILoadAddress
{
public IntPtr LoadAddress(string function)
{
string fname = "_" + function;
if (!OSX.Functions.NSIsSymbolNameDefined(fname))
return IntPtr.Zero;
IntPtr symbol = OSX.Functions.NSLookupAndBindSymbol(fname);
if (symbol != IntPtr.Zero)
symbol = OSX.Functions.NSAddressOfSymbol(symbol);
return symbol;
}
}
#endregion
#region --- Fields ---
/// <summary>
/// Enumerates the platforms OpenTK can run on.
/// </summary>
private enum Platform
{
Unknown,
Windows,
X11,
X11_ARB,
OSX
};
private static ILoadAddress loadAddress;
#endregion
private static Platform platform = Platform.Unknown;
#region public static IntPtr GetAddress(string function)
/// <summary>
/// Retrieves the entry point for a dynamically exported OpenGL function.
/// </summary>
/// <param name="name">The function string for the OpenGL function (eg. "glNewList")</param>
/// <returns>
/// An IntPtr contaning the address for the entry point, or IntPtr.Zero if the specified
/// OpenGL function is not dynamically exported.
/// </returns>
/// <remarks>
/// <para>
/// The Marshal.GetDelegateForFunctionPointer method can be used to turn the return value
/// into a call-able delegate.
/// </para>
/// <para>
/// This function is cross-platform. It determines the underlying platform and uses the
/// correct wgl, glx or agl GetAddress function to retrieve the function pointer.
/// </para>
/// <see cref="Marshal.GetDelegateForFunctionPointer"/>
/// <seealso cref="Gl.GetDelegateForExtensionMethod"/>
/// </remarks>
public static IntPtr GetAddress(string function)
{
if (platform == Platform.Unknown)
{
if (System.Environment.OSVersion.Platform == PlatformID.Win32NT ||
System.Environment.OSVersion.Platform == PlatformID.Win32S ||
System.Environment.OSVersion.Platform == PlatformID.Win32Windows ||
System.Environment.OSVersion.Platform == PlatformID.WinCE)
{
platform = Platform.Windows;
loadAddress = new LoadAddressWindows();
}
else if (System.Environment.OSVersion.Platform == PlatformID.Unix)
{
platform = Platform.X11;
loadAddress = new LoadAddressX11();
}
else
{
throw new PlatformNotSupportedException(
"Extension loading is only supported under X11 and Windows. We are sorry for the inconvience.");
}
}
return loadAddress.LoadAddress(function);
}
#endregion
#region private static Delegate GetExtensionDelegate(string name, Type signature)
/// <summary>
/// Creates a System.Delegate that can be used to call a dynamically exported OpenGL function.
/// </summary>
/// <param name="name">The name of the OpenGL function (eg. "glNewList")</param>
/// <param name="signature">The signature of the OpenGL function.</param>
/// <returns>
/// A System.Delegate that can be used to call this OpenGL function or null
/// if the function is not available in the current OpenGL context.
/// </returns>
internal static Delegate GetExtensionDelegate(string name, Type signature)
{
IntPtr address = GetAddress(name);
if (address == IntPtr.Zero ||
address == new IntPtr(1) || // Workaround for buggy nvidia drivers which return
address == new IntPtr(2)) // 1 or 2 instead of IntPtr.Zero for some extensions.
{
return null;
}
else
{
return Marshal.GetDelegateForFunctionPointer(address, signature);
}
}
#endregion
static bool throw_on_error;
internal static bool ThrowOnX11Error
{

View file

@ -47,7 +47,7 @@ namespace OpenTK.Platform.Windows
Debug.Unindent();
AllocateBuffer();
//AllocateBuffer();
}
#endregion
@ -115,7 +115,7 @@ namespace OpenTK.Platform.Windows
Marshal.GetLastWin32Error()));
}
break;
case WindowMessage.CLOSE:
case WindowMessage.DESTROY:
Debug.Print("Input window detached from parent {0}.", Handle);
@ -145,53 +145,27 @@ namespace OpenTK.Platform.Windows
get { return mouseDriver.Mouse; }
}
int allocated_buffer_size; // rin_data size in bytes.
IntPtr rin_data; // Unmanaged buffer with grow-only behavior. Freed at Dispose(bool).
/// <summary>
/// Allocates a buffer for buffered reading of RawInput structs. Starts at 16*sizeof(RawInput) and
/// doubles the buffer every call thereafter.
/// </summary>
private void AllocateBuffer()
{
// Find the size of the buffer (grow-only).
if (allocated_buffer_size == 0)
{
allocated_buffer_size = 16536 * rawInputStructSize;
}
else
{
allocated_buffer_size *= 2;
}
// Allocate the new buffer.
if (rin_data != IntPtr.Zero)
{
Marshal.FreeHGlobal(rin_data);
}
rin_data = Marshal.AllocHGlobal(allocated_buffer_size);
if (rin_data == IntPtr.Zero)
{
throw new OutOfMemoryException(String.Format(
"Failed to allocate {0} bytes for raw input structures.", allocated_buffer_size));
}
}
public void Poll()
{
return;
// We will do a buffered read for all input devices and route the RawInput structures
// to the correct 'ProcessData' handlers. First, we need to find out the size of the
// buffer to allocate for the structures. Then we allocate the buffer and read the
// structures, calling the correct handler for each one. Last, we free the allocated
// buffer.
int size = 0;
API.GetRawInputBuffer(IntPtr.Zero, ref size, API.RawInputHeaderSize);
size *= 256;
IntPtr rin_data = Marshal.AllocHGlobal(size);
while (true)
{
// Iterate reading all available RawInput structures and routing them to their respective
// handlers.
int num = API.GetRawInputBuffer(rin_data, ref allocated_buffer_size, API.RawInputHeaderSize);
int num = API.GetRawInputBuffer(rin_data, ref size, API.RawInputHeaderSize);
if (num == 0)
return;
break;
else if (num < 0)
{
/*int error = Marshal.GetLastWin32Error();
@ -207,23 +181,32 @@ namespace OpenTK.Platform.Windows
}*/
Debug.Print("GetRawInputBuffer failed with code: {0}", Marshal.GetLastWin32Error());
//AllocateBuffer();
return;
break;
}
RawInput[] rin_structs = new RawInput[num];
IntPtr next_rin = rin_data;
int i = num;
while (--i > 0)
for (int i = 0; i < num; i++)
{
RawInput rin;
rin = (RawInput)Marshal.PtrToStructure(next_rin, typeof(RawInput));
if (rin.Header.Type == RawInputDeviceType.KEYBOARD)
keyboardDriver.ProcessKeyboardEvent(rin);
else if (rin.Header.Type == RawInputDeviceType.MOUSE)
mouseDriver.ProcessEvent(rin);
rin_structs[i] = (RawInput)Marshal.PtrToStructure(next_rin, typeof(RawInput));
switch (rin_structs[i].Header.Type)
{
case RawInputDeviceType.KEYBOARD:
keyboardDriver.ProcessKeyboardEvent(rin_structs[i]);
break;
case RawInputDeviceType.MOUSE:
mouseDriver.ProcessEvent(rin_structs[i]);
break;
}
next_rin = API.NextRawInputStructure(next_rin);
}
API.DefRawInputProc(rin_data, num, (uint)API.RawInputHeaderSize);
API.DefRawInputProc(rin_structs, num, (uint)API.RawInputHeaderSize);
}
Marshal.FreeHGlobal(rin_data);
}
#endregion
@ -242,11 +225,6 @@ namespace OpenTK.Platform.Windows
{
if (!disposed)
{
if (rin_data != IntPtr.Zero)
{
Marshal.FreeHGlobal(rin_data);
}
if (manual)
{
keyboardDriver.Dispose();