13
13
14
14
#include " SDL.h"
15
15
16
+ #include " imgui/imgui.h"
17
+
16
18
namespace RTE {
17
19
18
20
std::array<uint8_t , SDL_NUM_SCANCODES> UInputMan::s_PrevKeyStates;
@@ -67,10 +69,11 @@ namespace RTE {
67
69
68
70
for (int inputState = InputState::Held; inputState < InputState::InputStateCount; inputState++) {
69
71
for (int element = InputElements::INPUT_L_UP; element < InputElements::INPUT_COUNT; element++) {
70
- m_NetworkInputElementState[player][element][inputState] = false ;
72
+ m_NetworkServerChangedInputElementState[player][element] = false ;
73
+ m_NetworkServerPreviousInputElementState[player][element] = false ;
71
74
}
72
75
for (int mouseButton = MouseButtons::MOUSE_LEFT; mouseButton < MouseButtons::MAX_MOUSE_BUTTONS; mouseButton++) {
73
- m_NetworkMouseButtonState [player][mouseButton][inputState ] = false ;
76
+ m_NetworkServerChangedMouseButtonState [player][mouseButton] = false ;
74
77
}
75
78
}
76
79
m_NetworkAccumulatedRawMouseMovement[player].Reset ();
@@ -570,7 +573,7 @@ namespace RTE {
570
573
571
574
bool UInputMan::GetInputElementState (int whichPlayer, int whichElement, InputState whichState) {
572
575
if (IsInMultiplayerMode () && whichPlayer >= Players::PlayerOne && whichPlayer < Players::MaxPlayerCount) {
573
- return m_TrapMousePosPerPlayer[ whichPlayer] ? m_NetworkInputElementState[whichPlayer][ whichElement][whichState] : false ;
576
+ return GetNetworkInputElementState ( whichPlayer, whichElement, whichState) ;
574
577
}
575
578
bool elementState = false ;
576
579
InputDevice device = m_ControlScheme.at (whichPlayer).GetDevice ();
@@ -589,6 +592,22 @@ namespace RTE {
589
592
return elementState;
590
593
}
591
594
595
+ bool UInputMan::GetNetworkInputElementState (int whichPlayer, int whichElement, InputState whichState) {
596
+ if (!m_TrapMousePosPerPlayer[whichPlayer] || whichPlayer < Players::PlayerOne || whichPlayer >= Players::MaxPlayerCount || whichState < 0 || whichState > InputState::InputStateCount) {
597
+ return false ;
598
+ }
599
+ switch (whichState) {
600
+ case InputState::Held:
601
+ return m_NetworkServerPreviousInputElementState[whichPlayer][whichElement];
602
+ case InputState::Pressed:
603
+ return m_NetworkServerPreviousInputElementState[whichPlayer][whichElement] && m_NetworkServerChangedInputElementState[whichPlayer][whichElement];
604
+ case InputState::Released:
605
+ return (!m_NetworkServerPreviousInputElementState[whichPlayer][whichElement]) && m_NetworkServerChangedInputElementState[whichPlayer][whichElement];
606
+ default :
607
+ return false ;
608
+ }
609
+ }
610
+
592
611
// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
593
612
594
613
bool UInputMan::GetMenuButtonState (int whichButton, InputState whichState) {
@@ -637,13 +656,13 @@ namespace RTE {
637
656
if (IsInMultiplayerMode ()) {
638
657
if (whichPlayer < Players::PlayerOne || whichPlayer >= Players::MaxPlayerCount) {
639
658
for (int player = Players::PlayerOne; player < Players::MaxPlayerCount; player++) {
640
- if (m_NetworkMouseButtonState [player][whichButton][whichState ]) {
641
- return m_NetworkMouseButtonState [player][whichButton][whichState ];
659
+ if (m_NetworkServerChangedMouseButtonState [player][whichButton]) {
660
+ return m_NetworkServerChangedMouseButtonState [player][whichButton];
642
661
}
643
662
}
644
- return m_NetworkMouseButtonState [Players::PlayerOne][whichButton][whichState ];
663
+ return m_NetworkServerChangedMouseButtonState [Players::PlayerOne][whichButton];
645
664
} else {
646
- return m_NetworkMouseButtonState [whichPlayer][whichButton][whichState ];
665
+ return m_NetworkServerChangedMouseButtonState [whichPlayer][whichButton];
647
666
}
648
667
}
649
668
@@ -739,6 +758,11 @@ namespace RTE {
739
758
std::fill (gamepad.m_Axis .begin (), gamepad.m_Axis .end (), 0 );
740
759
std::fill (gamepad.m_DigitalAxis .begin (), gamepad.m_DigitalAxis .end (), 0 );
741
760
}
761
+
762
+ if (IsInMultiplayerMode ()) {
763
+ ClearNetworkChangedState ();
764
+ }
765
+
742
766
m_TextInput.clear ();
743
767
m_MouseWheelChange = 0 ;
744
768
m_RawMouseMovement.Reset ();
@@ -789,7 +813,7 @@ namespace RTE {
789
813
s_CurrentMouseButtonStates[inputEvent.button .button ] = static_cast <bool >(inputEvent.button .state );
790
814
break ;
791
815
case SDL_MOUSEWHEEL:
792
- m_MouseWheelChange = inputEvent.wheel .direction == SDL_MOUSEWHEEL_NORMAL ? inputEvent.wheel .y : -inputEvent.wheel .y ;
816
+ m_MouseWheelChange + = inputEvent.wheel .direction == SDL_MOUSEWHEEL_NORMAL ? inputEvent.wheel .y : -inputEvent.wheel .y ;
793
817
break ;
794
818
case SDL_CONTROLLERAXISMOTION:
795
819
case SDL_JOYAXISMOTION:
@@ -1168,33 +1192,36 @@ namespace RTE {
1168
1192
}
1169
1193
m_NetworkAccumulatedRawMouseMovement[player].Reset ();
1170
1194
1171
- // Clear mouse events and inputs as they should've been already processed during by recipients.
1172
- // This is important so mouse readings are correct, e.g. to ensure events don't trigger multiple times on a single press.
1173
- for (int inputState = InputState::Pressed; inputState < InputState::InputStateCount; inputState++) {
1174
- for (int element = InputElements::INPUT_L_UP; element < InputElements::INPUT_COUNT; element++) {
1175
- m_NetworkInputElementState[player][element][inputState] = false ;
1176
- }
1177
- for (int mouseButton = MouseButtons::MOUSE_LEFT; mouseButton < MouseButtons::MAX_MOUSE_BUTTONS; mouseButton++) {
1178
- m_NetworkMouseButtonState[player][mouseButton][inputState] = false ;
1179
- }
1180
- }
1181
1195
1182
1196
// Reset mouse wheel state to stop over-wheeling
1183
1197
m_NetworkMouseWheelState[player] = 0 ;
1184
1198
}
1185
1199
}
1186
1200
1201
+ void UInputMan::ClearNetworkChangedState () {
1202
+ for (int player = Players::PlayerOne; player < Players::MaxPlayerCount; ++player) {
1203
+ for (int element = InputElements::INPUT_L_UP; element < InputElements::INPUT_COUNT; element++) {
1204
+ m_NetworkServerChangedInputElementState[player][element] = false ;
1205
+ }
1206
+ for (int mouseButton = MouseButtons::MOUSE_LEFT; mouseButton < MouseButtons::MAX_MOUSE_BUTTONS; mouseButton++) {
1207
+ m_NetworkServerChangedMouseButtonState[player][mouseButton] = false ;
1208
+ }
1209
+ m_NetworkMouseWheelState[player] = 0 ;
1210
+ }
1211
+ }
1187
1212
// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1188
- void UInputMan::SetNetworkInputElementState (int player, int element, InputState whichState, bool newState) {
1213
+ void UInputMan::SetNetworkInputElementState (int player, int element, bool newState) {
1189
1214
if (element >= InputElements::INPUT_L_UP && element < InputElements::INPUT_COUNT && player >= Players::PlayerOne && player < Players::MaxPlayerCount) {
1190
- m_NetworkInputElementState[player][element][whichState] |= newState;
1215
+ m_NetworkServerChangedInputElementState[player][element] = (newState != m_NetworkServerPreviousInputElementState[player][element]);
1216
+ m_NetworkServerPreviousInputElementState[player][element] = newState;
1191
1217
}
1192
1218
}
1193
1219
1194
1220
// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1195
1221
void UInputMan::SetNetworkMouseButtonState (int player, int whichButton, InputState whichState, bool newState) {
1196
1222
if (whichButton >= MouseButtons::MOUSE_LEFT && whichButton < MouseButtons::MAX_MOUSE_BUTTONS && player >= Players::PlayerOne && player < Players::MaxPlayerCount) {
1197
- m_NetworkMouseButtonState[player][whichButton][whichState] |= newState;
1223
+ m_NetworkServerChangedMouseButtonState[player][whichButton] = (newState != m_NetworkServerPreviousMouseButtonState[player][whichButton]);
1224
+ m_NetworkServerPreviousMouseButtonState[player][whichButton] = newState;
1198
1225
}
1199
1226
}
1200
1227
0 commit comments