--- /dev/null
+//
+// Radegast Metaverse Client
+// Copyright (c) 2009-2011, Radegast Development Team
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// * Neither the name of the application "Radegast", nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// $Id$
+//
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace Radegast
+{
+ public class Keyboard : IMessageFilter
+ {
+ const int WM_KEYDOWN = 0x100;
+ const int WM_KEYUP = 0x101;
+ HashSet<Keys> mKeyStates = new HashSet<Keys>();
+
+ public bool PreFilterMessage(ref Message m)
+ {
+ if (m.Msg == WM_KEYDOWN)
+ {
+ Keys key = (Keys)(int)m.WParam & Keys.KeyCode;
+ mKeyStates.Add(key);
+ }
+ else if (m.Msg == WM_KEYUP)
+ {
+ Keys key = (Keys)(int)m.WParam & Keys.KeyCode;
+ mKeyStates.Remove(key);
+ }
+ return false;
+ }
+
+ public bool IsKeyDown(Keys key)
+ {
+ return mKeyStates.Contains(key);
+ }
+ }
+}
\ No newline at end of file
texturesRequestedThisFrame = 0;\r
meshingsRequestedThisFrame = 0;\r
\r
+ #region Motion control\r
+ if (ModifierKeys == Keys.None)\r
+ {\r
+ Client.Self.Movement.AtPos = Instance.Keyboard.IsKeyDown(Keys.Up);\r
+ Client.Self.Movement.AtNeg = Instance.Keyboard.IsKeyDown(Keys.Down);\r
+ Client.Self.Movement.TurnLeft = Instance.Keyboard.IsKeyDown(Keys.Left);\r
+ Client.Self.Movement.TurnRight = Instance.Keyboard.IsKeyDown(Keys.Right);\r
+\r
+ if (Client.Self.Movement.TurnLeft)\r
+ {\r
+ Client.Self.Movement.BodyRotation = Client.Self.Movement.BodyRotation * Quaternion.CreateFromAxisAngle(Vector3.UnitZ, lastFrameTime);\r
+ }\r
+ else if (client.Self.Movement.TurnRight)\r
+ {\r
+ Client.Self.Movement.BodyRotation = Client.Self.Movement.BodyRotation * Quaternion.CreateFromAxisAngle(Vector3.UnitZ, -lastFrameTime);\r
+ }\r
+ }\r
+ else if (ModifierKeys == Keys.Shift)\r
+ {\r
+ Client.Self.Movement.LeftNeg = Instance.Keyboard.IsKeyDown(Keys.Left);\r
+ Client.Self.Movement.LeftPos = Instance.Keyboard.IsKeyDown(Keys.Right);\r
+ }\r
+\r
+ #endregion Motion control\r
+\r
// Alpha mask elements, no blending, alpha test for A > 0.5\r
GL.Enable(EnableCap.AlphaTest);\r
RenderTerrain();\r