Replace more magic values with actual variables, fix touch screen coordinates on different window sizes
This commit is contained in:
parent
281fdb871d
commit
1119b29427
4 changed files with 78 additions and 19 deletions
|
@ -92,19 +92,30 @@ namespace Ryujinx.Core.Input
|
||||||
HidControllerType.ControllerType_Handheld |
|
HidControllerType.ControllerType_Handheld |
|
||||||
HidControllerType.ControllerType_JoyconPair;
|
HidControllerType.ControllerType_JoyconPair;
|
||||||
|
|
||||||
HidControllerColorDesc ColorDesc =
|
bool IsHalf = false;
|
||||||
|
|
||||||
|
HidControllerColorDesc SingleColorDesc =
|
||||||
HidControllerColorDesc.ColorDesc_ColorsNonexistent;
|
HidControllerColorDesc.ColorDesc_ColorsNonexistent;
|
||||||
|
|
||||||
|
JoyConColor SingleColorBody = JoyConColor.Black;
|
||||||
|
JoyConColor SingleColorButtons = JoyConColor.Black;
|
||||||
|
|
||||||
|
HidControllerColorDesc SplitColorDesc = 0;
|
||||||
|
|
||||||
WriteInt32(BaseControllerOffset + 0x0, (int)Type);
|
WriteInt32(BaseControllerOffset + 0x0, (int)Type);
|
||||||
WriteInt32(BaseControllerOffset + 0x4, 0);
|
|
||||||
WriteInt32(BaseControllerOffset + 0x8, (int)ColorDesc);
|
WriteInt32(BaseControllerOffset + 0x4, IsHalf ? 1 : 0);
|
||||||
WriteInt32(BaseControllerOffset + 0xc, 0);
|
|
||||||
WriteInt32(BaseControllerOffset + 0x10, 0);
|
WriteInt32(BaseControllerOffset + 0x8, (int)SingleColorDesc);
|
||||||
WriteInt32(BaseControllerOffset + 0x14, 0);
|
WriteInt32(BaseControllerOffset + 0xc, (int)SingleColorBody);
|
||||||
|
WriteInt32(BaseControllerOffset + 0x10, (int)SingleColorButtons);
|
||||||
|
WriteInt32(BaseControllerOffset + 0x14, (int)SplitColorDesc);
|
||||||
|
|
||||||
WriteInt32(BaseControllerOffset + 0x18, (int)LeftColorBody);
|
WriteInt32(BaseControllerOffset + 0x18, (int)LeftColorBody);
|
||||||
WriteInt32(BaseControllerOffset + 0x1c, (int)LeftColorButtons);
|
WriteInt32(BaseControllerOffset + 0x1c, (int)LeftColorButtons);
|
||||||
|
|
||||||
WriteInt32(BaseControllerOffset + 0x20, (int)RightColorBody);
|
WriteInt32(BaseControllerOffset + 0x20, (int)RightColorBody);
|
||||||
WriteInt32(BaseControllerOffset + 0x24, (int)RightColorBody);
|
WriteInt32(BaseControllerOffset + 0x24, (int)RightColorButtons);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetJoyconButton(
|
public void SetJoyconButton(
|
||||||
|
@ -137,11 +148,15 @@ namespace Ryujinx.Core.Input
|
||||||
|
|
||||||
WriteInt64(ControllerOffset + 0x0, Timestamp);
|
WriteInt64(ControllerOffset + 0x0, Timestamp);
|
||||||
WriteInt64(ControllerOffset + 0x8, Timestamp);
|
WriteInt64(ControllerOffset + 0x8, Timestamp);
|
||||||
|
|
||||||
WriteInt64(ControllerOffset + 0x10, (uint)Buttons);
|
WriteInt64(ControllerOffset + 0x10, (uint)Buttons);
|
||||||
|
|
||||||
WriteInt32(ControllerOffset + 0x18, LeftStick.DX);
|
WriteInt32(ControllerOffset + 0x18, LeftStick.DX);
|
||||||
WriteInt32(ControllerOffset + 0x1c, LeftStick.DY);
|
WriteInt32(ControllerOffset + 0x1c, LeftStick.DY);
|
||||||
|
|
||||||
WriteInt64(ControllerOffset + 0x20, RightStick.DX);
|
WriteInt64(ControllerOffset + 0x20, RightStick.DX);
|
||||||
WriteInt64(ControllerOffset + 0x24, RightStick.DY);
|
WriteInt64(ControllerOffset + 0x24, RightStick.DY);
|
||||||
|
|
||||||
WriteInt64(ControllerOffset + 0x28,
|
WriteInt64(ControllerOffset + 0x28,
|
||||||
(uint)HidControllerConnState.Controller_State_Connected |
|
(uint)HidControllerConnState.Controller_State_Connected |
|
||||||
(uint)HidControllerConnState.Controller_State_Wired);
|
(uint)HidControllerConnState.Controller_State_Wired);
|
||||||
|
@ -170,19 +185,21 @@ namespace Ryujinx.Core.Input
|
||||||
|
|
||||||
TouchEntryOffset += HidTouchEntryHeaderSize;
|
TouchEntryOffset += HidTouchEntryHeaderSize;
|
||||||
|
|
||||||
|
const int Padding = 0;
|
||||||
|
|
||||||
int Index = 0;
|
int Index = 0;
|
||||||
|
|
||||||
foreach (HidTouchPoint Point in Points)
|
foreach (HidTouchPoint Point in Points)
|
||||||
{
|
{
|
||||||
WriteInt64(TouchEntryOffset + 0x0, Timestamp);
|
WriteInt64(TouchEntryOffset + 0x0, Timestamp);
|
||||||
WriteInt32(TouchEntryOffset + 0x8, 0);
|
WriteInt32(TouchEntryOffset + 0x8, Padding);
|
||||||
WriteInt32(TouchEntryOffset + 0xc, Index++);
|
WriteInt32(TouchEntryOffset + 0xc, Index++);
|
||||||
WriteInt32(TouchEntryOffset + 0x10, Point.X);
|
WriteInt32(TouchEntryOffset + 0x10, Point.X);
|
||||||
WriteInt32(TouchEntryOffset + 0x14, Point.Y);
|
WriteInt32(TouchEntryOffset + 0x14, Point.Y);
|
||||||
WriteInt32(TouchEntryOffset + 0x18, Point.DiameterX);
|
WriteInt32(TouchEntryOffset + 0x18, Point.DiameterX);
|
||||||
WriteInt32(TouchEntryOffset + 0x1c, Point.DiameterY);
|
WriteInt32(TouchEntryOffset + 0x1c, Point.DiameterY);
|
||||||
WriteInt32(TouchEntryOffset + 0x20, Point.Angle);
|
WriteInt32(TouchEntryOffset + 0x20, Point.Angle);
|
||||||
WriteInt32(TouchEntryOffset + 0x24, 0);
|
WriteInt32(TouchEntryOffset + 0x24, Padding);
|
||||||
|
|
||||||
TouchEntryOffset += HidTouchEntryTouchSize;
|
TouchEntryOffset += HidTouchEntryTouchSize;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,6 @@ namespace Ryujinx.Core.Input
|
||||||
[Flags]
|
[Flags]
|
||||||
public enum HidControllerColorDesc
|
public enum HidControllerColorDesc
|
||||||
{
|
{
|
||||||
ColorDesc_ColorsNonexistent = (1 << 1),
|
ColorDesc_ColorsNonexistent = (1 << 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,6 +2,8 @@ namespace Ryujinx.Core.Input
|
||||||
{
|
{
|
||||||
public enum JoyConColor //Thanks to CTCaer
|
public enum JoyConColor //Thanks to CTCaer
|
||||||
{
|
{
|
||||||
|
Black = 0,
|
||||||
|
|
||||||
Body_Grey = 0x828282,
|
Body_Grey = 0x828282,
|
||||||
Body_Neon_Blue = 0x0AB9E6,
|
Body_Neon_Blue = 0x0AB9E6,
|
||||||
Body_Neon_Red = 0xFF3C28,
|
Body_Neon_Red = 0xFF3C28,
|
||||||
|
|
|
@ -11,6 +11,12 @@ namespace Ryujinx
|
||||||
{
|
{
|
||||||
public class GLScreen : GameWindow
|
public class GLScreen : GameWindow
|
||||||
{
|
{
|
||||||
|
private const int TouchScreenWidth = 1280;
|
||||||
|
private const int TouchScreenHeight = 720;
|
||||||
|
|
||||||
|
private const float TouchScreenRatioX = (float)TouchScreenWidth / TouchScreenHeight;
|
||||||
|
private const float TouchScreenRatioY = (float)TouchScreenHeight / TouchScreenWidth;
|
||||||
|
|
||||||
private Switch Ns;
|
private Switch Ns;
|
||||||
|
|
||||||
private IGalRenderer Renderer;
|
private IGalRenderer Renderer;
|
||||||
|
@ -89,15 +95,45 @@ namespace Ryujinx
|
||||||
DY = RightJoystickDY
|
DY = RightJoystickDY
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool HasTouch = false;
|
||||||
|
|
||||||
//Get screen touch position from left mouse click
|
//Get screen touch position from left mouse click
|
||||||
//Opentk always captures mouse events, even if out of focus, so check if window is focused.
|
//OpenTK always captures mouse events, even if out of focus, so check if window is focused.
|
||||||
if (Mouse != null && Focused)
|
if (Focused && Mouse?.GetState().LeftButton == OpenTK.Input.ButtonState.Pressed)
|
||||||
if (Mouse.GetState().LeftButton == OpenTK.Input.ButtonState.Pressed)
|
|
||||||
{
|
{
|
||||||
|
int ScrnWidth = Width;
|
||||||
|
int ScrnHeight = Height;
|
||||||
|
|
||||||
|
if (Width > Height * TouchScreenRatioX)
|
||||||
|
{
|
||||||
|
ScrnWidth = (int)(Height * TouchScreenRatioX);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ScrnHeight = (int)(Width * TouchScreenRatioY);
|
||||||
|
}
|
||||||
|
|
||||||
|
int StartX = (Width - ScrnWidth) >> 1;
|
||||||
|
int StartY = (Height - ScrnHeight) >> 1;
|
||||||
|
|
||||||
|
int EndX = StartX + ScrnWidth;
|
||||||
|
int EndY = StartY + ScrnHeight;
|
||||||
|
|
||||||
|
if (Mouse.X >= StartX &&
|
||||||
|
Mouse.Y >= StartY &&
|
||||||
|
Mouse.X < EndX &&
|
||||||
|
Mouse.Y < EndY)
|
||||||
|
{
|
||||||
|
int ScrnMouseX = Mouse.X - StartX;
|
||||||
|
int ScrnMouseY = Mouse.Y - StartY;
|
||||||
|
|
||||||
|
int MX = (int)(((float)ScrnMouseX / ScrnWidth) * TouchScreenWidth);
|
||||||
|
int MY = (int)(((float)ScrnMouseY / ScrnHeight) * TouchScreenHeight);
|
||||||
|
|
||||||
HidTouchPoint CurrentPoint = new HidTouchPoint
|
HidTouchPoint CurrentPoint = new HidTouchPoint
|
||||||
{
|
{
|
||||||
X = Mouse.X,
|
X = MX,
|
||||||
Y = Mouse.Y,
|
Y = MY,
|
||||||
|
|
||||||
//Placeholder values till more data is acquired
|
//Placeholder values till more data is acquired
|
||||||
DiameterX = 10,
|
DiameterX = 10,
|
||||||
|
@ -105,9 +141,13 @@ namespace Ryujinx
|
||||||
Angle = 90
|
Angle = 90
|
||||||
};
|
};
|
||||||
|
|
||||||
|
HasTouch = true;
|
||||||
|
|
||||||
Ns.Hid.SetTouchPoints(CurrentPoint);
|
Ns.Hid.SetTouchPoints(CurrentPoint);
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
|
|
||||||
|
if (!HasTouch)
|
||||||
{
|
{
|
||||||
Ns.Hid.SetTouchPoints();
|
Ns.Hid.SetTouchPoints();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue