Implemented Playback for Recoding-Mouse, Tests pending

This commit is contained in:
SND\simsmaster_cp 2011-12-08 15:59:16 +00:00
parent d90ada8b61
commit 7d2de05ea0

View File

@ -112,34 +112,75 @@ namespace ANX.InputSystem.Recording
case RecordingState.None: case RecordingState.None:
return realMouse.GetState(); return realMouse.GetState();
case RecordingState.Playback: case RecordingState.Playback:
//Read a state from the Stream and recreate the MouseState from it.
byte[] stateData = ReadState();
if (stateData == null) //No input at this position
return new MouseState();
byte readOffset = 0;
ButtonState left, right, middle, x1, x2;
int scrollWheel, xPos, yPos;
if ((recordInfo & MouseRecordInfo.AllButtons) != 0) //Any of the Buttons is recorded
{
MouseButtons buttons = (MouseButtons)stateData[readOffset++];
left = buttons.HasFlag(MouseButtons.Left) ? ButtonState.Pressed : ButtonState.Released;
right = buttons.HasFlag(MouseButtons.Right) ? ButtonState.Pressed : ButtonState.Released;
middle = buttons.HasFlag(MouseButtons.Middle) ? ButtonState.Pressed : ButtonState.Released;
x1 = buttons.HasFlag(MouseButtons.X1) ? ButtonState.Pressed : ButtonState.Released;
x2 = buttons.HasFlag(MouseButtons.X2) ? ButtonState.Pressed : ButtonState.Released;
}
else
left = right = middle = x1 = x2 = ButtonState.Released;
if (recordInfo.HasFlag(MouseRecordInfo.ScrollWheel))
scrollWheel = BitConverter.ToInt32(stateData, readOffset++);
else
scrollWheel = 0;
if (recordInfo.HasFlag(MouseRecordInfo.XPosition))
xPos = BitConverter.ToInt32(stateData, readOffset++);
else
xPos = 0;
if (recordInfo.HasFlag(MouseRecordInfo.YPosition))
yPos = BitConverter.ToInt32(stateData, readOffset++);
else
yPos = 0;
return new MouseState(xPos, yPos, scrollWheel, left, middle, right, x1, x2);
case RecordingState.Recording: case RecordingState.Recording:
MouseState state = realMouse.GetState(); MouseState state = realMouse.GetState();
//Pack the state to a buffer and save it. In can be never null, because the mouse has allways a position. //Pack the state to a buffer and save it. In can be never null, because the mouse has allways a position.
//TODO: Check if the position is not recorded //TODO: Check if the position is not recorded
byte[] buffer = new byte[PacketLenght]; byte[] buffer = new byte[PacketLenght];
byte offset = 0; byte writeOffset = 0;
if ((recordInfo & MouseRecordInfo.AllButtons) != 0) //Any of the Buttons is recorded if ((recordInfo & MouseRecordInfo.AllButtons) != 0) //Any of the Buttons is recorded
{ {
buffer[offset] |= state.LeftButton == ButtonState.Pressed ? (byte)MouseButtons.Left : (byte)0; //TODO: Is there a byte literal? (like 118L or 91.8f) buffer[writeOffset] |= state.LeftButton == ButtonState.Pressed ? (byte)MouseButtons.Left : (byte)0; //TODO: Is there a byte literal? (like 118L or 91.8f)
buffer[offset] |= state.RightButton == ButtonState.Pressed ? (byte)MouseButtons.Right : (byte)0; buffer[writeOffset] |= state.RightButton == ButtonState.Pressed ? (byte)MouseButtons.Right : (byte)0;
buffer[offset] |= state.MiddleButton == ButtonState.Pressed ? (byte)MouseButtons.Middle : (byte)0; buffer[writeOffset] |= state.MiddleButton == ButtonState.Pressed ? (byte)MouseButtons.Middle : (byte)0;
buffer[offset] |= state.XButton1 == ButtonState.Pressed ? (byte)MouseButtons.X1 : (byte)0; buffer[writeOffset] |= state.XButton1 == ButtonState.Pressed ? (byte)MouseButtons.X1 : (byte)0;
buffer[offset] |= state.XButton2 == ButtonState.Pressed ? (byte)MouseButtons.X2 : (byte)0; buffer[writeOffset] |= state.XButton2 == ButtonState.Pressed ? (byte)MouseButtons.X2 : (byte)0;
offset++; writeOffset++;
} }
if (recordInfo.HasFlag(MouseRecordInfo.ScrollWheel)) if (recordInfo.HasFlag(MouseRecordInfo.ScrollWheel))
Array.ConstrainedCopy(BitConverter.GetBytes(state.ScrollWheelValue), 0, buffer, offset++, 4); //int is always 4 byte long. Array.ConstrainedCopy(BitConverter.GetBytes(state.ScrollWheelValue), 0, buffer, writeOffset++, 4); //int is always 4 byte long.
if(recordInfo.HasFlag(MouseRecordInfo.XPosition)) if(recordInfo.HasFlag(MouseRecordInfo.XPosition))
Array.ConstrainedCopy(BitConverter.GetBytes(state.X), 0, buffer, offset++, 4); //int is always 4 byte long. Array.ConstrainedCopy(BitConverter.GetBytes(state.X), 0, buffer, writeOffset++, 4); //int is always 4 byte long.
if(recordInfo.HasFlag(MouseRecordInfo.YPosition)) if(recordInfo.HasFlag(MouseRecordInfo.YPosition))
Array.ConstrainedCopy(BitConverter.GetBytes(state.Y), 0, buffer, offset++, 4); //int is always 4 byte long. Array.ConstrainedCopy(BitConverter.GetBytes(state.Y), 0, buffer, writeOffset++, 4); //int is always 4 byte long.
WriteState(buffer);
return state; return state;
default: default:
throw new InvalidOperationException("The recordsingState is invalid!"); throw new InvalidOperationException("The recordingState is invalid!");
} }
} }