mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-20 19:42:45 +00:00
98 lines
3.0 KiB
Java
98 lines
3.0 KiB
Java
package com.limelight.nvstream.input;
|
|
|
|
public class ControllerBatchingBlock {
|
|
|
|
private byte[] axisDirs = new byte[6];
|
|
|
|
private short buttonFlags;
|
|
private byte leftTrigger;
|
|
private byte rightTrigger;
|
|
private short leftStickX;
|
|
private short leftStickY;
|
|
private short rightStickX;
|
|
private short rightStickY;
|
|
private short controllerNumber;
|
|
private short activeGamepadMask;
|
|
|
|
public ControllerBatchingBlock(MultiControllerPacket initialPacket) {
|
|
this.controllerNumber = initialPacket.controllerNumber;
|
|
this.activeGamepadMask = initialPacket.activeGamepadMask;
|
|
this.buttonFlags = initialPacket.buttonFlags;
|
|
this.leftTrigger = initialPacket.leftTrigger;
|
|
this.rightTrigger = initialPacket.rightTrigger;
|
|
this.leftStickX = initialPacket.leftStickX;
|
|
this.leftStickY = initialPacket.leftStickY;
|
|
this.rightStickX = initialPacket.rightStickX;
|
|
this.rightStickY = initialPacket.rightStickY;
|
|
}
|
|
|
|
private boolean checkDirs(short currentVal, short newVal, int dirIndex) {
|
|
if (currentVal == newVal) {
|
|
return true;
|
|
}
|
|
|
|
// We want to send a packet if we've now zeroed an axis
|
|
if (newVal == 0) {
|
|
return false;
|
|
}
|
|
|
|
if (axisDirs[dirIndex] == 0) {
|
|
if (newVal < currentVal) {
|
|
axisDirs[dirIndex] = -1;
|
|
}
|
|
else {
|
|
axisDirs[dirIndex] = 1;
|
|
}
|
|
}
|
|
else if (axisDirs[dirIndex] == -1) {
|
|
return newVal < currentVal;
|
|
}
|
|
else if (newVal < currentVal) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Controller packet batching is far more restricted than mouse move batching.
|
|
// We have several restrictions that will cause batching to break up the controller packets.
|
|
// 1) Button flags must be the same for all packets in the batch
|
|
// 2) The movement direction of all axes must remain the same or be neutral
|
|
public boolean submitNewPacket(MultiControllerPacket packet) {
|
|
if (buttonFlags != packet.buttonFlags ||
|
|
controllerNumber != packet.controllerNumber ||
|
|
activeGamepadMask != packet.activeGamepadMask ||
|
|
!checkDirs(leftTrigger, packet.leftTrigger, 0) ||
|
|
!checkDirs(rightTrigger, packet.rightTrigger, 1) ||
|
|
!checkDirs(leftStickX, packet.leftStickX, 2) ||
|
|
!checkDirs(leftStickY, packet.leftStickY, 3) ||
|
|
!checkDirs(rightStickX, packet.rightStickX, 4) ||
|
|
!checkDirs(rightStickY, packet.rightStickY, 5))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
this.controllerNumber = packet.controllerNumber;
|
|
this.activeGamepadMask = packet.activeGamepadMask;
|
|
this.leftTrigger = packet.leftTrigger;
|
|
this.rightTrigger = packet.rightTrigger;
|
|
this.leftStickX = packet.leftStickX;
|
|
this.leftStickY = packet.leftStickY;
|
|
this.rightStickX = packet.rightStickX;
|
|
this.rightStickY = packet.rightStickY;
|
|
return true;
|
|
}
|
|
|
|
public void reinitializePacket(MultiControllerPacket packet) {
|
|
packet.controllerNumber = controllerNumber;
|
|
packet.activeGamepadMask = activeGamepadMask;
|
|
packet.buttonFlags = buttonFlags;
|
|
packet.leftTrigger = leftTrigger;
|
|
packet.rightTrigger = rightTrigger;
|
|
packet.leftStickX = leftStickX;
|
|
packet.leftStickY = leftStickY;
|
|
packet.rightStickX = rightStickX;
|
|
packet.rightStickY = rightStickY;
|
|
}
|
|
}
|