diff --git a/ANX.Framework.sln b/ANX.Framework.sln index 968eaa04..d3da0b2e 100644 --- a/ANX.Framework.sln +++ b/ANX.Framework.sln @@ -115,6 +115,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ANX.InputSystem.Recording", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ANX.RenderSystem.Windows.Metro", "RenderSystems\ANX.RenderSystem.Windows.Metro\ANX.RenderSystem.Windows.Metro.csproj", "{FF0AB665-2796-4354-9630-76C2751DB3C2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RecordingSample", "RecordingSample\RecordingSample\RecordingSample.csproj", "{160150D5-38E6-482D-97F5-2624F322A854}" +EndProject Global GlobalSection(SubversionScc) = preSolution Svn-Managed = True @@ -397,6 +399,16 @@ Global {FF0AB665-2796-4354-9630-76C2751DB3C2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {FF0AB665-2796-4354-9630-76C2751DB3C2}.Release|Mixed Platforms.Build.0 = Release|Any CPU {FF0AB665-2796-4354-9630-76C2751DB3C2}.Release|x86.ActiveCfg = Release|Any CPU + {160150D5-38E6-482D-97F5-2624F322A854}.Debug|Any CPU.ActiveCfg = Debug|x86 + {160150D5-38E6-482D-97F5-2624F322A854}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {160150D5-38E6-482D-97F5-2624F322A854}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {160150D5-38E6-482D-97F5-2624F322A854}.Debug|x86.ActiveCfg = Debug|x86 + {160150D5-38E6-482D-97F5-2624F322A854}.Debug|x86.Build.0 = Debug|x86 + {160150D5-38E6-482D-97F5-2624F322A854}.Release|Any CPU.ActiveCfg = Release|x86 + {160150D5-38E6-482D-97F5-2624F322A854}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {160150D5-38E6-482D-97F5-2624F322A854}.Release|Mixed Platforms.Build.0 = Release|x86 + {160150D5-38E6-482D-97F5-2624F322A854}.Release|x86.ActiveCfg = Release|x86 + {160150D5-38E6-482D-97F5-2624F322A854}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -420,6 +432,7 @@ Global {71378D2F-0DCD-4413-8DE0-3FEC0BA04E27} = {9B0DD48B-3912-4F33-AF3F-691AF02B73F9} {41E6C2CF-51EA-4D8E-96AE-739CA3951766} = {9B0DD48B-3912-4F33-AF3F-691AF02B73F9} {57097B7A-A283-4409-8AAC-35BF0F458657} = {9B0DD48B-3912-4F33-AF3F-691AF02B73F9} + {160150D5-38E6-482D-97F5-2624F322A854} = {9B0DD48B-3912-4F33-AF3F-691AF02B73F9} {E5D69E75-D77C-493F-BBDA-6F9E73B82549} = {7AD65E6B-2A48-437F-81D9-4CA9C9A85C64} {60D08399-244F-46A3-91F1-4CFD26D961A3} = {7AD65E6B-2A48-437F-81D9-4CA9C9A85C64} {5CA3CDF5-4D2C-42AC-AD08-641BD3992B75} = {7AD65E6B-2A48-437F-81D9-4CA9C9A85C64} diff --git a/InputSystems/ANX.InputSystem.Recording/RecordableDevice.cs b/InputSystems/ANX.InputSystem.Recording/RecordableDevice.cs index c44a2c7c..4dcfad63 100644 --- a/InputSystems/ANX.InputSystem.Recording/RecordableDevice.cs +++ b/InputSystems/ANX.InputSystem.Recording/RecordableDevice.cs @@ -85,6 +85,9 @@ namespace ANX.InputSystem.Recording /// protected void Initialize(Stream bufferStream) { + if (!bufferStream.CanRead || !bufferStream.CanWrite) + throw new ArgumentException("The stream must support read and write opearions!", "bufferStream"); + recordStream = bufferStream; isInitialized = true; @@ -98,6 +101,10 @@ namespace ANX.InputSystem.Recording if (RecordingState == RecordingState.Recording) return; + //Reset the stream if we can seek + if(recordStream.CanSeek) + recordStream.Position = 0; + RecordingState = RecordingState.Recording; } @@ -117,6 +124,10 @@ namespace ANX.InputSystem.Recording if (RecordingState == RecordingState.Recording) throw new InvalidOperationException("Recording is currently running for this device."); + //Reset the stream if we can seek + if (recordStream.CanSeek) + recordStream.Position = 0; + RecordingState = RecordingState.Playback; } diff --git a/InputSystems/ANX.InputSystem.Recording/RecordingMouse.cs b/InputSystems/ANX.InputSystem.Recording/RecordingMouse.cs index 607da68e..1dacab7f 100644 --- a/InputSystems/ANX.InputSystem.Recording/RecordingMouse.cs +++ b/InputSystems/ANX.InputSystem.Recording/RecordingMouse.cs @@ -99,15 +99,15 @@ namespace ANX.InputSystem.Recording protected IMouse realMouse; protected MouseRecordInfo recordInfo; - public IntPtr WindowHandle - { - get { return realMouse.WindowHandle; } + public IntPtr WindowHandle + { + get { return realMouse.WindowHandle; } set { realMouse.WindowHandle = value; } } public MouseState GetState() //The main recording/playback logic is placed here { - switch(RecordingState) + switch (RecordingState) { case RecordingState.None: return realMouse.GetState(); @@ -117,7 +117,7 @@ namespace ANX.InputSystem.Recording if (stateData == null) //No input at this position return new MouseState(); - + byte readOffset = 0; ButtonState left, right, middle, x1, x2; int scrollWheel, xPos, yPos; @@ -136,17 +136,26 @@ namespace ANX.InputSystem.Recording left = right = middle = x1 = x2 = ButtonState.Released; if (recordInfo.HasFlag(MouseRecordInfo.ScrollWheel)) - scrollWheel = BitConverter.ToInt32(stateData, readOffset++); + { + scrollWheel = BitConverter.ToInt32(stateData, readOffset); + readOffset += 4; + } else scrollWheel = 0; if (recordInfo.HasFlag(MouseRecordInfo.XPosition)) - xPos = BitConverter.ToInt32(stateData, readOffset++); + { + xPos = BitConverter.ToInt32(stateData, readOffset); + readOffset += 4; + } else xPos = 0; if (recordInfo.HasFlag(MouseRecordInfo.YPosition)) - yPos = BitConverter.ToInt32(stateData, readOffset++); + { + yPos = BitConverter.ToInt32(stateData, readOffset); + readOffset += 4; + } else yPos = 0; @@ -168,13 +177,22 @@ namespace ANX.InputSystem.Recording } if (recordInfo.HasFlag(MouseRecordInfo.ScrollWheel)) - Array.ConstrainedCopy(BitConverter.GetBytes(state.ScrollWheelValue), 0, buffer, writeOffset++, 4); //int is always 4 byte long. + { + Array.ConstrainedCopy(BitConverter.GetBytes(state.ScrollWheelValue), 0, buffer, writeOffset, 4); //int is always 4 byte long. + writeOffset += 4; + } - if(recordInfo.HasFlag(MouseRecordInfo.XPosition)) - Array.ConstrainedCopy(BitConverter.GetBytes(state.X), 0, buffer, writeOffset++, 4); //int is always 4 byte long. + if (recordInfo.HasFlag(MouseRecordInfo.XPosition)) + { + Array.ConstrainedCopy(BitConverter.GetBytes(state.X), 0, buffer, writeOffset, 4); //int is always 4 byte long. + writeOffset += 4; + } - if(recordInfo.HasFlag(MouseRecordInfo.YPosition)) - Array.ConstrainedCopy(BitConverter.GetBytes(state.Y), 0, buffer, writeOffset++, 4); //int is always 4 byte long. + if (recordInfo.HasFlag(MouseRecordInfo.YPosition)) + { + Array.ConstrainedCopy(BitConverter.GetBytes(state.Y), 0, buffer, writeOffset, 4); //int is always 4 byte long. + writeOffset += 4; + } WriteState(buffer); @@ -226,7 +244,6 @@ namespace ANX.InputSystem.Recording public void Initialize(MouseRecordInfo info, Stream bufferStream, IMouse mouse) { realMouse = mouse; - realMouse.WindowHandle = WindowHandle; recordInfo = info; PacketLenght = GetPaketSize(info); diff --git a/RecordingSample/RecordingSample/Game.ico b/RecordingSample/RecordingSample/Game.ico new file mode 100644 index 00000000..8cff41ea Binary files /dev/null and b/RecordingSample/RecordingSample/Game.ico differ diff --git a/RecordingSample/RecordingSample/Game1.cs b/RecordingSample/RecordingSample/Game1.cs new file mode 100644 index 00000000..57ff4953 --- /dev/null +++ b/RecordingSample/RecordingSample/Game1.cs @@ -0,0 +1,138 @@ +#region Using Statements +using System; +using System.Collections.Generic; +using System.Linq; +using ANX.Framework; +using ANX.Framework.Graphics; +using ANX.Framework.Input; +using ANX.Framework.NonXNA; +using ANX.InputSystem.Recording; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// This license governs use of the accompanying software. If you use the software, you accept this license. +// If you do not accept the license, do not use the software. +// +// 1.Definitions +// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning +// here as under U.S. copyright law. +// A "contribution" is the original software, or any additions or changes to the software. +// A "contributor" is any person that distributes its contribution under this license. +// "Licensed patents" are a contributor's patent claims that read directly on its contribution. +// +// 2.Grant of Rights +// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations +// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to +// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution +// or any derivative works that you create. +// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in +// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed +// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution +// in the software or derivative works of the contribution in the software. +// +// 3.Conditions and Limitations +// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. +// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your +// patent license from such contributor to the software ends automatically. +// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution +// notices that are present in the software. +// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including +// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or +// object code form, you may only do so under a license that complies with this license. +// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, +// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the +// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a +// particular purpose and non-infringement. + +#endregion // License + +namespace RecordingSample +{ + /// + /// Sample, showing the use of the RecordingSystem (currently only the Mouse). + /// + public class Game1 : Game + { + GraphicsDeviceManager graphics; + SpriteBatch spriteBatch; + + Texture2D logo; + RecordingMouse mouse; + KeyboardState oldState; + + public Game1() + { + graphics = new GraphicsDeviceManager(this); + Content.RootDirectory = "SampleContent"; + } + + protected override void Initialize() + { + Window.Title = "Use Mouse to move arround, press r to record, p for playback and n for none"; + + mouse = (RecordingMouse)AddInSystemFactory.Instance.GetCreator("Recording").Mouse; + mouse.Initialize(MouseRecordInfo.Position); + mouse.WindowHandle = Window.Handle; + mouse.EndOfPlaybackReached += new EventHandler((sender, args) => mouse.StopPlayback()); + + base.Initialize(); + } + + protected override void LoadContent() + { + spriteBatch = new SpriteBatch(GraphicsDevice); + + logo = Content.Load(@"Textures/ANX.Framework.Logo_459x121"); + oldState = Keyboard.GetState(); + } + + protected override void Update(GameTime gameTime) + { + KeyboardState newState = Keyboard.GetState(); + + if (oldState.IsKeyUp(Keys.R) && newState.IsKeyDown(Keys.R)) + mouse.StartRecording(); + + if (oldState.IsKeyUp(Keys.P) && newState.IsKeyDown(Keys.P)) + { + if (mouse.RecordingState == RecordingState.Recording) + mouse.StopRecording(); + mouse.StartPlayback(); + } + + if (oldState.IsKeyUp(Keys.N) && newState.IsKeyDown(Keys.N)) + { + if (mouse.RecordingState == RecordingState.Recording) + mouse.StartRecording(); + + mouse.StopPlayback(); + } + + oldState = newState; + + base.Update(gameTime); + } + + protected override void Draw(GameTime gameTime) + { + GraphicsDevice.Clear(Color.CornflowerBlue); + + spriteBatch.Begin(); + spriteBatch.Draw(logo, new Rectangle(mouse.GetState().X, mouse.GetState().Y, 115, 30), Color.White); + spriteBatch.End(); + + base.Draw(gameTime); + } + } +} diff --git a/RecordingSample/RecordingSample/GameThumbnail.png b/RecordingSample/RecordingSample/GameThumbnail.png new file mode 100644 index 00000000..462311ab Binary files /dev/null and b/RecordingSample/RecordingSample/GameThumbnail.png differ diff --git a/RecordingSample/RecordingSample/Program.cs b/RecordingSample/RecordingSample/Program.cs new file mode 100644 index 00000000..4b886da9 --- /dev/null +++ b/RecordingSample/RecordingSample/Program.cs @@ -0,0 +1,21 @@ +using System; + +namespace RecordingSample +{ +#if WINDOWS || XBOX + static class Program + { + /// + /// Der Haupteinstiegspunkt für die Anwendung. + /// + static void Main(string[] args) + { + using (Game1 game = new Game1()) + { + game.Run(); + } + } + } +#endif +} + diff --git a/RecordingSample/RecordingSample/Properties/AssemblyInfo.cs b/RecordingSample/RecordingSample/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..2e31610a --- /dev/null +++ b/RecordingSample/RecordingSample/Properties/AssemblyInfo.cs @@ -0,0 +1,34 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über den folgenden +// Satz von Attributen kontrolliert. Ändern Sie diese Attributwerte, um die mit einer Assembly +// verbundenen Informationen zu ändern. +[assembly: AssemblyTitle("RecordingSample")] +[assembly: AssemblyProduct("RecordingSample")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyCopyright("Copyright © 2011")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Bei Einstellung von ComVisible auf falsch sind die Typen in dieser Assembly für +// COM-Komponenten nicht sichtbar. Wenn Sie von COM aus auf einen Typ in dieser Assembly +// zugreifen müssen, stellen Sie das Attribut ComVisible bei diesem Typ auf wahr ein. Nur Windows- +// Assemblys unterstützen COM. +[assembly: ComVisible(false)] + +// Auf Windows gilt die folgende GUID für die ID von typelib, wenn dieses +// COM ausgesetzt ist. Auf anderen Plattformen identifiziert sie den +// Titelspeichercontainer bei Bereitstellung dieser Assembly auf dem Gerät eindeutig. +[assembly: Guid("199e53b1-c103-417e-9c77-c650504fd35f")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Größere Version +// Kleinere Version +// Build-Nummer +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] diff --git a/RecordingSample/RecordingSample/RecordingSample.csproj b/RecordingSample/RecordingSample/RecordingSample.csproj new file mode 100644 index 00000000..f5ff1bf9 --- /dev/null +++ b/RecordingSample/RecordingSample/RecordingSample.csproj @@ -0,0 +1,145 @@ + + + + {160150D5-38E6-482D-97F5-2624F322A854} + {6D335F3A-9D43-41b4-9D22-F6F17C4BE596};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Debug + x86 + WinExe + Properties + RecordingSample + RecordingSample + v4.0 + Client + v4.0 + Windows + Reach + 7c7cc1e8-47d2-4253-8ab6-15ca8305b8e2 + Game + Game.ico + GameThumbnail.png + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + true + full + false + bin\x86\Debug + DEBUG;TRACE;WINDOWS + prompt + 4 + true + false + x86 + false + + + pdbonly + true + bin\x86\Release + TRACE;WINDOWS + prompt + 4 + true + false + x86 + true + + + + + + + + + + + + + + + + + + true + + + + + {6899F0C9-70B9-4EB0-9DD3-E598D4BE3E35} + ANX.Framework + + + {DB88DDEB-7281-405D-8FCA-5681B6B2BD7A} + ANX.InputSystem.Recording + + + {60D08399-244F-46A3-91F1-4CFD26D961A3} + ANX.InputSystem.Windows.XInput + + + {5BE49183-2F6F-4527-AC90-D816911FCF90} + ANX.Framework.Windows.DX10 + + + {FA6E229D-4504-47B1-8A23-2D3FCC13F778} + SampleContent + Content + + + {6A582788-C4D2-410C-96CD-177F75712D65} + ANX.SoundSystem.Windows.XAudio + + + + + False + Microsoft .NET Framework 4 Client Profile %28x86 und x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 3.1 + true + + + False + Microsoft XNA Framework Redistributable 4.0 + true + + + + + + \ No newline at end of file