Repository navigation
Expand file tree
/
Copy pathGamepadMappingProbe.cpp
More file actions
53 lines (53 loc) · 3.75 KB
/
Copy pathGamepadMappingProbe.cpp
File metadata and controls
53 lines (53 loc) · 3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include "GamepadMapping.h"
#include <cstdio>
#include <limits>
using namespace GamepadMapping;
int main(){
Mapper m;Input i;i.active=true;i.a=i.b=i.x=i.y=true;
auto out=m.Update(i,100);
if(out.buttons!=(XINPUT_GAMEPAD_A|XINPUT_GAMEPAD_B|XINPUT_GAMEPAD_X|XINPUT_GAMEPAD_Y))return 1;
i={};i.active=true;i.leftX=3;i.leftY=-3;i.rightX=std::numeric_limits<float>::quiet_NaN();i.rightTrigger=2;i.leftTrigger=-1;
out=m.Update(i,110);if(out.leftX!=32767||out.leftY!=-32767||out.rightX||out.rightTrigger!=255||out.leftTrigger)return 2;
i={};i.active=true;i.menu=true;m.Update(i,200);i.menu=false;out=m.Update(i,250);
if(!(out.buttons&XINPUT_GAMEPAD_START)||(out.buttons&XINPUT_GAMEPAD_BACK))return 3;
m.Reset();i.menu=true;m.Update(i,300);out=m.Update(i,1800);
if(!(out.buttons&XINPUT_GAMEPAD_BACK)||(out.buttons&XINPUT_GAMEPAD_START))return 4;
i.menu=false;out=m.Update(i,1900);if(out.buttons&XINPUT_GAMEPAD_START)return 5;
// Selecting a D-pad direction consumes movement and the later click pulse,
// regardless of which stick returns to neutral first.
for(bool modifierFirst:{false,true}){
m.Reset();i={};i.active=true;i.rightClick=true;i.leftX=.6f;i.leftY=.9f;
out=m.Update(i,2000);if(out.leftX||out.leftY||out.buttons!=XINPUT_GAMEPAD_DPAD_UP)return 6;
if(modifierFirst)i.rightClick=false;else i.leftX=i.leftY=0;
out=m.Update(i,2050);if(out.buttons&XINPUT_GAMEPAD_RIGHT_THUMB)return 7;
i.rightClick=false;i.leftX=i.leftY=0;out=m.Update(i,2100);if(out.buttons&XINPUT_GAMEPAD_RIGHT_THUMB)return 8;
}
m.Reset();i={};i.active=true;i.rightClick=true;m.Update(i,2200);i.rightClick=false;
out=m.Update(i,2250);if(!(out.buttons&XINPUT_GAMEPAD_RIGHT_THUMB))return 9;
i.rightClick=true;i.leftY=-1;out=m.Update(i,2260);
if(out.buttons!=XINPUT_GAMEPAD_DPAD_DOWN)return 10; // consume an earlier pending click too
i.active=false;out=m.Update(i,2300);if(out.valid||out.buttons||out.leftY)return 11;
i={};i.active=true;out=m.Update(i,2310);if(out.buttons)return 12;
for(bool modifierFirst:{false,true})for(bool y:{false,true}){
m.Reset();i={};i.active=true;m.Update(i,3000);i.rightClick=true;m.Update(i,3010);i.x=!y;i.y=y;
const auto command=y?Transport::CommandTogglePerson:Transport::CommandRecenter;
out=m.Update(i,3020);if(out.buttons!=command||out.leftX||out.leftY)return 13;
if(m.Update(i,3030).buttons!=command)return 14;
if(modifierFirst)i.rightClick=false;else i.x=i.y=false;
out=m.Update(i,3040);if(out.buttons)return 15;
i.rightClick=false;i.x=i.y=false;if(m.Update(i,3050).buttons)return 16;
i.x=!y;i.y=y;out=m.Update(i,3060);if(out.buttons!=(y?XINPUT_GAMEPAD_Y:XINPUT_GAMEPAD_X))return 17;
}
m.Reset();i={};i.active=true;i.rightClick=i.x=true;
if(m.Update(i,4000).buttons)return 18; // held at focus recovery cannot recenter
i.active=false;m.Update(i,4010);i.active=true;if(m.Update(i,4020).buttons)return 19;
i.rightClick=i.x=false;m.Update(i,4030);i.rightClick=i.x=true;
if(m.Update(i,4040).buttons!=Transport::CommandRecenter)return 20;
i.x=false;i.y=true;if(m.Update(i,4050).buttons!=Transport::CommandTogglePerson)return 21;
i.x=i.y=false;i.rightClick=false;if(m.Update(i,4060).buttons)return 22;
// A recent unconsumed scope pulse is also cancelled by either new chord.
m.Reset();i={};i.active=true;m.Update(i,5000);i.rightClick=true;m.Update(i,5010);i.rightClick=false;m.Update(i,5020);
i.rightClick=i.x=true;if(m.Update(i,5030).buttons!=Transport::CommandRecenter)return 23;
i.rightClick=i.x=false;if(m.Update(i,5040).buttons)return 24;
puts("PASS: native controls, pause/objectives, D-pad and VR chords, both release orders, held consumption, scope cancellation and focus rearming.");return 0;
}