OSDN Git Service

Added keyboard motion control
authorLatif Khalifa <latifer@streamgrid.net>
Fri, 29 Jul 2011 21:04:54 +0000 (21:04 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Fri, 29 Jul 2011 21:04:54 +0000 (21:04 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@1034 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/Core/Keyboard.cs [new file with mode: 0644]
Radegast/Core/RadegastInstance.cs
Radegast/GUI/Rendering/Rendering.cs
Radegast/Radegast.csproj

diff --git a/Radegast/Core/Keyboard.cs b/Radegast/Core/Keyboard.cs
new file mode 100644 (file)
index 0000000..9430d83
--- /dev/null
@@ -0,0 +1,64 @@
+// 
+// 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
index ce7aeea..7715666 100644 (file)
@@ -212,6 +212,8 @@ namespace Radegast
             }
         }
 
+        public Keyboard Keyboard;
+
         #region Events
 
         #region ClientChanged event
@@ -287,6 +289,9 @@ namespace Radegast
             // Are we running mono?
             monoRuntime = Type.GetType("Mono.Runtime") != null;
 
+            Keyboard = new Keyboard();
+            Application.AddMessageFilter(Keyboard);
+
             netcom = new RadegastNetcom(this);
             state = new StateManager(this);
             mediaManager = new MediaManager(this);
index fc306aa..3524746 100644 (file)
@@ -2539,6 +2539,31 @@ namespace Radegast.Rendering
                 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
index 9eb4b9e..cd1b213 100644 (file)
     <Compile Include="Core\Contexts\IContextAction.cs" />\r
     <Compile Include="Core\Contexts\RezInventoryObjectAction.cs" />\r
     <Compile Include="Core\GridManager.cs" />\r
+    <Compile Include="Core\Keyboard.cs" />\r
     <Compile Include="Core\Media\BufferSound.cs" />\r
     <Compile Include="Core\Media\MediaManager.cs" />\r
     <Compile Include="Core\Media\MediaObject.cs" />\r