From 07671251c55a2f5883736ab610b279741d388c53 Mon Sep 17 00:00:00 2001 From: the_fiddler Date: Wed, 20 Oct 2010 15:14:38 +0000 Subject: [PATCH] * Input/MouseState.cs: Implemented MouseState structure. --- Source/OpenTK/Input/MouseState.cs | 86 +++++++++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 5 deletions(-) diff --git a/Source/OpenTK/Input/MouseState.cs b/Source/OpenTK/Input/MouseState.cs index feab5a18..77d044fb 100644 --- a/Source/OpenTK/Input/MouseState.cs +++ b/Source/OpenTK/Input/MouseState.cs @@ -36,10 +36,76 @@ namespace OpenTK.Input /// public struct MouseState : IEquatable { - #region Constructors + #region Fields - internal MouseState(MouseButton[] buttons) + // Allocate enough ints to store all mouse buttons + const int NumInts = ((int)MouseButton.LastButton + 31) / 32; + // The following line triggers bogus CS0214 in gmcs 2.0.1, sigh... + unsafe fixed int Buttons[NumInts]; + + #endregion + + #region Public Members + + /// + /// Gets a indicating whether this button is down. + /// + /// The to check. + public bool IsKeyDown(MouseButton button) { + return ReadBit((int)button); + } + + /// + /// Gets a indicating whether this button is up. + /// + /// The to check. + public bool IsKeyUp(MouseButton button) + { + return !ReadBit((int)button); + } + + #endregion + + #region Internal Members + + internal bool ReadBit(int offset) + { + int int_offset = offset / 32; + int bit_offset = offset % 32; + unsafe + { + fixed (int* b = Buttons) + { + return (*(b + int_offset) & (1 << bit_offset)) != 0u; + } + } + } + + internal void EnableBit(int offset) + { + int int_offset = offset / 32; + int bit_offset = offset % 32; + unsafe + { + fixed (int* b = Buttons) + { + *(b + int_offset) |= 1 << bit_offset; + } + } + } + + internal void DisableBit(int offset) + { + int int_offset = offset / 32; + int bit_offset = offset % 32; + unsafe + { + fixed (int* b = Buttons) + { + *(b + int_offset) &= ~(1 << bit_offset); + } + } } #endregion @@ -47,13 +113,23 @@ namespace OpenTK.Input #region IEquatable Members /// - /// Compares two MouseState instances for equality. + /// Compares two MouseState instances. /// - /// The instance to compare to. + /// The instance to compare two. /// True, if both instances are equal; false otherwise. public bool Equals(MouseState other) { - throw new NotImplementedException(); + bool equal = true; + unsafe + { + fixed (int* b1 = Buttons) + fixed (int* b2 = other.Buttons) + { + for (int i = 0; equal && i < NumInts; i++) + equal &= *(b1 + i) == *(b2 + i); + } + } + return equal; } #endregion