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 1c8b77cd1b
commit b2ac1d4c61
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

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
@ -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();