From 17e11568509cc97738220ae2d7471d7272e90ad5 Mon Sep 17 00:00:00 2001 From: Alula <6276139+alula@users.noreply.github.com> Date: Sat, 19 Nov 2022 18:20:03 +0100 Subject: [PATCH] Refactoring time --- Cargo.toml | 59 +- src/builtin/builtin_data/buttons.png | Bin 282973 -> 0 bytes .../builtin_data/headband/ogph/Casts.png | Bin 447 -> 0 bytes .../headband/ogph/Npc/NpcGuest.png | Bin 456 -> 0 bytes .../headband/ogph/Npc/NpcMiza.png | Bin 562 -> 0 bytes .../headband/ogph/Npc/NpcRegu.png | Bin 621 -> 0 bytes .../builtin_data/headband/plus/casts.png | Bin 1621 -> 0 bytes .../headband/plus/npc/npcguest.png | Bin 1490 -> 0 bytes .../headband/plus/npc/npcmiza.png | Bin 4152 -> 0 bytes .../headband/plus/npc/npcregu.png | Bin 3952 -> 0 bytes src/builtin/builtin_data/locale/en.json | 197 - src/builtin/builtin_data/locale/jp.json | 187 - src/builtin/builtin_data/triangles.png | Bin 130 -> 0 bytes src/builtin/builtin_font.bmfc | 276 - src/builtin/builtin_font.fnt | Bin 92105 -> 0 bytes src/builtin/builtin_font_0.png | Bin 31135 -> 0 bytes src/builtin/builtin_font_1.png | Bin 31216 -> 0 bytes src/builtin/gamecontrollerdb.txt | 1741 ------ src/builtin/lightmap/spot.png | Bin 3147 -> 0 bytes src/builtin/organya-wavetable-doukutsu.bin | Bin 66152 -> 0 bytes src/builtin/organya-wavetable-org.bin | Bin 87772 -> 0 bytes src/builtin/touch.png | Bin 16222 -> 0 bytes src/builtin_fs.rs | 330 -- src/common.rs | 8 +- src/components/background.rs | 9 +- src/components/boss_life_bar.rs | 8 +- src/components/credits.rs | 6 +- src/components/draw_common.rs | 2 +- src/components/fade.rs | 4 +- src/components/falling_island.rs | 8 +- src/components/flash.rs | 8 +- src/components/hud.rs | 12 +- src/components/inventory.rs | 20 +- src/components/map_system.rs | 10 +- src/components/nikumaru.rs | 14 +- src/components/number_popup.rs | 4 +- src/components/replay.rs | 8 +- src/components/stage_select.rs | 13 +- src/components/text_boxes.rs | 11 +- src/components/tilemap.rs | 6 +- src/components/water_renderer.rs | 16 +- src/components/whimsical_star.rs | 10 +- src/editor/mod.rs | 6 +- src/engine_constants/mod.rs | 10 +- src/engine_constants/npcs.rs | 14 +- src/entity.rs | 4 +- src/exe_parser.rs | 127 - src/framework/backend.rs | 20 +- src/framework/backend_glutin.rs | 158 +- src/framework/backend_null.rs | 2 +- src/framework/backend_sdl2.rs | 45 +- src/framework/context.rs | 6 +- src/framework/error.rs | 2 +- src/framework/filesystem.rs | 10 +- src/framework/gamepad.rs | 3 +- src/framework/gl.rs | 4698 ++++++++++------- src/framework/graphics.rs | 2 +- src/framework/render_opengl.rs | 8 +- src/framework/ui.rs | 20 +- src/framework/vfs.rs | 6 +- src/{ => game}/caret.rs | 4 +- src/{ => game}/frame.rs | 6 +- src/{ => game}/inventory.rs | 8 +- src/{ => game}/map.rs | 14 +- src/game/mod.rs | 329 ++ src/{ => game}/npc/ai/balcony.rs | 11 +- src/{ => game}/npc/ai/balrog.rs | 16 +- src/{ => game}/npc/ai/booster.rs | 9 +- src/{ => game}/npc/ai/chaco.rs | 13 +- src/{ => game}/npc/ai/characters.rs | 10 +- src/{ => game}/npc/ai/curly.rs | 38 +- src/{ => game}/npc/ai/doctor.rs | 14 +- src/{ => game}/npc/ai/egg_corridor.rs | 16 +- src/{ => game}/npc/ai/first_cave.rs | 8 +- src/{ => game}/npc/ai/grasstown.rs | 20 +- src/{ => game}/npc/ai/hell.rs | 23 +- src/{ => game}/npc/ai/igor.rs | 12 +- src/{ => game}/npc/ai/intro.rs | 11 +- src/{ => game}/npc/ai/last_cave.rs | 12 +- src/{ => game}/npc/ai/maze.rs | 14 +- src/{ => game}/npc/ai/mimiga_village.rs | 14 +- src/{ => game}/npc/ai/misc.rs | 32 +- src/{ => game}/npc/ai/misery.rs | 22 +- src/game/npc/ai/mod.rs | 28 + src/{ => game}/npc/ai/outer_wall.rs | 10 +- src/{ => game}/npc/ai/pickups.rs | 8 +- src/{ => game}/npc/ai/plantation.rs | 14 +- src/{ => game}/npc/ai/quote.rs | 13 +- src/{ => game}/npc/ai/sand_zone.rs | 16 +- src/{ => game}/npc/ai/santa.rs | 8 +- src/{ => game}/npc/ai/sue.rs | 14 +- src/{ => game}/npc/ai/toroko.rs | 14 +- src/{ => game}/npc/ai/weapon_trail.rs | 11 +- src/{ => game}/npc/ai/wind_fortress.rs | 14 +- src/{ => game}/npc/boss/balfrog.rs | 17 +- src/{ => game}/npc/boss/ballos.rs | 18 +- src/{ => game}/npc/boss/core.rs | 20 +- src/{ => game}/npc/boss/heavy_press.rs | 12 +- src/{ => game}/npc/boss/ironhead.rs | 12 +- src/{ => game}/npc/boss/mod.rs | 18 +- src/{ => game}/npc/boss/monster_x.rs | 16 +- src/{ => game}/npc/boss/omega.rs | 16 +- src/{ => game}/npc/boss/sisters.rs | 14 +- src/{ => game}/npc/boss/undead_core.rs | 17 +- src/{ => game}/npc/list.rs | 5 +- src/{ => game}/npc/mod.rs | 40 +- src/{ => game}/npc/utils.rs | 24 +- src/{ => game}/physics.rs | 28 +- src/{ => game}/player/mod.rs | 36 +- src/{ => game}/player/player_hit.rs | 18 +- src/{ => game}/player/player_list.rs | 0 src/{ => game}/player/skin/basic.rs | 20 +- src/{ => game}/player/skin/mod.rs | 2 +- src/{ => game}/profile.rs | 25 +- src/{ => game}/scripting/lua/boot.lua | 0 src/{ => game}/scripting/lua/doukutsu.d.ts | 5 +- src/{ => game}/scripting/lua/doukutsu.rs | 8 +- src/{ => game}/scripting/lua/mod.rs | 16 +- src/{ => game}/scripting/lua/scene.rs | 4 +- src/game/scripting/lua/tsconfig.json | 23 + src/{ => game}/scripting/mod.rs | 0 .../scripting/tsc/bytecode_utils.rs | 6 +- src/{ => game}/scripting/tsc/compiler.rs | 14 +- src/{ => game}/scripting/tsc/credit_script.rs | 12 +- src/{ => game}/scripting/tsc/decompiler.rs | 6 +- src/{ => game}/scripting/tsc/encryption.rs | 0 src/{ => game}/scripting/tsc/mod.rs | 0 src/{ => game}/scripting/tsc/opcodes.rs | 0 src/{ => game}/scripting/tsc/parse_utils.rs | 6 +- src/{ => game}/scripting/tsc/text_script.rs | 32 +- src/{ => game}/settings.rs | 6 +- src/{ => game}/shared_game_state.rs | 66 +- src/{ => game}/stage.rs | 11 +- src/{ => game}/weapon/blade.rs | 10 +- src/{ => game}/weapon/bubbler.rs | 12 +- src/{ => game}/weapon/bullet.rs | 18 +- src/{ => game}/weapon/fireball.rs | 12 +- src/{ => game}/weapon/machine_gun.rs | 12 +- src/{ => game}/weapon/missile_launcher.rs | 12 +- src/{ => game}/weapon/mod.rs | 8 +- src/{ => game}/weapon/nemesis.rs | 12 +- src/{ => game}/weapon/polar_star.rs | 12 +- src/{ => game}/weapon/snake.rs | 12 +- src/{ => game}/weapon/spur.rs | 12 +- .../weapon/super_missile_launcher.rs | 12 +- src/{ => graphics}/bmfont.rs | 2 +- src/{ => graphics}/bmfont_renderer.rs | 30 +- src/graphics/mod.rs | 3 + src/{ => graphics}/texture_set.rs | 8 +- src/hooks.rs | 287 - src/i18n.rs | 5 +- src/input/combined_menu_controller.rs | 2 +- src/input/combined_player_controller.rs | 2 +- src/input/dummy_player_controller.rs | 2 +- src/input/gamepad_player_controller.rs | 4 +- src/input/keyboard_player_controller.rs | 4 +- src/input/player_controller.rs | 3 +- src/input/replay_player_controller.rs | 2 +- src/input/touch_controls.rs | 2 +- src/input/touch_player_controller.rs | 146 +- src/lib.rs | 345 +- src/live_debugger/command_line.rs | 8 +- src/live_debugger/mod.rs | 21 +- src/main.rs | 28 +- src/menu/controls_menu.rs | 8 +- src/menu/coop_menu.rs | 4 +- src/menu/mod.rs | 66 +- src/menu/pause_menu.rs | 4 +- src/menu/save_select_menu.rs | 9 +- src/menu/settings_menu.rs | 12 +- src/mod_list.rs | 3 +- src/npc/ai/mod.rs | 28 - src/scene/editor_scene.rs | 4 +- src/scene/game_scene.rs | 258 +- src/scene/jukebox_scene.rs | 35 +- src/scene/loading_scene.rs | 4 +- src/scene/mod.rs | 2 +- src/scene/no_data_scene.rs | 96 +- src/scene/title_scene.rs | 35 +- src/scripting/lua/tsconfig.json | 23 - src/shaders.rs | 39 - src/sound/mod.rs | 32 +- src/sound/org_playback.rs | 2 +- src/sound/wav.rs | 4 +- src/util/bitvec.rs | 93 + src/{ => util}/encoding.rs | 2 +- src/util/mod.rs | 3 + src/{ => util}/rng.rs | 2 +- src/vanilla.rs | 209 - 189 files changed, 4518 insertions(+), 6994 deletions(-) delete mode 100644 src/builtin/builtin_data/buttons.png delete mode 100644 src/builtin/builtin_data/headband/ogph/Casts.png delete mode 100644 src/builtin/builtin_data/headband/ogph/Npc/NpcGuest.png delete mode 100644 src/builtin/builtin_data/headband/ogph/Npc/NpcMiza.png delete mode 100644 src/builtin/builtin_data/headband/ogph/Npc/NpcRegu.png delete mode 100644 src/builtin/builtin_data/headband/plus/casts.png delete mode 100644 src/builtin/builtin_data/headband/plus/npc/npcguest.png delete mode 100644 src/builtin/builtin_data/headband/plus/npc/npcmiza.png delete mode 100644 src/builtin/builtin_data/headband/plus/npc/npcregu.png delete mode 100644 src/builtin/builtin_data/locale/en.json delete mode 100644 src/builtin/builtin_data/locale/jp.json delete mode 100644 src/builtin/builtin_data/triangles.png delete mode 100644 src/builtin/builtin_font.bmfc delete mode 100644 src/builtin/builtin_font.fnt delete mode 100644 src/builtin/builtin_font_0.png delete mode 100644 src/builtin/builtin_font_1.png delete mode 100644 src/builtin/gamecontrollerdb.txt delete mode 100644 src/builtin/lightmap/spot.png delete mode 100644 src/builtin/organya-wavetable-doukutsu.bin delete mode 100644 src/builtin/organya-wavetable-org.bin delete mode 100644 src/builtin/touch.png delete mode 100644 src/builtin_fs.rs delete mode 100644 src/exe_parser.rs rename src/{ => game}/caret.rs (99%) rename src/{ => game}/frame.rs (97%) rename src/{ => game}/inventory.rs (97%) rename src/{ => game}/map.rs (98%) create mode 100644 src/game/mod.rs rename src/{ => game}/npc/ai/balcony.rs (97%) rename src/{ => game}/npc/ai/balrog.rs (99%) rename src/{ => game}/npc/ai/booster.rs (96%) rename src/{ => game}/npc/ai/chaco.rs (92%) rename src/{ => game}/npc/ai/characters.rs (99%) rename src/{ => game}/npc/ai/curly.rs (97%) rename src/{ => game}/npc/ai/doctor.rs (99%) rename src/{ => game}/npc/ai/egg_corridor.rs (99%) rename src/{ => game}/npc/ai/first_cave.rs (97%) rename src/{ => game}/npc/ai/grasstown.rs (98%) rename src/{ => game}/npc/ai/hell.rs (97%) rename src/{ => game}/npc/ai/igor.rs (98%) rename src/{ => game}/npc/ai/intro.rs (96%) rename src/{ => game}/npc/ai/last_cave.rs (98%) rename src/{ => game}/npc/ai/maze.rs (99%) rename src/{ => game}/npc/ai/mimiga_village.rs (99%) rename src/{ => game}/npc/ai/misc.rs (99%) rename src/{ => game}/npc/ai/misery.rs (99%) create mode 100644 src/game/npc/ai/mod.rs rename src/{ => game}/npc/ai/outer_wall.rs (98%) rename src/{ => game}/npc/ai/pickups.rs (98%) rename src/{ => game}/npc/ai/plantation.rs (99%) rename src/{ => game}/npc/ai/quote.rs (98%) rename src/{ => game}/npc/ai/sand_zone.rs (99%) rename src/{ => game}/npc/ai/santa.rs (95%) rename src/{ => game}/npc/ai/sue.rs (98%) rename src/{ => game}/npc/ai/toroko.rs (99%) rename src/{ => game}/npc/ai/weapon_trail.rs (94%) rename src/{ => game}/npc/ai/wind_fortress.rs (99%) rename src/{ => game}/npc/boss/balfrog.rs (98%) rename src/{ => game}/npc/boss/ballos.rs (99%) rename src/{ => game}/npc/boss/core.rs (98%) rename src/{ => game}/npc/boss/heavy_press.rs (98%) rename src/{ => game}/npc/boss/ironhead.rs (98%) rename src/{ => game}/npc/boss/mod.rs (92%) rename src/{ => game}/npc/boss/monster_x.rs (99%) rename src/{ => game}/npc/boss/omega.rs (98%) rename src/{ => game}/npc/boss/sisters.rs (98%) rename src/{ => game}/npc/boss/undead_core.rs (99%) rename src/{ => game}/npc/list.rs (99%) rename src/{ => game}/npc/mod.rs (98%) rename src/{ => game}/npc/utils.rs (95%) rename src/{ => game}/physics.rs (97%) rename src/{ => game}/player/mod.rs (97%) rename src/{ => game}/player/player_hit.rs (97%) rename src/{ => game}/player/player_list.rs (100%) rename src/{ => game}/player/skin/basic.rs (93%) rename src/{ => game}/player/skin/mod.rs (98%) rename src/{ => game}/profile.rs (95%) rename src/{ => game}/scripting/lua/boot.lua (100%) rename src/{ => game}/scripting/lua/doukutsu.d.ts (99%) rename src/{ => game}/scripting/lua/doukutsu.rs (98%) rename src/{ => game}/scripting/lua/mod.rs (95%) rename src/{ => game}/scripting/lua/scene.rs (94%) create mode 100644 src/game/scripting/lua/tsconfig.json rename src/{ => game}/scripting/mod.rs (100%) rename src/{ => game}/scripting/tsc/bytecode_utils.rs (91%) rename src/{ => game}/scripting/tsc/compiler.rs (96%) rename src/{ => game}/scripting/tsc/credit_script.rs (96%) rename src/{ => game}/scripting/tsc/decompiler.rs (97%) rename src/{ => game}/scripting/tsc/encryption.rs (100%) rename src/{ => game}/scripting/tsc/mod.rs (100%) rename src/{ => game}/scripting/tsc/opcodes.rs (100%) rename src/{ => game}/scripting/tsc/parse_utils.rs (81%) rename src/{ => game}/scripting/tsc/text_script.rs (98%) rename src/{ => game}/settings.rs (99%) rename src/{ => game}/shared_game_state.rs (95%) rename src/{ => game}/stage.rs (99%) rename src/{ => game}/weapon/blade.rs (83%) rename src/{ => game}/weapon/bubbler.rs (96%) rename src/{ => game}/weapon/bullet.rs (99%) rename src/{ => game}/weapon/fireball.rs (90%) rename src/{ => game}/weapon/machine_gun.rs (95%) rename src/{ => game}/weapon/missile_launcher.rs (96%) rename src/{ => game}/weapon/mod.rs (97%) rename src/{ => game}/weapon/nemesis.rs (92%) rename src/{ => game}/weapon/polar_star.rs (92%) rename src/{ => game}/weapon/snake.rs (88%) rename src/{ => game}/weapon/spur.rs (95%) rename src/{ => game}/weapon/super_missile_launcher.rs (95%) rename src/{ => graphics}/bmfont.rs (98%) rename src/{ => graphics}/bmfont_renderer.rs (93%) create mode 100644 src/graphics/mod.rs rename src/{ => graphics}/texture_set.rs (99%) delete mode 100644 src/hooks.rs delete mode 100644 src/npc/ai/mod.rs delete mode 100644 src/scripting/lua/tsconfig.json delete mode 100644 src/shaders.rs create mode 100644 src/util/bitvec.rs rename src/{ => util}/encoding.rs (99%) create mode 100644 src/util/mod.rs rename src/{ => util}/rng.rs (98%) delete mode 100644 src/vanilla.rs diff --git a/Cargo.toml b/Cargo.toml index 1c06b37..374d8c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "doukutsu-rs" description = "A re-implementation of Cave Story (Doukutsu Monogatari) engine" -version = "0.99.0" +version = "0.100.0" authors = ["Alula", "dawnDus"] -edition = "2018" +edition = "2021" [lib] crate-type = ["lib"] @@ -25,7 +25,7 @@ opt-level = 3 [package.metadata.bundle] name = "doukutsu-rs" identifier = "io.github.doukutsu_rs" -version = "0.99.0" +version = "0.100.0" resources = ["data"] copyright = "Copyright (c) 2020-2022 doukutsu-rs dev team" category = "Game" @@ -33,15 +33,14 @@ osx_minimum_system_version = "10.12" [features] default = ["default-base", "backend-sdl", "render-opengl", "exe"] -default-base = ["scripting-lua", "ogg-playback", "netplay"] +default-base = ["ogg-playback"] ogg-playback = ["lewton"] backend-sdl = ["sdl2", "sdl2-sys"] backend-glutin = ["winit", "glutin", "render-opengl"] render-opengl = [] scripting-lua = ["lua-ffi"] -netplay = ["tokio", "serde_cbor"] +netplay = ["serde_cbor"] editor = [] -hooks = ["libc"] exe = [] android = [] @@ -51,42 +50,40 @@ android = [] #winit = { path = "./3rdparty/winit", optional = true, default_features = false, features = ["x11"] } #sdl2 = { path = "./3rdparty/rust-sdl2", optional = true, features = ["unsafe_textures", "bundled", "static-link"] } #sdl2-sys = { path = "./3rdparty/rust-sdl2/sdl2-sys", optional = true, features = ["bundled", "static-link"] } -bitvec = "0.20" byteorder = "1.4" case_insensitive_hashmap = "1.0.0" chrono = "0.4" -cpal = "0.13" +cpal = "0.14" directories = "3" downcast = "0.11" -funty = "=1.1.0" # https://github.com/bitvecto-rs/bitvec/issues/105 -glutin = { git = "https://github.com/doukutsu-rs/glutin.git", rev = "8dd457b9adb7dbac7ade337246b6356c784272d9", optional = true, default_features = false, features = ["x11"] } -imgui = "0.8.0" -image = { version = "0.23", default-features = false, features = ["png", "bmp"] } +#glutin = { git = "https://github.com/doukutsu-rs/glutin.git", rev = "8dd457b9adb7dbac7ade337246b6356c784272d9", optional = true, default_features = false, features = ["x11"] } +glutin = { version = "0.30", optional = true, default_features = false, features = ["x11"] } +imgui = "0.8" +image = { version = "0.24", default-features = false, features = ["png", "bmp"] } itertools = "0.10" -lazy_static = "1.4.0" -lewton = { version = "0.10.2", optional = true } -libc = { version = "0.2", optional = true } +lazy_static = "1.4" +lewton = { version = "0.10", optional = true } log = "0.4" lua-ffi = { git = "https://github.com/doukutsu-rs/lua-ffi.git", rev = "e0b2ff5960f7ef9974aa9675cebe4907bee0134f", optional = true } -num-derive = "0.3.2" -num-traits = "0.2.12" -paste = "1.0.0" -pelite = "0.9.1" +num-derive = "0.3" +num-traits = "0.2" +paste = "1.0" +pelite = ">=0.9.2" sdl2 = { git = "https://github.com/doukutsu-rs/rust-sdl2.git", rev = "95bcf63768abf422527f86da41da910649b9fcc9", optional = true, features = ["unsafe_textures", "bundled", "static-link"] } sdl2-sys = { git = "https://github.com/doukutsu-rs/rust-sdl2.git", rev = "95bcf63768abf422527f86da41da910649b9fcc9", optional = true, features = ["bundled", "static-link"] } serde = { version = "1", features = ["derive"] } serde_derive = "1" -serde_cbor = { version = "0.11.2", optional = true } +serde_cbor = { version = "0.11", optional = true } serde_json = "1.0" simple_logger = { version = "1.16", features = ["colors", "threads"] } -strum = "0.20" -strum_macros = "0.20" -tokio = { version = "1.12.0", features = ["net"], optional = true } +strum = "0.24" +strum_macros = "0.24" # remove and replace when drain_filter is in stable vec_mut_scan = "0.4" -webbrowser = "0.5.5" -winit = { git = "https://github.com/alula/winit.git", rev = "6acf76ff192dd8270aaa119b9f35716c03685f9f", optional = true, default_features = false, features = ["x11"] } -xmltree = "0.10.3" +webbrowser = "0.8" +#winit = { git = "https://github.com/alula/winit.git", rev = "6acf76ff192dd8270aaa119b9f35716c03685f9f", optional = true, default_features = false, features = ["x11"] } +winit = { version = "0.27", optional = true, default_features = false, features = ["x11"] } +xmltree = "0.10" [target.'cfg(target_os = "windows")'.dependencies] winapi = { version = "0.3", features = ["winuser"] } @@ -95,10 +92,10 @@ winapi = { version = "0.3", features = ["winuser"] } winres = "0.1" [target.'cfg(target_os = "macos")'.dependencies] -objc = "0.2.7" +objc = "0.2" [target.'cfg(target_os = "android")'.dependencies] -ndk = "0.3" -ndk-glue = "0.3" -ndk-sys = "0.2" -jni = "0.19" +ndk = "0.7" +ndk-glue = "0.7" +ndk-sys = "0.4" +jni = "0.20" diff --git a/src/builtin/builtin_data/buttons.png b/src/builtin/builtin_data/buttons.png deleted file mode 100644 index 58a2ec887532d3aae27295d1c6960a2613b40610..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282973 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 PBgg_zS3j3^P6=P#5V-D6X)`)qOa?f=)`|M!1o zHv4i{^j+@7)phUuzD)i6IOTg*yhZWu=;C83`=0R`{|!IC-HI8X=PmaCx&GURIp^V~ va>j_746y^kwa3oKWwwpW$l29*_!8S3j3^P6w%mbPyaoi%WLd3!87UBvb#&X zlG^`N8hT~qOk)L_L=;#s`S#zVv#g!>Q+_REA{)X zdlekWVYP^#EG(QbfuWg2Lgj#hzhU4@{!3f4mu~-~fBk0btd}Nj6JwUooFFsLMvrgx zli2<8MvQD%_r@|Y95B7ASM94%-u)n1|LL6DQdd^5+aViRWtfn1^GnQu^zawn!o^b- ze|mk+TAAaWz?~N>mVY_h=v>a8SNgrtZeLV%L)I1jsCp48(J z;L+g7#3KZ9kj?QUDs~?A?q|1rToHDj;j_0Hr50ZQEsE%P@yM B<9Yx9 diff --git a/src/builtin/builtin_data/headband/ogph/Npc/NpcRegu.png b/src/builtin/builtin_data/headband/ogph/Npc/NpcRegu.png deleted file mode 100644 index c1e9d36e0bd5ed25d6b795f3ed0f1fea9cf74e79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 zcmeAS@N?(olHy`uVBq!ia0y~yU~~YoKX9-C$wJ+|*+7c1ILO_JVcj{ImkbO{>Ygr+ zAr*7p-f_%2Y#_iIuyXs$-piA}TAW(eDAu(hCsNtMA52HPO5t*>`KZ|rqt3GiIGWlz<4=HDmRo3C9sq5kZ*8U5RS{bU4Mh6EaByM`Ar zN_X=q%x!R(aglKezkr0V{Dc0h=lPLTftUfJp~p*~?z0lPdDi_4n9abNJEmGw-(V-s)rg!30>J)LfHKr!9fTV6r% z&*}!f5(Xxqo&%O)jt#kytc|}bw9F;%Hh|0-Hb6(&U7jH#{-@8{Q`mHz+$ diff --git a/src/builtin/builtin_data/headband/plus/casts.png b/src/builtin/builtin_data/headband/plus/casts.png deleted file mode 100644 index bd408c79910c1fcd536c6697eacb1d27c3e7c7a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1621 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sV0^&A1{5*9c;^X_Vk{1FcVbv~PUa<$!;&U>cv7h@-A}f&3S>O>_%)r1c48n{Iv*t)JFtEPzba4!+h@XYB&j0~?{+@HhXwov-p?wdk8 z?(AE3*DD&br7;W(V)HI}IlJJ_q6?l{WiDkT roJDmXE8lk*&7zpWPA`!Kj$Myr1H{*AKDhi#5oD>StDnm{r-UW|og2g* diff --git a/src/builtin/builtin_data/headband/plus/npc/npcguest.png b/src/builtin/builtin_data/headband/plus/npc/npcguest.png deleted file mode 100644 index 54d3a1e6aeec3a72786a9ed658d3bb1d8d565779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1490 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 diff --git a/src/builtin/builtin_data/headband/plus/npc/npcregu.png b/src/builtin/builtin_data/headband/plus/npc/npcregu.png deleted file mode 100644 index 6897b3cdf7ef885782f7c36da79c3daaf010f5fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3952 zcmeH}Sx}Q%7RPS_vdAK$vMGz&3?pIyK@iylu|Yr(Xcj>rh=?Y#3=sk-CW@fl8N^nW zR-m!lW-}W>lc+I(MjB-cDj^bxz(m$S0%dUtGiX*@0{N`|5NA3 z6Mmi=8x1xB05pzyc?1Fg#R8yUtD+=7**kc5Rz5*cfu8Pw)UjhszEO;KJMIPmC0}hN zW`lgMn(TEF1%M`N?SnKYRi6Q1(}rUnZa<_)P4X#;eQykv;XRR9Tkh-QU8k^H>vxIx z&4sw9ZQJ{f^a)QLvL~$oQJK3r?BKQlgQ|d7lgOS|J@n)VQantVj1Q=7I41T>e5~m43areb}A*+?!{=6#b6aQQimHNkU7+;vV z;99wW1mL4#JW$rIjxwx2ms`uOif(yd5z?DlQ+WSgASOaf$ae*`n(UU#y9Wm*r>piR z{5+7nIK5gp9}?lCv4i-WJ2%nL-745pq)pn7xf#BDW;Pm0r!mkn%4FD365Wtx-8&8i z612668TL#R>s2M?oQ5Sko4ZcXF`i>3Gro<_P16}Yu}OiAv(%vnsiz?M@=gaUq>mpM_xquziJ^jW=YMISL5Wh_CL&;fv9besvv%_PlwvDpe-Frba{Wu=)n%J-~p zVnsVqM*w*Gw?Vvx=m+n_%Cio$CgbUJ=V%Ru8Hr@b@V5sT@UR?g2_2fH^7 zHZO!4aS^z#vcSilvZeCtRVz%TN2WY?^lUlcTaZ`happZ-Bz_jQj^>4l6G=Ccv`YuVT#AT z*1q{l?w`xVqE3v|WrRYe(i4<{Rrxzex*j;KyVImnbA`F=4<5Ny*iOpB7pvzUTijf~ zP!9pSwZVSV>xGqNk07zWVktL~B)B{B*o9u93c`MJU~#uHCGjo?6pMoYB5eTXg%h7g zUsyz)qqbMbDYXeQ?kQNgYbjxK(!I04+$biO^kyv&^Yhk{6LE{fB%x(KW&rA+XM^oL z3FY8fy6sx?OS3*FpLZb`FlwMp(0G#CX{IFl4rOv>S>PWx7KkUB9x!f|DhQ_uZ84Pn z>GjUiivsF>_&>fTz2WVM)PwoFz2^6u2d8w<=GiF- zc5wO9cN2w8YDAi84VhlI5zL-G5k*U4``dJ7UFt}DLg$5lDb43>2-{-p32=Ae()O4A zvN`ce^+<~+Lp3>wNAg+38#fj4>Wh^LMfR@nfD}9Nlt40~dI7V%Dz%WRo>9Yl(Rz0ZU13J`UrkID~C@GbDf#4vw!>WRyjR>r!yvF@z@5;^L} zI)7FF9_fT9G^pD~URWP?8#$)QU#SowgXxb6cGRf&*aYhQoq7E*vn2P6v9-)de*TUU zJtMNjt4tuf?7S#6mRXHGofTpFyA3X1otswjuvhAxtmEI~u70!?btW{+CFD%pw+Iyq z@@|UMX$h)cs2uX1%!P*ISI$iH7hF&EkV1O12o8(T#;7w^Z3S9k_tPF}4m<5bNx!6Z zaCd{Lyq87hnj|V3*e~fpN6jG#ixgQwe$o=^9 z`5G0Ftc&_o0|iFoa^cGhZ9#O6-)aRyShqX2c-OQr6wJ5lAAWii8vZH*=39E+8;;kt zF+xx)LJ-gW41whH_+m2d`r}MTiowUadYof$S9oHuQlpFh1^DkVi?~R|!*p{65LR7U z)@nN>=$A}wwgQc>+VrL0{=dFhC$LW7e-OYj9UL7FS>klV6HplwtFD&vu2mOeEWA*7qVt_0d?QqWE6LrA6dMD$7y)?H z(k1W7-f=P$1F&Wlxew}|qu1`%$2x&^0{=Gz9^_|d%OJS?+S<3D4@It-b?m602gx0N F?cZKH9}xfm diff --git a/src/builtin/builtin_data/locale/en.json b/src/builtin/builtin_data/locale/en.json deleted file mode 100644 index d3b7529..0000000 --- a/src/builtin/builtin_data/locale/en.json +++ /dev/null @@ -1,197 +0,0 @@ -{ - "name": "English", - "font": "csfont.fnt", - "font_scale": "0.5", - - "common": { - "name": "doukutsu-rs", - "back": "< Back", - "yes": "Yes", - "no": "No", - "on": "ON", - "off": "OFF" - }, - - "menus": { - "main_menu": { - "start": "Start Game", - "challenges": "Challenges", - "options": "Options", - "editor": "Editor", - "jukebox": "Jukebox", - "quit": "Quit" - }, - - "pause_menu": { - "resume": "Resume", - "retry": "Retry", - "options": "Options", - "title": "Title", - "title_confirm": "Title?", - "quit": "Quit", - "quit_confirm": "Quit?", - "add_player2": "Add Player 2", - "drop_player2": "Drop Player 2" - }, - - "save_menu": { - "new": "New Save", - "delete_info": "Press Right to Delete", - "delete_confirm": "Delete?", - "invalid_save": "Invalid Save" - }, - - "difficulty_menu": { - "title": "Select Difficulty", - "easy": "Easy", - "normal": "Normal", - "hard": "Hard" - }, - - "coop_menu": { - "title": "Select Number of Players", - "one": "Single Player", - "two": "Two Players" - }, - "skin_menu": { - "title": "Select Player 2's appearance", - "label": "Appearance:" - }, - - "challenge_menu": { - "start": "Start", - "no_replay": "No Replay", - "replay_best": "Replay Best", - "replay_last": "Replay Last", - "delete_replay": "Delete Best Replay" - }, - - "options_menu": { - "graphics": "Graphics...", - "graphics_menu": { - "window_mode": { - "entry": "Display mode:", - "windowed": "Windowed", - "fullscreen": "Fullscreen" - }, - "lighting_effects": "Lighting effects:", - "weapon_light_cone": "Weapon light cone:", - "screen_shake": { - "entry": "Screen shake intensity:", - "full": "1x", - "half": "0.5x", - "off": "Off" - }, - "motion_interpolation": "Motion interpolation:", - "subpixel_scrolling": "Subpixel scrolling:", - "original_textures": "Original textures:", - "seasonal_textures": "Seasonal textures:", - "renderer": "Renderer:", - "vsync_mode": { - "entry": "V-Sync:", - "uncapped": "Uncapped", - "uncapped_desc": "V-Sync Off.", - "vsync": "Enabled", - "vsync_desc": "V-Sync On.", - "vrr_1x": "Variable Refresh Rate (1x)", - "vrr_1x_desc": "Uses (G-/Free)Sync if available.", - "vrr_2x": "Variable Refresh Rate (2x)", - "vrr_2x_desc": "Uses (G-/Free)Sync if available.", - "vrr_3x": "Variable Refresh Rate (3x)", - "vrr_3x_desc": "Uses (G-/Free)Sync if available." - } - }, - - "sound": "Sound...", - "sound_menu": { - "music_volume": "Music Volume", - "effects_volume": "Effects Volume", - "bgm_interpolation": { - "entry": "BGM Interpolation:", - "linear": "Linear", - "linear_desc": "Fast, similar to freeware on Vista+", - "cosine": "Cosine", - "cosine_desc": "Cosine interpolation", - "cubic": "Cubic", - "cubic_desc": "Cubic interpolation", - "linear_lp": "Linear+LP", - "linear_lp_desc": "Slowest, similar to freeware on XP", - "nearest": "Nearest", - "nearest_desc": "Fastest, lowest quality" - }, - "soundtrack": "Soundtrack: {soundtrack}" - }, - - "controls": "Controls...", - - "language": "Language...", - - "behavior": "Behavior...", - "behavior_menu": { - "game_timing": { - "entry": "Game timing:", - "50tps": "50tps (freeware)", - "60tps": "60tps (CS+)" - }, - "pause_on_focus_loss": "Pause on focus loss:", - "cutscene_skip_method": { - "entry": "Cutscene Skip:", - "hold": "Hold to Skip", - "fastforward": "Fast-Forward" - } - }, - - "links": "Links..." - }, - - "controls_menu": { - "select_player": { - "entry": "Select player:", - "player_1": "Player 1", - "player_2": "Player 2" - }, - "controller": { - "entry": "Controller...", - "keyboard": "Keyboard" - }, - "rebind": "Rebind...", - "rebind_menu": { - "up": "Up", - "down": "Down", - "left": "Left", - "right": "Right", - "jump": "Jump", - "shoot": "Shoot", - "prev_weapon": "Previous weapon", - "next_weapon": "Next weapon", - "inventory": "Inventory", - "map": "Map system", - "skip": "Skip", - "strafe": "Strafe", - "menu_ok": "Menu select/confirm", - "menu_back": "Menu back/cancel" - }, - - "rebind_confirm_menu": { - "title": "Press button for \"{control}\"", - "cancel": "(Esc to cancel)" - }, - - "rumble": "Rumble:", - - "reset_confirm": "Reset...", - "reset_confirm_menu_title": "Reset controls?" - } - }, - - "soundtrack": { - "organya": "Organya", - "remastered": "Remastered", - "new": "New", - "famitracks": "Famitracks" - }, - - "game": { - "cutscene_skip": "Hold {key} to skip the cutscene" - } -} diff --git a/src/builtin/builtin_data/locale/jp.json b/src/builtin/builtin_data/locale/jp.json deleted file mode 100644 index 575e4a3..0000000 --- a/src/builtin/builtin_data/locale/jp.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "name": "Japanese", - "font": "csfontjp.fnt", - "font_scale": "0.5", - - "common": { - "name": "doukutsu-rs", - "back": "< 戻る", - "yes": "はい", - "no": "いいえ", - "on": "オン", - "off": "オフ" - }, - "menus": { - "main_menu": { - "start": "ゲームスタート", - "challenges": "チャレンジ", - "options": "オプション", - "editor": "レベルエディタ", - "jukebox": "ジュークボックス", - "quit": "辞める" - }, - "pause_menu": { - "resume": "再開", - "retry": "リトライ", - "options": "設定", - "title": "メインメニュー", - "title_confirm": "メインメニュー?", - "quit": "辞める", - "quit_confirm": "辞める?", - "add_player2": "プレーヤー2を追加", - "drop_player2": "プレーヤー2を削除" - }, - "save_menu": { - "new": "新しいデータ", - "delete_info": "右矢印キーで削除", - "delete_confirm": "消去?", - "invalid_save": "無効な保存" - }, - "difficulty_menu": { - "title": "難易度選択", - "easy": "簡単", - "normal": "普通", - "hard": "難しい" - }, - "coop_menu": { - "title": "プレイヤー数を選択", - "one": "1人プレイ", - "two": "2人プレイ" - }, - "skin_menu": { - "title": "プレーヤー2の外観を選択します", - "label": "外観:" - }, - "challenge_menu": { - "start": "スタート", - "no_replay": "ノーリプレイ", - "replay_best": "ベストプレイを再生", - "replay_last": "最後のプレイを再生", - "delete_replay": "ベストリプレイを削除" - }, - "options_menu": { - "graphics": "グラフィック", - "graphics_menu": { - "window_mode": { - "entry": "画面表示:", - "windowed": "ウィンドウ", - "fullscreen": "フルスクリーン" - }, - "lighting_effects": "ライティング効果:", - "weapon_light_cone": "兵器のライトコーン:", - "screen_shake": { - "entry": "画面の揺れ:", - "full": "1x", - "half": "0.5x", - "off": "オフ" - }, - "motion_interpolation": "モーション補間:", - "subpixel_scrolling": "サブピクセルスクロール:", - "original_textures": "オリジナルテクスチャ:", - "seasonal_textures": "季節ものテクスチャ:", - "renderer": "レンダラ:", - "vsync_mode": { - "entry": "V-Sync:", - "uncapped": "Uncapped", - "uncapped_desc": "V-Sync Off.", - "vsync": "Enabled", - "vsync_desc": "V-Sync On.", - "vrr_1x": "Variable Refresh Rate (1x)", - "vrr_1x_desc": "Uses (G-/Free)Sync if available.", - "vrr_2x": "Variable Refresh Rate (2x)", - "vrr_2x_desc": "Uses (G-/Free)Sync if available.", - "vrr_3x": "Variable Refresh Rate (3x)", - "vrr_3x_desc": "Uses (G-/Free)Sync if available." - } - }, - "sound": "サウンド", - "sound_menu": { - "music_volume": "BGM音量", - "effects_volume": "サウンド音量", - "bgm_interpolation": { - "entry": "BGM内挿:", - "linear": "線形補間", - "linear_desc": "速い、フリーウェア版に近い(Vista+)", - "cosine": "余弦", - "cosine_desc": "余弦補間", - "cubic": "立方体", - "cubic_desc": "立方体補間", - "linear_lp": "線形補間+LP", - "linear_lp_desc": "最も遅い、フリーウェア版に近い(XP)", - "nearest": "最近傍", - "nearest_desc": "最速、最低品質" - }, - "soundtrack": "サウンドトラック: {soundtrack}" - }, - - "controls": "ボタン変更", - - "language": "言語", - - "behavior": "動作", - "behavior_menu": { - "game_timing": { - "entry": "ゲームのタイミング:", - "50tps": "50tps (freeware)", - "60tps": "60tps (CS+)" - }, - "pause_on_focus_loss": "フォーカスが外れた時のポーズ:", - "cutscene_skip_method": { - "entry": "カットシーンをスキップ", - "hold": "を押し続け", - "fastforward": "はやおくり" - } - }, - "links": "リンク" - }, - - "controls_menu": { - "select_player": { - "entry": "プレイヤーを選択:", - "player_1": "プレーヤー 1", - "player_2": "プレーヤー 2" - }, - "controller": { - "entry": "コントローラ", - "keyboard": "キーボード" - }, - "rebind": "再バインド", - "rebind_menu": { - "up": "うえ", - "down": "した", - "left": "ひだり", - "right": "みぎ", - "jump": "ジャンプ", - "shoot": "ショット", - "prev_weapon": "前の武器", - "next_weapon": "次の武器", - "inventory": "在庫", - "map": "マップシステム", - "skip": "スキップ", - "strafe": "ストレイフ", - "menu_ok": "メニュー選択/OK", - "menu_back": "メニュー残す/キャンセル" - }, - - "rebind_confirm_menu": { - "title": "新しい「ジャンプ」ボタンを押す", - "cancel": "(Escキーを押してキャンセル)" - }, - - "rumble": "ランブル", - - "reset_confirm": "リセット", - "reset_confirm_menu_title": "ボタンをリセットしますか?" - } - }, - - "soundtrack": { - "organya": "オルガーニャ", - "remastered": "リマスター", - "new": "新", - "famitracks": "ファミトラック" - }, - "game": { - "cutscene_skip": "{key} を押し続け、カットシーンをスキップ" - } -} diff --git a/src/builtin/builtin_data/triangles.png b/src/builtin/builtin_data/triangles.png deleted file mode 100644 index 6130b54877aec5c8dd0453e5af7f9a19cf10bea9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W_!3HEylDNj!q#}J9BQ~NJ+F(_~_Z-4Q> zzA{l{MZ`t9=am|&50%+IH*~A~ZYuf~q-s%WyjG$rvO(K%-s}tBo7Tj5xwkaGd8%GA e@uwey0mJW00s={vCMrNf89ZJ6T-G@yGywoO*(wbH diff --git a/src/builtin/builtin_font.bmfc b/src/builtin/builtin_font.bmfc deleted file mode 100644 index b348b50..0000000 --- a/src/builtin/builtin_font.bmfc +++ /dev/null @@ -1,276 +0,0 @@ -# AngelCode Bitmap Font Generator configuration file -fileVersion=1 - -# font settings -fontName=JF Dot k12x10 -fontFile=JF-Dot-k12x10.ttf -charSet=0 -fontSize=10 -aa=1 -scaleH=100 -useSmoothing=0 -isBold=0 -isItalic=0 -useUnicode=1 -disableBoxChars=1 -outputInvalidCharGlyph=1 -dontIncludeKerningPairs=0 -useHinting=1 -renderFromOutline=0 -useClearType=1 -autoFitNumPages=0 -autoFitFontSizeMin=0 -autoFitFontSizeMax=0 - -# character alignment -paddingDown=0 -paddingUp=0 -paddingRight=0 -paddingLeft=0 -spacingHoriz=1 -spacingVert=1 -useFixedHeight=0 -forceZero=0 -widthPaddingFactor=0.00 - -# output file -outWidth=512 -outHeight=512 -outBitDepth=8 -fontDescFormat=2 -fourChnlPacked=0 -textureFormat=png -textureCompression=0 -alphaChnl=0 -redChnl=4 -greenChnl=4 -blueChnl=4 -invA=0 -invR=0 -invG=0 -invB=0 - -# outline -outlineThickness=0 - -# selected chars -chars=32-126,160,167-168,176-177,180,182,215,247,913-929,931-937,945-961,963-969,1025,1040-1103,1105,8208 -chars=8213,8216-8217,8229-8230,8251,8451,8470,8481,8491,8544-8553,8592-8595,8658,8660,8722,8730,8733-8734 -chars=9312-9331,9472-9475,9484,9487-9488,9491-9492,9495-9496,9499-9501,9504,9507-9509,9512,9515-9516,9519 -chars=9520,9523-9524,9527-9528,9531-9532,9535,9538,9547,9632-9633,9650-9651,9660-9661,9670-9671,9675,9678 -chars=9679,9711,9733-9734,9792,9794,9834,9837,9839,12288-12291,12293-12309,12316-12317,12319,12353-12435 -chars=12443-12446,12449-12534,12539-12542,12849-12850,12857,12964-12968,13059,13069,13076,13080,13090 -chars=13091,13094-13095,13099,13110,13115,13129-13130,13133,13137,13143,13179-13182,13198-13199,13212 -chars=13213-13214,13217,13252,13261,19968-19969,19971,19975-19979,19981-19982,19984-19985,19988-19993 -chars=19998,20001,20006,20010,20013,20017-20018,20022,20024-20025,20027-20028,20031,20034-20035,20037 -chars=20043,20045-20047,20053-20057,20061-20063,20066,20081,20083,20094,20096,20098,20101-20102,20104 -chars=20105-20108,20110,20113-20114,20116-20117,20120-20121,20123-20124,20126-20130,20132-20134,20136 -chars=20139-20142,20144,20147,20150,20154,20160-20162,20164,20166-20167,20170-20171,20173-20175,20180 -chars=20181-20185,20189-20191,20195-20197,20205-20206,20208,20210,20214-20215,20219,20225,20233-20234 -chars=20237-20241,20250,20252-20253,20271-20272,20276,20278,20280,20282,20284-20285,20291,20294-20295 -chars=20301-20305,20307,20309,20311,20313-20318,20329,20335-20336,20339,20341-20342,20347-20348,20351 -chars=20355,20358,20360,20363,20365,20367,20369,20374,20376,20379,20381,20384-20385,20395,20397-20399 -chars=20405-20406,20415,20418-20420,20426,20430,20432-20433,20436,20439-20440,20442-20443,20445,20447 -chars=20449,20451-20453,20462-20463,20467,20469-20470,20472,20474,20478,20485-20486,20489,20491,20493 -chars=20495,20497-20498,20500,20502,20505-20506,20511,20513,20515-20518,20520-20525,20534,20537,20547 -chars=20551-20553,20559-20560,20565-20566,20570,20572,20581,20588,20594,20596-20598,20600,20605,20608 -chars=20613,20621,20625,20632-20634,20652-20653,20658-20661,20663,20670,20674,20677,20681-20682,20685 -chars=20687,20689,20693-20694,20698,20702,20707,20709,20711,20717-20718,20725,20729,20731,20736-20738 -chars=20740,20745,20754,20756-20758,20760,20762,20767,20769,20778,20786,20791,20794-20796,20799-20801 -chars=20803-20809,20811-20814,20816,20818,20820,20826,20828,20834,20837,20840-20846,20849,20853-20856 -chars=20860,20864,20866,20869-20870,20873-20874,20876-20877,20879-20883,20885-20887,20889,20896,20898 -chars=20900-20902,20904-20908,20912-20919,20925,20932-20934,20937,20939-20941,20950,20955-20957,20960 -chars=20961,20966-20967,20969-20970,20973,20976-20977,20981-20982,20984-20986,20989-20990,20992,20995 -chars=20996,20998-21000,21002-21003,21006,21009,21012,21015,21021,21028-21029,21031,21033-21034,21038 -chars=21040,21043,21046-21051,21059-21060,21063,21066-21069,21071,21076,21078,21083,21086,21091-21093 -chars=21097-21098,21103-21109,21117,21119,21123,21127-21129,21133,21137-21138,21140,21147,21151-21152 -chars=21155,21161-21165,21169,21172-21173,21177,21180,21182,21185,21187,21189,21191,21193,21197,21202 -chars=21205,21207-21209,21213-21216,21218-21220,21222-21223,21234-21235,21237,21240-21242,21246-21247 -chars=21249-21250,21253-21254,21256,21261,21263-21264,21269-21271,21273-21274,21277,21280-21281,21283 -chars=21290,21295,21297,21299,21304-21307,21311-21313,21315,21317-21322,21325,21329-21332,21335-21336 -chars=21338,21340,21342,21344,21350,21353,21358-21361,21363-21365,21367-21368,21371,21375,21378,21380 -chars=21398,21400,21402,21407-21408,21413-21414,21416-21417,21421-21422,21424,21427,21430,21435,21442 -chars=21443,21448-21454,21460,21462-21463,21465,21467,21471,21473-21477,21480-21491,21494-21496,21498 -chars=21505,21507-21508,21512-21521,21531,21533,21535-21536,21542,21545,21547-21550,21558,21560-21561 -chars=21563-21566,21568,21570,21574,21576-21578,21582,21585,21599,21608,21610,21616-21617,21619,21621 -chars=21622-21623,21627-21629,21632,21636,21638,21643-21644,21646-21648,21650,21666,21668-21669,21672 -chars=21675-21676,21679,21682-21683,21688,21692-21694,21696-21698,21700,21703-21705,21720,21729-21730 -chars=21733-21734,21736-21737,21741-21742,21746,21754,21757,21764,21766-21767,21775-21776,21780,21782 -chars=21806-21807,21809,21811,21816-21817,21822,21824,21828-21830,21836,21839,21843,21846-21847,21852 -chars=21853,21859,21883-21884,21886,21888,21891-21892,21895,21897-21899,21912-21914,21916-21919,21927 -chars=21928-21932,21934,21936,21942,21956-21957,21959,21972,21978,21980,21983,21987-21988,22007,22009 -chars=22013-22014,22022,22025,22036,22038-22040,22043,22057,22063,22065-22066,22068,22070,22072,22082 -chars=22092,22094,22096,22107,22116,22120,22122-22124,22132,22136,22138,22144,22150-22151,22154,22159 -chars=22164,22176,22178,22181,22190,22196,22198,22204,22208-22211,22216,22222,22225,22227,22231-22232 -chars=22234-22235,22238,22240,22243,22254,22256,22258-22259,22265-22266,22269,22271-22272,22275-22276 -chars=22280-22281,22283,22285,22287,22290-22291,22294,22296,22300,22303,22310-22312,22317,22320,22327 -chars=22328,22331,22336,22338,22343,22346,22350-22353,22369,22372,22374,22377-22378,22399,22402,22408 -chars=22409,22411,22419,22432,22434-22436,22442,22448,22451,22464,22467,22470,22475,22478,22482-22484 -chars=22486,22492,22495-22496,22499,22516,22519,22521-22522,22524,22528,22530,22533-22534,22538-22539 -chars=22549,22553,22557,22561,22564,22570,22575-22577,22580-22581,22586,22589,22592-22593,22602-22603 -chars=22609-22610,22612,22615-22618,22622,22626,22633,22635,22640,22642,22645,22649,22654,22659,22661 -chars=22675,22679,22684,22687,22696,22699,22702,22707,22712-22715,22718,22721,22725,22727,22730,22732 -chars=22737,22739,22741,22743-22745,22748,22750-22751,22756-22757,22763-22764,22766-22770,22775,22777 -chars=22778-22781,22786,22793-22794,22799-22800,22805-22806,22808-22812,22818,22821,22823,22825-22830 -chars=22833-22834,22839-22840,22846,22852,22855-22857,22862-22865,22868-22869,22871-22872,22874,22880 -chars=22882,22885,22887-22890,22892,22894,22899-22900,22904,22909,22913-22916,22922,22925,22931,22934 -chars=22937,22939,22941,22947,22949,22952,22956,22962,22969,22971,22974,22982,22985,22987,22992-22993 -chars=22995-22996,23001-23002,23004,23013-23014,23016,23018-23019,23030,23035,23039,23041,23043,23049 -chars=23057,23064,23066,23068,23071-23072,23077,23081,23087,23093-23094,23100,23104-23105,23110,23113 -chars=23130,23138,23142,23146,23148,23167,23186,23194-23195,23228-23230,23233-23234,23241,23243-23244 -chars=23248,23254-23255,23265,23267,23270,23273,23290-23291,23305,23307-23308,23318,23330,23338,23340 -chars=23344,23346,23350,23358,23360,23363,23365,23376-23377,23380-23381,23383-23384,23386-23389,23391 -chars=23395-23398,23401,23403,23408-23409,23411,23413,23416,23418,23424,23427,23429,23431-23433,23435 -chars=23436-23437,23439,23445,23447-23453,23455,23458-23462,23470,23472,23475-23478,23480-23481,23487 -chars=23490-23495,23497,23500,23504,23506-23508,23515,23517-23519,23521-23522,23524-23529,23531,23534 -chars=23536,23539,23541-23542,23544,23546,23550-23551,23553-23554,23556-23563,23565-23567,23569,23571 -chars=23574,23578,23584,23586,23588,23592,23597,23601,23608-23617,23621-23622,23624,23626-23627,23629 -chars=23630-23633,23635,23637,23646,23648-23649,23652-23653,23660,23662-23663,23665,23670,23673,23692 -chars=23696-23697,23700,23713,23720-23721,23723-23724,23729,23731,23734-23736,23739-23740,23742,23749 -chars=23751,23769,23776-23777,23784-23786,23789,23791-23792,23798,23802-23803,23805,23815,23819,23822 -chars=23825,23828-23835,23839,23842,23849,23883-23884,23886,23888,23890,23900,23913,23916,23919,23923 -chars=23926,23938,23940,23943,23947-23948,23952,23965,23970,23980,23982,23991,23994,23996-23997,24009 -chars=24012-24013,24018-24019,24022,24027,24029-24030,24033,24035,24037-24040,24043,24046,24049-24053 -chars=24055,24059,24061-24062,24066-24067,24070,24075-24076,24081,24086,24089-24091,24093,24101,24107 -chars=24109,24111-24112,24115,24118-24120,24125,24128,24131-24133,24135,24140,24142,24148-24149,24151 -chars=24159,24161-24164,24178-24182,24184-24191,24193,24195-24196,24199,24202,24207,24213-24215,24218 -chars=24220,24224,24230-24231,24235,24237,24245-24248,24257-24259,24264-24266,24271-24272,24275,24278 -chars=24282-24283,24285,24287-24291,24296-24297,24300,24304-24305,24307-24308,24310-24312,24314-24316 -chars=24318-24319,24321,24323-24324,24329-24333,24335-24337,24339-24344,24347,24351,24357-24359,24361 -chars=24365,24367,24369,24373,24375-24376,24380,24382,24385,24392,24394,24396,24398,24401,24403,24406 -chars=24407,24409,24412-24413,24417-24418,24422,24425-24429,24432-24433,24435,24439,24441,24444,24447 -chars=24448-24453,24455-24456,24458-24460,24464-24467,24471-24473,24478,24480-24481,24488-24490,24493 -chars=24494,24499-24500,24505,24508-24509,24515,24517,24524-24525,24534-24537,24540-24541,24544,24548 -chars=24555,24560-24561,24565,24568,24571,24573,24575,24590-24592,24594,24597-24598,24601,24603-24605 -chars=24608-24609,24613-24619,24623,24625,24634,24641-24643,24646,24650-24651,24653,24656,24658,24661 -chars=24665-24666,24671-24672,24674-24677,24680-24685,24687-24688,24693,24695,24705,24707-24708,24713 -chars=24715-24717,24722,24724,24726-24727,24730-24731,24735-24736,24739,24742-24743,24745-24746,24754 -chars=24755-24758,24760,24764-24765,24773-24775,24785,24787,24792,24794,24796,24799-24801,24803,24807 -chars=24808,24816-24817,24819-24820,24822-24823,24825-24827,24832-24833,24835,24838,24840-24841,24845 -chars=24846-24847,24853,24858-24859,24863,24865,24871-24872,24876,24884,24892-24895,24898,24900,24903 -chars=24904,24906-24910,24915,24917,24920-24922,24925,24927,24930-24931,24933,24935-24936,24939,24942 -chars=24943-24945,24947-24951,24958,24962,24967,24970,24974,24976-24977,24980,24982,24985-24986,24996 -chars=24999,25001,25003-25004,25006,25010,25014,25018,25022,25027,25030-25037,25040,25059,25062,25074 -chars=25076,25078-25080,25082,25084-25088,25096-25098,25100-25102,25104-25106,25108,25110,25114-25115 -chars=25117-25119,25121,25126,25130,25134-25136,25138-25140,25144,25147,25151-25153,25159-25161,25163 -chars=25165-25166,25171,25173,25176,25179,25182,25184,25187,25192,25198,25201,25206,25209,25212,25214 -chars=25215-25216,25218-25220,25225-25226,25233-25240,25243-25244,25246,25259-25260,25265,25269,25273 -chars=25275-25277,25282,25285-25290,25292-25293,25295-25300,25303-25305,25307-25309,25312-25313,25324 -chars=25325-25327,25329,25331,25333-25335,25342-25343,25345-25346,25351-25353,25356,25361,25369,25375 -chars=25383-25384,25387,25391,25402,25405-25407,25417,25420-25421,25423-25424,25429,25431,25436,25447 -chars=25448-25449,25451,25454,25458,25462-25463,25466-25467,25472,25475,25480-25481,25484,25486-25487 -chars=25490,25494,25496,25499,25503-25507,25509,25511-25516,25522,25524-25525,25531,25534,25536,25539 -chars=25540,25542,25545,25551-25552,25554,25558,25562-25563,25569,25571,25577,25582,25588,25590,25594 -chars=25606,25613,25615,25619,25622-25623,25628,25638,25640,25644-25645,25652,25654,25658,25662,25666 -chars=25678,25688,25703,25705,25711,25718,25720,25722,25731,25736,25746-25747,25749,25754,25758,25764 -chars=25765,25769,25771,25773-25774,25776,25778,25785,25787-25788,25793-25794,25797,25799,25805,25810 -chars=25812,25816,25818,25824-25827,25830-25831,25836,25839,25841-25842,25844,25846,25850,25853-25854 -chars=25856,25861,25880,25884-25885,25891-25892,25898-25900,25903,25908-25913,25915,25918-25919,25925 -chars=25928,25933,25935,25937,25941-25945,25949-25950,25954-25955,25958,25964,25968,25970,25972-25973 -chars=25975-25976,25986-25987,25991-25993,25996,25998,26000-26001,26007,26009,26011-26012,26015,26017 -chars=26020-26021,26023,26027-26029,26031-26032,26039,26041,26044-26045,26049,26051-26054,26059-26060 -chars=26063,26066,26071,26073,26075,26080-26082,26085-26089,26092-26093,26097,26106-26107,26114-26115 -chars=26118-26119,26122,26124,26126-26127,26131-26132,26140,26143-26144,26149,26151-26152,26157,26159 -chars=26164-26166,26172,26175,26177-26180,26185,26187,26191,26194,26205-26207,26210,26212,26214-26217 -chars=26222-26224,26228,26230,26234,26241,26243-26244,26247-26249,26254,26257,26262-26264,26269,26274 -chars=26278,26283,26286,26292,26296-26297,26300,26302,26305,26308,26311,26313,26326,26329-26330,26332 -chars=26333,26336,26342,26345,26352,26354-26357,26359-26361,26364-26368,26371,26376-26377,26379,26381 -chars=26383,26388-26391,26395,26397-26399,26406-26408,26410-26414,26417,26420,26422-26424,26426,26429 -chars=26431,26433,26438,26441,26446-26449,26451,26454,26457,26460,26462-26469,26474,26477,26479-26483 -chars=26485,26487,26492,26494-26495,26501,26503,26505,26507-26508,26512,26517,26519,26522,26524-26525 -chars=26528-26530,26534,26537,26543,26547-26548,26550-26553,26561,26564,26566,26570,26574-26577,26579 -chars=26580,26584,26586,26589-26590,26594,26596,26599,26601,26604,26606-26607,26609,26611-26613,26619 -chars=26622-26623,26626-26628,26643,26646-26647,26654,26657-26658,26665-26667,26674,26676,26680-26681 -chars=26684-26685,26688-26691,26694,26696,26701-26702,26704-26705,26707-26708,26713,26716-26717,26719 -chars=26723,26727,26740,26742-26743,26750-26751,26753,26755,26757,26765,26767,26771-26772,26775,26779 -chars=26781,26783-26784,26786,26790-26792,26797,26799-26801,26803,26805-26806,26809-26810,26812,26820 -chars=26822,26825-26827,26829,26834,26836-26837,26839-26840,26842,26847-26849,26851,26855,26862-26863 -chars=26866,26873-26874,26880-26881,26884-26885,26888,26891-26895,26898,26905-26908,26913-26915,26917 -chars=26918,26920,26922,26928,26932,26934,26937,26941,26943,26954,26963-26965,26969-26970,26972-26974 -chars=26976-26978,26986-26987,26989-26991,26995-26997,26999-27001,27004-27006,27009-27010,27018,27022 -chars=27025,27028-27029,27035-27036,27040,27047,27054,27057-27058,27060,27067,27070-27071,27073,27075 -chars=27079,27082-27086,27088,27091,27096-27097,27101-27102,27111-27112,27115,27117,27122,27129,27131 -chars=27133,27135,27138,27141,27146-27148,27154-27156,27159,27161,27163,27166-27167,27169-27171,27177 -chars=27178-27179,27182,27189-27190,27192-27194,27197,27204,27207-27208,27211,27224-27225,27231,27233 -chars=27234,27238,27250,27256,27263-27264,27268,27277-27278,27280,27287,27292,27296,27298-27299,27306 -chars=27308,27310,27315,27320,27323,27329-27331,27345,27347,27354-27355,27358-27359,27368,27370,27386 -chars=27387,27396-27397,27402,27410,27414,27421,27423-27425,27427,27431,27442,27447-27450,27453-27454 -chars=27459,27463,27465,27468,27470,27472,27475-27476,27481,27483,27487,27489-27492,27494,27497-27498 -chars=27503,27507-27508,27512-27513,27515,27519-27520,27523-27524,27526,27529-27531,27533,27541-27542 -chars=27544,27550,27556,27562-27563,27567,27569-27573,27575,27578-27580,27583-27584,27589-27590,27595 -chars=27597-27598,27602-27604,27608,27611,27615,27627-27628,27631,27635,27656,27663,27665,27667-27668 -chars=27671,27675,27683-27684,27700,27703-27704,27710,27712-27714,27726,27728,27733,27735,27738,27741 -chars=27742-27744,27746,27752,27754,27760,27762-27763,27770,27773-27774,27777-27779,27784,27788-27789 -chars=27792,27794-27795,27798,27801-27803,27809-27810,27819,27822,27825,27827,27832-27839,27841,27844 -chars=27845,27849-27850,27852,27859,27861,27863,27865,27867,27869,27873-27875,27877,27880,27882,27887 -chars=27888-27889,27891,27915,27922,27927,27934,27941,27946,27963,27966,27969,27972-27973,27996,28006 -chars=28009-28010,28014,28020,28023-28024,28040,28057,28079,28082,28092,28096,28129,28145,28147,28151 -chars=28155,28165,28167-28169,28171,28187,28193,28198,28201,28204,28207,28246,28248,28263,28271,28286 -chars=28287-28288,28304,28310,28316-28317,28322,28342,28357,28363,28369,28381-28382,28402,28404,28417 -chars=28418,28431,28436,28448,28450,28459-28460,28500,28508,28511,28516,28526,28528,28548,28580,28608 -chars=28609,28611,28641,28655,28716,28779,28783-28784,28796-28797,28809-28810,28814,28818,28844-28845 -chars=28857-28858,28872,28954,28961,28966,28982,28988,29017,29031,29033,29038,29053,29066,29087,29105 -chars=29123,29157,29165,29173,29190,29226,29238,29242,29245,29255-29256,29273,29275,29282,29287,29289 -chars=29298,29305,29344,29356,29359,29366,29378,29401,29417,29420-29421,29436,29467,29471,29482-29483 -chars=29486,29494,29503,29508,29539,29554,29572,29575,29577,29579,29645,29664,29677,29694,29699,29702 -chars=29705,29730,29748,29790,29863,29872,29926,29942,29976,29983,29987,29992,30000-30003,30007,30010 -chars=30011,30028,30033,30041,30044,30053,30058,30064,30067,30079,30094,30097,30123,30130,30142,30149 -chars=30151,30169,30171,30185,30196,30202,30221,30274,30284,30290,30294,30330-30331,30333-30334,30340 -chars=30342-30343,30382,30394,30399,30406,30410,30423,30427,30431,30435-30436,30439,30446,30450,30452 -chars=30456,30462,30465,30473,30475-30476,30494-30496,30505,30522,30524,30528,30561,30563,30568,30609 -chars=30636,30643,30652,30683,30690,30693,30697,30701,30703,30707,30722,30740-30741,30770,30772,30813 -chars=30828,30849,30906,30913,30952,30990,31034,31036,31038,31048-31049,31062,31069-31070,31077,31080 -chars=31085,31105,31119,31168-31169,31179,31185-31186,31192,31199,31209,31216,31227,31232,31243,31246 -chars=31258,31278,31282,31292-31293,31295,31298,31309,31311,31339,31348,31350,31354,31361,31363,31379 -chars=31391,31406,31435,31452,31456,31461,31471,31478,31481,31499,31505,31515,31520,31526,31532,31545 -chars=31558,31560-31561,31563,31570,31572,31574,31623,31639,31649,31665,31672,31680,31684,31687,31689 -chars=31761,31777,31807,31821,31840,31859,31881,31883,31890,31896,31911,31934,31958,31966,31975,31992 -chars=31995,32000,32004-32005,32011,32013,32016,32020,32025-32027,32032,32034,32043,32047-32048,32051 -chars=32057-32058,32066,32068,32070,32076,32080,32094,32097,32102,32113,32117-32118,32121,32153-32154 -chars=32173,32177-32178,32180,32186-32187,32190-32191,32202,32207,32209-32210,32218,32224,32232-32233 -chars=32239,32244,32257,32260,32283,32294,32302,32318,32321,32330-32331,32340,32368,32566,32608,32618 -chars=32622,32624,32626,32645,32650,32654,32676,32680-32681,32701,32709,32716,32722,32724,32763-32764 -chars=32769,32771,32773,32784,32791,32819,32854,32862,32865,32884,32887,32905,32908,32918,32925,32929 -chars=32930,32933,32937-32938,32943,32946,32954,32963,32966,32972,32974,32990,32993,33016,33021,33026 -chars=33029-33032,33050,33073,33075,33104,33107,33109,33131,33136,33144-33146,33178,33180-33181,33192 -chars=33222,33235,33251,33256,33258,33261,33267-33268,33288,33292,33294,33296,33303,33307,33310-33311 -chars=33322,33324,33337,33351,33382,33391,33394,33398,33437,33446,33455,33457,33459,33464,33469,33495 -chars=33499,33509-33510,33521,33538,33540,33576,33590,33609,33618,33624,33655,33707,33733,33738,33740 -chars=33747,33756,33775,33777,33804,33853,33865,33879,33883,33891,33900,33945,33976,33980,33988,33995 -chars=34001,34030,34101,34109,34126,34180,34183,34196,34199,34214,34219-34220,34253,34276,34281,34299 -chars=34311,34349,34382,34384,34394,34411,34425,34442,34503,34509,34521,34678,34701,34811,34821,34880 -chars=34886,34892,34899,34903,34907,34909,34913,34915,34920,34928,34955,34966,34987,35009-35010,35013 -chars=35023,35029,35036,35064,35069-35070,35079,35090,35186,35199,35201,35206-35207,35211,35215,35222 -chars=35223,35226,35239,35242,35251,35282,35299,35302,35328,35330,35336,35338,35342,35347,35351-35352 -chars=35357,35359,35363,35370,35373,35377,35379-35380,35386,35388,35408,35413,35422,35430,35433,35435 -chars=35438,35440-35443,35463,35465,35468-35469,35475,35477,35480,35486,35488,35492,35500-35501,35504 -chars=35506,35519,35527,35531,35542,35558,35565-35566,35576,35582,35584,35598,35609,35611,35613,35617 -chars=35672,35676,35686,35696,35698,35703,35728,35895,35910,35914,35930,35937,35946,35980,35997-35998 -chars=36000-36002,36007-36009,36011-36012,36015-36016,36020,36022-36024,36027-36028,36031-36032,36035 -chars=36039,36042,36049,36059,36062,36064,36066,36074,36077,36092,36101,36104,36196,36198,36208,36212 -chars=36215,36229,36234,36259,36275,36317,36321,36335,36339,36341,36362,36367,36468,36487,36490,36493 -chars=36523,36554,36556-36557,36562,36575,36578,36600,36605,36611,36617,36628,36637,36649-36650,36664 -chars=36676,36763,36766,36784-36786,36794-36796,36799,36804-36805,36814,36817,36820,36843,36848,36855 -chars=36861,36864-36865,36867,36870,36879,36884,36889-36890,36893,36895-36896,36899,36910,36913-36914 -chars=36920,36930,36933,36935,36938-36939,36941-36942,36947-36949,36960-36961,36963,36965,36969,36973 -chars=36974,36981,36983-36984,36986,36989,36991,36996,37027,37030,37034,37048,37066,37070,37089,37096 -chars=37101,37109,37111,37117,37197-37198,37202,37204,37218,37228,37237,37239-37240,37266,37276,37284 -chars=37320,37324-37327,37329,37340-37341,37347,37351,37389,37428,37444,37474,37489,37504,37507,37509 -chars=37528,37549,37613,37628,37679,37682,37707,37723,37749,37772,37782,37806,37857,37912,37969,38263 -chars=38272,38275,38281,38283,38291,38306-38307,38309,38322,38343,38346,38360,38428,38442,38450,38459 -chars=38463-38464,38477,38480,38498-38501,38506,38512,38515,38518,38520,38522,38525,38533-38534,38538 -chars=38542-38543,38548,38553,38555-38556,38560,38563,38583,38588,38592,38596-38599,38609,38626-38627 -chars=38632,38634,38640,38642,38646-38647,38651,38656,38663,38666,38686,38695,38706,38738,38742,38745 -chars=38750,38754,38761,38772,38788,38867,38899,38907,38911,38913-38915,38917-38918,38920,38928-38929 -chars=38931,38936,38956-38957,38967,38971-38972,38988-38990,38996-38997,39000,39006,39015,39080,39082 -chars=39131,39135,39138,39151,39154,39156,39164-39166,39171,39173,39178,39180,39208,39318,39321,39340 -chars=39348,39364-39366,39376,39378,39423,39438,39442-39443,39449,39472,39514,39592,39608,39640,39658 -chars=39661,39706,39729,39740,39745-39746,39749,39764,39770,39791,39854,39881,40165,40169,40180,40335 -chars=40372,40441,40474-40475,40478,40565,40568-40569,40573,40575,40577,40584,40587-40588,40593-40595 -chars=40597,40599,40605,40607,40613-40614,40617-40618,40621,40632-40636,40638-40639,40644,40652-40656 -chars=40658,40660,40664-40665,40667-40670,40672,40677,40680,40687,40692,40694-40695,40697,40699-40701 -chars=40711-40712,40718,40723,40725,40736-40737,40748,40763,40766,40778-40779,40782-40783,40786,40788 -chars=40799-40803,40806-40807,40810,40812,40818,40822-40823,40845,40853,40860-40861,40864,65281,65283 -chars=65284-65286,65288-65374,65377-65439,65504-65507,65509 - -# imported icon images diff --git a/src/builtin/builtin_font.fnt b/src/builtin/builtin_font.fnt deleted file mode 100644 index 3986e9c134c0490f813c5ebf5175afe00acf7079..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92105 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�L4)UFleO8XJ~9 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 P4zEqle}K)A&r<&nuaHJ^ diff --git a/src/builtin/builtin_font_0.png b/src/builtin/builtin_font_0.png deleted file mode 100644 index 6e588e345e64def3b58b74b85bad48316abda29e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31135 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 Fu5DcB&rR^>{@6aman3BC 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 diff --git a/src/builtin/gamecontrollerdb.txt b/src/builtin/gamecontrollerdb.txt deleted file mode 100644 index fe21dd6..0000000 --- a/src/builtin/gamecontrollerdb.txt +++ /dev/null @@ -1,1741 +0,0 @@ -# Game Controller DB for SDL in 2.0.16 format -# Source: https://github.com/gabomdq/SDL_GameControllerDB - -# Windows -03000000300f00000a01000000000000,3 In 1 Conversion Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows, -03000000fa2d00000100000000000000,3dRudder Foot Motion Controller,leftx:a0,lefty:a1,rightx:a5,righty:a2,platform:Windows, -03000000d0160000040d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, -03000000d0160000050d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, -03000000d0160000060d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, -03000000d0160000070d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, -03000000d0160000600a000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, -03000000c82d00000031000000000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000531000000000000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000951000000000000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows, -03000000008000000210000000000000,8BitDo F30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -030000003512000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000c82d00001028000000000000,8BitDo F30 Arcade Joystick,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000801000000900000000000000,8BitDo F30 Arcade Stick,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00001151000000000000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000151000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00005106000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,guide:b2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000451000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows, -03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00008010000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d0000e002000000000000,8BitDo N30,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b6,platform:Windows, -03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000290000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows, -03000000c82d00003038000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows, -030000003512000012ab000000000000,8BitDo NES30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Windows, -03000000c82d000012ab000000000000,8BitDo NES30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -03000000022000000090000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000203800000900000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00002038000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000751000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000851000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000360000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000361000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000660000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000131000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000231000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000331000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000431000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00002867000000000000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b10,x:b3,y:b4,platform:Windows, -03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000060000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000061000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, -03000000102800000900000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d000021ab000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00003028000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -030000003512000020ab000000000000,8BitDo SN30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000351000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a2,rightshoulder:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00004028000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00006228000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000021000000000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000121000000000000,8BitDo SN30 Pro for Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000260000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000261000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, -03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, -030000008f0e00001200000000000000,Acme GA02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, -03000000c01100000355000000000000,Acrux,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000fa190000f0ff000000000000,Acteck AGJ 3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000d1180000402c000000000000,ADT1,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a3,rightx:a2,righty:a5,x:b3,y:b4,platform:Windows, -03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00001401000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00001402000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00001901000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00001a01000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00001301000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000006f0e00001302000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000006f0e00001304000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000006f0e00001413000000000000,Afterglow Xbox Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00003901000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000ab1200000103000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000ad1b000000f9000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000100000008200000000000000,Akishop Customs PS360,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000007c1800000006000000000000,Alienware Dual Compatible PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, -03000000491900001904000000000000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, -03000000710100001904000000000000,Amazon Luna Controller,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b8,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b4,rightstick:b7,rightx:a3,righty:a4,start:b6,x:b3,y:b2,platform:Windows, -03000000830500000160000000000000,Arcade,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b4,platform:Windows, -03000000120c0000100e000000000000,Armor 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000490b00004406000000000000,ASCII Seamic Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, -03000000869800002500000000000000,Astro C40 TR PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000a30c00002700000000000000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, -03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, -03000000e4150000103f000000000000,Batarang,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000d6200000e557000000000000,Batarang PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows, -030000006f0e00003201000000000000,Battlefield 4 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000ad1b000001f9000000000000,BB 070,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000bc2000005250000000000000,Beitong G3,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a3,righty:a4,start:b15,x:b3,y:b4,platform:Windows, -030000000d0500000208000000000000,Belkin Nostromo N40,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, -03000000bc2000006012000000000000,Betop 2126F,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000bc2000000055000000000000,Betop BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000bc2000006312000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000bc2000006321000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000bc2000006412000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000c01100000555000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000c01100000655000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000790000000700000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, -03000000808300000300000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, -030000006f0e00006401000000000000,BF One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, -03000000300f00000202000000000000,Bigben,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a5,righty:a2,start:b7,x:b2,y:b3,platform:Windows, -030000006b1400000209000000000000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006b1400000055000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, -03000000120c0000200e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000210e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000f10e000000000000,Brook PS2 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000310c000000000000,Brook Super Converter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, -03000000d81d00000b00000000000000,Buffalo BSGP1601 Series,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows, -030000005b1c00002400000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, -030000005b1c00002500000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, -030000006d04000042c2000000000000,ChillStream,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000e82000006058000000000000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000457500000401000000000000,Cobra,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000b0400003365000000000000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, -030000004c050000c505000000000000,CronusMax Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000d814000007cd000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000d8140000cefa000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000260900008888000000000000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a4,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Windows, -030000003807000002cb000000000000,Cyborg,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000a306000022f6000000000000,Cyborg V.3 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000f806000000a3000000000000,DA Leader,a:b7,b:b6,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b8,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:b3,rightx:a2,righty:a3,start:b12,x:b4,y:b5,platform:Windows, -030000001a1c00000001000000000000,Datel Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000451300000830000000000000,Defender Game Racer X7,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000791d00000103000000000000,Dual Box Wii,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000c0160000e105000000000000,Dual Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -030000004f040000070f000000000000,Dual Power,a:b8,b:b9,back:b4,dpdown:b1,dpleft:b2,dpright:b3,dpup:b0,leftshoulder:b13,leftstick:b6,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b12,rightstick:b7,righttrigger:b15,start:b5,x:b10,y:b11,platform:Windows, -030000004f04000012b3000000000000,Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, -030000004f04000020b3000000000000,Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, -03000000bd12000002e0000000000000,Dual Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows, -03000000ff1100003133000000000000,DualForce,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b1,platform:Windows, -030000008f0e00000910000000000000,DualShock 2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows, -03000000317300000100000000000000,DualShock 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -030000006f0e00003001000000000000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000fc0400000250000000000000,Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, -030000006e0500000a20000000000000,Elecom DUX60 MMO,a:b2,b:b3,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b14,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b15,righttrigger:b13,rightx:a3,righty:a4,start:b20,x:b0,y:b1,platform:Windows, -03000000b80500000410000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, -03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, -030000006e0500000520000000000000,Elecom P301U PlayStation Controller Adapter,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, -03000000411200004450000000000000,Elecom U1012,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, -030000006e0500000320000000000000,Elecom U3613M,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, -030000006e0500000e20000000000000,Elecom U3912T,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, -030000006e0500000f20000000000000,Elecom U4013S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, -030000006e0500001320000000000000,Elecom U4113,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006e0500001020000000000000,Elecom U4113S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, -030000006e0500000720000000000000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, -030000007d0400000640000000000000,Eliminator AfterShock,a:b1,b:b2,back:b9,dpdown:+a3,dpleft:-a5,dpright:+a5,dpup:-a3,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a4,righty:a2,start:b8,x:b0,y:b3,platform:Windows, -03000000120c0000f61c000000000000,Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000430b00000300000000000000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000242f000000b7000000000000,ESM 9110,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows, -03000000101c0000181c000000000000,Essential,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b4,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, -03000000341a00000108000000000000,EXEQ RF Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -030000006f0e00008401000000000000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00008001000000000000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000021000000090000000000000,FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -0300000011040000c600000000000000,FC801,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, -03000000852100000201000000000000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000ad1b000028f0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000ad1b00002ef0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000ad1b000038f0000000000000,Fightpad TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, -03000000f806000001a3000000000000,Firestorm,a:b9,b:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b10,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b12,x:b8,y:b4,platform:Windows, -03000000b50700000399000000000000,Firestorm 2,a:b2,b:b4,back:b10,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,righttrigger:b9,start:b11,x:b3,y:b5,platform:Windows, -03000000b50700001302000000000000,Firestorm D3,a:b0,b:b2,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,x:b1,y:b3,platform:Windows, -03000000b40400001024000000000000,Flydigi Apex,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -03000000151900004000000000000000,Flydigi Vader 2,a:b11,b:b10,back:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,leftstick:b1,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b0,righttrigger:b4,rightx:a3,righty:a4,start:b2,x:b9,y:b8,platform:Windows, -03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b4,paddle2:b5,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Windows, -03000000b40400001224000000000000,Flydigi Vader 2 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,paddle3:b17,paddle4:b18,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, -030000008305000000a0000000000000,G08XU,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b5,x:b2,y:b3,platform:Windows, -0300000066f700000100000000000000,Game VIB Joystick,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, -03000000260900002625000000000000,GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Windows, -03000000341a000005f7000000000000,GameCube Controller,a:b2,b:b3,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b1,y:b0,platform:Windows, -03000000430b00000500000000000000,GameCube Controller,a:b0,b:b2,dpdown:b10,dpleft:b8,dpright:b9,dpup:b11,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a3,rightx:a5,righty:a2,start:b7,x:b1,y:b3,platform:Windows, -03000000790000004718000000000000,GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, -03000000790000004618000000000000,GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, -030000008f0e00000d31000000000000,Gamepad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000ac0500003d03000000000000,GameSir G3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000ac0500005b05000000000000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000ac0500002d02000000000000,GameSir G4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -03000000ac0500004d04000000000000,GameSir G4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -030000004c0e00001035000000000000,Gamester,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -030000000d0f00001110000000000000,GameStick Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -0300000047530000616d000000000000,GameStop,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000b62500000100000000000000,Gametel GT004 01,a:b3,b:b0,dpdown:b10,dpleft:b9,dpright:b8,dpup:b11,leftshoulder:b4,rightshoulder:b5,start:b7,x:b1,y:b2,platform:Windows, -030000008f0e00001411000000000000,Gamo2 Divaller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000a857000000000000,Gator Claw,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000c9110000f055000000000000,GC100XF,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -030000008305000009a0000000000000,Genius,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -030000008305000031b0000000000000,Genius Maxfire Blaze 3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000451300000010000000000000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -030000005c1a00003330000000000000,Genius MaxFire Grandias 12V,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, -03000000300f00000b01000000000000,GGE909 Recoil,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000f0250000c283000000000000,Gioteck PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000f0250000c383000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000f0250000c483000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -030000004f04000026b3000000000000,GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -0300000079000000d418000000000000,GPD Win,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000c6240000025b000000000000,GPX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000007d0400000840000000000000,Gravis Destroyer Tilt,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,x:b0,y:b3,platform:Windows, -030000007d0400000540000000000000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -03000000280400000140000000000000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a3,dpup:-a4,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000008f0e00000610000000000000,GreenAsia,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a5,righty:a2,start:b11,x:b3,y:b0,platform:Windows, -03000000ac0500006b05000000000000,GT2a,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -03000000341a00000302000000000000,Hama Scorpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00004900000000000000,Hatsune Miku Sho PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000001008000001e1000000000000,Havit HV G60,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows, -030000000d0f00000c00000000000000,HEXT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000d81400000862000000000000,HitBox Edition Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, -03000000632500002605000000000000,HJD X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -030000000d0f00000a00000000000000,Hori DOA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000000d0f00008500000000000000,Hori Fighting Commander 2016 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00002500000000000000,Hori Fighting Commander 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00002d00000000000000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008400000000000000,Hori Fighting Commander 5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00005100000000000000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008600000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000000d0f0000ba00000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000000d0f00008800000000000000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, -030000000d0f00008700000000000000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00001000000000000000,Hori Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00003200000000000000,Hori Fightstick 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f0000c000000000000000,Hori Fightstick 4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000000d0f00000d00000000000000,Hori Fightstick EX2,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -030000000d0f00003701000000000000,Hori Fightstick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Windows, -030000000d0f00004000000000000000,Hori Fightstick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00002100000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00002700000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f0000a000000000000000,Hori Grip TAC4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b13,x:b0,y:b3,platform:Windows, -030000000d0f0000a500000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f0000a600000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00000101000000000000,Hori Mini Hatsune Miku FT,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00005400000000000000,Hori Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00004d00000000000000,Hori Pad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00003801000000000000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Windows, -030000000d0f00009200000000000000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00002301000000000000,Hori PS4 Controller Light,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -030000000d0f00001100000000000000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00002600000000000000,Hori Real Arcade Pro 3P,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00004b00000000000000,Hori Real Arcade Pro 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00006a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00006b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00006f00000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00007000000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00003d00000000000000,Hori Real Arcade Pro N3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b4,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b6,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f0000ae00000000000000,Hori Real Arcade Pro N4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000000d0f00008c00000000000000,Hori Real Arcade Pro P4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000000d0f0000aa00000000000000,Hori Real Arcade Pro S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f0000d800000000000000,Hori Real Arcade Pro S,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows, -030000000d0f00002200000000000000,Hori Real Arcade Pro V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00005b00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00005c00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f0000af00000000000000,Hori Real Arcade Pro VHS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00001b00000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000ad1b000002f5000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b07,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b08,righttrigger:b11,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Windows, -030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f0000c900000000000000,Hori Taiko Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f0000c100000000000000,Horipad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00006400000000000000,Horipad 3TP,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00001300000000000000,Horipad 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00006e00000000000000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00006600000000000000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00004200000000000000,Horipad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000ad1b000001f5000000000000,Horipad EXT2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000000d0f0000ee00000000000000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00006700000000000000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000000d0f0000dc00000000000000,Horipad Switch,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000008f0e00001330000000000000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Windows, -03000000790000004e95000000000000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Windows, -03000000d81d00000e00000000000000,iBuffalo AC02 Arcade Joystick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows, -03000000d81d00000f00000000000000,iBuffalo BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000d81d00001000000000000000,iBuffalo BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -030000005c0a00000285000000000000,iDroidCon,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b6,platform:Windows, -03000000696400006964000000000000,iDroidCon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000b50700001403000000000000,Impact Black,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -030000006f0e00002401000000000000,Injustice Fightstick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -03000000830500005130000000000000,InterAct ActionPad,a:b0,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, -03000000ef0500000300000000000000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, -03000000fd0500000230000000000000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows, -03000000fd0500000030000000000000,Interact GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Windows, -03000000fd0500003902000000000000,InterAct Hammerhead,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b2,lefttrigger:b8,rightshoulder:b7,rightstick:b5,righttrigger:b9,start:b10,x:b0,y:b1,platform:Windows, -03000000fd0500002a26000000000000,InterAct Hammerhead FX,a:b3,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows, -03000000fd0500002f26000000000000,InterAct Hammerhead FX,a:b4,b:b5,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b1,y:b2,platform:Windows, -03000000fd0500005302000000000000,InterAct ProPad,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Windows, -03000000ac0500002c02000000000000,Ipega Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000491900000204000000000000,Ipega PG9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000491900000304000000000000,Ipega PG9087,+righty:+a5,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows, -030000007e0500000620000000000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows, -030000007e0500000720000000000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, -03000000250900000017000000000000,Joypad Adapter,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,platform:Windows, -03000000bd12000003c0000000000000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000ff1100004033000000000000,JPD FFB,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a2,start:b15,x:b3,y:b0,platform:Windows, -03000000242f00002d00000000000000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000242f00008a00000000000000,JYS Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, -03000000c4100000c082000000000000,KADE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000828200000180000000000000,Keio,a:b4,b:b5,back:b8,leftshoulder:b2,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b1,platform:Windows, -03000000790000000200000000000000,King PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, -03000000bd12000001e0000000000000,Leadership,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -030000006f0e00000103000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000006f0e00000104000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000008f0e00001300000000000000,Logic3,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -030000006d040000d1ca000000000000,Logitech ChillStream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006d040000d2ca000000000000,Logitech Cordless Precision,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006d04000011c2000000000000,Logitech Cordless Wingman,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b2,righttrigger:b7,rightx:a3,righty:a4,x:b4,platform:Windows, -030000006d04000016c2000000000000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006d0400001dc2000000000000,Logitech F310,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000006d04000018c2000000000000,Logitech F510,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006d0400001ec2000000000000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000006d04000019c2000000000000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000006d0400001ac2000000000000,Logitech Precision,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000006d04000009c2000000000000,Logitech WingMan,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, -030000006d0400000bc2000000000000,Logitech WingMan Action Pad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:a5~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:a2~,start:b8,x:b3,y:b4,platform:Windows, -030000006d0400000ac2000000000000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows, -03000000380700005645000000000000,Lynx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000222200006000000000000000,Macally,a:b1,b:b2,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700003888000000000000,Mad Catz Arcade Fightstick TE S Plus PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008532000000000000,Mad Catz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700006352000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000380700006652000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000380700005032000000000000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700005082000000000000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008031000000000000,Mad Catz FightStick Alpha PS3 ,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000003807000038b7000000000000,Mad Catz Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, -03000000380700008433000000000000,Mad Catz Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008483000000000000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008134000000000000,Mad Catz Fightstick TE2 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008184000000000000,Mad Catz Fightstick TE2 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000380700006252000000000000,Mad Catz Micro CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008232000000000000,Mad Catz PlayStation Brawlpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008731000000000000,Mad Catz PlayStation Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000003807000056a8000000000000,Mad Catz PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700001888000000000000,Mad Catz SFIV Fightstick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000380700008081000000000000,Mad Catz SFV Arcade Fightstick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000380700001847000000000000,Mad Catz Street Fighter 4 Xbox 360 FightStick,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, -03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, -030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, -03000000790000003018000000000000,Mayflash F300 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -03000000242f00003900000000000000,Mayflash F300 Elite Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, -03000000790000004318000000000000,Mayflash GameCube Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, -03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, -0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000008f0e00001030000000000000,Mayflash Sega Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,platform:Windows, -0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, -03000000790000000318000000000000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, -03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000790000002418000000000000,Mega Drive Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b2,start:b9,x:b3,y:b4,platform:Windows, -0300000079000000ae18000000000000,Mega Drive Controller,a:b0,b:b1,back:b7,dpdown:b14,dpleft:b15,dpright:b13,dpup:b2,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, -03000000c0160000990a000000000000,Mega Drive Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,righttrigger:b2,start:b3,platform:Windows, -030000005e0400002800000000000000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Windows, -030000005e0400000300000000000000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, -030000005e0400000700000000000000,Microsoft SideWinder,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, -030000005e0400000e00000000000000,Microsoft SideWinder Freestyle Pro,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b8,x:b3,y:b4,platform:Windows, -030000005e0400002700000000000000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Windows, -03000000280d00000202000000000000,Miller Lite Cantroller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b5,x:b2,y:b3,platform:Windows, -03000000ad1b000023f0000000000000,MLG,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a6,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -03000000ad1b00003ef0000000000000,MLG Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, -03000000380700006382000000000000,MLG PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000ffff00000000000000000000,Mocute M053,a:b3,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b11,leftstick:b7,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b6,righttrigger:b4,rightx:a3,righty:a4,start:b8,x:b1,y:b0,platform:Windows, -03000000d6200000e589000000000000,Moga 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, -03000000d62000007162000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, -03000000d6200000ad0d000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000c62400002a89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000c62400002b89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000c62400001a89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000c62400001b89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000efbe0000edfe000000000000,Monect Virtual Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, -03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000091200004488000000000000,MUSIA PlayStation 2 Input Display,a:b0,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b7,righttrigger:b11,rightx:a2,righty:a3,start:b5,x:b1,y:b3,platform:Windows, -03000000f70600000100000000000000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Windows, -030000006b140000010c000000000000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -030000006b1400001106000000000000,Nacon Revolution 3 PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000006b140000100d000000000000,Nacon Revolution Infinity PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006b140000080d000000000000,Nacon Revolution Unlimited Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000bd12000001c0000000000000,Nebular,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000eb0300000000000000000000,NeGcon Adapter,a:a2,b:b13,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,lefttrigger:a4,leftx:a1,righttrigger:b11,start:b3,x:a3,y:b12,platform:Windows, -0300000038070000efbe000000000000,NEO SE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -0300000092120000474e000000000000,NeoGeo X Arcade Stick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b3,y:b2,platform:Windows, -03000000921200004b46000000000000,NES 2 port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows, -03000000000f00000100000000000000,NES Controller,a:b1,b:b0,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows, -03000000921200004346000000000000,NES Controller,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows, -03000000790000004518000000000000,NEXILUX GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, -030000001008000001e5000000000000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Windows, -03000000050b00000045000000000000,Nexus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Windows, -03000000152000000182000000000000,NGDS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, -030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -030000000d0500000308000000000000,Nostromo N45,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Windows, -030000007e0500001920000000000000,NSO N64 Controller,+rightx:b8,+righty:b2,-rightx:b3,-righty:b7,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Windows, -030000007e0500001720000000000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Windows, -03000000550900001472000000000000,NVIDIA Controller,a:b11,b:b10,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b5,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b4,righttrigger:a5,rightx:a3,righty:a6,start:b3,x:b9,y:b8,platform:Windows, -03000000550900001072000000000000,NVIDIA Shield,a:b9,b:b8,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b3,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b2,righttrigger:a4,rightx:a2,righty:a5,start:b0,x:b7,y:b6,platform:Windows, -030000005509000000b4000000000000,NVIDIA Virtual,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000120c00000288000000000000,Nyko Air Flo Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -030000004b120000014d000000000000,Nyko Airflo,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a3,leftstick:a0,lefttrigger:b6,rightshoulder:b5,rightstick:a2,righttrigger:b7,start:b9,x:b2,y:b3,platform:Windows, -03000000d62000001d57000000000000,Nyko Airflo PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000791d00000900000000000000,Nyko Playpad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -03000000782300000a10000000000000,Onlive Controller,a:b15,b:b14,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b11,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b13,y:b12,platform:Windows, -030000000d0f00000401000000000000,Onyx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000008916000001fd000000000000,Onza CE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a3,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000008916000000fd000000000000,Onza TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000d62000006d57000000000000,OPP PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006b14000001a1000000000000,Orange Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, -03000000362800000100000000000000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,x:b1,y:b2,platform:Windows, -03000000120c0000f60e000000000000,P4 Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, -03000000790000002201000000000000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -030000006f0e00008501000000000000,PDP Fightpad Pro,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b0,platform:Windows, -030000006f0e00000901000000000000,PDP Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -03000000e30500009605000000000000,PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -030000004c050000da0c000000000000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, -03000000632500002306000000000000,PlayStation Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, -03000000f0250000c183000000000000,PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000d9040000160f000000000000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -030000004c0500003713000000000000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -0300000062060000d570000000000000,PowerA PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000d620000013a7000000000000,PowerA Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006d04000084ca000000000000,Precision,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000c62400001a53000000000000,Pro Ex Mini,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000d62000009f31000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000d6200000c757000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000110e000000000000,Pro5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000100800000100000000000000,PS1 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -030000008f0e00007530000000000000,PS1 Controller,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b1,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000100800000300000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000250900000088000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000250900006888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b6,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000250900008888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000666600006706000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows, -030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000120a00000100000000000000,PS3 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -03000000120c00001307000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c00001cf1000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000f90e000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000250900000118000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000250900000218000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000250900000500000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows, -030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,platform:Windows, -030000004f1f00000800000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, -03000000888800000804000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,leftshoulder:b10,leftstick:b1,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows, -030000008f0e00000300000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, -030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000ba2200002010000000000000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Windows, -03000000120c00000807000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000111e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000121e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000130e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000150e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000180e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000181e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000191e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c00001e0e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000a957000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000aa57000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000f21c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000f31c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000f41c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000f51c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000f70e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000160e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000001a1e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, -030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, -03000000830500005020000000000000,PSX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Windows, -03000000300f00000111000000000000,Qanba 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000300f00000211000000000000,Qanba 2P,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000300f00000011000000000000,Qanba Arcade Stick 1008,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b10,x:b0,y:b3,platform:Windows, -03000000300f00001611000000000000,Qanba Arcade Stick 4018,a:b1,b:b2,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, -03000000222c00000025000000000000,Qanba Dragon Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000222c00000020000000000000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000300f00001211000000000000,Qanba Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000300f00001210000000000000,Qanba Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, -03000000341a00000104000000000000,Qanba Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows, -03000000222c00000223000000000000,Qanba Obsidian Arcade Stick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000222c00000023000000000000,Qanba Obsidian Arcade Stick PS4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000008a2400006682000000000000,R1 Mobile Controller,a:b3,b:b1,back:b7,leftx:a0,lefty:a1,start:b6,x:b4,y:b0,platform:Windows, -03000000086700006626000000000000,RadioShack,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, -03000000ff1100004733000000000000,Ramox FPS Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows, -030000009b2800002300000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows, -030000009b2800006900000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows, -030000009b2800000800000000000000,Raphnet Dreamcast Adapter,a:b2,b:b1,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,lefttrigger:a2,leftx:a0,righttrigger:a3,righty:a1,start:b3,x:b10,y:b9,platform:Windows, -030000009b2800003200000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, -030000009b2800006000000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, -030000009b2800001800000000000000,Raphnet Jaguar Adapter,a:b2,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b10,start:b3,x:b11,y:b12,platform:Windows, -030000009b2800000200000000000000,Raphnet NES Adapter,a:b7,b:b6,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b4,platform:Windows, -030000009b2800004400000000000000,Raphnet PS1 and PS2 Adapter,a:b1,b:b2,back:b5,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b9,rightx:a3,righty:a4,start:b4,x:b0,y:b3,platform:Windows, -030000009b2800004300000000000000,Raphnet Saturn,a:b0,b:b1,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, -030000009b2800000500000000000000,Raphnet Saturn Adapter 2.0,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, -030000009b2800000300000000000000,Raphnet SNES Adapter,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, -030000009b2800005600000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, -030000009b2800005700000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, -030000009b2800001e00000000000000,Raphnet Vectrex Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a1,lefty:a2,x:b2,y:b3,platform:Windows, -030000009b2800002b00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, -030000009b2800002c00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, -03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000321500000204000000000000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000321500000010000000000000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000321500000507000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000321500000707000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000321500000710000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000321500000a10000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000321500000410000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000321500000910000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000321500000011000000000000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000921200004547000000000000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b6,x:b3,y:b4,platform:Windows, -03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, -03000000830500006020000000000000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, -03000000bd12000013d0000000000000,Retrolink Sega Saturn Classic Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,lefttrigger:b6,rightshoulder:b2,righttrigger:b7,start:b8,x:b3,y:b4,platform:Windows, -03000000bd12000015d0000000000000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, -0300000000f000000300000000000000,RetroUSB RetroPad,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, -0300000000f00000f100000000000000,RetroUSB Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, -03000000830500000960000000000000,Revenger,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b5,platform:Windows, -030000006b140000010d000000000000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000006b140000020d000000000000,Revolution Pro Controller 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000006b140000130d000000000000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00001f01000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000006f0e00004601000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000c6240000fefa000000000000,Rock Candy Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00008701000000000000,Rock Candy Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000050b0000e318000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, -03000000050b0000e518000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, -03000000050b00005819000000000000,ROG Chakram Core,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, -03000000050b0000181a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, -03000000050b00001a1a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, -03000000050b00001c1a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, -030000004f04000001d0000000000000,Rumble Force,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, -030000008916000000fe000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000c6240000045d000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000a30600001af5000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000a306000023f6000000000000,Saitek Cyborg V.1 Game,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000300f00001201000000000000,Saitek Dual Analog,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -03000000a30600000701000000000000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Windows, -03000000a30600000cff000000000000,Saitek P2500 Force Rumble,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b0,y:b1,platform:Windows, -03000000a30600000d5f000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Windows, -03000000a30600000dff000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b8,x:b0,y:b3,platform:Windows, -03000000a30600000c04000000000000,Saitek P2900,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, -03000000a306000018f5000000000000,Saitek P3200,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000300f00001001000000000000,Saitek P480 Rumble,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -03000000a30600000901000000000000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b5,rightx:a3,righty:a2,x:b0,y:b1,platform:Windows, -03000000a30600000b04000000000000,Saitek P990,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, -03000000a30600002106000000000000,Saitek PS1000 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000a306000020f6000000000000,Saitek PS2700 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000300f00001101000000000000,Saitek Rumble,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -03000000e804000000a0000000000000,Samsung EIGP20,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000c01100000252000000000000,Sanwa Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, -03000000c01100004350000000000000,Sanwa Micro Grip P3,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,x:b3,y:b2,platform:Windows, -03000000411200004550000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a1,righty:a2,start:b9,x:b1,y:b3,platform:Windows, -03000000c01100004150000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, -03000000c01100004450000000000000,Sanwa Online Grip,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b11,righttrigger:b9,rightx:a3,righty:a2,start:b14,x:b3,y:b4,platform:Windows, -03000000730700000401000000000000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows, -03000000830500006120000000000000,Sanwa Smart Grip II,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,x:b1,y:b3,platform:Windows, -03000000c01100000051000000000000,Satechi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -030000004f04000028b3000000000000,Score A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000952e00002577000000000000,Scuf PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000a30c00002500000000000000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Windows, -03000000a30c00002400000000000000,Sega Mega Drive Mini 6B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, -0300000000050000289b000000000000,Sega Saturn Adapter,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, -0300000000f000000800000000000000,Sega Saturn Controller,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b7,righttrigger:b3,start:b0,x:b5,y:b6,platform:Windows, -03000000730700000601000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, -03000000b40400000a01000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, -030000003b07000004a1000000000000,SFX,a:b0,b:b2,back:b7,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Windows, -03000000f82100001900000000000000,Shogun Bros Chameleon X1,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000120c00001c1e000000000000,SnakeByte 4S PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -0300000003040000c197000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, -0300000081170000960a000000000000,SNES Controller,a:b4,b:b0,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b5,y:b1,platform:Windows, -03000000811700009d0a000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, -030000008b2800000300000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, -03000000921200004653000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, -03000000ff000000cb01000000000000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, -03000000341a00000208000000000000,Speedlink 6555,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:-a4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a3,righty:a2,start:b7,x:b2,y:b3,platform:Windows, -03000000341a00000908000000000000,Speedlink 6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000380700001722000000000000,Speedlink Competition Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,x:b2,y:b3,platform:Windows, -030000008f0e00000800000000000000,Speedlink Strike FX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000c01100000591000000000000,Speedlink Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000d11800000094000000000000,Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, -03000000de280000fc11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000de280000ff11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000120c0000160e000000000000,Steel Play Metaltech PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000381000001214000000000000,SteelSeries Free,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, -03000000110100003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000381000003014000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000381000003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000381000001814000000000000,SteelSeries Stratus XL,a:b0,b:b1,back:b18,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b19,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b2,y:b3,platform:Windows, -03000000790000001c18000000000000,STK 7024X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000380700003847000000000000,Street Fighter Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows, -030000001f08000001e4000000000000,Super Famicom Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, -03000000790000000418000000000000,Super Famicom Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, -03000000341200001300000000000000,Super Racer,a:b2,b:b3,back:b8,leftshoulder:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b7,x:b0,y:b1,platform:Windows, -03000000d620000011a7000000000000,Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f0000f600000000000000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000457500002211000000000000,Szmy Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000004f0400000ab1000000000000,T16000M,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b10,x:b2,y:b3,platform:Windows, -030000000d0f00007b00000000000000,TAC GEAR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000e40a00000207000000000000,Taito Egret II Mini Controller,a:b4,b:b2,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b9,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Windows, -03000000d814000001a0000000000000,TE Kitty,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000fa1900000706000000000000,Team 5,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000b50700001203000000000000,Techmobility X6-38V,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -03000000ba2200000701000000000000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b2,platform:Windows, -03000000c61100001000000000000000,Tencent Xianyou Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows, -03000000790000002601000000000000,TGZ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, -030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, -030000004f04000023b3000000000000,Thrustmaster Dual Trigger PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000004f0400000ed0000000000000,ThrustMaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000004f04000008d0000000000000,ThrustMaster Ferrari 150 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Windows, -030000004f04000004b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, -030000004f04000003d0000000000000,ThrustMaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000004f04000009d0000000000000,ThrustMaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006d04000088ca000000000000,Thunderpad,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -03000000666600000488000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -030000004f04000007d0000000000000,TMini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000571d00002100000000000000,Tomee NES Controller Adapter,a:b1,b:b0,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,start:b3,platform:Windows, -03000000571d00002000000000000000,Tomee SNES Controller Adapter,a:b0,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, -03000000d62000006000000000000000,Tournament PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000c01100000055000000000000,Tronsmart,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -030000005f140000c501000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000b80500000210000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -030000004f04000087b6000000000000,TWCS Throttle,dpdown:b8,dpleft:b9,dpright:b7,dpup:b6,leftstick:b5,lefttrigger:-a5,leftx:a0,lefty:a1,righttrigger:+a5,platform:Windows, -03000000411200000450000000000000,Twin Shock,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows, -03000000d90400000200000000000000,TwinShock PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000151900005678000000000000,Uniplay U6,a:b0,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b10,x:b3,y:b4,platform:Windows, -03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -030000000b0400003065000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, -03000000242f00006e00000000000000,USB Controller,a:b1,b:b4,back:b10,leftshoulder:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b3,platform:Windows, -03000000300f00000701000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000341a00002308000000000000,USB Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000666600000188000000000000,USB Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000666600000288000000000000,USB Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -030000006b1400000203000000000000,USB Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000790000000a00000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, -03000000b404000081c6000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, -03000000b50700001503000000000000,USB Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -03000000bd12000012d0000000000000,USB Controller,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, -03000000ff1100004133000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000632500002305000000000000,USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000790000001a18000000000000,Venom,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000790000001b18000000000000,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00000302000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00000702000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -0300000034120000adbe000000000000,vJoy Device,a:b0,b:b1,back:b15,dpdown:b6,dpleft:b7,dpright:b8,dpup:b5,guide:b16,leftshoulder:b9,leftstick:b13,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b14,righttrigger:b12,rightx:a3,righty:a4,start:b4,x:b2,y:b3,platform:Windows, -03000000120c0000ab57000000000000,Warrior Joypad JS083,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000007e0500003003000000000000,Wii U Pro,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b6,leftstick:b11,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b12,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, -0300000032150000030a000000000000,Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -0300000032150000140a000000000000,Wolverine,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000002e160000efbe000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows, -03000000380700001647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000380700002045000000000000,Xbox 360 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000380700002644000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a5,start:b8,x:b2,y:b3,platform:Windows, -03000000380700002647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000003807000026b7000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000380700003647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a7,righty:a5,start:b7,x:b2,y:b3,platform:Windows, -030000005e0400001907000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e0400009102000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000ad1b000000fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000ad1b000001fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000ad1b000016f0000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000ad1b00008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000c62400000053000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000c6240000fdfa000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000380700002847000000000000,Xbox 360 Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e040000a102000000000000,Xbox 360 Wireless Receiver,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000120c00000a88000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -03000000120c00001088000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2~,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5~,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000002a0600002000000000000000,Xbox Controller,a:b0,b:b1,back:b13,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b5,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b15,righttrigger:b7,rightx:a2,righty:a5,start:b12,x:b2,y:b3,platform:Windows, -03000000300f00008888000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:b13,dpleft:b10,dpright:b11,dpup:b12,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -03000000380700001645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -03000000380700002645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000380700003645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -03000000380700008645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e0400000202000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -030000005e0400008502000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e0400008702000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -030000005e0400008902000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b8,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b9,righttrigger:b4,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, -030000000d0f00006300000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e0400000c0b000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e040000fd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e040000ff02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000006f0e0000a802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000006f0e0000c802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000c62400003a54000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000005e040000130b000000000000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000450c00002043000000000000,Xeox SL6556BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -030000006f0e00000300000000000000,XGear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000172700004431000000000000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -03000000786901006e70000000000000,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000007d0400000340000000000000,Xterminator Digital Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:-a4,lefttrigger:+a4,leftx:a0,lefty:a1,paddle1:b7,paddle2:b6,rightshoulder:b5,rightstick:b9,righttrigger:b2,rightx:a3,righty:a5,start:b8,x:b3,y:b4,platform:Windows, -03000000790000004f18000000000000,ZDT Android Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000120c0000101e000000000000,Zeroplus P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, - -# Mac OS X -030000008f0e00000300000009010000,2 In 1 Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000c82d00000031000001000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000c82d00000531000000020000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X, -03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00001151000000020000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000a30c00002400000006020000,8BitDo M30,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,guide:b9,leftshoulder:b6,lefttrigger:b5,rightshoulder:b4,righttrigger:b7,start:b8,x:b3,y:b0,platform:Mac OS X, -03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000c82d00005106000000010000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,lefttrigger:a5,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X, -03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -030000003512000012ab000001000000,8BitDo NES30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d000012ab000001000000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000c82d00002028000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000022000000090000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000190000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000660000000020000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000131000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000231000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000331000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000431000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Mac OS X, -03000000102800000900000000000000,8BitDo SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00001290000001000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00004028000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000260000001000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000a00500003232000009010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a31,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000491900001904000001010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Mac OS X, -03000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, -03000000a30c00002700000003030000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000a30c00002800000003030000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, -03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, -03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000120c0000200e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000120c0000210e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000008305000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000d8140000cecf000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X, -03000000a306000022f6000001030000,Cyborg V3 Rumble Pad PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000791d00000103000009010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, -030000006e0500000720000010020000,Elecom JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Mac OS X, -030000006f0e00008401000003010000,Faceoff Premiere Wired Pro Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, -03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b4,paddle2:b5,paddle3:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Mac OS X, -03000000790000004618000000010000,GameCube Controller Adapter,a:b4,b:b0,dpdown:b56,dpleft:b60,dpright:b52,dpup:b48,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X, -03000000ad1b000001f9000000000000,Gamestop BB070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, -03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000006f0e00000102000000000000,GameStop Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000007d0400000540000001010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000280400000140000000020000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, -030000008f0e00000300000007010000,GreenAsia Joystick,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Mac OS X, -030000000d0f00002d00000000100000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00005f00000000010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00008400000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00008500000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00008800000000010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00008700000000010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00003801000008010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Mac OS X, -030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00006e00000000010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00006600000000000000,Horipad FPS Plus 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f0000ee00000000010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000008f0e00001330000011010000,HuiJia SNES Controller,a:b4,b:b2,back:b16,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b12,rightshoulder:b14,start:b18,x:b6,y:b0,platform:Mac OS X, -03000000790000004e95000000010000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Mac OS X, -03000000830500006020000000000000,iBuffalo Gamepad,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X, -03000000ef0500000300000000020000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Mac OS X, -03000000fd0500000030000010010000,Interact GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Mac OS X, -030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Mac OS X, -030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Mac OS X, -03000000242f00002d00000007010000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, -030000006d04000019c2000000000000,Logitech Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000006d04000016c2000000020000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000006d04000016c2000000030000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000006d04000016c2000014040000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000006d04000016c2000000000000,Logitech F310,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000006d04000018c2000000000000,Logitech F510,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000006d04000019c2000005030000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000006d04000018c2000000010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000380700005032000000010000,Mad Catz PS3 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000380700008433000000010000,Mad Catz PS3 Fightstick TE S+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000380700005082000000010000,Mad Catz PS4 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000790000000600000007010000,Marvo GT-004,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000790000004318000000010000,Mayflash GameCube Adapter,a:b4,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X, -03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X, -0300000079000000d218000026010000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000d620000010a7000003010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X, -03000000790000000318000000010000,Mayflash Wii DolphinBar,a:b8,b:b12,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b44,leftshoulder:b16,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b4,platform:Mac OS X, -03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, -03000000790000000018000000010000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, -030000005e0400002800000002010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Mac OS X, -030000005e0400002700000001010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Mac OS X, -03000000d62000007162000001000000,Moga Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, -03000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000c62400002b89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000632500007505000000020000,NeoGeo mini PAD Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Mac OS X, -03000000921200004b46000003020000,NES 2-port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Mac OS X, -030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000d620000011a7000000020000,Nintendo Switch Core Plus Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000d620000011a7000010050000,Nintendo Switch PowerA Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, -030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, -030000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Mac OS X, -030000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Mac OS X, -03000000550900001472000025050000,NVIDIA Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Mac OS X, -030000006f0e00000901000002010000,PDP Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, -030000008f0e00000300000000000000,Piranha Xtreme PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X, -030000004c050000da0c000000010000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, -030000004c0500003713000000010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000100800000300000006010000,PS2 Adapter,a:b2,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, -030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, -030000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, -030000004c0500006802000072050000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, -030000004c050000a00b000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, -03000000222c00000225000000010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000222c00000020000000010000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -03000000321500000204000000010000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000321500000104000000010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000321500000010000000010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000321500000507000001010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000321500000011000000010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, -030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, -0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -03000000632500008005000000010000,Redgear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, -030000000d0f0000c100000072050000,Retro Bit Sega Genesis 6B Controller,a:b2,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b8,rightshoulder:b6,righttrigger:b7,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000921200004547000000020000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b2,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,lefttrigger:b14,rightshoulder:b10,righttrigger:b4,start:b12,x:b6,y:b8,platform:Mac OS X, -03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000790000001100000005010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000830500006020000000010000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Mac OS X, -03000000790000001100000006010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, -030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000c6240000fefa000000000000,Rock Candy PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Mac OS X, -03000000a30c00002500000006020000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Mac OS X, -03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X, -03000000b40400000a01000000000000,Sega Saturn,a:b0,b:b1,back:b5,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X, -030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, -0300000000f00000f100000000000000,SNES RetroPort,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,rightshoulder:b7,start:b6,x:b0,y:b1,platform:Mac OS X, -030000004c050000a00b000000000000,Sony DualShock 4 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, -030000005e0400008e02000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -03000000110100002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, -03000000110100002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, -03000000381000002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, -05000000484944204465766963650000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, -050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, -050000004e696d6275732b008b000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, -05000000556e6b6e6f776e2048494400,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, -03000000381000003014000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -03000000381000003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -03000000110100001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, -03000000110100001714000020010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, -030000000d0f0000f600000000010000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, -03000000457500002211000000010000,SZMY Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X, -030000004f0400000ed0000000020000,ThrustMaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X, -03000000571d00002100000021000000,Tomee NES Controller Adapter,a:b1,b:b0,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,start:b3,platform:Mac OS X, -03000000bd12000015d0000000010000,Tomee Retro Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000bd12000015d0000000000000,Tomee SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000571d00002000000021000000,Tomee SNES Controller Adapter,a:b0,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X, -030000005f140000c501000000020000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, -030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, -030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, -050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, -050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X, -030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000006f0e00000104000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -03000000c6240000045d000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000005e040000050b000003090000,Xbox Elite Controller Series 2,a:b0,b:b1,back:b31,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b53,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -030000005e040000130b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -030000005e040000200b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, -030000005e040000e002000003090000,Xbox One Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000005e040000fd02000003090000,Xbox One Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000c62400003a54000000000000,Xbox One PowerA Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -030000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X, -03000000120c0000100e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000120c0000101e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, - -# Linux -030000005e0400008e02000020010000,8BitDo Adapter,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000c82d00000031000011010000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux, -03000000021000000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00001151000011010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Linux, -05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux, -03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux, -03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000008000000210000011010000,8BitDo NES30,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, -05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, -03000000022000000090000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000190000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00002038000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -05000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000431000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Linux, -05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00000061000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -030000003512000012ab000010010000,8BitDo SFC30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux, -030000003512000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, -05000000102800000900000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00003028000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000260000011010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, -05000000a00500003232000001000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, -05000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, -03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, -050000005e040000e002000030110000,8BitDo Zero 2,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, -05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c01100000355000011010000,Acrux Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00003901000013020000,Afterglow Prismatic Controller 048-007-NA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00001302000000010000,Afterglow Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00003901000020060000,Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000100000008200000011010000,Akishop Customs PS360,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -030000007c1800000006000010010000,Alienware Dual Compatible Game PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Linux, -05000000491900000204000021000000,Amazon Fire Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b17,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000491900001904000011010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux, -05000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, -03000000790000003018000011010000,Arcade Fightstick F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -03000000a30c00002700000011010000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, -03000000a30c00002800000011010000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, -05000000050b00000045000031000000,Asus Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, -05000000050b00000045000040000000,Asus Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, -03000000503200000110000000000000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -03000000503200000110000011010000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -05000000503200000110000000000000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -05000000503200000110000044010000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -05000000503200000110000046010000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -03000000503200000210000000000000,Atari Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux, -03000000503200000210000011010000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, -05000000503200000210000000000000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, -05000000503200000210000045010000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, -05000000503200000210000046010000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, -05000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:-a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux, -03000000c62400001b89000011010000,BDA MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000c21100000791000011010000,Be1 GC101 Controller 1.03,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000c31100000791000011010000,Be1 GC101 Controller 1.03,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -030000005e0400008e02000003030000,Be1 GC101 Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -05000000bc2000000055000001000000,BETOP AX1 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000bc2000006412000011010000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b30,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -030000006b1400000209000011010000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000666600006706000000010000,Boom PSX to PC Converter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux, -03000000120c0000200e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000120c0000210e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000120c0000f70e000011010000,Brook Universal Fighting Board,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -030000000b0400003365000000010000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Linux, -03000000260900008888000000010000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Linux, -03000000a306000022f6000011010000,Cyborg V3 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, -03000000791d00000103000010010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000c11100000191000011010000,EasySMX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000242f00009100000000010000,EasySMX ESM-9101,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006e0500000320000010010000,Elecom U3613M,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux, -030000006e0500000720000010010000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux, -030000007d0400000640000010010000,Eliminator AfterShock,a:b1,b:b2,back:b9,dpdown:+a3,dpleft:-a5,dpright:+a5,dpup:-a3,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a4,righty:a2,start:b8,x:b0,y:b3,platform:Linux, -03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -03000000ac0500005b05000010010000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000558500001b06000010010000,GameSir G4 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -05000000ac0500002d0200001b010000,GameSir G4s,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b33,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000bc2000005656000011010000,GameSir T4w,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000451300000010000010010000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -03000000f0250000c183000010010000,Goodbetterbest Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000007d0400000540000000010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -03000000280400000140000000010000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -030000008f0e00000610000000010000,GreenAsia Electronics Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux, -030000008f0e00001200000010010000,GreenAsia Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, -0500000047532067616d657061640000,GS gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -03000000f0250000c383000010010000,GT VX2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -06000000adde0000efbe000002010000,Hidromancer Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000d81400000862000011010000,HitBox PS3 PC Analog Mode,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,platform:Linux, -03000000c9110000f055000011010000,HJC Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -03000000632500002605000010010000,HJDX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -030000000d0f00000d00000000010000,Hori,a:b0,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,rightshoulder:b7,start:b9,x:b1,y:b2,platform:Linux, -030000000d0f00006d00000020010000,Hori EDGE 301,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:+a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000000d0f00005f00000011010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00005e00000011010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00005001000009040000,Hori Fighting Commander OCTA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000000d0f00008500000010010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00008600000002010000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -030000000d0f00008800000011010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00008700000011010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00001000000011010000,Hori Fightstick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -03000000ad1b000003f5000033050000,Hori Fightstick VX,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b8,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, -030000000d0f00004d00000011010000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000000d0f00003801000011010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Linux, -030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f0000aa00000011010000,Hori Real Arcade Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -030000000d0f00001100000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00002200000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00006a00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00006b00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00001600000000010000,Hori Real Arcade Pro EXSE,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, -030000000d0f00006e00000011010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00006600000011010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f0000ee00000011010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00006700000001010000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000000d0f0000c100000011010000,Horipad S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -050000000d0f0000f600000001000000,Horipad Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -03000000341a000005f7000010010000,HuiJia GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, -030000008f0e00001330000010010000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Linux, -03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000830500006020000010010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, -050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000b50700001503000010010000,Impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, -03000000d80400008200000003000000,IMS PCU0,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,platform:Linux, -03000000120c00000500000010010000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux, -03000000ef0500000300000000010000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux, -03000000fd0500000030000000010000,InterAct GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Linux, -03000000fd0500002a26000000010000,InterAct HammerHead FX,a:b3,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux, -0500000049190000020400001b010000,Ipega PG 9069,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b161,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000632500007505000011010000,Ipega PG 9099,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -0500000049190000030400001b010000,Ipega PG9099,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -05000000491900000204000000000000,Ipega PG9118,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000300f00001001000010010000,Jess Tech Dual Analog Rumble,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, -03000000300f00000b01000010010000,Jess Tech GGE909 PC Recoil,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -03000000ba2200002010000001010000,Jess Technology Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux, -050000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux, -030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, -050000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, -03000000bd12000003c0000010010000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000242f00002d00000011010000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000242f00008a00000011010000,JYS Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, -030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d040000d1ca000000000000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d0400001dc2000014400000,Logitech F310,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d0400001ec2000019200000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d0400001ec2000020200000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d04000019c2000011010000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d0400001fc2000005030000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,platform:Linux, -030000006d0400000ac2000010010000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Linux, -05000000380700006652000025010000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000380700008532000010010000,Mad Catz Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -03000000380700005032000011010000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000380700005082000011010000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux, -03000000380700008034000011010000,Mad Catz Fightstick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000380700008084000011010000,Mad Catz Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000380700008433000011010000,Mad Catz Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000380700008483000011010000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000380700001888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000380700003888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000380700001647000010040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000380700003847000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000120c00000500000000010000,Manta Dualshock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, -03000000790000004318000010010000,Mayflash GameCube Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, -03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, -03000000242f00007300000011010000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, -0300000079000000d218000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000d620000010a7000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000242f0000f700000001010000,Mayflash Magic S Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -0300000025090000e803000001010000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, -03000000790000000318000011010000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux, -03000000b50700001203000010010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, -03000000780000000600000010010000,Microntek Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, -030000005e0400002800000000010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Linux, -030000005e0400000e00000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux, -030000005e0400000700000000010000,Microsoft SideWinder Gamepad,a:b0,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux, -030000005e0400002700000000010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Linux, -030000005e0400008502000000010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, -030000005e0400008e02000001000000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.1,dpleft:h0.2,dpright:h0.8,dpup:h0.4,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000004010000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000056210000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000062230000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000120b00000b050000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000d102000001010000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000d102000003020000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -060000005e040000120b000009050000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000dd02000003020000,Microsoft Xbox One 2015,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000e302000003020000,Microsoft Xbox One Elite,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000000b000008040000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -050000005e040000050b000003090000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -030000005e040000ea02000008040000,Microsoft Xbox One S,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008902000021010000,Microsoft Xbox pad v2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, -03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, -050000004d4f435554452d3035335800,Mocute 053X,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -050000004d4f435554452d3035305800,Mocute 054X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -05000000d6200000e589000001000000,Moga 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, -05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, -05000000d62000007162000001000000,Moga Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, -03000000c62400002b89000011010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -05000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b22,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -05000000c62400001a89000000010000,MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000250900006688000000010000,MP8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, -030000005e0400008e02000010020000,MSI GC20 V2,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006b1400000906000014010000,Nacon Asymmetric Wireless PS4 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006b140000010c000010010000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -03000000853200000706000012010000,Nacon GC-100,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000000d0f00000900000010010000,Natec Genesis P44,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000004f1f00000800000011010000,NeoGeo PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -0300000092120000474e000000010000,NeoGeo X Arcade Stick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b3,y:b2,platform:Linux, -03000000790000004518000010010000,Nexilux GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, -030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Linux, -060000007e0500003713000000000000,Nintendo 3DS,a:b0,b:b1,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, -030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux, -03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b2,y:b3,platform:Linux, -060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, -060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, -050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b16,b:b15,back:b4,leftshoulder:b6,leftstick:b12,leftx:a1,lefty:a0~,rightshoulder:b8,start:b9,x:b14,y:b17,platform:Linux, -03000000d620000013a7000011010000,Nintendo Switch PowerA Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000d620000011a7000011010000,Nintendo Switch PowerA Core Plus Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, -050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -050000007e0500000920000001800000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, -050000007e0500000720000001800000,Nintendo Switch Right Joy-Con,a:b1,b:b2,back:b9,leftshoulder:b4,leftstick:b10,leftx:a1~,lefty:a0,rightshoulder:b6,start:b8,x:b0,y:b3,platform:Linux, -05000000010000000100000003000000,Nintendo Wii Remote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -050000007e0500003003000001000000,Nintendo Wii Remote Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, -030000000d0500000308000010010000,Nostromo n45 Dual Analog,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux, -050000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Linux, -050000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, -03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, -05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, -03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -19000000010000000100000001010000,odroidgo2 joypad,a:b1,b:b0,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,guide:b10,leftshoulder:b4,leftstick:b12,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b14,start:b15,x:b2,y:b3,platform:Linux, -19000000010000000200000011000000,odroidgo2 joypad v11,a:b1,b:b0,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b12,leftshoulder:b4,leftstick:b14,lefttrigger:b13,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b16,start:b17,x:b2,y:b3,platform:Linux, -03000000c0160000dc27000001010000,OnyxSoft Dual JoyDivision,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:Linux, -05000000362800000100000002010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, -05000000362800000100000003010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, -05000000362800000100000004010000,OUYA Controller,a:b0,b:b3,back:b14,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,start:b16,x:b1,y:b2,platform:Linux, -03000000830500005020000010010000,Padix Rockfire PlayStation Bridge,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Linux, -03000000790000001c18000011010000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000ff1100003133000010010000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -030000006f0e0000b802000001010000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e0000b802000013020000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e0000d702000006640000,PDP Black Camo Wired Xbox Series X Controller,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b13,dpup:b14,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00003101000000010000,PDP EA Sports Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00008001000011010000,PDP Faceoff Nintendo Switch Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006f0e0000c802000012010000,PDP Kingdom Hearts Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00008501000011010000,PDP Nintendo Switch Fightpad Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -030000006f0e00002801000011010000,PDP PS3 Rock Candy Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006f0e00008701000011010000,PDP Rock Nintendo Switch Candy Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -030000006f0e00000901000011010000,PDP Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -030000006f0e0000a802000023020000,PDP Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000004c050000da0c000011010000,PlayStation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, -03000000d9040000160f000000010000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -030000004c0500003713000011010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, -03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000d62000000140000001010000,PowerA Fusion Pro 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000c62400001a53000000010000,PowerA Mini Pro Ex,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000c62400001a58000001010000,PowerA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000d62000000220000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, -03000000d62000000228000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000c62400001a54000001010000,PowerA Xbox One Mini Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000d62000000240000001010000,PowerA Xbox One Spectra Infinity,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, -03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000004c0500006802000010010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -030000004c0500006802000010810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -030000004c0500006802000011810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -030000005f1400003102000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -030000006f0e00001402000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000008f0e00000300000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -050000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -050000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:a12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:a13,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -050000004c0500006802000000800000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -030000004c050000a00b000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004c050000a00b000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004c050000c405000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004c050000cc09000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -03000000c01100000140000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -050000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -050000004c050000c405000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, -030000004c050000e60c000011810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, -050000004c050000e60c000000810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux, -03000000222c00000225000011010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000222c00000025000011010000,Qanba Dragon Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000300f00001210000010010000,Qanba Joystick Plus,a:b0,b:b1,back:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,start:b9,x:b2,y:b3,platform:Linux, -03000000222c00000223000011010000,Qanba Obsidian Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000222c00000023000011010000,Qanba Obsidian Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000009b2800000300000001010000,Raphnet 4nes4snes,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux, -030000009b2800004200000001010000,Raphnet Dual NES Adapter,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Linux, -030000009b2800003200000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, -030000009b2800006000000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, -030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000008916000000fd000024010000,Razer Onza Tournament Edition,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000321500000810000011010000,Razer Panthera PS4 Evo Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000321500000010000011010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -05000000321500000a10000001000000,Razer Raiju Tournament Edition,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000321500000011000011010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000008916000000fe000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000c6240000045d000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000790000001100000010010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Linux, -0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux, -0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, -00000000526574726f53746f6e653200,RetroStone 2 Controller,a:b1,b:b0,back:b10,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,righttrigger:b9,start:b11,x:b4,y:b3,platform:Linux, -030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000c6240000fefa000000010000,Rock Candy Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000a306000023f6000011010000,Saitek Cyborg V1 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, -03000000a30600001005000000010000,Saitek P150,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b2,righttrigger:b5,x:b3,y:b4,platform:Linux, -03000000a30600000701000000010000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Linux, -03000000a30600000cff000010010000,Saitek P2500 Force Rumble,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b0,y:b1,platform:Linux, -03000000a30600000c04000011010000,Saitek P2900,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,platform:Linux, -03000000a306000018f5000010010000,Saitek P3200 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, -03000000300f00001201000010010000,Saitek P380,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, -03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux, -03000000a30600000b04000000010000,Saitek P990 Dual Analog,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Linux, -03000000a306000020f6000011010000,Saitek PS2700 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, -03000000d81d00000e00000010010000,Savior,a:b0,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b9,x:b4,y:b5,platform:Linux, -03000000a30c00002500000011010000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Linux, -03000000790000001100000011010000,Sega Saturn,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Linux, -03000000790000002201000011010000,Sega Saturn,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, -03000000b40400000a01000000010000,Sega Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Linux, -030000001f08000001e4000010010000,SFC Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, -03000000632500002305000010010000,ShanWan Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000f025000021c1000010010000,Shanwan Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000632500007505000010010000,Shanwan PS3 PC,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000bc2000000055000010010000,Shanwan PS3 PC ,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000341a00000908000010010000,SL6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -050000004c050000cc09000001000000,Sony DualShock 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000ff000000cb01000010010000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, -03000000250900000500000000010000,Sony PS2 pad with SmartJoy Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, -030000005e0400008e02000073050000,Speedlink Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000020200000,SpeedLink Xeox Pro Analog,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000d11800000094000011010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, -03000000de2800000112000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:+a5,dpleft:-a4,dpright:+a4,dpup:-a5,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, -03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, -03000000de2800000211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b16,paddle2:b15,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, -03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, -03000000de2800004211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b16,paddle2:b15,rightshoulder:b7,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, -03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, -05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, -05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, -03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b10,guide:b11,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Linux, -03000000381000003014000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000381000003114000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -0500000011010000311400001b010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b32,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000ad1b000038f0000090040000,Street Fighter IV Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000003b07000004a1000000010000,Suncom SFX Plus,a:b0,b:b2,back:b7,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Linux, -03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, -0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, -030000008f0e00000d31000010010000,SZMY Power 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000457500002211000010010000,SZMY Power Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -030000008f0e00001431000010010000,SZMY Power PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000ba2200000701000001010000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Linux, -030000004f04000015b3000001010000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, -030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, -030000004f04000020b3000010010000,Thrustmaster Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, -030000004f04000023b3000000010000,Thrustmaster Dual Trigger PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004f0400000ed0000011010000,Thrustmaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000b50700000399000000010000,Thrustmaster Firestorm Digital 2,a:b2,b:b4,back:b11,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b0,righttrigger:b9,start:b1,x:b3,y:b5,platform:Linux, -030000004f04000003b3000010010000,Thrustmaster Firestorm Dual Analog 2,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b9,rightx:a2,righty:a3,x:b1,y:b3,platform:Linux, -030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Linux, -030000004f04000004b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, -030000004f04000026b3000002040000,Thrustmaster GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000c6240000025b000002020000,Thrustmaster GPX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000004f04000008d0000000010000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004f04000009d0000000010000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000004f04000007d0000000010000,Thrustmaster T Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000004f04000012b3000010010000,Thrustmaster Vibrating Gamepad,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, -03000000571d00002000000010010000,Tomee SNES Adapter,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, -03000000bd12000015d0000010010000,Tomee SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, -03000000d814000007cd000011010000,Toodles 2008 Chimp PC PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, -030000005e0400008e02000070050000,Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000c01100000591000011010000,Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -030000005f140000c501000010010000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000100800000100000010010000,Twin PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, -03000000790000001100000000010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux, -030000006f0e00000302000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -030000006f0e00000702000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -05000000ac0500003232000001000000,VR Box Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, -0000000058626f782033363020576900,Xbox 360 Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, -030000005e0400001907000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000010010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000014010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400009102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000a102000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000a102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000000010000,Xbox 360 EasySMX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000a102000014010000,Xbox 360 Receiver,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400000202000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, -030000006f0e00001304000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000ffff0000ffff000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, -0000000058626f782047616d65706100,Xbox Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400000a0b000005040000,Xbox One Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, -030000005e040000120b000009050000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000d102000002010000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000ea02000001030000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -050000005e040000e002000003090000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -050000005e040000fd02000003090000,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -050000005e040000fd02000030110000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -060000005e040000120b000007050000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -050000005e040000e302000002090000,Xbox One Elite,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -050000005e040000050b000002090000,Xbox One Elite Series 2,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -060000005e040000ea0200000b050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000120b000001050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000120b000005050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000120b00000d050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -050000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -050000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -050000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -050000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -050000005e040000130b000011050000,Xbox Series X Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -030000005e040000120b000007050000,Xbox Series X Controller,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,misc1:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, -050000005e040000130b000007050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -03000000450c00002043000010010000,XEOX SL6556 BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -05000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux, -03000000c0160000e105000001010000,XinMo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux, -xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000120c0000100e000011010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000120c0000101e000011010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, - -# Android -38653964633230666463343334313533,8BitDo Adapter,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -36666264316630653965636634386234,8BitDo Adapter 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -38426974446f20417263616465205374,8BitDo Arcade Stick,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b5,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -61393962646434393836356631636132,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, -64323139346131306233636562663738,8BitDo Arcade Stick,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, -64643565386136613265663236636564,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, -33313433353539306634656436353432,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -38426974446f20446f67626f6e65204d,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, -34343439373236623466343934376233,8BitDo FC30 Pro,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b28,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b29,righttrigger:b7,start:b5,x:b30,y:b2,platform:Android, -38393936616436383062666232653338,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f2038426974446f204c69,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -39356430616562366466646636643435,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -05000000c82d000006500000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a5,rightshoulder:b10,righttrigger:a4,start:b6,x:b3,y:b2,platform:Android, -05000000c82d000051060000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,start:b6,x:b3,y:b2,platform:Android, -32323161363037623637326438643634,8BitDo M30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -33656266353630643966653238646264,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,start:b10,x:b19,y:b2,platform:Android, -38426974446f204d3330204d6f646b69,8BitDo M30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -39366630663062373237616566353437,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,start:b6,x:b2,y:b3,platform:Android, -64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android, -66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android, -66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android, -33663431326134333366393233616633,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, -38426974446f204e3330204d6f646b69,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, -05000000c82d000015900000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -05000000c82d000065280000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -050000000220000000900000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -050000002038000009000000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38313433643131656262306631373166,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -38326536643339353865323063616339,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -38426974446f2050333020636c617373,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -35376664343164386333616535333434,8BitDo Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,start:b10,x:b19,y:b2,platform:Android, -38426974446f2038426974446f205072,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f2050726f203200000000,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -62373739366537363166326238653463,8BitDo Pro 2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b3,y:b2,platform:Android, -38386464613034326435626130396565,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f2038426974446f205265,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -66303230343038613365623964393766,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f20533330204d6f646b69,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -66316462353561376330346462316137,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -05000000c82d000000600000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -05000000c82d000000610000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974646f20534633302050726f00,8BitDo SF30 Pro,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b17,platform:Android, -61623334636338643233383735326439,8BitDo SFC30,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b31,start:b5,x:b30,y:b2,platform:Android, -05000000c82d000012900000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, -05000000c82d000062280000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, -38316230613931613964356666353839,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f20534e3330204d6f646b,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -65323563303231646531383162646335,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -05000000c82d000001600000ffff3f00,8BitDo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, -38303232393133383836366330346462,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, -38346630346135363335366265656666,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38426974446f20534e33302050726f2b,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -536f6e7920436f6d707574657220456e,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -66306331643531333230306437353936,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -05000000c82d000002600000ffff0f00,8BitDo SN30 Pro+,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -050000002028000009000000ffff3f00,8BitDo SNES30,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -050000003512000020ab000000780f00,8BitDo SNES30,a:b21,b:b20,back:b30,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b26,rightshoulder:b27,start:b31,x:b24,y:b23,platform:Android, -33666663316164653937326237613331,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, -38426974646f205a65726f2047616d65,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, -05000000c82d000018900000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, -05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, -33663434393362303033616630346337,8BitDo Zero 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, -34656330626361666438323266633963,8BitDo Zero 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, -63396666386564393334393236386630,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, -63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, -32333634613735616163326165323731,Amazon Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, -417374726f2063697479206d696e6920,Astro City Mini,a:b23,b:b22,back:b29,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, -32303165626138343962363666346165,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -38383337343564366131323064613561,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -34313430343161653665353737323365,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, -4875694a6961204a432d573031550000,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, -30363230653635633863366338623265,Evo VR,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,x:b2,y:b3,platform:Android, -05000000b404000011240000dfff3f00,Flydigi Vader 2,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, -0500000031366332860c44aadfff0f00,GS Gamepad,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, -35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -484f524920434f2e2c4c54442e203130,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -484f524920434f2e2c4c544420205041,Hori Gem Pad 3,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android, -65656436646661313232656661616130,Hori PC Engine Mini Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b18,platform:Android, -31303433326562636431653534636633,Hori Real Arcade Pro 3,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -30306539356238653637313730656134,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, -0500000083050000602000000ffe0000,iBuffalo SNES Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b15,rightshoulder:b16,start:b10,x:b2,y:b3,platform:Android, -64306137363261396266353433303531,InterAct GoPad,a:b24,b:b25,leftshoulder:b23,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,x:b21,y:b22,platform:Android, -532e542e442e20496e74657261637420,InterAct HammerHead FX,a:b23,b:b24,back:b30,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b22,lefttrigger:b28,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b25,righttrigger:b29,rightx:a2,righty:a3,start:b31,x:b20,y:b21,platform:Android, -65346535636333663931613264643164,Joy-Con,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android, -33346566643039343630376565326335,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, -35313531613435623366313835326238,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, -4a6f792d436f6e20284c290000000000,Joy-Con (L),a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, -38383665633039363066383334653465,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, -39363561613936303237333537383931,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, -4a6f792d436f6e202852290000000000,Joy-Con (R),a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, -39656136363638323036303865326464,JYS Aapter,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -63316564383539663166353034616434,JYS Adapter,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, -64623163333561643339623235373232,Logitech F310,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -4c6f6769746563682047616d65706164,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -416d617a6f6e2047616d6520436f6e74,Luna Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, -4c756e612047616d6570616400000000,Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -31353762393935386662336365626334,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -39623565346366623931666633323530,Magic NS,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, -6d6179666c617368206c696d69746564,Mayflash GameCube Adapter,a:b22,b:b21,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a5,righty:a2,start:b30,x:b23,y:b24,platform:Android, -436f6e74726f6c6c6572000000000000,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, -65666330633838383061313633326461,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, -535a4d792d706f776572204c54442043,Mayflash Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b31,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, -30653962643666303631376438373532,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, -484a5a204d6179666c61736820576969,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, -31323564663862633234646330373138,Mega Drive,a:b23,b:b22,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, -37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, -64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Android, -33323763323132376537376266393366,Microsoft Dual Strike,a:b24,b:b23,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b29,rightshoulder:b78,rightx:a0,righty:a1~,start:b26,x:b22,y:b21,platform:Android, -30306461613834333439303734316539,Microsoft SideWinder Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b20,lefttrigger:b9,rightshoulder:b19,righttrigger:b10,start:b17,x:b2,y:b3,platform:Android, -32386235353630393033393135613831,Microsoft Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -4d4f435554452d303533582d4d35312d,Mocute 053X,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -33343361376163623438613466616531,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -39306635663061636563316166303966,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -7573622067616d657061642020202020,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Android, -050000007e05000009200000ffff0f00,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b17,y:b2,platform:Android, -34323437396534643531326161633738,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,misc1:b5,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -50726f20436f6e74726f6c6c65720000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b2,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b10,rightx:a2,righty:a3,start:b18,y:b3,platform:Android, -36326533353166323965623661303933,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android, -4e363420436f6e74726f6c6c65720000,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android, -534e455320436f6e74726f6c6c657200,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, -64623863346133633561626136366634,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, -050000005509000003720000cf7f3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000005509000010720000ffff3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000005509000014720000df7f3f00,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, -37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -39383335313438623439373538343266,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b16,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,x:b1,y:b19,platform:Android, -4f5559412047616d6520436f6e74726f,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b6,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b19,platform:Android, -506572666f726d616e63652044657369,PDP PS3 Rock Candy Controller,a:b1,b:b17,back:h0.2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android, -62653335326261303663356263626339,PlayStation Classic Controller,a:b19,b:b1,back:b17,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b3,rightshoulder:b10,righttrigger:b20,start:b18,x:b2,y:b0,platform:Android, -61653962353232366130326530363061,Pokken,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,rightshoulder:b20,righttrigger:b10,start:b18,x:b0,y:b2,platform:Android, -32666633663735353234363064386132,PS2,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a3,righty:a2,start:b30,x:b24,y:b21,platform:Android, -050000004c05000068020000dfff3f00,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -536f6e7920504c415953544154494f4e,PS3 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -61363034663839376638653463633865,PS3 Controller,a:b0,b:b1,back:b15,dpdown:a14,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -66366539656564653432353139356536,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -66383132326164626636313737373037,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000004c050000c405000000783f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000004c050000c4050000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, -050000004c050000c4050000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000004c050000cc090000fffe3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000004c050000cc090000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -30303839663330346632363232623138,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, -31326235383662333266633463653332,PS4 Controller,a:b1,b:b16,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b17,x:b0,y:b2,platform:Android, -31373231336561636235613666323035,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -31663838336334393132303338353963,PS4 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -34613139376634626133336530386430,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, -37626233336235343937333961353732,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -38393161636261653636653532386639,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -536f6e7920496e746572616374697665,PS4 Controller,a:b0,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -576972656c65737320436f6e74726f6c,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -63313733393535663339656564343962,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -63393662363836383439353064663939,PS4 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, -66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, -050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, -32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, -37363764353731323963323639666565,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, -61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, -64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, -36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000003215000000090000bf7f3f00,Razer Serval,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, -5a6869587520526574726f2042697420,Retro Bit Saturn Controller,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b26,rightshoulder:b27,righttrigger:b28,start:b30,x:b23,y:b24,platform:Android, -32417865732031314b6579732047616d,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, -36313938306539326233393732613361,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, -526574726f466c616720576972656420,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,rightshoulder:b18,start:b10,x:b2,y:b3,platform:Android, -61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android, -38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b6,platform:Android, -33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android, -66386565396238363534313863353065,Sanwa PlayOnline Mobile,a:b21,b:b22,back:b23,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b24,platform:Android, -32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, -37316565396364386635383230353365,Saturn,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, -38613865396530353338373763623431,Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b10,rightshoulder:b20,righttrigger:b19,start:b17,x:b2,y:b3,platform:Android, -61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, -30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, -66386262366536653765333235343634,SG H510,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, -66633132393363353531373465633064,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, -62653761636366393366613135366338,SN30 PP,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -38376662666661636265313264613039,SNES,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, -5346432f555342205061640000000000,SNES Adapter,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, -5553422047616d657061642000000000,SNES Controller,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, -63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android, -63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android, -476f6f676c65204c4c43205374616469,Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, -05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, -0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android, -35306436396437373135383665646464,SteelSeries Nimbus Plus,a:b0,b:b1,leftshoulder:b3,leftstick:b17,lefttrigger:b9,leftx:a0,rightshoulder:b20,rightstick:b18,righttrigger:b10,rightx:a2,x:b19,y:b2,platform:Android, -050000004f0400000ed00000fffe3f00,ThrustMaster eSwap Pro Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -5477696e20555342204a6f7973746963,Twin Joystick,a:b22,b:b21,back:b28,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android, -30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -31643365666432386133346639383937,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -30386438313564306161393537333663,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, -33333034646336346339646538643633,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, -050000005e0400008e02000000783f00,Xbox 360 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -30396232393162346330326334636566,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -38313038323730383864666463383533,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -58626f782033363020576972656c6573,Xbox 360 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -65353331386662343338643939643636,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -65613532386633373963616462363038,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -47656e6572696320582d426f78207061,Xbox Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -4d6963726f736f667420582d426f7820,Xbox Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -64633436313965656664373634323364,Xbox Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000005e04000091020000ff073f00,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, -050000005e040000e00200000ffe3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android, -050000005e040000e0020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android, -050000005e040000fd020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -34356136633366613530316338376136,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android, -35623965373264386238353433656138,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -36616131643361333337396261666433,Xbox One Controller,a:b0,b:b1,back:b15,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -58626f7820576972656c65737320436f,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000005e040000000b000000783f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, -050000005e040000e002000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000005e040000ea02000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000005e040000fd020000ff7f3f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000005e040000120b000000783f00,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, -050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -050000001727000044310000ffff3f00,XiaoMi Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, - -# iOS -05000000ac0500000100000000006d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, -05000000ac050000010000004f066d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, -05000000ac05000001000000cf076d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, -05000000ac05000001000000df076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, -05000000ac05000001000000ff076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, -05000000ac0500000200000000006d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, -05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, -4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS, -4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS, -050000007e050000062000004f060000,Nintendo Switch Joy-Con (L),+leftx:h0.1,+lefty:h0.2,-leftx:h0.4,-lefty:h0.8,dpdown:b2,dpleft:b0,dpright:b3,dpup:b1,leftshoulder:b4,misc1:b6,rightshoulder:b5,platform:iOS, -050000007e0500000e200000df070000,Nintendo Switch Joy-Con (L/R),a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS, -050000007e050000072000004f060000,Nintendo Switch Joy-Con (R),+rightx:h0.4,+righty:h0.8,-rightx:h0.1,-righty:h0.2,a:b1,b:b0,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b3,y:b2,platform:iOS, -050000007e05000009200000ff870000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, -050000004c050000cc090000df070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, -050000004c050000cc090000df870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, -050000004c050000cc090000ff070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, -050000004c050000cc090000ff870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS, -050000004c050000cc090000ff876d01,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, -050000004c050000e60c0000df870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,touchpad:b10,x:b2,y:b3,platform:iOS, -050000004c050000e60c0000ff870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS, -05000000ac0500000300000000006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, -05000000ac0500000300000043006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, -05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, -05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, -050000005e040000050b0000df070001,Xbox Elite Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b10,paddle2:b12,paddle3:b11,paddle4:b13,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, -050000005e040000050b0000ff070001,Xbox Elite Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, -050000005e040000e0020000df070000,Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, -050000005e040000e0020000ff070000,Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, -050000005e040000130b0000df870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b10,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, -050000005e040000130b0000ff870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, diff --git a/src/builtin/lightmap/spot.png b/src/builtin/lightmap/spot.png deleted file mode 100644 index 0a488811e124ce0f287d94b6fc507b0d048365e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3147 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 IKQ?*(9}!O4a{vGU diff --git a/src/builtin/organya-wavetable-org.bin b/src/builtin/organya-wavetable-org.bin deleted file mode 100644 index 6bc97f59f1f8f98358ae62b2b2d6f742fac28d4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87772 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"+Hbvx<{1N`P@lRCqN5g69dDPwh(EaKXH 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 diff --git a/src/builtin/touch.png b/src/builtin/touch.png deleted file mode 100644 index 685c7dd5624c24172cbca9fc34e5777c20d601f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16222 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 D5Ctmo diff --git a/src/builtin_fs.rs b/src/builtin_fs.rs deleted file mode 100644 index 133963f..0000000 --- a/src/builtin_fs.rs +++ /dev/null @@ -1,330 +0,0 @@ -use std::fmt::Debug; -use std::io::Cursor; -use std::io::ErrorKind; -use std::io::SeekFrom; -use std::path::{Component, Path, PathBuf}; -use std::{fmt, io}; - -use crate::framework::error::GameError::FilesystemError; -use crate::framework::error::GameResult; -use crate::framework::vfs::{OpenOptions, VFile, VMetadata, VFS}; - -#[derive(Debug)] -pub struct BuiltinFile(Cursor<&'static [u8]>); - -impl BuiltinFile { - pub fn from(buf: &'static [u8]) -> Box { - Box::new(BuiltinFile(Cursor::new(buf))) - } -} - -impl io::Read for BuiltinFile { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - self.0.read(buf) - } -} - -impl io::Seek for BuiltinFile { - fn seek(&mut self, pos: SeekFrom) -> io::Result { - self.0.seek(pos) - } -} - -impl io::Write for BuiltinFile { - fn write(&mut self, _buf: &[u8]) -> io::Result { - Err(io::Error::new(ErrorKind::PermissionDenied, "Built-in file system is read-only.")) - } - - fn flush(&mut self) -> io::Result<()> { - Err(io::Error::new(ErrorKind::PermissionDenied, "Built-in file system is read-only.")) - } -} - -struct BuiltinMetadata { - is_dir: bool, - size: u64, -} - -impl VMetadata for BuiltinMetadata { - fn is_dir(&self) -> bool { - self.is_dir - } - - fn is_file(&self) -> bool { - !self.is_dir - } - - fn len(&self) -> u64 { - self.size - } -} - -#[derive(Clone, Debug)] -enum FSNode { - File(&'static str, &'static [u8]), - Directory(&'static str, Vec), -} - -impl FSNode { - fn get_name(&self) -> &'static str { - match self { - FSNode::File(name, _) => name, - FSNode::Directory(name, _) => name, - } - } - - fn to_file(&self) -> GameResult> { - match self { - FSNode::File(_, buf) => Ok(BuiltinFile::from(buf)), - FSNode::Directory(name, _) => Err(FilesystemError(format!("{} is a directory.", name))), - } - } - - fn to_metadata(&self) -> Box { - match self { - FSNode::File(_, buf) => Box::new(BuiltinMetadata { is_dir: false, size: buf.len() as u64 }), - FSNode::Directory(_, _) => Box::new(BuiltinMetadata { is_dir: true, size: 0 }), - } - } -} - -pub struct BuiltinFS { - root: Vec, -} - -impl BuiltinFS { - pub fn new() -> Self { - Self { - root: vec![FSNode::Directory( - "builtin", - vec![ - FSNode::File("builtin_font.fnt", include_bytes!("builtin/builtin_font.fnt")), - FSNode::File("builtin_font_0.png", include_bytes!("builtin/builtin_font_0.png")), - FSNode::File("builtin_font_1.png", include_bytes!("builtin/builtin_font_1.png")), - FSNode::File("gamecontrollerdb.txt", include_bytes!("builtin/gamecontrollerdb.txt")), - FSNode::File( - "organya-wavetable-doukutsu.bin", - include_bytes!("builtin/organya-wavetable-doukutsu.bin"), - ), - FSNode::File("touch.png", include_bytes!("builtin/touch.png")), - FSNode::Directory( - "builtin_data", - vec![ - FSNode::File("buttons.png", include_bytes!("builtin/builtin_data/buttons.png")), - FSNode::File("triangles.png", include_bytes!("builtin/builtin_data/triangles.png")), - FSNode::Directory( - "headband", - vec![ - FSNode::Directory( - "ogph", - vec![ - FSNode::File( - "Casts.png", - include_bytes!("builtin/builtin_data/headband/ogph/Casts.png"), - ), - FSNode::Directory( - "Npc", - vec![ - FSNode::File( - "NpcGuest.png", - include_bytes!( - "builtin/builtin_data/headband/ogph/Npc/NpcGuest.png" - ), - ), - FSNode::File( - "NpcMiza.png", - include_bytes!( - "builtin/builtin_data/headband/ogph/Npc/NpcMiza.png" - ), - ), - FSNode::File( - "NpcRegu.png", - include_bytes!( - "builtin/builtin_data/headband/ogph/Npc/NpcRegu.png" - ), - ), - ], - ), - ], - ), - FSNode::Directory( - "plus", - vec![ - FSNode::File( - "Casts.png", - include_bytes!("builtin/builtin_data/headband/plus/casts.png"), - ), - FSNode::Directory( - "Npc", - vec![ - FSNode::File( - "NpcGuest.png", - include_bytes!( - "builtin/builtin_data/headband/plus/npc/npcguest.png" - ), - ), - FSNode::File( - "NpcMiza.png", - include_bytes!( - "builtin/builtin_data/headband/plus/npc/npcmiza.png" - ), - ), - FSNode::File( - "NpcRegu.png", - include_bytes!( - "builtin/builtin_data/headband/plus/npc/npcregu.png" - ), - ), - ], - ), - ], - ), - ], - ), - FSNode::Directory( - "locale", - vec![ - FSNode::File("en.json", include_bytes!("builtin/builtin_data/locale/en.json")), - FSNode::File("jp.json", include_bytes!("builtin/builtin_data/locale/jp.json")), - ], - ), - ], - ), - FSNode::Directory( - "shaders", - vec![ - // FSNode::File("basic_150.vert.glsl", include_bytes!("builtin/shaders/basic_150.vert.glsl")), - // FSNode::File("water_150.frag.glsl", include_bytes!("builtin/shaders/water_150.frag.glsl")), - // FSNode::File("basic_es300.vert.glsl", include_bytes!("builtin/shaders/basic_es300.vert.glsl")), - // FSNode::File("water_es300.frag.glsl", include_bytes!("builtin/shaders/water_es300.frag.glsl")), - ], - ), - FSNode::Directory( - "lightmap", - vec![FSNode::File("spot.png", include_bytes!("builtin/lightmap/spot.png"))], - ), - ], - )], - } - } - - fn get_node(&self, path: &Path) -> GameResult { - let mut iter = path.components().peekable(); - - if let Some(Component::RootDir) = iter.next() { - let mut curr_dir = &self.root; - - if iter.peek().is_none() { - return Ok(FSNode::Directory("", self.root.clone())); - } - - while let Some(comp) = iter.next() { - let comp_name = comp.as_os_str().to_string_lossy(); - - for file in curr_dir { - match file { - FSNode::File(name, _) if comp_name.eq(name) => { - return if iter.peek().is_some() { - Err(FilesystemError(format!("Expected a directory, found a file: {:?}", path))) - } else { - Ok(file.clone()) - }; - } - FSNode::Directory(name, contents) if comp_name.eq(name) => { - if iter.peek().is_some() { - curr_dir = contents; - break; - } else { - return Ok(file.clone()); - } - } - _ => {} - } - } - } - } else { - return Err(FilesystemError("Path must be absolute.".to_string())); - } - - Err(FilesystemError("File not found.".to_string())) - } -} - -impl Debug for BuiltinFS { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - write!(f, "") - } -} - -impl VFS for BuiltinFS { - fn open_options(&self, path: &Path, open_options: OpenOptions) -> GameResult> { - if open_options.write || open_options.create || open_options.append || open_options.truncate { - let msg = format!("Cannot alter file {:?} in root {:?}, filesystem read-only", path, self); - return Err(FilesystemError(msg)); - } - - self.get_node(path)?.to_file() - } - - fn mkdir(&self, _path: &Path) -> GameResult<()> { - Err(FilesystemError("Tried to make directory {} but FS is read-only".to_string())) - } - - fn rm(&self, _path: &Path) -> GameResult<()> { - Err(FilesystemError("Tried to remove file {} but FS is read-only".to_string())) - } - - fn rmrf(&self, _path: &Path) -> GameResult<()> { - Err(FilesystemError("Tried to remove file/dir {} but FS is read-only".to_string())) - } - - fn exists(&self, path: &Path) -> bool { - self.get_node(path).is_ok() - } - - fn metadata(&self, path: &Path) -> GameResult> { - self.get_node(path).map(|v| v.to_metadata()) - } - - fn read_dir(&self, path: &Path) -> GameResult>>> { - match self.get_node(path) { - Ok(FSNode::Directory(_, contents)) => { - let mut vec = Vec::new(); - for node in contents { - vec.push(Ok(PathBuf::from(node.get_name()))) - } - - Ok(Box::new(vec.into_iter())) - } - Ok(FSNode::File(_, _)) => Err(FilesystemError(format!("Expected a directory, found a file: {:?}", path))), - Err(e) => Err(e), - } - } - - fn to_path_buf(&self) -> Option { - None - } -} - -#[test] -fn test_builtin_fs() { - let fs = BuiltinFS { - root: vec![ - FSNode::File("test.txt", &[]), - FSNode::Directory( - "memes", - vec![ - FSNode::File("nothing.txt", &[]), - FSNode::Directory("secret stuff", vec![FSNode::File("passwords.txt", b"12345678")]), - ], - ), - FSNode::File("test2.txt", &[]), - ], - }; - - println!("{:?}", fs.get_node(Path::new("/")).unwrap()); - println!("{:?}", fs.get_node(Path::new("/test.txt")).unwrap()); - println!("{:?}", fs.get_node(Path::new("/memes")).unwrap()); - println!("{:?}", fs.get_node(Path::new("/memes/nothing.txt")).unwrap()); - println!("{:?}", fs.get_node(Path::new("/memes/secret stuff/passwords.txt")).unwrap()); -} diff --git a/src/common.rs b/src/common.rs index b4d3663..ccc20d9 100644 --- a/src/common.rs +++ b/src/common.rs @@ -3,12 +3,12 @@ use std::time::{SystemTime, UNIX_EPOCH}; use lazy_static::lazy_static; use num_traits::{abs, Num}; +use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; use serde::de::{SeqAccess, Visitor}; use serde::ser::SerializeTupleStruct; -use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; use crate::bitfield; -use crate::texture_set::G_MAG; +use crate::graphics::texture_set::G_MAG; /// Multiply cave story degrees (0-255, which corresponds to 0°-360°) with this constant to get /// respective value in radians. @@ -302,8 +302,8 @@ impl Rect { impl Serialize for Rect { fn serialize(&self, serializer: S) -> Result - where - S: Serializer, + where + S: Serializer, { let mut state = serializer.serialize_tuple_struct("Rect", 4)?; state.serialize_field(&self.left)?; diff --git a/src/components/background.rs b/src/components/background.rs index f1a615c..369137e 100644 --- a/src/components/background.rs +++ b/src/components/background.rs @@ -1,7 +1,10 @@ use crate::common::{Color, Rect}; -use crate::frame::Frame; -use crate::stage::{BackgroundType, Stage, StageTexturePaths}; -use crate::{graphics, Context, GameResult, SharedGameState}; +use crate::framework::context::Context; +use crate::framework::error::GameResult; +use crate::framework::graphics; +use crate::game::frame::Frame; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::{BackgroundType, Stage, StageTexturePaths}; pub struct Background { pub tick: usize, diff --git a/src/components/boss_life_bar.rs b/src/components/boss_life_bar.rs index 62d9e7f..3b48a5f 100644 --- a/src/components/boss_life_bar.rs +++ b/src/components/boss_life_bar.rs @@ -1,11 +1,11 @@ use crate::common::Rect; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::shared_game_state::SharedGameState; +use crate::game::frame::Frame; +use crate::game::shared_game_state::SharedGameState; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; #[derive(Debug, Clone, Copy, PartialEq, Eq)] #[repr(u8)] diff --git a/src/components/credits.rs b/src/components/credits.rs index f7e65ff..49775ac 100644 --- a/src/components/credits.rs +++ b/src/components/credits.rs @@ -1,11 +1,11 @@ use crate::common::{Color, Rect}; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::graphics; -use crate::scripting::tsc::text_script::IllustrationState; -use crate::shared_game_state::SharedGameState; +use crate::game::frame::Frame; +use crate::game::shared_game_state::SharedGameState; +use crate::game::scripting::tsc::text_script::IllustrationState; pub struct Credits {} diff --git a/src/components/draw_common.rs b/src/components/draw_common.rs index 6ca51f1..161bab7 100644 --- a/src/components/draw_common.rs +++ b/src/components/draw_common.rs @@ -1,7 +1,7 @@ use crate::common::Rect; -use crate::shared_game_state::SharedGameState; use crate::framework::context::Context; use crate::framework::error::GameResult; +use crate::game::shared_game_state::SharedGameState; #[derive(Debug, EnumIter, PartialEq, Eq, Hash, Copy, Clone)] pub enum Alignment { diff --git a/src/components/fade.rs b/src/components/fade.rs index e3acb4e..e47c999 100644 --- a/src/components/fade.rs +++ b/src/components/fade.rs @@ -1,9 +1,9 @@ use crate::common::{FadeDirection, FadeState, Rect}; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::shared_game_state::SharedGameState; +use crate::game::frame::Frame; +use crate::game::shared_game_state::SharedGameState; pub struct Fade; diff --git a/src/components/falling_island.rs b/src/components/falling_island.rs index 3bbf8c9..3b690db 100644 --- a/src/components/falling_island.rs +++ b/src/components/falling_island.rs @@ -2,12 +2,12 @@ use std::ops::Deref; use crate::common::{Color, Rect}; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::graphics; -use crate::scripting::tsc::text_script::TextScriptExecutionState; -use crate::shared_game_state::SharedGameState; +use crate::framework::graphics; +use crate::game::frame::Frame; +use crate::game::shared_game_state::SharedGameState; +use crate::game::scripting::tsc::text_script::TextScriptExecutionState; pub struct FallingIsland {} diff --git a/src/components/flash.rs b/src/components/flash.rs index 363d78c..e2d45de 100644 --- a/src/components/flash.rs +++ b/src/components/flash.rs @@ -1,10 +1,10 @@ use crate::common::{Color, Rect}; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::graphics; -use crate::shared_game_state::SharedGameState; +use crate::game::frame::Frame; +use crate::game::shared_game_state::SharedGameState; pub enum FlashState { None, @@ -83,7 +83,7 @@ impl GameEntity<()> for Flash { left: 0, top: ((cen_y - width) * state.scale) as isize, right: (state.canvas_size.0 * state.scale) as isize, - bottom: ((cen_y + width) * state.scale) as isize + bottom: ((cen_y + width) * state.scale) as isize, }; graphics::draw_rect(ctx, rect, WHITE)?; @@ -93,7 +93,7 @@ impl GameEntity<()> for Flash { left: ((cen_x - width) * state.scale) as isize, top: 0, right: ((cen_x + width) * state.scale) as isize, - bottom: (state.canvas_size.1 * state.scale) as isize + bottom: (state.canvas_size.1 * state.scale) as isize, }; graphics::draw_rect(ctx, rect, WHITE)?; diff --git a/src/components/hud.rs b/src/components/hud.rs index c1df946..e167bc3 100644 --- a/src/components/hud.rs +++ b/src/components/hud.rs @@ -1,14 +1,14 @@ use crate::common::Rect; -use crate::components::draw_common::{draw_number, Alignment}; +use crate::components::draw_common::{Alignment, draw_number}; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::graphics::screen_insets_scaled; -use crate::inventory::Inventory; -use crate::player::Player; -use crate::shared_game_state::SharedGameState; -use crate::weapon::WeaponType; +use crate::game::frame::Frame; +use crate::game::inventory::Inventory; +use crate::game::shared_game_state::SharedGameState; +use crate::game::player::Player; +use crate::game::weapon::WeaponType; pub struct HUD { pub alignment: Alignment, diff --git a/src/components/inventory.rs b/src/components/inventory.rs index 0870633..b0c1b07 100644 --- a/src/components/inventory.rs +++ b/src/components/inventory.rs @@ -1,16 +1,16 @@ use crate::common::Rect; -use crate::components::draw_common::{draw_number, Alignment}; +use crate::components::draw_common::{Alignment, draw_number}; use crate::components::hud::HUD; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; +use crate::game::frame::Frame; +use crate::game::inventory::Inventory; +use crate::game::shared_game_state::SharedGameState; use crate::input::touch_controls::TouchControlType; -use crate::inventory::Inventory; -use crate::player::Player; -use crate::scripting::tsc::text_script::{ScriptMode, TextScriptExecutionState}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::{WeaponLevel, WeaponType}; +use crate::game::player::Player; +use crate::game::scripting::tsc::text_script::{ScriptMode, TextScriptExecutionState}; +use crate::game::weapon::{WeaponLevel, WeaponType}; #[derive(Copy, Clone, PartialEq, Eq)] #[repr(u8)] @@ -91,9 +91,9 @@ impl GameEntity<(&mut Context, &mut Player, &mut Inventory, &mut HUD)> for Inven if state.control_flags.control_enabled() && (player.controller.trigger_inventory() - || player.controller.trigger_menu_back() - || (player.controller.trigger_menu_ok() && self.focus == InventoryFocus::Weapons) - || (state.settings.touch_controls && state.touch_controls.consume_click_in(slot_rect))) + || player.controller.trigger_menu_back() + || (player.controller.trigger_menu_ok() && self.focus == InventoryFocus::Weapons) + || (state.settings.touch_controls && state.touch_controls.consume_click_in(slot_rect))) { state.control_flags.set_ok_button_disabled(false); self.exit(state, player, inventory, hud); diff --git a/src/components/map_system.rs b/src/components/map_system.rs index ef53ef2..5dcd93b 100644 --- a/src/components/map_system.rs +++ b/src/components/map_system.rs @@ -4,12 +4,12 @@ use crate::common::{Color, Rect}; use crate::framework::backend::{BackendTexture, SpriteBatchCommand}; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::graphics; +use crate::framework::graphics; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; use crate::input::touch_controls::TouchControlType; -use crate::player::Player; -use crate::scripting::tsc::text_script::TextScriptExecutionState; -use crate::shared_game_state::SharedGameState; -use crate::stage::Stage; +use crate::game::player::Player; +use crate::game::scripting::tsc::text_script::TextScriptExecutionState; #[derive(Copy, Clone, Eq, PartialEq)] pub enum MapSystemState { diff --git a/src/components/nikumaru.rs b/src/components/nikumaru.rs index d4adb09..5604cd0 100644 --- a/src/components/nikumaru.rs +++ b/src/components/nikumaru.rs @@ -1,17 +1,17 @@ -use byteorder::{ReadBytesExt, WriteBytesExt, LE}; +use byteorder::{LE, ReadBytesExt, WriteBytesExt}; use crate::common::Rect; -use crate::components::draw_common::{draw_number, draw_number_zeros, Alignment}; +use crate::components::draw_common::{Alignment, draw_number, draw_number_zeros}; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::filesystem; use crate::framework::vfs::OpenOptions; -use crate::player::Player; -use crate::rng::RNG; -use crate::scripting::tsc::text_script::TextScriptExecutionState; -use crate::shared_game_state::{SharedGameState, TimingMode}; +use crate::game::frame::Frame; +use crate::game::shared_game_state::{SharedGameState, TimingMode}; +use crate::game::player::Player; +use crate::game::scripting::tsc::text_script::TextScriptExecutionState; +use crate::util::rng::RNG; #[derive(Clone, Copy)] pub struct NikumaruCounter { diff --git a/src/components/number_popup.rs b/src/components/number_popup.rs index 001bfa8..9ab5626 100644 --- a/src/components/number_popup.rs +++ b/src/components/number_popup.rs @@ -1,9 +1,9 @@ use crate::common::{interpolate_fix9_scale, Rect}; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::shared_game_state::SharedGameState; +use crate::game::frame::Frame; +use crate::game::shared_game_state::SharedGameState; #[derive(Debug, Copy, Clone)] pub struct NumberPopup { diff --git a/src/components/replay.rs b/src/components/replay.rs index e13d8fd..9d30e5d 100644 --- a/src/components/replay.rs +++ b/src/components/replay.rs @@ -1,17 +1,17 @@ use std::io::{Cursor, Read}; -use byteorder::{ReadBytesExt, WriteBytesExt, LE}; +use byteorder::{LE, ReadBytesExt, WriteBytesExt}; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::filesystem; use crate::framework::keyboard::ScanCode; use crate::framework::vfs::OpenOptions; +use crate::game::frame::Frame; +use crate::game::shared_game_state::{ReplayKind, ReplayState, SharedGameState}; use crate::input::replay_player_controller::{KeyState, ReplayController}; -use crate::player::Player; -use crate::shared_game_state::{ReplayKind, ReplayState, SharedGameState}; +use crate::game::player::Player; #[derive(Clone)] pub struct Replay { diff --git a/src/components/stage_select.rs b/src/components/stage_select.rs index 8320382..cf72294 100644 --- a/src/components/stage_select.rs +++ b/src/components/stage_select.rs @@ -1,13 +1,12 @@ -use crate::framework::context::Context; -use crate::framework::error::GameResult; - use crate::common::Rect; use crate::entity::GameEntity; -use crate::frame::Frame; +use crate::framework::context::Context; +use crate::framework::error::GameResult; +use crate::game::frame::Frame; +use crate::game::shared_game_state::SharedGameState; use crate::input::touch_controls::TouchControlType; -use crate::player::Player; -use crate::shared_game_state::SharedGameState; -use crate::scripting::tsc::text_script::ScriptMode; +use crate::game::player::Player; +use crate::game::scripting::tsc::text_script::ScriptMode; pub struct StageSelect { pub current_teleport_slot: u8, diff --git a/src/components/text_boxes.rs b/src/components/text_boxes.rs index 6d532f6..7093eab 100644 --- a/src/components/text_boxes.rs +++ b/src/components/text_boxes.rs @@ -1,13 +1,12 @@ use crate::common::{Color, Rect}; use crate::engine_constants::AnimatedFace; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::graphics; -use crate::graphics::draw_rect; -use crate::scripting::tsc::text_script::{ConfirmSelection, TextScriptExecutionState, TextScriptLine}; -use crate::shared_game_state::SharedGameState; +use crate::framework::graphics; +use crate::game::frame::Frame; +use crate::game::shared_game_state::SharedGameState; +use crate::game::scripting::tsc::text_script::{ConfirmSelection, TextScriptExecutionState, TextScriptLine}; pub struct TextBoxes { pub slide_in: u8, @@ -284,7 +283,7 @@ impl GameEntity<()> for TextBoxes { }; x += left_pos + text_offset + 14.0; - draw_rect( + graphics::draw_rect( ctx, Rect::new_size( (x * state.scale) as isize, diff --git a/src/components/tilemap.rs b/src/components/tilemap.rs index 5c727eb..b81df41 100644 --- a/src/components/tilemap.rs +++ b/src/components/tilemap.rs @@ -1,9 +1,9 @@ use crate::common::Rect; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::shared_game_state::{SharedGameState, TileSize}; -use crate::stage::{BackgroundType, Stage, StageTexturePaths}; +use crate::game::frame::Frame; +use crate::game::shared_game_state::{SharedGameState, TileSize}; +use crate::game::stage::{BackgroundType, Stage, StageTexturePaths}; pub struct Tilemap { tick: u32, diff --git a/src/components/water_renderer.rs b/src/components/water_renderer.rs index edf8cea..be2da69 100644 --- a/src/components/water_renderer.rs +++ b/src/components/water_renderer.rs @@ -1,18 +1,18 @@ use std::cell::RefCell; use crate::common::{Color, Rect}; -use crate::frame::Frame; use crate::framework::backend::{BackendShader, SpriteBatchCommand, VertexData}; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::graphics; -use crate::graphics::BlendMode; -use crate::map::{WaterParamEntry, WaterParams, WaterRegionType}; -use crate::npc::list::NPCList; -use crate::physics::PhysicalEntity; -use crate::player::Player; -use crate::shared_game_state::SharedGameState; -use crate::stage::{BackgroundType, Stage}; +use crate::framework::graphics::BlendMode; +use crate::game::frame::Frame; +use crate::game::map::{WaterParamEntry, WaterParams, WaterRegionType}; +use crate::game::physics::PhysicalEntity; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::{BackgroundType, Stage}; +use crate::game::npc::list::NPCList; +use crate::game::player::Player; const TENSION: f32 = 0.03; const DAMPENING: f32 = 0.01; diff --git a/src/components/whimsical_star.rs b/src/components/whimsical_star.rs index ca16b8f..7a836a8 100644 --- a/src/components/whimsical_star.rs +++ b/src/components/whimsical_star.rs @@ -1,11 +1,11 @@ -use crate::common::{interpolate_fix9_scale, Direction, Rect}; +use crate::common::{Direction, interpolate_fix9_scale, Rect}; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::player::{Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::{Bullet, BulletManager}; +use crate::game::frame::Frame; +use crate::game::shared_game_state::SharedGameState; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::weapon::bullet::{Bullet, BulletManager}; pub struct WhimsicalStar { pub star: [Star; 3], diff --git a/src/editor/mod.rs b/src/editor/mod.rs index 0520c5b..9a02060 100644 --- a/src/editor/mod.rs +++ b/src/editor/mod.rs @@ -4,12 +4,12 @@ use std::rc::Rc; use imgui::{Image, MouseButton, Window, WindowFlags}; +use crate::{Context, GameResult, graphics, I_MAG, SharedGameState}; use crate::common::{Color, Rect}; use crate::components::background::Background; use crate::components::tilemap::{TileLayer, Tilemap}; -use crate::frame::Frame; -use crate::stage::{Stage, StageTexturePaths}; -use crate::{graphics, Context, GameResult, SharedGameState, I_MAG}; +use crate::game::frame::Frame; +use crate::game::stage::{Stage, StageTexturePaths}; #[derive(Copy, Clone, Eq, PartialEq)] pub enum CurrentTool { diff --git a/src/engine_constants/mod.rs b/src/engine_constants/mod.rs index 2b1085b..3292517 100644 --- a/src/engine_constants/mod.rs +++ b/src/engine_constants/mod.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use std::io::{BufRead, BufReader, Cursor, Read}; -use byteorder::{ReadBytesExt, LE}; +use byteorder::{LE, ReadBytesExt}; use case_insensitive_hashmap::CaseInsensitiveHashMap; use xmltree::Element; @@ -12,11 +12,11 @@ use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::filesystem; use crate::framework::gamepad::{Axis, Button}; +use crate::game::settings::Settings; +use crate::game::shared_game_state::{FontData, Season}; use crate::i18n::Locale; -use crate::player::ControlMode; -use crate::scripting::tsc::text_script::TextScriptEncoding; -use crate::settings::Settings; -use crate::shared_game_state::{FontData, Season}; +use crate::game::player::ControlMode; +use crate::game::scripting::tsc::text_script::TextScriptEncoding; use crate::sound::pixtone::{Channel, Envelope, PixToneParameters, Waveform}; use crate::sound::SoundManager; diff --git a/src/engine_constants/npcs.rs b/src/engine_constants/npcs.rs index 00bb481..aeff306 100644 --- a/src/engine_constants/npcs.rs +++ b/src/engine_constants/npcs.rs @@ -2,8 +2,8 @@ use std::fmt::Debug; use std::marker::PhantomData; use std::ops::Index; -use serde::de::{Error, SeqAccess, Visitor}; use serde::{Deserialize, Deserializer, Serialize}; +use serde::de::{Error, SeqAccess, Visitor}; use crate::common::Rect; use crate::macros::fmt::Formatter; @@ -14,8 +14,8 @@ pub struct SafeNPCRect(pub [Rect; T]); impl Serialize for SafeNPCRect { #[inline] fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, + where + S: serde::Serializer, { self.0.serialize(serializer) } @@ -31,8 +31,8 @@ impl<'de, const T: usize> Visitor<'de> for SafeNPCRectArrayVisitor { } fn visit_seq(self, mut seq: A) -> Result - where - A: SeqAccess<'de>, + where + A: SeqAccess<'de>, { let mut rects = [Rect::default(); T]; for (i, rect) in rects.iter_mut().enumerate() { @@ -46,8 +46,8 @@ impl<'de, const T: usize> Visitor<'de> for SafeNPCRectArrayVisitor { impl<'de, const T: usize> Deserialize<'de> for SafeNPCRect { fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, + where + D: Deserializer<'de>, { deserializer.deserialize_seq(SafeNPCRectArrayVisitor(PhantomData)).map(SafeNPCRect) } diff --git a/src/entity.rs b/src/entity.rs index c4e37a5..7d91d34 100644 --- a/src/entity.rs +++ b/src/entity.rs @@ -1,8 +1,8 @@ use crate::common::interpolate_fix9_scale; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::shared_game_state::SharedGameState; +use crate::game::frame::Frame; +use crate::game::shared_game_state::SharedGameState; pub trait GameEntity { fn tick(&mut self, state: &mut SharedGameState, custom: C) -> GameResult; diff --git a/src/exe_parser.rs b/src/exe_parser.rs deleted file mode 100644 index 0ac2668..0000000 --- a/src/exe_parser.rs +++ /dev/null @@ -1,127 +0,0 @@ -use std::ops::Range; - -use pelite::{ - image::RT_BITMAP, - pe32::{headers::SectionHeaders, Pe, PeFile}, - resources::{Directory, Entry, Name, Resources}, -}; - -use crate::framework::error::{GameError::ParseError, GameResult}; - -#[derive(Debug)] -pub struct DataFile { - pub bytes: Vec, - pub name: String, -} - -impl DataFile { - pub fn from(name: String, bytes: Vec) -> Self { - Self { name, bytes } - } -} - -#[derive(Debug)] -pub struct ExeResourceDirectory { - pub name: String, - pub data_files: Vec, -} - -impl ExeResourceDirectory { - pub fn new(name: String) -> Self { - Self { name, data_files: Vec::new() } - } -} - -pub struct ExeParser<'a> { - pub resources: Resources<'a>, - pub section_headers: Box<&'a SectionHeaders>, -} - -impl<'a> ExeParser<'a> { - pub fn from(file: &'a Vec) -> GameResult { - let pe = PeFile::from_bytes(file); - - return match pe { - Ok(pe) => { - let resources = pe.resources(); - - if resources.is_err() { - return Err(ParseError("Failed to parse resources.".to_string())); - } - - let section_headers = pe.section_headers(); - - Ok(Self { resources: resources.unwrap(), section_headers: Box::new(section_headers) }) - } - Err(_) => Err(ParseError("Failed to parse PE file".to_string())), - }; - } - - pub fn get_resource_dir(&self, name: String) -> GameResult { - let mut dir_data = ExeResourceDirectory::new(name.to_owned()); - - let path = format!("/{}", name.to_owned()); - let dir = self.resources.find_dir(&path); - - return match dir { - Ok(dir) => { - self.read_dir(dir, &mut dir_data, "unknown".to_string()); - Ok(dir_data) - } - Err(_) => return Err(ParseError("Failed to find resource directory.".to_string())), - }; - } - - pub fn get_bitmap_dir(&self) -> GameResult { - let mut dir_data = ExeResourceDirectory::new("Bitmap".to_string()); - - let root = self.resources.root().unwrap(); - let dir = root.get_dir(Name::Id(RT_BITMAP.into())); - - return match dir { - Ok(dir) => { - self.read_dir(dir, &mut dir_data, "unknown".to_string()); - Ok(dir_data) - } - Err(_) => return Err(ParseError("Failed to open bitmap directory.".to_string())), - }; - } - - pub fn get_named_section_byte_range(&self, name: String) -> GameResult>> { - let section_header = self.section_headers.by_name(name.as_bytes()); - return match section_header { - Some(section_header) => Ok(Some(section_header.file_range())), - None => Ok(None), - }; - } - - fn read_dir(&self, directory: Directory, dir_data: &mut ExeResourceDirectory, last_dir_name: String) { - for dir in directory.entries() { - let raw_entry = dir.entry(); - - if raw_entry.is_err() { - continue; - } - - if let Entry::Directory(entry) = raw_entry.unwrap() { - let dir_name = dir.name(); - let name = match dir_name { - Ok(name) => name.to_string(), - Err(_) => last_dir_name.to_owned(), - }; - self.read_dir(entry, dir_data, name); - } - - if let Entry::DataEntry(entry) = raw_entry.unwrap() { - let entry_bytes = entry.bytes(); - if entry_bytes.is_err() { - continue; - } - - let bytes = entry_bytes.unwrap(); - let data_file = DataFile::from(last_dir_name.to_owned(), bytes.to_vec()); - dir_data.data_files.push(data_file); - } - } - } -} diff --git a/src/framework/backend.rs b/src/framework/backend.rs index fe7808a..f1b1886 100644 --- a/src/framework/backend.rs +++ b/src/framework/backend.rs @@ -1,12 +1,12 @@ -use imgui::DrawData; use std::any::Any; +use imgui::DrawData; + use crate::common::{Color, Rect}; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::framework::graphics::BlendMode; -use crate::graphics::VSyncMode; -use crate::Game; +use crate::framework::graphics::{BlendMode, VSyncMode}; +use crate::game::Game; #[repr(C)] #[derive(Copy, Clone)] @@ -102,14 +102,14 @@ pub fn init_backend(headless: bool, size_hint: (u16, u16)) -> GameResult - { - state_ref.shutdown(); - } + if window_id == window.window().id() => + { + state_ref.shutdown(); + } Event::Resumed => { { let mut mutex = GAME_SUSPENDED.lock().unwrap(); @@ -187,74 +187,74 @@ impl BackendEventLoop for GlutinEventLoop { } #[cfg(target_os = "android")] - unsafe { + unsafe { window.surface_destroyed(); } state_ref.sound_manager.pause(); } Event::WindowEvent { event: WindowEvent::Resized(size), window_id } - if window_id == window.window().id() => - { - if let Some(renderer) = &ctx.renderer { - if let Ok(imgui) = renderer.imgui() { - imgui.io_mut().display_size = [size.width as f32, size.height as f32]; + if window_id == window.window().id() => + { + if let Some(renderer) = &ctx.renderer { + if let Ok(imgui) = renderer.imgui() { + imgui.io_mut().display_size = [size.width as f32, size.height as f32]; + } + + ctx.real_screen_size = (size.width, size.height); + ctx.screen_size = get_scaled_size(size.width.max(1), size.height.max(1)); + state_ref.handle_resize(ctx).unwrap(); } - - ctx.real_screen_size = (size.width, size.height); - ctx.screen_size = get_scaled_size(size.width.max(1), size.height.max(1)); - state_ref.handle_resize(ctx).unwrap(); } - } Event::WindowEvent { event: WindowEvent::Touch(touch), window_id } - if window_id == window.window().id() => - { - let mut controls = &mut state_ref.touch_controls; - let scale = state_ref.scale as f64; - let loc_x = (touch.location.x * ctx.screen_size.0 as f64 / ctx.real_screen_size.0 as f64) / scale; - let loc_y = (touch.location.y * ctx.screen_size.1 as f64 / ctx.real_screen_size.1 as f64) / scale; + if window_id == window.window().id() => + { + let mut controls = &mut state_ref.touch_controls; + let scale = state_ref.scale as f64; + let loc_x = (touch.location.x * ctx.screen_size.0 as f64 / ctx.real_screen_size.0 as f64) / scale; + let loc_y = (touch.location.y * ctx.screen_size.1 as f64 / ctx.real_screen_size.1 as f64) / scale; - match touch.phase { - TouchPhase::Started | TouchPhase::Moved => { - if let Some(point) = controls.points.iter_mut().find(|p| p.id == touch.id) { - point.last_position = point.position; - point.position = (loc_x, loc_y); - } else { - controls.touch_id_counter = controls.touch_id_counter.wrapping_add(1); + match touch.phase { + TouchPhase::Started | TouchPhase::Moved => { + if let Some(point) = controls.points.iter_mut().find(|p| p.id == touch.id) { + point.last_position = point.position; + point.position = (loc_x, loc_y); + } else { + controls.touch_id_counter = controls.touch_id_counter.wrapping_add(1); - let point = TouchPoint { - id: touch.id, - touch_id: controls.touch_id_counter, - position: (loc_x, loc_y), - last_position: (0.0, 0.0), - }; - controls.points.push(point); + let point = TouchPoint { + id: touch.id, + touch_id: controls.touch_id_counter, + position: (loc_x, loc_y), + last_position: (0.0, 0.0), + }; + controls.points.push(point); - if touch.phase == TouchPhase::Started { - controls.clicks.push(point); + if touch.phase == TouchPhase::Started { + controls.clicks.push(point); + } } } - } - TouchPhase::Ended | TouchPhase::Cancelled => { - controls.points.retain(|p| p.id != touch.id); - controls.clicks.retain(|p| p.id != touch.id); + TouchPhase::Ended | TouchPhase::Cancelled => { + controls.points.retain(|p| p.id != touch.id); + controls.clicks.retain(|p| p.id != touch.id); + } } } - } Event::WindowEvent { event: WindowEvent::KeyboardInput { input, .. }, window_id } - if window_id == window.window().id() => - { - if let Some(keycode) = input.virtual_keycode { - if let Some(drs_scan) = conv_keycode(keycode) { - let key_state = match input.state { - ElementState::Pressed => true, - ElementState::Released => false, - }; + if window_id == window.window().id() => + { + if let Some(keycode) = input.virtual_keycode { + if let Some(drs_scan) = conv_keycode(keycode) { + let key_state = match input.state { + ElementState::Pressed => true, + ElementState::Released => false, + }; - ctx.keyboard_context.set_key(drs_scan, key_state); + ctx.keyboard_context.set_key(drs_scan, key_state); + } } } - } Event::RedrawRequested(id) if id == window.window().id() => { { let mutex = GAME_SUSPENDED.lock().unwrap(); @@ -264,16 +264,16 @@ impl BackendEventLoop for GlutinEventLoop { } #[cfg(not(target_os = "android"))] - { - if let Err(err) = game.draw(ctx) { - log::error!("Failed to draw frame: {}", err); + { + if let Err(err) = game.draw(ctx) { + log::error!("Failed to draw frame: {}", err); + } + + window.window().request_redraw(); } - window.window().request_redraw(); - } - #[cfg(target_os = "android")] - request_android_redraw(); + request_android_redraw(); } Event::MainEventsCleared => { if state_ref.shutdown { @@ -292,20 +292,20 @@ impl BackendEventLoop for GlutinEventLoop { game.update(ctx).unwrap(); #[cfg(target_os = "android")] - { - match get_insets() { - Ok(insets) => { - ctx.screen_insets = insets; + { + match get_insets() { + Ok(insets) => { + ctx.screen_insets = insets; + } + Err(e) => { + log::error!("Failed to update insets: {}", e); + } } - Err(e) => { - log::error!("Failed to update insets: {}", e); - } - } - if let Err(err) = game.draw(ctx) { - log::error!("Failed to draw frame: {}", err); + if let Err(err) = game.draw(ctx) { + log::error!("Failed to draw frame: {}", err); + } } - } if state_ref.next_scene.is_some() { mem::swap(&mut game.scene, &mut state_ref.next_scene); @@ -320,7 +320,7 @@ impl BackendEventLoop for GlutinEventLoop { }); } - fn new_renderer(&self, _ctx: *mut Context) -> GameResult> { + fn new_renderer(&self, ctx: *mut Context) -> GameResult> { let mut imgui = imgui::Context::create(); imgui.io_mut().display_size = [640.0, 480.0]; @@ -359,7 +359,7 @@ impl BackendEventLoop for GlutinEventLoop { *user_data = Rc::into_raw(refs) as *mut c_void; } - let gl_context = GLContext { gles2_mode: true, get_proc_address, swap_buffers, user_data }; + let gl_context = GLContext { gles2_mode: true, is_sdl: false, get_proc_address, swap_buffers, user_data, ctx }; Ok(Box::new(OpenGLRenderer::new(gl_context, UnsafeCell::new(imgui)))) } diff --git a/src/framework/backend_null.rs b/src/framework/backend_null.rs index 3ff2ee3..4b41b6b 100644 --- a/src/framework/backend_null.rs +++ b/src/framework/backend_null.rs @@ -11,7 +11,7 @@ use crate::framework::backend::{ use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::graphics::BlendMode; -use crate::Game; +use crate::game::Game; pub struct NullBackend; diff --git a/src/framework/backend_sdl2.rs b/src/framework/backend_sdl2.rs index 025cc7b..cdb8192 100644 --- a/src/framework/backend_sdl2.rs +++ b/src/framework/backend_sdl2.rs @@ -7,9 +7,10 @@ use std::ptr::{null, null_mut}; use std::rc::Rc; use std::time::{Duration, Instant}; +use imgui::{ConfigFlags, DrawCmd, DrawData, DrawIdx, DrawVert, Key, MouseCursor, TextureId, Ui}; use imgui::internal::RawWrapper; use imgui::sys::{ImGuiKey_Backspace, ImGuiKey_Delete, ImGuiKey_Enter}; -use imgui::{ConfigFlags, DrawCmd, DrawData, DrawIdx, DrawVert, Key, MouseCursor, TextureId, Ui}; +use sdl2::{controller, EventPump, GameControllerSubsystem, keyboard, pixels, Sdl, VideoSubsystem}; use sdl2::controller::GameController; use sdl2::event::{Event, WindowEvent}; use sdl2::keyboard::Scancode; @@ -19,7 +20,6 @@ use sdl2::render::{Texture, TextureCreator, TextureQuery, WindowCanvas}; use sdl2::video::GLProfile; use sdl2::video::Window; use sdl2::video::WindowContext; -use sdl2::{controller, keyboard, pixels, EventPump, GameControllerSubsystem, Sdl, VideoSubsystem}; use crate::common::{Color, Rect}; use crate::framework::backend::{ @@ -27,18 +27,15 @@ use crate::framework::backend::{ }; use crate::framework::context::Context; use crate::framework::error::{GameError, GameResult}; +use crate::framework::filesystem; use crate::framework::gamepad::{Axis, Button}; use crate::framework::graphics::BlendMode; use crate::framework::keyboard::ScanCode; use crate::framework::render_opengl::{GLContext, OpenGLRenderer}; use crate::framework::ui::init_imgui; -use crate::graphics::VSyncMode; -use crate::shared_game_state::WindowMode; -use crate::Game; -use crate::GameError::RenderError; -use crate::GAME_SUSPENDED; - -use super::filesystem; +use crate::game::Game; +use crate::game::GAME_SUSPENDED; +use crate::game::shared_game_state::WindowMode; pub struct SDL2Backend { context: Sdl, @@ -170,7 +167,7 @@ impl SDL2EventLoop { window.resizable(); #[cfg(feature = "render-opengl")] - window.opengl(); + window.opengl(); let window = window.build().map_err(|e| GameError::WindowError(e.to_string()))?; let opengl_available = if let Ok(v) = std::env::var("CAVESTORY_NO_OPENGL") { v != "1" } else { true }; @@ -212,7 +209,7 @@ impl BackendEventLoop for SDL2EventLoop { loop { #[cfg(target_os = "macos")] - unsafe { + unsafe { use objc::*; // no UB: fields are initialized by SDL_GetWindowWMInfo @@ -409,19 +406,19 @@ impl BackendEventLoop for SDL2EventLoop { fn new_renderer(&self, ctx: *mut Context) -> GameResult> { #[cfg(feature = "render-opengl")] - { - let mut refs = self.refs.borrow_mut(); - match refs.window.window().gl_create_context() { - Ok(gl_ctx) => { - refs.window.window().gl_make_current(&gl_ctx).map_err(|e| GameError::RenderError(e.to_string()))?; - refs.gl_context = Some(gl_ctx); - } - Err(err) => { - *self.opengl_available.borrow_mut() = false; - log::error!("Failed to initialize OpenGL context, falling back to SDL2 renderer: {}", err); + { + let mut refs = self.refs.borrow_mut(); + match refs.window.window().gl_create_context() { + Ok(gl_ctx) => { + refs.window.window().gl_make_current(&gl_ctx).map_err(|e| GameError::RenderError(e.to_string()))?; + refs.gl_context = Some(gl_ctx); + } + Err(err) => { + *self.opengl_available.borrow_mut() = false; + log::error!("Failed to initialize OpenGL context, falling back to SDL2 renderer: {}", err); + } } } - } #[cfg(feature = "render-opengl")] if *self.opengl_available.borrow() { @@ -671,7 +668,7 @@ impl BackendRenderer for SDL2Renderer { let sdl2_texture = texture .as_any() .downcast_ref::() - .ok_or(RenderError("This texture was not created by SDL2 backend.".to_string()))?; + .ok_or(GameError::RenderError("This texture was not created by SDL2 backend.".to_string()))?; unsafe { if let Some(target) = &sdl2_texture.texture { @@ -866,7 +863,7 @@ impl BackendRenderer for SDL2Renderer { texture .as_any() .downcast_ref::() - .ok_or(RenderError("This texture was not created by SDL2 backend.".to_string()))? + .ok_or(GameError::RenderError("This texture was not created by SDL2 backend.".to_string()))? .texture .as_ref() .map_or(null_mut(), |t| t.raw()) diff --git a/src/framework/context.rs b/src/framework/context.rs index fbaa40b..2a06c32 100644 --- a/src/framework/context.rs +++ b/src/framework/context.rs @@ -1,10 +1,10 @@ -use crate::framework::backend::{init_backend, BackendRenderer}; +use crate::framework::backend::{BackendRenderer, init_backend}; use crate::framework::error::GameResult; use crate::framework::filesystem::Filesystem; use crate::framework::gamepad::GamepadContext; +use crate::framework::graphics::VSyncMode; use crate::framework::keyboard::KeyboardContext; -use crate::graphics::VSyncMode; -use crate::Game; +use crate::game::Game; pub struct Context { pub headless: bool, diff --git a/src/framework/error.rs b/src/framework/error.rs index 3b3769c..b1f27a2 100644 --- a/src/framework/error.rs +++ b/src/framework/error.rs @@ -3,8 +3,8 @@ use std::error::Error; use std::fmt; use std::string::FromUtf8Error; -use std::sync::mpsc::SendError; use std::sync::{Arc, PoisonError}; +use std::sync::mpsc::SendError; /// An enum containing all kinds of game framework errors. #[derive(Debug, Clone)] diff --git a/src/framework/filesystem.rs b/src/framework/filesystem.rs index 544d358..f2fd53b 100644 --- a/src/framework/filesystem.rs +++ b/src/framework/filesystem.rs @@ -160,7 +160,7 @@ impl Filesystem { pub(crate) fn user_read_dir>( &self, path: P, - ) -> GameResult>> { + ) -> GameResult>> { let itr = self .user_vfs .read_dir(path.as_ref())? @@ -175,7 +175,7 @@ impl Filesystem { pub(crate) fn read_dir>( &self, path: P, - ) -> GameResult>> { + ) -> GameResult>> { let itr = self .vfs .read_dir(path.as_ref())? @@ -303,7 +303,7 @@ pub fn user_is_dir>(ctx: &Context, path: P) -> bool { pub fn user_read_dir>( ctx: &Context, path: P, -) -> GameResult>> { +) -> GameResult>> { ctx.filesystem.user_read_dir(path) } @@ -339,7 +339,7 @@ pub fn is_dir>(ctx: &Context, path: P) -> bool { /// in no particular order. /// /// Lists the base directory if an empty path is given. -pub fn read_dir>(ctx: &Context, path: P) -> GameResult>> { +pub fn read_dir>(ctx: &Context, path: P) -> GameResult>> { ctx.filesystem.read_dir(path) } @@ -347,7 +347,7 @@ pub fn read_dir_find>( ctx: &Context, roots: &Vec, path: P, -) -> GameResult>> { +) -> GameResult>> { let mut files = Vec::new(); for root in roots { diff --git a/src/framework/gamepad.rs b/src/framework/gamepad.rs index f711fb7..384761e 100644 --- a/src/framework/gamepad.rs +++ b/src/framework/gamepad.rs @@ -3,10 +3,9 @@ use std::collections::{HashMap, HashSet}; use sdl2::controller::GameController; use serde::{Deserialize, Serialize}; -use crate::shared_game_state::SharedGameState; use crate::{common::Rect, engine_constants::EngineConstants, framework::context::Context}; - use crate::framework::error::GameResult; +use crate::game::shared_game_state::SharedGameState; const QUAKE_RUMBLE_LOW_FREQ: u16 = 0x3000; const QUAKE_RUMBLE_HI_FREQ: u16 = 0; diff --git a/src/framework/gl.rs b/src/framework/gl.rs index 56f6e20..93abc2d 100644 --- a/src/framework/gl.rs +++ b/src/framework/gl.rs @@ -1,83 +1,84 @@ +mod __gl_imports { + pub use std::marker::Send; + pub use std::mem; + pub use std::os::raw; +} - mod __gl_imports { - pub use std::mem; - pub use std::marker::Send; - pub use std::os::raw; - } - - pub mod types { - #![allow(non_camel_case_types, non_snake_case, dead_code, missing_copy_implementations)] - -// Common types from OpenGL 1.1 -pub type GLenum = super::__gl_imports::raw::c_uint; -pub type GLboolean = super::__gl_imports::raw::c_uchar; -pub type GLbitfield = super::__gl_imports::raw::c_uint; -pub type GLvoid = super::__gl_imports::raw::c_void; -pub type GLbyte = super::__gl_imports::raw::c_char; -pub type GLshort = super::__gl_imports::raw::c_short; -pub type GLint = super::__gl_imports::raw::c_int; -pub type GLclampx = super::__gl_imports::raw::c_int; -pub type GLubyte = super::__gl_imports::raw::c_uchar; -pub type GLushort = super::__gl_imports::raw::c_ushort; -pub type GLuint = super::__gl_imports::raw::c_uint; -pub type GLsizei = super::__gl_imports::raw::c_int; -pub type GLfloat = super::__gl_imports::raw::c_float; -pub type GLclampf = super::__gl_imports::raw::c_float; -pub type GLdouble = super::__gl_imports::raw::c_double; -pub type GLclampd = super::__gl_imports::raw::c_double; -pub type GLeglImageOES = *const super::__gl_imports::raw::c_void; -pub type GLchar = super::__gl_imports::raw::c_char; -pub type GLcharARB = super::__gl_imports::raw::c_char; +pub mod types { + #![allow(non_camel_case_types, non_snake_case, dead_code, missing_copy_implementations)] -#[cfg(target_os = "macos")] -pub type GLhandleARB = *const super::__gl_imports::raw::c_void; -#[cfg(not(target_os = "macos"))] -pub type GLhandleARB = super::__gl_imports::raw::c_uint; + // Common types from OpenGL 1.1 + pub type GLenum = super::__gl_imports::raw::c_uint; + pub type GLboolean = super::__gl_imports::raw::c_uchar; + pub type GLbitfield = super::__gl_imports::raw::c_uint; + pub type GLvoid = super::__gl_imports::raw::c_void; + pub type GLbyte = super::__gl_imports::raw::c_char; + pub type GLshort = super::__gl_imports::raw::c_short; + pub type GLint = super::__gl_imports::raw::c_int; + pub type GLclampx = super::__gl_imports::raw::c_int; + pub type GLubyte = super::__gl_imports::raw::c_uchar; + pub type GLushort = super::__gl_imports::raw::c_ushort; + pub type GLuint = super::__gl_imports::raw::c_uint; + pub type GLsizei = super::__gl_imports::raw::c_int; + pub type GLfloat = super::__gl_imports::raw::c_float; + pub type GLclampf = super::__gl_imports::raw::c_float; + pub type GLdouble = super::__gl_imports::raw::c_double; + pub type GLclampd = super::__gl_imports::raw::c_double; + pub type GLeglImageOES = *const super::__gl_imports::raw::c_void; + pub type GLchar = super::__gl_imports::raw::c_char; + pub type GLcharARB = super::__gl_imports::raw::c_char; -pub type GLhalfARB = super::__gl_imports::raw::c_ushort; -pub type GLhalf = super::__gl_imports::raw::c_ushort; + #[cfg(target_os = "macos")] + pub type GLhandleARB = *const super::__gl_imports::raw::c_void; + #[cfg(not(target_os = "macos"))] + pub type GLhandleARB = super::__gl_imports::raw::c_uint; -// Must be 32 bits -pub type GLfixed = GLint; + pub type GLhalfARB = super::__gl_imports::raw::c_ushort; + pub type GLhalf = super::__gl_imports::raw::c_ushort; -pub type GLintptr = isize; -pub type GLsizeiptr = isize; -pub type GLint64 = i64; -pub type GLuint64 = u64; -pub type GLintptrARB = isize; -pub type GLsizeiptrARB = isize; -pub type GLint64EXT = i64; -pub type GLuint64EXT = u64; + // Must be 32 bits + pub type GLfixed = GLint; -pub enum __GLsync {} -pub type GLsync = *const __GLsync; + pub type GLintptr = isize; + pub type GLsizeiptr = isize; + pub type GLint64 = i64; + pub type GLuint64 = u64; + pub type GLintptrARB = isize; + pub type GLsizeiptrARB = isize; + pub type GLint64EXT = i64; + pub type GLuint64EXT = u64; -// compatible with OpenCL cl_context -pub enum _cl_context {} -pub enum _cl_event {} + pub enum __GLsync {} -pub type GLDEBUGPROC = Option; -pub type GLDEBUGPROCARB = Option; -pub type GLDEBUGPROCKHR = Option; + pub type GLsync = *const __GLsync; + + // compatible with OpenCL cl_context + pub enum _cl_context {} + + pub enum _cl_event {} + + pub type GLDEBUGPROC = Option; + pub type GLDEBUGPROCARB = Option; + pub type GLDEBUGPROCKHR = Option; // GLES 1 types // "pub type GLclampx = i32;", @@ -108,1858 +109,2727 @@ pub type GLDEBUGPROCKHR = Option; -pub type GLhalfNV = super::__gl_imports::raw::c_ushort; -pub type GLvdpauSurfaceNV = GLintptr; - + // Vendor extension types + pub type GLDEBUGPROCAMD = Option; + pub type GLhalfNV = super::__gl_imports::raw::c_ushort; + pub type GLvdpauSurfaceNV = GLintptr; } -#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_ATTRIBUTES: types::GLenum = 0x8B89; -#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_ATTRIBUTE_MAX_LENGTH: types::GLenum = 0x8B8A; -#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_TEXTURE: types::GLenum = 0x84E0; -#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_UNIFORMS: types::GLenum = 0x8B86; -#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_UNIFORM_BLOCKS: types::GLenum = 0x8A36; -#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: types::GLenum = 0x8A35; -#[allow(dead_code, non_upper_case_globals)] pub const ACTIVE_UNIFORM_MAX_LENGTH: types::GLenum = 0x8B87; -#[allow(dead_code, non_upper_case_globals)] pub const ALIASED_LINE_WIDTH_RANGE: types::GLenum = 0x846E; -#[allow(dead_code, non_upper_case_globals)] pub const ALIASED_POINT_SIZE_RANGE: types::GLenum = 0x846D; -#[allow(dead_code, non_upper_case_globals)] pub const ALPHA: types::GLenum = 0x1906; -#[allow(dead_code, non_upper_case_globals)] pub const ALPHA_BITS: types::GLenum = 0x0D55; -#[allow(dead_code, non_upper_case_globals)] pub const ALREADY_SIGNALED: types::GLenum = 0x911A; -#[allow(dead_code, non_upper_case_globals)] pub const ALWAYS: types::GLenum = 0x0207; -#[allow(dead_code, non_upper_case_globals)] pub const ANY_SAMPLES_PASSED: types::GLenum = 0x8C2F; -#[allow(dead_code, non_upper_case_globals)] pub const ANY_SAMPLES_PASSED_CONSERVATIVE: types::GLenum = 0x8D6A; -#[allow(dead_code, non_upper_case_globals)] pub const ARRAY_BUFFER: types::GLenum = 0x8892; -#[allow(dead_code, non_upper_case_globals)] pub const ARRAY_BUFFER_BINDING: types::GLenum = 0x8894; -#[allow(dead_code, non_upper_case_globals)] pub const ATTACHED_SHADERS: types::GLenum = 0x8B85; -#[allow(dead_code, non_upper_case_globals)] pub const BACK: types::GLenum = 0x0405; -#[allow(dead_code, non_upper_case_globals)] pub const BLEND: types::GLenum = 0x0BE2; -#[allow(dead_code, non_upper_case_globals)] pub const BLEND_COLOR: types::GLenum = 0x8005; -#[allow(dead_code, non_upper_case_globals)] pub const BLEND_DST_ALPHA: types::GLenum = 0x80CA; -#[allow(dead_code, non_upper_case_globals)] pub const BLEND_DST_RGB: types::GLenum = 0x80C8; -#[allow(dead_code, non_upper_case_globals)] pub const BLEND_EQUATION: types::GLenum = 0x8009; -#[allow(dead_code, non_upper_case_globals)] pub const BLEND_EQUATION_ALPHA: types::GLenum = 0x883D; -#[allow(dead_code, non_upper_case_globals)] pub const BLEND_EQUATION_RGB: types::GLenum = 0x8009; -#[allow(dead_code, non_upper_case_globals)] pub const BLEND_SRC_ALPHA: types::GLenum = 0x80CB; -#[allow(dead_code, non_upper_case_globals)] pub const BLEND_SRC_RGB: types::GLenum = 0x80C9; -#[allow(dead_code, non_upper_case_globals)] pub const BLUE: types::GLenum = 0x1905; -#[allow(dead_code, non_upper_case_globals)] pub const BLUE_BITS: types::GLenum = 0x0D54; -#[allow(dead_code, non_upper_case_globals)] pub const BOOL: types::GLenum = 0x8B56; -#[allow(dead_code, non_upper_case_globals)] pub const BOOL_VEC2: types::GLenum = 0x8B57; -#[allow(dead_code, non_upper_case_globals)] pub const BOOL_VEC3: types::GLenum = 0x8B58; -#[allow(dead_code, non_upper_case_globals)] pub const BOOL_VEC4: types::GLenum = 0x8B59; -#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_ACCESS_FLAGS: types::GLenum = 0x911F; -#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_MAPPED: types::GLenum = 0x88BC; -#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_MAP_LENGTH: types::GLenum = 0x9120; -#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_MAP_OFFSET: types::GLenum = 0x9121; -#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_MAP_POINTER: types::GLenum = 0x88BD; -#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_SIZE: types::GLenum = 0x8764; -#[allow(dead_code, non_upper_case_globals)] pub const BUFFER_USAGE: types::GLenum = 0x8765; -#[allow(dead_code, non_upper_case_globals)] pub const BYTE: types::GLenum = 0x1400; -#[allow(dead_code, non_upper_case_globals)] pub const CCW: types::GLenum = 0x0901; -#[allow(dead_code, non_upper_case_globals)] pub const CLAMP_TO_EDGE: types::GLenum = 0x812F; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR: types::GLenum = 0x1800; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT0: types::GLenum = 0x8CE0; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT1: types::GLenum = 0x8CE1; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT10: types::GLenum = 0x8CEA; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT11: types::GLenum = 0x8CEB; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT12: types::GLenum = 0x8CEC; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT13: types::GLenum = 0x8CED; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT14: types::GLenum = 0x8CEE; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT15: types::GLenum = 0x8CEF; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT16: types::GLenum = 0x8CF0; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT17: types::GLenum = 0x8CF1; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT18: types::GLenum = 0x8CF2; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT19: types::GLenum = 0x8CF3; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT2: types::GLenum = 0x8CE2; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT20: types::GLenum = 0x8CF4; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT21: types::GLenum = 0x8CF5; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT22: types::GLenum = 0x8CF6; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT23: types::GLenum = 0x8CF7; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT24: types::GLenum = 0x8CF8; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT25: types::GLenum = 0x8CF9; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT26: types::GLenum = 0x8CFA; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT27: types::GLenum = 0x8CFB; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT28: types::GLenum = 0x8CFC; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT29: types::GLenum = 0x8CFD; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT3: types::GLenum = 0x8CE3; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT30: types::GLenum = 0x8CFE; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT31: types::GLenum = 0x8CFF; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT4: types::GLenum = 0x8CE4; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT5: types::GLenum = 0x8CE5; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT6: types::GLenum = 0x8CE6; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT7: types::GLenum = 0x8CE7; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT8: types::GLenum = 0x8CE8; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_ATTACHMENT9: types::GLenum = 0x8CE9; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_BUFFER_BIT: types::GLenum = 0x00004000; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_CLEAR_VALUE: types::GLenum = 0x0C22; -#[allow(dead_code, non_upper_case_globals)] pub const COLOR_WRITEMASK: types::GLenum = 0x0C23; -#[allow(dead_code, non_upper_case_globals)] pub const COMPARE_REF_TO_TEXTURE: types::GLenum = 0x884E; -#[allow(dead_code, non_upper_case_globals)] pub const COMPILE_STATUS: types::GLenum = 0x8B81; -#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_R11_EAC: types::GLenum = 0x9270; -#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_RG11_EAC: types::GLenum = 0x9272; -#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_RGB8_ETC2: types::GLenum = 0x9274; -#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: types::GLenum = 0x9276; -#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_RGBA8_ETC2_EAC: types::GLenum = 0x9278; -#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_SIGNED_R11_EAC: types::GLenum = 0x9271; -#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_SIGNED_RG11_EAC: types::GLenum = 0x9273; -#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: types::GLenum = 0x9279; -#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_SRGB8_ETC2: types::GLenum = 0x9275; -#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: types::GLenum = 0x9277; -#[allow(dead_code, non_upper_case_globals)] pub const COMPRESSED_TEXTURE_FORMATS: types::GLenum = 0x86A3; -#[allow(dead_code, non_upper_case_globals)] pub const CONDITION_SATISFIED: types::GLenum = 0x911C; -#[allow(dead_code, non_upper_case_globals)] pub const CONSTANT_ALPHA: types::GLenum = 0x8003; -#[allow(dead_code, non_upper_case_globals)] pub const CONSTANT_COLOR: types::GLenum = 0x8001; -#[allow(dead_code, non_upper_case_globals)] pub const COPY_READ_BUFFER: types::GLenum = 0x8F36; -#[allow(dead_code, non_upper_case_globals)] pub const COPY_READ_BUFFER_BINDING: types::GLenum = 0x8F36; -#[allow(dead_code, non_upper_case_globals)] pub const COPY_WRITE_BUFFER: types::GLenum = 0x8F37; -#[allow(dead_code, non_upper_case_globals)] pub const COPY_WRITE_BUFFER_BINDING: types::GLenum = 0x8F37; -#[allow(dead_code, non_upper_case_globals)] pub const CULL_FACE: types::GLenum = 0x0B44; -#[allow(dead_code, non_upper_case_globals)] pub const CULL_FACE_MODE: types::GLenum = 0x0B45; -#[allow(dead_code, non_upper_case_globals)] pub const CURRENT_PROGRAM: types::GLenum = 0x8B8D; -#[allow(dead_code, non_upper_case_globals)] pub const CURRENT_QUERY: types::GLenum = 0x8865; -#[allow(dead_code, non_upper_case_globals)] pub const CURRENT_VERTEX_ATTRIB: types::GLenum = 0x8626; -#[allow(dead_code, non_upper_case_globals)] pub const CW: types::GLenum = 0x0900; -#[allow(dead_code, non_upper_case_globals)] pub const DECR: types::GLenum = 0x1E03; -#[allow(dead_code, non_upper_case_globals)] pub const DECR_WRAP: types::GLenum = 0x8508; -#[allow(dead_code, non_upper_case_globals)] pub const DELETE_STATUS: types::GLenum = 0x8B80; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH: types::GLenum = 0x1801; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH24_STENCIL8: types::GLenum = 0x88F0; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH32F_STENCIL8: types::GLenum = 0x8CAD; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_ATTACHMENT: types::GLenum = 0x8D00; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_BITS: types::GLenum = 0x0D56; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_BUFFER_BIT: types::GLenum = 0x00000100; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_CLEAR_VALUE: types::GLenum = 0x0B73; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_COMPONENT: types::GLenum = 0x1902; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_COMPONENT16: types::GLenum = 0x81A5; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_COMPONENT24: types::GLenum = 0x81A6; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_COMPONENT32F: types::GLenum = 0x8CAC; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_FUNC: types::GLenum = 0x0B74; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_RANGE: types::GLenum = 0x0B70; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_STENCIL: types::GLenum = 0x84F9; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_STENCIL_ATTACHMENT: types::GLenum = 0x821A; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_TEST: types::GLenum = 0x0B71; -#[allow(dead_code, non_upper_case_globals)] pub const DEPTH_WRITEMASK: types::GLenum = 0x0B72; -#[allow(dead_code, non_upper_case_globals)] pub const DITHER: types::GLenum = 0x0BD0; -#[allow(dead_code, non_upper_case_globals)] pub const DONT_CARE: types::GLenum = 0x1100; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER0: types::GLenum = 0x8825; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER1: types::GLenum = 0x8826; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER10: types::GLenum = 0x882F; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER11: types::GLenum = 0x8830; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER12: types::GLenum = 0x8831; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER13: types::GLenum = 0x8832; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER14: types::GLenum = 0x8833; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER15: types::GLenum = 0x8834; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER2: types::GLenum = 0x8827; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER3: types::GLenum = 0x8828; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER4: types::GLenum = 0x8829; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER5: types::GLenum = 0x882A; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER6: types::GLenum = 0x882B; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER7: types::GLenum = 0x882C; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER8: types::GLenum = 0x882D; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_BUFFER9: types::GLenum = 0x882E; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_FRAMEBUFFER: types::GLenum = 0x8CA9; -#[allow(dead_code, non_upper_case_globals)] pub const DRAW_FRAMEBUFFER_BINDING: types::GLenum = 0x8CA6; -#[allow(dead_code, non_upper_case_globals)] pub const DST_ALPHA: types::GLenum = 0x0304; -#[allow(dead_code, non_upper_case_globals)] pub const DST_COLOR: types::GLenum = 0x0306; -#[allow(dead_code, non_upper_case_globals)] pub const DYNAMIC_COPY: types::GLenum = 0x88EA; -#[allow(dead_code, non_upper_case_globals)] pub const DYNAMIC_DRAW: types::GLenum = 0x88E8; -#[allow(dead_code, non_upper_case_globals)] pub const DYNAMIC_READ: types::GLenum = 0x88E9; -#[allow(dead_code, non_upper_case_globals)] pub const ELEMENT_ARRAY_BUFFER: types::GLenum = 0x8893; -#[allow(dead_code, non_upper_case_globals)] pub const ELEMENT_ARRAY_BUFFER_BINDING: types::GLenum = 0x8895; -#[allow(dead_code, non_upper_case_globals)] pub const EQUAL: types::GLenum = 0x0202; -#[allow(dead_code, non_upper_case_globals)] pub const EXTENSIONS: types::GLenum = 0x1F03; -#[allow(dead_code, non_upper_case_globals)] pub const FALSE: types::GLboolean = 0; -#[allow(dead_code, non_upper_case_globals)] pub const FASTEST: types::GLenum = 0x1101; -#[allow(dead_code, non_upper_case_globals)] pub const FIXED: types::GLenum = 0x140C; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT: types::GLenum = 0x1406; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_32_UNSIGNED_INT_24_8_REV: types::GLenum = 0x8DAD; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT2: types::GLenum = 0x8B5A; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT2x3: types::GLenum = 0x8B65; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT2x4: types::GLenum = 0x8B66; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT3: types::GLenum = 0x8B5B; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT3x2: types::GLenum = 0x8B67; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT3x4: types::GLenum = 0x8B68; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT4: types::GLenum = 0x8B5C; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT4x2: types::GLenum = 0x8B69; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_MAT4x3: types::GLenum = 0x8B6A; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_VEC2: types::GLenum = 0x8B50; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_VEC3: types::GLenum = 0x8B51; -#[allow(dead_code, non_upper_case_globals)] pub const FLOAT_VEC4: types::GLenum = 0x8B52; -#[allow(dead_code, non_upper_case_globals)] pub const FRAGMENT_SHADER: types::GLenum = 0x8B30; -#[allow(dead_code, non_upper_case_globals)] pub const FRAGMENT_SHADER_DERIVATIVE_HINT: types::GLenum = 0x8B8B; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER: types::GLenum = 0x8D40; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: types::GLenum = 0x8215; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: types::GLenum = 0x8214; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: types::GLenum = 0x8210; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: types::GLenum = 0x8211; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: types::GLenum = 0x8216; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: types::GLenum = 0x8213; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: types::GLenum = 0x8CD1; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: types::GLenum = 0x8CD0; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_RED_SIZE: types::GLenum = 0x8212; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: types::GLenum = 0x8217; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: types::GLenum = 0x8CD3; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: types::GLenum = 0x8CD4; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: types::GLenum = 0x8CD2; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_BINDING: types::GLenum = 0x8CA6; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_COMPLETE: types::GLenum = 0x8CD5; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_DEFAULT: types::GLenum = 0x8218; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_INCOMPLETE_ATTACHMENT: types::GLenum = 0x8CD6; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_INCOMPLETE_DIMENSIONS: types::GLenum = 0x8CD9; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: types::GLenum = 0x8CD7; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: types::GLenum = 0x8D56; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_UNDEFINED: types::GLenum = 0x8219; -#[allow(dead_code, non_upper_case_globals)] pub const FRAMEBUFFER_UNSUPPORTED: types::GLenum = 0x8CDD; -#[allow(dead_code, non_upper_case_globals)] pub const FRONT: types::GLenum = 0x0404; -#[allow(dead_code, non_upper_case_globals)] pub const FRONT_AND_BACK: types::GLenum = 0x0408; -#[allow(dead_code, non_upper_case_globals)] pub const FRONT_FACE: types::GLenum = 0x0B46; -#[allow(dead_code, non_upper_case_globals)] pub const FUNC_ADD: types::GLenum = 0x8006; -#[allow(dead_code, non_upper_case_globals)] pub const FUNC_REVERSE_SUBTRACT: types::GLenum = 0x800B; -#[allow(dead_code, non_upper_case_globals)] pub const FUNC_SUBTRACT: types::GLenum = 0x800A; -#[allow(dead_code, non_upper_case_globals)] pub const GENERATE_MIPMAP_HINT: types::GLenum = 0x8192; -#[allow(dead_code, non_upper_case_globals)] pub const GEQUAL: types::GLenum = 0x0206; -#[allow(dead_code, non_upper_case_globals)] pub const GREATER: types::GLenum = 0x0204; -#[allow(dead_code, non_upper_case_globals)] pub const GREEN: types::GLenum = 0x1904; -#[allow(dead_code, non_upper_case_globals)] pub const GREEN_BITS: types::GLenum = 0x0D53; -#[allow(dead_code, non_upper_case_globals)] pub const HALF_FLOAT: types::GLenum = 0x140B; -#[allow(dead_code, non_upper_case_globals)] pub const HIGH_FLOAT: types::GLenum = 0x8DF2; -#[allow(dead_code, non_upper_case_globals)] pub const HIGH_INT: types::GLenum = 0x8DF5; -#[allow(dead_code, non_upper_case_globals)] pub const IMPLEMENTATION_COLOR_READ_FORMAT: types::GLenum = 0x8B9B; -#[allow(dead_code, non_upper_case_globals)] pub const IMPLEMENTATION_COLOR_READ_TYPE: types::GLenum = 0x8B9A; -#[allow(dead_code, non_upper_case_globals)] pub const INCR: types::GLenum = 0x1E02; -#[allow(dead_code, non_upper_case_globals)] pub const INCR_WRAP: types::GLenum = 0x8507; -#[allow(dead_code, non_upper_case_globals)] pub const INFO_LOG_LENGTH: types::GLenum = 0x8B84; -#[allow(dead_code, non_upper_case_globals)] pub const INT: types::GLenum = 0x1404; -#[allow(dead_code, non_upper_case_globals)] pub const INTERLEAVED_ATTRIBS: types::GLenum = 0x8C8C; -#[allow(dead_code, non_upper_case_globals)] pub const INT_2_10_10_10_REV: types::GLenum = 0x8D9F; -#[allow(dead_code, non_upper_case_globals)] pub const INT_SAMPLER_2D: types::GLenum = 0x8DCA; -#[allow(dead_code, non_upper_case_globals)] pub const INT_SAMPLER_2D_ARRAY: types::GLenum = 0x8DCF; -#[allow(dead_code, non_upper_case_globals)] pub const INT_SAMPLER_3D: types::GLenum = 0x8DCB; -#[allow(dead_code, non_upper_case_globals)] pub const INT_SAMPLER_CUBE: types::GLenum = 0x8DCC; -#[allow(dead_code, non_upper_case_globals)] pub const INT_VEC2: types::GLenum = 0x8B53; -#[allow(dead_code, non_upper_case_globals)] pub const INT_VEC3: types::GLenum = 0x8B54; -#[allow(dead_code, non_upper_case_globals)] pub const INT_VEC4: types::GLenum = 0x8B55; -#[allow(dead_code, non_upper_case_globals)] pub const INVALID_ENUM: types::GLenum = 0x0500; -#[allow(dead_code, non_upper_case_globals)] pub const INVALID_FRAMEBUFFER_OPERATION: types::GLenum = 0x0506; -#[allow(dead_code, non_upper_case_globals)] pub const INVALID_INDEX: types::GLuint = 0xFFFFFFFF; -#[allow(dead_code, non_upper_case_globals)] pub const INVALID_OPERATION: types::GLenum = 0x0502; -#[allow(dead_code, non_upper_case_globals)] pub const INVALID_VALUE: types::GLenum = 0x0501; -#[allow(dead_code, non_upper_case_globals)] pub const INVERT: types::GLenum = 0x150A; -#[allow(dead_code, non_upper_case_globals)] pub const KEEP: types::GLenum = 0x1E00; -#[allow(dead_code, non_upper_case_globals)] pub const LEQUAL: types::GLenum = 0x0203; -#[allow(dead_code, non_upper_case_globals)] pub const LESS: types::GLenum = 0x0201; -#[allow(dead_code, non_upper_case_globals)] pub const LINEAR: types::GLenum = 0x2601; -#[allow(dead_code, non_upper_case_globals)] pub const LINEAR_MIPMAP_LINEAR: types::GLenum = 0x2703; -#[allow(dead_code, non_upper_case_globals)] pub const LINEAR_MIPMAP_NEAREST: types::GLenum = 0x2701; -#[allow(dead_code, non_upper_case_globals)] pub const LINES: types::GLenum = 0x0001; -#[allow(dead_code, non_upper_case_globals)] pub const LINE_LOOP: types::GLenum = 0x0002; -#[allow(dead_code, non_upper_case_globals)] pub const LINE_STRIP: types::GLenum = 0x0003; -#[allow(dead_code, non_upper_case_globals)] pub const LINE_WIDTH: types::GLenum = 0x0B21; -#[allow(dead_code, non_upper_case_globals)] pub const LINK_STATUS: types::GLenum = 0x8B82; -#[allow(dead_code, non_upper_case_globals)] pub const LOW_FLOAT: types::GLenum = 0x8DF0; -#[allow(dead_code, non_upper_case_globals)] pub const LOW_INT: types::GLenum = 0x8DF3; -#[allow(dead_code, non_upper_case_globals)] pub const LUMINANCE: types::GLenum = 0x1909; -#[allow(dead_code, non_upper_case_globals)] pub const LUMINANCE_ALPHA: types::GLenum = 0x190A; -#[allow(dead_code, non_upper_case_globals)] pub const MAJOR_VERSION: types::GLenum = 0x821B; -#[allow(dead_code, non_upper_case_globals)] pub const MAP_FLUSH_EXPLICIT_BIT: types::GLenum = 0x0010; -#[allow(dead_code, non_upper_case_globals)] pub const MAP_INVALIDATE_BUFFER_BIT: types::GLenum = 0x0008; -#[allow(dead_code, non_upper_case_globals)] pub const MAP_INVALIDATE_RANGE_BIT: types::GLenum = 0x0004; -#[allow(dead_code, non_upper_case_globals)] pub const MAP_READ_BIT: types::GLenum = 0x0001; -#[allow(dead_code, non_upper_case_globals)] pub const MAP_UNSYNCHRONIZED_BIT: types::GLenum = 0x0020; -#[allow(dead_code, non_upper_case_globals)] pub const MAP_WRITE_BIT: types::GLenum = 0x0002; -#[allow(dead_code, non_upper_case_globals)] pub const MAX: types::GLenum = 0x8008; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_3D_TEXTURE_SIZE: types::GLenum = 0x8073; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_ARRAY_TEXTURE_LAYERS: types::GLenum = 0x88FF; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_COLOR_ATTACHMENTS: types::GLenum = 0x8CDF; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: types::GLenum = 0x8A33; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_COMBINED_TEXTURE_IMAGE_UNITS: types::GLenum = 0x8B4D; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_COMBINED_UNIFORM_BLOCKS: types::GLenum = 0x8A2E; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: types::GLenum = 0x8A31; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_CUBE_MAP_TEXTURE_SIZE: types::GLenum = 0x851C; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_DRAW_BUFFERS: types::GLenum = 0x8824; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_ELEMENTS_INDICES: types::GLenum = 0x80E9; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_ELEMENTS_VERTICES: types::GLenum = 0x80E8; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_ELEMENT_INDEX: types::GLenum = 0x8D6B; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_FRAGMENT_INPUT_COMPONENTS: types::GLenum = 0x9125; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_FRAGMENT_UNIFORM_BLOCKS: types::GLenum = 0x8A2D; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_FRAGMENT_UNIFORM_COMPONENTS: types::GLenum = 0x8B49; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_FRAGMENT_UNIFORM_VECTORS: types::GLenum = 0x8DFD; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_PROGRAM_TEXEL_OFFSET: types::GLenum = 0x8905; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_RENDERBUFFER_SIZE: types::GLenum = 0x84E8; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_SAMPLES: types::GLenum = 0x8D57; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_SERVER_WAIT_TIMEOUT: types::GLenum = 0x9111; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_TEXTURE_IMAGE_UNITS: types::GLenum = 0x8872; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_TEXTURE_LOD_BIAS: types::GLenum = 0x84FD; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_TEXTURE_SIZE: types::GLenum = 0x0D33; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: types::GLenum = 0x8C8A; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: types::GLenum = 0x8C8B; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: types::GLenum = 0x8C80; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_UNIFORM_BLOCK_SIZE: types::GLenum = 0x8A30; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_UNIFORM_BUFFER_BINDINGS: types::GLenum = 0x8A2F; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_VARYING_COMPONENTS: types::GLenum = 0x8B4B; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_VARYING_VECTORS: types::GLenum = 0x8DFC; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_VERTEX_ATTRIBS: types::GLenum = 0x8869; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_VERTEX_OUTPUT_COMPONENTS: types::GLenum = 0x9122; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_VERTEX_TEXTURE_IMAGE_UNITS: types::GLenum = 0x8B4C; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_VERTEX_UNIFORM_BLOCKS: types::GLenum = 0x8A2B; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_VERTEX_UNIFORM_COMPONENTS: types::GLenum = 0x8B4A; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_VERTEX_UNIFORM_VECTORS: types::GLenum = 0x8DFB; -#[allow(dead_code, non_upper_case_globals)] pub const MAX_VIEWPORT_DIMS: types::GLenum = 0x0D3A; -#[allow(dead_code, non_upper_case_globals)] pub const MEDIUM_FLOAT: types::GLenum = 0x8DF1; -#[allow(dead_code, non_upper_case_globals)] pub const MEDIUM_INT: types::GLenum = 0x8DF4; -#[allow(dead_code, non_upper_case_globals)] pub const MIN: types::GLenum = 0x8007; -#[allow(dead_code, non_upper_case_globals)] pub const MINOR_VERSION: types::GLenum = 0x821C; -#[allow(dead_code, non_upper_case_globals)] pub const MIN_PROGRAM_TEXEL_OFFSET: types::GLenum = 0x8904; -#[allow(dead_code, non_upper_case_globals)] pub const MIRRORED_REPEAT: types::GLenum = 0x8370; -#[allow(dead_code, non_upper_case_globals)] pub const NEAREST: types::GLenum = 0x2600; -#[allow(dead_code, non_upper_case_globals)] pub const NEAREST_MIPMAP_LINEAR: types::GLenum = 0x2702; -#[allow(dead_code, non_upper_case_globals)] pub const NEAREST_MIPMAP_NEAREST: types::GLenum = 0x2700; -#[allow(dead_code, non_upper_case_globals)] pub const NEVER: types::GLenum = 0x0200; -#[allow(dead_code, non_upper_case_globals)] pub const NICEST: types::GLenum = 0x1102; -#[allow(dead_code, non_upper_case_globals)] pub const NONE: types::GLenum = 0; -#[allow(dead_code, non_upper_case_globals)] pub const NOTEQUAL: types::GLenum = 0x0205; -#[allow(dead_code, non_upper_case_globals)] pub const NO_ERROR: types::GLenum = 0; -#[allow(dead_code, non_upper_case_globals)] pub const NUM_COMPRESSED_TEXTURE_FORMATS: types::GLenum = 0x86A2; -#[allow(dead_code, non_upper_case_globals)] pub const NUM_EXTENSIONS: types::GLenum = 0x821D; -#[allow(dead_code, non_upper_case_globals)] pub const NUM_PROGRAM_BINARY_FORMATS: types::GLenum = 0x87FE; -#[allow(dead_code, non_upper_case_globals)] pub const NUM_SAMPLE_COUNTS: types::GLenum = 0x9380; -#[allow(dead_code, non_upper_case_globals)] pub const NUM_SHADER_BINARY_FORMATS: types::GLenum = 0x8DF9; -#[allow(dead_code, non_upper_case_globals)] pub const OBJECT_TYPE: types::GLenum = 0x9112; -#[allow(dead_code, non_upper_case_globals)] pub const ONE: types::GLenum = 1; -#[allow(dead_code, non_upper_case_globals)] pub const ONE_MINUS_CONSTANT_ALPHA: types::GLenum = 0x8004; -#[allow(dead_code, non_upper_case_globals)] pub const ONE_MINUS_CONSTANT_COLOR: types::GLenum = 0x8002; -#[allow(dead_code, non_upper_case_globals)] pub const ONE_MINUS_DST_ALPHA: types::GLenum = 0x0305; -#[allow(dead_code, non_upper_case_globals)] pub const ONE_MINUS_DST_COLOR: types::GLenum = 0x0307; -#[allow(dead_code, non_upper_case_globals)] pub const ONE_MINUS_SRC_ALPHA: types::GLenum = 0x0303; -#[allow(dead_code, non_upper_case_globals)] pub const ONE_MINUS_SRC_COLOR: types::GLenum = 0x0301; -#[allow(dead_code, non_upper_case_globals)] pub const OUT_OF_MEMORY: types::GLenum = 0x0505; -#[allow(dead_code, non_upper_case_globals)] pub const PACK_ALIGNMENT: types::GLenum = 0x0D05; -#[allow(dead_code, non_upper_case_globals)] pub const PACK_ROW_LENGTH: types::GLenum = 0x0D02; -#[allow(dead_code, non_upper_case_globals)] pub const PACK_SKIP_PIXELS: types::GLenum = 0x0D04; -#[allow(dead_code, non_upper_case_globals)] pub const PACK_SKIP_ROWS: types::GLenum = 0x0D03; -#[allow(dead_code, non_upper_case_globals)] pub const PIXEL_PACK_BUFFER: types::GLenum = 0x88EB; -#[allow(dead_code, non_upper_case_globals)] pub const PIXEL_PACK_BUFFER_BINDING: types::GLenum = 0x88ED; -#[allow(dead_code, non_upper_case_globals)] pub const PIXEL_UNPACK_BUFFER: types::GLenum = 0x88EC; -#[allow(dead_code, non_upper_case_globals)] pub const PIXEL_UNPACK_BUFFER_BINDING: types::GLenum = 0x88EF; -#[allow(dead_code, non_upper_case_globals)] pub const POINTS: types::GLenum = 0x0000; -#[allow(dead_code, non_upper_case_globals)] pub const POLYGON_OFFSET_FACTOR: types::GLenum = 0x8038; -#[allow(dead_code, non_upper_case_globals)] pub const POLYGON_OFFSET_FILL: types::GLenum = 0x8037; -#[allow(dead_code, non_upper_case_globals)] pub const POLYGON_OFFSET_UNITS: types::GLenum = 0x2A00; -#[allow(dead_code, non_upper_case_globals)] pub const PRIMITIVE_RESTART_FIXED_INDEX: types::GLenum = 0x8D69; -#[allow(dead_code, non_upper_case_globals)] pub const PROGRAM_BINARY_FORMATS: types::GLenum = 0x87FF; -#[allow(dead_code, non_upper_case_globals)] pub const PROGRAM_BINARY_LENGTH: types::GLenum = 0x8741; -#[allow(dead_code, non_upper_case_globals)] pub const PROGRAM_BINARY_RETRIEVABLE_HINT: types::GLenum = 0x8257; -#[allow(dead_code, non_upper_case_globals)] pub const QUERY_RESULT: types::GLenum = 0x8866; -#[allow(dead_code, non_upper_case_globals)] pub const QUERY_RESULT_AVAILABLE: types::GLenum = 0x8867; -#[allow(dead_code, non_upper_case_globals)] pub const R11F_G11F_B10F: types::GLenum = 0x8C3A; -#[allow(dead_code, non_upper_case_globals)] pub const R16F: types::GLenum = 0x822D; -#[allow(dead_code, non_upper_case_globals)] pub const R16I: types::GLenum = 0x8233; -#[allow(dead_code, non_upper_case_globals)] pub const R16UI: types::GLenum = 0x8234; -#[allow(dead_code, non_upper_case_globals)] pub const R32F: types::GLenum = 0x822E; -#[allow(dead_code, non_upper_case_globals)] pub const R32I: types::GLenum = 0x8235; -#[allow(dead_code, non_upper_case_globals)] pub const R32UI: types::GLenum = 0x8236; -#[allow(dead_code, non_upper_case_globals)] pub const R8: types::GLenum = 0x8229; -#[allow(dead_code, non_upper_case_globals)] pub const R8I: types::GLenum = 0x8231; -#[allow(dead_code, non_upper_case_globals)] pub const R8UI: types::GLenum = 0x8232; -#[allow(dead_code, non_upper_case_globals)] pub const R8_SNORM: types::GLenum = 0x8F94; -#[allow(dead_code, non_upper_case_globals)] pub const RASTERIZER_DISCARD: types::GLenum = 0x8C89; -#[allow(dead_code, non_upper_case_globals)] pub const READ_BUFFER: types::GLenum = 0x0C02; -#[allow(dead_code, non_upper_case_globals)] pub const READ_FRAMEBUFFER: types::GLenum = 0x8CA8; -#[allow(dead_code, non_upper_case_globals)] pub const READ_FRAMEBUFFER_BINDING: types::GLenum = 0x8CAA; -#[allow(dead_code, non_upper_case_globals)] pub const RED: types::GLenum = 0x1903; -#[allow(dead_code, non_upper_case_globals)] pub const RED_BITS: types::GLenum = 0x0D52; -#[allow(dead_code, non_upper_case_globals)] pub const RED_INTEGER: types::GLenum = 0x8D94; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER: types::GLenum = 0x8D41; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_ALPHA_SIZE: types::GLenum = 0x8D53; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_BINDING: types::GLenum = 0x8CA7; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_BLUE_SIZE: types::GLenum = 0x8D52; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_DEPTH_SIZE: types::GLenum = 0x8D54; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_GREEN_SIZE: types::GLenum = 0x8D51; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_HEIGHT: types::GLenum = 0x8D43; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_INTERNAL_FORMAT: types::GLenum = 0x8D44; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_RED_SIZE: types::GLenum = 0x8D50; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_SAMPLES: types::GLenum = 0x8CAB; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_STENCIL_SIZE: types::GLenum = 0x8D55; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERBUFFER_WIDTH: types::GLenum = 0x8D42; -#[allow(dead_code, non_upper_case_globals)] pub const RENDERER: types::GLenum = 0x1F01; -#[allow(dead_code, non_upper_case_globals)] pub const REPEAT: types::GLenum = 0x2901; -#[allow(dead_code, non_upper_case_globals)] pub const REPLACE: types::GLenum = 0x1E01; -#[allow(dead_code, non_upper_case_globals)] pub const RG: types::GLenum = 0x8227; -#[allow(dead_code, non_upper_case_globals)] pub const RG16F: types::GLenum = 0x822F; -#[allow(dead_code, non_upper_case_globals)] pub const RG16I: types::GLenum = 0x8239; -#[allow(dead_code, non_upper_case_globals)] pub const RG16UI: types::GLenum = 0x823A; -#[allow(dead_code, non_upper_case_globals)] pub const RG32F: types::GLenum = 0x8230; -#[allow(dead_code, non_upper_case_globals)] pub const RG32I: types::GLenum = 0x823B; -#[allow(dead_code, non_upper_case_globals)] pub const RG32UI: types::GLenum = 0x823C; -#[allow(dead_code, non_upper_case_globals)] pub const RG8: types::GLenum = 0x822B; -#[allow(dead_code, non_upper_case_globals)] pub const RG8I: types::GLenum = 0x8237; -#[allow(dead_code, non_upper_case_globals)] pub const RG8UI: types::GLenum = 0x8238; -#[allow(dead_code, non_upper_case_globals)] pub const RG8_SNORM: types::GLenum = 0x8F95; -#[allow(dead_code, non_upper_case_globals)] pub const RGB: types::GLenum = 0x1907; -#[allow(dead_code, non_upper_case_globals)] pub const RGB10_A2: types::GLenum = 0x8059; -#[allow(dead_code, non_upper_case_globals)] pub const RGB10_A2UI: types::GLenum = 0x906F; -#[allow(dead_code, non_upper_case_globals)] pub const RGB16F: types::GLenum = 0x881B; -#[allow(dead_code, non_upper_case_globals)] pub const RGB16I: types::GLenum = 0x8D89; -#[allow(dead_code, non_upper_case_globals)] pub const RGB16UI: types::GLenum = 0x8D77; -#[allow(dead_code, non_upper_case_globals)] pub const RGB32F: types::GLenum = 0x8815; -#[allow(dead_code, non_upper_case_globals)] pub const RGB32I: types::GLenum = 0x8D83; -#[allow(dead_code, non_upper_case_globals)] pub const RGB32UI: types::GLenum = 0x8D71; -#[allow(dead_code, non_upper_case_globals)] pub const RGB565: types::GLenum = 0x8D62; -#[allow(dead_code, non_upper_case_globals)] pub const RGB5_A1: types::GLenum = 0x8057; -#[allow(dead_code, non_upper_case_globals)] pub const RGB8: types::GLenum = 0x8051; -#[allow(dead_code, non_upper_case_globals)] pub const RGB8I: types::GLenum = 0x8D8F; -#[allow(dead_code, non_upper_case_globals)] pub const RGB8UI: types::GLenum = 0x8D7D; -#[allow(dead_code, non_upper_case_globals)] pub const RGB8_SNORM: types::GLenum = 0x8F96; -#[allow(dead_code, non_upper_case_globals)] pub const RGB9_E5: types::GLenum = 0x8C3D; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA: types::GLenum = 0x1908; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA16F: types::GLenum = 0x881A; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA16I: types::GLenum = 0x8D88; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA16UI: types::GLenum = 0x8D76; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA32F: types::GLenum = 0x8814; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA32I: types::GLenum = 0x8D82; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA32UI: types::GLenum = 0x8D70; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA4: types::GLenum = 0x8056; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA8: types::GLenum = 0x8058; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA8I: types::GLenum = 0x8D8E; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA8UI: types::GLenum = 0x8D7C; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA8_SNORM: types::GLenum = 0x8F97; -#[allow(dead_code, non_upper_case_globals)] pub const RGBA_INTEGER: types::GLenum = 0x8D99; -#[allow(dead_code, non_upper_case_globals)] pub const RGB_INTEGER: types::GLenum = 0x8D98; -#[allow(dead_code, non_upper_case_globals)] pub const RG_INTEGER: types::GLenum = 0x8228; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_2D: types::GLenum = 0x8B5E; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_2D_ARRAY: types::GLenum = 0x8DC1; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_2D_ARRAY_SHADOW: types::GLenum = 0x8DC4; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_2D_SHADOW: types::GLenum = 0x8B62; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_3D: types::GLenum = 0x8B5F; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_BINDING: types::GLenum = 0x8919; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_CUBE: types::GLenum = 0x8B60; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLER_CUBE_SHADOW: types::GLenum = 0x8DC5; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLES: types::GLenum = 0x80A9; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLE_ALPHA_TO_COVERAGE: types::GLenum = 0x809E; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLE_BUFFERS: types::GLenum = 0x80A8; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLE_COVERAGE: types::GLenum = 0x80A0; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLE_COVERAGE_INVERT: types::GLenum = 0x80AB; -#[allow(dead_code, non_upper_case_globals)] pub const SAMPLE_COVERAGE_VALUE: types::GLenum = 0x80AA; -#[allow(dead_code, non_upper_case_globals)] pub const SCISSOR_BOX: types::GLenum = 0x0C10; -#[allow(dead_code, non_upper_case_globals)] pub const SCISSOR_TEST: types::GLenum = 0x0C11; -#[allow(dead_code, non_upper_case_globals)] pub const SEPARATE_ATTRIBS: types::GLenum = 0x8C8D; -#[allow(dead_code, non_upper_case_globals)] pub const SHADER_BINARY_FORMATS: types::GLenum = 0x8DF8; -#[allow(dead_code, non_upper_case_globals)] pub const SHADER_COMPILER: types::GLenum = 0x8DFA; -#[allow(dead_code, non_upper_case_globals)] pub const SHADER_SOURCE_LENGTH: types::GLenum = 0x8B88; -#[allow(dead_code, non_upper_case_globals)] pub const SHADER_TYPE: types::GLenum = 0x8B4F; -#[allow(dead_code, non_upper_case_globals)] pub const SHADING_LANGUAGE_VERSION: types::GLenum = 0x8B8C; -#[allow(dead_code, non_upper_case_globals)] pub const SHORT: types::GLenum = 0x1402; -#[allow(dead_code, non_upper_case_globals)] pub const SIGNALED: types::GLenum = 0x9119; -#[allow(dead_code, non_upper_case_globals)] pub const SIGNED_NORMALIZED: types::GLenum = 0x8F9C; -#[allow(dead_code, non_upper_case_globals)] pub const SRC_ALPHA: types::GLenum = 0x0302; -#[allow(dead_code, non_upper_case_globals)] pub const SRC_ALPHA_SATURATE: types::GLenum = 0x0308; -#[allow(dead_code, non_upper_case_globals)] pub const SRC_COLOR: types::GLenum = 0x0300; -#[allow(dead_code, non_upper_case_globals)] pub const SRGB: types::GLenum = 0x8C40; -#[allow(dead_code, non_upper_case_globals)] pub const SRGB8: types::GLenum = 0x8C41; -#[allow(dead_code, non_upper_case_globals)] pub const SRGB8_ALPHA8: types::GLenum = 0x8C43; -#[allow(dead_code, non_upper_case_globals)] pub const STATIC_COPY: types::GLenum = 0x88E6; -#[allow(dead_code, non_upper_case_globals)] pub const STATIC_DRAW: types::GLenum = 0x88E4; -#[allow(dead_code, non_upper_case_globals)] pub const STATIC_READ: types::GLenum = 0x88E5; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL: types::GLenum = 0x1802; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_ATTACHMENT: types::GLenum = 0x8D20; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_FAIL: types::GLenum = 0x8801; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_FUNC: types::GLenum = 0x8800; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_PASS_DEPTH_FAIL: types::GLenum = 0x8802; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_PASS_DEPTH_PASS: types::GLenum = 0x8803; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_REF: types::GLenum = 0x8CA3; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_VALUE_MASK: types::GLenum = 0x8CA4; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BACK_WRITEMASK: types::GLenum = 0x8CA5; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BITS: types::GLenum = 0x0D57; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_BUFFER_BIT: types::GLenum = 0x00000400; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_CLEAR_VALUE: types::GLenum = 0x0B91; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_FAIL: types::GLenum = 0x0B94; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_FUNC: types::GLenum = 0x0B92; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_INDEX8: types::GLenum = 0x8D48; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_PASS_DEPTH_FAIL: types::GLenum = 0x0B95; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_PASS_DEPTH_PASS: types::GLenum = 0x0B96; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_REF: types::GLenum = 0x0B97; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_TEST: types::GLenum = 0x0B90; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_VALUE_MASK: types::GLenum = 0x0B93; -#[allow(dead_code, non_upper_case_globals)] pub const STENCIL_WRITEMASK: types::GLenum = 0x0B98; -#[allow(dead_code, non_upper_case_globals)] pub const STREAM_COPY: types::GLenum = 0x88E2; -#[allow(dead_code, non_upper_case_globals)] pub const STREAM_DRAW: types::GLenum = 0x88E0; -#[allow(dead_code, non_upper_case_globals)] pub const STREAM_READ: types::GLenum = 0x88E1; -#[allow(dead_code, non_upper_case_globals)] pub const SUBPIXEL_BITS: types::GLenum = 0x0D50; -#[allow(dead_code, non_upper_case_globals)] pub const SYNC_CONDITION: types::GLenum = 0x9113; -#[allow(dead_code, non_upper_case_globals)] pub const SYNC_FENCE: types::GLenum = 0x9116; -#[allow(dead_code, non_upper_case_globals)] pub const SYNC_FLAGS: types::GLenum = 0x9115; -#[allow(dead_code, non_upper_case_globals)] pub const SYNC_FLUSH_COMMANDS_BIT: types::GLenum = 0x00000001; -#[allow(dead_code, non_upper_case_globals)] pub const SYNC_GPU_COMMANDS_COMPLETE: types::GLenum = 0x9117; -#[allow(dead_code, non_upper_case_globals)] pub const SYNC_STATUS: types::GLenum = 0x9114; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE: types::GLenum = 0x1702; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE0: types::GLenum = 0x84C0; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE1: types::GLenum = 0x84C1; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE10: types::GLenum = 0x84CA; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE11: types::GLenum = 0x84CB; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE12: types::GLenum = 0x84CC; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE13: types::GLenum = 0x84CD; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE14: types::GLenum = 0x84CE; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE15: types::GLenum = 0x84CF; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE16: types::GLenum = 0x84D0; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE17: types::GLenum = 0x84D1; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE18: types::GLenum = 0x84D2; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE19: types::GLenum = 0x84D3; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE2: types::GLenum = 0x84C2; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE20: types::GLenum = 0x84D4; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE21: types::GLenum = 0x84D5; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE22: types::GLenum = 0x84D6; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE23: types::GLenum = 0x84D7; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE24: types::GLenum = 0x84D8; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE25: types::GLenum = 0x84D9; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE26: types::GLenum = 0x84DA; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE27: types::GLenum = 0x84DB; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE28: types::GLenum = 0x84DC; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE29: types::GLenum = 0x84DD; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE3: types::GLenum = 0x84C3; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE30: types::GLenum = 0x84DE; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE31: types::GLenum = 0x84DF; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE4: types::GLenum = 0x84C4; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE5: types::GLenum = 0x84C5; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE6: types::GLenum = 0x84C6; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE7: types::GLenum = 0x84C7; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE8: types::GLenum = 0x84C8; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE9: types::GLenum = 0x84C9; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_2D: types::GLenum = 0x0DE1; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_2D_ARRAY: types::GLenum = 0x8C1A; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_3D: types::GLenum = 0x806F; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_BASE_LEVEL: types::GLenum = 0x813C; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_BINDING_2D: types::GLenum = 0x8069; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_BINDING_2D_ARRAY: types::GLenum = 0x8C1D; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_BINDING_3D: types::GLenum = 0x806A; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_BINDING_CUBE_MAP: types::GLenum = 0x8514; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_COMPARE_FUNC: types::GLenum = 0x884D; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_COMPARE_MODE: types::GLenum = 0x884C; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP: types::GLenum = 0x8513; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP_NEGATIVE_X: types::GLenum = 0x8516; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP_NEGATIVE_Y: types::GLenum = 0x8518; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP_NEGATIVE_Z: types::GLenum = 0x851A; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP_POSITIVE_X: types::GLenum = 0x8515; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP_POSITIVE_Y: types::GLenum = 0x8517; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_CUBE_MAP_POSITIVE_Z: types::GLenum = 0x8519; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_IMMUTABLE_FORMAT: types::GLenum = 0x912F; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_IMMUTABLE_LEVELS: types::GLenum = 0x82DF; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_MAG_FILTER: types::GLenum = 0x2800; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_MAX_LEVEL: types::GLenum = 0x813D; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_MAX_LOD: types::GLenum = 0x813B; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_MIN_FILTER: types::GLenum = 0x2801; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_MIN_LOD: types::GLenum = 0x813A; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_SWIZZLE_A: types::GLenum = 0x8E45; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_SWIZZLE_B: types::GLenum = 0x8E44; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_SWIZZLE_G: types::GLenum = 0x8E43; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_SWIZZLE_R: types::GLenum = 0x8E42; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_WRAP_R: types::GLenum = 0x8072; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_WRAP_S: types::GLenum = 0x2802; -#[allow(dead_code, non_upper_case_globals)] pub const TEXTURE_WRAP_T: types::GLenum = 0x2803; -#[allow(dead_code, non_upper_case_globals)] pub const TIMEOUT_EXPIRED: types::GLenum = 0x911B; -#[allow(dead_code, non_upper_case_globals)] pub const TIMEOUT_IGNORED: types::GLuint64 = 0xFFFFFFFFFFFFFFFF; -#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK: types::GLenum = 0x8E22; -#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_ACTIVE: types::GLenum = 0x8E24; -#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_BINDING: types::GLenum = 0x8E25; -#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_BUFFER: types::GLenum = 0x8C8E; -#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_BUFFER_BINDING: types::GLenum = 0x8C8F; -#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_BUFFER_MODE: types::GLenum = 0x8C7F; -#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_BUFFER_SIZE: types::GLenum = 0x8C85; -#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_BUFFER_START: types::GLenum = 0x8C84; -#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_PAUSED: types::GLenum = 0x8E23; -#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: types::GLenum = 0x8C88; -#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_VARYINGS: types::GLenum = 0x8C83; -#[allow(dead_code, non_upper_case_globals)] pub const TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: types::GLenum = 0x8C76; -#[allow(dead_code, non_upper_case_globals)] pub const TRIANGLES: types::GLenum = 0x0004; -#[allow(dead_code, non_upper_case_globals)] pub const TRIANGLE_FAN: types::GLenum = 0x0006; -#[allow(dead_code, non_upper_case_globals)] pub const TRIANGLE_STRIP: types::GLenum = 0x0005; -#[allow(dead_code, non_upper_case_globals)] pub const TRUE: types::GLboolean = 1; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_ARRAY_STRIDE: types::GLenum = 0x8A3C; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_ACTIVE_UNIFORMS: types::GLenum = 0x8A42; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: types::GLenum = 0x8A43; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_BINDING: types::GLenum = 0x8A3F; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_DATA_SIZE: types::GLenum = 0x8A40; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_INDEX: types::GLenum = 0x8A3A; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_NAME_LENGTH: types::GLenum = 0x8A41; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: types::GLenum = 0x8A46; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: types::GLenum = 0x8A44; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BUFFER: types::GLenum = 0x8A11; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BUFFER_BINDING: types::GLenum = 0x8A28; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BUFFER_OFFSET_ALIGNMENT: types::GLenum = 0x8A34; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BUFFER_SIZE: types::GLenum = 0x8A2A; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_BUFFER_START: types::GLenum = 0x8A29; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_IS_ROW_MAJOR: types::GLenum = 0x8A3E; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_MATRIX_STRIDE: types::GLenum = 0x8A3D; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_NAME_LENGTH: types::GLenum = 0x8A39; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_OFFSET: types::GLenum = 0x8A3B; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_SIZE: types::GLenum = 0x8A38; -#[allow(dead_code, non_upper_case_globals)] pub const UNIFORM_TYPE: types::GLenum = 0x8A37; -#[allow(dead_code, non_upper_case_globals)] pub const UNPACK_ALIGNMENT: types::GLenum = 0x0CF5; -#[allow(dead_code, non_upper_case_globals)] pub const UNPACK_IMAGE_HEIGHT: types::GLenum = 0x806E; -#[allow(dead_code, non_upper_case_globals)] pub const UNPACK_ROW_LENGTH: types::GLenum = 0x0CF2; -#[allow(dead_code, non_upper_case_globals)] pub const UNPACK_SKIP_IMAGES: types::GLenum = 0x806D; -#[allow(dead_code, non_upper_case_globals)] pub const UNPACK_SKIP_PIXELS: types::GLenum = 0x0CF4; -#[allow(dead_code, non_upper_case_globals)] pub const UNPACK_SKIP_ROWS: types::GLenum = 0x0CF3; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNALED: types::GLenum = 0x9118; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_BYTE: types::GLenum = 0x1401; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT: types::GLenum = 0x1405; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_10F_11F_11F_REV: types::GLenum = 0x8C3B; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_24_8: types::GLenum = 0x84FA; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_2_10_10_10_REV: types::GLenum = 0x8368; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_5_9_9_9_REV: types::GLenum = 0x8C3E; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_SAMPLER_2D: types::GLenum = 0x8DD2; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_SAMPLER_2D_ARRAY: types::GLenum = 0x8DD7; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_SAMPLER_3D: types::GLenum = 0x8DD3; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_SAMPLER_CUBE: types::GLenum = 0x8DD4; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_VEC2: types::GLenum = 0x8DC6; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_VEC3: types::GLenum = 0x8DC7; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_INT_VEC4: types::GLenum = 0x8DC8; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_NORMALIZED: types::GLenum = 0x8C17; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_SHORT: types::GLenum = 0x1403; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_SHORT_4_4_4_4: types::GLenum = 0x8033; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_SHORT_5_5_5_1: types::GLenum = 0x8034; -#[allow(dead_code, non_upper_case_globals)] pub const UNSIGNED_SHORT_5_6_5: types::GLenum = 0x8363; -#[allow(dead_code, non_upper_case_globals)] pub const VALIDATE_STATUS: types::GLenum = 0x8B83; -#[allow(dead_code, non_upper_case_globals)] pub const VENDOR: types::GLenum = 0x1F00; -#[allow(dead_code, non_upper_case_globals)] pub const VERSION: types::GLenum = 0x1F02; -#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ARRAY_BINDING: types::GLenum = 0x85B5; -#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: types::GLenum = 0x889F; -#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_DIVISOR: types::GLenum = 0x88FE; -#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_ENABLED: types::GLenum = 0x8622; -#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_INTEGER: types::GLenum = 0x88FD; -#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_NORMALIZED: types::GLenum = 0x886A; -#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_POINTER: types::GLenum = 0x8645; -#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_SIZE: types::GLenum = 0x8623; -#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_STRIDE: types::GLenum = 0x8624; -#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_ATTRIB_ARRAY_TYPE: types::GLenum = 0x8625; -#[allow(dead_code, non_upper_case_globals)] pub const VERTEX_SHADER: types::GLenum = 0x8B31; -#[allow(dead_code, non_upper_case_globals)] pub const VIEWPORT: types::GLenum = 0x0BA2; -#[allow(dead_code, non_upper_case_globals)] pub const WAIT_FAILED: types::GLenum = 0x911D; -#[allow(dead_code, non_upper_case_globals)] pub const ZERO: types::GLenum = 0; - #[allow(dead_code, missing_copy_implementations)] - #[derive(Clone)] - pub struct FnPtr { - /// The function pointer that will be used when calling the function. - f: *const __gl_imports::raw::c_void, - /// True if the pointer points to a real function, false if points to a `panic!` fn. - is_loaded: bool, - } +#[allow(dead_code, non_upper_case_globals)] +pub const ACTIVE_ATTRIBUTES: types::GLenum = 0x8B89; +#[allow(dead_code, non_upper_case_globals)] +pub const ACTIVE_ATTRIBUTE_MAX_LENGTH: types::GLenum = 0x8B8A; +#[allow(dead_code, non_upper_case_globals)] +pub const ACTIVE_TEXTURE: types::GLenum = 0x84E0; +#[allow(dead_code, non_upper_case_globals)] +pub const ACTIVE_UNIFORMS: types::GLenum = 0x8B86; +#[allow(dead_code, non_upper_case_globals)] +pub const ACTIVE_UNIFORM_BLOCKS: types::GLenum = 0x8A36; +#[allow(dead_code, non_upper_case_globals)] +pub const ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: types::GLenum = 0x8A35; +#[allow(dead_code, non_upper_case_globals)] +pub const ACTIVE_UNIFORM_MAX_LENGTH: types::GLenum = 0x8B87; +#[allow(dead_code, non_upper_case_globals)] +pub const ALIASED_LINE_WIDTH_RANGE: types::GLenum = 0x846E; +#[allow(dead_code, non_upper_case_globals)] +pub const ALIASED_POINT_SIZE_RANGE: types::GLenum = 0x846D; +#[allow(dead_code, non_upper_case_globals)] +pub const ALPHA: types::GLenum = 0x1906; +#[allow(dead_code, non_upper_case_globals)] +pub const ALPHA_BITS: types::GLenum = 0x0D55; +#[allow(dead_code, non_upper_case_globals)] +pub const ALREADY_SIGNALED: types::GLenum = 0x911A; +#[allow(dead_code, non_upper_case_globals)] +pub const ALWAYS: types::GLenum = 0x0207; +#[allow(dead_code, non_upper_case_globals)] +pub const ANY_SAMPLES_PASSED: types::GLenum = 0x8C2F; +#[allow(dead_code, non_upper_case_globals)] +pub const ANY_SAMPLES_PASSED_CONSERVATIVE: types::GLenum = 0x8D6A; +#[allow(dead_code, non_upper_case_globals)] +pub const ARRAY_BUFFER: types::GLenum = 0x8892; +#[allow(dead_code, non_upper_case_globals)] +pub const ARRAY_BUFFER_BINDING: types::GLenum = 0x8894; +#[allow(dead_code, non_upper_case_globals)] +pub const ATTACHED_SHADERS: types::GLenum = 0x8B85; +#[allow(dead_code, non_upper_case_globals)] +pub const BACK: types::GLenum = 0x0405; +#[allow(dead_code, non_upper_case_globals)] +pub const BLEND: types::GLenum = 0x0BE2; +#[allow(dead_code, non_upper_case_globals)] +pub const BLEND_COLOR: types::GLenum = 0x8005; +#[allow(dead_code, non_upper_case_globals)] +pub const BLEND_DST_ALPHA: types::GLenum = 0x80CA; +#[allow(dead_code, non_upper_case_globals)] +pub const BLEND_DST_RGB: types::GLenum = 0x80C8; +#[allow(dead_code, non_upper_case_globals)] +pub const BLEND_EQUATION: types::GLenum = 0x8009; +#[allow(dead_code, non_upper_case_globals)] +pub const BLEND_EQUATION_ALPHA: types::GLenum = 0x883D; +#[allow(dead_code, non_upper_case_globals)] +pub const BLEND_EQUATION_RGB: types::GLenum = 0x8009; +#[allow(dead_code, non_upper_case_globals)] +pub const BLEND_SRC_ALPHA: types::GLenum = 0x80CB; +#[allow(dead_code, non_upper_case_globals)] +pub const BLEND_SRC_RGB: types::GLenum = 0x80C9; +#[allow(dead_code, non_upper_case_globals)] +pub const BLUE: types::GLenum = 0x1905; +#[allow(dead_code, non_upper_case_globals)] +pub const BLUE_BITS: types::GLenum = 0x0D54; +#[allow(dead_code, non_upper_case_globals)] +pub const BOOL: types::GLenum = 0x8B56; +#[allow(dead_code, non_upper_case_globals)] +pub const BOOL_VEC2: types::GLenum = 0x8B57; +#[allow(dead_code, non_upper_case_globals)] +pub const BOOL_VEC3: types::GLenum = 0x8B58; +#[allow(dead_code, non_upper_case_globals)] +pub const BOOL_VEC4: types::GLenum = 0x8B59; +#[allow(dead_code, non_upper_case_globals)] +pub const BUFFER_ACCESS_FLAGS: types::GLenum = 0x911F; +#[allow(dead_code, non_upper_case_globals)] +pub const BUFFER_MAPPED: types::GLenum = 0x88BC; +#[allow(dead_code, non_upper_case_globals)] +pub const BUFFER_MAP_LENGTH: types::GLenum = 0x9120; +#[allow(dead_code, non_upper_case_globals)] +pub const BUFFER_MAP_OFFSET: types::GLenum = 0x9121; +#[allow(dead_code, non_upper_case_globals)] +pub const BUFFER_MAP_POINTER: types::GLenum = 0x88BD; +#[allow(dead_code, non_upper_case_globals)] +pub const BUFFER_SIZE: types::GLenum = 0x8764; +#[allow(dead_code, non_upper_case_globals)] +pub const BUFFER_USAGE: types::GLenum = 0x8765; +#[allow(dead_code, non_upper_case_globals)] +pub const BYTE: types::GLenum = 0x1400; +#[allow(dead_code, non_upper_case_globals)] +pub const CCW: types::GLenum = 0x0901; +#[allow(dead_code, non_upper_case_globals)] +pub const CLAMP_TO_EDGE: types::GLenum = 0x812F; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR: types::GLenum = 0x1800; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT0: types::GLenum = 0x8CE0; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT1: types::GLenum = 0x8CE1; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT10: types::GLenum = 0x8CEA; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT11: types::GLenum = 0x8CEB; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT12: types::GLenum = 0x8CEC; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT13: types::GLenum = 0x8CED; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT14: types::GLenum = 0x8CEE; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT15: types::GLenum = 0x8CEF; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT16: types::GLenum = 0x8CF0; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT17: types::GLenum = 0x8CF1; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT18: types::GLenum = 0x8CF2; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT19: types::GLenum = 0x8CF3; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT2: types::GLenum = 0x8CE2; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT20: types::GLenum = 0x8CF4; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT21: types::GLenum = 0x8CF5; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT22: types::GLenum = 0x8CF6; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT23: types::GLenum = 0x8CF7; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT24: types::GLenum = 0x8CF8; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT25: types::GLenum = 0x8CF9; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT26: types::GLenum = 0x8CFA; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT27: types::GLenum = 0x8CFB; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT28: types::GLenum = 0x8CFC; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT29: types::GLenum = 0x8CFD; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT3: types::GLenum = 0x8CE3; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT30: types::GLenum = 0x8CFE; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT31: types::GLenum = 0x8CFF; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT4: types::GLenum = 0x8CE4; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT5: types::GLenum = 0x8CE5; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT6: types::GLenum = 0x8CE6; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT7: types::GLenum = 0x8CE7; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT8: types::GLenum = 0x8CE8; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_ATTACHMENT9: types::GLenum = 0x8CE9; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_BUFFER_BIT: types::GLenum = 0x00004000; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_CLEAR_VALUE: types::GLenum = 0x0C22; +#[allow(dead_code, non_upper_case_globals)] +pub const COLOR_WRITEMASK: types::GLenum = 0x0C23; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPARE_REF_TO_TEXTURE: types::GLenum = 0x884E; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPILE_STATUS: types::GLenum = 0x8B81; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPRESSED_R11_EAC: types::GLenum = 0x9270; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPRESSED_RG11_EAC: types::GLenum = 0x9272; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPRESSED_RGB8_ETC2: types::GLenum = 0x9274; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: types::GLenum = 0x9276; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPRESSED_RGBA8_ETC2_EAC: types::GLenum = 0x9278; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPRESSED_SIGNED_R11_EAC: types::GLenum = 0x9271; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPRESSED_SIGNED_RG11_EAC: types::GLenum = 0x9273; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: types::GLenum = 0x9279; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPRESSED_SRGB8_ETC2: types::GLenum = 0x9275; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: types::GLenum = 0x9277; +#[allow(dead_code, non_upper_case_globals)] +pub const COMPRESSED_TEXTURE_FORMATS: types::GLenum = 0x86A3; +#[allow(dead_code, non_upper_case_globals)] +pub const CONDITION_SATISFIED: types::GLenum = 0x911C; +#[allow(dead_code, non_upper_case_globals)] +pub const CONSTANT_ALPHA: types::GLenum = 0x8003; +#[allow(dead_code, non_upper_case_globals)] +pub const CONSTANT_COLOR: types::GLenum = 0x8001; +#[allow(dead_code, non_upper_case_globals)] +pub const COPY_READ_BUFFER: types::GLenum = 0x8F36; +#[allow(dead_code, non_upper_case_globals)] +pub const COPY_READ_BUFFER_BINDING: types::GLenum = 0x8F36; +#[allow(dead_code, non_upper_case_globals)] +pub const COPY_WRITE_BUFFER: types::GLenum = 0x8F37; +#[allow(dead_code, non_upper_case_globals)] +pub const COPY_WRITE_BUFFER_BINDING: types::GLenum = 0x8F37; +#[allow(dead_code, non_upper_case_globals)] +pub const CULL_FACE: types::GLenum = 0x0B44; +#[allow(dead_code, non_upper_case_globals)] +pub const CULL_FACE_MODE: types::GLenum = 0x0B45; +#[allow(dead_code, non_upper_case_globals)] +pub const CURRENT_PROGRAM: types::GLenum = 0x8B8D; +#[allow(dead_code, non_upper_case_globals)] +pub const CURRENT_QUERY: types::GLenum = 0x8865; +#[allow(dead_code, non_upper_case_globals)] +pub const CURRENT_VERTEX_ATTRIB: types::GLenum = 0x8626; +#[allow(dead_code, non_upper_case_globals)] +pub const CW: types::GLenum = 0x0900; +#[allow(dead_code, non_upper_case_globals)] +pub const DECR: types::GLenum = 0x1E03; +#[allow(dead_code, non_upper_case_globals)] +pub const DECR_WRAP: types::GLenum = 0x8508; +#[allow(dead_code, non_upper_case_globals)] +pub const DELETE_STATUS: types::GLenum = 0x8B80; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH: types::GLenum = 0x1801; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH24_STENCIL8: types::GLenum = 0x88F0; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH32F_STENCIL8: types::GLenum = 0x8CAD; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_ATTACHMENT: types::GLenum = 0x8D00; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_BITS: types::GLenum = 0x0D56; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_BUFFER_BIT: types::GLenum = 0x00000100; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_CLEAR_VALUE: types::GLenum = 0x0B73; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_COMPONENT: types::GLenum = 0x1902; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_COMPONENT16: types::GLenum = 0x81A5; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_COMPONENT24: types::GLenum = 0x81A6; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_COMPONENT32F: types::GLenum = 0x8CAC; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_FUNC: types::GLenum = 0x0B74; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_RANGE: types::GLenum = 0x0B70; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_STENCIL: types::GLenum = 0x84F9; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_STENCIL_ATTACHMENT: types::GLenum = 0x821A; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_TEST: types::GLenum = 0x0B71; +#[allow(dead_code, non_upper_case_globals)] +pub const DEPTH_WRITEMASK: types::GLenum = 0x0B72; +#[allow(dead_code, non_upper_case_globals)] +pub const DITHER: types::GLenum = 0x0BD0; +#[allow(dead_code, non_upper_case_globals)] +pub const DONT_CARE: types::GLenum = 0x1100; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER0: types::GLenum = 0x8825; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER1: types::GLenum = 0x8826; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER10: types::GLenum = 0x882F; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER11: types::GLenum = 0x8830; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER12: types::GLenum = 0x8831; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER13: types::GLenum = 0x8832; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER14: types::GLenum = 0x8833; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER15: types::GLenum = 0x8834; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER2: types::GLenum = 0x8827; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER3: types::GLenum = 0x8828; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER4: types::GLenum = 0x8829; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER5: types::GLenum = 0x882A; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER6: types::GLenum = 0x882B; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER7: types::GLenum = 0x882C; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER8: types::GLenum = 0x882D; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_BUFFER9: types::GLenum = 0x882E; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_FRAMEBUFFER: types::GLenum = 0x8CA9; +#[allow(dead_code, non_upper_case_globals)] +pub const DRAW_FRAMEBUFFER_BINDING: types::GLenum = 0x8CA6; +#[allow(dead_code, non_upper_case_globals)] +pub const DST_ALPHA: types::GLenum = 0x0304; +#[allow(dead_code, non_upper_case_globals)] +pub const DST_COLOR: types::GLenum = 0x0306; +#[allow(dead_code, non_upper_case_globals)] +pub const DYNAMIC_COPY: types::GLenum = 0x88EA; +#[allow(dead_code, non_upper_case_globals)] +pub const DYNAMIC_DRAW: types::GLenum = 0x88E8; +#[allow(dead_code, non_upper_case_globals)] +pub const DYNAMIC_READ: types::GLenum = 0x88E9; +#[allow(dead_code, non_upper_case_globals)] +pub const ELEMENT_ARRAY_BUFFER: types::GLenum = 0x8893; +#[allow(dead_code, non_upper_case_globals)] +pub const ELEMENT_ARRAY_BUFFER_BINDING: types::GLenum = 0x8895; +#[allow(dead_code, non_upper_case_globals)] +pub const EQUAL: types::GLenum = 0x0202; +#[allow(dead_code, non_upper_case_globals)] +pub const EXTENSIONS: types::GLenum = 0x1F03; +#[allow(dead_code, non_upper_case_globals)] +pub const FALSE: types::GLboolean = 0; +#[allow(dead_code, non_upper_case_globals)] +pub const FASTEST: types::GLenum = 0x1101; +#[allow(dead_code, non_upper_case_globals)] +pub const FIXED: types::GLenum = 0x140C; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT: types::GLenum = 0x1406; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_32_UNSIGNED_INT_24_8_REV: types::GLenum = 0x8DAD; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_MAT2: types::GLenum = 0x8B5A; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_MAT2x3: types::GLenum = 0x8B65; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_MAT2x4: types::GLenum = 0x8B66; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_MAT3: types::GLenum = 0x8B5B; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_MAT3x2: types::GLenum = 0x8B67; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_MAT3x4: types::GLenum = 0x8B68; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_MAT4: types::GLenum = 0x8B5C; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_MAT4x2: types::GLenum = 0x8B69; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_MAT4x3: types::GLenum = 0x8B6A; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_VEC2: types::GLenum = 0x8B50; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_VEC3: types::GLenum = 0x8B51; +#[allow(dead_code, non_upper_case_globals)] +pub const FLOAT_VEC4: types::GLenum = 0x8B52; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAGMENT_SHADER: types::GLenum = 0x8B30; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAGMENT_SHADER_DERIVATIVE_HINT: types::GLenum = 0x8B8B; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER: types::GLenum = 0x8D40; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: types::GLenum = 0x8215; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: types::GLenum = 0x8214; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: types::GLenum = 0x8210; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: types::GLenum = 0x8211; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: types::GLenum = 0x8216; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: types::GLenum = 0x8213; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: types::GLenum = 0x8CD1; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: types::GLenum = 0x8CD0; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_RED_SIZE: types::GLenum = 0x8212; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: types::GLenum = 0x8217; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: types::GLenum = 0x8CD3; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: types::GLenum = 0x8CD4; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: types::GLenum = 0x8CD2; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_BINDING: types::GLenum = 0x8CA6; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_COMPLETE: types::GLenum = 0x8CD5; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_DEFAULT: types::GLenum = 0x8218; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_INCOMPLETE_ATTACHMENT: types::GLenum = 0x8CD6; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_INCOMPLETE_DIMENSIONS: types::GLenum = 0x8CD9; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: types::GLenum = 0x8CD7; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: types::GLenum = 0x8D56; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_UNDEFINED: types::GLenum = 0x8219; +#[allow(dead_code, non_upper_case_globals)] +pub const FRAMEBUFFER_UNSUPPORTED: types::GLenum = 0x8CDD; +#[allow(dead_code, non_upper_case_globals)] +pub const FRONT: types::GLenum = 0x0404; +#[allow(dead_code, non_upper_case_globals)] +pub const FRONT_AND_BACK: types::GLenum = 0x0408; +#[allow(dead_code, non_upper_case_globals)] +pub const FRONT_FACE: types::GLenum = 0x0B46; +#[allow(dead_code, non_upper_case_globals)] +pub const FUNC_ADD: types::GLenum = 0x8006; +#[allow(dead_code, non_upper_case_globals)] +pub const FUNC_REVERSE_SUBTRACT: types::GLenum = 0x800B; +#[allow(dead_code, non_upper_case_globals)] +pub const FUNC_SUBTRACT: types::GLenum = 0x800A; +#[allow(dead_code, non_upper_case_globals)] +pub const GENERATE_MIPMAP_HINT: types::GLenum = 0x8192; +#[allow(dead_code, non_upper_case_globals)] +pub const GEQUAL: types::GLenum = 0x0206; +#[allow(dead_code, non_upper_case_globals)] +pub const GREATER: types::GLenum = 0x0204; +#[allow(dead_code, non_upper_case_globals)] +pub const GREEN: types::GLenum = 0x1904; +#[allow(dead_code, non_upper_case_globals)] +pub const GREEN_BITS: types::GLenum = 0x0D53; +#[allow(dead_code, non_upper_case_globals)] +pub const HALF_FLOAT: types::GLenum = 0x140B; +#[allow(dead_code, non_upper_case_globals)] +pub const HIGH_FLOAT: types::GLenum = 0x8DF2; +#[allow(dead_code, non_upper_case_globals)] +pub const HIGH_INT: types::GLenum = 0x8DF5; +#[allow(dead_code, non_upper_case_globals)] +pub const IMPLEMENTATION_COLOR_READ_FORMAT: types::GLenum = 0x8B9B; +#[allow(dead_code, non_upper_case_globals)] +pub const IMPLEMENTATION_COLOR_READ_TYPE: types::GLenum = 0x8B9A; +#[allow(dead_code, non_upper_case_globals)] +pub const INCR: types::GLenum = 0x1E02; +#[allow(dead_code, non_upper_case_globals)] +pub const INCR_WRAP: types::GLenum = 0x8507; +#[allow(dead_code, non_upper_case_globals)] +pub const INFO_LOG_LENGTH: types::GLenum = 0x8B84; +#[allow(dead_code, non_upper_case_globals)] +pub const INT: types::GLenum = 0x1404; +#[allow(dead_code, non_upper_case_globals)] +pub const INTERLEAVED_ATTRIBS: types::GLenum = 0x8C8C; +#[allow(dead_code, non_upper_case_globals)] +pub const INT_2_10_10_10_REV: types::GLenum = 0x8D9F; +#[allow(dead_code, non_upper_case_globals)] +pub const INT_SAMPLER_2D: types::GLenum = 0x8DCA; +#[allow(dead_code, non_upper_case_globals)] +pub const INT_SAMPLER_2D_ARRAY: types::GLenum = 0x8DCF; +#[allow(dead_code, non_upper_case_globals)] +pub const INT_SAMPLER_3D: types::GLenum = 0x8DCB; +#[allow(dead_code, non_upper_case_globals)] +pub const INT_SAMPLER_CUBE: types::GLenum = 0x8DCC; +#[allow(dead_code, non_upper_case_globals)] +pub const INT_VEC2: types::GLenum = 0x8B53; +#[allow(dead_code, non_upper_case_globals)] +pub const INT_VEC3: types::GLenum = 0x8B54; +#[allow(dead_code, non_upper_case_globals)] +pub const INT_VEC4: types::GLenum = 0x8B55; +#[allow(dead_code, non_upper_case_globals)] +pub const INVALID_ENUM: types::GLenum = 0x0500; +#[allow(dead_code, non_upper_case_globals)] +pub const INVALID_FRAMEBUFFER_OPERATION: types::GLenum = 0x0506; +#[allow(dead_code, non_upper_case_globals)] +pub const INVALID_INDEX: types::GLuint = 0xFFFFFFFF; +#[allow(dead_code, non_upper_case_globals)] +pub const INVALID_OPERATION: types::GLenum = 0x0502; +#[allow(dead_code, non_upper_case_globals)] +pub const INVALID_VALUE: types::GLenum = 0x0501; +#[allow(dead_code, non_upper_case_globals)] +pub const INVERT: types::GLenum = 0x150A; +#[allow(dead_code, non_upper_case_globals)] +pub const KEEP: types::GLenum = 0x1E00; +#[allow(dead_code, non_upper_case_globals)] +pub const LEQUAL: types::GLenum = 0x0203; +#[allow(dead_code, non_upper_case_globals)] +pub const LESS: types::GLenum = 0x0201; +#[allow(dead_code, non_upper_case_globals)] +pub const LINEAR: types::GLenum = 0x2601; +#[allow(dead_code, non_upper_case_globals)] +pub const LINEAR_MIPMAP_LINEAR: types::GLenum = 0x2703; +#[allow(dead_code, non_upper_case_globals)] +pub const LINEAR_MIPMAP_NEAREST: types::GLenum = 0x2701; +#[allow(dead_code, non_upper_case_globals)] +pub const LINES: types::GLenum = 0x0001; +#[allow(dead_code, non_upper_case_globals)] +pub const LINE_LOOP: types::GLenum = 0x0002; +#[allow(dead_code, non_upper_case_globals)] +pub const LINE_STRIP: types::GLenum = 0x0003; +#[allow(dead_code, non_upper_case_globals)] +pub const LINE_WIDTH: types::GLenum = 0x0B21; +#[allow(dead_code, non_upper_case_globals)] +pub const LINK_STATUS: types::GLenum = 0x8B82; +#[allow(dead_code, non_upper_case_globals)] +pub const LOW_FLOAT: types::GLenum = 0x8DF0; +#[allow(dead_code, non_upper_case_globals)] +pub const LOW_INT: types::GLenum = 0x8DF3; +#[allow(dead_code, non_upper_case_globals)] +pub const LUMINANCE: types::GLenum = 0x1909; +#[allow(dead_code, non_upper_case_globals)] +pub const LUMINANCE_ALPHA: types::GLenum = 0x190A; +#[allow(dead_code, non_upper_case_globals)] +pub const MAJOR_VERSION: types::GLenum = 0x821B; +#[allow(dead_code, non_upper_case_globals)] +pub const MAP_FLUSH_EXPLICIT_BIT: types::GLenum = 0x0010; +#[allow(dead_code, non_upper_case_globals)] +pub const MAP_INVALIDATE_BUFFER_BIT: types::GLenum = 0x0008; +#[allow(dead_code, non_upper_case_globals)] +pub const MAP_INVALIDATE_RANGE_BIT: types::GLenum = 0x0004; +#[allow(dead_code, non_upper_case_globals)] +pub const MAP_READ_BIT: types::GLenum = 0x0001; +#[allow(dead_code, non_upper_case_globals)] +pub const MAP_UNSYNCHRONIZED_BIT: types::GLenum = 0x0020; +#[allow(dead_code, non_upper_case_globals)] +pub const MAP_WRITE_BIT: types::GLenum = 0x0002; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX: types::GLenum = 0x8008; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_3D_TEXTURE_SIZE: types::GLenum = 0x8073; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_ARRAY_TEXTURE_LAYERS: types::GLenum = 0x88FF; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_COLOR_ATTACHMENTS: types::GLenum = 0x8CDF; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: types::GLenum = 0x8A33; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_COMBINED_TEXTURE_IMAGE_UNITS: types::GLenum = 0x8B4D; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_COMBINED_UNIFORM_BLOCKS: types::GLenum = 0x8A2E; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: types::GLenum = 0x8A31; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_CUBE_MAP_TEXTURE_SIZE: types::GLenum = 0x851C; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_DRAW_BUFFERS: types::GLenum = 0x8824; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_ELEMENTS_INDICES: types::GLenum = 0x80E9; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_ELEMENTS_VERTICES: types::GLenum = 0x80E8; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_ELEMENT_INDEX: types::GLenum = 0x8D6B; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_FRAGMENT_INPUT_COMPONENTS: types::GLenum = 0x9125; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_FRAGMENT_UNIFORM_BLOCKS: types::GLenum = 0x8A2D; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_FRAGMENT_UNIFORM_COMPONENTS: types::GLenum = 0x8B49; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_FRAGMENT_UNIFORM_VECTORS: types::GLenum = 0x8DFD; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_PROGRAM_TEXEL_OFFSET: types::GLenum = 0x8905; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_RENDERBUFFER_SIZE: types::GLenum = 0x84E8; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_SAMPLES: types::GLenum = 0x8D57; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_SERVER_WAIT_TIMEOUT: types::GLenum = 0x9111; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_TEXTURE_IMAGE_UNITS: types::GLenum = 0x8872; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_TEXTURE_LOD_BIAS: types::GLenum = 0x84FD; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_TEXTURE_SIZE: types::GLenum = 0x0D33; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: types::GLenum = 0x8C8A; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: types::GLenum = 0x8C8B; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: types::GLenum = 0x8C80; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_UNIFORM_BLOCK_SIZE: types::GLenum = 0x8A30; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_UNIFORM_BUFFER_BINDINGS: types::GLenum = 0x8A2F; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_VARYING_COMPONENTS: types::GLenum = 0x8B4B; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_VARYING_VECTORS: types::GLenum = 0x8DFC; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_VERTEX_ATTRIBS: types::GLenum = 0x8869; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_VERTEX_OUTPUT_COMPONENTS: types::GLenum = 0x9122; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_VERTEX_TEXTURE_IMAGE_UNITS: types::GLenum = 0x8B4C; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_VERTEX_UNIFORM_BLOCKS: types::GLenum = 0x8A2B; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_VERTEX_UNIFORM_COMPONENTS: types::GLenum = 0x8B4A; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_VERTEX_UNIFORM_VECTORS: types::GLenum = 0x8DFB; +#[allow(dead_code, non_upper_case_globals)] +pub const MAX_VIEWPORT_DIMS: types::GLenum = 0x0D3A; +#[allow(dead_code, non_upper_case_globals)] +pub const MEDIUM_FLOAT: types::GLenum = 0x8DF1; +#[allow(dead_code, non_upper_case_globals)] +pub const MEDIUM_INT: types::GLenum = 0x8DF4; +#[allow(dead_code, non_upper_case_globals)] +pub const MIN: types::GLenum = 0x8007; +#[allow(dead_code, non_upper_case_globals)] +pub const MINOR_VERSION: types::GLenum = 0x821C; +#[allow(dead_code, non_upper_case_globals)] +pub const MIN_PROGRAM_TEXEL_OFFSET: types::GLenum = 0x8904; +#[allow(dead_code, non_upper_case_globals)] +pub const MIRRORED_REPEAT: types::GLenum = 0x8370; +#[allow(dead_code, non_upper_case_globals)] +pub const NEAREST: types::GLenum = 0x2600; +#[allow(dead_code, non_upper_case_globals)] +pub const NEAREST_MIPMAP_LINEAR: types::GLenum = 0x2702; +#[allow(dead_code, non_upper_case_globals)] +pub const NEAREST_MIPMAP_NEAREST: types::GLenum = 0x2700; +#[allow(dead_code, non_upper_case_globals)] +pub const NEVER: types::GLenum = 0x0200; +#[allow(dead_code, non_upper_case_globals)] +pub const NICEST: types::GLenum = 0x1102; +#[allow(dead_code, non_upper_case_globals)] +pub const NONE: types::GLenum = 0; +#[allow(dead_code, non_upper_case_globals)] +pub const NOTEQUAL: types::GLenum = 0x0205; +#[allow(dead_code, non_upper_case_globals)] +pub const NO_ERROR: types::GLenum = 0; +#[allow(dead_code, non_upper_case_globals)] +pub const NUM_COMPRESSED_TEXTURE_FORMATS: types::GLenum = 0x86A2; +#[allow(dead_code, non_upper_case_globals)] +pub const NUM_EXTENSIONS: types::GLenum = 0x821D; +#[allow(dead_code, non_upper_case_globals)] +pub const NUM_PROGRAM_BINARY_FORMATS: types::GLenum = 0x87FE; +#[allow(dead_code, non_upper_case_globals)] +pub const NUM_SAMPLE_COUNTS: types::GLenum = 0x9380; +#[allow(dead_code, non_upper_case_globals)] +pub const NUM_SHADER_BINARY_FORMATS: types::GLenum = 0x8DF9; +#[allow(dead_code, non_upper_case_globals)] +pub const OBJECT_TYPE: types::GLenum = 0x9112; +#[allow(dead_code, non_upper_case_globals)] +pub const ONE: types::GLenum = 1; +#[allow(dead_code, non_upper_case_globals)] +pub const ONE_MINUS_CONSTANT_ALPHA: types::GLenum = 0x8004; +#[allow(dead_code, non_upper_case_globals)] +pub const ONE_MINUS_CONSTANT_COLOR: types::GLenum = 0x8002; +#[allow(dead_code, non_upper_case_globals)] +pub const ONE_MINUS_DST_ALPHA: types::GLenum = 0x0305; +#[allow(dead_code, non_upper_case_globals)] +pub const ONE_MINUS_DST_COLOR: types::GLenum = 0x0307; +#[allow(dead_code, non_upper_case_globals)] +pub const ONE_MINUS_SRC_ALPHA: types::GLenum = 0x0303; +#[allow(dead_code, non_upper_case_globals)] +pub const ONE_MINUS_SRC_COLOR: types::GLenum = 0x0301; +#[allow(dead_code, non_upper_case_globals)] +pub const OUT_OF_MEMORY: types::GLenum = 0x0505; +#[allow(dead_code, non_upper_case_globals)] +pub const PACK_ALIGNMENT: types::GLenum = 0x0D05; +#[allow(dead_code, non_upper_case_globals)] +pub const PACK_ROW_LENGTH: types::GLenum = 0x0D02; +#[allow(dead_code, non_upper_case_globals)] +pub const PACK_SKIP_PIXELS: types::GLenum = 0x0D04; +#[allow(dead_code, non_upper_case_globals)] +pub const PACK_SKIP_ROWS: types::GLenum = 0x0D03; +#[allow(dead_code, non_upper_case_globals)] +pub const PIXEL_PACK_BUFFER: types::GLenum = 0x88EB; +#[allow(dead_code, non_upper_case_globals)] +pub const PIXEL_PACK_BUFFER_BINDING: types::GLenum = 0x88ED; +#[allow(dead_code, non_upper_case_globals)] +pub const PIXEL_UNPACK_BUFFER: types::GLenum = 0x88EC; +#[allow(dead_code, non_upper_case_globals)] +pub const PIXEL_UNPACK_BUFFER_BINDING: types::GLenum = 0x88EF; +#[allow(dead_code, non_upper_case_globals)] +pub const POINTS: types::GLenum = 0x0000; +#[allow(dead_code, non_upper_case_globals)] +pub const POLYGON_OFFSET_FACTOR: types::GLenum = 0x8038; +#[allow(dead_code, non_upper_case_globals)] +pub const POLYGON_OFFSET_FILL: types::GLenum = 0x8037; +#[allow(dead_code, non_upper_case_globals)] +pub const POLYGON_OFFSET_UNITS: types::GLenum = 0x2A00; +#[allow(dead_code, non_upper_case_globals)] +pub const PRIMITIVE_RESTART_FIXED_INDEX: types::GLenum = 0x8D69; +#[allow(dead_code, non_upper_case_globals)] +pub const PROGRAM_BINARY_FORMATS: types::GLenum = 0x87FF; +#[allow(dead_code, non_upper_case_globals)] +pub const PROGRAM_BINARY_LENGTH: types::GLenum = 0x8741; +#[allow(dead_code, non_upper_case_globals)] +pub const PROGRAM_BINARY_RETRIEVABLE_HINT: types::GLenum = 0x8257; +#[allow(dead_code, non_upper_case_globals)] +pub const QUERY_RESULT: types::GLenum = 0x8866; +#[allow(dead_code, non_upper_case_globals)] +pub const QUERY_RESULT_AVAILABLE: types::GLenum = 0x8867; +#[allow(dead_code, non_upper_case_globals)] +pub const R11F_G11F_B10F: types::GLenum = 0x8C3A; +#[allow(dead_code, non_upper_case_globals)] +pub const R16F: types::GLenum = 0x822D; +#[allow(dead_code, non_upper_case_globals)] +pub const R16I: types::GLenum = 0x8233; +#[allow(dead_code, non_upper_case_globals)] +pub const R16UI: types::GLenum = 0x8234; +#[allow(dead_code, non_upper_case_globals)] +pub const R32F: types::GLenum = 0x822E; +#[allow(dead_code, non_upper_case_globals)] +pub const R32I: types::GLenum = 0x8235; +#[allow(dead_code, non_upper_case_globals)] +pub const R32UI: types::GLenum = 0x8236; +#[allow(dead_code, non_upper_case_globals)] +pub const R8: types::GLenum = 0x8229; +#[allow(dead_code, non_upper_case_globals)] +pub const R8I: types::GLenum = 0x8231; +#[allow(dead_code, non_upper_case_globals)] +pub const R8UI: types::GLenum = 0x8232; +#[allow(dead_code, non_upper_case_globals)] +pub const R8_SNORM: types::GLenum = 0x8F94; +#[allow(dead_code, non_upper_case_globals)] +pub const RASTERIZER_DISCARD: types::GLenum = 0x8C89; +#[allow(dead_code, non_upper_case_globals)] +pub const READ_BUFFER: types::GLenum = 0x0C02; +#[allow(dead_code, non_upper_case_globals)] +pub const READ_FRAMEBUFFER: types::GLenum = 0x8CA8; +#[allow(dead_code, non_upper_case_globals)] +pub const READ_FRAMEBUFFER_BINDING: types::GLenum = 0x8CAA; +#[allow(dead_code, non_upper_case_globals)] +pub const RED: types::GLenum = 0x1903; +#[allow(dead_code, non_upper_case_globals)] +pub const RED_BITS: types::GLenum = 0x0D52; +#[allow(dead_code, non_upper_case_globals)] +pub const RED_INTEGER: types::GLenum = 0x8D94; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERBUFFER: types::GLenum = 0x8D41; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERBUFFER_ALPHA_SIZE: types::GLenum = 0x8D53; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERBUFFER_BINDING: types::GLenum = 0x8CA7; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERBUFFER_BLUE_SIZE: types::GLenum = 0x8D52; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERBUFFER_DEPTH_SIZE: types::GLenum = 0x8D54; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERBUFFER_GREEN_SIZE: types::GLenum = 0x8D51; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERBUFFER_HEIGHT: types::GLenum = 0x8D43; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERBUFFER_INTERNAL_FORMAT: types::GLenum = 0x8D44; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERBUFFER_RED_SIZE: types::GLenum = 0x8D50; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERBUFFER_SAMPLES: types::GLenum = 0x8CAB; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERBUFFER_STENCIL_SIZE: types::GLenum = 0x8D55; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERBUFFER_WIDTH: types::GLenum = 0x8D42; +#[allow(dead_code, non_upper_case_globals)] +pub const RENDERER: types::GLenum = 0x1F01; +#[allow(dead_code, non_upper_case_globals)] +pub const REPEAT: types::GLenum = 0x2901; +#[allow(dead_code, non_upper_case_globals)] +pub const REPLACE: types::GLenum = 0x1E01; +#[allow(dead_code, non_upper_case_globals)] +pub const RG: types::GLenum = 0x8227; +#[allow(dead_code, non_upper_case_globals)] +pub const RG16F: types::GLenum = 0x822F; +#[allow(dead_code, non_upper_case_globals)] +pub const RG16I: types::GLenum = 0x8239; +#[allow(dead_code, non_upper_case_globals)] +pub const RG16UI: types::GLenum = 0x823A; +#[allow(dead_code, non_upper_case_globals)] +pub const RG32F: types::GLenum = 0x8230; +#[allow(dead_code, non_upper_case_globals)] +pub const RG32I: types::GLenum = 0x823B; +#[allow(dead_code, non_upper_case_globals)] +pub const RG32UI: types::GLenum = 0x823C; +#[allow(dead_code, non_upper_case_globals)] +pub const RG8: types::GLenum = 0x822B; +#[allow(dead_code, non_upper_case_globals)] +pub const RG8I: types::GLenum = 0x8237; +#[allow(dead_code, non_upper_case_globals)] +pub const RG8UI: types::GLenum = 0x8238; +#[allow(dead_code, non_upper_case_globals)] +pub const RG8_SNORM: types::GLenum = 0x8F95; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB: types::GLenum = 0x1907; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB10_A2: types::GLenum = 0x8059; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB10_A2UI: types::GLenum = 0x906F; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB16F: types::GLenum = 0x881B; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB16I: types::GLenum = 0x8D89; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB16UI: types::GLenum = 0x8D77; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB32F: types::GLenum = 0x8815; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB32I: types::GLenum = 0x8D83; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB32UI: types::GLenum = 0x8D71; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB565: types::GLenum = 0x8D62; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB5_A1: types::GLenum = 0x8057; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB8: types::GLenum = 0x8051; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB8I: types::GLenum = 0x8D8F; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB8UI: types::GLenum = 0x8D7D; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB8_SNORM: types::GLenum = 0x8F96; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB9_E5: types::GLenum = 0x8C3D; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA: types::GLenum = 0x1908; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA16F: types::GLenum = 0x881A; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA16I: types::GLenum = 0x8D88; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA16UI: types::GLenum = 0x8D76; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA32F: types::GLenum = 0x8814; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA32I: types::GLenum = 0x8D82; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA32UI: types::GLenum = 0x8D70; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA4: types::GLenum = 0x8056; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA8: types::GLenum = 0x8058; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA8I: types::GLenum = 0x8D8E; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA8UI: types::GLenum = 0x8D7C; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA8_SNORM: types::GLenum = 0x8F97; +#[allow(dead_code, non_upper_case_globals)] +pub const RGBA_INTEGER: types::GLenum = 0x8D99; +#[allow(dead_code, non_upper_case_globals)] +pub const RGB_INTEGER: types::GLenum = 0x8D98; +#[allow(dead_code, non_upper_case_globals)] +pub const RG_INTEGER: types::GLenum = 0x8228; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLER_2D: types::GLenum = 0x8B5E; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLER_2D_ARRAY: types::GLenum = 0x8DC1; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLER_2D_ARRAY_SHADOW: types::GLenum = 0x8DC4; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLER_2D_SHADOW: types::GLenum = 0x8B62; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLER_3D: types::GLenum = 0x8B5F; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLER_BINDING: types::GLenum = 0x8919; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLER_CUBE: types::GLenum = 0x8B60; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLER_CUBE_SHADOW: types::GLenum = 0x8DC5; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLES: types::GLenum = 0x80A9; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLE_ALPHA_TO_COVERAGE: types::GLenum = 0x809E; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLE_BUFFERS: types::GLenum = 0x80A8; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLE_COVERAGE: types::GLenum = 0x80A0; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLE_COVERAGE_INVERT: types::GLenum = 0x80AB; +#[allow(dead_code, non_upper_case_globals)] +pub const SAMPLE_COVERAGE_VALUE: types::GLenum = 0x80AA; +#[allow(dead_code, non_upper_case_globals)] +pub const SCISSOR_BOX: types::GLenum = 0x0C10; +#[allow(dead_code, non_upper_case_globals)] +pub const SCISSOR_TEST: types::GLenum = 0x0C11; +#[allow(dead_code, non_upper_case_globals)] +pub const SEPARATE_ATTRIBS: types::GLenum = 0x8C8D; +#[allow(dead_code, non_upper_case_globals)] +pub const SHADER_BINARY_FORMATS: types::GLenum = 0x8DF8; +#[allow(dead_code, non_upper_case_globals)] +pub const SHADER_COMPILER: types::GLenum = 0x8DFA; +#[allow(dead_code, non_upper_case_globals)] +pub const SHADER_SOURCE_LENGTH: types::GLenum = 0x8B88; +#[allow(dead_code, non_upper_case_globals)] +pub const SHADER_TYPE: types::GLenum = 0x8B4F; +#[allow(dead_code, non_upper_case_globals)] +pub const SHADING_LANGUAGE_VERSION: types::GLenum = 0x8B8C; +#[allow(dead_code, non_upper_case_globals)] +pub const SHORT: types::GLenum = 0x1402; +#[allow(dead_code, non_upper_case_globals)] +pub const SIGNALED: types::GLenum = 0x9119; +#[allow(dead_code, non_upper_case_globals)] +pub const SIGNED_NORMALIZED: types::GLenum = 0x8F9C; +#[allow(dead_code, non_upper_case_globals)] +pub const SRC_ALPHA: types::GLenum = 0x0302; +#[allow(dead_code, non_upper_case_globals)] +pub const SRC_ALPHA_SATURATE: types::GLenum = 0x0308; +#[allow(dead_code, non_upper_case_globals)] +pub const SRC_COLOR: types::GLenum = 0x0300; +#[allow(dead_code, non_upper_case_globals)] +pub const SRGB: types::GLenum = 0x8C40; +#[allow(dead_code, non_upper_case_globals)] +pub const SRGB8: types::GLenum = 0x8C41; +#[allow(dead_code, non_upper_case_globals)] +pub const SRGB8_ALPHA8: types::GLenum = 0x8C43; +#[allow(dead_code, non_upper_case_globals)] +pub const STATIC_COPY: types::GLenum = 0x88E6; +#[allow(dead_code, non_upper_case_globals)] +pub const STATIC_DRAW: types::GLenum = 0x88E4; +#[allow(dead_code, non_upper_case_globals)] +pub const STATIC_READ: types::GLenum = 0x88E5; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL: types::GLenum = 0x1802; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_ATTACHMENT: types::GLenum = 0x8D20; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_BACK_FAIL: types::GLenum = 0x8801; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_BACK_FUNC: types::GLenum = 0x8800; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_BACK_PASS_DEPTH_FAIL: types::GLenum = 0x8802; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_BACK_PASS_DEPTH_PASS: types::GLenum = 0x8803; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_BACK_REF: types::GLenum = 0x8CA3; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_BACK_VALUE_MASK: types::GLenum = 0x8CA4; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_BACK_WRITEMASK: types::GLenum = 0x8CA5; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_BITS: types::GLenum = 0x0D57; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_BUFFER_BIT: types::GLenum = 0x00000400; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_CLEAR_VALUE: types::GLenum = 0x0B91; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_FAIL: types::GLenum = 0x0B94; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_FUNC: types::GLenum = 0x0B92; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_INDEX8: types::GLenum = 0x8D48; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_PASS_DEPTH_FAIL: types::GLenum = 0x0B95; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_PASS_DEPTH_PASS: types::GLenum = 0x0B96; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_REF: types::GLenum = 0x0B97; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_TEST: types::GLenum = 0x0B90; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_VALUE_MASK: types::GLenum = 0x0B93; +#[allow(dead_code, non_upper_case_globals)] +pub const STENCIL_WRITEMASK: types::GLenum = 0x0B98; +#[allow(dead_code, non_upper_case_globals)] +pub const STREAM_COPY: types::GLenum = 0x88E2; +#[allow(dead_code, non_upper_case_globals)] +pub const STREAM_DRAW: types::GLenum = 0x88E0; +#[allow(dead_code, non_upper_case_globals)] +pub const STREAM_READ: types::GLenum = 0x88E1; +#[allow(dead_code, non_upper_case_globals)] +pub const SUBPIXEL_BITS: types::GLenum = 0x0D50; +#[allow(dead_code, non_upper_case_globals)] +pub const SYNC_CONDITION: types::GLenum = 0x9113; +#[allow(dead_code, non_upper_case_globals)] +pub const SYNC_FENCE: types::GLenum = 0x9116; +#[allow(dead_code, non_upper_case_globals)] +pub const SYNC_FLAGS: types::GLenum = 0x9115; +#[allow(dead_code, non_upper_case_globals)] +pub const SYNC_FLUSH_COMMANDS_BIT: types::GLenum = 0x00000001; +#[allow(dead_code, non_upper_case_globals)] +pub const SYNC_GPU_COMMANDS_COMPLETE: types::GLenum = 0x9117; +#[allow(dead_code, non_upper_case_globals)] +pub const SYNC_STATUS: types::GLenum = 0x9114; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE: types::GLenum = 0x1702; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE0: types::GLenum = 0x84C0; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE1: types::GLenum = 0x84C1; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE10: types::GLenum = 0x84CA; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE11: types::GLenum = 0x84CB; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE12: types::GLenum = 0x84CC; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE13: types::GLenum = 0x84CD; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE14: types::GLenum = 0x84CE; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE15: types::GLenum = 0x84CF; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE16: types::GLenum = 0x84D0; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE17: types::GLenum = 0x84D1; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE18: types::GLenum = 0x84D2; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE19: types::GLenum = 0x84D3; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE2: types::GLenum = 0x84C2; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE20: types::GLenum = 0x84D4; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE21: types::GLenum = 0x84D5; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE22: types::GLenum = 0x84D6; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE23: types::GLenum = 0x84D7; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE24: types::GLenum = 0x84D8; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE25: types::GLenum = 0x84D9; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE26: types::GLenum = 0x84DA; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE27: types::GLenum = 0x84DB; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE28: types::GLenum = 0x84DC; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE29: types::GLenum = 0x84DD; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE3: types::GLenum = 0x84C3; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE30: types::GLenum = 0x84DE; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE31: types::GLenum = 0x84DF; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE4: types::GLenum = 0x84C4; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE5: types::GLenum = 0x84C5; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE6: types::GLenum = 0x84C6; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE7: types::GLenum = 0x84C7; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE8: types::GLenum = 0x84C8; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE9: types::GLenum = 0x84C9; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_2D: types::GLenum = 0x0DE1; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_2D_ARRAY: types::GLenum = 0x8C1A; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_3D: types::GLenum = 0x806F; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_BASE_LEVEL: types::GLenum = 0x813C; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_BINDING_2D: types::GLenum = 0x8069; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_BINDING_2D_ARRAY: types::GLenum = 0x8C1D; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_BINDING_3D: types::GLenum = 0x806A; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_BINDING_CUBE_MAP: types::GLenum = 0x8514; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_COMPARE_FUNC: types::GLenum = 0x884D; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_COMPARE_MODE: types::GLenum = 0x884C; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_CUBE_MAP: types::GLenum = 0x8513; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_CUBE_MAP_NEGATIVE_X: types::GLenum = 0x8516; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_CUBE_MAP_NEGATIVE_Y: types::GLenum = 0x8518; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_CUBE_MAP_NEGATIVE_Z: types::GLenum = 0x851A; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_CUBE_MAP_POSITIVE_X: types::GLenum = 0x8515; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_CUBE_MAP_POSITIVE_Y: types::GLenum = 0x8517; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_CUBE_MAP_POSITIVE_Z: types::GLenum = 0x8519; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_IMMUTABLE_FORMAT: types::GLenum = 0x912F; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_IMMUTABLE_LEVELS: types::GLenum = 0x82DF; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_MAG_FILTER: types::GLenum = 0x2800; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_MAX_LEVEL: types::GLenum = 0x813D; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_MAX_LOD: types::GLenum = 0x813B; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_MIN_FILTER: types::GLenum = 0x2801; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_MIN_LOD: types::GLenum = 0x813A; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_SWIZZLE_A: types::GLenum = 0x8E45; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_SWIZZLE_B: types::GLenum = 0x8E44; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_SWIZZLE_G: types::GLenum = 0x8E43; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_SWIZZLE_R: types::GLenum = 0x8E42; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_WRAP_R: types::GLenum = 0x8072; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_WRAP_S: types::GLenum = 0x2802; +#[allow(dead_code, non_upper_case_globals)] +pub const TEXTURE_WRAP_T: types::GLenum = 0x2803; +#[allow(dead_code, non_upper_case_globals)] +pub const TIMEOUT_EXPIRED: types::GLenum = 0x911B; +#[allow(dead_code, non_upper_case_globals)] +pub const TIMEOUT_IGNORED: types::GLuint64 = 0xFFFFFFFFFFFFFFFF; +#[allow(dead_code, non_upper_case_globals)] +pub const TRANSFORM_FEEDBACK: types::GLenum = 0x8E22; +#[allow(dead_code, non_upper_case_globals)] +pub const TRANSFORM_FEEDBACK_ACTIVE: types::GLenum = 0x8E24; +#[allow(dead_code, non_upper_case_globals)] +pub const TRANSFORM_FEEDBACK_BINDING: types::GLenum = 0x8E25; +#[allow(dead_code, non_upper_case_globals)] +pub const TRANSFORM_FEEDBACK_BUFFER: types::GLenum = 0x8C8E; +#[allow(dead_code, non_upper_case_globals)] +pub const TRANSFORM_FEEDBACK_BUFFER_BINDING: types::GLenum = 0x8C8F; +#[allow(dead_code, non_upper_case_globals)] +pub const TRANSFORM_FEEDBACK_BUFFER_MODE: types::GLenum = 0x8C7F; +#[allow(dead_code, non_upper_case_globals)] +pub const TRANSFORM_FEEDBACK_BUFFER_SIZE: types::GLenum = 0x8C85; +#[allow(dead_code, non_upper_case_globals)] +pub const TRANSFORM_FEEDBACK_BUFFER_START: types::GLenum = 0x8C84; +#[allow(dead_code, non_upper_case_globals)] +pub const TRANSFORM_FEEDBACK_PAUSED: types::GLenum = 0x8E23; +#[allow(dead_code, non_upper_case_globals)] +pub const TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: types::GLenum = 0x8C88; +#[allow(dead_code, non_upper_case_globals)] +pub const TRANSFORM_FEEDBACK_VARYINGS: types::GLenum = 0x8C83; +#[allow(dead_code, non_upper_case_globals)] +pub const TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: types::GLenum = 0x8C76; +#[allow(dead_code, non_upper_case_globals)] +pub const TRIANGLES: types::GLenum = 0x0004; +#[allow(dead_code, non_upper_case_globals)] +pub const TRIANGLE_FAN: types::GLenum = 0x0006; +#[allow(dead_code, non_upper_case_globals)] +pub const TRIANGLE_STRIP: types::GLenum = 0x0005; +#[allow(dead_code, non_upper_case_globals)] +pub const TRUE: types::GLboolean = 1; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_ARRAY_STRIDE: types::GLenum = 0x8A3C; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BLOCK_ACTIVE_UNIFORMS: types::GLenum = 0x8A42; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: types::GLenum = 0x8A43; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BLOCK_BINDING: types::GLenum = 0x8A3F; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BLOCK_DATA_SIZE: types::GLenum = 0x8A40; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BLOCK_INDEX: types::GLenum = 0x8A3A; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BLOCK_NAME_LENGTH: types::GLenum = 0x8A41; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: types::GLenum = 0x8A46; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: types::GLenum = 0x8A44; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BUFFER: types::GLenum = 0x8A11; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BUFFER_BINDING: types::GLenum = 0x8A28; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BUFFER_OFFSET_ALIGNMENT: types::GLenum = 0x8A34; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BUFFER_SIZE: types::GLenum = 0x8A2A; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_BUFFER_START: types::GLenum = 0x8A29; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_IS_ROW_MAJOR: types::GLenum = 0x8A3E; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_MATRIX_STRIDE: types::GLenum = 0x8A3D; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_NAME_LENGTH: types::GLenum = 0x8A39; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_OFFSET: types::GLenum = 0x8A3B; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_SIZE: types::GLenum = 0x8A38; +#[allow(dead_code, non_upper_case_globals)] +pub const UNIFORM_TYPE: types::GLenum = 0x8A37; +#[allow(dead_code, non_upper_case_globals)] +pub const UNPACK_ALIGNMENT: types::GLenum = 0x0CF5; +#[allow(dead_code, non_upper_case_globals)] +pub const UNPACK_IMAGE_HEIGHT: types::GLenum = 0x806E; +#[allow(dead_code, non_upper_case_globals)] +pub const UNPACK_ROW_LENGTH: types::GLenum = 0x0CF2; +#[allow(dead_code, non_upper_case_globals)] +pub const UNPACK_SKIP_IMAGES: types::GLenum = 0x806D; +#[allow(dead_code, non_upper_case_globals)] +pub const UNPACK_SKIP_PIXELS: types::GLenum = 0x0CF4; +#[allow(dead_code, non_upper_case_globals)] +pub const UNPACK_SKIP_ROWS: types::GLenum = 0x0CF3; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNALED: types::GLenum = 0x9118; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_BYTE: types::GLenum = 0x1401; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_INT: types::GLenum = 0x1405; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_INT_10F_11F_11F_REV: types::GLenum = 0x8C3B; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_INT_24_8: types::GLenum = 0x84FA; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_INT_2_10_10_10_REV: types::GLenum = 0x8368; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_INT_5_9_9_9_REV: types::GLenum = 0x8C3E; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_INT_SAMPLER_2D: types::GLenum = 0x8DD2; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_INT_SAMPLER_2D_ARRAY: types::GLenum = 0x8DD7; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_INT_SAMPLER_3D: types::GLenum = 0x8DD3; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_INT_SAMPLER_CUBE: types::GLenum = 0x8DD4; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_INT_VEC2: types::GLenum = 0x8DC6; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_INT_VEC3: types::GLenum = 0x8DC7; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_INT_VEC4: types::GLenum = 0x8DC8; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_NORMALIZED: types::GLenum = 0x8C17; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_SHORT: types::GLenum = 0x1403; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_SHORT_4_4_4_4: types::GLenum = 0x8033; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_SHORT_5_5_5_1: types::GLenum = 0x8034; +#[allow(dead_code, non_upper_case_globals)] +pub const UNSIGNED_SHORT_5_6_5: types::GLenum = 0x8363; +#[allow(dead_code, non_upper_case_globals)] +pub const VALIDATE_STATUS: types::GLenum = 0x8B83; +#[allow(dead_code, non_upper_case_globals)] +pub const VENDOR: types::GLenum = 0x1F00; +#[allow(dead_code, non_upper_case_globals)] +pub const VERSION: types::GLenum = 0x1F02; +#[allow(dead_code, non_upper_case_globals)] +pub const VERTEX_ARRAY_BINDING: types::GLenum = 0x85B5; +#[allow(dead_code, non_upper_case_globals)] +pub const VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: types::GLenum = 0x889F; +#[allow(dead_code, non_upper_case_globals)] +pub const VERTEX_ATTRIB_ARRAY_DIVISOR: types::GLenum = 0x88FE; +#[allow(dead_code, non_upper_case_globals)] +pub const VERTEX_ATTRIB_ARRAY_ENABLED: types::GLenum = 0x8622; +#[allow(dead_code, non_upper_case_globals)] +pub const VERTEX_ATTRIB_ARRAY_INTEGER: types::GLenum = 0x88FD; +#[allow(dead_code, non_upper_case_globals)] +pub const VERTEX_ATTRIB_ARRAY_NORMALIZED: types::GLenum = 0x886A; +#[allow(dead_code, non_upper_case_globals)] +pub const VERTEX_ATTRIB_ARRAY_POINTER: types::GLenum = 0x8645; +#[allow(dead_code, non_upper_case_globals)] +pub const VERTEX_ATTRIB_ARRAY_SIZE: types::GLenum = 0x8623; +#[allow(dead_code, non_upper_case_globals)] +pub const VERTEX_ATTRIB_ARRAY_STRIDE: types::GLenum = 0x8624; +#[allow(dead_code, non_upper_case_globals)] +pub const VERTEX_ATTRIB_ARRAY_TYPE: types::GLenum = 0x8625; +#[allow(dead_code, non_upper_case_globals)] +pub const VERTEX_SHADER: types::GLenum = 0x8B31; +#[allow(dead_code, non_upper_case_globals)] +pub const VIEWPORT: types::GLenum = 0x0BA2; +#[allow(dead_code, non_upper_case_globals)] +pub const WAIT_FAILED: types::GLenum = 0x911D; +#[allow(dead_code, non_upper_case_globals)] +pub const ZERO: types::GLenum = 0; - impl FnPtr { - /// Creates a `FnPtr` from a load attempt. - fn new(ptr: *const __gl_imports::raw::c_void) -> FnPtr { - if ptr.is_null() { - FnPtr { - f: missing_fn_panic as *const __gl_imports::raw::c_void, - is_loaded: false - } - } else { - FnPtr { f: ptr, is_loaded: true } - } - } - - /// Returns `true` if the function has been successfully loaded. - /// - /// If it returns `false`, calling the corresponding function will fail. - #[inline] - #[allow(dead_code)] - pub fn is_loaded(&self) -> bool { - self.is_loaded +#[allow(dead_code, missing_copy_implementations)] +#[derive(Clone)] +pub struct FnPtr { + /// The function pointer that will be used when calling the function. + f: *const __gl_imports::raw::c_void, + /// True if the pointer points to a real function, false if points to a `panic!` fn. + is_loaded: bool, +} + +impl FnPtr { + /// Creates a `FnPtr` from a load attempt. + fn new(ptr: *const __gl_imports::raw::c_void) -> FnPtr { + if ptr.is_null() { + FnPtr { + f: missing_fn_panic as *const __gl_imports::raw::c_void, + is_loaded: false, } + } else { + FnPtr { f: ptr, is_loaded: true } } - + } + + /// Returns `true` if the function has been successfully loaded. + /// + /// If it returns `false`, calling the corresponding function will fail. + #[inline] + #[allow(dead_code)] + pub fn is_loaded(&self) -> bool { + self.is_loaded + } +} + #[inline(never)] - fn missing_fn_panic() -> ! { - panic!("gles2 function was not loaded") - } - - #[allow(non_camel_case_types, non_snake_case, dead_code)] - #[derive(Clone)] - pub struct Gles2 { -/// Fallbacks: ActiveTextureARB -pub ActiveTexture: FnPtr, -/// Fallbacks: AttachObjectARB -pub AttachShader: FnPtr, -/// Fallbacks: BeginQueryARB -pub BeginQuery: FnPtr, -/// Fallbacks: BeginTransformFeedbackEXT, BeginTransformFeedbackNV -pub BeginTransformFeedback: FnPtr, -/// Fallbacks: BindAttribLocationARB -pub BindAttribLocation: FnPtr, -/// Fallbacks: BindBufferARB -pub BindBuffer: FnPtr, -/// Fallbacks: BindBufferBaseEXT, BindBufferBaseNV -pub BindBufferBase: FnPtr, -/// Fallbacks: BindBufferRangeEXT, BindBufferRangeNV -pub BindBufferRange: FnPtr, -pub BindFramebuffer: FnPtr, -pub BindRenderbuffer: FnPtr, -pub BindSampler: FnPtr, -/// Fallbacks: BindTextureEXT -pub BindTexture: FnPtr, -pub BindTransformFeedback: FnPtr, -/// Fallbacks: BindVertexArrayOES -pub BindVertexArray: FnPtr, -/// Fallbacks: BlendColorEXT -pub BlendColor: FnPtr, -/// Fallbacks: BlendEquationEXT -pub BlendEquation: FnPtr, -/// Fallbacks: BlendEquationSeparateEXT -pub BlendEquationSeparate: FnPtr, -pub BlendFunc: FnPtr, -/// Fallbacks: BlendFuncSeparateEXT, BlendFuncSeparateINGR -pub BlendFuncSeparate: FnPtr, -/// Fallbacks: BlitFramebufferEXT, BlitFramebufferNV -pub BlitFramebuffer: FnPtr, -/// Fallbacks: BufferDataARB -pub BufferData: FnPtr, -/// Fallbacks: BufferSubDataARB -pub BufferSubData: FnPtr, -/// Fallbacks: CheckFramebufferStatusEXT -pub CheckFramebufferStatus: FnPtr, -pub Clear: FnPtr, -pub ClearBufferfi: FnPtr, -pub ClearBufferfv: FnPtr, -pub ClearBufferiv: FnPtr, -pub ClearBufferuiv: FnPtr, -pub ClearColor: FnPtr, -/// Fallbacks: ClearDepthfOES -pub ClearDepthf: FnPtr, -pub ClearStencil: FnPtr, -/// Fallbacks: ClientWaitSyncAPPLE -pub ClientWaitSync: FnPtr, -pub ColorMask: FnPtr, -/// Fallbacks: CompileShaderARB -pub CompileShader: FnPtr, -/// Fallbacks: CompressedTexImage2DARB -pub CompressedTexImage2D: FnPtr, -/// Fallbacks: CompressedTexImage3DARB -pub CompressedTexImage3D: FnPtr, -/// Fallbacks: CompressedTexSubImage2DARB -pub CompressedTexSubImage2D: FnPtr, -/// Fallbacks: CompressedTexSubImage3DARB -pub CompressedTexSubImage3D: FnPtr, -/// Fallbacks: CopyBufferSubDataNV -pub CopyBufferSubData: FnPtr, -/// Fallbacks: CopyTexImage2DEXT -pub CopyTexImage2D: FnPtr, -/// Fallbacks: CopyTexSubImage2DEXT -pub CopyTexSubImage2D: FnPtr, -/// Fallbacks: CopyTexSubImage3DEXT -pub CopyTexSubImage3D: FnPtr, -/// Fallbacks: CreateProgramObjectARB -pub CreateProgram: FnPtr, -/// Fallbacks: CreateShaderObjectARB -pub CreateShader: FnPtr, -pub CullFace: FnPtr, -/// Fallbacks: DeleteBuffersARB -pub DeleteBuffers: FnPtr, -/// Fallbacks: DeleteFramebuffersEXT -pub DeleteFramebuffers: FnPtr, -pub DeleteProgram: FnPtr, -/// Fallbacks: DeleteQueriesARB -pub DeleteQueries: FnPtr, -/// Fallbacks: DeleteRenderbuffersEXT -pub DeleteRenderbuffers: FnPtr, -pub DeleteSamplers: FnPtr, -pub DeleteShader: FnPtr, -/// Fallbacks: DeleteSyncAPPLE -pub DeleteSync: FnPtr, -pub DeleteTextures: FnPtr, -/// Fallbacks: DeleteTransformFeedbacksNV -pub DeleteTransformFeedbacks: FnPtr, -/// Fallbacks: DeleteVertexArraysAPPLE, DeleteVertexArraysOES -pub DeleteVertexArrays: FnPtr, -pub DepthFunc: FnPtr, -pub DepthMask: FnPtr, -/// Fallbacks: DepthRangefOES -pub DepthRangef: FnPtr, -/// Fallbacks: DetachObjectARB -pub DetachShader: FnPtr, -pub Disable: FnPtr, -/// Fallbacks: DisableVertexAttribArrayARB -pub DisableVertexAttribArray: FnPtr, -/// Fallbacks: DrawArraysEXT -pub DrawArrays: FnPtr, -/// Fallbacks: DrawArraysInstancedANGLE, DrawArraysInstancedARB, DrawArraysInstancedEXT, DrawArraysInstancedNV -pub DrawArraysInstanced: FnPtr, -/// Fallbacks: DrawBuffersARB, DrawBuffersATI, DrawBuffersEXT -pub DrawBuffers: FnPtr, -pub DrawElements: FnPtr, -/// Fallbacks: DrawElementsInstancedANGLE, DrawElementsInstancedARB, DrawElementsInstancedEXT, DrawElementsInstancedNV -pub DrawElementsInstanced: FnPtr, -/// Fallbacks: DrawRangeElementsEXT -pub DrawRangeElements: FnPtr, -pub Enable: FnPtr, -/// Fallbacks: EnableVertexAttribArrayARB -pub EnableVertexAttribArray: FnPtr, -/// Fallbacks: EndQueryARB -pub EndQuery: FnPtr, -/// Fallbacks: EndTransformFeedbackEXT, EndTransformFeedbackNV -pub EndTransformFeedback: FnPtr, -/// Fallbacks: FenceSyncAPPLE -pub FenceSync: FnPtr, -pub Finish: FnPtr, -pub Flush: FnPtr, -/// Fallbacks: FlushMappedBufferRangeAPPLE, FlushMappedBufferRangeEXT -pub FlushMappedBufferRange: FnPtr, -/// Fallbacks: FramebufferRenderbufferEXT -pub FramebufferRenderbuffer: FnPtr, -/// Fallbacks: FramebufferTexture2DEXT -pub FramebufferTexture2D: FnPtr, -/// Fallbacks: FramebufferTextureLayerARB, FramebufferTextureLayerEXT -pub FramebufferTextureLayer: FnPtr, -pub FrontFace: FnPtr, -/// Fallbacks: GenBuffersARB -pub GenBuffers: FnPtr, -/// Fallbacks: GenFramebuffersEXT -pub GenFramebuffers: FnPtr, -/// Fallbacks: GenQueriesARB -pub GenQueries: FnPtr, -/// Fallbacks: GenRenderbuffersEXT -pub GenRenderbuffers: FnPtr, -pub GenSamplers: FnPtr, -pub GenTextures: FnPtr, -/// Fallbacks: GenTransformFeedbacksNV -pub GenTransformFeedbacks: FnPtr, -/// Fallbacks: GenVertexArraysAPPLE, GenVertexArraysOES -pub GenVertexArrays: FnPtr, -/// Fallbacks: GenerateMipmapEXT -pub GenerateMipmap: FnPtr, -/// Fallbacks: GetActiveAttribARB -pub GetActiveAttrib: FnPtr, -/// Fallbacks: GetActiveUniformARB -pub GetActiveUniform: FnPtr, -pub GetActiveUniformBlockName: FnPtr, -pub GetActiveUniformBlockiv: FnPtr, -pub GetActiveUniformsiv: FnPtr, -pub GetAttachedShaders: FnPtr, -/// Fallbacks: GetAttribLocationARB -pub GetAttribLocation: FnPtr, -pub GetBooleanv: FnPtr, -pub GetBufferParameteri64v: FnPtr, -/// Fallbacks: GetBufferParameterivARB -pub GetBufferParameteriv: FnPtr, -/// Fallbacks: GetBufferPointervARB, GetBufferPointervOES -pub GetBufferPointerv: FnPtr, -pub GetError: FnPtr, -pub GetFloatv: FnPtr, -/// Fallbacks: GetFragDataLocationEXT -pub GetFragDataLocation: FnPtr, -/// Fallbacks: GetFramebufferAttachmentParameterivEXT -pub GetFramebufferAttachmentParameteriv: FnPtr, -pub GetInteger64i_v: FnPtr, -/// Fallbacks: GetInteger64vAPPLE -pub GetInteger64v: FnPtr, -/// Fallbacks: GetIntegerIndexedvEXT -pub GetIntegeri_v: FnPtr, -pub GetIntegerv: FnPtr, -pub GetInternalformativ: FnPtr, -/// Fallbacks: GetProgramBinaryOES -pub GetProgramBinary: FnPtr, -pub GetProgramInfoLog: FnPtr, -pub GetProgramiv: FnPtr, -/// Fallbacks: GetQueryObjectuivARB -pub GetQueryObjectuiv: FnPtr, -/// Fallbacks: GetQueryivARB -pub GetQueryiv: FnPtr, -/// Fallbacks: GetRenderbufferParameterivEXT -pub GetRenderbufferParameteriv: FnPtr, -pub GetSamplerParameterfv: FnPtr, -pub GetSamplerParameteriv: FnPtr, -pub GetShaderInfoLog: FnPtr, -pub GetShaderPrecisionFormat: FnPtr, -/// Fallbacks: GetShaderSourceARB -pub GetShaderSource: FnPtr, -pub GetShaderiv: FnPtr, -pub GetString: FnPtr, -pub GetStringi: FnPtr, -/// Fallbacks: GetSyncivAPPLE -pub GetSynciv: FnPtr, -pub GetTexParameterfv: FnPtr, -pub GetTexParameteriv: FnPtr, -/// Fallbacks: GetTransformFeedbackVaryingEXT -pub GetTransformFeedbackVarying: FnPtr, -pub GetUniformBlockIndex: FnPtr, -pub GetUniformIndices: FnPtr, -/// Fallbacks: GetUniformLocationARB -pub GetUniformLocation: FnPtr, -/// Fallbacks: GetUniformfvARB -pub GetUniformfv: FnPtr, -/// Fallbacks: GetUniformivARB -pub GetUniformiv: FnPtr, -/// Fallbacks: GetUniformuivEXT -pub GetUniformuiv: FnPtr, -/// Fallbacks: GetVertexAttribIivEXT -pub GetVertexAttribIiv: FnPtr, -/// Fallbacks: GetVertexAttribIuivEXT -pub GetVertexAttribIuiv: FnPtr, -/// Fallbacks: GetVertexAttribPointervARB, GetVertexAttribPointervNV -pub GetVertexAttribPointerv: FnPtr, -/// Fallbacks: GetVertexAttribfvARB, GetVertexAttribfvNV -pub GetVertexAttribfv: FnPtr, -/// Fallbacks: GetVertexAttribivARB, GetVertexAttribivNV -pub GetVertexAttribiv: FnPtr, -pub Hint: FnPtr, -pub InvalidateFramebuffer: FnPtr, -pub InvalidateSubFramebuffer: FnPtr, -/// Fallbacks: IsBufferARB -pub IsBuffer: FnPtr, -pub IsEnabled: FnPtr, -/// Fallbacks: IsFramebufferEXT -pub IsFramebuffer: FnPtr, -pub IsProgram: FnPtr, -/// Fallbacks: IsQueryARB -pub IsQuery: FnPtr, -/// Fallbacks: IsRenderbufferEXT -pub IsRenderbuffer: FnPtr, -pub IsSampler: FnPtr, -pub IsShader: FnPtr, -/// Fallbacks: IsSyncAPPLE -pub IsSync: FnPtr, -pub IsTexture: FnPtr, -/// Fallbacks: IsTransformFeedbackNV -pub IsTransformFeedback: FnPtr, -/// Fallbacks: IsVertexArrayAPPLE, IsVertexArrayOES -pub IsVertexArray: FnPtr, -pub LineWidth: FnPtr, -/// Fallbacks: LinkProgramARB -pub LinkProgram: FnPtr, -/// Fallbacks: MapBufferRangeEXT -pub MapBufferRange: FnPtr, -/// Fallbacks: PauseTransformFeedbackNV -pub PauseTransformFeedback: FnPtr, -pub PixelStorei: FnPtr, -pub PolygonOffset: FnPtr, -/// Fallbacks: ProgramBinaryOES -pub ProgramBinary: FnPtr, -/// Fallbacks: ProgramParameteriARB, ProgramParameteriEXT -pub ProgramParameteri: FnPtr, -pub ReadBuffer: FnPtr, -pub ReadPixels: FnPtr, -pub ReleaseShaderCompiler: FnPtr, -/// Fallbacks: RenderbufferStorageEXT -pub RenderbufferStorage: FnPtr, -/// Fallbacks: RenderbufferStorageMultisampleEXT, RenderbufferStorageMultisampleNV -pub RenderbufferStorageMultisample: FnPtr, -/// Fallbacks: ResumeTransformFeedbackNV -pub ResumeTransformFeedback: FnPtr, -/// Fallbacks: SampleCoverageARB -pub SampleCoverage: FnPtr, -pub SamplerParameterf: FnPtr, -pub SamplerParameterfv: FnPtr, -pub SamplerParameteri: FnPtr, -pub SamplerParameteriv: FnPtr, -pub Scissor: FnPtr, -pub ShaderBinary: FnPtr, -/// Fallbacks: ShaderSourceARB -pub ShaderSource: FnPtr, -pub StencilFunc: FnPtr, -pub StencilFuncSeparate: FnPtr, -pub StencilMask: FnPtr, -pub StencilMaskSeparate: FnPtr, -pub StencilOp: FnPtr, -/// Fallbacks: StencilOpSeparateATI -pub StencilOpSeparate: FnPtr, -pub TexImage2D: FnPtr, -/// Fallbacks: TexImage3DEXT -pub TexImage3D: FnPtr, -pub TexParameterf: FnPtr, -pub TexParameterfv: FnPtr, -pub TexParameteri: FnPtr, -pub TexParameteriv: FnPtr, -/// Fallbacks: TexStorage2DEXT -pub TexStorage2D: FnPtr, -/// Fallbacks: TexStorage3DEXT -pub TexStorage3D: FnPtr, -/// Fallbacks: TexSubImage2DEXT -pub TexSubImage2D: FnPtr, -/// Fallbacks: TexSubImage3DEXT -pub TexSubImage3D: FnPtr, -/// Fallbacks: TransformFeedbackVaryingsEXT -pub TransformFeedbackVaryings: FnPtr, -/// Fallbacks: Uniform1fARB -pub Uniform1f: FnPtr, -/// Fallbacks: Uniform1fvARB -pub Uniform1fv: FnPtr, -/// Fallbacks: Uniform1iARB -pub Uniform1i: FnPtr, -/// Fallbacks: Uniform1ivARB -pub Uniform1iv: FnPtr, -/// Fallbacks: Uniform1uiEXT -pub Uniform1ui: FnPtr, -/// Fallbacks: Uniform1uivEXT -pub Uniform1uiv: FnPtr, -/// Fallbacks: Uniform2fARB -pub Uniform2f: FnPtr, -/// Fallbacks: Uniform2fvARB -pub Uniform2fv: FnPtr, -/// Fallbacks: Uniform2iARB -pub Uniform2i: FnPtr, -/// Fallbacks: Uniform2ivARB -pub Uniform2iv: FnPtr, -/// Fallbacks: Uniform2uiEXT -pub Uniform2ui: FnPtr, -/// Fallbacks: Uniform2uivEXT -pub Uniform2uiv: FnPtr, -/// Fallbacks: Uniform3fARB -pub Uniform3f: FnPtr, -/// Fallbacks: Uniform3fvARB -pub Uniform3fv: FnPtr, -/// Fallbacks: Uniform3iARB -pub Uniform3i: FnPtr, -/// Fallbacks: Uniform3ivARB -pub Uniform3iv: FnPtr, -/// Fallbacks: Uniform3uiEXT -pub Uniform3ui: FnPtr, -/// Fallbacks: Uniform3uivEXT -pub Uniform3uiv: FnPtr, -/// Fallbacks: Uniform4fARB -pub Uniform4f: FnPtr, -/// Fallbacks: Uniform4fvARB -pub Uniform4fv: FnPtr, -/// Fallbacks: Uniform4iARB -pub Uniform4i: FnPtr, -/// Fallbacks: Uniform4ivARB -pub Uniform4iv: FnPtr, -/// Fallbacks: Uniform4uiEXT -pub Uniform4ui: FnPtr, -/// Fallbacks: Uniform4uivEXT -pub Uniform4uiv: FnPtr, -pub UniformBlockBinding: FnPtr, -/// Fallbacks: UniformMatrix2fvARB -pub UniformMatrix2fv: FnPtr, -/// Fallbacks: UniformMatrix2x3fvNV -pub UniformMatrix2x3fv: FnPtr, -/// Fallbacks: UniformMatrix2x4fvNV -pub UniformMatrix2x4fv: FnPtr, -/// Fallbacks: UniformMatrix3fvARB -pub UniformMatrix3fv: FnPtr, -/// Fallbacks: UniformMatrix3x2fvNV -pub UniformMatrix3x2fv: FnPtr, -/// Fallbacks: UniformMatrix3x4fvNV -pub UniformMatrix3x4fv: FnPtr, -/// Fallbacks: UniformMatrix4fvARB -pub UniformMatrix4fv: FnPtr, -/// Fallbacks: UniformMatrix4x2fvNV -pub UniformMatrix4x2fv: FnPtr, -/// Fallbacks: UniformMatrix4x3fvNV -pub UniformMatrix4x3fv: FnPtr, -/// Fallbacks: UnmapBufferARB, UnmapBufferOES -pub UnmapBuffer: FnPtr, -/// Fallbacks: UseProgramObjectARB -pub UseProgram: FnPtr, -/// Fallbacks: ValidateProgramARB -pub ValidateProgram: FnPtr, -/// Fallbacks: VertexAttrib1fARB, VertexAttrib1fNV -pub VertexAttrib1f: FnPtr, -/// Fallbacks: VertexAttrib1fvARB, VertexAttrib1fvNV -pub VertexAttrib1fv: FnPtr, -/// Fallbacks: VertexAttrib2fARB, VertexAttrib2fNV -pub VertexAttrib2f: FnPtr, -/// Fallbacks: VertexAttrib2fvARB, VertexAttrib2fvNV -pub VertexAttrib2fv: FnPtr, -/// Fallbacks: VertexAttrib3fARB, VertexAttrib3fNV -pub VertexAttrib3f: FnPtr, -/// Fallbacks: VertexAttrib3fvARB, VertexAttrib3fvNV -pub VertexAttrib3fv: FnPtr, -/// Fallbacks: VertexAttrib4fARB, VertexAttrib4fNV -pub VertexAttrib4f: FnPtr, -/// Fallbacks: VertexAttrib4fvARB, VertexAttrib4fvNV -pub VertexAttrib4fv: FnPtr, -/// Fallbacks: VertexAttribDivisorANGLE, VertexAttribDivisorARB, VertexAttribDivisorEXT, VertexAttribDivisorNV -pub VertexAttribDivisor: FnPtr, -/// Fallbacks: VertexAttribI4iEXT -pub VertexAttribI4i: FnPtr, -/// Fallbacks: VertexAttribI4ivEXT -pub VertexAttribI4iv: FnPtr, -/// Fallbacks: VertexAttribI4uiEXT -pub VertexAttribI4ui: FnPtr, -/// Fallbacks: VertexAttribI4uivEXT -pub VertexAttribI4uiv: FnPtr, -/// Fallbacks: VertexAttribIPointerEXT -pub VertexAttribIPointer: FnPtr, -/// Fallbacks: VertexAttribPointerARB -pub VertexAttribPointer: FnPtr, -pub Viewport: FnPtr, -/// Fallbacks: WaitSyncAPPLE -pub WaitSync: FnPtr, -_priv: () +fn missing_fn_panic() -> ! { + panic!("gles2 function was not loaded") } + +#[allow(non_camel_case_types, non_snake_case, dead_code)] +#[derive(Clone)] +pub struct Gles2 { + /// Fallbacks: ActiveTextureARB + pub ActiveTexture: FnPtr, + /// Fallbacks: AttachObjectARB + pub AttachShader: FnPtr, + /// Fallbacks: BeginQueryARB + pub BeginQuery: FnPtr, + /// Fallbacks: BeginTransformFeedbackEXT, BeginTransformFeedbackNV + pub BeginTransformFeedback: FnPtr, + /// Fallbacks: BindAttribLocationARB + pub BindAttribLocation: FnPtr, + /// Fallbacks: BindBufferARB + pub BindBuffer: FnPtr, + /// Fallbacks: BindBufferBaseEXT, BindBufferBaseNV + pub BindBufferBase: FnPtr, + /// Fallbacks: BindBufferRangeEXT, BindBufferRangeNV + pub BindBufferRange: FnPtr, + pub BindFramebuffer: FnPtr, + pub BindRenderbuffer: FnPtr, + pub BindSampler: FnPtr, + /// Fallbacks: BindTextureEXT + pub BindTexture: FnPtr, + pub BindTransformFeedback: FnPtr, + /// Fallbacks: BindVertexArrayOES + pub BindVertexArray: FnPtr, + /// Fallbacks: BlendColorEXT + pub BlendColor: FnPtr, + /// Fallbacks: BlendEquationEXT + pub BlendEquation: FnPtr, + /// Fallbacks: BlendEquationSeparateEXT + pub BlendEquationSeparate: FnPtr, + pub BlendFunc: FnPtr, + /// Fallbacks: BlendFuncSeparateEXT, BlendFuncSeparateINGR + pub BlendFuncSeparate: FnPtr, + /// Fallbacks: BlitFramebufferEXT, BlitFramebufferNV + pub BlitFramebuffer: FnPtr, + /// Fallbacks: BufferDataARB + pub BufferData: FnPtr, + /// Fallbacks: BufferSubDataARB + pub BufferSubData: FnPtr, + /// Fallbacks: CheckFramebufferStatusEXT + pub CheckFramebufferStatus: FnPtr, + pub Clear: FnPtr, + pub ClearBufferfi: FnPtr, + pub ClearBufferfv: FnPtr, + pub ClearBufferiv: FnPtr, + pub ClearBufferuiv: FnPtr, + pub ClearColor: FnPtr, + /// Fallbacks: ClearDepthfOES + pub ClearDepthf: FnPtr, + pub ClearStencil: FnPtr, + /// Fallbacks: ClientWaitSyncAPPLE + pub ClientWaitSync: FnPtr, + pub ColorMask: FnPtr, + /// Fallbacks: CompileShaderARB + pub CompileShader: FnPtr, + /// Fallbacks: CompressedTexImage2DARB + pub CompressedTexImage2D: FnPtr, + /// Fallbacks: CompressedTexImage3DARB + pub CompressedTexImage3D: FnPtr, + /// Fallbacks: CompressedTexSubImage2DARB + pub CompressedTexSubImage2D: FnPtr, + /// Fallbacks: CompressedTexSubImage3DARB + pub CompressedTexSubImage3D: FnPtr, + /// Fallbacks: CopyBufferSubDataNV + pub CopyBufferSubData: FnPtr, + /// Fallbacks: CopyTexImage2DEXT + pub CopyTexImage2D: FnPtr, + /// Fallbacks: CopyTexSubImage2DEXT + pub CopyTexSubImage2D: FnPtr, + /// Fallbacks: CopyTexSubImage3DEXT + pub CopyTexSubImage3D: FnPtr, + /// Fallbacks: CreateProgramObjectARB + pub CreateProgram: FnPtr, + /// Fallbacks: CreateShaderObjectARB + pub CreateShader: FnPtr, + pub CullFace: FnPtr, + /// Fallbacks: DeleteBuffersARB + pub DeleteBuffers: FnPtr, + /// Fallbacks: DeleteFramebuffersEXT + pub DeleteFramebuffers: FnPtr, + pub DeleteProgram: FnPtr, + /// Fallbacks: DeleteQueriesARB + pub DeleteQueries: FnPtr, + /// Fallbacks: DeleteRenderbuffersEXT + pub DeleteRenderbuffers: FnPtr, + pub DeleteSamplers: FnPtr, + pub DeleteShader: FnPtr, + /// Fallbacks: DeleteSyncAPPLE + pub DeleteSync: FnPtr, + pub DeleteTextures: FnPtr, + /// Fallbacks: DeleteTransformFeedbacksNV + pub DeleteTransformFeedbacks: FnPtr, + /// Fallbacks: DeleteVertexArraysAPPLE, DeleteVertexArraysOES + pub DeleteVertexArrays: FnPtr, + pub DepthFunc: FnPtr, + pub DepthMask: FnPtr, + /// Fallbacks: DepthRangefOES + pub DepthRangef: FnPtr, + /// Fallbacks: DetachObjectARB + pub DetachShader: FnPtr, + pub Disable: FnPtr, + /// Fallbacks: DisableVertexAttribArrayARB + pub DisableVertexAttribArray: FnPtr, + /// Fallbacks: DrawArraysEXT + pub DrawArrays: FnPtr, + /// Fallbacks: DrawArraysInstancedANGLE, DrawArraysInstancedARB, DrawArraysInstancedEXT, DrawArraysInstancedNV + pub DrawArraysInstanced: FnPtr, + /// Fallbacks: DrawBuffersARB, DrawBuffersATI, DrawBuffersEXT + pub DrawBuffers: FnPtr, + pub DrawElements: FnPtr, + /// Fallbacks: DrawElementsInstancedANGLE, DrawElementsInstancedARB, DrawElementsInstancedEXT, DrawElementsInstancedNV + pub DrawElementsInstanced: FnPtr, + /// Fallbacks: DrawRangeElementsEXT + pub DrawRangeElements: FnPtr, + pub Enable: FnPtr, + /// Fallbacks: EnableVertexAttribArrayARB + pub EnableVertexAttribArray: FnPtr, + /// Fallbacks: EndQueryARB + pub EndQuery: FnPtr, + /// Fallbacks: EndTransformFeedbackEXT, EndTransformFeedbackNV + pub EndTransformFeedback: FnPtr, + /// Fallbacks: FenceSyncAPPLE + pub FenceSync: FnPtr, + pub Finish: FnPtr, + pub Flush: FnPtr, + /// Fallbacks: FlushMappedBufferRangeAPPLE, FlushMappedBufferRangeEXT + pub FlushMappedBufferRange: FnPtr, + /// Fallbacks: FramebufferRenderbufferEXT + pub FramebufferRenderbuffer: FnPtr, + /// Fallbacks: FramebufferTexture2DEXT + pub FramebufferTexture2D: FnPtr, + /// Fallbacks: FramebufferTextureLayerARB, FramebufferTextureLayerEXT + pub FramebufferTextureLayer: FnPtr, + pub FrontFace: FnPtr, + /// Fallbacks: GenBuffersARB + pub GenBuffers: FnPtr, + /// Fallbacks: GenFramebuffersEXT + pub GenFramebuffers: FnPtr, + /// Fallbacks: GenQueriesARB + pub GenQueries: FnPtr, + /// Fallbacks: GenRenderbuffersEXT + pub GenRenderbuffers: FnPtr, + pub GenSamplers: FnPtr, + pub GenTextures: FnPtr, + /// Fallbacks: GenTransformFeedbacksNV + pub GenTransformFeedbacks: FnPtr, + /// Fallbacks: GenVertexArraysAPPLE, GenVertexArraysOES + pub GenVertexArrays: FnPtr, + /// Fallbacks: GenerateMipmapEXT + pub GenerateMipmap: FnPtr, + /// Fallbacks: GetActiveAttribARB + pub GetActiveAttrib: FnPtr, + /// Fallbacks: GetActiveUniformARB + pub GetActiveUniform: FnPtr, + pub GetActiveUniformBlockName: FnPtr, + pub GetActiveUniformBlockiv: FnPtr, + pub GetActiveUniformsiv: FnPtr, + pub GetAttachedShaders: FnPtr, + /// Fallbacks: GetAttribLocationARB + pub GetAttribLocation: FnPtr, + pub GetBooleanv: FnPtr, + pub GetBufferParameteri64v: FnPtr, + /// Fallbacks: GetBufferParameterivARB + pub GetBufferParameteriv: FnPtr, + /// Fallbacks: GetBufferPointervARB, GetBufferPointervOES + pub GetBufferPointerv: FnPtr, + pub GetError: FnPtr, + pub GetFloatv: FnPtr, + /// Fallbacks: GetFragDataLocationEXT + pub GetFragDataLocation: FnPtr, + /// Fallbacks: GetFramebufferAttachmentParameterivEXT + pub GetFramebufferAttachmentParameteriv: FnPtr, + pub GetInteger64i_v: FnPtr, + /// Fallbacks: GetInteger64vAPPLE + pub GetInteger64v: FnPtr, + /// Fallbacks: GetIntegerIndexedvEXT + pub GetIntegeri_v: FnPtr, + pub GetIntegerv: FnPtr, + pub GetInternalformativ: FnPtr, + /// Fallbacks: GetProgramBinaryOES + pub GetProgramBinary: FnPtr, + pub GetProgramInfoLog: FnPtr, + pub GetProgramiv: FnPtr, + /// Fallbacks: GetQueryObjectuivARB + pub GetQueryObjectuiv: FnPtr, + /// Fallbacks: GetQueryivARB + pub GetQueryiv: FnPtr, + /// Fallbacks: GetRenderbufferParameterivEXT + pub GetRenderbufferParameteriv: FnPtr, + pub GetSamplerParameterfv: FnPtr, + pub GetSamplerParameteriv: FnPtr, + pub GetShaderInfoLog: FnPtr, + pub GetShaderPrecisionFormat: FnPtr, + /// Fallbacks: GetShaderSourceARB + pub GetShaderSource: FnPtr, + pub GetShaderiv: FnPtr, + pub GetString: FnPtr, + pub GetStringi: FnPtr, + /// Fallbacks: GetSyncivAPPLE + pub GetSynciv: FnPtr, + pub GetTexParameterfv: FnPtr, + pub GetTexParameteriv: FnPtr, + /// Fallbacks: GetTransformFeedbackVaryingEXT + pub GetTransformFeedbackVarying: FnPtr, + pub GetUniformBlockIndex: FnPtr, + pub GetUniformIndices: FnPtr, + /// Fallbacks: GetUniformLocationARB + pub GetUniformLocation: FnPtr, + /// Fallbacks: GetUniformfvARB + pub GetUniformfv: FnPtr, + /// Fallbacks: GetUniformivARB + pub GetUniformiv: FnPtr, + /// Fallbacks: GetUniformuivEXT + pub GetUniformuiv: FnPtr, + /// Fallbacks: GetVertexAttribIivEXT + pub GetVertexAttribIiv: FnPtr, + /// Fallbacks: GetVertexAttribIuivEXT + pub GetVertexAttribIuiv: FnPtr, + /// Fallbacks: GetVertexAttribPointervARB, GetVertexAttribPointervNV + pub GetVertexAttribPointerv: FnPtr, + /// Fallbacks: GetVertexAttribfvARB, GetVertexAttribfvNV + pub GetVertexAttribfv: FnPtr, + /// Fallbacks: GetVertexAttribivARB, GetVertexAttribivNV + pub GetVertexAttribiv: FnPtr, + pub Hint: FnPtr, + pub InvalidateFramebuffer: FnPtr, + pub InvalidateSubFramebuffer: FnPtr, + /// Fallbacks: IsBufferARB + pub IsBuffer: FnPtr, + pub IsEnabled: FnPtr, + /// Fallbacks: IsFramebufferEXT + pub IsFramebuffer: FnPtr, + pub IsProgram: FnPtr, + /// Fallbacks: IsQueryARB + pub IsQuery: FnPtr, + /// Fallbacks: IsRenderbufferEXT + pub IsRenderbuffer: FnPtr, + pub IsSampler: FnPtr, + pub IsShader: FnPtr, + /// Fallbacks: IsSyncAPPLE + pub IsSync: FnPtr, + pub IsTexture: FnPtr, + /// Fallbacks: IsTransformFeedbackNV + pub IsTransformFeedback: FnPtr, + /// Fallbacks: IsVertexArrayAPPLE, IsVertexArrayOES + pub IsVertexArray: FnPtr, + pub LineWidth: FnPtr, + /// Fallbacks: LinkProgramARB + pub LinkProgram: FnPtr, + /// Fallbacks: MapBufferRangeEXT + pub MapBufferRange: FnPtr, + /// Fallbacks: PauseTransformFeedbackNV + pub PauseTransformFeedback: FnPtr, + pub PixelStorei: FnPtr, + pub PolygonOffset: FnPtr, + /// Fallbacks: ProgramBinaryOES + pub ProgramBinary: FnPtr, + /// Fallbacks: ProgramParameteriARB, ProgramParameteriEXT + pub ProgramParameteri: FnPtr, + pub ReadBuffer: FnPtr, + pub ReadPixels: FnPtr, + pub ReleaseShaderCompiler: FnPtr, + /// Fallbacks: RenderbufferStorageEXT + pub RenderbufferStorage: FnPtr, + /// Fallbacks: RenderbufferStorageMultisampleEXT, RenderbufferStorageMultisampleNV + pub RenderbufferStorageMultisample: FnPtr, + /// Fallbacks: ResumeTransformFeedbackNV + pub ResumeTransformFeedback: FnPtr, + /// Fallbacks: SampleCoverageARB + pub SampleCoverage: FnPtr, + pub SamplerParameterf: FnPtr, + pub SamplerParameterfv: FnPtr, + pub SamplerParameteri: FnPtr, + pub SamplerParameteriv: FnPtr, + pub Scissor: FnPtr, + pub ShaderBinary: FnPtr, + /// Fallbacks: ShaderSourceARB + pub ShaderSource: FnPtr, + pub StencilFunc: FnPtr, + pub StencilFuncSeparate: FnPtr, + pub StencilMask: FnPtr, + pub StencilMaskSeparate: FnPtr, + pub StencilOp: FnPtr, + /// Fallbacks: StencilOpSeparateATI + pub StencilOpSeparate: FnPtr, + pub TexImage2D: FnPtr, + /// Fallbacks: TexImage3DEXT + pub TexImage3D: FnPtr, + pub TexParameterf: FnPtr, + pub TexParameterfv: FnPtr, + pub TexParameteri: FnPtr, + pub TexParameteriv: FnPtr, + /// Fallbacks: TexStorage2DEXT + pub TexStorage2D: FnPtr, + /// Fallbacks: TexStorage3DEXT + pub TexStorage3D: FnPtr, + /// Fallbacks: TexSubImage2DEXT + pub TexSubImage2D: FnPtr, + /// Fallbacks: TexSubImage3DEXT + pub TexSubImage3D: FnPtr, + /// Fallbacks: TransformFeedbackVaryingsEXT + pub TransformFeedbackVaryings: FnPtr, + /// Fallbacks: Uniform1fARB + pub Uniform1f: FnPtr, + /// Fallbacks: Uniform1fvARB + pub Uniform1fv: FnPtr, + /// Fallbacks: Uniform1iARB + pub Uniform1i: FnPtr, + /// Fallbacks: Uniform1ivARB + pub Uniform1iv: FnPtr, + /// Fallbacks: Uniform1uiEXT + pub Uniform1ui: FnPtr, + /// Fallbacks: Uniform1uivEXT + pub Uniform1uiv: FnPtr, + /// Fallbacks: Uniform2fARB + pub Uniform2f: FnPtr, + /// Fallbacks: Uniform2fvARB + pub Uniform2fv: FnPtr, + /// Fallbacks: Uniform2iARB + pub Uniform2i: FnPtr, + /// Fallbacks: Uniform2ivARB + pub Uniform2iv: FnPtr, + /// Fallbacks: Uniform2uiEXT + pub Uniform2ui: FnPtr, + /// Fallbacks: Uniform2uivEXT + pub Uniform2uiv: FnPtr, + /// Fallbacks: Uniform3fARB + pub Uniform3f: FnPtr, + /// Fallbacks: Uniform3fvARB + pub Uniform3fv: FnPtr, + /// Fallbacks: Uniform3iARB + pub Uniform3i: FnPtr, + /// Fallbacks: Uniform3ivARB + pub Uniform3iv: FnPtr, + /// Fallbacks: Uniform3uiEXT + pub Uniform3ui: FnPtr, + /// Fallbacks: Uniform3uivEXT + pub Uniform3uiv: FnPtr, + /// Fallbacks: Uniform4fARB + pub Uniform4f: FnPtr, + /// Fallbacks: Uniform4fvARB + pub Uniform4fv: FnPtr, + /// Fallbacks: Uniform4iARB + pub Uniform4i: FnPtr, + /// Fallbacks: Uniform4ivARB + pub Uniform4iv: FnPtr, + /// Fallbacks: Uniform4uiEXT + pub Uniform4ui: FnPtr, + /// Fallbacks: Uniform4uivEXT + pub Uniform4uiv: FnPtr, + pub UniformBlockBinding: FnPtr, + /// Fallbacks: UniformMatrix2fvARB + pub UniformMatrix2fv: FnPtr, + /// Fallbacks: UniformMatrix2x3fvNV + pub UniformMatrix2x3fv: FnPtr, + /// Fallbacks: UniformMatrix2x4fvNV + pub UniformMatrix2x4fv: FnPtr, + /// Fallbacks: UniformMatrix3fvARB + pub UniformMatrix3fv: FnPtr, + /// Fallbacks: UniformMatrix3x2fvNV + pub UniformMatrix3x2fv: FnPtr, + /// Fallbacks: UniformMatrix3x4fvNV + pub UniformMatrix3x4fv: FnPtr, + /// Fallbacks: UniformMatrix4fvARB + pub UniformMatrix4fv: FnPtr, + /// Fallbacks: UniformMatrix4x2fvNV + pub UniformMatrix4x2fv: FnPtr, + /// Fallbacks: UniformMatrix4x3fvNV + pub UniformMatrix4x3fv: FnPtr, + /// Fallbacks: UnmapBufferARB, UnmapBufferOES + pub UnmapBuffer: FnPtr, + /// Fallbacks: UseProgramObjectARB + pub UseProgram: FnPtr, + /// Fallbacks: ValidateProgramARB + pub ValidateProgram: FnPtr, + /// Fallbacks: VertexAttrib1fARB, VertexAttrib1fNV + pub VertexAttrib1f: FnPtr, + /// Fallbacks: VertexAttrib1fvARB, VertexAttrib1fvNV + pub VertexAttrib1fv: FnPtr, + /// Fallbacks: VertexAttrib2fARB, VertexAttrib2fNV + pub VertexAttrib2f: FnPtr, + /// Fallbacks: VertexAttrib2fvARB, VertexAttrib2fvNV + pub VertexAttrib2fv: FnPtr, + /// Fallbacks: VertexAttrib3fARB, VertexAttrib3fNV + pub VertexAttrib3f: FnPtr, + /// Fallbacks: VertexAttrib3fvARB, VertexAttrib3fvNV + pub VertexAttrib3fv: FnPtr, + /// Fallbacks: VertexAttrib4fARB, VertexAttrib4fNV + pub VertexAttrib4f: FnPtr, + /// Fallbacks: VertexAttrib4fvARB, VertexAttrib4fvNV + pub VertexAttrib4fv: FnPtr, + /// Fallbacks: VertexAttribDivisorANGLE, VertexAttribDivisorARB, VertexAttribDivisorEXT, VertexAttribDivisorNV + pub VertexAttribDivisor: FnPtr, + /// Fallbacks: VertexAttribI4iEXT + pub VertexAttribI4i: FnPtr, + /// Fallbacks: VertexAttribI4ivEXT + pub VertexAttribI4iv: FnPtr, + /// Fallbacks: VertexAttribI4uiEXT + pub VertexAttribI4ui: FnPtr, + /// Fallbacks: VertexAttribI4uivEXT + pub VertexAttribI4uiv: FnPtr, + /// Fallbacks: VertexAttribIPointerEXT + pub VertexAttribIPointer: FnPtr, + /// Fallbacks: VertexAttribPointerARB + pub VertexAttribPointer: FnPtr, + pub Viewport: FnPtr, + /// Fallbacks: WaitSyncAPPLE + pub WaitSync: FnPtr, + _priv: (), +} + impl Gles2 { - /// Load each OpenGL symbol using a custom load function. This allows for the - /// use of functions like `glfwGetProcAddress` or `SDL_GL_GetProcAddress`. - /// - /// ~~~ignore - /// let gl = Gl::load_with(|s| glfw.get_proc_address(s)); - /// ~~~ - #[allow(dead_code, unused_variables)] - pub fn load_with(mut loadfn: F) -> Gles2 where F: FnMut(&'static str) -> *const __gl_imports::raw::c_void { - #[inline(never)] - fn do_metaloadfn(loadfn: &mut dyn FnMut(&'static str) -> *const __gl_imports::raw::c_void, - symbol: &'static str, - symbols: &[&'static str]) - -> *const __gl_imports::raw::c_void { - let mut ptr = loadfn(symbol); - if ptr.is_null() { - for &sym in symbols { - ptr = loadfn(sym); - if !ptr.is_null() { break; } - } - } - ptr + /// Load each OpenGL symbol using a custom load function. This allows for the + /// use of functions like `glfwGetProcAddress` or `SDL_GL_GetProcAddress`. + /// + /// ~~~ignore + /// let gl = Gl::load_with(|s| glfw.get_proc_address(s)); + /// ~~~ + #[allow(dead_code, unused_variables)] + pub fn load_with(mut loadfn: F) -> Gles2 where F: FnMut(&'static str) -> *const __gl_imports::raw::c_void { + #[inline(never)] + fn do_metaloadfn(loadfn: &mut dyn FnMut(&'static str) -> *const __gl_imports::raw::c_void, + symbol: &'static str, + symbols: &[&'static str]) + -> *const __gl_imports::raw::c_void { + let mut ptr = loadfn(symbol); + if ptr.is_null() { + for &sym in symbols { + ptr = loadfn(sym); + if !ptr.is_null() { break; } } - let mut metaloadfn = |symbol: &'static str, symbols: &[&'static str]| { - do_metaloadfn(&mut loadfn, symbol, symbols) - }; - Gles2 { -ActiveTexture: FnPtr::new(metaloadfn("glActiveTexture", &["glActiveTextureARB"])), -AttachShader: FnPtr::new(metaloadfn("glAttachShader", &["glAttachObjectARB"])), -BeginQuery: FnPtr::new(metaloadfn("glBeginQuery", &["glBeginQueryARB"])), -BeginTransformFeedback: FnPtr::new(metaloadfn("glBeginTransformFeedback", &["glBeginTransformFeedbackEXT", "glBeginTransformFeedbackNV"])), -BindAttribLocation: FnPtr::new(metaloadfn("glBindAttribLocation", &["glBindAttribLocationARB"])), -BindBuffer: FnPtr::new(metaloadfn("glBindBuffer", &["glBindBufferARB"])), -BindBufferBase: FnPtr::new(metaloadfn("glBindBufferBase", &["glBindBufferBaseEXT", "glBindBufferBaseNV"])), -BindBufferRange: FnPtr::new(metaloadfn("glBindBufferRange", &["glBindBufferRangeEXT", "glBindBufferRangeNV"])), -BindFramebuffer: FnPtr::new(metaloadfn("glBindFramebuffer", &[])), -BindRenderbuffer: FnPtr::new(metaloadfn("glBindRenderbuffer", &[])), -BindSampler: FnPtr::new(metaloadfn("glBindSampler", &[])), -BindTexture: FnPtr::new(metaloadfn("glBindTexture", &["glBindTextureEXT"])), -BindTransformFeedback: FnPtr::new(metaloadfn("glBindTransformFeedback", &[])), -BindVertexArray: FnPtr::new(metaloadfn("glBindVertexArray", &["glBindVertexArrayOES"])), -BlendColor: FnPtr::new(metaloadfn("glBlendColor", &["glBlendColorEXT"])), -BlendEquation: FnPtr::new(metaloadfn("glBlendEquation", &["glBlendEquationEXT"])), -BlendEquationSeparate: FnPtr::new(metaloadfn("glBlendEquationSeparate", &["glBlendEquationSeparateEXT"])), -BlendFunc: FnPtr::new(metaloadfn("glBlendFunc", &[])), -BlendFuncSeparate: FnPtr::new(metaloadfn("glBlendFuncSeparate", &["glBlendFuncSeparateEXT", "glBlendFuncSeparateINGR"])), -BlitFramebuffer: FnPtr::new(metaloadfn("glBlitFramebuffer", &["glBlitFramebufferEXT", "glBlitFramebufferNV"])), -BufferData: FnPtr::new(metaloadfn("glBufferData", &["glBufferDataARB"])), -BufferSubData: FnPtr::new(metaloadfn("glBufferSubData", &["glBufferSubDataARB"])), -CheckFramebufferStatus: FnPtr::new(metaloadfn("glCheckFramebufferStatus", &["glCheckFramebufferStatusEXT"])), -Clear: FnPtr::new(metaloadfn("glClear", &[])), -ClearBufferfi: FnPtr::new(metaloadfn("glClearBufferfi", &[])), -ClearBufferfv: FnPtr::new(metaloadfn("glClearBufferfv", &[])), -ClearBufferiv: FnPtr::new(metaloadfn("glClearBufferiv", &[])), -ClearBufferuiv: FnPtr::new(metaloadfn("glClearBufferuiv", &[])), -ClearColor: FnPtr::new(metaloadfn("glClearColor", &[])), -ClearDepthf: FnPtr::new(metaloadfn("glClearDepthf", &["glClearDepthfOES"])), -ClearStencil: FnPtr::new(metaloadfn("glClearStencil", &[])), -ClientWaitSync: FnPtr::new(metaloadfn("glClientWaitSync", &["glClientWaitSyncAPPLE"])), -ColorMask: FnPtr::new(metaloadfn("glColorMask", &[])), -CompileShader: FnPtr::new(metaloadfn("glCompileShader", &["glCompileShaderARB"])), -CompressedTexImage2D: FnPtr::new(metaloadfn("glCompressedTexImage2D", &["glCompressedTexImage2DARB"])), -CompressedTexImage3D: FnPtr::new(metaloadfn("glCompressedTexImage3D", &["glCompressedTexImage3DARB"])), -CompressedTexSubImage2D: FnPtr::new(metaloadfn("glCompressedTexSubImage2D", &["glCompressedTexSubImage2DARB"])), -CompressedTexSubImage3D: FnPtr::new(metaloadfn("glCompressedTexSubImage3D", &["glCompressedTexSubImage3DARB"])), -CopyBufferSubData: FnPtr::new(metaloadfn("glCopyBufferSubData", &["glCopyBufferSubDataNV"])), -CopyTexImage2D: FnPtr::new(metaloadfn("glCopyTexImage2D", &["glCopyTexImage2DEXT"])), -CopyTexSubImage2D: FnPtr::new(metaloadfn("glCopyTexSubImage2D", &["glCopyTexSubImage2DEXT"])), -CopyTexSubImage3D: FnPtr::new(metaloadfn("glCopyTexSubImage3D", &["glCopyTexSubImage3DEXT"])), -CreateProgram: FnPtr::new(metaloadfn("glCreateProgram", &["glCreateProgramObjectARB"])), -CreateShader: FnPtr::new(metaloadfn("glCreateShader", &["glCreateShaderObjectARB"])), -CullFace: FnPtr::new(metaloadfn("glCullFace", &[])), -DeleteBuffers: FnPtr::new(metaloadfn("glDeleteBuffers", &["glDeleteBuffersARB"])), -DeleteFramebuffers: FnPtr::new(metaloadfn("glDeleteFramebuffers", &["glDeleteFramebuffersEXT"])), -DeleteProgram: FnPtr::new(metaloadfn("glDeleteProgram", &[])), -DeleteQueries: FnPtr::new(metaloadfn("glDeleteQueries", &["glDeleteQueriesARB"])), -DeleteRenderbuffers: FnPtr::new(metaloadfn("glDeleteRenderbuffers", &["glDeleteRenderbuffersEXT"])), -DeleteSamplers: FnPtr::new(metaloadfn("glDeleteSamplers", &[])), -DeleteShader: FnPtr::new(metaloadfn("glDeleteShader", &[])), -DeleteSync: FnPtr::new(metaloadfn("glDeleteSync", &["glDeleteSyncAPPLE"])), -DeleteTextures: FnPtr::new(metaloadfn("glDeleteTextures", &[])), -DeleteTransformFeedbacks: FnPtr::new(metaloadfn("glDeleteTransformFeedbacks", &["glDeleteTransformFeedbacksNV"])), -DeleteVertexArrays: FnPtr::new(metaloadfn("glDeleteVertexArrays", &["glDeleteVertexArraysAPPLE", "glDeleteVertexArraysOES"])), -DepthFunc: FnPtr::new(metaloadfn("glDepthFunc", &[])), -DepthMask: FnPtr::new(metaloadfn("glDepthMask", &[])), -DepthRangef: FnPtr::new(metaloadfn("glDepthRangef", &["glDepthRangefOES"])), -DetachShader: FnPtr::new(metaloadfn("glDetachShader", &["glDetachObjectARB"])), -Disable: FnPtr::new(metaloadfn("glDisable", &[])), -DisableVertexAttribArray: FnPtr::new(metaloadfn("glDisableVertexAttribArray", &["glDisableVertexAttribArrayARB"])), -DrawArrays: FnPtr::new(metaloadfn("glDrawArrays", &["glDrawArraysEXT"])), -DrawArraysInstanced: FnPtr::new(metaloadfn("glDrawArraysInstanced", &["glDrawArraysInstancedANGLE", "glDrawArraysInstancedARB", "glDrawArraysInstancedEXT", "glDrawArraysInstancedNV"])), -DrawBuffers: FnPtr::new(metaloadfn("glDrawBuffers", &["glDrawBuffersARB", "glDrawBuffersATI", "glDrawBuffersEXT"])), -DrawElements: FnPtr::new(metaloadfn("glDrawElements", &[])), -DrawElementsInstanced: FnPtr::new(metaloadfn("glDrawElementsInstanced", &["glDrawElementsInstancedANGLE", "glDrawElementsInstancedARB", "glDrawElementsInstancedEXT", "glDrawElementsInstancedNV"])), -DrawRangeElements: FnPtr::new(metaloadfn("glDrawRangeElements", &["glDrawRangeElementsEXT"])), -Enable: FnPtr::new(metaloadfn("glEnable", &[])), -EnableVertexAttribArray: FnPtr::new(metaloadfn("glEnableVertexAttribArray", &["glEnableVertexAttribArrayARB"])), -EndQuery: FnPtr::new(metaloadfn("glEndQuery", &["glEndQueryARB"])), -EndTransformFeedback: FnPtr::new(metaloadfn("glEndTransformFeedback", &["glEndTransformFeedbackEXT", "glEndTransformFeedbackNV"])), -FenceSync: FnPtr::new(metaloadfn("glFenceSync", &["glFenceSyncAPPLE"])), -Finish: FnPtr::new(metaloadfn("glFinish", &[])), -Flush: FnPtr::new(metaloadfn("glFlush", &[])), -FlushMappedBufferRange: FnPtr::new(metaloadfn("glFlushMappedBufferRange", &["glFlushMappedBufferRangeAPPLE", "glFlushMappedBufferRangeEXT"])), -FramebufferRenderbuffer: FnPtr::new(metaloadfn("glFramebufferRenderbuffer", &["glFramebufferRenderbufferEXT"])), -FramebufferTexture2D: FnPtr::new(metaloadfn("glFramebufferTexture2D", &["glFramebufferTexture2DEXT"])), -FramebufferTextureLayer: FnPtr::new(metaloadfn("glFramebufferTextureLayer", &["glFramebufferTextureLayerARB", "glFramebufferTextureLayerEXT"])), -FrontFace: FnPtr::new(metaloadfn("glFrontFace", &[])), -GenBuffers: FnPtr::new(metaloadfn("glGenBuffers", &["glGenBuffersARB"])), -GenFramebuffers: FnPtr::new(metaloadfn("glGenFramebuffers", &["glGenFramebuffersEXT"])), -GenQueries: FnPtr::new(metaloadfn("glGenQueries", &["glGenQueriesARB"])), -GenRenderbuffers: FnPtr::new(metaloadfn("glGenRenderbuffers", &["glGenRenderbuffersEXT"])), -GenSamplers: FnPtr::new(metaloadfn("glGenSamplers", &[])), -GenTextures: FnPtr::new(metaloadfn("glGenTextures", &[])), -GenTransformFeedbacks: FnPtr::new(metaloadfn("glGenTransformFeedbacks", &["glGenTransformFeedbacksNV"])), -GenVertexArrays: FnPtr::new(metaloadfn("glGenVertexArrays", &["glGenVertexArraysAPPLE", "glGenVertexArraysOES"])), -GenerateMipmap: FnPtr::new(metaloadfn("glGenerateMipmap", &["glGenerateMipmapEXT"])), -GetActiveAttrib: FnPtr::new(metaloadfn("glGetActiveAttrib", &["glGetActiveAttribARB"])), -GetActiveUniform: FnPtr::new(metaloadfn("glGetActiveUniform", &["glGetActiveUniformARB"])), -GetActiveUniformBlockName: FnPtr::new(metaloadfn("glGetActiveUniformBlockName", &[])), -GetActiveUniformBlockiv: FnPtr::new(metaloadfn("glGetActiveUniformBlockiv", &[])), -GetActiveUniformsiv: FnPtr::new(metaloadfn("glGetActiveUniformsiv", &[])), -GetAttachedShaders: FnPtr::new(metaloadfn("glGetAttachedShaders", &[])), -GetAttribLocation: FnPtr::new(metaloadfn("glGetAttribLocation", &["glGetAttribLocationARB"])), -GetBooleanv: FnPtr::new(metaloadfn("glGetBooleanv", &[])), -GetBufferParameteri64v: FnPtr::new(metaloadfn("glGetBufferParameteri64v", &[])), -GetBufferParameteriv: FnPtr::new(metaloadfn("glGetBufferParameteriv", &["glGetBufferParameterivARB"])), -GetBufferPointerv: FnPtr::new(metaloadfn("glGetBufferPointerv", &["glGetBufferPointervARB", "glGetBufferPointervOES"])), -GetError: FnPtr::new(metaloadfn("glGetError", &[])), -GetFloatv: FnPtr::new(metaloadfn("glGetFloatv", &[])), -GetFragDataLocation: FnPtr::new(metaloadfn("glGetFragDataLocation", &["glGetFragDataLocationEXT"])), -GetFramebufferAttachmentParameteriv: FnPtr::new(metaloadfn("glGetFramebufferAttachmentParameteriv", &["glGetFramebufferAttachmentParameterivEXT"])), -GetInteger64i_v: FnPtr::new(metaloadfn("glGetInteger64i_v", &[])), -GetInteger64v: FnPtr::new(metaloadfn("glGetInteger64v", &["glGetInteger64vAPPLE"])), -GetIntegeri_v: FnPtr::new(metaloadfn("glGetIntegeri_v", &["glGetIntegerIndexedvEXT"])), -GetIntegerv: FnPtr::new(metaloadfn("glGetIntegerv", &[])), -GetInternalformativ: FnPtr::new(metaloadfn("glGetInternalformativ", &[])), -GetProgramBinary: FnPtr::new(metaloadfn("glGetProgramBinary", &["glGetProgramBinaryOES"])), -GetProgramInfoLog: FnPtr::new(metaloadfn("glGetProgramInfoLog", &[])), -GetProgramiv: FnPtr::new(metaloadfn("glGetProgramiv", &[])), -GetQueryObjectuiv: FnPtr::new(metaloadfn("glGetQueryObjectuiv", &["glGetQueryObjectuivARB"])), -GetQueryiv: FnPtr::new(metaloadfn("glGetQueryiv", &["glGetQueryivARB"])), -GetRenderbufferParameteriv: FnPtr::new(metaloadfn("glGetRenderbufferParameteriv", &["glGetRenderbufferParameterivEXT"])), -GetSamplerParameterfv: FnPtr::new(metaloadfn("glGetSamplerParameterfv", &[])), -GetSamplerParameteriv: FnPtr::new(metaloadfn("glGetSamplerParameteriv", &[])), -GetShaderInfoLog: FnPtr::new(metaloadfn("glGetShaderInfoLog", &[])), -GetShaderPrecisionFormat: FnPtr::new(metaloadfn("glGetShaderPrecisionFormat", &[])), -GetShaderSource: FnPtr::new(metaloadfn("glGetShaderSource", &["glGetShaderSourceARB"])), -GetShaderiv: FnPtr::new(metaloadfn("glGetShaderiv", &[])), -GetString: FnPtr::new(metaloadfn("glGetString", &[])), -GetStringi: FnPtr::new(metaloadfn("glGetStringi", &[])), -GetSynciv: FnPtr::new(metaloadfn("glGetSynciv", &["glGetSyncivAPPLE"])), -GetTexParameterfv: FnPtr::new(metaloadfn("glGetTexParameterfv", &[])), -GetTexParameteriv: FnPtr::new(metaloadfn("glGetTexParameteriv", &[])), -GetTransformFeedbackVarying: FnPtr::new(metaloadfn("glGetTransformFeedbackVarying", &["glGetTransformFeedbackVaryingEXT"])), -GetUniformBlockIndex: FnPtr::new(metaloadfn("glGetUniformBlockIndex", &[])), -GetUniformIndices: FnPtr::new(metaloadfn("glGetUniformIndices", &[])), -GetUniformLocation: FnPtr::new(metaloadfn("glGetUniformLocation", &["glGetUniformLocationARB"])), -GetUniformfv: FnPtr::new(metaloadfn("glGetUniformfv", &["glGetUniformfvARB"])), -GetUniformiv: FnPtr::new(metaloadfn("glGetUniformiv", &["glGetUniformivARB"])), -GetUniformuiv: FnPtr::new(metaloadfn("glGetUniformuiv", &["glGetUniformuivEXT"])), -GetVertexAttribIiv: FnPtr::new(metaloadfn("glGetVertexAttribIiv", &["glGetVertexAttribIivEXT"])), -GetVertexAttribIuiv: FnPtr::new(metaloadfn("glGetVertexAttribIuiv", &["glGetVertexAttribIuivEXT"])), -GetVertexAttribPointerv: FnPtr::new(metaloadfn("glGetVertexAttribPointerv", &["glGetVertexAttribPointervARB", "glGetVertexAttribPointervNV"])), -GetVertexAttribfv: FnPtr::new(metaloadfn("glGetVertexAttribfv", &["glGetVertexAttribfvARB", "glGetVertexAttribfvNV"])), -GetVertexAttribiv: FnPtr::new(metaloadfn("glGetVertexAttribiv", &["glGetVertexAttribivARB", "glGetVertexAttribivNV"])), -Hint: FnPtr::new(metaloadfn("glHint", &[])), -InvalidateFramebuffer: FnPtr::new(metaloadfn("glInvalidateFramebuffer", &[])), -InvalidateSubFramebuffer: FnPtr::new(metaloadfn("glInvalidateSubFramebuffer", &[])), -IsBuffer: FnPtr::new(metaloadfn("glIsBuffer", &["glIsBufferARB"])), -IsEnabled: FnPtr::new(metaloadfn("glIsEnabled", &[])), -IsFramebuffer: FnPtr::new(metaloadfn("glIsFramebuffer", &["glIsFramebufferEXT"])), -IsProgram: FnPtr::new(metaloadfn("glIsProgram", &[])), -IsQuery: FnPtr::new(metaloadfn("glIsQuery", &["glIsQueryARB"])), -IsRenderbuffer: FnPtr::new(metaloadfn("glIsRenderbuffer", &["glIsRenderbufferEXT"])), -IsSampler: FnPtr::new(metaloadfn("glIsSampler", &[])), -IsShader: FnPtr::new(metaloadfn("glIsShader", &[])), -IsSync: FnPtr::new(metaloadfn("glIsSync", &["glIsSyncAPPLE"])), -IsTexture: FnPtr::new(metaloadfn("glIsTexture", &[])), -IsTransformFeedback: FnPtr::new(metaloadfn("glIsTransformFeedback", &["glIsTransformFeedbackNV"])), -IsVertexArray: FnPtr::new(metaloadfn("glIsVertexArray", &["glIsVertexArrayAPPLE", "glIsVertexArrayOES"])), -LineWidth: FnPtr::new(metaloadfn("glLineWidth", &[])), -LinkProgram: FnPtr::new(metaloadfn("glLinkProgram", &["glLinkProgramARB"])), -MapBufferRange: FnPtr::new(metaloadfn("glMapBufferRange", &["glMapBufferRangeEXT"])), -PauseTransformFeedback: FnPtr::new(metaloadfn("glPauseTransformFeedback", &["glPauseTransformFeedbackNV"])), -PixelStorei: FnPtr::new(metaloadfn("glPixelStorei", &[])), -PolygonOffset: FnPtr::new(metaloadfn("glPolygonOffset", &[])), -ProgramBinary: FnPtr::new(metaloadfn("glProgramBinary", &["glProgramBinaryOES"])), -ProgramParameteri: FnPtr::new(metaloadfn("glProgramParameteri", &["glProgramParameteriARB", "glProgramParameteriEXT"])), -ReadBuffer: FnPtr::new(metaloadfn("glReadBuffer", &[])), -ReadPixels: FnPtr::new(metaloadfn("glReadPixels", &[])), -ReleaseShaderCompiler: FnPtr::new(metaloadfn("glReleaseShaderCompiler", &[])), -RenderbufferStorage: FnPtr::new(metaloadfn("glRenderbufferStorage", &["glRenderbufferStorageEXT"])), -RenderbufferStorageMultisample: FnPtr::new(metaloadfn("glRenderbufferStorageMultisample", &["glRenderbufferStorageMultisampleEXT", "glRenderbufferStorageMultisampleNV"])), -ResumeTransformFeedback: FnPtr::new(metaloadfn("glResumeTransformFeedback", &["glResumeTransformFeedbackNV"])), -SampleCoverage: FnPtr::new(metaloadfn("glSampleCoverage", &["glSampleCoverageARB"])), -SamplerParameterf: FnPtr::new(metaloadfn("glSamplerParameterf", &[])), -SamplerParameterfv: FnPtr::new(metaloadfn("glSamplerParameterfv", &[])), -SamplerParameteri: FnPtr::new(metaloadfn("glSamplerParameteri", &[])), -SamplerParameteriv: FnPtr::new(metaloadfn("glSamplerParameteriv", &[])), -Scissor: FnPtr::new(metaloadfn("glScissor", &[])), -ShaderBinary: FnPtr::new(metaloadfn("glShaderBinary", &[])), -ShaderSource: FnPtr::new(metaloadfn("glShaderSource", &["glShaderSourceARB"])), -StencilFunc: FnPtr::new(metaloadfn("glStencilFunc", &[])), -StencilFuncSeparate: FnPtr::new(metaloadfn("glStencilFuncSeparate", &[])), -StencilMask: FnPtr::new(metaloadfn("glStencilMask", &[])), -StencilMaskSeparate: FnPtr::new(metaloadfn("glStencilMaskSeparate", &[])), -StencilOp: FnPtr::new(metaloadfn("glStencilOp", &[])), -StencilOpSeparate: FnPtr::new(metaloadfn("glStencilOpSeparate", &["glStencilOpSeparateATI"])), -TexImage2D: FnPtr::new(metaloadfn("glTexImage2D", &[])), -TexImage3D: FnPtr::new(metaloadfn("glTexImage3D", &["glTexImage3DEXT"])), -TexParameterf: FnPtr::new(metaloadfn("glTexParameterf", &[])), -TexParameterfv: FnPtr::new(metaloadfn("glTexParameterfv", &[])), -TexParameteri: FnPtr::new(metaloadfn("glTexParameteri", &[])), -TexParameteriv: FnPtr::new(metaloadfn("glTexParameteriv", &[])), -TexStorage2D: FnPtr::new(metaloadfn("glTexStorage2D", &["glTexStorage2DEXT"])), -TexStorage3D: FnPtr::new(metaloadfn("glTexStorage3D", &["glTexStorage3DEXT"])), -TexSubImage2D: FnPtr::new(metaloadfn("glTexSubImage2D", &["glTexSubImage2DEXT"])), -TexSubImage3D: FnPtr::new(metaloadfn("glTexSubImage3D", &["glTexSubImage3DEXT"])), -TransformFeedbackVaryings: FnPtr::new(metaloadfn("glTransformFeedbackVaryings", &["glTransformFeedbackVaryingsEXT"])), -Uniform1f: FnPtr::new(metaloadfn("glUniform1f", &["glUniform1fARB"])), -Uniform1fv: FnPtr::new(metaloadfn("glUniform1fv", &["glUniform1fvARB"])), -Uniform1i: FnPtr::new(metaloadfn("glUniform1i", &["glUniform1iARB"])), -Uniform1iv: FnPtr::new(metaloadfn("glUniform1iv", &["glUniform1ivARB"])), -Uniform1ui: FnPtr::new(metaloadfn("glUniform1ui", &["glUniform1uiEXT"])), -Uniform1uiv: FnPtr::new(metaloadfn("glUniform1uiv", &["glUniform1uivEXT"])), -Uniform2f: FnPtr::new(metaloadfn("glUniform2f", &["glUniform2fARB"])), -Uniform2fv: FnPtr::new(metaloadfn("glUniform2fv", &["glUniform2fvARB"])), -Uniform2i: FnPtr::new(metaloadfn("glUniform2i", &["glUniform2iARB"])), -Uniform2iv: FnPtr::new(metaloadfn("glUniform2iv", &["glUniform2ivARB"])), -Uniform2ui: FnPtr::new(metaloadfn("glUniform2ui", &["glUniform2uiEXT"])), -Uniform2uiv: FnPtr::new(metaloadfn("glUniform2uiv", &["glUniform2uivEXT"])), -Uniform3f: FnPtr::new(metaloadfn("glUniform3f", &["glUniform3fARB"])), -Uniform3fv: FnPtr::new(metaloadfn("glUniform3fv", &["glUniform3fvARB"])), -Uniform3i: FnPtr::new(metaloadfn("glUniform3i", &["glUniform3iARB"])), -Uniform3iv: FnPtr::new(metaloadfn("glUniform3iv", &["glUniform3ivARB"])), -Uniform3ui: FnPtr::new(metaloadfn("glUniform3ui", &["glUniform3uiEXT"])), -Uniform3uiv: FnPtr::new(metaloadfn("glUniform3uiv", &["glUniform3uivEXT"])), -Uniform4f: FnPtr::new(metaloadfn("glUniform4f", &["glUniform4fARB"])), -Uniform4fv: FnPtr::new(metaloadfn("glUniform4fv", &["glUniform4fvARB"])), -Uniform4i: FnPtr::new(metaloadfn("glUniform4i", &["glUniform4iARB"])), -Uniform4iv: FnPtr::new(metaloadfn("glUniform4iv", &["glUniform4ivARB"])), -Uniform4ui: FnPtr::new(metaloadfn("glUniform4ui", &["glUniform4uiEXT"])), -Uniform4uiv: FnPtr::new(metaloadfn("glUniform4uiv", &["glUniform4uivEXT"])), -UniformBlockBinding: FnPtr::new(metaloadfn("glUniformBlockBinding", &[])), -UniformMatrix2fv: FnPtr::new(metaloadfn("glUniformMatrix2fv", &["glUniformMatrix2fvARB"])), -UniformMatrix2x3fv: FnPtr::new(metaloadfn("glUniformMatrix2x3fv", &["glUniformMatrix2x3fvNV"])), -UniformMatrix2x4fv: FnPtr::new(metaloadfn("glUniformMatrix2x4fv", &["glUniformMatrix2x4fvNV"])), -UniformMatrix3fv: FnPtr::new(metaloadfn("glUniformMatrix3fv", &["glUniformMatrix3fvARB"])), -UniformMatrix3x2fv: FnPtr::new(metaloadfn("glUniformMatrix3x2fv", &["glUniformMatrix3x2fvNV"])), -UniformMatrix3x4fv: FnPtr::new(metaloadfn("glUniformMatrix3x4fv", &["glUniformMatrix3x4fvNV"])), -UniformMatrix4fv: FnPtr::new(metaloadfn("glUniformMatrix4fv", &["glUniformMatrix4fvARB"])), -UniformMatrix4x2fv: FnPtr::new(metaloadfn("glUniformMatrix4x2fv", &["glUniformMatrix4x2fvNV"])), -UniformMatrix4x3fv: FnPtr::new(metaloadfn("glUniformMatrix4x3fv", &["glUniformMatrix4x3fvNV"])), -UnmapBuffer: FnPtr::new(metaloadfn("glUnmapBuffer", &["glUnmapBufferARB", "glUnmapBufferOES"])), -UseProgram: FnPtr::new(metaloadfn("glUseProgram", &["glUseProgramObjectARB"])), -ValidateProgram: FnPtr::new(metaloadfn("glValidateProgram", &["glValidateProgramARB"])), -VertexAttrib1f: FnPtr::new(metaloadfn("glVertexAttrib1f", &["glVertexAttrib1fARB", "glVertexAttrib1fNV"])), -VertexAttrib1fv: FnPtr::new(metaloadfn("glVertexAttrib1fv", &["glVertexAttrib1fvARB", "glVertexAttrib1fvNV"])), -VertexAttrib2f: FnPtr::new(metaloadfn("glVertexAttrib2f", &["glVertexAttrib2fARB", "glVertexAttrib2fNV"])), -VertexAttrib2fv: FnPtr::new(metaloadfn("glVertexAttrib2fv", &["glVertexAttrib2fvARB", "glVertexAttrib2fvNV"])), -VertexAttrib3f: FnPtr::new(metaloadfn("glVertexAttrib3f", &["glVertexAttrib3fARB", "glVertexAttrib3fNV"])), -VertexAttrib3fv: FnPtr::new(metaloadfn("glVertexAttrib3fv", &["glVertexAttrib3fvARB", "glVertexAttrib3fvNV"])), -VertexAttrib4f: FnPtr::new(metaloadfn("glVertexAttrib4f", &["glVertexAttrib4fARB", "glVertexAttrib4fNV"])), -VertexAttrib4fv: FnPtr::new(metaloadfn("glVertexAttrib4fv", &["glVertexAttrib4fvARB", "glVertexAttrib4fvNV"])), -VertexAttribDivisor: FnPtr::new(metaloadfn("glVertexAttribDivisor", &["glVertexAttribDivisorANGLE", "glVertexAttribDivisorARB", "glVertexAttribDivisorEXT", "glVertexAttribDivisorNV"])), -VertexAttribI4i: FnPtr::new(metaloadfn("glVertexAttribI4i", &["glVertexAttribI4iEXT"])), -VertexAttribI4iv: FnPtr::new(metaloadfn("glVertexAttribI4iv", &["glVertexAttribI4ivEXT"])), -VertexAttribI4ui: FnPtr::new(metaloadfn("glVertexAttribI4ui", &["glVertexAttribI4uiEXT"])), -VertexAttribI4uiv: FnPtr::new(metaloadfn("glVertexAttribI4uiv", &["glVertexAttribI4uivEXT"])), -VertexAttribIPointer: FnPtr::new(metaloadfn("glVertexAttribIPointer", &["glVertexAttribIPointerEXT"])), -VertexAttribPointer: FnPtr::new(metaloadfn("glVertexAttribPointer", &["glVertexAttribPointerARB"])), -Viewport: FnPtr::new(metaloadfn("glViewport", &[])), -WaitSync: FnPtr::new(metaloadfn("glWaitSync", &["glWaitSyncAPPLE"])), -_priv: () -} + } + ptr } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ActiveTexture(&self, texture: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.ActiveTexture.f)(texture) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn AttachShader(&self, program: types::GLuint, shader: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint) -> ()>(self.AttachShader.f)(program, shader) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BeginQuery(&self, target: types::GLenum, id: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BeginQuery.f)(target, id) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BeginTransformFeedback(&self, primitiveMode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.BeginTransformFeedback.f)(primitiveMode) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BindAttribLocation(&self, program: types::GLuint, index: types::GLuint, name: *const types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, *const types::GLchar) -> ()>(self.BindAttribLocation.f)(program, index, name) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BindBuffer(&self, target: types::GLenum, buffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindBuffer.f)(target, buffer) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BindBufferBase(&self, target: types::GLenum, index: types::GLuint, buffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, types::GLuint) -> ()>(self.BindBufferBase.f)(target, index, buffer) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BindBufferRange(&self, target: types::GLenum, index: types::GLuint, buffer: types::GLuint, offset: types::GLintptr, size: types::GLsizeiptr) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, types::GLuint, types::GLintptr, types::GLsizeiptr) -> ()>(self.BindBufferRange.f)(target, index, buffer, offset, size) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BindFramebuffer(&self, target: types::GLenum, framebuffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindFramebuffer.f)(target, framebuffer) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BindRenderbuffer(&self, target: types::GLenum, renderbuffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindRenderbuffer.f)(target, renderbuffer) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BindSampler(&self, unit: types::GLuint, sampler: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint) -> ()>(self.BindSampler.f)(unit, sampler) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BindTexture(&self, target: types::GLenum, texture: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindTexture.f)(target, texture) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BindTransformFeedback(&self, target: types::GLenum, id: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindTransformFeedback.f)(target, id) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BindVertexArray(&self, array: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.BindVertexArray.f)(array) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BlendColor(&self, red: types::GLfloat, green: types::GLfloat, blue: types::GLfloat, alpha: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.BlendColor.f)(red, green, blue, alpha) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BlendEquation(&self, mode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.BlendEquation.f)(mode) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BlendEquationSeparate(&self, modeRGB: types::GLenum, modeAlpha: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum) -> ()>(self.BlendEquationSeparate.f)(modeRGB, modeAlpha) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BlendFunc(&self, sfactor: types::GLenum, dfactor: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum) -> ()>(self.BlendFunc.f)(sfactor, dfactor) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BlendFuncSeparate(&self, sfactorRGB: types::GLenum, dfactorRGB: types::GLenum, sfactorAlpha: types::GLenum, dfactorAlpha: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLenum) -> ()>(self.BlendFuncSeparate.f)(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BlitFramebuffer(&self, srcX0: types::GLint, srcY0: types::GLint, srcX1: types::GLint, srcY1: types::GLint, dstX0: types::GLint, dstY0: types::GLint, dstX1: types::GLint, dstY1: types::GLint, mask: types::GLbitfield, filter: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLbitfield, types::GLenum) -> ()>(self.BlitFramebuffer.f)(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BufferData(&self, target: types::GLenum, size: types::GLsizeiptr, data: *const __gl_imports::raw::c_void, usage: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizeiptr, *const __gl_imports::raw::c_void, types::GLenum) -> ()>(self.BufferData.f)(target, size, data, usage) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn BufferSubData(&self, target: types::GLenum, offset: types::GLintptr, size: types::GLsizeiptr, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLintptr, types::GLsizeiptr, *const __gl_imports::raw::c_void) -> ()>(self.BufferSubData.f)(target, offset, size, data) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CheckFramebufferStatus(&self, target: types::GLenum) -> types::GLenum { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> types::GLenum>(self.CheckFramebufferStatus.f)(target) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Clear(&self, mask: types::GLbitfield) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLbitfield) -> ()>(self.Clear.f)(mask) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ClearBufferfi(&self, buffer: types::GLenum, drawbuffer: types::GLint, depth: types::GLfloat, stencil: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLfloat, types::GLint) -> ()>(self.ClearBufferfi.f)(buffer, drawbuffer, depth, stencil) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ClearBufferfv(&self, buffer: types::GLenum, drawbuffer: types::GLint, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, *const types::GLfloat) -> ()>(self.ClearBufferfv.f)(buffer, drawbuffer, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ClearBufferiv(&self, buffer: types::GLenum, drawbuffer: types::GLint, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, *const types::GLint) -> ()>(self.ClearBufferiv.f)(buffer, drawbuffer, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ClearBufferuiv(&self, buffer: types::GLenum, drawbuffer: types::GLint, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, *const types::GLuint) -> ()>(self.ClearBufferuiv.f)(buffer, drawbuffer, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ClearColor(&self, red: types::GLfloat, green: types::GLfloat, blue: types::GLfloat, alpha: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.ClearColor.f)(red, green, blue, alpha) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ClearDepthf(&self, d: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat) -> ()>(self.ClearDepthf.f)(d) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ClearStencil(&self, s: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint) -> ()>(self.ClearStencil.f)(s) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ClientWaitSync(&self, sync: types::GLsync, flags: types::GLbitfield, timeout: types::GLuint64) -> types::GLenum { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync, types::GLbitfield, types::GLuint64) -> types::GLenum>(self.ClientWaitSync.f)(sync, flags, timeout) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ColorMask(&self, red: types::GLboolean, green: types::GLboolean, blue: types::GLboolean, alpha: types::GLboolean) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLboolean, types::GLboolean, types::GLboolean, types::GLboolean) -> ()>(self.ColorMask.f)(red, green, blue, alpha) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CompileShader(&self, shader: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.CompileShader.f)(shader) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CompressedTexImage2D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei, border: types::GLint, imageSize: types::GLsizei, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLenum, types::GLsizei, types::GLsizei, types::GLint, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.CompressedTexImage2D.f)(target, level, internalformat, width, height, border, imageSize, data) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CompressedTexImage3D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei, border: types::GLint, imageSize: types::GLsizei, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLenum, types::GLsizei, types::GLsizei, types::GLsizei, types::GLint, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.CompressedTexImage3D.f)(target, level, internalformat, width, height, depth, border, imageSize, data) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CompressedTexSubImage2D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, width: types::GLsizei, height: types::GLsizei, format: types::GLenum, imageSize: types::GLsizei, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLenum, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.CompressedTexSubImage2D.f)(target, level, xoffset, yoffset, width, height, format, imageSize, data) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CompressedTexSubImage3D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, zoffset: types::GLint, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei, format: types::GLenum, imageSize: types::GLsizei, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLsizei, types::GLenum, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.CompressedTexSubImage3D.f)(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CopyBufferSubData(&self, readTarget: types::GLenum, writeTarget: types::GLenum, readOffset: types::GLintptr, writeOffset: types::GLintptr, size: types::GLsizeiptr) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLintptr, types::GLintptr, types::GLsizeiptr) -> ()>(self.CopyBufferSubData.f)(readTarget, writeTarget, readOffset, writeOffset, size) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CopyTexImage2D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLenum, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei, border: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLenum, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLint) -> ()>(self.CopyTexImage2D.f)(target, level, internalformat, x, y, width, height, border) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CopyTexSubImage2D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.CopyTexSubImage2D.f)(target, level, xoffset, yoffset, x, y, width, height) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CopyTexSubImage3D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, zoffset: types::GLint, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.CopyTexSubImage3D.f)(target, level, xoffset, yoffset, zoffset, x, y, width, height) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CreateProgram(&self, ) -> types::GLuint { __gl_imports::mem::transmute::<_, extern "system" fn() -> types::GLuint>(self.CreateProgram.f)() } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CreateShader(&self, type_: types::GLenum) -> types::GLuint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> types::GLuint>(self.CreateShader.f)(type_) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn CullFace(&self, mode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.CullFace.f)(mode) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DeleteBuffers(&self, n: types::GLsizei, buffers: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteBuffers.f)(n, buffers) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DeleteFramebuffers(&self, n: types::GLsizei, framebuffers: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteFramebuffers.f)(n, framebuffers) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DeleteProgram(&self, program: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.DeleteProgram.f)(program) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DeleteQueries(&self, n: types::GLsizei, ids: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteQueries.f)(n, ids) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DeleteRenderbuffers(&self, n: types::GLsizei, renderbuffers: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteRenderbuffers.f)(n, renderbuffers) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DeleteSamplers(&self, count: types::GLsizei, samplers: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteSamplers.f)(count, samplers) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DeleteShader(&self, shader: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.DeleteShader.f)(shader) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DeleteSync(&self, sync: types::GLsync) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync) -> ()>(self.DeleteSync.f)(sync) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DeleteTextures(&self, n: types::GLsizei, textures: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteTextures.f)(n, textures) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DeleteTransformFeedbacks(&self, n: types::GLsizei, ids: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteTransformFeedbacks.f)(n, ids) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DeleteVertexArrays(&self, n: types::GLsizei, arrays: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteVertexArrays.f)(n, arrays) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DepthFunc(&self, func: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.DepthFunc.f)(func) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DepthMask(&self, flag: types::GLboolean) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLboolean) -> ()>(self.DepthMask.f)(flag) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DepthRangef(&self, n: types::GLfloat, f: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLfloat) -> ()>(self.DepthRangef.f)(n, f) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DetachShader(&self, program: types::GLuint, shader: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint) -> ()>(self.DetachShader.f)(program, shader) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Disable(&self, cap: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.Disable.f)(cap) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DisableVertexAttribArray(&self, index: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.DisableVertexAttribArray.f)(index) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DrawArrays(&self, mode: types::GLenum, first: types::GLint, count: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLsizei) -> ()>(self.DrawArrays.f)(mode, first, count) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DrawArraysInstanced(&self, mode: types::GLenum, first: types::GLint, count: types::GLsizei, instancecount: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.DrawArraysInstanced.f)(mode, first, count, instancecount) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DrawBuffers(&self, n: types::GLsizei, bufs: *const types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLenum) -> ()>(self.DrawBuffers.f)(n, bufs) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DrawElements(&self, mode: types::GLenum, count: types::GLsizei, type_: types::GLenum, indices: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.DrawElements.f)(mode, count, type_, indices) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DrawElementsInstanced(&self, mode: types::GLenum, count: types::GLsizei, type_: types::GLenum, indices: *const __gl_imports::raw::c_void, instancecount: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, *const __gl_imports::raw::c_void, types::GLsizei) -> ()>(self.DrawElementsInstanced.f)(mode, count, type_, indices, instancecount) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn DrawRangeElements(&self, mode: types::GLenum, start: types::GLuint, end: types::GLuint, count: types::GLsizei, type_: types::GLenum, indices: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, types::GLuint, types::GLsizei, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.DrawRangeElements.f)(mode, start, end, count, type_, indices) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Enable(&self, cap: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.Enable.f)(cap) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn EnableVertexAttribArray(&self, index: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.EnableVertexAttribArray.f)(index) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn EndQuery(&self, target: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.EndQuery.f)(target) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn EndTransformFeedback(&self, ) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.EndTransformFeedback.f)() } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn FenceSync(&self, condition: types::GLenum, flags: types::GLbitfield) -> types::GLsync { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLbitfield) -> types::GLsync>(self.FenceSync.f)(condition, flags) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Finish(&self, ) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.Finish.f)() } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Flush(&self, ) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.Flush.f)() } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn FlushMappedBufferRange(&self, target: types::GLenum, offset: types::GLintptr, length: types::GLsizeiptr) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLintptr, types::GLsizeiptr) -> ()>(self.FlushMappedBufferRange.f)(target, offset, length) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn FramebufferRenderbuffer(&self, target: types::GLenum, attachment: types::GLenum, renderbuffertarget: types::GLenum, renderbuffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLuint) -> ()>(self.FramebufferRenderbuffer.f)(target, attachment, renderbuffertarget, renderbuffer) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn FramebufferTexture2D(&self, target: types::GLenum, attachment: types::GLenum, textarget: types::GLenum, texture: types::GLuint, level: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLuint, types::GLint) -> ()>(self.FramebufferTexture2D.f)(target, attachment, textarget, texture, level) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn FramebufferTextureLayer(&self, target: types::GLenum, attachment: types::GLenum, texture: types::GLuint, level: types::GLint, layer: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLuint, types::GLint, types::GLint) -> ()>(self.FramebufferTextureLayer.f)(target, attachment, texture, level, layer) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn FrontFace(&self, mode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.FrontFace.f)(mode) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GenBuffers(&self, n: types::GLsizei, buffers: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenBuffers.f)(n, buffers) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GenFramebuffers(&self, n: types::GLsizei, framebuffers: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenFramebuffers.f)(n, framebuffers) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GenQueries(&self, n: types::GLsizei, ids: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenQueries.f)(n, ids) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GenRenderbuffers(&self, n: types::GLsizei, renderbuffers: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenRenderbuffers.f)(n, renderbuffers) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GenSamplers(&self, count: types::GLsizei, samplers: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenSamplers.f)(count, samplers) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GenTextures(&self, n: types::GLsizei, textures: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenTextures.f)(n, textures) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GenTransformFeedbacks(&self, n: types::GLsizei, ids: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenTransformFeedbacks.f)(n, ids) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GenVertexArrays(&self, n: types::GLsizei, arrays: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenVertexArrays.f)(n, arrays) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GenerateMipmap(&self, target: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.GenerateMipmap.f)(target) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetActiveAttrib(&self, program: types::GLuint, index: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, size: *mut types::GLint, type_: *mut types::GLenum, name: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLint, *mut types::GLenum, *mut types::GLchar) -> ()>(self.GetActiveAttrib.f)(program, index, bufSize, length, size, type_, name) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetActiveUniform(&self, program: types::GLuint, index: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, size: *mut types::GLint, type_: *mut types::GLenum, name: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLint, *mut types::GLenum, *mut types::GLchar) -> ()>(self.GetActiveUniform.f)(program, index, bufSize, length, size, type_, name) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetActiveUniformBlockName(&self, program: types::GLuint, uniformBlockIndex: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, uniformBlockName: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLchar) -> ()>(self.GetActiveUniformBlockName.f)(program, uniformBlockIndex, bufSize, length, uniformBlockName) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetActiveUniformBlockiv(&self, program: types::GLuint, uniformBlockIndex: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetActiveUniformBlockiv.f)(program, uniformBlockIndex, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetActiveUniformsiv(&self, program: types::GLuint, uniformCount: types::GLsizei, uniformIndices: *const types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *const types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetActiveUniformsiv.f)(program, uniformCount, uniformIndices, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetAttachedShaders(&self, program: types::GLuint, maxCount: types::GLsizei, count: *mut types::GLsizei, shaders: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLuint) -> ()>(self.GetAttachedShaders.f)(program, maxCount, count, shaders) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetAttribLocation(&self, program: types::GLuint, name: *const types::GLchar) -> types::GLint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLchar) -> types::GLint>(self.GetAttribLocation.f)(program, name) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetBooleanv(&self, pname: types::GLenum, data: *mut types::GLboolean) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, *mut types::GLboolean) -> ()>(self.GetBooleanv.f)(pname, data) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetBufferParameteri64v(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint64) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint64) -> ()>(self.GetBufferParameteri64v.f)(target, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetBufferParameteriv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetBufferParameteriv.f)(target, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetBufferPointerv(&self, target: types::GLenum, pname: types::GLenum, params: *const *mut __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *const *mut __gl_imports::raw::c_void) -> ()>(self.GetBufferPointerv.f)(target, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetError(&self, ) -> types::GLenum { __gl_imports::mem::transmute::<_, extern "system" fn() -> types::GLenum>(self.GetError.f)() } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetFloatv(&self, pname: types::GLenum, data: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, *mut types::GLfloat) -> ()>(self.GetFloatv.f)(pname, data) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetFragDataLocation(&self, program: types::GLuint, name: *const types::GLchar) -> types::GLint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLchar) -> types::GLint>(self.GetFragDataLocation.f)(program, name) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetFramebufferAttachmentParameteriv(&self, target: types::GLenum, attachment: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetFramebufferAttachmentParameteriv.f)(target, attachment, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetInteger64i_v(&self, target: types::GLenum, index: types::GLuint, data: *mut types::GLint64) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, *mut types::GLint64) -> ()>(self.GetInteger64i_v.f)(target, index, data) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetInteger64v(&self, pname: types::GLenum, data: *mut types::GLint64) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, *mut types::GLint64) -> ()>(self.GetInteger64v.f)(pname, data) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetIntegeri_v(&self, target: types::GLenum, index: types::GLuint, data: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, *mut types::GLint) -> ()>(self.GetIntegeri_v.f)(target, index, data) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetIntegerv(&self, pname: types::GLenum, data: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, *mut types::GLint) -> ()>(self.GetIntegerv.f)(pname, data) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetInternalformativ(&self, target: types::GLenum, internalformat: types::GLenum, pname: types::GLenum, bufSize: types::GLsizei, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLsizei, *mut types::GLint) -> ()>(self.GetInternalformativ.f)(target, internalformat, pname, bufSize, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetProgramBinary(&self, program: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, binaryFormat: *mut types::GLenum, binary: *mut __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLenum, *mut __gl_imports::raw::c_void) -> ()>(self.GetProgramBinary.f)(program, bufSize, length, binaryFormat, binary) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetProgramInfoLog(&self, program: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, infoLog: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLchar) -> ()>(self.GetProgramInfoLog.f)(program, bufSize, length, infoLog) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetProgramiv(&self, program: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetProgramiv.f)(program, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetQueryObjectuiv(&self, id: types::GLuint, pname: types::GLenum, params: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLuint) -> ()>(self.GetQueryObjectuiv.f)(id, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetQueryiv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetQueryiv.f)(target, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetRenderbufferParameteriv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetRenderbufferParameteriv.f)(target, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetSamplerParameterfv(&self, sampler: types::GLuint, pname: types::GLenum, params: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLfloat) -> ()>(self.GetSamplerParameterfv.f)(sampler, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetSamplerParameteriv(&self, sampler: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetSamplerParameteriv.f)(sampler, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetShaderInfoLog(&self, shader: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, infoLog: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLchar) -> ()>(self.GetShaderInfoLog.f)(shader, bufSize, length, infoLog) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetShaderPrecisionFormat(&self, shadertype: types::GLenum, precisiontype: types::GLenum, range: *mut types::GLint, precision: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint, *mut types::GLint) -> ()>(self.GetShaderPrecisionFormat.f)(shadertype, precisiontype, range, precision) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetShaderSource(&self, shader: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, source: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLchar) -> ()>(self.GetShaderSource.f)(shader, bufSize, length, source) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetShaderiv(&self, shader: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetShaderiv.f)(shader, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetString(&self, name: types::GLenum) -> *const types::GLubyte { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> *const types::GLubyte>(self.GetString.f)(name) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetStringi(&self, name: types::GLenum, index: types::GLuint) -> *const types::GLubyte { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> *const types::GLubyte>(self.GetStringi.f)(name, index) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetSynciv(&self, sync: types::GLsync, pname: types::GLenum, bufSize: types::GLsizei, length: *mut types::GLsizei, values: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync, types::GLenum, types::GLsizei, *mut types::GLsizei, *mut types::GLint) -> ()>(self.GetSynciv.f)(sync, pname, bufSize, length, values) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetTexParameterfv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLfloat) -> ()>(self.GetTexParameterfv.f)(target, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetTexParameteriv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetTexParameteriv.f)(target, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetTransformFeedbackVarying(&self, program: types::GLuint, index: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, size: *mut types::GLsizei, type_: *mut types::GLenum, name: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLsizei, *mut types::GLenum, *mut types::GLchar) -> ()>(self.GetTransformFeedbackVarying.f)(program, index, bufSize, length, size, type_, name) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetUniformBlockIndex(&self, program: types::GLuint, uniformBlockName: *const types::GLchar) -> types::GLuint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLchar) -> types::GLuint>(self.GetUniformBlockIndex.f)(program, uniformBlockName) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetUniformIndices(&self, program: types::GLuint, uniformCount: types::GLsizei, uniformNames: *const *const types::GLchar, uniformIndices: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *const *const types::GLchar, *mut types::GLuint) -> ()>(self.GetUniformIndices.f)(program, uniformCount, uniformNames, uniformIndices) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetUniformLocation(&self, program: types::GLuint, name: *const types::GLchar) -> types::GLint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLchar) -> types::GLint>(self.GetUniformLocation.f)(program, name) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetUniformfv(&self, program: types::GLuint, location: types::GLint, params: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, *mut types::GLfloat) -> ()>(self.GetUniformfv.f)(program, location, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetUniformiv(&self, program: types::GLuint, location: types::GLint, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, *mut types::GLint) -> ()>(self.GetUniformiv.f)(program, location, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetUniformuiv(&self, program: types::GLuint, location: types::GLint, params: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, *mut types::GLuint) -> ()>(self.GetUniformuiv.f)(program, location, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetVertexAttribIiv(&self, index: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetVertexAttribIiv.f)(index, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetVertexAttribIuiv(&self, index: types::GLuint, pname: types::GLenum, params: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLuint) -> ()>(self.GetVertexAttribIuiv.f)(index, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetVertexAttribPointerv(&self, index: types::GLuint, pname: types::GLenum, pointer: *const *mut __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *const *mut __gl_imports::raw::c_void) -> ()>(self.GetVertexAttribPointerv.f)(index, pname, pointer) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetVertexAttribfv(&self, index: types::GLuint, pname: types::GLenum, params: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLfloat) -> ()>(self.GetVertexAttribfv.f)(index, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn GetVertexAttribiv(&self, index: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetVertexAttribiv.f)(index, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Hint(&self, target: types::GLenum, mode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum) -> ()>(self.Hint.f)(target, mode) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn InvalidateFramebuffer(&self, target: types::GLenum, numAttachments: types::GLsizei, attachments: *const types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, *const types::GLenum) -> ()>(self.InvalidateFramebuffer.f)(target, numAttachments, attachments) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn InvalidateSubFramebuffer(&self, target: types::GLenum, numAttachments: types::GLsizei, attachments: *const types::GLenum, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, *const types::GLenum, types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.InvalidateSubFramebuffer.f)(target, numAttachments, attachments, x, y, width, height) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn IsBuffer(&self, buffer: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsBuffer.f)(buffer) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn IsEnabled(&self, cap: types::GLenum) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> types::GLboolean>(self.IsEnabled.f)(cap) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn IsFramebuffer(&self, framebuffer: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsFramebuffer.f)(framebuffer) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn IsProgram(&self, program: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsProgram.f)(program) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn IsQuery(&self, id: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsQuery.f)(id) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn IsRenderbuffer(&self, renderbuffer: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsRenderbuffer.f)(renderbuffer) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn IsSampler(&self, sampler: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsSampler.f)(sampler) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn IsShader(&self, shader: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsShader.f)(shader) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn IsSync(&self, sync: types::GLsync) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync) -> types::GLboolean>(self.IsSync.f)(sync) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn IsTexture(&self, texture: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsTexture.f)(texture) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn IsTransformFeedback(&self, id: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsTransformFeedback.f)(id) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn IsVertexArray(&self, array: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsVertexArray.f)(array) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn LineWidth(&self, width: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat) -> ()>(self.LineWidth.f)(width) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn LinkProgram(&self, program: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.LinkProgram.f)(program) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn MapBufferRange(&self, target: types::GLenum, offset: types::GLintptr, length: types::GLsizeiptr, access: types::GLbitfield) -> *mut __gl_imports::raw::c_void { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLintptr, types::GLsizeiptr, types::GLbitfield) -> *mut __gl_imports::raw::c_void>(self.MapBufferRange.f)(target, offset, length, access) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn PauseTransformFeedback(&self, ) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.PauseTransformFeedback.f)() } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn PixelStorei(&self, pname: types::GLenum, param: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint) -> ()>(self.PixelStorei.f)(pname, param) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn PolygonOffset(&self, factor: types::GLfloat, units: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLfloat) -> ()>(self.PolygonOffset.f)(factor, units) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ProgramBinary(&self, program: types::GLuint, binaryFormat: types::GLenum, binary: *const __gl_imports::raw::c_void, length: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *const __gl_imports::raw::c_void, types::GLsizei) -> ()>(self.ProgramBinary.f)(program, binaryFormat, binary, length) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ProgramParameteri(&self, program: types::GLuint, pname: types::GLenum, value: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, types::GLint) -> ()>(self.ProgramParameteri.f)(program, pname, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ReadBuffer(&self, src: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.ReadBuffer.f)(src) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ReadPixels(&self, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei, format: types::GLenum, type_: types::GLenum, pixels: *mut __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLenum, types::GLenum, *mut __gl_imports::raw::c_void) -> ()>(self.ReadPixels.f)(x, y, width, height, format, type_, pixels) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ReleaseShaderCompiler(&self, ) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.ReleaseShaderCompiler.f)() } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn RenderbufferStorage(&self, target: types::GLenum, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLsizei, types::GLsizei) -> ()>(self.RenderbufferStorage.f)(target, internalformat, width, height) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn RenderbufferStorageMultisample(&self, target: types::GLenum, samples: types::GLsizei, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, types::GLsizei, types::GLsizei) -> ()>(self.RenderbufferStorageMultisample.f)(target, samples, internalformat, width, height) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ResumeTransformFeedback(&self, ) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.ResumeTransformFeedback.f)() } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn SampleCoverage(&self, value: types::GLfloat, invert: types::GLboolean) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLboolean) -> ()>(self.SampleCoverage.f)(value, invert) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn SamplerParameterf(&self, sampler: types::GLuint, pname: types::GLenum, param: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, types::GLfloat) -> ()>(self.SamplerParameterf.f)(sampler, pname, param) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn SamplerParameterfv(&self, sampler: types::GLuint, pname: types::GLenum, param: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *const types::GLfloat) -> ()>(self.SamplerParameterfv.f)(sampler, pname, param) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn SamplerParameteri(&self, sampler: types::GLuint, pname: types::GLenum, param: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, types::GLint) -> ()>(self.SamplerParameteri.f)(sampler, pname, param) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn SamplerParameteriv(&self, sampler: types::GLuint, pname: types::GLenum, param: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *const types::GLint) -> ()>(self.SamplerParameteriv.f)(sampler, pname, param) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Scissor(&self, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.Scissor.f)(x, y, width, height) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ShaderBinary(&self, count: types::GLsizei, shaders: *const types::GLuint, binaryformat: types::GLenum, binary: *const __gl_imports::raw::c_void, length: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint, types::GLenum, *const __gl_imports::raw::c_void, types::GLsizei) -> ()>(self.ShaderBinary.f)(count, shaders, binaryformat, binary, length) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ShaderSource(&self, shader: types::GLuint, count: types::GLsizei, string: *const *const types::GLchar, length: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *const *const types::GLchar, *const types::GLint) -> ()>(self.ShaderSource.f)(shader, count, string, length) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn StencilFunc(&self, func: types::GLenum, ref_: types::GLint, mask: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLuint) -> ()>(self.StencilFunc.f)(func, ref_, mask) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn StencilFuncSeparate(&self, face: types::GLenum, func: types::GLenum, ref_: types::GLint, mask: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLint, types::GLuint) -> ()>(self.StencilFuncSeparate.f)(face, func, ref_, mask) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn StencilMask(&self, mask: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.StencilMask.f)(mask) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn StencilMaskSeparate(&self, face: types::GLenum, mask: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.StencilMaskSeparate.f)(face, mask) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn StencilOp(&self, fail: types::GLenum, zfail: types::GLenum, zpass: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum) -> ()>(self.StencilOp.f)(fail, zfail, zpass) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn StencilOpSeparate(&self, face: types::GLenum, sfail: types::GLenum, dpfail: types::GLenum, dppass: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLenum) -> ()>(self.StencilOpSeparate.f)(face, sfail, dpfail, dppass) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn TexImage2D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLint, width: types::GLsizei, height: types::GLsizei, border: types::GLint, format: types::GLenum, type_: types::GLenum, pixels: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLint, types::GLenum, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.TexImage2D.f)(target, level, internalformat, width, height, border, format, type_, pixels) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn TexImage3D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLint, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei, border: types::GLint, format: types::GLenum, type_: types::GLenum, pixels: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLsizei, types::GLint, types::GLenum, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.TexImage3D.f)(target, level, internalformat, width, height, depth, border, format, type_, pixels) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn TexParameterf(&self, target: types::GLenum, pname: types::GLenum, param: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLfloat) -> ()>(self.TexParameterf.f)(target, pname, param) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn TexParameterfv(&self, target: types::GLenum, pname: types::GLenum, params: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *const types::GLfloat) -> ()>(self.TexParameterfv.f)(target, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn TexParameteri(&self, target: types::GLenum, pname: types::GLenum, param: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLint) -> ()>(self.TexParameteri.f)(target, pname, param) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn TexParameteriv(&self, target: types::GLenum, pname: types::GLenum, params: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *const types::GLint) -> ()>(self.TexParameteriv.f)(target, pname, params) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn TexStorage2D(&self, target: types::GLenum, levels: types::GLsizei, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, types::GLsizei, types::GLsizei) -> ()>(self.TexStorage2D.f)(target, levels, internalformat, width, height) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn TexStorage3D(&self, target: types::GLenum, levels: types::GLsizei, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, types::GLsizei, types::GLsizei, types::GLsizei) -> ()>(self.TexStorage3D.f)(target, levels, internalformat, width, height, depth) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn TexSubImage2D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, width: types::GLsizei, height: types::GLsizei, format: types::GLenum, type_: types::GLenum, pixels: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLenum, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.TexSubImage2D.f)(target, level, xoffset, yoffset, width, height, format, type_, pixels) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn TexSubImage3D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, zoffset: types::GLint, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei, format: types::GLenum, type_: types::GLenum, pixels: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLsizei, types::GLenum, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.TexSubImage3D.f)(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type_, pixels) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn TransformFeedbackVaryings(&self, program: types::GLuint, count: types::GLsizei, varyings: *const *const types::GLchar, bufferMode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *const *const types::GLchar, types::GLenum) -> ()>(self.TransformFeedbackVaryings.f)(program, count, varyings, bufferMode) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform1f(&self, location: types::GLint, v0: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLfloat) -> ()>(self.Uniform1f.f)(location, v0) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform1fv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLfloat) -> ()>(self.Uniform1fv.f)(location, count, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform1i(&self, location: types::GLint, v0: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint) -> ()>(self.Uniform1i.f)(location, v0) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform1iv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLint) -> ()>(self.Uniform1iv.f)(location, count, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform1ui(&self, location: types::GLint, v0: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLuint) -> ()>(self.Uniform1ui.f)(location, v0) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform1uiv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLuint) -> ()>(self.Uniform1uiv.f)(location, count, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform2f(&self, location: types::GLint, v0: types::GLfloat, v1: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLfloat, types::GLfloat) -> ()>(self.Uniform2f.f)(location, v0, v1) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform2fv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLfloat) -> ()>(self.Uniform2fv.f)(location, count, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform2i(&self, location: types::GLint, v0: types::GLint, v1: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLint) -> ()>(self.Uniform2i.f)(location, v0, v1) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform2iv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLint) -> ()>(self.Uniform2iv.f)(location, count, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform2ui(&self, location: types::GLint, v0: types::GLuint, v1: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLuint, types::GLuint) -> ()>(self.Uniform2ui.f)(location, v0, v1) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform2uiv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLuint) -> ()>(self.Uniform2uiv.f)(location, count, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform3f(&self, location: types::GLint, v0: types::GLfloat, v1: types::GLfloat, v2: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.Uniform3f.f)(location, v0, v1, v2) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform3fv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLfloat) -> ()>(self.Uniform3fv.f)(location, count, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform3i(&self, location: types::GLint, v0: types::GLint, v1: types::GLint, v2: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLint, types::GLint) -> ()>(self.Uniform3i.f)(location, v0, v1, v2) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform3iv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLint) -> ()>(self.Uniform3iv.f)(location, count, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform3ui(&self, location: types::GLint, v0: types::GLuint, v1: types::GLuint, v2: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLuint, types::GLuint, types::GLuint) -> ()>(self.Uniform3ui.f)(location, v0, v1, v2) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform3uiv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLuint) -> ()>(self.Uniform3uiv.f)(location, count, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform4f(&self, location: types::GLint, v0: types::GLfloat, v1: types::GLfloat, v2: types::GLfloat, v3: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLfloat, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.Uniform4f.f)(location, v0, v1, v2, v3) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform4fv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLfloat) -> ()>(self.Uniform4fv.f)(location, count, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform4i(&self, location: types::GLint, v0: types::GLint, v1: types::GLint, v2: types::GLint, v3: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLint, types::GLint, types::GLint) -> ()>(self.Uniform4i.f)(location, v0, v1, v2, v3) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform4iv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLint) -> ()>(self.Uniform4iv.f)(location, count, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform4ui(&self, location: types::GLint, v0: types::GLuint, v1: types::GLuint, v2: types::GLuint, v3: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLuint, types::GLuint, types::GLuint, types::GLuint) -> ()>(self.Uniform4ui.f)(location, v0, v1, v2, v3) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Uniform4uiv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLuint) -> ()>(self.Uniform4uiv.f)(location, count, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn UniformBlockBinding(&self, program: types::GLuint, uniformBlockIndex: types::GLuint, uniformBlockBinding: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLuint) -> ()>(self.UniformBlockBinding.f)(program, uniformBlockIndex, uniformBlockBinding) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn UniformMatrix2fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix2fv.f)(location, count, transpose, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn UniformMatrix2x3fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix2x3fv.f)(location, count, transpose, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn UniformMatrix2x4fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix2x4fv.f)(location, count, transpose, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn UniformMatrix3fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix3fv.f)(location, count, transpose, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn UniformMatrix3x2fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix3x2fv.f)(location, count, transpose, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn UniformMatrix3x4fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix3x4fv.f)(location, count, transpose, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn UniformMatrix4fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix4fv.f)(location, count, transpose, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn UniformMatrix4x2fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix4x2fv.f)(location, count, transpose, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn UniformMatrix4x3fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix4x3fv.f)(location, count, transpose, value) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn UnmapBuffer(&self, target: types::GLenum) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> types::GLboolean>(self.UnmapBuffer.f)(target) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn UseProgram(&self, program: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.UseProgram.f)(program) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn ValidateProgram(&self, program: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.ValidateProgram.f)(program) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttrib1f(&self, index: types::GLuint, x: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLfloat) -> ()>(self.VertexAttrib1f.f)(index, x) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttrib1fv(&self, index: types::GLuint, v: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLfloat) -> ()>(self.VertexAttrib1fv.f)(index, v) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttrib2f(&self, index: types::GLuint, x: types::GLfloat, y: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLfloat, types::GLfloat) -> ()>(self.VertexAttrib2f.f)(index, x, y) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttrib2fv(&self, index: types::GLuint, v: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLfloat) -> ()>(self.VertexAttrib2fv.f)(index, v) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttrib3f(&self, index: types::GLuint, x: types::GLfloat, y: types::GLfloat, z: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.VertexAttrib3f.f)(index, x, y, z) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttrib3fv(&self, index: types::GLuint, v: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLfloat) -> ()>(self.VertexAttrib3fv.f)(index, v) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttrib4f(&self, index: types::GLuint, x: types::GLfloat, y: types::GLfloat, z: types::GLfloat, w: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLfloat, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.VertexAttrib4f.f)(index, x, y, z, w) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttrib4fv(&self, index: types::GLuint, v: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLfloat) -> ()>(self.VertexAttrib4fv.f)(index, v) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttribDivisor(&self, index: types::GLuint, divisor: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint) -> ()>(self.VertexAttribDivisor.f)(index, divisor) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttribI4i(&self, index: types::GLuint, x: types::GLint, y: types::GLint, z: types::GLint, w: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, types::GLint, types::GLint, types::GLint) -> ()>(self.VertexAttribI4i.f)(index, x, y, z, w) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttribI4iv(&self, index: types::GLuint, v: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLint) -> ()>(self.VertexAttribI4iv.f)(index, v) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttribI4ui(&self, index: types::GLuint, x: types::GLuint, y: types::GLuint, z: types::GLuint, w: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLuint, types::GLuint, types::GLuint) -> ()>(self.VertexAttribI4ui.f)(index, x, y, z, w) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttribI4uiv(&self, index: types::GLuint, v: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLuint) -> ()>(self.VertexAttribI4uiv.f)(index, v) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttribIPointer(&self, index: types::GLuint, size: types::GLint, type_: types::GLenum, stride: types::GLsizei, pointer: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, types::GLenum, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.VertexAttribIPointer.f)(index, size, type_, stride, pointer) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn VertexAttribPointer(&self, index: types::GLuint, size: types::GLint, type_: types::GLenum, normalized: types::GLboolean, stride: types::GLsizei, pointer: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, types::GLenum, types::GLboolean, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.VertexAttribPointer.f)(index, size, type_, normalized, stride, pointer) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn Viewport(&self, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.Viewport.f)(x, y, width, height) } -#[allow(non_snake_case, unused_variables, dead_code)] - #[inline] pub unsafe fn WaitSync(&self, sync: types::GLsync, flags: types::GLbitfield, timeout: types::GLuint64) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync, types::GLbitfield, types::GLuint64) -> ()>(self.WaitSync.f)(sync, flags, timeout) } + let mut metaloadfn = |symbol: &'static str, symbols: &[&'static str]| { + do_metaloadfn(&mut loadfn, symbol, symbols) + }; + Gles2 { + ActiveTexture: FnPtr::new(metaloadfn("glActiveTexture", &["glActiveTextureARB"])), + AttachShader: FnPtr::new(metaloadfn("glAttachShader", &["glAttachObjectARB"])), + BeginQuery: FnPtr::new(metaloadfn("glBeginQuery", &["glBeginQueryARB"])), + BeginTransformFeedback: FnPtr::new(metaloadfn("glBeginTransformFeedback", &["glBeginTransformFeedbackEXT", "glBeginTransformFeedbackNV"])), + BindAttribLocation: FnPtr::new(metaloadfn("glBindAttribLocation", &["glBindAttribLocationARB"])), + BindBuffer: FnPtr::new(metaloadfn("glBindBuffer", &["glBindBufferARB"])), + BindBufferBase: FnPtr::new(metaloadfn("glBindBufferBase", &["glBindBufferBaseEXT", "glBindBufferBaseNV"])), + BindBufferRange: FnPtr::new(metaloadfn("glBindBufferRange", &["glBindBufferRangeEXT", "glBindBufferRangeNV"])), + BindFramebuffer: FnPtr::new(metaloadfn("glBindFramebuffer", &[])), + BindRenderbuffer: FnPtr::new(metaloadfn("glBindRenderbuffer", &[])), + BindSampler: FnPtr::new(metaloadfn("glBindSampler", &[])), + BindTexture: FnPtr::new(metaloadfn("glBindTexture", &["glBindTextureEXT"])), + BindTransformFeedback: FnPtr::new(metaloadfn("glBindTransformFeedback", &[])), + BindVertexArray: FnPtr::new(metaloadfn("glBindVertexArray", &["glBindVertexArrayOES"])), + BlendColor: FnPtr::new(metaloadfn("glBlendColor", &["glBlendColorEXT"])), + BlendEquation: FnPtr::new(metaloadfn("glBlendEquation", &["glBlendEquationEXT"])), + BlendEquationSeparate: FnPtr::new(metaloadfn("glBlendEquationSeparate", &["glBlendEquationSeparateEXT"])), + BlendFunc: FnPtr::new(metaloadfn("glBlendFunc", &[])), + BlendFuncSeparate: FnPtr::new(metaloadfn("glBlendFuncSeparate", &["glBlendFuncSeparateEXT", "glBlendFuncSeparateINGR"])), + BlitFramebuffer: FnPtr::new(metaloadfn("glBlitFramebuffer", &["glBlitFramebufferEXT", "glBlitFramebufferNV"])), + BufferData: FnPtr::new(metaloadfn("glBufferData", &["glBufferDataARB"])), + BufferSubData: FnPtr::new(metaloadfn("glBufferSubData", &["glBufferSubDataARB"])), + CheckFramebufferStatus: FnPtr::new(metaloadfn("glCheckFramebufferStatus", &["glCheckFramebufferStatusEXT"])), + Clear: FnPtr::new(metaloadfn("glClear", &[])), + ClearBufferfi: FnPtr::new(metaloadfn("glClearBufferfi", &[])), + ClearBufferfv: FnPtr::new(metaloadfn("glClearBufferfv", &[])), + ClearBufferiv: FnPtr::new(metaloadfn("glClearBufferiv", &[])), + ClearBufferuiv: FnPtr::new(metaloadfn("glClearBufferuiv", &[])), + ClearColor: FnPtr::new(metaloadfn("glClearColor", &[])), + ClearDepthf: FnPtr::new(metaloadfn("glClearDepthf", &["glClearDepthfOES"])), + ClearStencil: FnPtr::new(metaloadfn("glClearStencil", &[])), + ClientWaitSync: FnPtr::new(metaloadfn("glClientWaitSync", &["glClientWaitSyncAPPLE"])), + ColorMask: FnPtr::new(metaloadfn("glColorMask", &[])), + CompileShader: FnPtr::new(metaloadfn("glCompileShader", &["glCompileShaderARB"])), + CompressedTexImage2D: FnPtr::new(metaloadfn("glCompressedTexImage2D", &["glCompressedTexImage2DARB"])), + CompressedTexImage3D: FnPtr::new(metaloadfn("glCompressedTexImage3D", &["glCompressedTexImage3DARB"])), + CompressedTexSubImage2D: FnPtr::new(metaloadfn("glCompressedTexSubImage2D", &["glCompressedTexSubImage2DARB"])), + CompressedTexSubImage3D: FnPtr::new(metaloadfn("glCompressedTexSubImage3D", &["glCompressedTexSubImage3DARB"])), + CopyBufferSubData: FnPtr::new(metaloadfn("glCopyBufferSubData", &["glCopyBufferSubDataNV"])), + CopyTexImage2D: FnPtr::new(metaloadfn("glCopyTexImage2D", &["glCopyTexImage2DEXT"])), + CopyTexSubImage2D: FnPtr::new(metaloadfn("glCopyTexSubImage2D", &["glCopyTexSubImage2DEXT"])), + CopyTexSubImage3D: FnPtr::new(metaloadfn("glCopyTexSubImage3D", &["glCopyTexSubImage3DEXT"])), + CreateProgram: FnPtr::new(metaloadfn("glCreateProgram", &["glCreateProgramObjectARB"])), + CreateShader: FnPtr::new(metaloadfn("glCreateShader", &["glCreateShaderObjectARB"])), + CullFace: FnPtr::new(metaloadfn("glCullFace", &[])), + DeleteBuffers: FnPtr::new(metaloadfn("glDeleteBuffers", &["glDeleteBuffersARB"])), + DeleteFramebuffers: FnPtr::new(metaloadfn("glDeleteFramebuffers", &["glDeleteFramebuffersEXT"])), + DeleteProgram: FnPtr::new(metaloadfn("glDeleteProgram", &[])), + DeleteQueries: FnPtr::new(metaloadfn("glDeleteQueries", &["glDeleteQueriesARB"])), + DeleteRenderbuffers: FnPtr::new(metaloadfn("glDeleteRenderbuffers", &["glDeleteRenderbuffersEXT"])), + DeleteSamplers: FnPtr::new(metaloadfn("glDeleteSamplers", &[])), + DeleteShader: FnPtr::new(metaloadfn("glDeleteShader", &[])), + DeleteSync: FnPtr::new(metaloadfn("glDeleteSync", &["glDeleteSyncAPPLE"])), + DeleteTextures: FnPtr::new(metaloadfn("glDeleteTextures", &[])), + DeleteTransformFeedbacks: FnPtr::new(metaloadfn("glDeleteTransformFeedbacks", &["glDeleteTransformFeedbacksNV"])), + DeleteVertexArrays: FnPtr::new(metaloadfn("glDeleteVertexArrays", &["glDeleteVertexArraysAPPLE", "glDeleteVertexArraysOES"])), + DepthFunc: FnPtr::new(metaloadfn("glDepthFunc", &[])), + DepthMask: FnPtr::new(metaloadfn("glDepthMask", &[])), + DepthRangef: FnPtr::new(metaloadfn("glDepthRangef", &["glDepthRangefOES"])), + DetachShader: FnPtr::new(metaloadfn("glDetachShader", &["glDetachObjectARB"])), + Disable: FnPtr::new(metaloadfn("glDisable", &[])), + DisableVertexAttribArray: FnPtr::new(metaloadfn("glDisableVertexAttribArray", &["glDisableVertexAttribArrayARB"])), + DrawArrays: FnPtr::new(metaloadfn("glDrawArrays", &["glDrawArraysEXT"])), + DrawArraysInstanced: FnPtr::new(metaloadfn("glDrawArraysInstanced", &["glDrawArraysInstancedANGLE", "glDrawArraysInstancedARB", "glDrawArraysInstancedEXT", "glDrawArraysInstancedNV"])), + DrawBuffers: FnPtr::new(metaloadfn("glDrawBuffers", &["glDrawBuffersARB", "glDrawBuffersATI", "glDrawBuffersEXT"])), + DrawElements: FnPtr::new(metaloadfn("glDrawElements", &[])), + DrawElementsInstanced: FnPtr::new(metaloadfn("glDrawElementsInstanced", &["glDrawElementsInstancedANGLE", "glDrawElementsInstancedARB", "glDrawElementsInstancedEXT", "glDrawElementsInstancedNV"])), + DrawRangeElements: FnPtr::new(metaloadfn("glDrawRangeElements", &["glDrawRangeElementsEXT"])), + Enable: FnPtr::new(metaloadfn("glEnable", &[])), + EnableVertexAttribArray: FnPtr::new(metaloadfn("glEnableVertexAttribArray", &["glEnableVertexAttribArrayARB"])), + EndQuery: FnPtr::new(metaloadfn("glEndQuery", &["glEndQueryARB"])), + EndTransformFeedback: FnPtr::new(metaloadfn("glEndTransformFeedback", &["glEndTransformFeedbackEXT", "glEndTransformFeedbackNV"])), + FenceSync: FnPtr::new(metaloadfn("glFenceSync", &["glFenceSyncAPPLE"])), + Finish: FnPtr::new(metaloadfn("glFinish", &[])), + Flush: FnPtr::new(metaloadfn("glFlush", &[])), + FlushMappedBufferRange: FnPtr::new(metaloadfn("glFlushMappedBufferRange", &["glFlushMappedBufferRangeAPPLE", "glFlushMappedBufferRangeEXT"])), + FramebufferRenderbuffer: FnPtr::new(metaloadfn("glFramebufferRenderbuffer", &["glFramebufferRenderbufferEXT"])), + FramebufferTexture2D: FnPtr::new(metaloadfn("glFramebufferTexture2D", &["glFramebufferTexture2DEXT"])), + FramebufferTextureLayer: FnPtr::new(metaloadfn("glFramebufferTextureLayer", &["glFramebufferTextureLayerARB", "glFramebufferTextureLayerEXT"])), + FrontFace: FnPtr::new(metaloadfn("glFrontFace", &[])), + GenBuffers: FnPtr::new(metaloadfn("glGenBuffers", &["glGenBuffersARB"])), + GenFramebuffers: FnPtr::new(metaloadfn("glGenFramebuffers", &["glGenFramebuffersEXT"])), + GenQueries: FnPtr::new(metaloadfn("glGenQueries", &["glGenQueriesARB"])), + GenRenderbuffers: FnPtr::new(metaloadfn("glGenRenderbuffers", &["glGenRenderbuffersEXT"])), + GenSamplers: FnPtr::new(metaloadfn("glGenSamplers", &[])), + GenTextures: FnPtr::new(metaloadfn("glGenTextures", &[])), + GenTransformFeedbacks: FnPtr::new(metaloadfn("glGenTransformFeedbacks", &["glGenTransformFeedbacksNV"])), + GenVertexArrays: FnPtr::new(metaloadfn("glGenVertexArrays", &["glGenVertexArraysAPPLE", "glGenVertexArraysOES"])), + GenerateMipmap: FnPtr::new(metaloadfn("glGenerateMipmap", &["glGenerateMipmapEXT"])), + GetActiveAttrib: FnPtr::new(metaloadfn("glGetActiveAttrib", &["glGetActiveAttribARB"])), + GetActiveUniform: FnPtr::new(metaloadfn("glGetActiveUniform", &["glGetActiveUniformARB"])), + GetActiveUniformBlockName: FnPtr::new(metaloadfn("glGetActiveUniformBlockName", &[])), + GetActiveUniformBlockiv: FnPtr::new(metaloadfn("glGetActiveUniformBlockiv", &[])), + GetActiveUniformsiv: FnPtr::new(metaloadfn("glGetActiveUniformsiv", &[])), + GetAttachedShaders: FnPtr::new(metaloadfn("glGetAttachedShaders", &[])), + GetAttribLocation: FnPtr::new(metaloadfn("glGetAttribLocation", &["glGetAttribLocationARB"])), + GetBooleanv: FnPtr::new(metaloadfn("glGetBooleanv", &[])), + GetBufferParameteri64v: FnPtr::new(metaloadfn("glGetBufferParameteri64v", &[])), + GetBufferParameteriv: FnPtr::new(metaloadfn("glGetBufferParameteriv", &["glGetBufferParameterivARB"])), + GetBufferPointerv: FnPtr::new(metaloadfn("glGetBufferPointerv", &["glGetBufferPointervARB", "glGetBufferPointervOES"])), + GetError: FnPtr::new(metaloadfn("glGetError", &[])), + GetFloatv: FnPtr::new(metaloadfn("glGetFloatv", &[])), + GetFragDataLocation: FnPtr::new(metaloadfn("glGetFragDataLocation", &["glGetFragDataLocationEXT"])), + GetFramebufferAttachmentParameteriv: FnPtr::new(metaloadfn("glGetFramebufferAttachmentParameteriv", &["glGetFramebufferAttachmentParameterivEXT"])), + GetInteger64i_v: FnPtr::new(metaloadfn("glGetInteger64i_v", &[])), + GetInteger64v: FnPtr::new(metaloadfn("glGetInteger64v", &["glGetInteger64vAPPLE"])), + GetIntegeri_v: FnPtr::new(metaloadfn("glGetIntegeri_v", &["glGetIntegerIndexedvEXT"])), + GetIntegerv: FnPtr::new(metaloadfn("glGetIntegerv", &[])), + GetInternalformativ: FnPtr::new(metaloadfn("glGetInternalformativ", &[])), + GetProgramBinary: FnPtr::new(metaloadfn("glGetProgramBinary", &["glGetProgramBinaryOES"])), + GetProgramInfoLog: FnPtr::new(metaloadfn("glGetProgramInfoLog", &[])), + GetProgramiv: FnPtr::new(metaloadfn("glGetProgramiv", &[])), + GetQueryObjectuiv: FnPtr::new(metaloadfn("glGetQueryObjectuiv", &["glGetQueryObjectuivARB"])), + GetQueryiv: FnPtr::new(metaloadfn("glGetQueryiv", &["glGetQueryivARB"])), + GetRenderbufferParameteriv: FnPtr::new(metaloadfn("glGetRenderbufferParameteriv", &["glGetRenderbufferParameterivEXT"])), + GetSamplerParameterfv: FnPtr::new(metaloadfn("glGetSamplerParameterfv", &[])), + GetSamplerParameteriv: FnPtr::new(metaloadfn("glGetSamplerParameteriv", &[])), + GetShaderInfoLog: FnPtr::new(metaloadfn("glGetShaderInfoLog", &[])), + GetShaderPrecisionFormat: FnPtr::new(metaloadfn("glGetShaderPrecisionFormat", &[])), + GetShaderSource: FnPtr::new(metaloadfn("glGetShaderSource", &["glGetShaderSourceARB"])), + GetShaderiv: FnPtr::new(metaloadfn("glGetShaderiv", &[])), + GetString: FnPtr::new(metaloadfn("glGetString", &[])), + GetStringi: FnPtr::new(metaloadfn("glGetStringi", &[])), + GetSynciv: FnPtr::new(metaloadfn("glGetSynciv", &["glGetSyncivAPPLE"])), + GetTexParameterfv: FnPtr::new(metaloadfn("glGetTexParameterfv", &[])), + GetTexParameteriv: FnPtr::new(metaloadfn("glGetTexParameteriv", &[])), + GetTransformFeedbackVarying: FnPtr::new(metaloadfn("glGetTransformFeedbackVarying", &["glGetTransformFeedbackVaryingEXT"])), + GetUniformBlockIndex: FnPtr::new(metaloadfn("glGetUniformBlockIndex", &[])), + GetUniformIndices: FnPtr::new(metaloadfn("glGetUniformIndices", &[])), + GetUniformLocation: FnPtr::new(metaloadfn("glGetUniformLocation", &["glGetUniformLocationARB"])), + GetUniformfv: FnPtr::new(metaloadfn("glGetUniformfv", &["glGetUniformfvARB"])), + GetUniformiv: FnPtr::new(metaloadfn("glGetUniformiv", &["glGetUniformivARB"])), + GetUniformuiv: FnPtr::new(metaloadfn("glGetUniformuiv", &["glGetUniformuivEXT"])), + GetVertexAttribIiv: FnPtr::new(metaloadfn("glGetVertexAttribIiv", &["glGetVertexAttribIivEXT"])), + GetVertexAttribIuiv: FnPtr::new(metaloadfn("glGetVertexAttribIuiv", &["glGetVertexAttribIuivEXT"])), + GetVertexAttribPointerv: FnPtr::new(metaloadfn("glGetVertexAttribPointerv", &["glGetVertexAttribPointervARB", "glGetVertexAttribPointervNV"])), + GetVertexAttribfv: FnPtr::new(metaloadfn("glGetVertexAttribfv", &["glGetVertexAttribfvARB", "glGetVertexAttribfvNV"])), + GetVertexAttribiv: FnPtr::new(metaloadfn("glGetVertexAttribiv", &["glGetVertexAttribivARB", "glGetVertexAttribivNV"])), + Hint: FnPtr::new(metaloadfn("glHint", &[])), + InvalidateFramebuffer: FnPtr::new(metaloadfn("glInvalidateFramebuffer", &[])), + InvalidateSubFramebuffer: FnPtr::new(metaloadfn("glInvalidateSubFramebuffer", &[])), + IsBuffer: FnPtr::new(metaloadfn("glIsBuffer", &["glIsBufferARB"])), + IsEnabled: FnPtr::new(metaloadfn("glIsEnabled", &[])), + IsFramebuffer: FnPtr::new(metaloadfn("glIsFramebuffer", &["glIsFramebufferEXT"])), + IsProgram: FnPtr::new(metaloadfn("glIsProgram", &[])), + IsQuery: FnPtr::new(metaloadfn("glIsQuery", &["glIsQueryARB"])), + IsRenderbuffer: FnPtr::new(metaloadfn("glIsRenderbuffer", &["glIsRenderbufferEXT"])), + IsSampler: FnPtr::new(metaloadfn("glIsSampler", &[])), + IsShader: FnPtr::new(metaloadfn("glIsShader", &[])), + IsSync: FnPtr::new(metaloadfn("glIsSync", &["glIsSyncAPPLE"])), + IsTexture: FnPtr::new(metaloadfn("glIsTexture", &[])), + IsTransformFeedback: FnPtr::new(metaloadfn("glIsTransformFeedback", &["glIsTransformFeedbackNV"])), + IsVertexArray: FnPtr::new(metaloadfn("glIsVertexArray", &["glIsVertexArrayAPPLE", "glIsVertexArrayOES"])), + LineWidth: FnPtr::new(metaloadfn("glLineWidth", &[])), + LinkProgram: FnPtr::new(metaloadfn("glLinkProgram", &["glLinkProgramARB"])), + MapBufferRange: FnPtr::new(metaloadfn("glMapBufferRange", &["glMapBufferRangeEXT"])), + PauseTransformFeedback: FnPtr::new(metaloadfn("glPauseTransformFeedback", &["glPauseTransformFeedbackNV"])), + PixelStorei: FnPtr::new(metaloadfn("glPixelStorei", &[])), + PolygonOffset: FnPtr::new(metaloadfn("glPolygonOffset", &[])), + ProgramBinary: FnPtr::new(metaloadfn("glProgramBinary", &["glProgramBinaryOES"])), + ProgramParameteri: FnPtr::new(metaloadfn("glProgramParameteri", &["glProgramParameteriARB", "glProgramParameteriEXT"])), + ReadBuffer: FnPtr::new(metaloadfn("glReadBuffer", &[])), + ReadPixels: FnPtr::new(metaloadfn("glReadPixels", &[])), + ReleaseShaderCompiler: FnPtr::new(metaloadfn("glReleaseShaderCompiler", &[])), + RenderbufferStorage: FnPtr::new(metaloadfn("glRenderbufferStorage", &["glRenderbufferStorageEXT"])), + RenderbufferStorageMultisample: FnPtr::new(metaloadfn("glRenderbufferStorageMultisample", &["glRenderbufferStorageMultisampleEXT", "glRenderbufferStorageMultisampleNV"])), + ResumeTransformFeedback: FnPtr::new(metaloadfn("glResumeTransformFeedback", &["glResumeTransformFeedbackNV"])), + SampleCoverage: FnPtr::new(metaloadfn("glSampleCoverage", &["glSampleCoverageARB"])), + SamplerParameterf: FnPtr::new(metaloadfn("glSamplerParameterf", &[])), + SamplerParameterfv: FnPtr::new(metaloadfn("glSamplerParameterfv", &[])), + SamplerParameteri: FnPtr::new(metaloadfn("glSamplerParameteri", &[])), + SamplerParameteriv: FnPtr::new(metaloadfn("glSamplerParameteriv", &[])), + Scissor: FnPtr::new(metaloadfn("glScissor", &[])), + ShaderBinary: FnPtr::new(metaloadfn("glShaderBinary", &[])), + ShaderSource: FnPtr::new(metaloadfn("glShaderSource", &["glShaderSourceARB"])), + StencilFunc: FnPtr::new(metaloadfn("glStencilFunc", &[])), + StencilFuncSeparate: FnPtr::new(metaloadfn("glStencilFuncSeparate", &[])), + StencilMask: FnPtr::new(metaloadfn("glStencilMask", &[])), + StencilMaskSeparate: FnPtr::new(metaloadfn("glStencilMaskSeparate", &[])), + StencilOp: FnPtr::new(metaloadfn("glStencilOp", &[])), + StencilOpSeparate: FnPtr::new(metaloadfn("glStencilOpSeparate", &["glStencilOpSeparateATI"])), + TexImage2D: FnPtr::new(metaloadfn("glTexImage2D", &[])), + TexImage3D: FnPtr::new(metaloadfn("glTexImage3D", &["glTexImage3DEXT"])), + TexParameterf: FnPtr::new(metaloadfn("glTexParameterf", &[])), + TexParameterfv: FnPtr::new(metaloadfn("glTexParameterfv", &[])), + TexParameteri: FnPtr::new(metaloadfn("glTexParameteri", &[])), + TexParameteriv: FnPtr::new(metaloadfn("glTexParameteriv", &[])), + TexStorage2D: FnPtr::new(metaloadfn("glTexStorage2D", &["glTexStorage2DEXT"])), + TexStorage3D: FnPtr::new(metaloadfn("glTexStorage3D", &["glTexStorage3DEXT"])), + TexSubImage2D: FnPtr::new(metaloadfn("glTexSubImage2D", &["glTexSubImage2DEXT"])), + TexSubImage3D: FnPtr::new(metaloadfn("glTexSubImage3D", &["glTexSubImage3DEXT"])), + TransformFeedbackVaryings: FnPtr::new(metaloadfn("glTransformFeedbackVaryings", &["glTransformFeedbackVaryingsEXT"])), + Uniform1f: FnPtr::new(metaloadfn("glUniform1f", &["glUniform1fARB"])), + Uniform1fv: FnPtr::new(metaloadfn("glUniform1fv", &["glUniform1fvARB"])), + Uniform1i: FnPtr::new(metaloadfn("glUniform1i", &["glUniform1iARB"])), + Uniform1iv: FnPtr::new(metaloadfn("glUniform1iv", &["glUniform1ivARB"])), + Uniform1ui: FnPtr::new(metaloadfn("glUniform1ui", &["glUniform1uiEXT"])), + Uniform1uiv: FnPtr::new(metaloadfn("glUniform1uiv", &["glUniform1uivEXT"])), + Uniform2f: FnPtr::new(metaloadfn("glUniform2f", &["glUniform2fARB"])), + Uniform2fv: FnPtr::new(metaloadfn("glUniform2fv", &["glUniform2fvARB"])), + Uniform2i: FnPtr::new(metaloadfn("glUniform2i", &["glUniform2iARB"])), + Uniform2iv: FnPtr::new(metaloadfn("glUniform2iv", &["glUniform2ivARB"])), + Uniform2ui: FnPtr::new(metaloadfn("glUniform2ui", &["glUniform2uiEXT"])), + Uniform2uiv: FnPtr::new(metaloadfn("glUniform2uiv", &["glUniform2uivEXT"])), + Uniform3f: FnPtr::new(metaloadfn("glUniform3f", &["glUniform3fARB"])), + Uniform3fv: FnPtr::new(metaloadfn("glUniform3fv", &["glUniform3fvARB"])), + Uniform3i: FnPtr::new(metaloadfn("glUniform3i", &["glUniform3iARB"])), + Uniform3iv: FnPtr::new(metaloadfn("glUniform3iv", &["glUniform3ivARB"])), + Uniform3ui: FnPtr::new(metaloadfn("glUniform3ui", &["glUniform3uiEXT"])), + Uniform3uiv: FnPtr::new(metaloadfn("glUniform3uiv", &["glUniform3uivEXT"])), + Uniform4f: FnPtr::new(metaloadfn("glUniform4f", &["glUniform4fARB"])), + Uniform4fv: FnPtr::new(metaloadfn("glUniform4fv", &["glUniform4fvARB"])), + Uniform4i: FnPtr::new(metaloadfn("glUniform4i", &["glUniform4iARB"])), + Uniform4iv: FnPtr::new(metaloadfn("glUniform4iv", &["glUniform4ivARB"])), + Uniform4ui: FnPtr::new(metaloadfn("glUniform4ui", &["glUniform4uiEXT"])), + Uniform4uiv: FnPtr::new(metaloadfn("glUniform4uiv", &["glUniform4uivEXT"])), + UniformBlockBinding: FnPtr::new(metaloadfn("glUniformBlockBinding", &[])), + UniformMatrix2fv: FnPtr::new(metaloadfn("glUniformMatrix2fv", &["glUniformMatrix2fvARB"])), + UniformMatrix2x3fv: FnPtr::new(metaloadfn("glUniformMatrix2x3fv", &["glUniformMatrix2x3fvNV"])), + UniformMatrix2x4fv: FnPtr::new(metaloadfn("glUniformMatrix2x4fv", &["glUniformMatrix2x4fvNV"])), + UniformMatrix3fv: FnPtr::new(metaloadfn("glUniformMatrix3fv", &["glUniformMatrix3fvARB"])), + UniformMatrix3x2fv: FnPtr::new(metaloadfn("glUniformMatrix3x2fv", &["glUniformMatrix3x2fvNV"])), + UniformMatrix3x4fv: FnPtr::new(metaloadfn("glUniformMatrix3x4fv", &["glUniformMatrix3x4fvNV"])), + UniformMatrix4fv: FnPtr::new(metaloadfn("glUniformMatrix4fv", &["glUniformMatrix4fvARB"])), + UniformMatrix4x2fv: FnPtr::new(metaloadfn("glUniformMatrix4x2fv", &["glUniformMatrix4x2fvNV"])), + UniformMatrix4x3fv: FnPtr::new(metaloadfn("glUniformMatrix4x3fv", &["glUniformMatrix4x3fvNV"])), + UnmapBuffer: FnPtr::new(metaloadfn("glUnmapBuffer", &["glUnmapBufferARB", "glUnmapBufferOES"])), + UseProgram: FnPtr::new(metaloadfn("glUseProgram", &["glUseProgramObjectARB"])), + ValidateProgram: FnPtr::new(metaloadfn("glValidateProgram", &["glValidateProgramARB"])), + VertexAttrib1f: FnPtr::new(metaloadfn("glVertexAttrib1f", &["glVertexAttrib1fARB", "glVertexAttrib1fNV"])), + VertexAttrib1fv: FnPtr::new(metaloadfn("glVertexAttrib1fv", &["glVertexAttrib1fvARB", "glVertexAttrib1fvNV"])), + VertexAttrib2f: FnPtr::new(metaloadfn("glVertexAttrib2f", &["glVertexAttrib2fARB", "glVertexAttrib2fNV"])), + VertexAttrib2fv: FnPtr::new(metaloadfn("glVertexAttrib2fv", &["glVertexAttrib2fvARB", "glVertexAttrib2fvNV"])), + VertexAttrib3f: FnPtr::new(metaloadfn("glVertexAttrib3f", &["glVertexAttrib3fARB", "glVertexAttrib3fNV"])), + VertexAttrib3fv: FnPtr::new(metaloadfn("glVertexAttrib3fv", &["glVertexAttrib3fvARB", "glVertexAttrib3fvNV"])), + VertexAttrib4f: FnPtr::new(metaloadfn("glVertexAttrib4f", &["glVertexAttrib4fARB", "glVertexAttrib4fNV"])), + VertexAttrib4fv: FnPtr::new(metaloadfn("glVertexAttrib4fv", &["glVertexAttrib4fvARB", "glVertexAttrib4fvNV"])), + VertexAttribDivisor: FnPtr::new(metaloadfn("glVertexAttribDivisor", &["glVertexAttribDivisorANGLE", "glVertexAttribDivisorARB", "glVertexAttribDivisorEXT", "glVertexAttribDivisorNV"])), + VertexAttribI4i: FnPtr::new(metaloadfn("glVertexAttribI4i", &["glVertexAttribI4iEXT"])), + VertexAttribI4iv: FnPtr::new(metaloadfn("glVertexAttribI4iv", &["glVertexAttribI4ivEXT"])), + VertexAttribI4ui: FnPtr::new(metaloadfn("glVertexAttribI4ui", &["glVertexAttribI4uiEXT"])), + VertexAttribI4uiv: FnPtr::new(metaloadfn("glVertexAttribI4uiv", &["glVertexAttribI4uivEXT"])), + VertexAttribIPointer: FnPtr::new(metaloadfn("glVertexAttribIPointer", &["glVertexAttribIPointerEXT"])), + VertexAttribPointer: FnPtr::new(metaloadfn("glVertexAttribPointer", &["glVertexAttribPointerARB"])), + Viewport: FnPtr::new(metaloadfn("glViewport", &[])), + WaitSync: FnPtr::new(metaloadfn("glWaitSync", &["glWaitSyncAPPLE"])), + _priv: (), + } + } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ActiveTexture(&self, texture: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.ActiveTexture.f)(texture) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn AttachShader(&self, program: types::GLuint, shader: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint) -> ()>(self.AttachShader.f)(program, shader) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BeginQuery(&self, target: types::GLenum, id: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BeginQuery.f)(target, id) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BeginTransformFeedback(&self, primitiveMode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.BeginTransformFeedback.f)(primitiveMode) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BindAttribLocation(&self, program: types::GLuint, index: types::GLuint, name: *const types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, *const types::GLchar) -> ()>(self.BindAttribLocation.f)(program, index, name) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BindBuffer(&self, target: types::GLenum, buffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindBuffer.f)(target, buffer) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BindBufferBase(&self, target: types::GLenum, index: types::GLuint, buffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, types::GLuint) -> ()>(self.BindBufferBase.f)(target, index, buffer) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BindBufferRange(&self, target: types::GLenum, index: types::GLuint, buffer: types::GLuint, offset: types::GLintptr, size: types::GLsizeiptr) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, types::GLuint, types::GLintptr, types::GLsizeiptr) -> ()>(self.BindBufferRange.f)(target, index, buffer, offset, size) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BindFramebuffer(&self, target: types::GLenum, framebuffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindFramebuffer.f)(target, framebuffer) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BindRenderbuffer(&self, target: types::GLenum, renderbuffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindRenderbuffer.f)(target, renderbuffer) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BindSampler(&self, unit: types::GLuint, sampler: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint) -> ()>(self.BindSampler.f)(unit, sampler) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BindTexture(&self, target: types::GLenum, texture: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindTexture.f)(target, texture) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BindTransformFeedback(&self, target: types::GLenum, id: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.BindTransformFeedback.f)(target, id) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BindVertexArray(&self, array: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.BindVertexArray.f)(array) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BlendColor(&self, red: types::GLfloat, green: types::GLfloat, blue: types::GLfloat, alpha: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.BlendColor.f)(red, green, blue, alpha) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BlendEquation(&self, mode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.BlendEquation.f)(mode) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BlendEquationSeparate(&self, modeRGB: types::GLenum, modeAlpha: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum) -> ()>(self.BlendEquationSeparate.f)(modeRGB, modeAlpha) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BlendFunc(&self, sfactor: types::GLenum, dfactor: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum) -> ()>(self.BlendFunc.f)(sfactor, dfactor) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BlendFuncSeparate(&self, sfactorRGB: types::GLenum, dfactorRGB: types::GLenum, sfactorAlpha: types::GLenum, dfactorAlpha: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLenum) -> ()>(self.BlendFuncSeparate.f)(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BlitFramebuffer(&self, srcX0: types::GLint, srcY0: types::GLint, srcX1: types::GLint, srcY1: types::GLint, dstX0: types::GLint, dstY0: types::GLint, dstX1: types::GLint, dstY1: types::GLint, mask: types::GLbitfield, filter: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLbitfield, types::GLenum) -> ()>(self.BlitFramebuffer.f)(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BufferData(&self, target: types::GLenum, size: types::GLsizeiptr, data: *const __gl_imports::raw::c_void, usage: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizeiptr, *const __gl_imports::raw::c_void, types::GLenum) -> ()>(self.BufferData.f)(target, size, data, usage) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn BufferSubData(&self, target: types::GLenum, offset: types::GLintptr, size: types::GLsizeiptr, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLintptr, types::GLsizeiptr, *const __gl_imports::raw::c_void) -> ()>(self.BufferSubData.f)(target, offset, size, data) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CheckFramebufferStatus(&self, target: types::GLenum) -> types::GLenum { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> types::GLenum>(self.CheckFramebufferStatus.f)(target) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Clear(&self, mask: types::GLbitfield) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLbitfield) -> ()>(self.Clear.f)(mask) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ClearBufferfi(&self, buffer: types::GLenum, drawbuffer: types::GLint, depth: types::GLfloat, stencil: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLfloat, types::GLint) -> ()>(self.ClearBufferfi.f)(buffer, drawbuffer, depth, stencil) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ClearBufferfv(&self, buffer: types::GLenum, drawbuffer: types::GLint, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, *const types::GLfloat) -> ()>(self.ClearBufferfv.f)(buffer, drawbuffer, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ClearBufferiv(&self, buffer: types::GLenum, drawbuffer: types::GLint, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, *const types::GLint) -> ()>(self.ClearBufferiv.f)(buffer, drawbuffer, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ClearBufferuiv(&self, buffer: types::GLenum, drawbuffer: types::GLint, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, *const types::GLuint) -> ()>(self.ClearBufferuiv.f)(buffer, drawbuffer, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ClearColor(&self, red: types::GLfloat, green: types::GLfloat, blue: types::GLfloat, alpha: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.ClearColor.f)(red, green, blue, alpha) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ClearDepthf(&self, d: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat) -> ()>(self.ClearDepthf.f)(d) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ClearStencil(&self, s: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint) -> ()>(self.ClearStencil.f)(s) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ClientWaitSync(&self, sync: types::GLsync, flags: types::GLbitfield, timeout: types::GLuint64) -> types::GLenum { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync, types::GLbitfield, types::GLuint64) -> types::GLenum>(self.ClientWaitSync.f)(sync, flags, timeout) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ColorMask(&self, red: types::GLboolean, green: types::GLboolean, blue: types::GLboolean, alpha: types::GLboolean) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLboolean, types::GLboolean, types::GLboolean, types::GLboolean) -> ()>(self.ColorMask.f)(red, green, blue, alpha) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CompileShader(&self, shader: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.CompileShader.f)(shader) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CompressedTexImage2D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei, border: types::GLint, imageSize: types::GLsizei, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLenum, types::GLsizei, types::GLsizei, types::GLint, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.CompressedTexImage2D.f)(target, level, internalformat, width, height, border, imageSize, data) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CompressedTexImage3D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei, border: types::GLint, imageSize: types::GLsizei, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLenum, types::GLsizei, types::GLsizei, types::GLsizei, types::GLint, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.CompressedTexImage3D.f)(target, level, internalformat, width, height, depth, border, imageSize, data) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CompressedTexSubImage2D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, width: types::GLsizei, height: types::GLsizei, format: types::GLenum, imageSize: types::GLsizei, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLenum, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.CompressedTexSubImage2D.f)(target, level, xoffset, yoffset, width, height, format, imageSize, data) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CompressedTexSubImage3D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, zoffset: types::GLint, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei, format: types::GLenum, imageSize: types::GLsizei, data: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLsizei, types::GLenum, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.CompressedTexSubImage3D.f)(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CopyBufferSubData(&self, readTarget: types::GLenum, writeTarget: types::GLenum, readOffset: types::GLintptr, writeOffset: types::GLintptr, size: types::GLsizeiptr) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLintptr, types::GLintptr, types::GLsizeiptr) -> ()>(self.CopyBufferSubData.f)(readTarget, writeTarget, readOffset, writeOffset, size) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CopyTexImage2D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLenum, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei, border: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLenum, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLint) -> ()>(self.CopyTexImage2D.f)(target, level, internalformat, x, y, width, height, border) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CopyTexSubImage2D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.CopyTexSubImage2D.f)(target, level, xoffset, yoffset, x, y, width, height) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CopyTexSubImage3D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, zoffset: types::GLint, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.CopyTexSubImage3D.f)(target, level, xoffset, yoffset, zoffset, x, y, width, height) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CreateProgram(&self) -> types::GLuint { __gl_imports::mem::transmute::<_, extern "system" fn() -> types::GLuint>(self.CreateProgram.f)() } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CreateShader(&self, type_: types::GLenum) -> types::GLuint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> types::GLuint>(self.CreateShader.f)(type_) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn CullFace(&self, mode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.CullFace.f)(mode) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DeleteBuffers(&self, n: types::GLsizei, buffers: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteBuffers.f)(n, buffers) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DeleteFramebuffers(&self, n: types::GLsizei, framebuffers: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteFramebuffers.f)(n, framebuffers) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DeleteProgram(&self, program: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.DeleteProgram.f)(program) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DeleteQueries(&self, n: types::GLsizei, ids: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteQueries.f)(n, ids) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DeleteRenderbuffers(&self, n: types::GLsizei, renderbuffers: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteRenderbuffers.f)(n, renderbuffers) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DeleteSamplers(&self, count: types::GLsizei, samplers: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteSamplers.f)(count, samplers) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DeleteShader(&self, shader: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.DeleteShader.f)(shader) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DeleteSync(&self, sync: types::GLsync) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync) -> ()>(self.DeleteSync.f)(sync) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DeleteTextures(&self, n: types::GLsizei, textures: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteTextures.f)(n, textures) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DeleteTransformFeedbacks(&self, n: types::GLsizei, ids: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteTransformFeedbacks.f)(n, ids) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DeleteVertexArrays(&self, n: types::GLsizei, arrays: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint) -> ()>(self.DeleteVertexArrays.f)(n, arrays) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DepthFunc(&self, func: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.DepthFunc.f)(func) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DepthMask(&self, flag: types::GLboolean) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLboolean) -> ()>(self.DepthMask.f)(flag) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DepthRangef(&self, n: types::GLfloat, f: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLfloat) -> ()>(self.DepthRangef.f)(n, f) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DetachShader(&self, program: types::GLuint, shader: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint) -> ()>(self.DetachShader.f)(program, shader) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Disable(&self, cap: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.Disable.f)(cap) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DisableVertexAttribArray(&self, index: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.DisableVertexAttribArray.f)(index) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DrawArrays(&self, mode: types::GLenum, first: types::GLint, count: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLsizei) -> ()>(self.DrawArrays.f)(mode, first, count) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DrawArraysInstanced(&self, mode: types::GLenum, first: types::GLint, count: types::GLsizei, instancecount: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.DrawArraysInstanced.f)(mode, first, count, instancecount) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DrawBuffers(&self, n: types::GLsizei, bufs: *const types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLenum) -> ()>(self.DrawBuffers.f)(n, bufs) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DrawElements(&self, mode: types::GLenum, count: types::GLsizei, type_: types::GLenum, indices: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.DrawElements.f)(mode, count, type_, indices) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DrawElementsInstanced(&self, mode: types::GLenum, count: types::GLsizei, type_: types::GLenum, indices: *const __gl_imports::raw::c_void, instancecount: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, *const __gl_imports::raw::c_void, types::GLsizei) -> ()>(self.DrawElementsInstanced.f)(mode, count, type_, indices, instancecount) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn DrawRangeElements(&self, mode: types::GLenum, start: types::GLuint, end: types::GLuint, count: types::GLsizei, type_: types::GLenum, indices: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, types::GLuint, types::GLsizei, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.DrawRangeElements.f)(mode, start, end, count, type_, indices) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Enable(&self, cap: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.Enable.f)(cap) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn EnableVertexAttribArray(&self, index: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.EnableVertexAttribArray.f)(index) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn EndQuery(&self, target: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.EndQuery.f)(target) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn EndTransformFeedback(&self) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.EndTransformFeedback.f)() } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn FenceSync(&self, condition: types::GLenum, flags: types::GLbitfield) -> types::GLsync { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLbitfield) -> types::GLsync>(self.FenceSync.f)(condition, flags) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Finish(&self) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.Finish.f)() } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Flush(&self) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.Flush.f)() } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn FlushMappedBufferRange(&self, target: types::GLenum, offset: types::GLintptr, length: types::GLsizeiptr) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLintptr, types::GLsizeiptr) -> ()>(self.FlushMappedBufferRange.f)(target, offset, length) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn FramebufferRenderbuffer(&self, target: types::GLenum, attachment: types::GLenum, renderbuffertarget: types::GLenum, renderbuffer: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLuint) -> ()>(self.FramebufferRenderbuffer.f)(target, attachment, renderbuffertarget, renderbuffer) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn FramebufferTexture2D(&self, target: types::GLenum, attachment: types::GLenum, textarget: types::GLenum, texture: types::GLuint, level: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLuint, types::GLint) -> ()>(self.FramebufferTexture2D.f)(target, attachment, textarget, texture, level) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn FramebufferTextureLayer(&self, target: types::GLenum, attachment: types::GLenum, texture: types::GLuint, level: types::GLint, layer: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLuint, types::GLint, types::GLint) -> ()>(self.FramebufferTextureLayer.f)(target, attachment, texture, level, layer) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn FrontFace(&self, mode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.FrontFace.f)(mode) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GenBuffers(&self, n: types::GLsizei, buffers: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenBuffers.f)(n, buffers) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GenFramebuffers(&self, n: types::GLsizei, framebuffers: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenFramebuffers.f)(n, framebuffers) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GenQueries(&self, n: types::GLsizei, ids: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenQueries.f)(n, ids) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GenRenderbuffers(&self, n: types::GLsizei, renderbuffers: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenRenderbuffers.f)(n, renderbuffers) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GenSamplers(&self, count: types::GLsizei, samplers: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenSamplers.f)(count, samplers) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GenTextures(&self, n: types::GLsizei, textures: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenTextures.f)(n, textures) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GenTransformFeedbacks(&self, n: types::GLsizei, ids: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenTransformFeedbacks.f)(n, ids) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GenVertexArrays(&self, n: types::GLsizei, arrays: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *mut types::GLuint) -> ()>(self.GenVertexArrays.f)(n, arrays) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GenerateMipmap(&self, target: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.GenerateMipmap.f)(target) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetActiveAttrib(&self, program: types::GLuint, index: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, size: *mut types::GLint, type_: *mut types::GLenum, name: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLint, *mut types::GLenum, *mut types::GLchar) -> ()>(self.GetActiveAttrib.f)(program, index, bufSize, length, size, type_, name) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetActiveUniform(&self, program: types::GLuint, index: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, size: *mut types::GLint, type_: *mut types::GLenum, name: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLint, *mut types::GLenum, *mut types::GLchar) -> ()>(self.GetActiveUniform.f)(program, index, bufSize, length, size, type_, name) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetActiveUniformBlockName(&self, program: types::GLuint, uniformBlockIndex: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, uniformBlockName: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLchar) -> ()>(self.GetActiveUniformBlockName.f)(program, uniformBlockIndex, bufSize, length, uniformBlockName) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetActiveUniformBlockiv(&self, program: types::GLuint, uniformBlockIndex: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetActiveUniformBlockiv.f)(program, uniformBlockIndex, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetActiveUniformsiv(&self, program: types::GLuint, uniformCount: types::GLsizei, uniformIndices: *const types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *const types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetActiveUniformsiv.f)(program, uniformCount, uniformIndices, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetAttachedShaders(&self, program: types::GLuint, maxCount: types::GLsizei, count: *mut types::GLsizei, shaders: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLuint) -> ()>(self.GetAttachedShaders.f)(program, maxCount, count, shaders) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetAttribLocation(&self, program: types::GLuint, name: *const types::GLchar) -> types::GLint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLchar) -> types::GLint>(self.GetAttribLocation.f)(program, name) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetBooleanv(&self, pname: types::GLenum, data: *mut types::GLboolean) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, *mut types::GLboolean) -> ()>(self.GetBooleanv.f)(pname, data) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetBufferParameteri64v(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint64) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint64) -> ()>(self.GetBufferParameteri64v.f)(target, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetBufferParameteriv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetBufferParameteriv.f)(target, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetBufferPointerv(&self, target: types::GLenum, pname: types::GLenum, params: *const *mut __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *const *mut __gl_imports::raw::c_void) -> ()>(self.GetBufferPointerv.f)(target, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetError(&self) -> types::GLenum { __gl_imports::mem::transmute::<_, extern "system" fn() -> types::GLenum>(self.GetError.f)() } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetFloatv(&self, pname: types::GLenum, data: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, *mut types::GLfloat) -> ()>(self.GetFloatv.f)(pname, data) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetFragDataLocation(&self, program: types::GLuint, name: *const types::GLchar) -> types::GLint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLchar) -> types::GLint>(self.GetFragDataLocation.f)(program, name) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetFramebufferAttachmentParameteriv(&self, target: types::GLenum, attachment: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetFramebufferAttachmentParameteriv.f)(target, attachment, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetInteger64i_v(&self, target: types::GLenum, index: types::GLuint, data: *mut types::GLint64) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, *mut types::GLint64) -> ()>(self.GetInteger64i_v.f)(target, index, data) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetInteger64v(&self, pname: types::GLenum, data: *mut types::GLint64) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, *mut types::GLint64) -> ()>(self.GetInteger64v.f)(pname, data) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetIntegeri_v(&self, target: types::GLenum, index: types::GLuint, data: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint, *mut types::GLint) -> ()>(self.GetIntegeri_v.f)(target, index, data) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetIntegerv(&self, pname: types::GLenum, data: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, *mut types::GLint) -> ()>(self.GetIntegerv.f)(pname, data) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetInternalformativ(&self, target: types::GLenum, internalformat: types::GLenum, pname: types::GLenum, bufSize: types::GLsizei, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLsizei, *mut types::GLint) -> ()>(self.GetInternalformativ.f)(target, internalformat, pname, bufSize, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetProgramBinary(&self, program: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, binaryFormat: *mut types::GLenum, binary: *mut __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLenum, *mut __gl_imports::raw::c_void) -> ()>(self.GetProgramBinary.f)(program, bufSize, length, binaryFormat, binary) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetProgramInfoLog(&self, program: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, infoLog: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLchar) -> ()>(self.GetProgramInfoLog.f)(program, bufSize, length, infoLog) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetProgramiv(&self, program: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetProgramiv.f)(program, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetQueryObjectuiv(&self, id: types::GLuint, pname: types::GLenum, params: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLuint) -> ()>(self.GetQueryObjectuiv.f)(id, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetQueryiv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetQueryiv.f)(target, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetRenderbufferParameteriv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetRenderbufferParameteriv.f)(target, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetSamplerParameterfv(&self, sampler: types::GLuint, pname: types::GLenum, params: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLfloat) -> ()>(self.GetSamplerParameterfv.f)(sampler, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetSamplerParameteriv(&self, sampler: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetSamplerParameteriv.f)(sampler, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetShaderInfoLog(&self, shader: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, infoLog: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLchar) -> ()>(self.GetShaderInfoLog.f)(shader, bufSize, length, infoLog) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetShaderPrecisionFormat(&self, shadertype: types::GLenum, precisiontype: types::GLenum, range: *mut types::GLint, precision: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint, *mut types::GLint) -> ()>(self.GetShaderPrecisionFormat.f)(shadertype, precisiontype, range, precision) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetShaderSource(&self, shader: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, source: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLchar) -> ()>(self.GetShaderSource.f)(shader, bufSize, length, source) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetShaderiv(&self, shader: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetShaderiv.f)(shader, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetString(&self, name: types::GLenum) -> *const types::GLubyte { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> *const types::GLubyte>(self.GetString.f)(name) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetStringi(&self, name: types::GLenum, index: types::GLuint) -> *const types::GLubyte { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> *const types::GLubyte>(self.GetStringi.f)(name, index) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetSynciv(&self, sync: types::GLsync, pname: types::GLenum, bufSize: types::GLsizei, length: *mut types::GLsizei, values: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync, types::GLenum, types::GLsizei, *mut types::GLsizei, *mut types::GLint) -> ()>(self.GetSynciv.f)(sync, pname, bufSize, length, values) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetTexParameterfv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLfloat) -> ()>(self.GetTexParameterfv.f)(target, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetTexParameteriv(&self, target: types::GLenum, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *mut types::GLint) -> ()>(self.GetTexParameteriv.f)(target, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetTransformFeedbackVarying(&self, program: types::GLuint, index: types::GLuint, bufSize: types::GLsizei, length: *mut types::GLsizei, size: *mut types::GLsizei, type_: *mut types::GLenum, name: *mut types::GLchar) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLsizei, *mut types::GLsizei, *mut types::GLsizei, *mut types::GLenum, *mut types::GLchar) -> ()>(self.GetTransformFeedbackVarying.f)(program, index, bufSize, length, size, type_, name) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetUniformBlockIndex(&self, program: types::GLuint, uniformBlockName: *const types::GLchar) -> types::GLuint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLchar) -> types::GLuint>(self.GetUniformBlockIndex.f)(program, uniformBlockName) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetUniformIndices(&self, program: types::GLuint, uniformCount: types::GLsizei, uniformNames: *const *const types::GLchar, uniformIndices: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *const *const types::GLchar, *mut types::GLuint) -> ()>(self.GetUniformIndices.f)(program, uniformCount, uniformNames, uniformIndices) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetUniformLocation(&self, program: types::GLuint, name: *const types::GLchar) -> types::GLint { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLchar) -> types::GLint>(self.GetUniformLocation.f)(program, name) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetUniformfv(&self, program: types::GLuint, location: types::GLint, params: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, *mut types::GLfloat) -> ()>(self.GetUniformfv.f)(program, location, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetUniformiv(&self, program: types::GLuint, location: types::GLint, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, *mut types::GLint) -> ()>(self.GetUniformiv.f)(program, location, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetUniformuiv(&self, program: types::GLuint, location: types::GLint, params: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, *mut types::GLuint) -> ()>(self.GetUniformuiv.f)(program, location, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetVertexAttribIiv(&self, index: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetVertexAttribIiv.f)(index, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetVertexAttribIuiv(&self, index: types::GLuint, pname: types::GLenum, params: *mut types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLuint) -> ()>(self.GetVertexAttribIuiv.f)(index, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetVertexAttribPointerv(&self, index: types::GLuint, pname: types::GLenum, pointer: *const *mut __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *const *mut __gl_imports::raw::c_void) -> ()>(self.GetVertexAttribPointerv.f)(index, pname, pointer) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetVertexAttribfv(&self, index: types::GLuint, pname: types::GLenum, params: *mut types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLfloat) -> ()>(self.GetVertexAttribfv.f)(index, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn GetVertexAttribiv(&self, index: types::GLuint, pname: types::GLenum, params: *mut types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *mut types::GLint) -> ()>(self.GetVertexAttribiv.f)(index, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Hint(&self, target: types::GLenum, mode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum) -> ()>(self.Hint.f)(target, mode) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn InvalidateFramebuffer(&self, target: types::GLenum, numAttachments: types::GLsizei, attachments: *const types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, *const types::GLenum) -> ()>(self.InvalidateFramebuffer.f)(target, numAttachments, attachments) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn InvalidateSubFramebuffer(&self, target: types::GLenum, numAttachments: types::GLsizei, attachments: *const types::GLenum, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, *const types::GLenum, types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.InvalidateSubFramebuffer.f)(target, numAttachments, attachments, x, y, width, height) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn IsBuffer(&self, buffer: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsBuffer.f)(buffer) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn IsEnabled(&self, cap: types::GLenum) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> types::GLboolean>(self.IsEnabled.f)(cap) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn IsFramebuffer(&self, framebuffer: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsFramebuffer.f)(framebuffer) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn IsProgram(&self, program: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsProgram.f)(program) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn IsQuery(&self, id: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsQuery.f)(id) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn IsRenderbuffer(&self, renderbuffer: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsRenderbuffer.f)(renderbuffer) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn IsSampler(&self, sampler: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsSampler.f)(sampler) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn IsShader(&self, shader: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsShader.f)(shader) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn IsSync(&self, sync: types::GLsync) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync) -> types::GLboolean>(self.IsSync.f)(sync) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn IsTexture(&self, texture: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsTexture.f)(texture) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn IsTransformFeedback(&self, id: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsTransformFeedback.f)(id) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn IsVertexArray(&self, array: types::GLuint) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> types::GLboolean>(self.IsVertexArray.f)(array) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn LineWidth(&self, width: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat) -> ()>(self.LineWidth.f)(width) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn LinkProgram(&self, program: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.LinkProgram.f)(program) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn MapBufferRange(&self, target: types::GLenum, offset: types::GLintptr, length: types::GLsizeiptr, access: types::GLbitfield) -> *mut __gl_imports::raw::c_void { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLintptr, types::GLsizeiptr, types::GLbitfield) -> *mut __gl_imports::raw::c_void>(self.MapBufferRange.f)(target, offset, length, access) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn PauseTransformFeedback(&self) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.PauseTransformFeedback.f)() } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn PixelStorei(&self, pname: types::GLenum, param: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint) -> ()>(self.PixelStorei.f)(pname, param) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn PolygonOffset(&self, factor: types::GLfloat, units: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLfloat) -> ()>(self.PolygonOffset.f)(factor, units) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ProgramBinary(&self, program: types::GLuint, binaryFormat: types::GLenum, binary: *const __gl_imports::raw::c_void, length: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *const __gl_imports::raw::c_void, types::GLsizei) -> ()>(self.ProgramBinary.f)(program, binaryFormat, binary, length) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ProgramParameteri(&self, program: types::GLuint, pname: types::GLenum, value: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, types::GLint) -> ()>(self.ProgramParameteri.f)(program, pname, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ReadBuffer(&self, src: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> ()>(self.ReadBuffer.f)(src) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ReadPixels(&self, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei, format: types::GLenum, type_: types::GLenum, pixels: *mut __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLenum, types::GLenum, *mut __gl_imports::raw::c_void) -> ()>(self.ReadPixels.f)(x, y, width, height, format, type_, pixels) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ReleaseShaderCompiler(&self) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.ReleaseShaderCompiler.f)() } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn RenderbufferStorage(&self, target: types::GLenum, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLsizei, types::GLsizei) -> ()>(self.RenderbufferStorage.f)(target, internalformat, width, height) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn RenderbufferStorageMultisample(&self, target: types::GLenum, samples: types::GLsizei, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, types::GLsizei, types::GLsizei) -> ()>(self.RenderbufferStorageMultisample.f)(target, samples, internalformat, width, height) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ResumeTransformFeedback(&self) -> () { __gl_imports::mem::transmute::<_, extern "system" fn() -> ()>(self.ResumeTransformFeedback.f)() } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn SampleCoverage(&self, value: types::GLfloat, invert: types::GLboolean) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLfloat, types::GLboolean) -> ()>(self.SampleCoverage.f)(value, invert) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn SamplerParameterf(&self, sampler: types::GLuint, pname: types::GLenum, param: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, types::GLfloat) -> ()>(self.SamplerParameterf.f)(sampler, pname, param) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn SamplerParameterfv(&self, sampler: types::GLuint, pname: types::GLenum, param: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *const types::GLfloat) -> ()>(self.SamplerParameterfv.f)(sampler, pname, param) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn SamplerParameteri(&self, sampler: types::GLuint, pname: types::GLenum, param: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, types::GLint) -> ()>(self.SamplerParameteri.f)(sampler, pname, param) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn SamplerParameteriv(&self, sampler: types::GLuint, pname: types::GLenum, param: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLenum, *const types::GLint) -> ()>(self.SamplerParameteriv.f)(sampler, pname, param) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Scissor(&self, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.Scissor.f)(x, y, width, height) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ShaderBinary(&self, count: types::GLsizei, shaders: *const types::GLuint, binaryformat: types::GLenum, binary: *const __gl_imports::raw::c_void, length: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsizei, *const types::GLuint, types::GLenum, *const __gl_imports::raw::c_void, types::GLsizei) -> ()>(self.ShaderBinary.f)(count, shaders, binaryformat, binary, length) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ShaderSource(&self, shader: types::GLuint, count: types::GLsizei, string: *const *const types::GLchar, length: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *const *const types::GLchar, *const types::GLint) -> ()>(self.ShaderSource.f)(shader, count, string, length) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn StencilFunc(&self, func: types::GLenum, ref_: types::GLint, mask: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLuint) -> ()>(self.StencilFunc.f)(func, ref_, mask) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn StencilFuncSeparate(&self, face: types::GLenum, func: types::GLenum, ref_: types::GLint, mask: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLint, types::GLuint) -> ()>(self.StencilFuncSeparate.f)(face, func, ref_, mask) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn StencilMask(&self, mask: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.StencilMask.f)(mask) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn StencilMaskSeparate(&self, face: types::GLenum, mask: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLuint) -> ()>(self.StencilMaskSeparate.f)(face, mask) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn StencilOp(&self, fail: types::GLenum, zfail: types::GLenum, zpass: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum) -> ()>(self.StencilOp.f)(fail, zfail, zpass) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn StencilOpSeparate(&self, face: types::GLenum, sfail: types::GLenum, dpfail: types::GLenum, dppass: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLenum, types::GLenum) -> ()>(self.StencilOpSeparate.f)(face, sfail, dpfail, dppass) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn TexImage2D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLint, width: types::GLsizei, height: types::GLsizei, border: types::GLint, format: types::GLenum, type_: types::GLenum, pixels: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLint, types::GLenum, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.TexImage2D.f)(target, level, internalformat, width, height, border, format, type_, pixels) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn TexImage3D(&self, target: types::GLenum, level: types::GLint, internalformat: types::GLint, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei, border: types::GLint, format: types::GLenum, type_: types::GLenum, pixels: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLsizei, types::GLint, types::GLenum, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.TexImage3D.f)(target, level, internalformat, width, height, depth, border, format, type_, pixels) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn TexParameterf(&self, target: types::GLenum, pname: types::GLenum, param: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLfloat) -> ()>(self.TexParameterf.f)(target, pname, param) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn TexParameterfv(&self, target: types::GLenum, pname: types::GLenum, params: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *const types::GLfloat) -> ()>(self.TexParameterfv.f)(target, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn TexParameteri(&self, target: types::GLenum, pname: types::GLenum, param: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, types::GLint) -> ()>(self.TexParameteri.f)(target, pname, param) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn TexParameteriv(&self, target: types::GLenum, pname: types::GLenum, params: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLenum, *const types::GLint) -> ()>(self.TexParameteriv.f)(target, pname, params) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn TexStorage2D(&self, target: types::GLenum, levels: types::GLsizei, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, types::GLsizei, types::GLsizei) -> ()>(self.TexStorage2D.f)(target, levels, internalformat, width, height) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn TexStorage3D(&self, target: types::GLenum, levels: types::GLsizei, internalformat: types::GLenum, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLsizei, types::GLenum, types::GLsizei, types::GLsizei, types::GLsizei) -> ()>(self.TexStorage3D.f)(target, levels, internalformat, width, height, depth) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn TexSubImage2D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, width: types::GLsizei, height: types::GLsizei, format: types::GLenum, type_: types::GLenum, pixels: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLenum, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.TexSubImage2D.f)(target, level, xoffset, yoffset, width, height, format, type_, pixels) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn TexSubImage3D(&self, target: types::GLenum, level: types::GLint, xoffset: types::GLint, yoffset: types::GLint, zoffset: types::GLint, width: types::GLsizei, height: types::GLsizei, depth: types::GLsizei, format: types::GLenum, type_: types::GLenum, pixels: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum, types::GLint, types::GLint, types::GLint, types::GLint, types::GLsizei, types::GLsizei, types::GLsizei, types::GLenum, types::GLenum, *const __gl_imports::raw::c_void) -> ()>(self.TexSubImage3D.f)(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type_, pixels) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn TransformFeedbackVaryings(&self, program: types::GLuint, count: types::GLsizei, varyings: *const *const types::GLchar, bufferMode: types::GLenum) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLsizei, *const *const types::GLchar, types::GLenum) -> ()>(self.TransformFeedbackVaryings.f)(program, count, varyings, bufferMode) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform1f(&self, location: types::GLint, v0: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLfloat) -> ()>(self.Uniform1f.f)(location, v0) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform1fv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLfloat) -> ()>(self.Uniform1fv.f)(location, count, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform1i(&self, location: types::GLint, v0: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint) -> ()>(self.Uniform1i.f)(location, v0) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform1iv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLint) -> ()>(self.Uniform1iv.f)(location, count, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform1ui(&self, location: types::GLint, v0: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLuint) -> ()>(self.Uniform1ui.f)(location, v0) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform1uiv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLuint) -> ()>(self.Uniform1uiv.f)(location, count, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform2f(&self, location: types::GLint, v0: types::GLfloat, v1: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLfloat, types::GLfloat) -> ()>(self.Uniform2f.f)(location, v0, v1) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform2fv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLfloat) -> ()>(self.Uniform2fv.f)(location, count, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform2i(&self, location: types::GLint, v0: types::GLint, v1: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLint) -> ()>(self.Uniform2i.f)(location, v0, v1) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform2iv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLint) -> ()>(self.Uniform2iv.f)(location, count, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform2ui(&self, location: types::GLint, v0: types::GLuint, v1: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLuint, types::GLuint) -> ()>(self.Uniform2ui.f)(location, v0, v1) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform2uiv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLuint) -> ()>(self.Uniform2uiv.f)(location, count, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform3f(&self, location: types::GLint, v0: types::GLfloat, v1: types::GLfloat, v2: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.Uniform3f.f)(location, v0, v1, v2) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform3fv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLfloat) -> ()>(self.Uniform3fv.f)(location, count, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform3i(&self, location: types::GLint, v0: types::GLint, v1: types::GLint, v2: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLint, types::GLint) -> ()>(self.Uniform3i.f)(location, v0, v1, v2) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform3iv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLint) -> ()>(self.Uniform3iv.f)(location, count, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform3ui(&self, location: types::GLint, v0: types::GLuint, v1: types::GLuint, v2: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLuint, types::GLuint, types::GLuint) -> ()>(self.Uniform3ui.f)(location, v0, v1, v2) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform3uiv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLuint) -> ()>(self.Uniform3uiv.f)(location, count, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform4f(&self, location: types::GLint, v0: types::GLfloat, v1: types::GLfloat, v2: types::GLfloat, v3: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLfloat, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.Uniform4f.f)(location, v0, v1, v2, v3) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform4fv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLfloat) -> ()>(self.Uniform4fv.f)(location, count, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform4i(&self, location: types::GLint, v0: types::GLint, v1: types::GLint, v2: types::GLint, v3: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLint, types::GLint, types::GLint) -> ()>(self.Uniform4i.f)(location, v0, v1, v2, v3) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform4iv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLint) -> ()>(self.Uniform4iv.f)(location, count, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform4ui(&self, location: types::GLint, v0: types::GLuint, v1: types::GLuint, v2: types::GLuint, v3: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLuint, types::GLuint, types::GLuint, types::GLuint) -> ()>(self.Uniform4ui.f)(location, v0, v1, v2, v3) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Uniform4uiv(&self, location: types::GLint, count: types::GLsizei, value: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, *const types::GLuint) -> ()>(self.Uniform4uiv.f)(location, count, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn UniformBlockBinding(&self, program: types::GLuint, uniformBlockIndex: types::GLuint, uniformBlockBinding: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLuint) -> ()>(self.UniformBlockBinding.f)(program, uniformBlockIndex, uniformBlockBinding) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn UniformMatrix2fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix2fv.f)(location, count, transpose, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn UniformMatrix2x3fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix2x3fv.f)(location, count, transpose, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn UniformMatrix2x4fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix2x4fv.f)(location, count, transpose, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn UniformMatrix3fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix3fv.f)(location, count, transpose, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn UniformMatrix3x2fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix3x2fv.f)(location, count, transpose, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn UniformMatrix3x4fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix3x4fv.f)(location, count, transpose, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn UniformMatrix4fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix4fv.f)(location, count, transpose, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn UniformMatrix4x2fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix4x2fv.f)(location, count, transpose, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn UniformMatrix4x3fv(&self, location: types::GLint, count: types::GLsizei, transpose: types::GLboolean, value: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLsizei, types::GLboolean, *const types::GLfloat) -> ()>(self.UniformMatrix4x3fv.f)(location, count, transpose, value) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn UnmapBuffer(&self, target: types::GLenum) -> types::GLboolean { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLenum) -> types::GLboolean>(self.UnmapBuffer.f)(target) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn UseProgram(&self, program: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.UseProgram.f)(program) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn ValidateProgram(&self, program: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint) -> ()>(self.ValidateProgram.f)(program) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttrib1f(&self, index: types::GLuint, x: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLfloat) -> ()>(self.VertexAttrib1f.f)(index, x) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttrib1fv(&self, index: types::GLuint, v: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLfloat) -> ()>(self.VertexAttrib1fv.f)(index, v) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttrib2f(&self, index: types::GLuint, x: types::GLfloat, y: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLfloat, types::GLfloat) -> ()>(self.VertexAttrib2f.f)(index, x, y) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttrib2fv(&self, index: types::GLuint, v: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLfloat) -> ()>(self.VertexAttrib2fv.f)(index, v) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttrib3f(&self, index: types::GLuint, x: types::GLfloat, y: types::GLfloat, z: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.VertexAttrib3f.f)(index, x, y, z) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttrib3fv(&self, index: types::GLuint, v: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLfloat) -> ()>(self.VertexAttrib3fv.f)(index, v) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttrib4f(&self, index: types::GLuint, x: types::GLfloat, y: types::GLfloat, z: types::GLfloat, w: types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLfloat, types::GLfloat, types::GLfloat, types::GLfloat) -> ()>(self.VertexAttrib4f.f)(index, x, y, z, w) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttrib4fv(&self, index: types::GLuint, v: *const types::GLfloat) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLfloat) -> ()>(self.VertexAttrib4fv.f)(index, v) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttribDivisor(&self, index: types::GLuint, divisor: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint) -> ()>(self.VertexAttribDivisor.f)(index, divisor) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttribI4i(&self, index: types::GLuint, x: types::GLint, y: types::GLint, z: types::GLint, w: types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, types::GLint, types::GLint, types::GLint) -> ()>(self.VertexAttribI4i.f)(index, x, y, z, w) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttribI4iv(&self, index: types::GLuint, v: *const types::GLint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLint) -> ()>(self.VertexAttribI4iv.f)(index, v) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttribI4ui(&self, index: types::GLuint, x: types::GLuint, y: types::GLuint, z: types::GLuint, w: types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLuint, types::GLuint, types::GLuint, types::GLuint) -> ()>(self.VertexAttribI4ui.f)(index, x, y, z, w) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttribI4uiv(&self, index: types::GLuint, v: *const types::GLuint) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, *const types::GLuint) -> ()>(self.VertexAttribI4uiv.f)(index, v) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttribIPointer(&self, index: types::GLuint, size: types::GLint, type_: types::GLenum, stride: types::GLsizei, pointer: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, types::GLenum, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.VertexAttribIPointer.f)(index, size, type_, stride, pointer) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn VertexAttribPointer(&self, index: types::GLuint, size: types::GLint, type_: types::GLenum, normalized: types::GLboolean, stride: types::GLsizei, pointer: *const __gl_imports::raw::c_void) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLuint, types::GLint, types::GLenum, types::GLboolean, types::GLsizei, *const __gl_imports::raw::c_void) -> ()>(self.VertexAttribPointer.f)(index, size, type_, normalized, stride, pointer) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn Viewport(&self, x: types::GLint, y: types::GLint, width: types::GLsizei, height: types::GLsizei) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLint, types::GLint, types::GLsizei, types::GLsizei) -> ()>(self.Viewport.f)(x, y, width, height) } + #[allow(non_snake_case, unused_variables, dead_code)] + #[inline] + pub unsafe fn WaitSync(&self, sync: types::GLsync, flags: types::GLbitfield, timeout: types::GLuint64) -> () { __gl_imports::mem::transmute::<_, extern "system" fn(types::GLsync, types::GLbitfield, types::GLuint64) -> ()>(self.WaitSync.f)(sync, flags, timeout) } } - unsafe impl __gl_imports::Send for Gles2 {} +unsafe impl __gl_imports::Send for Gles2 {} diff --git a/src/framework/graphics.rs b/src/framework/graphics.rs index 0685c5e..b912879 100644 --- a/src/framework/graphics.rs +++ b/src/framework/graphics.rs @@ -178,7 +178,7 @@ pub fn prepare_draw(ctx: &mut Context) -> GameResult { pub fn supports_vertex_draw(ctx: &Context) -> GameResult { if let Some(renderer) = ctx.renderer.as_ref() { - return Ok(renderer.supports_vertex_draw()) + return Ok(renderer.supports_vertex_draw()); } Err(GameError::RenderError("Rendering backend hasn't been initialized yet.".to_string())) diff --git a/src/framework/render_opengl.rs b/src/framework/render_opengl.rs index c1edb72..f62d4f7 100644 --- a/src/framework/render_opengl.rs +++ b/src/framework/render_opengl.rs @@ -17,9 +17,9 @@ use crate::framework::error::GameError::RenderError; use crate::framework::error::GameResult; use crate::framework::gl; use crate::framework::gl::types::*; -use crate::framework::graphics::BlendMode; +use crate::framework::graphics::{BlendMode, VSyncMode}; use crate::framework::util::{field_offset, return_param}; -use crate::graphics::VSyncMode; +use crate::game::GAME_SUSPENDED; pub struct GLContext { pub gles2_mode: bool, @@ -774,7 +774,7 @@ impl BackendRenderer for OpenGLRenderer { fn present(&mut self) -> GameResult { { - let mutex = crate::GAME_SUSPENDED.lock().unwrap(); + let mutex = GAME_SUSPENDED.lock().unwrap(); if *mutex { return Ok(()); } @@ -826,7 +826,7 @@ impl BackendRenderer for OpenGLRenderer { } #[cfg(feature = "backend-sdl")] - unsafe { + unsafe { let ctx = &mut *self.refs.ctx; match mode { diff --git a/src/framework/ui.rs b/src/framework/ui.rs index 09b6b70..b140f64 100644 --- a/src/framework/ui.rs +++ b/src/framework/ui.rs @@ -5,11 +5,10 @@ use imgui::sys::*; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::framework::graphics::{imgui_context, render_imgui}; -use crate::graphics::prepare_imgui; +use crate::framework::graphics::{imgui_context, prepare_imgui, render_imgui}; +use crate::game::shared_game_state::SharedGameState; use crate::live_debugger::LiveDebugger; use crate::scene::Scene; -use crate::shared_game_state::SharedGameState; pub struct UI { pub components: Components, @@ -23,11 +22,7 @@ pub struct Components { pub fn init_imgui() -> GameResult { let mut imgui = imgui::Context::create(); imgui.set_ini_filename(None); - imgui.fonts().add_font(&[ - FontSource::DefaultFontData { - config: Some(FontConfig::default()), - }, - ]); + imgui.fonts().add_font(&[FontSource::DefaultFontData { config: Some(FontConfig::default()) }]); imgui.style_mut().window_padding = [4.0, 6.0]; imgui.style_mut().frame_padding = [8.0, 6.0]; @@ -109,16 +104,11 @@ pub fn init_imgui() -> GameResult { impl UI { pub fn new(_ctx: &mut Context) -> GameResult { - Ok(Self { - components: Components { - live_debugger: LiveDebugger::new(), - }, - last_frame: Instant::now(), - }) + Ok(Self { components: Components { live_debugger: LiveDebugger::new() }, last_frame: Instant::now() }) } pub fn draw(&mut self, state: &mut SharedGameState, ctx: &mut Context, scene: &mut Box) -> GameResult { - let ctx2 = unsafe { &mut *(ctx as *const Context as *mut Context)}; + let ctx2 = unsafe { &mut *(ctx as *const Context as *mut Context) }; let imgui = imgui_context(ctx)?; let io = imgui.io_mut(); let now = Instant::now(); diff --git a/src/framework/vfs.rs b/src/framework/vfs.rs index 50a4d1a..ce09442 100644 --- a/src/framework/vfs.rs +++ b/src/framework/vfs.rs @@ -128,7 +128,7 @@ pub trait VFS: Debug { fn metadata(&self, path: &Path) -> GameResult>; /// Retrieve all file and directory entries in the given directory. - fn read_dir(&self, path: &Path) -> GameResult>>>; + fn read_dir(&self, path: &Path) -> GameResult>>>; /// Retrieve the actual location of the VFS root, if available. fn to_path_buf(&self) -> Option; @@ -376,7 +376,7 @@ impl VFS for PhysicalFS { } /// Retrieve the path entries in this path - fn read_dir(&self, path: &Path) -> GameResult>>> { + fn read_dir(&self, path: &Path) -> GameResult>>> { self.create_root()?; let p = self.to_absolute(path)?; // This is inconvenient because path() returns the full absolute @@ -511,7 +511,7 @@ impl VFS for OverlayFS { } /// Retrieve the path entries in this path - fn read_dir(&self, path: &Path) -> GameResult>>> { + fn read_dir(&self, path: &Path) -> GameResult>>> { // This is tricky 'cause we have to actually merge iterators together... // Doing it the simple and stupid way works though. let mut v = Vec::new(); diff --git a/src/caret.rs b/src/game/caret.rs similarity index 99% rename from src/caret.rs rename to src/game/caret.rs index 8103e3b..fb0eba1 100644 --- a/src/caret.rs +++ b/src/game/caret.rs @@ -1,6 +1,6 @@ -use crate::common::{Condition, Direction, Rect, CDEG_RAD}; +use crate::common::{CDEG_RAD, Condition, Direction, Rect}; use crate::engine_constants::EngineConstants; -use crate::rng::RNG; +use crate::util::rng::RNG; #[derive(Debug, EnumIter, PartialEq, Eq, Hash, Copy, Clone)] pub enum CaretType { diff --git a/src/frame.rs b/src/game/frame.rs similarity index 97% rename from src/frame.rs rename to src/game/frame.rs index 2779b74..d7f6eba 100644 --- a/src/frame.rs +++ b/src/game/frame.rs @@ -1,7 +1,7 @@ use crate::common::{fix9_scale, interpolate_fix9_scale}; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::stage::Stage; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; +use crate::util::rng::RNG; #[derive(Debug, Clone, Copy, PartialEq, Eq)] #[repr(u8)] diff --git a/src/inventory.rs b/src/game/inventory.rs similarity index 97% rename from src/inventory.rs rename to src/game/inventory.rs index 6ba390d..0dcc50a 100644 --- a/src/inventory.rs +++ b/src/game/inventory.rs @@ -1,10 +1,10 @@ use std::cmp::Ordering; use crate::engine_constants::EngineConstants; -use crate::shared_game_state::SharedGameState; -use crate::weapon::{Weapon, WeaponLevel, WeaponType}; -use crate::player::{Player, TargetPlayer}; -use crate::weapon::bullet::BulletManager; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::{Weapon, WeaponLevel, WeaponType}; +use crate::game::weapon::bullet::BulletManager; #[derive(Clone, Copy)] /// (id, amount) diff --git a/src/map.rs b/src/game/map.rs similarity index 98% rename from src/map.rs rename to src/game/map.rs index 2930e65..17faf11 100644 --- a/src/map.rs +++ b/src/game/map.rs @@ -3,16 +3,16 @@ use std::io; use std::io::{BufRead, BufReader, Cursor, Read}; use std::sync::Arc; -use byteorder::{ReadBytesExt, LE}; +use byteorder::{LE, ReadBytesExt}; use crate::common::{Color, Rect}; -use crate::encoding::read_cur_shift_jis; use crate::framework::context::Context; -use crate::framework::error::GameError::ResourceLoadError; use crate::framework::error::{GameError, GameResult}; +use crate::framework::error::GameError::ResourceLoadError; use crate::framework::filesystem; -use crate::shared_game_state::TileSize; -use crate::stage::{PxPackScroll, PxPackStageData, StageData}; +use crate::game::shared_game_state::TileSize; +use crate::game::stage::{PxPackScroll, PxPackStageData, StageData}; +use crate::util::encoding::read_cur_shift_jis; static SUPPORTED_PXM_VERSIONS: [u8; 1] = [0x10]; static SUPPORTED_PXE_VERSIONS: [u8; 2] = [0, 0x10]; @@ -211,7 +211,7 @@ impl Map { log::warn!("Map attribute data is shorter than 256 bytes!"); } } else if let Ok(mut attrib_data) = - filesystem::open_find(ctx, roots, ["Stage/", &tileset_fg, ".pxattr"].join("")) + filesystem::open_find(ctx, roots, ["Stage/", &tileset_fg, ".pxattr"].join("")) { attrib_data.read_exact(&mut magic)?; @@ -549,7 +549,7 @@ impl WaterParams { } pub fn load_from(&mut self, data: R) -> GameResult { - fn next_u8<'a>(s: &mut impl Iterator, error_msg: &str) -> GameResult { + fn next_u8<'a>(s: &mut impl Iterator, error_msg: &str) -> GameResult { match s.next() { None => Err(GameError::ParseError("Out of range.".to_string())), Some(v) => v.trim().parse::().map_err(|_| GameError::ParseError(error_msg.to_string())), diff --git a/src/game/mod.rs b/src/game/mod.rs new file mode 100644 index 0000000..7b0254a --- /dev/null +++ b/src/game/mod.rs @@ -0,0 +1,329 @@ +use std::cell::UnsafeCell; +use std::path::PathBuf; +use std::sync::Mutex; +use std::time::{Duration, Instant}; + +use lazy_static::lazy_static; + +use scripting::tsc::text_script::ScriptMode; + +use crate::data::builtin_fs::BuiltinFS; +use crate::framework::context::Context; +use crate::framework::error::GameResult; +use crate::framework::filesystem::{mount_user_vfs, mount_vfs}; +use crate::framework::graphics; +use crate::framework::graphics::VSyncMode; +use crate::framework::ui::UI; +use crate::framework::vfs::PhysicalFS; +use crate::game::shared_game_state::{Fps, SharedGameState, TimingMode}; +use crate::graphics::texture_set::{G_MAG, I_MAG}; +use crate::scene::loading_scene::LoadingScene; +use crate::scene::Scene; + +pub mod caret; +pub mod frame; +pub mod inventory; +pub mod map; +pub mod physics; +pub mod profile; +pub mod settings; +pub mod shared_game_state; +pub mod stage; +pub mod npc; +pub mod player; +pub mod weapon; +pub mod scripting; + +pub struct LaunchOptions { + pub server_mode: bool, + pub editor: bool, +} + +lazy_static! { + pub static ref GAME_SUSPENDED: Mutex = Mutex::new(false); +} + +pub struct Game { + pub(crate) scene: Option>, + pub(crate) state: UnsafeCell, + ui: UI, + start_time: Instant, + last_tick: u128, + next_tick: u128, + pub(crate) loops: u32, + next_tick_draw: u128, + present: bool, + fps: Fps, +} + +impl Game { + fn new(ctx: &mut Context) -> GameResult { + let s = Game { + scene: None, + ui: UI::new(ctx)?, + state: UnsafeCell::new(SharedGameState::new(ctx)?), + start_time: Instant::now(), + last_tick: 0, + next_tick: 0, + loops: 0, + next_tick_draw: 0, + present: true, + fps: Fps::new(), + }; + + Ok(s) + } + + pub(crate) fn update(&mut self, ctx: &mut Context) -> GameResult { + if let Some(scene) = &mut self.scene { + let state_ref = unsafe { &mut *self.state.get() }; + + let speed = + if state_ref.textscript_vm.mode == ScriptMode::Map && state_ref.textscript_vm.flags.cutscene_skip() { + 4.0 * state_ref.settings.speed + } else { + 1.0 * state_ref.settings.speed + }; + + match state_ref.settings.timing_mode { + TimingMode::_50Hz | TimingMode::_60Hz => { + let last_tick = self.next_tick; + + while self.start_time.elapsed().as_nanos() >= self.next_tick && self.loops < 10 { + if (speed - 1.0).abs() < 0.01 { + self.next_tick += state_ref.settings.timing_mode.get_delta() as u128; + } else { + self.next_tick += (state_ref.settings.timing_mode.get_delta() as f64 / speed) as u128; + } + self.loops += 1; + } + + if self.loops == 10 { + log::warn!("Frame skip is way too high, a long system lag occurred?"); + self.last_tick = self.start_time.elapsed().as_nanos(); + self.next_tick = + self.last_tick + (state_ref.settings.timing_mode.get_delta() as f64 / speed) as u128; + self.loops = 0; + } + + if self.loops != 0 { + scene.draw_tick(state_ref)?; + self.last_tick = last_tick; + } + + for _ in 0..self.loops { + scene.tick(state_ref, ctx)?; + } + self.fps.tick_count = self.fps.tick_count.saturating_add(self.loops as u32); + } + TimingMode::FrameSynchronized => { + scene.tick(state_ref, ctx)?; + } + } + } + Ok(()) + } + + pub(crate) fn draw(&mut self, ctx: &mut Context) -> GameResult { + let state_ref = unsafe { &mut *self.state.get() }; + + match ctx.vsync_mode { + VSyncMode::Uncapped | VSyncMode::VSync => { + self.present = true; + } + _ => unsafe { + self.present = false; + + let divisor = match ctx.vsync_mode { + VSyncMode::VRRTickSync1x => 1, + VSyncMode::VRRTickSync2x => 2, + VSyncMode::VRRTickSync3x => 3, + _ => std::hint::unreachable_unchecked(), + }; + + let delta = (state_ref.settings.timing_mode.get_delta() / divisor) as u64; + + let now = self.start_time.elapsed().as_nanos(); + if now > self.next_tick_draw + delta as u128 * 4 { + self.next_tick_draw = now; + } + + while self.start_time.elapsed().as_nanos() >= self.next_tick_draw { + self.next_tick_draw += delta as u128; + self.present = true; + } + }, + } + + if !self.present { + std::thread::sleep(Duration::from_millis(2)); + self.loops = 0; + return Ok(()); + } + + if ctx.headless { + self.loops = 0; + state_ref.frame_time = 1.0; + return Ok(()); + } + + if state_ref.settings.timing_mode != TimingMode::FrameSynchronized { + let mut elapsed = self.start_time.elapsed().as_nanos(); + + // Even with the non-monotonic Instant mitigation at the start of the event loop, there's still a chance of it not working. + // This check here should trigger if that happens and makes sure there's no panic from an underflow. + if elapsed < self.last_tick { + elapsed = self.last_tick; + } + + let n1 = (elapsed - self.last_tick) as f64; + let n2 = (self.next_tick - self.last_tick) as f64; + state_ref.frame_time = if state_ref.settings.motion_interpolation { n1 / n2 } else { 1.0 }; + } + unsafe { + G_MAG = if state_ref.settings.subpixel_coords { state_ref.scale } else { 1.0 }; + I_MAG = state_ref.scale; + } + self.loops = 0; + + graphics::prepare_draw(ctx)?; + graphics::clear(ctx, [0.0, 0.0, 0.0, 1.0].into()); + + if let Some(scene) = &mut self.scene { + scene.draw(state_ref, ctx)?; + if state_ref.settings.touch_controls { + state_ref.touch_controls.draw( + state_ref.canvas_size, + state_ref.scale, + &state_ref.constants, + &mut state_ref.texture_set, + ctx, + )?; + } + + if state_ref.settings.fps_counter { + self.fps.act(state_ref, ctx, self.start_time.elapsed().as_nanos())?; + } + + self.ui.draw(state_ref, ctx, scene)?; + } + + graphics::present(ctx)?; + + Ok(()) + } +} + +pub fn init(options: LaunchOptions) -> GameResult { + let _ = simple_logger::SimpleLogger::new() + .without_timestamps() + .with_colors(true) + .with_level(log::Level::Info.to_level_filter()) + .init(); + + #[cfg(not(target_os = "android"))] + let resource_dir = if let Ok(data_dir) = std::env::var("CAVESTORY_DATA_DIR") { + PathBuf::from(data_dir) + } else { + let mut resource_dir = std::env::current_exe()?; + if resource_dir.file_name().is_some() { + let _ = resource_dir.pop(); + } + + #[cfg(target_os = "macos")] + { + let mut bundle_dir = resource_dir.clone(); + let _ = bundle_dir.pop(); + let mut bundle_exec_dir = bundle_dir.clone(); + let mut csplus_data_dir = bundle_dir.clone(); + let _ = csplus_data_dir.pop(); + let _ = csplus_data_dir.pop(); + let mut csplus_data_base_dir = csplus_data_dir.clone(); + csplus_data_base_dir.push("data"); + csplus_data_base_dir.push("base"); + + bundle_exec_dir.push("MacOS"); + bundle_dir.push("Resources"); + + if bundle_exec_dir.is_dir() && bundle_dir.is_dir() { + log::info!("Running in macOS bundle mode"); + + if csplus_data_base_dir.is_dir() { + log::info!("Cave Story+ Steam detected"); + resource_dir = csplus_data_dir; + } else { + resource_dir = bundle_dir; + } + } + } + + resource_dir.push("data"); + resource_dir + }; + + #[cfg(not(target_os = "android"))] + log::info!("Resource directory: {:?}", resource_dir); + log::info!("Initializing engine..."); + + let mut context = Context::new(); + #[cfg(not(target_os = "android"))] + mount_vfs(&mut context, Box::new(PhysicalFS::new(&resource_dir, true))); + + #[cfg(not(target_os = "android"))] + let project_dirs = match directories::ProjectDirs::from("", "", "doukutsu-rs") { + Some(dirs) => dirs, + None => { + use crate::framework::error::GameError; + return Err(GameError::FilesystemError(String::from("No valid home directory path could be retrieved."))); + } + }; + #[cfg(target_os = "android")] + { + let mut data_path = + PathBuf::from(ndk_glue::native_activity().internal_data_path().to_string_lossy().to_string()); + let mut user_path = data_path.clone(); + + data_path.push("data"); + user_path.push("saves"); + + let _ = std::fs::create_dir_all(&data_path); + let _ = std::fs::create_dir_all(&user_path); + + log::info!("Android data directories: data_path={:?} user_path={:?}", &data_path, &user_path); + + mount_vfs(&mut context, Box::new(PhysicalFS::new(&data_path, true))); + mount_user_vfs(&mut context, Box::new(PhysicalFS::new(&user_path, false))); + } + + #[cfg(not(target_os = "android"))] + { + if crate::framework::filesystem::open(&context, "/.drs_localstorage").is_ok() { + let mut user_dir = resource_dir.clone(); + user_dir.push("_drs_profile"); + + let _ = std::fs::create_dir_all(&user_dir); + mount_user_vfs(&mut context, Box::new(PhysicalFS::new(&user_dir, false))); + } else { + mount_user_vfs(&mut context, Box::new(PhysicalFS::new(project_dirs.data_local_dir(), false))); + } + } + + mount_vfs(&mut context, Box::new(BuiltinFS::new())); + + if options.server_mode { + log::info!("Running in server mode..."); + context.headless = true; + } + + let game = UnsafeCell::new(Game::new(&mut context)?); + let state_ref = unsafe { &mut *((&mut *game.get()).state.get()) }; + #[cfg(feature = "scripting-lua")] + { + state_ref.lua.update_refs(unsafe { (&*game.get()).state.get() }, &mut context as *mut Context); + } + + state_ref.next_scene = Some(Box::new(LoadingScene::new())); + context.run(unsafe { &mut *game.get() })?; + + Ok(()) +} diff --git a/src/npc/ai/balcony.rs b/src/game/npc/ai/balcony.rs similarity index 97% rename from src/npc/ai/balcony.rs rename to src/game/npc/ai/balcony.rs index 7f5af68..51510cc 100644 --- a/src/npc/ai/balcony.rs +++ b/src/game/npc/ai/balcony.rs @@ -1,9 +1,10 @@ use crate::common::Direction; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::{GameResult, SharedGameState}; +use crate::framework::error::GameResult; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n254_helicopter(&mut self, state: &mut SharedGameState, npc_list: &NPCList) -> GameResult { diff --git a/src/npc/ai/balrog.rs b/src/game/npc/ai/balrog.rs similarity index 99% rename from src/npc/ai/balrog.rs rename to src/game/npc/ai/balrog.rs index f8d36c0..bcdeff3 100644 --- a/src/npc/ai/balrog.rs +++ b/src/game/npc/ai/balrog.rs @@ -1,14 +1,14 @@ use num_traits::clamp; -use crate::caret::CaretType; -use crate::common::{Direction, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction}; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::stage::Stage; +use crate::game::caret::CaretType; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n009_balrog_falling_in( diff --git a/src/npc/ai/booster.rs b/src/game/npc/ai/booster.rs similarity index 96% rename from src/npc/ai/booster.rs rename to src/game/npc/ai/booster.rs index d410d1d..2109b0d 100644 --- a/src/npc/ai/booster.rs +++ b/src/game/npc/ai/booster.rs @@ -1,9 +1,8 @@ -use crate::framework::error::GameResult; - use crate::common::Direction; -use crate::npc::NPC; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::framework::error::GameResult; +use crate::game::npc::NPC; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n113_professor_booster(&mut self, state: &mut SharedGameState) -> GameResult { diff --git a/src/npc/ai/chaco.rs b/src/game/npc/ai/chaco.rs similarity index 92% rename from src/npc/ai/chaco.rs rename to src/game/npc/ai/chaco.rs index 604ed3f..db5ef49 100644 --- a/src/npc/ai/chaco.rs +++ b/src/game/npc/ai/chaco.rs @@ -1,11 +1,10 @@ -use crate::framework::error::GameResult; - -use crate::caret::CaretType; use crate::common::Direction; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::framework::error::GameResult; +use crate::game::caret::CaretType; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n093_chaco(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { diff --git a/src/npc/ai/characters.rs b/src/game/npc/ai/characters.rs similarity index 99% rename from src/npc/ai/characters.rs rename to src/game/npc/ai/characters.rs index c48760c..1cac767 100644 --- a/src/npc/ai/characters.rs +++ b/src/game/npc/ai/characters.rs @@ -2,11 +2,11 @@ use num_traits::{abs, clamp}; use crate::common::Direction; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n029_cthulhu(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { diff --git a/src/npc/ai/curly.rs b/src/game/npc/ai/curly.rs similarity index 97% rename from src/npc/ai/curly.rs rename to src/game/npc/ai/curly.rs index e2c6a67..b754d09 100644 --- a/src/npc/ai/curly.rs +++ b/src/game/npc/ai/curly.rs @@ -1,14 +1,14 @@ use num_traits::{abs, clamp}; -use crate::caret::CaretType; use crate::common::{Direction, Rect}; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::{Player, TargetPlayer}; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; +use crate::game::caret::CaretType; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::bullet::BulletManager; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n117_curly( @@ -581,12 +581,12 @@ impl NPC { } else { self.x = parent.x + if parent.direction == Direction::Left { - self.direction = Direction::Left; - -0x1000 - } else { - self.direction = Direction::Right; - 0x1000 - }; + self.direction = Direction::Left; + -0x1000 + } else { + self.direction = Direction::Right; + 0x1000 + }; self.y = parent.y; self.anim_num = 0; } @@ -675,12 +675,12 @@ impl NPC { } else { self.x = parent.x + if parent.direction == Direction::Left { - self.direction = Direction::Left; - -0x1000 - } else { - self.direction = Direction::Right; - 0x1000 - }; + self.direction = Direction::Left; + -0x1000 + } else { + self.direction = Direction::Right; + 0x1000 + }; self.y = parent.y; self.anim_num = 0; } diff --git a/src/npc/ai/doctor.rs b/src/game/npc/ai/doctor.rs similarity index 99% rename from src/npc/ai/doctor.rs rename to src/game/npc/ai/doctor.rs index 413bc21..0eebfd4 100644 --- a/src/npc/ai/doctor.rs +++ b/src/game/npc/ai/doctor.rs @@ -1,11 +1,11 @@ -use crate::common::{Direction, Rect, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction, Rect}; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::stage::Stage; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n139_doctor(&mut self, state: &mut SharedGameState) -> GameResult { diff --git a/src/npc/ai/egg_corridor.rs b/src/game/npc/ai/egg_corridor.rs similarity index 99% rename from src/npc/ai/egg_corridor.rs rename to src/game/npc/ai/egg_corridor.rs index 90e29dd..0cbc820 100644 --- a/src/npc/ai/egg_corridor.rs +++ b/src/game/npc/ai/egg_corridor.rs @@ -1,14 +1,14 @@ use num_traits::{abs, clamp}; -use crate::caret::CaretType; -use crate::common::{Direction, Rect, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction, Rect}; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::{Player, TargetPlayer}; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; +use crate::game::caret::CaretType; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::bullet::BulletManager; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n002_behemoth(&mut self, state: &mut SharedGameState, npc_list: &NPCList) -> GameResult { diff --git a/src/npc/ai/first_cave.rs b/src/game/npc/ai/first_cave.rs similarity index 97% rename from src/npc/ai/first_cave.rs rename to src/game/npc/ai/first_cave.rs index 1b308a5..1ea62b9 100644 --- a/src/npc/ai/first_cave.rs +++ b/src/game/npc/ai/first_cave.rs @@ -2,10 +2,10 @@ use num_traits::clamp; use crate::common::Direction; use crate::framework::error::GameResult; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n059_eye_door(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { diff --git a/src/npc/ai/grasstown.rs b/src/game/npc/ai/grasstown.rs similarity index 98% rename from src/npc/ai/grasstown.rs rename to src/game/npc/ai/grasstown.rs index 5715a4e..834e33f 100644 --- a/src/npc/ai/grasstown.rs +++ b/src/game/npc/ai/grasstown.rs @@ -1,13 +1,13 @@ use num_traits::abs; use num_traits::clamp; -use crate::caret::CaretType; use crate::common::{Direction, Rect}; use crate::framework::error::GameResult; -use crate::npc::{NPCList, NPC}; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::caret::CaretType; +use crate::game::npc::{NPC, NPCList}; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n024_power_critter( @@ -834,7 +834,7 @@ impl NPC { && self.action_num != 3 && self.action_counter > 10 && ((self.shock > 0) - || (abs(self.x - player.x) < 0x14000 && abs(self.y - player.y) < 0x8000) && self.rng.range(0..50) == 2) + || (abs(self.x - player.x) < 0x14000 && abs(self.y - player.y) < 0x8000) && self.rng.range(0..50) == 2) { self.direction = if self.x >= player.x { Direction::Left } else { Direction::Right }; self.action_num = 10; @@ -1176,7 +1176,7 @@ impl NPC { && self.action_num != 3 && self.action_counter > 10 && ((self.shock > 0) - || (abs(self.x - player.x) < 0x14000 && abs(self.y - player.y) < 0x8000) && self.rng.range(0..50) == 2) + || (abs(self.x - player.x) < 0x14000 && abs(self.y - player.y) < 0x8000) && self.rng.range(0..50) == 2) { self.direction = if self.x >= player.x { Direction::Left } else { Direction::Right }; self.action_num = 10; @@ -1219,9 +1219,9 @@ impl NPC { let player = self.get_closest_player_mut(players); if self.shock != 0 || (player.x < self.x + 0xc000 - && player.x > self.x - 0xc000 - && player.y < self.y + 0x4000 - && player.y > self.y - 0xc000) + && player.x > self.x - 0xc000 + && player.y < self.y + 0x4000 + && player.y > self.y - 0xc000) { self.action_num = 10; } diff --git a/src/npc/ai/hell.rs b/src/game/npc/ai/hell.rs similarity index 97% rename from src/npc/ai/hell.rs rename to src/game/npc/ai/hell.rs index 6dcd525..7479f89 100644 --- a/src/npc/ai/hell.rs +++ b/src/game/npc/ai/hell.rs @@ -1,11 +1,12 @@ -use crate::caret::CaretType; use crate::common::Direction; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::stage::Stage; -use crate::{GameResult, SharedGameState}; +use crate::framework::error::GameResult; +use crate::game::caret::CaretType; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n337_numahachi(&mut self, state: &mut SharedGameState) -> GameResult { @@ -264,7 +265,7 @@ impl NPC { if (player.y > self.y - 0x14000 && player.y < self.y + 0x14000) && ((self.direction == Direction::Left && player.x > self.x - 0x28000 && player.x < self.x) - || (self.direction != Direction::Left && player.x > self.x && player.x < self.x + 0x28000)) + || (self.direction != Direction::Left && player.x > self.x && player.x < self.x + 0x28000)) { self.action_num = 10; } @@ -511,9 +512,9 @@ impl NPC { let player = self.get_closest_player_ref(&players); if self.action_counter > 20 && ((self.direction == Direction::Left && self.x <= player.x + 0x4000) - || (self.direction == Direction::Up && self.y <= player.y + 0x4000) - || (self.direction == Direction::Right && self.x <= player.x - 0x4000) - || (self.direction == Direction::Bottom && self.y <= player.y - 0x4000)) + || (self.direction == Direction::Up && self.y <= player.y + 0x4000) + || (self.direction == Direction::Right && self.x <= player.x - 0x4000) + || (self.direction == Direction::Bottom && self.y <= player.y - 0x4000)) { self.action_num = 10 } diff --git a/src/npc/ai/igor.rs b/src/game/npc/ai/igor.rs similarity index 98% rename from src/npc/ai/igor.rs rename to src/game/npc/ai/igor.rs index 3ddd63c..49db62a 100644 --- a/src/npc/ai/igor.rs +++ b/src/game/npc/ai/igor.rs @@ -1,10 +1,10 @@ -use crate::common::{Direction, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction}; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n083_igor_cutscene(&mut self, state: &mut SharedGameState) -> GameResult { diff --git a/src/npc/ai/intro.rs b/src/game/npc/ai/intro.rs similarity index 96% rename from src/npc/ai/intro.rs rename to src/game/npc/ai/intro.rs index 8adf697..d8ac372 100644 --- a/src/npc/ai/intro.rs +++ b/src/game/npc/ai/intro.rs @@ -1,10 +1,9 @@ -use crate::framework::error::GameResult; - -use crate::caret::CaretType; use crate::common::Direction; -use crate::npc::NPC; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::framework::error::GameResult; +use crate::game::caret::CaretType; +use crate::game::npc::NPC; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n298_intro_doctor(&mut self, state: &mut SharedGameState) -> GameResult { diff --git a/src/npc/ai/last_cave.rs b/src/game/npc/ai/last_cave.rs similarity index 98% rename from src/npc/ai/last_cave.rs rename to src/game/npc/ai/last_cave.rs index 0821fb8..c6df8c0 100644 --- a/src/npc/ai/last_cave.rs +++ b/src/game/npc/ai/last_cave.rs @@ -1,11 +1,11 @@ -use crate::caret::CaretType; use crate::common::Direction; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::caret::CaretType; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n241_critter_red( diff --git a/src/npc/ai/maze.rs b/src/game/npc/ai/maze.rs similarity index 99% rename from src/npc/ai/maze.rs rename to src/game/npc/ai/maze.rs index a6b1e26..f286f1b 100644 --- a/src/npc/ai/maze.rs +++ b/src/game/npc/ai/maze.rs @@ -1,11 +1,11 @@ -use crate::caret::CaretType; -use crate::common::{Direction, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction}; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::caret::CaretType; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n147_critter_purple( diff --git a/src/npc/ai/mimiga_village.rs b/src/game/npc/ai/mimiga_village.rs similarity index 99% rename from src/npc/ai/mimiga_village.rs rename to src/game/npc/ai/mimiga_village.rs index 5e93df8..3e6a26f 100644 --- a/src/npc/ai/mimiga_village.rs +++ b/src/game/npc/ai/mimiga_village.rs @@ -4,13 +4,13 @@ use num_traits::{abs, clamp}; use crate::common::Direction; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::{Player, TargetPlayer}; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::stage::Stage; -use crate::weapon::bullet::BulletManager; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; +use crate::game::weapon::bullet::BulletManager; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n069_pignon(&mut self, state: &mut SharedGameState) -> GameResult { diff --git a/src/npc/ai/misc.rs b/src/game/npc/ai/misc.rs similarity index 99% rename from src/npc/ai/misc.rs rename to src/game/npc/ai/misc.rs index f1ee666..813d85b 100644 --- a/src/npc/ai/misc.rs +++ b/src/game/npc/ai/misc.rs @@ -1,16 +1,16 @@ use std::hint::unreachable_unchecked; -use crate::caret::CaretType; use crate::common::{Direction, Rect}; use crate::components::flash::Flash; use crate::framework::error::GameResult; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::{NPCLayer, NPC}; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::{GameDifficulty, SharedGameState}; -use crate::stage::Stage; +use crate::game::caret::CaretType; +use crate::game::npc::{NPC, NPCLayer}; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::player::Player; +use crate::game::shared_game_state::{GameDifficulty, SharedGameState}; +use crate::game::stage::Stage; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n000_null(&mut self) -> GameResult { @@ -624,9 +624,9 @@ impl NPC { self.action_counter += 1; if self.action_counter > 10 && (self.flags.hit_left_wall() - || self.flags.hit_right_wall() - || self.flags.hit_bottom_wall() - || self.flags.in_water()) + || self.flags.hit_right_wall() + || self.flags.hit_bottom_wall() + || self.flags.in_water()) { // hit something self.cond.set_alive(false); @@ -2180,11 +2180,11 @@ impl NPC { npc.cond.set_alive(true); npc.x = self.x + if player.equip.has_booster_2_0() { - self.rng.range(-14..14) - } else { - self.rng.range(-11..11) - } * state.tile_size.as_int() - * 0x200; + self.rng.range(-14..14) + } else { + self.rng.range(-11..11) + } * state.tile_size.as_int() + * 0x200; npc.y = player.y - 0x1C000; npc.direction = if self.rng.range(0..10) & 1 != 0 { Direction::Left } else { Direction::Right }; diff --git a/src/npc/ai/misery.rs b/src/game/npc/ai/misery.rs similarity index 99% rename from src/npc/ai/misery.rs rename to src/game/npc/ai/misery.rs index d73b35e..bf1d226 100644 --- a/src/npc/ai/misery.rs +++ b/src/game/npc/ai/misery.rs @@ -2,17 +2,17 @@ use std::hint::unreachable_unchecked; use num_traits::clamp; -use crate::caret::CaretType; -use crate::common::{Direction, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction}; use crate::components::flash::Flash; use crate::framework::error::GameResult; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::stage::Stage; +use crate::game::caret::CaretType; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n066_misery_bubble(&mut self, state: &mut SharedGameState, npc_list: &NPCList) -> GameResult { @@ -845,10 +845,10 @@ impl NPC { if let Some(parent) = self.get_parent_ref_mut(npc_list) { self.x = parent.x + self.action_counter as i32 * ((self.action_counter2 as f64 * CDEG_RAD).cos() * -512.0) as i32 - / 4; + / 4; self.y = parent.y + self.action_counter as i32 * ((self.action_counter2 as f64 * CDEG_RAD).sin() * -512.0) as i32 - / 4; + / 4; if parent.action_num == 151 { self.action_num = 10; diff --git a/src/game/npc/ai/mod.rs b/src/game/npc/ai/mod.rs new file mode 100644 index 0000000..0262065 --- /dev/null +++ b/src/game/npc/ai/mod.rs @@ -0,0 +1,28 @@ +pub(crate) mod balcony; +pub(crate) mod balrog; +pub(crate) mod booster; +pub(crate) mod chaco; +pub(crate) mod characters; +pub(crate) mod curly; +pub(crate) mod doctor; +pub(crate) mod egg_corridor; +pub(crate) mod first_cave; +pub(crate) mod grasstown; +pub(crate) mod hell; +pub(crate) mod igor; +pub(crate) mod intro; +pub(crate) mod last_cave; +pub(crate) mod maze; +pub(crate) mod mimiga_village; +pub(crate) mod misc; +pub(crate) mod misery; +pub(crate) mod outer_wall; +pub(crate) mod pickups; +pub(crate) mod plantation; +pub(crate) mod quote; +pub(crate) mod sand_zone; +pub(crate) mod santa; +pub(crate) mod sue; +pub(crate) mod toroko; +pub(crate) mod weapon_trail; +pub(crate) mod wind_fortress; diff --git a/src/npc/ai/outer_wall.rs b/src/game/npc/ai/outer_wall.rs similarity index 98% rename from src/npc/ai/outer_wall.rs rename to src/game/npc/ai/outer_wall.rs index eb7cfbd..82b0216 100644 --- a/src/npc/ai/outer_wall.rs +++ b/src/game/npc/ai/outer_wall.rs @@ -2,11 +2,11 @@ use num_traits::abs; use crate::common::Direction; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n212_sky_dragon( diff --git a/src/npc/ai/pickups.rs b/src/game/npc/ai/pickups.rs similarity index 98% rename from src/npc/ai/pickups.rs rename to src/game/npc/ai/pickups.rs index 571b627..917cefc 100644 --- a/src/npc/ai/pickups.rs +++ b/src/game/npc/ai/pickups.rs @@ -1,9 +1,9 @@ use crate::common::Direction; use crate::framework::error::GameResult; -use crate::npc::NPC; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::stage::{Stage, BackgroundType}; +use crate::game::npc::NPC; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::{BackgroundType, Stage}; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n001_experience(&mut self, state: &mut SharedGameState, stage: &mut Stage) -> GameResult { diff --git a/src/npc/ai/plantation.rs b/src/game/npc/ai/plantation.rs similarity index 99% rename from src/npc/ai/plantation.rs rename to src/game/npc/ai/plantation.rs index cb7ab47..f68e81f 100644 --- a/src/npc/ai/plantation.rs +++ b/src/game/npc/ai/plantation.rs @@ -1,11 +1,11 @@ -use crate::caret::CaretType; -use crate::common::{Direction, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction}; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::caret::CaretType; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n220_shovel_brigade(&mut self, state: &mut SharedGameState) -> GameResult { diff --git a/src/npc/ai/quote.rs b/src/game/npc/ai/quote.rs similarity index 98% rename from src/npc/ai/quote.rs rename to src/game/npc/ai/quote.rs index 43bcf36..815a396 100644 --- a/src/npc/ai/quote.rs +++ b/src/game/npc/ai/quote.rs @@ -1,11 +1,10 @@ -use crate::framework::error::GameResult; - use crate::common::Direction; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::framework::error::GameResult; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub fn tick_n111_quote_teleport_out( diff --git a/src/npc/ai/sand_zone.rs b/src/game/npc/ai/sand_zone.rs similarity index 99% rename from src/npc/ai/sand_zone.rs rename to src/game/npc/ai/sand_zone.rs index faa0e83..942c613 100644 --- a/src/npc/ai/sand_zone.rs +++ b/src/game/npc/ai/sand_zone.rs @@ -1,14 +1,14 @@ use num_traits::{abs, clamp}; -use crate::caret::CaretType; -use crate::common::{Direction, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction}; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; +use crate::game::caret::CaretType; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::bullet::BulletManager; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n044_polish(&mut self, state: &mut SharedGameState, npc_list: &NPCList) -> GameResult { diff --git a/src/npc/ai/santa.rs b/src/game/npc/ai/santa.rs similarity index 95% rename from src/npc/ai/santa.rs rename to src/game/npc/ai/santa.rs index b860e4c..1dbfca6 100644 --- a/src/npc/ai/santa.rs +++ b/src/game/npc/ai/santa.rs @@ -2,10 +2,10 @@ use num_traits::abs; use crate::common::Direction; use crate::framework::error::GameResult; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n040_santa(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { diff --git a/src/npc/ai/sue.rs b/src/game/npc/ai/sue.rs similarity index 98% rename from src/npc/ai/sue.rs rename to src/game/npc/ai/sue.rs index ad5770a..2eee2df 100644 --- a/src/npc/ai/sue.rs +++ b/src/game/npc/ai/sue.rs @@ -1,12 +1,12 @@ use crate::common::Direction; use crate::framework::error::GameResult; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::stage::Stage; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; +use crate::util::rng::RNG; impl NPC { pub fn tick_n042_sue( diff --git a/src/npc/ai/toroko.rs b/src/game/npc/ai/toroko.rs similarity index 99% rename from src/npc/ai/toroko.rs rename to src/game/npc/ai/toroko.rs index cb52d5c..86fac6f 100644 --- a/src/npc/ai/toroko.rs +++ b/src/game/npc/ai/toroko.rs @@ -1,12 +1,12 @@ -use crate::caret::CaretType; use crate::common::Direction; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; +use crate::game::caret::CaretType; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::bullet::BulletManager; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n060_toroko(&mut self, state: &mut SharedGameState, players: [&mut Player; 2]) -> GameResult { diff --git a/src/npc/ai/weapon_trail.rs b/src/game/npc/ai/weapon_trail.rs similarity index 94% rename from src/npc/ai/weapon_trail.rs rename to src/game/npc/ai/weapon_trail.rs index 46e2aa3..24b33b9 100644 --- a/src/npc/ai/weapon_trail.rs +++ b/src/game/npc/ai/weapon_trail.rs @@ -1,11 +1,10 @@ -use crate::framework::error::GameResult; - -use crate::npc::NPC; -use crate::shared_game_state::SharedGameState; use crate::common::Direction; +use crate::framework::error::GameResult; +use crate::game::npc::NPC; +use crate::game::shared_game_state::SharedGameState; impl NPC { - pub(crate) fn tick_n127_machine_gun_trail_l2(&mut self, state: &mut SharedGameState ) -> GameResult { + pub(crate) fn tick_n127_machine_gun_trail_l2(&mut self, state: &mut SharedGameState) -> GameResult { self.anim_counter += 1; if self.anim_counter > 0 { self.anim_counter = 0; @@ -30,7 +29,7 @@ impl NPC { Ok(()) } - pub(crate) fn tick_n128_machine_gun_trail_l3(&mut self, state: &mut SharedGameState ) -> GameResult { + pub(crate) fn tick_n128_machine_gun_trail_l3(&mut self, state: &mut SharedGameState) -> GameResult { self.anim_counter += 1; if self.anim_counter > 0 { self.anim_counter = 0; diff --git a/src/npc/ai/wind_fortress.rs b/src/game/npc/ai/wind_fortress.rs similarity index 99% rename from src/npc/ai/wind_fortress.rs rename to src/game/npc/ai/wind_fortress.rs index a0c4153..7965fd5 100644 --- a/src/npc/ai/wind_fortress.rs +++ b/src/game/npc/ai/wind_fortress.rs @@ -1,11 +1,11 @@ -use crate::caret::CaretType; -use crate::common::{Direction, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction}; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::caret::CaretType; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { // Gaudi from room 2 diff --git a/src/npc/boss/balfrog.rs b/src/game/npc/boss/balfrog.rs similarity index 98% rename from src/npc/boss/balfrog.rs rename to src/game/npc/boss/balfrog.rs index bc5c461..93ce7d3 100644 --- a/src/npc/boss/balfrog.rs +++ b/src/game/npc/boss/balfrog.rs @@ -1,13 +1,12 @@ +use crate::common::{CDEG_RAD, Direction, Rect}; use crate::framework::error::GameResult; - -use crate::caret::CaretType; -use crate::common::{Direction, Rect, CDEG_RAD}; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::caret::CaretType; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n108_balfrog_projectile(&mut self, state: &mut SharedGameState) -> GameResult { diff --git a/src/npc/boss/ballos.rs b/src/game/npc/boss/ballos.rs similarity index 99% rename from src/npc/boss/ballos.rs rename to src/game/npc/boss/ballos.rs index fe806b8..2775f75 100644 --- a/src/npc/boss/ballos.rs +++ b/src/game/npc/boss/ballos.rs @@ -1,14 +1,14 @@ -use crate::caret::CaretType; -use crate::common::{Direction, Rect, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction, Rect}; use crate::components::flash::Flash; use crate::framework::error::GameResult; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::stage::Stage; +use crate::game::caret::CaretType; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n331_ballos_bone_projectile(&mut self, state: &mut SharedGameState) -> GameResult { diff --git a/src/npc/boss/core.rs b/src/game/npc/boss/core.rs similarity index 98% rename from src/npc/boss/core.rs rename to src/game/npc/boss/core.rs index 9305410..2e4be32 100644 --- a/src/npc/boss/core.rs +++ b/src/game/npc/boss/core.rs @@ -1,13 +1,13 @@ -use crate::caret::CaretType; -use crate::common::{Direction, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction}; use crate::framework::error::GameResult; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::stage::Stage; +use crate::game::caret::CaretType; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n178_core_blade_projectile(&mut self, state: &mut SharedGameState) -> GameResult { @@ -93,7 +93,7 @@ impl BossNPC { let mut flag = false; // i will refactor that one day #[allow(mutable_transmutes)] - let flash_counter: &mut u16 = unsafe { std::mem::transmute(&self.parts[19].action_counter3) }; + let flash_counter: &mut u16 = unsafe { std::mem::transmute(&self.parts[19].action_counter3) }; match self.parts[0].action_num { 0 => { diff --git a/src/npc/boss/heavy_press.rs b/src/game/npc/boss/heavy_press.rs similarity index 98% rename from src/npc/boss/heavy_press.rs rename to src/game/npc/boss/heavy_press.rs index d4e4fa9..65287cf 100644 --- a/src/npc/boss/heavy_press.rs +++ b/src/game/npc/boss/heavy_press.rs @@ -1,11 +1,11 @@ use crate::common::{Direction, Rect}; use crate::framework::error::GameResult; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::stage::Stage; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n325_heavy_press_lightning( diff --git a/src/npc/boss/ironhead.rs b/src/game/npc/boss/ironhead.rs similarity index 98% rename from src/npc/boss/ironhead.rs rename to src/game/npc/boss/ironhead.rs index 89e48ef..db8bcdd 100644 --- a/src/npc/boss/ironhead.rs +++ b/src/game/npc/boss/ironhead.rs @@ -1,11 +1,11 @@ use crate::common::{Direction, Rect}; use crate::framework::error::GameResult; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n196_ironhead_wall(&mut self, state: &mut SharedGameState) -> GameResult { diff --git a/src/npc/boss/mod.rs b/src/game/npc/boss/mod.rs similarity index 92% rename from src/npc/boss/mod.rs rename to src/game/npc/boss/mod.rs index 6e62519..20f86e3 100644 --- a/src/npc/boss/mod.rs +++ b/src/game/npc/boss/mod.rs @@ -1,18 +1,18 @@ -use std::mem::{transmute, MaybeUninit}; +use std::mem::{MaybeUninit, transmute}; use std::ops::Deref; -use crate::common::{interpolate_fix9_scale, Direction}; +use crate::common::{Direction, interpolate_fix9_scale}; use crate::components::flash::Flash; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::shared_game_state::SharedGameState; -use crate::stage::Stage; -use crate::weapon::bullet::BulletManager; +use crate::game::frame::Frame; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; +use crate::game::weapon::bullet::BulletManager; pub mod balfrog; pub mod ballos; diff --git a/src/npc/boss/monster_x.rs b/src/game/npc/boss/monster_x.rs similarity index 99% rename from src/npc/boss/monster_x.rs rename to src/game/npc/boss/monster_x.rs index 6d9112c..564c869 100644 --- a/src/npc/boss/monster_x.rs +++ b/src/game/npc/boss/monster_x.rs @@ -1,15 +1,15 @@ use num_traits::{abs, clamp}; -use crate::caret::CaretType; -use crate::common::{Direction, Rect, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction, Rect}; use crate::components::flash::Flash; use crate::framework::error::GameResult; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::game::caret::CaretType; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n158_fish_missile( diff --git a/src/npc/boss/omega.rs b/src/game/npc/boss/omega.rs similarity index 98% rename from src/npc/boss/omega.rs rename to src/game/npc/boss/omega.rs index 8d21e1b..1df9175 100644 --- a/src/npc/boss/omega.rs +++ b/src/game/npc/boss/omega.rs @@ -1,14 +1,14 @@ -use crate::caret::CaretType; use crate::common::{Direction, Rect}; use crate::components::flash::Flash; use crate::framework::error::GameResult; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; +use crate::game::caret::CaretType; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::bullet::BulletManager; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n048_omega_projectiles(&mut self, state: &mut SharedGameState) -> GameResult { diff --git a/src/npc/boss/sisters.rs b/src/game/npc/boss/sisters.rs similarity index 98% rename from src/npc/boss/sisters.rs rename to src/game/npc/boss/sisters.rs index d5ac522..81c67cc 100644 --- a/src/npc/boss/sisters.rs +++ b/src/game/npc/boss/sisters.rs @@ -1,11 +1,11 @@ -use crate::common::{Direction, Rect, SliceExt, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction, Rect, SliceExt}; use crate::components::flash::Flash; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::SharedGameState; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::util::rng::RNG; impl BossNPC { pub(crate) fn tick_b06_sisters( diff --git a/src/npc/boss/undead_core.rs b/src/game/npc/boss/undead_core.rs similarity index 99% rename from src/npc/boss/undead_core.rs rename to src/game/npc/boss/undead_core.rs index fbe9328..bdd9a19 100644 --- a/src/npc/boss/undead_core.rs +++ b/src/game/npc/boss/undead_core.rs @@ -1,14 +1,15 @@ use std::hint::unreachable_unchecked; -use crate::common::{Direction, Rect, SliceExt, CDEG_RAD}; +use crate::common::{CDEG_RAD, Direction, Rect, SliceExt}; use crate::components::flash::Flash; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::stage::Stage; -use crate::{GameResult, SharedGameState}; +use crate::framework::error::GameResult; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::Stage; +use crate::util::rng::RNG; impl NPC { pub(crate) fn tick_n282_mini_undead_core_active( diff --git a/src/npc/list.rs b/src/game/npc/list.rs similarity index 99% rename from src/npc/list.rs rename to src/game/npc/list.rs index 91618e6..9c21b3d 100644 --- a/src/npc/list.rs +++ b/src/game/npc/list.rs @@ -1,9 +1,8 @@ use std::cell::{Cell, UnsafeCell}; -use std::mem::{transmute, MaybeUninit}; +use std::mem::{MaybeUninit, transmute}; use crate::framework::error::{GameError, GameResult}; - -use crate::npc::NPC; +use crate::game::npc::NPC; /// Maximum capacity of NPCList const NPC_LIST_MAX_CAP: usize = 512; diff --git a/src/npc/mod.rs b/src/game/npc/mod.rs similarity index 98% rename from src/npc/mod.rs rename to src/game/npc/mod.rs index 8cb7839..9c23c7b 100644 --- a/src/npc/mod.rs +++ b/src/game/npc/mod.rs @@ -4,26 +4,26 @@ use std::io::Cursor; use std::ops::Deref; use std::rc::Rc; -use byteorder::{ReadBytesExt, LE}; +use byteorder::{LE, ReadBytesExt}; use crate::bitfield; +use crate::common::{Condition, interpolate_fix9_scale, Rect}; use crate::common::Direction; use crate::common::Flag; -use crate::common::{interpolate_fix9_scale, Condition, Rect}; use crate::components::flash::Flash; use crate::components::number_popup::NumberPopup; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::physics::PhysicalEntity; -use crate::player::Player; -use crate::rng::Xoroshiro32PlusPlus; -use crate::shared_game_state::SharedGameState; -use crate::stage::{Stage, StageTexturePaths}; -use crate::weapon::bullet::BulletManager; +use crate::game::frame::Frame; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::physics::PhysicalEntity; +use crate::game::player::Player; +use crate::game::shared_game_state::SharedGameState; +use crate::game::stage::{Stage, StageTexturePaths}; +use crate::game::weapon::bullet::BulletManager; +use crate::util::rng::Xoroshiro32PlusPlus; pub mod ai; pub mod boss; @@ -242,12 +242,12 @@ impl GameEntity<([&mut Player; 2], &NPCList, &mut Stage, &mut BulletManager, &mu &mut BossNPC, ), ) -> GameResult { - #[allow(unused_assignments)] - let mut npc_hook_ran = false; + #[allow(unused_mut, unused_assignments)] + let mut npc_hook_ran = false; #[cfg(feature = "scripting-lua")] - { - npc_hook_ran = state.lua.try_run_npc_hook(self.id, self.npc_type); - } + { + npc_hook_ran = state.lua.try_run_npc_hook(self.id, self.npc_type); + } match self.npc_type { _ if npc_hook_ran => Ok(()), @@ -622,13 +622,7 @@ impl GameEntity<([&mut Player; 2], &NPCList, &mut Stage, &mut BulletManager, &mu 368 => self.tick_n368_gclone(state, players, npc_list), 369 => self.tick_n369_gclone_curly_clone(state, players, npc_list), 370 => self.tick_n370_second_quote(state, players, npc_list), - _ => { - #[cfg(feature = "hooks")] - { - crate::hooks::run_npc_hook(self, state, players, npc_list, stage, bullet_manager); - } - Ok(()) - } + _ => Ok(()), }?; self.popup.x = self.x; diff --git a/src/npc/utils.rs b/src/game/npc/utils.rs similarity index 95% rename from src/npc/utils.rs rename to src/game/npc/utils.rs index 2603f87..c9acf0d 100644 --- a/src/npc/utils.rs +++ b/src/game/npc/utils.rs @@ -1,16 +1,16 @@ ///! Various utility functions for NPC-related objects use num_traits::abs; -use crate::caret::CaretType; use crate::common::{Condition, Direction, Flag, Rect}; use crate::components::number_popup::NumberPopup; -use crate::map::NPCData; -use crate::npc::list::NPCList; -use crate::npc::{NPCFlag, NPCLayer, NPCTable, NPC}; -use crate::player::Player; -use crate::rng::{Xoroshiro32PlusPlus, RNG}; -use crate::shared_game_state::{SharedGameState, TileSize}; -use crate::weapon::bullet::Bullet; +use crate::game::caret::CaretType; +use crate::game::map::NPCData; +use crate::game::npc::{NPC, NPCFlag, NPCLayer, NPCTable}; +use crate::game::npc::list::NPCList; +use crate::game::player::Player; +use crate::game::shared_game_state::{SharedGameState, TileSize}; +use crate::game::weapon::bullet::Bullet; +use crate::util::rng::{RNG, Xoroshiro32PlusPlus}; const MAX_FALL_SPEED: i32 = 0x5FF; @@ -185,10 +185,10 @@ impl NPC { && (self.y - self.hit_bounds.top as i32) < (bullet.y + bullet.enemy_hit_height as i32) && (self.y + self.hit_bounds.bottom as i32) > (bullet.y - bullet.enemy_hit_height as i32)) || (self.npc_flags.invulnerable() - && (self.x - self.hit_bounds.right as i32) < (bullet.x + bullet.hit_bounds.right as i32) - && (self.x + self.hit_bounds.right as i32) > (bullet.x - bullet.hit_bounds.left as i32) - && (self.y - self.hit_bounds.top as i32) < (bullet.y + bullet.hit_bounds.bottom as i32) - && (self.y + self.hit_bounds.bottom as i32) > (bullet.y - bullet.hit_bounds.top as i32)) + && (self.x - self.hit_bounds.right as i32) < (bullet.x + bullet.hit_bounds.right as i32) + && (self.x + self.hit_bounds.right as i32) > (bullet.x - bullet.hit_bounds.left as i32) + && (self.y - self.hit_bounds.top as i32) < (bullet.y + bullet.hit_bounds.bottom as i32) + && (self.y + self.hit_bounds.bottom as i32) > (bullet.y - bullet.hit_bounds.top as i32)) } /// Creates experience drop for this NPC. diff --git a/src/physics.rs b/src/game/physics.rs similarity index 97% rename from src/physics.rs rename to src/game/physics.rs index 93993cb..0c12fb7 100644 --- a/src/physics.rs +++ b/src/game/physics.rs @@ -1,8 +1,8 @@ -use crate::caret::CaretType; use crate::common::{Condition, Direction, Flag, Rect}; -use crate::npc::list::NPCList; -use crate::shared_game_state::{SharedGameState, TileSize}; -use crate::stage::Stage; +use crate::game::caret::CaretType; +use crate::game::npc::list::NPCList; +use crate::game::shared_game_state::{SharedGameState, TileSize}; +use crate::game::stage::Stage; // -3 -2 -1 0 1 2 3 4 // +------------------------ @@ -261,7 +261,7 @@ pub trait PhysicalEntity { if self.x() < (x * 2 + 1) * half_tile_size && self.x() > (x * 2 - 1) * half_tile_size && (self.y() - self.hit_bounds().top as i32) - < (y * tile_size) - (self.x() - x * tile_size) / 2 + quarter_tile_size + < (y * tile_size) - (self.x() - x * tile_size) / 2 + quarter_tile_size && (self.y() + self.hit_bounds().bottom as i32) > (y * 2 - 1) * half_tile_size { self.set_y( @@ -302,7 +302,7 @@ pub trait PhysicalEntity { if self.x() < (x * 2 + 1) * half_tile_size && self.x() > (x * 2 - 1) * half_tile_size && (self.y() - self.hit_bounds().top as i32) - < (y * tile_size) - (self.x() - x * tile_size) / 2 - quarter_tile_size + < (y * tile_size) - (self.x() - x * tile_size) / 2 - quarter_tile_size && (self.y() + self.hit_bounds().bottom as i32) > (y * 2 - 1) * half_tile_size { self.set_y( @@ -343,7 +343,7 @@ pub trait PhysicalEntity { if self.x() < (x * 2 + 1) * half_tile_size && self.x() > (x * 2 - 1) * half_tile_size && (self.y() - self.hit_bounds().top as i32) - < (y * tile_size) + (self.x() - x * tile_size) / 2 - quarter_tile_size + < (y * tile_size) + (self.x() - x * tile_size) / 2 - quarter_tile_size && (self.y() + self.hit_bounds().bottom as i32) > (y * 2 - 1) * half_tile_size { self.set_y( @@ -384,7 +384,7 @@ pub trait PhysicalEntity { if self.x() < (x * 2 + 1) * half_tile_size && self.x() > (x * 2 - 1) * half_tile_size && (self.y() - self.hit_bounds().top as i32) - < (y * tile_size) + (self.x() - x * tile_size) / 2 + quarter_tile_size + < (y * tile_size) + (self.x() - x * tile_size) / 2 + quarter_tile_size && (self.y() + self.hit_bounds().bottom as i32) > (y * 2 - 1) * half_tile_size { self.set_y( @@ -427,7 +427,7 @@ pub trait PhysicalEntity { if self.x() < (x * 2 + 1) * half_tile_size && self.x() > (x * 2 - 1) * half_tile_size && (self.y() + self.hit_bounds().bottom as i32) - > (y * tile_size) + (self.x() - x * tile_size) / 2 - quarter_tile_size + > (y * tile_size) + (self.x() - x * tile_size) / 2 - quarter_tile_size && (self.y() - self.hit_bounds().top as i32) < (y * 2 + 1) * half_tile_size { self.set_y( @@ -460,7 +460,7 @@ pub trait PhysicalEntity { if (self.x() < (x * 2 + 1) * half_tile_size) && (self.x() > (x * 2 - 1) * half_tile_size) && (self.y() + self.hit_bounds().bottom as i32) - > (y * tile_size) + (self.x() - x * tile_size) / 2 + quarter_tile_size + > (y * tile_size) + (self.x() - x * tile_size) / 2 + quarter_tile_size && (self.y() - self.hit_bounds().top as i32) < (y * 2 + 1) * half_tile_size { self.set_y( @@ -492,7 +492,7 @@ pub trait PhysicalEntity { if (self.x() < (x * 2 + 1) * half_tile_size) && (self.x() > (x * 2 - 1) * half_tile_size) && (self.y() + self.hit_bounds().bottom as i32) - > (y * tile_size) - (self.x() - x * tile_size) / 2 + quarter_tile_size + > (y * tile_size) - (self.x() - x * tile_size) / 2 + quarter_tile_size && (self.y() - self.hit_bounds().top as i32) < (y * 2 + 1) * half_tile_size { self.set_y( @@ -524,7 +524,7 @@ pub trait PhysicalEntity { if (self.x() < (x * 2 + 1) * half_tile_size) && (self.x() > (x * 2 - 1) * half_tile_size) && (self.y() + self.hit_bounds().bottom as i32) - > (y * tile_size) - (self.x() - x * tile_size) / 2 - quarter_tile_size + > (y * tile_size) - (self.x() - x * tile_size) / 2 - quarter_tile_size && (self.y() - self.hit_bounds().top as i32) < (y * 2 + 1) * half_tile_size { self.set_y( @@ -630,7 +630,7 @@ pub trait PhysicalEntity { if self.x() < (x * 2 + 1) * half_tile_size && self.x() > (x * 2 - 1) * half_tile_size && (self.y() + self.hit_bounds().bottom as i32) - > (y * tile_size) + (self.x() - x * tile_size) - quarter_tile_size + > (y * tile_size) + (self.x() - x * tile_size) - quarter_tile_size && (self.y() - self.hit_bounds().top as i32) < (y * 2 + 1) * half_tile_size { self.set_y( @@ -661,7 +661,7 @@ pub trait PhysicalEntity { if (self.x() < (x * 2 + 1) * half_tile_size) && (self.x() > (x * 2 - 1) * half_tile_size) && (self.y() + self.hit_bounds().bottom as i32) - > (y * tile_size) - (self.x() - x * tile_size) - quarter_tile_size + > (y * tile_size) - (self.x() - x * tile_size) - quarter_tile_size && (self.y() - self.hit_bounds().top as i32) < (y * 2 + 1) * half_tile_size { self.set_y( diff --git a/src/player/mod.rs b/src/game/player/mod.rs similarity index 97% rename from src/player/mod.rs rename to src/game/player/mod.rs index 1da9862..f3953d4 100644 --- a/src/player/mod.rs +++ b/src/game/player/mod.rs @@ -3,21 +3,21 @@ use std::clone::Clone; use num_derive::FromPrimitive; use num_traits::clamp; -use crate::caret::CaretType; -use crate::common::{interpolate_fix9_scale, Condition, Direction, Equipment, Flag, Rect}; +use crate::common::{Condition, Direction, Equipment, Flag, interpolate_fix9_scale, Rect}; use crate::components::number_popup::NumberPopup; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; +use crate::game::caret::CaretType; +use crate::game::frame::Frame; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::player::skin::{PlayerAnimationState, PlayerAppearanceState, PlayerSkin}; +use crate::game::player::skin::basic::BasicPlayerSkin; +use crate::game::shared_game_state::SharedGameState; use crate::input::dummy_player_controller::DummyPlayerController; use crate::input::player_controller::PlayerController; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::skin::basic::BasicPlayerSkin; -use crate::player::skin::{PlayerAnimationState, PlayerAppearanceState, PlayerSkin}; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; +use crate::util::rng::RNG; mod player_hit; pub mod skin; @@ -402,10 +402,10 @@ impl Player { // stop interacting when moved if state.control_flags.control_enabled() && (self.controller.move_left() - || self.controller.move_right() - || self.controller.move_up() - || self.controller.jump() - || self.controller.shoot()) + || self.controller.move_right() + || self.controller.move_up() + || self.controller.jump() + || self.controller.shoot()) { self.cond.set_interacted(false); } @@ -524,8 +524,8 @@ impl Player { if (self.flags.hit_bottom_wall() && self.flags.hit_right_higher_half() && self.vel_x < 0) || (self.flags.hit_bottom_wall() && self.flags.hit_left_higher_half() && self.vel_x > 0) || (self.flags.hit_bottom_wall() - && self.flags.hit_left_lower_half() - && self.flags.hit_right_lower_half()) + && self.flags.hit_left_lower_half() + && self.flags.hit_right_lower_half()) { self.vel_y = 0x400; // 2.0fix9 } @@ -533,9 +533,9 @@ impl Player { let max_move = if self.flags.in_water() && !(self.flags.force_left() - || self.flags.force_up() - || self.flags.force_right() - || self.flags.force_down()) + || self.flags.force_up() + || self.flags.force_right() + || self.flags.force_down()) { state.constants.player.water_physics.max_move } else { diff --git a/src/player/player_hit.rs b/src/game/player/player_hit.rs similarity index 97% rename from src/player/player_hit.rs rename to src/game/player/player_hit.rs index c03b458..84df9e6 100644 --- a/src/player/player_hit.rs +++ b/src/game/player/player_hit.rs @@ -2,16 +2,16 @@ use std::borrow::Borrow; use num_traits::abs; -use crate::caret::CaretType; use crate::common::{Condition, Direction, Flag, Rect}; -use crate::inventory::Inventory; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::physics::PhysicalEntity; -use crate::player::{ControlMode, Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::WeaponType; +use crate::game::caret::CaretType; +use crate::game::inventory::Inventory; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::physics::PhysicalEntity; +use crate::game::player::{ControlMode, Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::WeaponType; impl PhysicalEntity for Player { #[inline(always)] diff --git a/src/player/player_list.rs b/src/game/player/player_list.rs similarity index 100% rename from src/player/player_list.rs rename to src/game/player/player_list.rs diff --git a/src/player/skin/basic.rs b/src/game/player/skin/basic.rs similarity index 93% rename from src/player/skin/basic.rs rename to src/game/player/skin/basic.rs index ef0d8f9..944dd94 100644 --- a/src/player/skin/basic.rs +++ b/src/game/player/skin/basic.rs @@ -4,8 +4,8 @@ use crate::common::{Color, Direction, Rect}; use crate::framework::context::Context; use crate::framework::filesystem; use crate::framework::filesystem::File; -use crate::player::skin::{PlayerAnimationState, PlayerAppearanceState, PlayerSkin}; -use crate::shared_game_state::SharedGameState; +use crate::game::player::skin::{PlayerAnimationState, PlayerAppearanceState, PlayerSkin}; +use crate::game::shared_game_state::SharedGameState; #[derive(Default, Clone, serde_derive::Deserialize)] #[serde(rename_all = "camelCase")] @@ -152,14 +152,14 @@ impl PlayerSkin for BasicPlayerSkin { let y_offset = if direction == Direction::Left { 0 } else { self.metadata.frame_size_height } + match self.appearance { - PlayerAppearanceState::Default => self.get_y_offset_by(0), - PlayerAppearanceState::MimigaMask => { - self.get_y_offset_by(self.metadata.frame_size_height.saturating_mul(2)) - } - PlayerAppearanceState::Custom(i) => { - self.get_y_offset_by((i as u16).saturating_mul(self.metadata.frame_size_height)) - } - }; + PlayerAppearanceState::Default => self.get_y_offset_by(0), + PlayerAppearanceState::MimigaMask => { + self.get_y_offset_by(self.metadata.frame_size_height.saturating_mul(2)) + } + PlayerAppearanceState::Custom(i) => { + self.get_y_offset_by((i as u16).saturating_mul(self.metadata.frame_size_height)) + } + }; Rect::new_size( frame_id.saturating_mul(self.metadata.frame_size_width), diff --git a/src/player/skin/mod.rs b/src/game/player/skin/mod.rs similarity index 98% rename from src/player/skin/mod.rs rename to src/game/player/skin/mod.rs index 9e85dfd..82b5440 100644 --- a/src/player/skin/mod.rs +++ b/src/game/player/skin/mod.rs @@ -1,6 +1,6 @@ use crate::bitfield; use crate::common::{Color, Direction, Rect}; -use crate::shared_game_state::SharedGameState; +use crate::game::shared_game_state::SharedGameState; pub mod basic; diff --git a/src/profile.rs b/src/game/profile.rs similarity index 95% rename from src/profile.rs rename to src/game/profile.rs index ae15e0d..b1c7448 100644 --- a/src/profile.rs +++ b/src/game/profile.rs @@ -1,16 +1,16 @@ use std::io; -use byteorder::{ReadBytesExt, WriteBytesExt, BE, LE}; +use byteorder::{BE, LE, ReadBytesExt, WriteBytesExt}; use num_traits::{clamp, FromPrimitive}; -use crate::common::{get_timestamp, Direction, FadeState}; +use crate::common::{Direction, FadeState, get_timestamp}; use crate::framework::context::Context; use crate::framework::error::GameError::ResourceLoadError; use crate::framework::error::GameResult; -use crate::player::ControlMode; +use crate::game::player::ControlMode; +use crate::game::shared_game_state::{GameDifficulty, SharedGameState}; +use crate::game::weapon::{WeaponLevel, WeaponType}; use crate::scene::game_scene::GameScene; -use crate::shared_game_state::{GameDifficulty, SharedGameState}; -use crate::weapon::{WeaponLevel, WeaponType}; pub struct WeaponData { pub weapon_id: u32, @@ -219,25 +219,14 @@ impl GameProfile { let mut map_flags = [0u8; 128]; for (idx, map_flag) in state.map_flags.iter().enumerate() { if let Some(out) = map_flags.get_mut(idx) { - *out = if *map_flag { 1 } else { 0 }; + *out = if map_flag { 1 } else { 0 }; } else { break; } } - let mut bidx = 0; let mut flags = [0u8; 1000]; - for bits in state.game_flags.as_raw_slice() { - let bytes = bits.to_le_bytes(); - for b in bytes { - if let Some(out) = flags.get_mut(bidx) { - *out = b; - } else { - break; - } - bidx += 1; - } - } + state.game_flags.copy_to_slice(&mut flags); let timestamp = get_timestamp(); let difficulty = state.difficulty as u8; diff --git a/src/scripting/lua/boot.lua b/src/game/scripting/lua/boot.lua similarity index 100% rename from src/scripting/lua/boot.lua rename to src/game/scripting/lua/boot.lua diff --git a/src/scripting/lua/doukutsu.d.ts b/src/game/scripting/lua/doukutsu.d.ts similarity index 99% rename from src/scripting/lua/doukutsu.d.ts rename to src/game/scripting/lua/doukutsu.d.ts index 3cc5c68..fa96f0c 100644 --- a/src/scripting/lua/doukutsu.d.ts +++ b/src/game/scripting/lua/doukutsu.d.ts @@ -93,8 +93,11 @@ declare interface NPC { rawDirection: number; hitCeiling(): boolean; + hitFloor(): boolean; + hitLeftWall(): boolean; + hitRightWall(): boolean; /** @@ -207,7 +210,7 @@ declare namespace doukutsu { * Helper property for doukutsu-rs specific APIs. */ const rs: DoukutsuRSApi; - + /** * The number of current stage, read-only. Set to -1 if in menu. */ diff --git a/src/scripting/lua/doukutsu.rs b/src/game/scripting/lua/doukutsu.rs similarity index 98% rename from src/scripting/lua/doukutsu.rs rename to src/game/scripting/lua/doukutsu.rs index 0b5cb2c..24d4f6c 100644 --- a/src/scripting/lua/doukutsu.rs +++ b/src/game/scripting/lua/doukutsu.rs @@ -1,15 +1,15 @@ use std::io::Read; +use lua_ffi::{c_int, LuaObject, State}; use lua_ffi::c_str; use lua_ffi::ffi::luaL_Reg; use lua_ffi::lua_method; -use lua_ffi::{c_int, LuaObject, State}; use crate::common::{Direction, Rect}; use crate::framework::filesystem; -use crate::rng::RNG; +use crate::game::scripting::lua::{check_status, DRS_RUNTIME_GLOBAL, LuaScriptingState}; use crate::scene::game_scene::LightingMode; -use crate::scripting::lua::{check_status, LuaScriptingState, DRS_RUNTIME_GLOBAL}; +use crate::util::rng::RNG; pub struct Doukutsu { pub ptr: *mut LuaScriptingState, @@ -344,7 +344,7 @@ impl Doukutsu { 0x203 => { // set anim rect if let (Some(l), Some(t), Some(r), Some(b)) = - (state.to_int(4), state.to_int(5), state.to_int(6), state.to_int(7)) + (state.to_int(4), state.to_int(5), state.to_int(6), state.to_int(7)) { npc.anim_rect = Rect { left: l as u16, top: t as u16, right: r as u16, bottom: b as u16 }; } else { diff --git a/src/scripting/lua/mod.rs b/src/game/scripting/lua/mod.rs similarity index 95% rename from src/scripting/lua/mod.rs rename to src/game/scripting/lua/mod.rs index ae1f29c..0b64c68 100644 --- a/src/scripting/lua/mod.rs +++ b/src/game/scripting/lua/mod.rs @@ -1,19 +1,19 @@ use std::io::Read; use std::ptr::null_mut; -use lua_ffi::lua_fn; -use lua_ffi::ffi::lua_State; -use lua_ffi::types::LuaValue; use lua_ffi::{c_int, State, ThreadStatus}; +use lua_ffi::ffi::lua_State; +use lua_ffi::lua_fn; +use lua_ffi::types::LuaValue; use crate::common::Rect; use crate::framework::context::Context; use crate::framework::error::{GameError, GameResult}; use crate::framework::filesystem; use crate::framework::filesystem::File; +use crate::game::scripting::lua::doukutsu::Doukutsu; +use crate::game::shared_game_state::SharedGameState; use crate::scene::game_scene::GameScene; -use crate::scripting::lua::doukutsu::Doukutsu; -use crate::shared_game_state::SharedGameState; mod doukutsu; mod scene; @@ -25,12 +25,12 @@ pub struct LuaScriptingState { game_scene: *mut GameScene, } -pub(in crate::scripting) static DRS_API_GLOBAL: &str = "__doukutsu_rs"; -pub(in crate::scripting) static DRS_RUNTIME_GLOBAL: &str = "__doukutsu_rs_runtime_dont_touch"; +pub(crate) static DRS_API_GLOBAL: &str = "__doukutsu_rs"; +pub(crate) static DRS_RUNTIME_GLOBAL: &str = "__doukutsu_rs_runtime_dont_touch"; static BOOT_SCRIPT: &str = include_str!("boot.lua"); -pub(in crate::scripting) fn check_status(status: ThreadStatus, state: &mut State) -> GameResult { +pub(crate) fn check_status(status: ThreadStatus, state: &mut State) -> GameResult { match status { ThreadStatus::Ok | ThreadStatus::Yield => { return Ok(()); diff --git a/src/scripting/lua/scene.rs b/src/game/scripting/lua/scene.rs similarity index 94% rename from src/scripting/lua/scene.rs rename to src/game/scripting/lua/scene.rs index c2831a6..d81add5 100644 --- a/src/scripting/lua/scene.rs +++ b/src/game/scripting/lua/scene.rs @@ -1,10 +1,10 @@ +use lua_ffi::{c_int, LuaObject, State}; use lua_ffi::c_str; use lua_ffi::ffi::luaL_Reg; use lua_ffi::lua_method; -use lua_ffi::{c_int, LuaObject, State}; +use crate::game::scripting::lua::{DRS_RUNTIME_GLOBAL, LuaScriptingState}; use crate::scene::game_scene::GameScene; -use crate::scripting::lua::{LuaScriptingState, DRS_RUNTIME_GLOBAL}; pub struct LuaGameScene { valid_reference: bool, diff --git a/src/game/scripting/lua/tsconfig.json b/src/game/scripting/lua/tsconfig.json new file mode 100644 index 0000000..9666727 --- /dev/null +++ b/src/game/scripting/lua/tsconfig.json @@ -0,0 +1,23 @@ +{ + "files": [ + "doukutsu.d.ts" + ], + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "lib": [ + "es2018" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "./", + "typeRoots": [ + "./" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + } +} diff --git a/src/scripting/mod.rs b/src/game/scripting/mod.rs similarity index 100% rename from src/scripting/mod.rs rename to src/game/scripting/mod.rs diff --git a/src/scripting/tsc/bytecode_utils.rs b/src/game/scripting/tsc/bytecode_utils.rs similarity index 91% rename from src/scripting/tsc/bytecode_utils.rs rename to src/game/scripting/tsc/bytecode_utils.rs index 01e6434..6046ea5 100644 --- a/src/scripting/tsc/bytecode_utils.rs +++ b/src/game/scripting/tsc/bytecode_utils.rs @@ -1,9 +1,9 @@ use std::io::{Cursor, Read}; -use crate::encoding::{read_cur_shift_jis, read_cur_wtf8}; use crate::framework::error::GameError::ParseError; use crate::framework::error::GameResult; -use crate::scripting::tsc::text_script::TextScriptEncoding; +use crate::game::scripting::tsc::text_script::TextScriptEncoding; +use crate::util::encoding::{read_cur_shift_jis, read_cur_wtf8}; pub fn put_varint(val: i32, out: &mut Vec) { let mut x = ((val as u32) >> 31) ^ ((val as u32) << 1); @@ -43,7 +43,7 @@ pub fn read_cur_varint(cursor: &mut Cursor<&[u8]>) -> GameResult { } #[allow(unused)] -pub fn read_varint>(iter: &mut I) -> GameResult { +pub fn read_varint>(iter: &mut I) -> GameResult { let mut result = 0u32; for o in 0..5 { diff --git a/src/scripting/tsc/compiler.rs b/src/game/scripting/tsc/compiler.rs similarity index 96% rename from src/scripting/tsc/compiler.rs rename to src/game/scripting/tsc/compiler.rs index c598eb3..6645482 100644 --- a/src/scripting/tsc/compiler.rs +++ b/src/game/scripting/tsc/compiler.rs @@ -6,11 +6,11 @@ use itertools::Itertools; use crate::framework::error::GameError::ParseError; use crate::framework::error::GameResult; -use crate::scripting::tsc::bytecode_utils::{put_string, put_varint}; -use crate::scripting::tsc::credit_script::CreditScript; -use crate::scripting::tsc::opcodes::{CreditOpCode, TSCOpCode}; -use crate::scripting::tsc::parse_utils::{expect_char, read_number, skip_until}; -use crate::scripting::tsc::text_script::{TextScript, TextScriptEncoding}; +use crate::game::scripting::tsc::bytecode_utils::{put_string, put_varint}; +use crate::game::scripting::tsc::credit_script::CreditScript; +use crate::game::scripting::tsc::opcodes::{CreditOpCode, TSCOpCode}; +use crate::game::scripting::tsc::parse_utils::{expect_char, read_number, skip_until}; +use crate::game::scripting::tsc::text_script::{TextScript, TextScriptEncoding}; impl TextScript { /// Compiles a decrypted text script data into internal bytecode. @@ -67,7 +67,7 @@ impl TextScript { Ok(TextScript { event_map }) } - fn compile_event>( + fn compile_event>( iter: &mut Peekable, strict: bool, encoding: TextScriptEncoding, @@ -131,7 +131,7 @@ impl TextScript { Ok(bytecode) } - fn compile_code>( + fn compile_code>( code: &str, strict: bool, iter: &mut Peekable, diff --git a/src/scripting/tsc/credit_script.rs b/src/game/scripting/tsc/credit_script.rs similarity index 96% rename from src/scripting/tsc/credit_script.rs rename to src/game/scripting/tsc/credit_script.rs index 85dd193..a3ae494 100644 --- a/src/scripting/tsc/credit_script.rs +++ b/src/game/scripting/tsc/credit_script.rs @@ -7,14 +7,14 @@ use num_traits::FromPrimitive; use crate::engine_constants::EngineConstants; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::scripting::tsc::bytecode_utils::{put_varint, read_cur_varint}; -use crate::scripting::tsc::encryption::decrypt_tsc; -use crate::scripting::tsc::opcodes::CreditOpCode; -use crate::shared_game_state::SharedGameState; +use crate::game::scripting::tsc::bytecode_utils::{put_varint, read_cur_varint}; +use crate::game::scripting::tsc::encryption::decrypt_tsc; +use crate::game::scripting::tsc::opcodes::CreditOpCode; +use crate::game::shared_game_state::SharedGameState; pub struct CreditScript { - pub(in crate::scripting::tsc) labels: HashMap, - pub(in crate::scripting::tsc) bytecode: Vec, + pub(crate) labels: HashMap, + pub(crate) bytecode: Vec, } impl Default for CreditScript { diff --git a/src/scripting/tsc/decompiler.rs b/src/game/scripting/tsc/decompiler.rs similarity index 97% rename from src/scripting/tsc/decompiler.rs rename to src/game/scripting/tsc/decompiler.rs index 853871f..5588d58 100644 --- a/src/scripting/tsc/decompiler.rs +++ b/src/game/scripting/tsc/decompiler.rs @@ -5,9 +5,9 @@ use num_traits::FromPrimitive; use crate::framework::error::GameError::InvalidValue; use crate::framework::error::GameResult; -use crate::scripting::tsc::bytecode_utils::read_cur_varint; -use crate::scripting::tsc::opcodes::TSCOpCode; -use crate::scripting::tsc::text_script::TextScript; +use crate::game::scripting::tsc::bytecode_utils::read_cur_varint; +use crate::game::scripting::tsc::opcodes::TSCOpCode; +use crate::game::scripting::tsc::text_script::TextScript; impl TextScript { pub fn decompile_event(&self, id: u16) -> GameResult { diff --git a/src/scripting/tsc/encryption.rs b/src/game/scripting/tsc/encryption.rs similarity index 100% rename from src/scripting/tsc/encryption.rs rename to src/game/scripting/tsc/encryption.rs diff --git a/src/scripting/tsc/mod.rs b/src/game/scripting/tsc/mod.rs similarity index 100% rename from src/scripting/tsc/mod.rs rename to src/game/scripting/tsc/mod.rs diff --git a/src/scripting/tsc/opcodes.rs b/src/game/scripting/tsc/opcodes.rs similarity index 100% rename from src/scripting/tsc/opcodes.rs rename to src/game/scripting/tsc/opcodes.rs diff --git a/src/scripting/tsc/parse_utils.rs b/src/game/scripting/tsc/parse_utils.rs similarity index 81% rename from src/scripting/tsc/parse_utils.rs rename to src/game/scripting/tsc/parse_utils.rs index d4e17aa..0b14a69 100644 --- a/src/scripting/tsc/parse_utils.rs +++ b/src/game/scripting/tsc/parse_utils.rs @@ -3,7 +3,7 @@ use std::iter::Peekable; use crate::framework::error::GameError::ParseError; use crate::framework::error::GameResult; -pub fn expect_char>(expect: u8, iter: &mut I) -> GameResult { +pub fn expect_char>(expect: u8, iter: &mut I) -> GameResult { let res = iter.next(); match res { @@ -13,7 +13,7 @@ pub fn expect_char>(expect: u8, iter: &mut I) -> GameResu } } -pub fn skip_until>(expect: u8, iter: &mut Peekable) -> GameResult { +pub fn skip_until>(expect: u8, iter: &mut Peekable) -> GameResult { while let Some(&chr) = iter.peek() { if chr == expect { return Ok(()); @@ -27,7 +27,7 @@ pub fn skip_until>(expect: u8, iter: &mut Peekable) -> /// Reads a 4 digit TSC formatted number from iterator. /// Intentionally does no '0'..'9' range checking, since it was often exploited by modders. -pub fn read_number>(iter: &mut Peekable) -> GameResult { +pub fn read_number>(iter: &mut Peekable) -> GameResult { Some(0) .and_then(|result| iter.next().map(|v| result + 1000 * v.wrapping_sub(b'0') as i32)) .and_then(|result| iter.next().map(|v| result + 100 * v.wrapping_sub(b'0') as i32)) diff --git a/src/scripting/tsc/text_script.rs b/src/game/scripting/tsc/text_script.rs similarity index 98% rename from src/scripting/tsc/text_script.rs rename to src/game/scripting/tsc/text_script.rs index 2009dc1..0dfe212 100644 --- a/src/scripting/tsc/text_script.rs +++ b/src/game/scripting/tsc/text_script.rs @@ -11,23 +11,23 @@ use std::rc::Rc; use num_traits::{clamp, FromPrimitive}; use crate::bitfield; -use crate::common::Direction::{Left, Right}; use crate::common::{Direction, FadeDirection, FadeState, Rect}; +use crate::common::Direction::{Left, Right}; use crate::engine_constants::EngineConstants; use crate::entity::GameEntity; -use crate::frame::UpdateTarget; use crate::framework::context::Context; use crate::framework::error::GameResult; +use crate::game::frame::UpdateTarget; +use crate::game::npc::NPC; +use crate::game::player::{ControlMode, TargetPlayer}; +use crate::game::scripting::tsc::bytecode_utils::read_cur_varint; +use crate::game::scripting::tsc::encryption::decrypt_tsc; +use crate::game::scripting::tsc::opcodes::TSCOpCode; +use crate::game::shared_game_state::ReplayState; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::WeaponType; use crate::input::touch_controls::TouchControlType; -use crate::npc::NPC; -use crate::player::{ControlMode, TargetPlayer}; use crate::scene::game_scene::GameScene; -use crate::scripting::tsc::bytecode_utils::read_cur_varint; -use crate::scripting::tsc::encryption::decrypt_tsc; -use crate::scripting::tsc::opcodes::TSCOpCode; -use crate::shared_game_state::ReplayState; -use crate::shared_game_state::SharedGameState; -use crate::weapon::WeaponType; const TSC_SUBSTITUTION_MAP_SIZE: usize = 1; @@ -414,9 +414,9 @@ impl TextScriptVM { 0 } else if remaining != 2 && (game_scene.player1.controller.jump() - || game_scene.player1.controller.shoot() - || game_scene.player2.controller.jump() - || game_scene.player2.controller.shoot()) + || game_scene.player1.controller.shoot() + || game_scene.player2.controller.jump() + || game_scene.player2.controller.shoot()) { state.constants.textscript.text_speed_fast } else { @@ -640,7 +640,7 @@ impl TextScriptVM { cursor.seek(SeekFrom::Start(ip as u64))?; let op: TSCOpCode = if let Some(op) = - FromPrimitive::from_i32(read_cur_varint(&mut cursor).unwrap_or_else(|_| TSCOpCode::END as i32)) + FromPrimitive::from_i32(read_cur_varint(&mut cursor).unwrap_or_else(|_| TSCOpCode::END as i32)) { op } else { @@ -700,7 +700,7 @@ impl TextScriptVM { state.textscript_vm.set_mode(ScriptMode::StageSelect); let event_num = if let Some(slot) = - state.teleporter_slots.get(game_scene.stage_select.current_teleport_slot as usize) + state.teleporter_slots.get(game_scene.stage_select.current_teleport_slot as usize) { 1000 + slot.0 } else { @@ -1814,7 +1814,7 @@ impl TextScriptVM { } pub struct TextScript { - pub(in crate::scripting::tsc) event_map: HashMap>, + pub(crate) event_map: HashMap>, } impl Clone for TextScript { diff --git a/src/settings.rs b/src/game/settings.rs similarity index 99% rename from src/settings.rs rename to src/game/settings.rs index 2c5017c..ca9a55b 100644 --- a/src/settings.rs +++ b/src/game/settings.rs @@ -2,15 +2,15 @@ use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::filesystem::{user_create, user_open}; use crate::framework::gamepad::{Axis, AxisDirection, Button, PlayerControllerInputType}; +use crate::framework::graphics::VSyncMode; use crate::framework::keyboard::ScanCode; -use crate::graphics::VSyncMode; +use crate::game::player::TargetPlayer; +use crate::game::shared_game_state::{CutsceneSkipMode, ScreenShakeIntensity, TimingMode, WindowMode}; use crate::input::combined_player_controller::CombinedPlayerController; use crate::input::gamepad_player_controller::GamepadController; use crate::input::keyboard_player_controller::KeyboardController; use crate::input::player_controller::PlayerController; use crate::input::touch_player_controller::TouchPlayerController; -use crate::player::TargetPlayer; -use crate::shared_game_state::{CutsceneSkipMode, ScreenShakeIntensity, TimingMode, WindowMode}; use crate::sound::InterpolationMode; #[derive(serde::Serialize, serde::Deserialize)] diff --git a/src/shared_game_state.rs b/src/game/shared_game_state.rs similarity index 95% rename from src/shared_game_state.rs rename to src/game/shared_game_state.rs index 93d6f66..c8bfc08 100644 --- a/src/shared_game_state.rs +++ b/src/game/shared_game_state.rs @@ -1,40 +1,38 @@ use std::{cmp, ops::Div}; -use bitvec::vec::BitVec; use chrono::{Datelike, Local}; -use crate::bmfont_renderer::BMFontRenderer; -use crate::caret::{Caret, CaretType}; use crate::common::{ControlFlags, Direction, FadeState}; -use crate::components::draw_common::{draw_number, Alignment}; +use crate::components::draw_common::{Alignment, draw_number}; +use crate::data::vanilla::VanillaExtractor; use crate::engine_constants::EngineConstants; +use crate::framework::{filesystem, graphics}; use crate::framework::backend::BackendTexture; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::graphics::{create_texture_mutable, set_render_target}; use crate::framework::vfs::OpenOptions; -use crate::framework::{filesystem, graphics}; -#[cfg(feature = "hooks")] -use crate::hooks::init_hooks; +use crate::game::caret::{Caret, CaretType}; +use crate::game::npc::NPCTable; +use crate::game::profile::GameProfile; +#[cfg(feature = "scripting-lua")] +use crate::game::scripting::lua::LuaScriptingState; +use crate::game::scripting::tsc::credit_script::{CreditScript, CreditScriptVM}; +use crate::game::scripting::tsc::text_script::{ScriptMode, TextScript, TextScriptExecutionState, TextScriptVM}; +use crate::game::settings::Settings; +use crate::game::stage::StageData; +use crate::graphics::bmfont_renderer::BMFontRenderer; +use crate::graphics::texture_set::TextureSet; use crate::i18n::Locale; use crate::input::touch_controls::TouchControls; use crate::mod_list::ModList; use crate::mod_requirements::ModRequirements; -use crate::npc::NPCTable; -use crate::profile::GameProfile; -use crate::rng::XorShift; use crate::scene::game_scene::GameScene; -use crate::scene::title_scene::TitleScene; use crate::scene::Scene; -#[cfg(feature = "scripting-lua")] -use crate::scripting::lua::LuaScriptingState; -use crate::scripting::tsc::credit_script::{CreditScript, CreditScriptVM}; -use crate::scripting::tsc::text_script::{ScriptMode, TextScript, TextScriptExecutionState, TextScriptVM}; -use crate::settings::Settings; +use crate::scene::title_scene::TitleScene; use crate::sound::SoundManager; -use crate::stage::StageData; -use crate::texture_set::TextureSet; -use crate::vanilla::VanillaExtractor; +use crate::util::bitvec::BitVec; +use crate::util::rng::XorShift; #[derive(PartialEq, Eq, Copy, Clone, serde::Serialize, serde::Deserialize)] pub enum TimingMode { @@ -315,7 +313,7 @@ impl SharedGameState { pub fn new(ctx: &mut Context) -> GameResult { let mut constants = EngineConstants::defaults(); let mut sound_manager = SoundManager::new(ctx)?; - let mut settings = Settings::load(ctx)?; + let settings = Settings::load(ctx)?; let mod_requirements = ModRequirements::load(ctx)?; let vanilla_ext_exe = match option_env!("VANILLA_EXT_EXE") { @@ -409,17 +407,13 @@ impl SharedGameState { let current_time = Local::now(); let more_rust = (current_time.month() == 7 && current_time.day() == 7) || settings.more_rust; - - #[cfg(feature = "hooks")] - init_hooks(); - let seed = chrono::Local::now().timestamp() as i32; Ok(SharedGameState { control_flags: ControlFlags(0), - game_flags: bitvec::bitvec![0; 8000], - skip_flags: bitvec::bitvec![0; 64], - map_flags: bitvec::bitvec![0; 64], + game_flags: BitVec::with_size(8000), + skip_flags: BitVec::with_size(64), + map_flags: BitVec::with_size(128), fade_state: FadeState::Hidden, game_rng: XorShift::new(seed), effect_rng: XorShift::new(123), @@ -545,7 +539,7 @@ impl SharedGameState { pub fn start_new_game(&mut self, ctx: &mut Context) -> GameResult { self.reset(); #[cfg(feature = "scripting-lua")] - self.lua.reload_scripts(ctx)?; + self.lua.reload_scripts(ctx)?; let mut next_scene = GameScene::new(self, ctx, self.constants.game.new_game_stage as usize)?; next_scene.player1.cond.set_alive(true); @@ -567,7 +561,7 @@ impl SharedGameState { pub fn start_intro(&mut self, ctx: &mut Context) -> GameResult { #[cfg(feature = "scripting-lua")] - self.lua.reload_scripts(ctx)?; + self.lua.reload_scripts(ctx)?; let start_stage_id = self.constants.game.intro_stage as usize; @@ -619,7 +613,7 @@ impl SharedGameState { profile.apply(self, &mut next_scene, ctx); #[cfg(feature = "scripting-lua")] - self.lua.reload_scripts(ctx)?; + self.lua.reload_scripts(ctx)?; self.next_scene = Some(Box::new(next_scene)); return Ok(()); @@ -640,7 +634,7 @@ impl SharedGameState { pub fn reset(&mut self) { self.control_flags.0 = 0; - self.game_flags = bitvec::bitvec![0; 8000]; + self.game_flags = BitVec::with_size(8000); self.fade_state = FadeState::Hidden; self.game_rng = XorShift::new(chrono::Local::now().timestamp() as i32); self.teleporter_slots.clear(); @@ -709,14 +703,14 @@ impl SharedGameState { pub fn get_flag(&self, id: usize) -> bool { if let Some(flag) = self.game_flags.get(id) { - *flag + flag } else { false } } pub fn reset_skip_flags(&mut self) { - self.skip_flags = bitvec::bitvec![0; 64]; + self.skip_flags = BitVec::with_size(64); } pub fn set_skip_flag(&mut self, id: usize, value: bool) { @@ -729,14 +723,14 @@ impl SharedGameState { pub fn get_skip_flag(&self, id: usize) -> bool { if let Some(flag) = self.skip_flags.get(id) { - *flag + flag } else { false } } pub fn reset_map_flags(&mut self) { - self.map_flags = bitvec::bitvec![0; 128]; + self.map_flags = BitVec::with_size(128); } pub fn set_map_flag(&mut self, id: usize, value: bool) { @@ -749,7 +743,7 @@ impl SharedGameState { pub fn get_map_flag(&self, id: usize) -> bool { if let Some(flag) = self.map_flags.get(id) { - *flag + flag } else { false } diff --git a/src/stage.rs b/src/game/stage.rs similarity index 99% rename from src/stage.rs rename to src/game/stage.rs index 77d41d6..3c30845 100644 --- a/src/stage.rs +++ b/src/game/stage.rs @@ -1,20 +1,19 @@ use std::io::{Cursor, Read}; use std::str::from_utf8; -use byteorder::ReadBytesExt; use byteorder::LE; +use byteorder::ReadBytesExt; use log::info; use crate::common::Color; -use crate::encoding::read_cur_shift_jis; use crate::engine_constants::EngineConstants; use crate::framework::context::Context; +use crate::framework::error::{GameError, GameResult}; use crate::framework::error::GameError::ResourceLoadError; -use crate::framework::error::GameResult; use crate::framework::filesystem; -use crate::map::{Map, NPCData}; -use crate::scripting::tsc::text_script::TextScript; -use crate::GameError; +use crate::game::map::{Map, NPCData}; +use crate::game::scripting::tsc::text_script::TextScript; +use crate::util::encoding::read_cur_shift_jis; #[derive(Debug, PartialEq, Eq, Hash)] pub struct NpcType { diff --git a/src/weapon/blade.rs b/src/game/weapon/blade.rs similarity index 83% rename from src/weapon/blade.rs rename to src/game/weapon/blade.rs index 17a86ea..f702f08 100644 --- a/src/weapon/blade.rs +++ b/src/game/weapon/blade.rs @@ -1,11 +1,11 @@ use crate::common::Direction; -use crate::player::{Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; -use crate::weapon::{Weapon, WeaponLevel}; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::{Weapon, WeaponLevel}; +use crate::game::weapon::bullet::BulletManager; impl Weapon { - pub(in crate::weapon) fn tick_blade(&mut self, player: &Player, player_id: TargetPlayer, bullet_manager: &mut BulletManager, state: &mut SharedGameState) { + pub(crate) fn tick_blade(&mut self, player: &Player, player_id: TargetPlayer, bullet_manager: &mut BulletManager, state: &mut SharedGameState) { const BULLETS: [u16; 3] = [25, 26, 27]; if !player.controller.trigger_shoot() || bullet_manager.count_bullets_multi(&BULLETS, player_id) > 0 { diff --git a/src/weapon/bubbler.rs b/src/game/weapon/bubbler.rs similarity index 96% rename from src/weapon/bubbler.rs rename to src/game/weapon/bubbler.rs index 8d4f061..7779439 100644 --- a/src/weapon/bubbler.rs +++ b/src/game/weapon/bubbler.rs @@ -1,12 +1,12 @@ -use crate::caret::CaretType; use crate::common::Direction; -use crate::player::{Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; -use crate::weapon::{Weapon, WeaponLevel}; +use crate::game::caret::CaretType; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::{Weapon, WeaponLevel}; +use crate::game::weapon::bullet::BulletManager; impl Weapon { - pub(in crate::weapon) fn tick_bubbler( + pub(crate) fn tick_bubbler( &mut self, player: &Player, player_id: TargetPlayer, diff --git a/src/weapon/bullet.rs b/src/game/weapon/bullet.rs similarity index 99% rename from src/weapon/bullet.rs rename to src/game/weapon/bullet.rs index 99d963a..38637ce 100644 --- a/src/weapon/bullet.rs +++ b/src/game/weapon/bullet.rs @@ -1,15 +1,15 @@ use num_traits::clamp; -use crate::caret::CaretType; use crate::common::{BulletFlag, Condition, Direction, Flag, Rect}; use crate::engine_constants::{BulletData, EngineConstants}; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::physics::{PhysicalEntity, OFFSETS}; -use crate::player::{Player, TargetPlayer}; -use crate::rng::{XorShift, Xoroshiro32PlusPlus, RNG}; -use crate::shared_game_state::{SharedGameState, TileSize}; -use crate::stage::Stage; +use crate::game::caret::CaretType; +use crate::game::npc::list::NPCList; +use crate::game::npc::NPC; +use crate::game::physics::{OFFSETS, PhysicalEntity}; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::{SharedGameState, TileSize}; +use crate::game::stage::Stage; +use crate::util::rng::{RNG, Xoroshiro32PlusPlus, XorShift}; pub struct BulletManager { pub bullets: Vec, @@ -1964,7 +1964,7 @@ impl PhysicalEntity for Bullet { } if let Some(tile) = - stage.map.tiles.get_mut(stage.map.width as usize * (y + oy) as usize + (x + ox) as usize) + stage.map.tiles.get_mut(stage.map.width as usize * (y + oy) as usize + (x + ox) as usize) { *tile = tile.wrapping_sub(1); } diff --git a/src/weapon/fireball.rs b/src/game/weapon/fireball.rs similarity index 90% rename from src/weapon/fireball.rs rename to src/game/weapon/fireball.rs index e5626f4..0682cd2 100644 --- a/src/weapon/fireball.rs +++ b/src/game/weapon/fireball.rs @@ -1,12 +1,12 @@ -use crate::caret::CaretType; use crate::common::Direction; -use crate::player::{Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; -use crate::weapon::{Weapon, WeaponLevel}; +use crate::game::caret::CaretType; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::{Weapon, WeaponLevel}; +use crate::game::weapon::bullet::BulletManager; impl Weapon { - pub(in crate::weapon) fn tick_fireball( + pub(crate) fn tick_fireball( &mut self, player: &Player, player_id: TargetPlayer, diff --git a/src/weapon/machine_gun.rs b/src/game/weapon/machine_gun.rs similarity index 95% rename from src/weapon/machine_gun.rs rename to src/game/weapon/machine_gun.rs index 49f679e..8a42c5e 100644 --- a/src/weapon/machine_gun.rs +++ b/src/game/weapon/machine_gun.rs @@ -1,12 +1,12 @@ -use crate::caret::CaretType; use crate::common::Direction; -use crate::player::{Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; -use crate::weapon::{Weapon, WeaponLevel}; +use crate::game::caret::CaretType; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::{Weapon, WeaponLevel}; +use crate::game::weapon::bullet::BulletManager; impl Weapon { - pub(in crate::weapon) fn tick_machine_gun( + pub(crate) fn tick_machine_gun( &mut self, player: &mut Player, player_id: TargetPlayer, diff --git a/src/weapon/missile_launcher.rs b/src/game/weapon/missile_launcher.rs similarity index 96% rename from src/weapon/missile_launcher.rs rename to src/game/weapon/missile_launcher.rs index 48b0c8d..d896498 100644 --- a/src/weapon/missile_launcher.rs +++ b/src/game/weapon/missile_launcher.rs @@ -1,12 +1,12 @@ -use crate::caret::CaretType; use crate::common::Direction; -use crate::player::{Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::{Bullet, BulletManager}; -use crate::weapon::{Weapon, WeaponLevel}; +use crate::game::caret::CaretType; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::{Weapon, WeaponLevel}; +use crate::game::weapon::bullet::{Bullet, BulletManager}; impl Weapon { - pub(in crate::weapon) fn tick_missile_launcher( + pub(crate) fn tick_missile_launcher( &mut self, player: &mut Player, player_id: TargetPlayer, diff --git a/src/weapon/mod.rs b/src/game/weapon/mod.rs similarity index 97% rename from src/weapon/mod.rs rename to src/game/weapon/mod.rs index fdc5afb..d49a43c 100644 --- a/src/weapon/mod.rs +++ b/src/game/weapon/mod.rs @@ -1,11 +1,11 @@ use num_derive::FromPrimitive; -use crate::caret::CaretType; use crate::common::Direction; use crate::engine_constants::EngineConstants; -use crate::player::{Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; +use crate::game::caret::CaretType; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::bullet::BulletManager; mod blade; mod bubbler; diff --git a/src/weapon/nemesis.rs b/src/game/weapon/nemesis.rs similarity index 92% rename from src/weapon/nemesis.rs rename to src/game/weapon/nemesis.rs index 85f824c..af24b4b 100644 --- a/src/weapon/nemesis.rs +++ b/src/game/weapon/nemesis.rs @@ -1,12 +1,12 @@ -use crate::caret::CaretType; use crate::common::Direction; -use crate::player::{Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; -use crate::weapon::{Weapon, WeaponLevel}; +use crate::game::caret::CaretType; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::{Weapon, WeaponLevel}; +use crate::game::weapon::bullet::BulletManager; impl Weapon { - pub(in crate::weapon) fn tick_nemesis( + pub(crate) fn tick_nemesis( &mut self, player: &Player, player_id: TargetPlayer, diff --git a/src/weapon/polar_star.rs b/src/game/weapon/polar_star.rs similarity index 92% rename from src/weapon/polar_star.rs rename to src/game/weapon/polar_star.rs index 296a309..ddba997 100644 --- a/src/weapon/polar_star.rs +++ b/src/game/weapon/polar_star.rs @@ -1,12 +1,12 @@ -use crate::caret::CaretType; use crate::common::Direction; -use crate::player::{Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; -use crate::weapon::{Weapon, WeaponLevel}; +use crate::game::caret::CaretType; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::{Weapon, WeaponLevel}; +use crate::game::weapon::bullet::BulletManager; impl Weapon { - pub(in crate::weapon) fn tick_polar_star( + pub(crate) fn tick_polar_star( &mut self, player: &Player, player_id: TargetPlayer, diff --git a/src/weapon/snake.rs b/src/game/weapon/snake.rs similarity index 88% rename from src/weapon/snake.rs rename to src/game/weapon/snake.rs index f9396fb..3363ff4 100644 --- a/src/weapon/snake.rs +++ b/src/game/weapon/snake.rs @@ -1,12 +1,12 @@ -use crate::caret::CaretType; use crate::common::Direction; -use crate::player::{Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::{Bullet, BulletManager}; -use crate::weapon::{Weapon, WeaponLevel}; +use crate::game::caret::CaretType; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::{Weapon, WeaponLevel}; +use crate::game::weapon::bullet::{Bullet, BulletManager}; impl Weapon { - pub(in crate::weapon) fn tick_snake(&mut self, player: &Player, player_id: TargetPlayer, bullet_manager: &mut BulletManager, state: &mut SharedGameState) { + pub(crate) fn tick_snake(&mut self, player: &Player, player_id: TargetPlayer, bullet_manager: &mut BulletManager, state: &mut SharedGameState) { if !player.controller.trigger_shoot() || bullet_manager.count_bullets_multi(&[1, 2, 3], player_id) > 3 { return; } diff --git a/src/weapon/spur.rs b/src/game/weapon/spur.rs similarity index 95% rename from src/weapon/spur.rs rename to src/game/weapon/spur.rs index 309030d..e571ce4 100644 --- a/src/weapon/spur.rs +++ b/src/game/weapon/spur.rs @@ -1,12 +1,12 @@ -use crate::caret::CaretType; use crate::common::Direction; -use crate::player::{Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::BulletManager; -use crate::weapon::{Weapon, WeaponLevel}; +use crate::game::caret::CaretType; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::{Weapon, WeaponLevel}; +use crate::game::weapon::bullet::BulletManager; impl Weapon { - pub(in crate::weapon) fn tick_spur( + pub(crate) fn tick_spur( &mut self, player: &mut Player, player_id: TargetPlayer, diff --git a/src/weapon/super_missile_launcher.rs b/src/game/weapon/super_missile_launcher.rs similarity index 95% rename from src/weapon/super_missile_launcher.rs rename to src/game/weapon/super_missile_launcher.rs index 4293662..78705b9 100644 --- a/src/weapon/super_missile_launcher.rs +++ b/src/game/weapon/super_missile_launcher.rs @@ -1,12 +1,12 @@ -use crate::caret::CaretType; use crate::common::Direction; -use crate::player::{Player, TargetPlayer}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::bullet::{Bullet, BulletManager}; -use crate::weapon::{Weapon, WeaponLevel}; +use crate::game::caret::CaretType; +use crate::game::player::{Player, TargetPlayer}; +use crate::game::shared_game_state::SharedGameState; +use crate::game::weapon::{Weapon, WeaponLevel}; +use crate::game::weapon::bullet::{Bullet, BulletManager}; impl Weapon { - pub(in crate::weapon) fn tick_super_missile_launcher( + pub(crate) fn tick_super_missile_launcher( &mut self, player: &mut Player, player_id: TargetPlayer, diff --git a/src/bmfont.rs b/src/graphics/bmfont.rs similarity index 98% rename from src/bmfont.rs rename to src/graphics/bmfont.rs index e19a18d..1063c4c 100644 --- a/src/bmfont.rs +++ b/src/graphics/bmfont.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use std::io; -use byteorder::{ReadBytesExt, LE}; +use byteorder::{LE, ReadBytesExt}; use crate::framework::error::GameError::ResourceLoadError; use crate::framework::error::GameResult; diff --git a/src/bmfont_renderer.rs b/src/graphics/bmfont_renderer.rs similarity index 93% rename from src/bmfont_renderer.rs rename to src/graphics/bmfont_renderer.rs index 8f04ab9..25744a5 100644 --- a/src/bmfont_renderer.rs +++ b/src/graphics/bmfont_renderer.rs @@ -1,14 +1,14 @@ use std::collections::HashSet; use std::path::PathBuf; -use crate::bmfont::BMFont; -use crate::common::{Rect, FILE_TYPES}; +use crate::common::{FILE_TYPES, Rect}; use crate::engine_constants::EngineConstants; use crate::framework::context::Context; use crate::framework::error::GameError::ResourceLoadError; use crate::framework::error::GameResult; use crate::framework::filesystem; -use crate::texture_set::TextureSet; +use crate::graphics::bmfont::BMFont; +use crate::graphics::texture_set::TextureSet; pub struct BMFontRenderer { font: BMFont, @@ -50,7 +50,7 @@ impl BMFontRenderer { self.font.line_height as f32 * constants.font_scale } - pub fn text_width>(&self, iter: I, constants: &EngineConstants) -> f32 { + pub fn text_width>(&self, iter: I, constants: &EngineConstants) -> f32 { let mut offset_x = 0.0; for chr in iter { @@ -62,7 +62,7 @@ impl BMFontRenderer { offset_x } - pub fn text_width_with_rects + Clone>( + pub fn text_width_with_rects + Clone>( &self, iter: I, rect_map: &[(char, Rect)], @@ -83,7 +83,7 @@ impl BMFontRenderer { width } - pub fn draw_text>( + pub fn draw_text>( &self, iter: I, x: f32, @@ -95,7 +95,7 @@ impl BMFontRenderer { self.draw_colored_text(iter, x, y, (255, 255, 255, 255), constants, texture_set, ctx) } - pub fn draw_text_with_rects>( + pub fn draw_text_with_rects>( &self, iter: I, x: f32, @@ -119,7 +119,7 @@ impl BMFontRenderer { ) } - pub fn draw_text_with_shadow + Clone>( + pub fn draw_text_with_shadow + Clone>( &self, iter: I, x: f32, @@ -132,7 +132,7 @@ impl BMFontRenderer { self.draw_colored_text(iter, x, y, (255, 255, 255, 255), constants, texture_set, ctx) } - pub fn draw_text_with_shadow_and_rects + Clone>( + pub fn draw_text_with_shadow_and_rects + Clone>( &self, iter: I, x: f32, @@ -167,7 +167,7 @@ impl BMFontRenderer { ) } - pub fn draw_colored_text_with_shadow_scaled + Clone>( + pub fn draw_colored_text_with_shadow_scaled + Clone>( &self, iter: I, x: f32, @@ -191,7 +191,7 @@ impl BMFontRenderer { self.draw_colored_text_scaled(iter, x, y, scale, color, constants, texture_set, ctx) } - pub fn draw_colored_text_with_shadow_and_rects_scaled + Clone>( + pub fn draw_colored_text_with_shadow_and_rects_scaled + Clone>( &self, iter: I, x: f32, @@ -230,7 +230,7 @@ impl BMFontRenderer { ) } - pub fn draw_colored_text_scaled>( + pub fn draw_colored_text_scaled>( &self, iter: I, x: f32, @@ -244,7 +244,7 @@ impl BMFontRenderer { self.draw_colored_text_with_rects_scaled(iter, x, y, scale, color, constants, texture_set, &[], None, ctx) } - pub fn draw_colored_text_with_rects_scaled>( + pub fn draw_colored_text_with_rects_scaled>( &self, iter: I, x: f32, @@ -361,7 +361,7 @@ impl BMFontRenderer { Ok(()) } - pub fn draw_colored_text>( + pub fn draw_colored_text>( &self, iter: I, x: f32, @@ -374,7 +374,7 @@ impl BMFontRenderer { self.draw_colored_text_scaled(iter, x, y, 1.0, color, constants, texture_set, ctx) } - pub fn draw_colored_text_with_rects>( + pub fn draw_colored_text_with_rects>( &self, iter: I, x: f32, diff --git a/src/graphics/mod.rs b/src/graphics/mod.rs new file mode 100644 index 0000000..c655782 --- /dev/null +++ b/src/graphics/mod.rs @@ -0,0 +1,3 @@ +pub mod bmfont; +pub mod bmfont_renderer; +pub mod texture_set; diff --git a/src/texture_set.rs b/src/graphics/texture_set.rs similarity index 99% rename from src/texture_set.rs rename to src/graphics/texture_set.rs index 3226673..79438fa 100644 --- a/src/texture_set.rs +++ b/src/graphics/texture_set.rs @@ -6,7 +6,7 @@ use itertools::Itertools; use log::info; use crate::common; -use crate::common::{Rect, FILE_TYPES}; +use crate::common::{FILE_TYPES, Rect}; use crate::engine_constants::EngineConstants; use crate::framework::backend::{BackendTexture, SpriteBatchCommand}; use crate::framework::context::Context; @@ -134,8 +134,7 @@ impl SpriteBatch for DummyBatch { _flip_y: bool, _color: (u8, u8, u8, u8), _rect: &Rect, - ) { - } + ) {} fn add_rect_scaled(&mut self, _x: f32, _y: f32, _scale_x: f32, _scale_y: f32, _rect: &Rect) {} @@ -147,8 +146,7 @@ impl SpriteBatch for DummyBatch { _scale_x: f32, _scale_y: f32, _rect: &Rect, - ) { - } + ) {} fn draw(&mut self, _ctx: &mut Context) -> GameResult { Ok(()) diff --git a/src/hooks.rs b/src/hooks.rs deleted file mode 100644 index 8fd046f..0000000 --- a/src/hooks.rs +++ /dev/null @@ -1,287 +0,0 @@ -use crate::caret::CaretType; -use crate::common::{Direction, Rect}; -use crate::npc::list::NPCList; -use crate::npc::NPC; -use crate::player::Player; -use crate::rng::RNG; -use crate::shared_game_state::SharedGameState; -use crate::stage::Stage; -use crate::weapon::bullet::BulletManager; - -pub struct CHooks { - handle_npc: unsafe extern "C" fn(callbacks: *const Callbacks, ctx: *const CtxData), -} - -pub struct Callbacks { - random: unsafe extern "C" fn(ctx: *mut CtxData, min: i32, max: i32) -> i32, - play_sfx: unsafe extern "C" fn(ctx: *mut CtxData, id: u8), - set_quake: unsafe extern "C" fn(ctx: *mut CtxData, ticks: u16), - set_caret: unsafe extern "C" fn(ctx: *mut CtxData, x: i32, y: i32, id: u16, direction: u8), - get_flag: unsafe extern "C" fn(ctx: *mut CtxData, id: u16) -> bool, - get_map_data: unsafe extern "C" fn(ctx: *mut CtxData) -> MapData, - get_player_info: unsafe extern "C" fn(ctx: *mut CtxData) -> PlayerInfo, - update_player_info: unsafe extern "C" fn(ctx: *mut CtxData, player_info: *const PlayerInfo), - delete_npc_by_type: unsafe extern "C" fn(ctx: *mut CtxData, id: u16, smoke: bool), - destroy_npc: unsafe extern "C" fn(ctx: *mut CtxData, npc: *mut NPC), - vanish_npc: unsafe extern "C" fn(ctx: *mut CtxData, npc: *mut NPC), - create_npc: unsafe extern "C" fn( - ctx: *mut CtxData, - npc_id: u16, - x: i32, - y: i32, - vel_x: i32, - vel_y: i32, - direction: u16, - parent: u16, - min_id: u16, - ), - get_npc: unsafe extern "C" fn(ctx: *mut CtxData, npc_id: u16) -> *mut NPC, - current_npc: unsafe extern "C" fn(ctx: *mut CtxData) -> *mut NPC, -} - -#[repr(C)] -pub struct PlayerInfo { - x: i32, - y: i32, - vel_x: i32, - vel_y: i32, - flags: u32, - equip: u16, - anim_num: u16, - cond: u16, - shock: u8, - direct: u8, - up: bool, - down: bool, - hit: Rect -} - -#[repr(C)] -pub struct MapData { - tiles: *const u8, - attrib: *const u8, - width: u16, - height: u16, -} - -static mut HOOKS: *mut CHooks = std::ptr::null_mut(); -struct CtxData<'a, 'b, 'c, 'd, 'e, 'f>( - &'a mut NPC, - &'b mut SharedGameState, - &'c mut Player, - &'d NPCList, - &'e mut Stage, - &'f BulletManager, -); - -pub fn init_hooks() { - #[cfg(target_os = "linux")] - unsafe { - let module: *mut libc::c_void = libc::dlopen(b"./libdrshooks.so\0".as_ptr() as *const _, libc::RTLD_NOW); - if module.is_null() { - let error = libc::dlerror(); - let message = std::ffi::CString::from_raw(error).to_string_lossy().to_string(); - - log::warn!("Cannot initialize hooks?: {}", message); - return; - } - - log::info!("Loaded libhooks..."); - - let symbol: *mut libc::c_void = libc::dlsym(module, b"drs_hooks_init\0".as_ptr() as *const _); - - if symbol.is_null() { - log::warn!("initialization function hasn't been found in libhooks."); - return; - } - - let init: unsafe extern "C" fn() -> *mut CHooks = std::mem::transmute(symbol); - HOOKS = (init)(); - } - - #[cfg(target_os = "windows")] - unsafe { - use winapi::um::libloaderapi::LoadLibraryA; - use winapi::um::libloaderapi::GetProcAddress; - use winapi::um::errhandlingapi::GetLastError; - - let module = LoadLibraryA(b"drshooks.dll\0".as_ptr() as *const _); - - if module.is_null() { - let error = GetLastError(); - - log::warn!("Cannot initialize hooks?: {:#x}", error); - return; - } - - log::info!("Loaded libhooks..."); - - let symbol = GetProcAddress(module, b"drs_hooks_init\0".as_ptr() as *const _); - - if symbol.is_null() { - log::warn!("initialization function hasn't been found in libhooks."); - return; - } - - let init: unsafe extern "C" fn() -> *mut CHooks = std::mem::transmute(symbol); - HOOKS = (init)(); - } -} - -pub fn reload_hooks() {} - -pub fn run_npc_hook( - npc: &mut NPC, - state: &mut SharedGameState, - players: [&mut Player; 2], - npc_list: &NPCList, - stage: &mut Stage, - bullet_manager: &BulletManager, -) { - unsafe { - let mut ctx_data = CtxData(npc, state, players[0], npc_list, stage, bullet_manager); - - unsafe extern "C" fn random(ctx: *mut CtxData, min: i32, max: i32) -> i32 { - let ctx = &*ctx; - - ctx.0.rng.range(min..max) - }; - - unsafe extern "C" fn play_sfx(ctx: *mut CtxData, id: u8) { - (*ctx).1.sound_manager.play_sfx(id); - } - - unsafe extern "C" fn set_quake(ctx: *mut CtxData, ticks: u16) { - (*ctx).1.quake_counter = ticks; - } - - unsafe extern "C" fn set_caret(ctx: *mut CtxData, x: i32, y: i32, id: u16, direction: u8) { - (*ctx).1.create_caret( - x, - y, - CaretType::from_int(id as usize).unwrap_or(CaretType::None), - Direction::from_int_facing(direction as usize).unwrap_or(Direction::Left), - ); - } - - unsafe extern "C" fn get_flag(ctx: *mut CtxData, id: u16) -> bool { - (*ctx).1.get_flag(id as usize) - } - - unsafe extern "C" fn get_map_data(ctx: *mut CtxData) -> MapData { - let stage = &(*ctx).4; - - MapData { - tiles: stage.map.tiles.as_ptr(), - attrib: stage.map.attrib.as_ptr(), - width: stage.map.width, - height: stage.map.height, - } - } - - unsafe extern "C" fn get_player_info(ctx: *mut CtxData) -> PlayerInfo { - let player = &(*ctx).2; - - PlayerInfo { - x: player.x, - y: player.y, - vel_x: player.vel_x, - vel_y: player.vel_y, - flags: player.flags.0, - equip: player.equip.0, - anim_num: player.anim_num, - cond: player.cond.0, - shock: player.shock_counter, - direct: player.direction as u8, - up: player.up, - down: player.down, - hit: player.hit_bounds, - } - } - - unsafe extern "C" fn update_player_info(ctx: *mut CtxData, player_info: *const PlayerInfo) { - let mut player = &mut (*ctx).2; - let player_info = &(*player_info); - - player.x = player_info.x; - player.y = player_info.y; - player.vel_x = player_info.vel_x; - player.vel_y = player_info.vel_y; - player.flags.0 = player_info.flags; - player.equip.0 = player_info.equip; - player.cond.0 = player_info.cond; - player.direction = Direction::from_int(player_info.direct as usize).unwrap_or(Direction::Left); - } - - unsafe extern "C" fn create_npc( - ctx: *mut CtxData, - npc_id: u16, - x: i32, - y: i32, - vel_x: i32, - vel_y: i32, - direction: u16, - parent: u16, - min_id: u16, - ) { - let ctx = &*ctx; - - let mut npc = NPC::create(npc_id, &ctx.1.npc_table); - npc.cond.set_alive(true); - npc.x = x; - npc.y = y; - npc.vel_x = vel_x; - npc.vel_y = vel_y; - npc.direction = Direction::from_int(direction as usize).unwrap_or(Direction::Left); - npc.tsc_direction = direction; - npc.parent_id = parent; - - let _ = ctx.3.spawn(min_id, npc); - }; - - unsafe extern "C" fn get_npc(ctx: *mut CtxData, npc_id: u16) -> *mut NPC { - (*ctx).3.get_npc(npc_id as usize).unwrap() as *mut NPC - } - - unsafe extern "C" fn delete_npc_by_type(ctx: *mut CtxData, id: u16, smoke: bool) { - (*ctx).3.kill_npcs_by_type(id, smoke, (*ctx).1); - } - - unsafe extern "C" fn destroy_npc(ctx: *mut CtxData, npc: *mut NPC) { - let npc = &mut (*npc); - - npc.cond.set_explode_die(true); - } - - unsafe extern "C" fn vanish_npc(ctx: *mut CtxData, npc: *mut NPC) { - let npc = &mut (*npc); - - npc.vanish((*ctx).1); - } - - unsafe extern "C" fn current_npc(ctx: *mut CtxData) -> *mut NPC { - (*ctx).0 as *mut NPC - } - - let callbacks = Callbacks { - random, - play_sfx, - set_quake, - set_caret, - get_flag, - get_map_data, - get_player_info, - update_player_info, - delete_npc_by_type, - destroy_npc, - vanish_npc, - create_npc, - get_npc, - current_npc, - }; - - if let Some(hook) = HOOKS.as_ref() { - (hook.handle_npc)(&callbacks as *const Callbacks, &mut ctx_data as *mut CtxData); - } - } -} diff --git a/src/i18n.rs b/src/i18n.rs index 21f3f19..6e6f08b 100644 --- a/src/i18n.rs +++ b/src/i18n.rs @@ -1,7 +1,8 @@ +use std::collections::HashMap; + use crate::framework::context::Context; use crate::framework::filesystem; -use crate::shared_game_state::FontData; -use std::collections::HashMap; +use crate::game::shared_game_state::FontData; #[derive(Debug, Clone)] pub struct Locale { diff --git a/src/input/combined_menu_controller.rs b/src/input/combined_menu_controller.rs index 38ce604..4d9f074 100644 --- a/src/input/combined_menu_controller.rs +++ b/src/input/combined_menu_controller.rs @@ -1,7 +1,7 @@ use crate::framework::context::Context; use crate::framework::error::GameResult; +use crate::game::shared_game_state::SharedGameState; use crate::input::player_controller::PlayerController; -use crate::shared_game_state::SharedGameState; pub struct CombinedMenuController { controllers: Vec>, diff --git a/src/input/combined_player_controller.rs b/src/input/combined_player_controller.rs index 8962b22..6ddc475 100644 --- a/src/input/combined_player_controller.rs +++ b/src/input/combined_player_controller.rs @@ -1,7 +1,7 @@ use crate::{ framework::{context::Context, error::GameResult}, - shared_game_state::SharedGameState, }; +use crate::game::shared_game_state::SharedGameState; use super::player_controller::PlayerController; diff --git a/src/input/dummy_player_controller.rs b/src/input/dummy_player_controller.rs index 95e5ef2..5f65aaa 100644 --- a/src/input/dummy_player_controller.rs +++ b/src/input/dummy_player_controller.rs @@ -1,7 +1,7 @@ use crate::framework::context::Context; use crate::framework::error::GameResult; +use crate::game::shared_game_state::SharedGameState; use crate::input::player_controller::PlayerController; -use crate::shared_game_state::SharedGameState; /// A no-op implementation of player controller. #[derive(Clone)] diff --git a/src/input/gamepad_player_controller.rs b/src/input/gamepad_player_controller.rs index 75ffa81..99996b8 100644 --- a/src/input/gamepad_player_controller.rs +++ b/src/input/gamepad_player_controller.rs @@ -2,9 +2,9 @@ use crate::bitfield; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::gamepad::{self, Button, PlayerControllerInputType}; +use crate::game::shared_game_state::SharedGameState; use crate::input::player_controller::PlayerController; -use crate::player::TargetPlayer; -use crate::shared_game_state::SharedGameState; +use crate::game::player::TargetPlayer; bitfield! { #[derive(Clone, Copy)] diff --git a/src/input/keyboard_player_controller.rs b/src/input/keyboard_player_controller.rs index d3679f4..48ce5b7 100644 --- a/src/input/keyboard_player_controller.rs +++ b/src/input/keyboard_player_controller.rs @@ -3,9 +3,9 @@ use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::keyboard; use crate::framework::keyboard::ScanCode; +use crate::game::shared_game_state::SharedGameState; use crate::input::player_controller::PlayerController; -use crate::player::TargetPlayer; -use crate::shared_game_state::SharedGameState; +use crate::game::player::TargetPlayer; bitfield! { #[derive(Clone, Copy)] diff --git a/src/input/player_controller.rs b/src/input/player_controller.rs index cfbf891..34c6b60 100644 --- a/src/input/player_controller.rs +++ b/src/input/player_controller.rs @@ -1,7 +1,6 @@ use crate::framework::context::Context; use crate::framework::error::GameResult; - -use crate::shared_game_state::SharedGameState; +use crate::game::shared_game_state::SharedGameState; pub trait PlayerController: PlayerControllerClone { fn update(&mut self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult; diff --git a/src/input/replay_player_controller.rs b/src/input/replay_player_controller.rs index 8660bef..deb582e 100644 --- a/src/input/replay_player_controller.rs +++ b/src/input/replay_player_controller.rs @@ -1,8 +1,8 @@ use crate::bitfield; use crate::framework::context::Context; use crate::framework::error::GameResult; +use crate::game::shared_game_state::SharedGameState; use crate::input::player_controller::PlayerController; -use crate::shared_game_state::SharedGameState; bitfield! { #[allow(unused)] diff --git a/src/input/touch_controls.rs b/src/input/touch_controls.rs index 6b7b07e..4aba61b 100644 --- a/src/input/touch_controls.rs +++ b/src/input/touch_controls.rs @@ -3,7 +3,7 @@ use crate::engine_constants::EngineConstants; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::graphics::screen_insets_scaled; -use crate::texture_set::TextureSet; +use crate::graphics::texture_set::TextureSet; #[derive(Copy, Clone, PartialEq, Eq)] pub enum TouchControlType { diff --git a/src/input/touch_player_controller.rs b/src/input/touch_player_controller.rs index bacd21a..f86ee29 100644 --- a/src/input/touch_player_controller.rs +++ b/src/input/touch_player_controller.rs @@ -3,9 +3,9 @@ use crate::common::Rect; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::graphics::screen_insets_scaled; +use crate::game::shared_game_state::SharedGameState; use crate::input::player_controller::PlayerController; use crate::input::touch_controls::TouchControlType; -use crate::shared_game_state::SharedGameState; /// A no-op implementation of player controller. #[derive(Clone)] @@ -88,150 +88,150 @@ impl PlayerController for TouchPlayerController { self.state.set_left( self.state.left() || state - .touch_controls - .point_in(Rect::new_size(left, state.canvas_size.1 as isize - bottom - 48 * 2, 48, 48)) - .is_some(), + .touch_controls + .point_in(Rect::new_size(left, state.canvas_size.1 as isize - bottom - 48 * 2, 48, 48)) + .is_some(), ); // up self.state.set_up( self.state.up() || state - .touch_controls - .point_in(Rect::new_size(48 + left, state.canvas_size.1 as isize - bottom - 48 * 3, 48, 48)) - .is_some(), + .touch_controls + .point_in(Rect::new_size(48 + left, state.canvas_size.1 as isize - bottom - 48 * 3, 48, 48)) + .is_some(), ); // right self.state.set_right( self.state.right() || state - .touch_controls - .point_in(Rect::new_size( - 48 * 2 + left, - state.canvas_size.1 as isize - bottom - 48 * 2, - 48, - 48, - )) - .is_some(), + .touch_controls + .point_in(Rect::new_size( + 48 * 2 + left, + state.canvas_size.1 as isize - bottom - 48 * 2, + 48, + 48, + )) + .is_some(), ); // down self.state.set_down( self.state.down() || state - .touch_controls - .point_in(Rect::new_size(48 + left, state.canvas_size.1 as isize - bottom - 48, 48, 48)) - .is_some(), + .touch_controls + .point_in(Rect::new_size(48 + left, state.canvas_size.1 as isize - bottom - 48, 48, 48)) + .is_some(), ); // left+up self.state.set_left( self.state.left() || state - .touch_controls - .point_in(Rect::new_size(left, state.canvas_size.1 as isize - bottom - 48 * 3, 48, 48)) - .is_some(), + .touch_controls + .point_in(Rect::new_size(left, state.canvas_size.1 as isize - bottom - 48 * 3, 48, 48)) + .is_some(), ); self.state.set_up( self.state.up() || state - .touch_controls - .point_in(Rect::new_size(left, state.canvas_size.1 as isize - bottom - 48 * 3, 48, 48)) - .is_some(), + .touch_controls + .point_in(Rect::new_size(left, state.canvas_size.1 as isize - bottom - 48 * 3, 48, 48)) + .is_some(), ); // right+up self.state.set_right( self.state.right() || state - .touch_controls - .point_in(Rect::new_size( - 48 * 2 + left, - state.canvas_size.1 as isize - bottom - 48 * 3, - 48, - 48, - )) - .is_some(), + .touch_controls + .point_in(Rect::new_size( + 48 * 2 + left, + state.canvas_size.1 as isize - bottom - 48 * 3, + 48, + 48, + )) + .is_some(), ); self.state.set_up( self.state.up() || state - .touch_controls - .point_in(Rect::new_size( - 48 * 2 + left, - state.canvas_size.1 as isize - bottom - 48 * 3, - 48, - 48, - )) - .is_some(), + .touch_controls + .point_in(Rect::new_size( + 48 * 2 + left, + state.canvas_size.1 as isize - bottom - 48 * 3, + 48, + 48, + )) + .is_some(), ); // left+down self.state.set_left( self.state.left() || state - .touch_controls - .point_in(Rect::new_size(left, state.canvas_size.1 as isize - 48 - bottom, 48, 48)) - .is_some(), + .touch_controls + .point_in(Rect::new_size(left, state.canvas_size.1 as isize - 48 - bottom, 48, 48)) + .is_some(), ); self.state.set_down( self.state.down() || state - .touch_controls - .point_in(Rect::new_size(left, state.canvas_size.1 as isize - 48 - bottom, 48, 48)) - .is_some(), + .touch_controls + .point_in(Rect::new_size(left, state.canvas_size.1 as isize - 48 - bottom, 48, 48)) + .is_some(), ); // right+down self.state.set_right( self.state.right() || state - .touch_controls - .point_in(Rect::new_size(48 * 2 + left, state.canvas_size.1 as isize - 48 - bottom, 48, 48)) - .is_some(), + .touch_controls + .point_in(Rect::new_size(48 * 2 + left, state.canvas_size.1 as isize - 48 - bottom, 48, 48)) + .is_some(), ); self.state.set_down( self.state.down() || state - .touch_controls - .point_in(Rect::new_size(48 * 2 + left, state.canvas_size.1 as isize - 48 - bottom, 48, 48)) - .is_some(), + .touch_controls + .point_in(Rect::new_size(48 * 2 + left, state.canvas_size.1 as isize - 48 - bottom, 48, 48)) + .is_some(), ); self.state.set_inventory( self.state.inventory() || state.touch_controls.consume_click_in(Rect::new_size( - state.canvas_size.0 as isize - 48 - right, - top, - 48, - 48, - )), + state.canvas_size.0 as isize - 48 - right, + top, + 48, + 48, + )), ); self.state.set_jump( self.state.jump() || state - .touch_controls - .point_in(Rect::new_size( - state.canvas_size.0 as isize - 48 - right, - state.canvas_size.1 as isize - (48 + 4) - bottom, - 48, - 48, - )) - .is_some(), + .touch_controls + .point_in(Rect::new_size( + state.canvas_size.0 as isize - 48 - right, + state.canvas_size.1 as isize - (48 + 4) - bottom, + 48, + 48, + )) + .is_some(), ); self.state.set_shoot( self.state.shoot() || state - .touch_controls - .point_in(Rect::new_size( - state.canvas_size.0 as isize - 48 - right, - state.canvas_size.1 as isize - (48 + 4) * 2 - bottom, - 48, - 48, - )) - .is_some(), + .touch_controls + .point_in(Rect::new_size( + state.canvas_size.0 as isize - 48 - right, + state.canvas_size.1 as isize - (48 + 4) * 2 - bottom, + 48, + 48, + )) + .is_some(), ); self.state.set_pause( diff --git a/src/lib.rs b/src/lib.rs index 9451f32..29588b7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,360 +4,23 @@ extern crate strum; #[macro_use] extern crate strum_macros; -use std::cell::UnsafeCell; -use std::env; -use std::path::PathBuf; -use std::sync::Mutex; -use std::time::{Duration, Instant}; - -use directories::ProjectDirs; -use lazy_static::lazy_static; - -use crate::builtin_fs::BuiltinFS; -use crate::framework::context::Context; -use crate::framework::error::{GameError, GameResult}; -use crate::framework::filesystem::{mount_user_vfs, mount_vfs}; -use crate::framework::graphics; -use crate::framework::graphics::VSyncMode; -use crate::framework::ui::UI; -use crate::framework::vfs::PhysicalFS; -use crate::scene::loading_scene::LoadingScene; -use crate::scene::Scene; -use crate::scripting::tsc::text_script::ScriptMode; -use crate::shared_game_state::{Fps, SharedGameState, TimingMode}; -use crate::texture_set::{G_MAG, I_MAG}; - -mod bmfont; -mod bmfont_renderer; -mod builtin_fs; -mod caret; mod common; mod components; +mod data; #[cfg(feature = "editor")] mod editor; -mod encoding; mod engine_constants; mod entity; -mod exe_parser; -mod frame; mod framework; -#[cfg(feature = "hooks")] -mod hooks; +pub mod game; +mod graphics; mod i18n; mod input; -mod inventory; mod live_debugger; mod macros; -mod map; mod menu; mod mod_list; mod mod_requirements; -mod npc; -mod physics; -mod player; -mod profile; -mod rng; mod scene; -mod scripting; -mod settings; -#[cfg(feature = "backend-gfx")] -mod shaders; -mod shared_game_state; mod sound; -mod stage; -mod texture_set; -mod vanilla; -mod weapon; - -pub struct LaunchOptions { - pub server_mode: bool, - pub editor: bool, -} - -lazy_static! { - pub static ref GAME_SUSPENDED: Mutex = Mutex::new(false); -} - -pub struct Game { - scene: Option>, - state: UnsafeCell, - ui: UI, - start_time: Instant, - last_tick: u128, - next_tick: u128, - loops: u32, - next_tick_draw: u128, - present: bool, - fps: Fps, -} - -impl Game { - fn new(ctx: &mut Context) -> GameResult { - let s = Game { - scene: None, - ui: UI::new(ctx)?, - state: UnsafeCell::new(SharedGameState::new(ctx)?), - start_time: Instant::now(), - last_tick: 0, - next_tick: 0, - loops: 0, - next_tick_draw: 0, - present: true, - fps: Fps::new(), - }; - - Ok(s) - } - - fn update(&mut self, ctx: &mut Context) -> GameResult { - if let Some(scene) = &mut self.scene { - let state_ref = unsafe { &mut *self.state.get() }; - - let speed = - if state_ref.textscript_vm.mode == ScriptMode::Map && state_ref.textscript_vm.flags.cutscene_skip() { - 4.0 * state_ref.settings.speed - } else { - 1.0 * state_ref.settings.speed - }; - - match state_ref.settings.timing_mode { - TimingMode::_50Hz | TimingMode::_60Hz => { - let last_tick = self.next_tick; - - while self.start_time.elapsed().as_nanos() >= self.next_tick && self.loops < 10 { - if (speed - 1.0).abs() < 0.01 { - self.next_tick += state_ref.settings.timing_mode.get_delta() as u128; - } else { - self.next_tick += (state_ref.settings.timing_mode.get_delta() as f64 / speed) as u128; - } - self.loops += 1; - } - - if self.loops == 10 { - log::warn!("Frame skip is way too high, a long system lag occurred?"); - self.last_tick = self.start_time.elapsed().as_nanos(); - self.next_tick = - self.last_tick + (state_ref.settings.timing_mode.get_delta() as f64 / speed) as u128; - self.loops = 0; - } - - if self.loops != 0 { - scene.draw_tick(state_ref)?; - self.last_tick = last_tick; - } - - for _ in 0..self.loops { - scene.tick(state_ref, ctx)?; - } - self.fps.tick_count = self.fps.tick_count.saturating_add(self.loops as u32); - } - TimingMode::FrameSynchronized => { - scene.tick(state_ref, ctx)?; - } - } - } - Ok(()) - } - - fn draw(&mut self, ctx: &mut Context) -> GameResult { - let state_ref = unsafe { &mut *self.state.get() }; - - match ctx.vsync_mode { - VSyncMode::Uncapped | VSyncMode::VSync => { - self.present = true; - } - _ => unsafe { - self.present = false; - - let divisor = match ctx.vsync_mode { - VSyncMode::VRRTickSync1x => 1, - VSyncMode::VRRTickSync2x => 2, - VSyncMode::VRRTickSync3x => 3, - _ => std::hint::unreachable_unchecked(), - }; - - let delta = (state_ref.settings.timing_mode.get_delta() / divisor) as u64; - - let now = self.start_time.elapsed().as_nanos(); - if now > self.next_tick_draw + delta as u128 * 4 { - self.next_tick_draw = now; - } - - while self.start_time.elapsed().as_nanos() >= self.next_tick_draw { - self.next_tick_draw += delta as u128; - self.present = true; - } - }, - } - - if !self.present { - std::thread::sleep(Duration::from_millis(2)); - self.loops = 0; - return Ok(()); - } - - if ctx.headless { - self.loops = 0; - state_ref.frame_time = 1.0; - return Ok(()); - } - - if state_ref.settings.timing_mode != TimingMode::FrameSynchronized { - let mut elapsed = self.start_time.elapsed().as_nanos(); - - // Even with the non-monotonic Instant mitigation at the start of the event loop, there's still a chance of it not working. - // This check here should trigger if that happens and makes sure there's no panic from an underflow. - if elapsed < self.last_tick { - elapsed = self.last_tick; - } - - let n1 = (elapsed - self.last_tick) as f64; - let n2 = (self.next_tick - self.last_tick) as f64; - state_ref.frame_time = if state_ref.settings.motion_interpolation { n1 / n2 } else { 1.0 }; - } - unsafe { - G_MAG = if state_ref.settings.subpixel_coords { state_ref.scale } else { 1.0 }; - I_MAG = state_ref.scale; - } - self.loops = 0; - - graphics::prepare_draw(ctx)?; - graphics::clear(ctx, [0.0, 0.0, 0.0, 1.0].into()); - - if let Some(scene) = &mut self.scene { - scene.draw(state_ref, ctx)?; - if state_ref.settings.touch_controls { - state_ref.touch_controls.draw( - state_ref.canvas_size, - state_ref.scale, - &state_ref.constants, - &mut state_ref.texture_set, - ctx, - )?; - } - - if state_ref.settings.fps_counter { - self.fps.act(state_ref, ctx, self.start_time.elapsed().as_nanos())?; - } - - self.ui.draw(state_ref, ctx, scene)?; - } - - graphics::present(ctx)?; - - Ok(()) - } -} - -pub fn init(options: LaunchOptions) -> GameResult { - let _ = simple_logger::SimpleLogger::new() - .without_timestamps() - .with_colors(true) - .with_level(log::Level::Info.to_level_filter()) - .init(); - - #[cfg(not(target_os = "android"))] - let resource_dir = if let Ok(data_dir) = env::var("CAVESTORY_DATA_DIR") { - PathBuf::from(data_dir) - } else { - let mut resource_dir = env::current_exe()?; - if resource_dir.file_name().is_some() { - let _ = resource_dir.pop(); - } - - #[cfg(target_os = "macos")] - { - let mut bundle_dir = resource_dir.clone(); - let _ = bundle_dir.pop(); - let mut bundle_exec_dir = bundle_dir.clone(); - let mut csplus_data_dir = bundle_dir.clone(); - let _ = csplus_data_dir.pop(); - let _ = csplus_data_dir.pop(); - let mut csplus_data_base_dir = csplus_data_dir.clone(); - csplus_data_base_dir.push("data"); - csplus_data_base_dir.push("base"); - - bundle_exec_dir.push("MacOS"); - bundle_dir.push("Resources"); - - if bundle_exec_dir.is_dir() && bundle_dir.is_dir() { - log::info!("Running in macOS bundle mode"); - - if csplus_data_base_dir.is_dir() { - log::info!("Cave Story+ Steam detected"); - resource_dir = csplus_data_dir; - } else { - resource_dir = bundle_dir; - } - } - } - - resource_dir.push("data"); - resource_dir - }; - - #[cfg(not(target_os = "android"))] - log::info!("Resource directory: {:?}", resource_dir); - log::info!("Initializing engine..."); - - let mut context = Context::new(); - #[cfg(not(target_os = "android"))] - mount_vfs(&mut context, Box::new(PhysicalFS::new(&resource_dir, true))); - - #[cfg(not(target_os = "android"))] - let project_dirs = match ProjectDirs::from("", "", "doukutsu-rs") { - Some(dirs) => dirs, - None => { - return Err(GameError::FilesystemError(String::from("No valid home directory path could be retrieved."))); - } - }; - #[cfg(target_os = "android")] - { - let mut data_path = - PathBuf::from(ndk_glue::native_activity().internal_data_path().to_string_lossy().to_string()); - let mut user_path = data_path.clone(); - - data_path.push("data"); - user_path.push("saves"); - - let _ = std::fs::create_dir_all(&data_path); - let _ = std::fs::create_dir_all(&user_path); - - log::info!("Android data directories: data_path={:?} user_path={:?}", &data_path, &user_path); - - mount_vfs(&mut context, Box::new(PhysicalFS::new(&data_path, true))); - mount_user_vfs(&mut context, Box::new(PhysicalFS::new(&user_path, false))); - } - - #[cfg(not(target_os = "android"))] - { - if crate::framework::filesystem::open(&context, "/.drs_localstorage").is_ok() { - let mut user_dir = resource_dir.clone(); - user_dir.push("_drs_profile"); - - let _ = std::fs::create_dir_all(&user_dir); - mount_user_vfs(&mut context, Box::new(PhysicalFS::new(&user_dir, false))); - } else { - mount_user_vfs(&mut context, Box::new(PhysicalFS::new(project_dirs.data_local_dir(), false))); - } - } - - mount_vfs(&mut context, Box::new(BuiltinFS::new())); - - if options.server_mode { - log::info!("Running in server mode..."); - context.headless = true; - } - - let game = UnsafeCell::new(Game::new(&mut context)?); - let state_ref = unsafe { &mut *((&mut *game.get()).state.get()) }; - #[cfg(feature = "scripting-lua")] - { - state_ref.lua.update_refs(unsafe { (&*game.get()).state.get() }, &mut context as *mut Context); - } - - state_ref.next_scene = Some(Box::new(LoadingScene::new())); - context.run(unsafe { &mut *game.get() })?; - - Ok(()) -} +mod util; diff --git a/src/live_debugger/command_line.rs b/src/live_debugger/command_line.rs index 015f25d..9468f37 100644 --- a/src/live_debugger/command_line.rs +++ b/src/live_debugger/command_line.rs @@ -1,11 +1,11 @@ use num_traits::FromPrimitive; use crate::framework::error::{GameError::CommandLineError, GameResult}; -use crate::npc::NPC; +use crate::game::shared_game_state::SharedGameState; +use crate::game::npc::NPC; use crate::scene::game_scene::GameScene; -use crate::scripting::tsc::text_script::{ScriptMode, TextScript, TextScriptEncoding}; -use crate::shared_game_state::SharedGameState; -use crate::weapon::WeaponType; +use crate::game::scripting::tsc::text_script::{ScriptMode, TextScript, TextScriptEncoding}; +use crate::game::weapon::WeaponType; #[derive(Clone)] pub enum CommandLineCommand { diff --git a/src/live_debugger/mod.rs b/src/live_debugger/mod.rs index 4f9850e..fcc9268 100644 --- a/src/live_debugger/mod.rs +++ b/src/live_debugger/mod.rs @@ -3,9 +3,9 @@ use itertools::Itertools; use crate::framework::context::Context; use crate::framework::error::GameResult; +use crate::game::shared_game_state::SharedGameState; use crate::scene::game_scene::GameScene; -use crate::scripting::tsc::text_script::TextScriptExecutionState; -use crate::shared_game_state::SharedGameState; +use crate::game::scripting::tsc::text_script::TextScriptExecutionState; use self::command_line::CommandLineParser; @@ -187,15 +187,15 @@ impl LiveDebugger { } #[cfg(feature = "scripting-lua")] - { - ui.same_line(); - if ui.button("Reload Lua Scripts") { - if let Err(err) = state.lua.reload_scripts(ctx) { - log::error!("Error reloading scripts: {:?}", err); - self.error = Some(ImString::new(err.to_string())); + { + ui.same_line(); + if ui.button("Reload Lua Scripts") { + if let Err(err) = state.lua.reload_scripts(ctx) { + log::error!("Error reloading scripts: {:?}", err); + self.error = Some(ImString::new(err.to_string())); + } } } - } if game_scene.player2.cond.alive() { if ui.button("Drop Player 2") { @@ -216,8 +216,7 @@ impl LiveDebugger { let _ = state.save_game(game_scene, ctx); state.sound_manager.play_sfx(18); } - } else if ui.button("Busy") { - } + } else if ui.button("Busy") {} ui.same_line(); if ui.button("Hotkey List") { diff --git a/src/main.rs b/src/main.rs index d4be069..a81e46c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,10 +4,7 @@ use std::process::exit; fn main() { let args = std::env::args(); - let mut options = doukutsu_rs::LaunchOptions { - server_mode: false, - editor: false, - }; + let mut options = doukutsu_rs::game::LaunchOptions { server_mode: false, editor: false }; for arg in args { if arg == "--server-mode" { @@ -24,26 +21,25 @@ fn main() { exit(1); } - let result = doukutsu_rs::init(options); + let result = doukutsu_rs::game::init(options); #[cfg(target_os = "windows")] unsafe { - use winapi::_core::ptr::null_mut; - use winapi::um::winuser::MessageBoxW; - use winapi::um::winuser::MB_OK; - use winapi::shared::ntdef::LPCWSTR; use std::ffi::OsStr; use std::os::windows::prelude::*; + use winapi::_core::ptr::null_mut; + use winapi::shared::ntdef::LPCWSTR; + use winapi::um::winuser::MessageBoxW; + use winapi::um::winuser::MB_OK; if let Err(e) = result { - let title: LPCWSTR = OsStr::new("Error!") - .encode_wide().chain(Some(0)).collect::>().as_ptr(); + let title: LPCWSTR = OsStr::new("Error!").encode_wide().chain(Some(0)).collect::>().as_ptr(); let message: LPCWSTR = OsStr::new(format!("Whoops, doukutsu-rs crashed: {}", e).as_str()) - .encode_wide().chain(Some(0)).collect::>().as_ptr(); - MessageBoxW(null_mut(), - message, - title, - MB_OK); + .encode_wide() + .chain(Some(0)) + .collect::>() + .as_ptr(); + MessageBoxW(null_mut(), message, title, MB_OK); exit(1); } } diff --git a/src/menu/controls_menu.rs b/src/menu/controls_menu.rs index a8c25d8..d59834d 100644 --- a/src/menu/controls_menu.rs +++ b/src/menu/controls_menu.rs @@ -2,12 +2,12 @@ use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::gamepad::{self, Axis, AxisDirection, Button, PlayerControllerInputType}; use crate::framework::keyboard::ScanCode; -use crate::input::combined_menu_controller::CombinedMenuController; -use crate::settings::{ - p1_default_keymap, p2_default_keymap, player_default_controller_button_map, ControllerType, +use crate::game::settings::{ + ControllerType, p1_default_keymap, p2_default_keymap, player_default_controller_button_map, PlayerControllerButtonMap, PlayerKeyMap, }; -use crate::shared_game_state::SharedGameState; +use crate::game::shared_game_state::SharedGameState; +use crate::input::combined_menu_controller::CombinedMenuController; use super::{ControlMenuData, Menu, MenuEntry, MenuSelectionResult}; diff --git a/src/menu/coop_menu.rs b/src/menu/coop_menu.rs index 70184e8..43a0170 100644 --- a/src/menu/coop_menu.rs +++ b/src/menu/coop_menu.rs @@ -1,9 +1,9 @@ use crate::framework::context::Context; use crate::framework::error::GameResult; +use crate::game::shared_game_state::{PlayerCount, SharedGameState}; use crate::input::combined_menu_controller::CombinedMenuController; -use crate::menu::MenuEntry; use crate::menu::{Menu, MenuSelectionResult}; -use crate::shared_game_state::{PlayerCount, SharedGameState}; +use crate::menu::MenuEntry; pub enum CurrentMenu { CoopMenu, diff --git a/src/menu/mod.rs b/src/menu/mod.rs index 3ac4bed..1ad15f5 100644 --- a/src/menu/mod.rs +++ b/src/menu/mod.rs @@ -1,13 +1,13 @@ use std::cell::Cell; use crate::common::{Color, Rect}; -use crate::components::draw_common::{draw_number, Alignment}; +use crate::components::draw_common::{Alignment, draw_number}; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::graphics; +use crate::game::shared_game_state::{GameDifficulty, MenuCharacter, SharedGameState}; use crate::input::combined_menu_controller::CombinedMenuController; use crate::menu::save_select_menu::MenuSaveInfo; -use crate::shared_game_state::{GameDifficulty, MenuCharacter, SharedGameState}; pub mod controls_menu; pub mod coop_menu; @@ -750,41 +750,41 @@ impl Menu { | MenuEntry::SaveData(_) | MenuEntry::NewSave | MenuEntry::PlayerSkin - if (self.selected == idx && controller.trigger_ok()) - || state.touch_controls.consume_click_in(entry_bounds) => - { - state.sound_manager.play_sfx(18); - self.selected = idx.clone(); - return MenuSelectionResult::Selected(idx, entry); - } + if (self.selected == idx && controller.trigger_ok()) + || state.touch_controls.consume_click_in(entry_bounds) => + { + state.sound_manager.play_sfx(18); + self.selected = idx.clone(); + return MenuSelectionResult::Selected(idx, entry); + } MenuEntry::Options(_, _, _) | MenuEntry::OptionsBar(_, _) - if (self.selected == idx && controller.trigger_left()) - || state.touch_controls.consume_click_in(left_entry_bounds) => - { - state.sound_manager.play_sfx(1); - return MenuSelectionResult::Left(self.selected.clone(), entry, -1); - } + if (self.selected == idx && controller.trigger_left()) + || state.touch_controls.consume_click_in(left_entry_bounds) => + { + state.sound_manager.play_sfx(1); + return MenuSelectionResult::Left(self.selected.clone(), entry, -1); + } MenuEntry::Options(_, _, _) | MenuEntry::OptionsBar(_, _) - if (self.selected == idx && controller.trigger_right()) - || state.touch_controls.consume_click_in(right_entry_bounds) => - { - state.sound_manager.play_sfx(1); - return MenuSelectionResult::Right(self.selected.clone(), entry, 1); - } + if (self.selected == idx && controller.trigger_right()) + || state.touch_controls.consume_click_in(right_entry_bounds) => + { + state.sound_manager.play_sfx(1); + return MenuSelectionResult::Right(self.selected.clone(), entry, 1); + } MenuEntry::DescriptiveOptions(_, _, _, _) - if (self.selected == idx && controller.trigger_left()) - || state.touch_controls.consume_click_in(left_entry_bounds) => - { - state.sound_manager.play_sfx(1); - return MenuSelectionResult::Left(self.selected.clone(), entry, -1); - } + if (self.selected == idx && controller.trigger_left()) + || state.touch_controls.consume_click_in(left_entry_bounds) => + { + state.sound_manager.play_sfx(1); + return MenuSelectionResult::Left(self.selected.clone(), entry, -1); + } MenuEntry::DescriptiveOptions(_, _, _, _) | MenuEntry::SaveData(_) - if (self.selected == idx && controller.trigger_right()) - || state.touch_controls.consume_click_in(right_entry_bounds) => - { - state.sound_manager.play_sfx(1); - return MenuSelectionResult::Right(self.selected.clone(), entry, 1); - } + if (self.selected == idx && controller.trigger_right()) + || state.touch_controls.consume_click_in(right_entry_bounds) => + { + state.sound_manager.play_sfx(1); + return MenuSelectionResult::Right(self.selected.clone(), entry, 1); + } MenuEntry::Control(_, _) => { if self.selected == idx && controller.trigger_ok() || state.touch_controls.consume_click_in(entry_bounds) diff --git a/src/menu/pause_menu.rs b/src/menu/pause_menu.rs index ce58f96..3fe8b17 100644 --- a/src/menu/pause_menu.rs +++ b/src/menu/pause_menu.rs @@ -2,11 +2,11 @@ use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::graphics; use crate::framework::keyboard::ScanCode; +use crate::game::shared_game_state::{MenuCharacter, PlayerCount, SharedGameState}; use crate::input::combined_menu_controller::CombinedMenuController; -use crate::menu::MenuEntry; use crate::menu::{Menu, MenuSelectionResult}; +use crate::menu::MenuEntry; use crate::scene::title_scene::TitleScene; -use crate::shared_game_state::{MenuCharacter, PlayerCount, SharedGameState}; use super::coop_menu::PlayerCountMenu; use super::settings_menu::SettingsMenu; diff --git a/src/menu/save_select_menu.rs b/src/menu/save_select_menu.rs index b82963e..bd83c9f 100644 --- a/src/menu/save_select_menu.rs +++ b/src/menu/save_select_menu.rs @@ -1,12 +1,12 @@ use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::filesystem; +use crate::game::profile::GameProfile; +use crate::game::shared_game_state::{GameDifficulty, SharedGameState}; use crate::input::combined_menu_controller::CombinedMenuController; +use crate::menu::{Menu, MenuSelectionResult}; use crate::menu::coop_menu::PlayerCountMenu; use crate::menu::MenuEntry; -use crate::menu::{Menu, MenuSelectionResult}; -use crate::profile::GameProfile; -use crate::shared_game_state::{GameDifficulty, SharedGameState}; #[derive(Clone, Copy)] pub struct MenuSaveInfo { @@ -23,6 +23,7 @@ impl Default for MenuSaveInfo { MenuSaveInfo { current_map: 0, max_life: 0, life: 0, weapon_count: 0, weapon_id: [0; 8], difficulty: 0 } } } + #[derive(PartialEq, Eq, Copy, Clone)] #[repr(u8)] #[allow(unused)] @@ -254,7 +255,7 @@ impl SaveSelectMenu { state.save_slot = slot + 1; if let Ok(_) = - filesystem::user_open(ctx, state.get_save_filename(state.save_slot).unwrap_or("".to_string())) + filesystem::user_open(ctx, state.get_save_filename(state.save_slot).unwrap_or("".to_string())) { if let (_, MenuEntry::SaveData(save)) = self.save_menu.entries[slot] { self.save_detailed.entries.clear(); diff --git a/src/menu/settings_menu.rs b/src/menu/settings_menu.rs index 9dcd654..99fd68c 100644 --- a/src/menu/settings_menu.rs +++ b/src/menu/settings_menu.rs @@ -1,15 +1,15 @@ use itertools::Itertools; +use crate::framework::{filesystem, graphics}; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::framework::filesystem; +use crate::framework::graphics::VSyncMode; +use crate::game::shared_game_state::{CutsceneSkipMode, ScreenShakeIntensity, SharedGameState, TimingMode, WindowMode}; use crate::input::combined_menu_controller::CombinedMenuController; -use crate::menu::MenuEntry; use crate::menu::{Menu, MenuSelectionResult}; +use crate::menu::MenuEntry; use crate::scene::title_scene::TitleScene; -use crate::shared_game_state::{CutsceneSkipMode, ScreenShakeIntensity, SharedGameState, TimingMode, WindowMode}; use crate::sound::InterpolationMode; -use crate::{graphics, VSyncMode}; use super::controls_menu::ControlsMenu; @@ -181,7 +181,7 @@ impl SettingsMenu { pub fn init(&mut self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult { #[cfg(not(target_os = "android"))] - self.graphics.push_entry( + self.graphics.push_entry( GraphicsMenuEntry::WindowMode, MenuEntry::Options( state.t("menus.options_menu.graphics_menu.window_mode.entry"), @@ -295,7 +295,7 @@ impl SettingsMenu { self.main.push_entry(MainMenuEntry::Sound, MenuEntry::Active(state.t("menus.options_menu.sound"))); #[cfg(not(target_os = "android"))] - self.main.push_entry(MainMenuEntry::Controls, MenuEntry::Active(state.t("menus.options_menu.controls"))); + self.main.push_entry(MainMenuEntry::Controls, MenuEntry::Active(state.t("menus.options_menu.controls"))); self.language.push_entry(LanguageMenuEntry::Title, MenuEntry::Disabled(state.t("menus.options_menu.language"))); diff --git a/src/mod_list.rs b/src/mod_list.rs index 000426c..7a5ddba 100644 --- a/src/mod_list.rs +++ b/src/mod_list.rs @@ -3,9 +3,10 @@ use std::io::{BufRead, BufReader}; use std::iter::Peekable; use std::str::Chars; +use crate::framework::context::Context; +use crate::framework::error::GameResult; use crate::framework::filesystem; use crate::mod_requirements::ModRequirements; -use crate::{Context, GameResult}; #[derive(Debug)] pub struct ModInfo { diff --git a/src/npc/ai/mod.rs b/src/npc/ai/mod.rs deleted file mode 100644 index 839641c..0000000 --- a/src/npc/ai/mod.rs +++ /dev/null @@ -1,28 +0,0 @@ -pub(super) mod balcony; -pub(super) mod balrog; -pub(super) mod booster; -pub(super) mod chaco; -pub(super) mod characters; -pub(super) mod curly; -pub(super) mod doctor; -pub(super) mod egg_corridor; -pub(super) mod first_cave; -pub(super) mod grasstown; -pub(super) mod hell; -pub(super) mod igor; -pub(super) mod intro; -pub(super) mod last_cave; -pub(super) mod maze; -pub(super) mod mimiga_village; -pub(super) mod misc; -pub(super) mod misery; -pub(super) mod outer_wall; -pub(super) mod pickups; -pub(super) mod plantation; -pub(super) mod quote; -pub(super) mod sand_zone; -pub(super) mod santa; -pub(super) mod sue; -pub(super) mod toroko; -pub(super) mod weapon_trail; -pub(super) mod wind_fortress; diff --git a/src/scene/editor_scene.rs b/src/scene/editor_scene.rs index 7680307..ec757d5 100644 --- a/src/scene/editor_scene.rs +++ b/src/scene/editor_scene.rs @@ -4,14 +4,14 @@ use std::rc::Rc; use downcast::Downcast; use imgui::{Condition, MenuItem, TabItem, TabItemFlags, Window}; +use crate::{Context, GameResult, Scene, SharedGameState}; use crate::editor::{CurrentTool, EditorInstance}; use crate::framework::keyboard; use crate::framework::keyboard::ScanCode; use crate::framework::ui::Components; +use crate::game::stage::Stage; use crate::scene::game_scene::GameScene; use crate::scene::title_scene::TitleScene; -use crate::stage::Stage; -use crate::{Context, GameResult, Scene, SharedGameState}; struct ErrorList { errors: Vec, diff --git a/src/scene/game_scene.rs b/src/scene/game_scene.rs index a4b733b..1e7b527 100644 --- a/src/scene/game_scene.rs +++ b/src/scene/game_scene.rs @@ -4,8 +4,7 @@ use std::rc::Rc; use log::info; -use crate::caret::CaretType; -use crate::common::{interpolate_fix9_scale, Color, Direction, Rect}; +use crate::common::{Color, Direction, interpolate_fix9_scale, Rect}; use crate::components::background::Background; use crate::components::boss_life_bar::BossLifeBar; use crate::components::credits::Credits; @@ -24,34 +23,35 @@ use crate::components::tilemap::{TileLayer, Tilemap}; use crate::components::water_renderer::{WaterLayer, WaterRenderer}; use crate::components::whimsical_star::WhimsicalStar; use crate::entity::GameEntity; -use crate::frame::{Frame, UpdateTarget}; +use crate::framework::{filesystem, gamepad, graphics}; use crate::framework::backend::SpriteBatchCommand; use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::framework::graphics::{draw_rect, BlendMode, FilterMode}; +use crate::framework::graphics::{BlendMode, draw_rect, FilterMode}; use crate::framework::keyboard::ScanCode; use crate::framework::ui::Components; -use crate::framework::{filesystem, gamepad, graphics}; +use crate::game::caret::CaretType; +use crate::game::frame::{Frame, UpdateTarget}; +use crate::game::inventory::{Inventory, TakeExperienceResult}; +use crate::game::map::WaterParams; +use crate::game::physics::{OFFSETS, PhysicalEntity}; +use crate::game::settings::ControllerType; +use crate::game::shared_game_state::{CutsceneSkipMode, PlayerCount, ReplayState, SharedGameState, TileSize}; +use crate::game::stage::{BackgroundType, Stage, StageTexturePaths}; +use crate::graphics::texture_set::SpriteBatch; use crate::input::touch_controls::TouchControlType; -use crate::inventory::{Inventory, TakeExperienceResult}; -use crate::map::WaterParams; use crate::menu::pause_menu::PauseMenu; -use crate::npc::boss::BossNPC; -use crate::npc::list::NPCList; -use crate::npc::{NPCLayer, NPC}; -use crate::physics::{PhysicalEntity, OFFSETS}; -use crate::player::{ControlMode, Player, TargetPlayer}; -use crate::rng::RNG; -use crate::scene::title_scene::TitleScene; +use crate::game::npc::{NPC, NPCLayer}; +use crate::game::npc::boss::BossNPC; +use crate::game::npc::list::NPCList; +use crate::game::player::{ControlMode, Player, TargetPlayer}; use crate::scene::Scene; -use crate::scripting::tsc::credit_script::CreditScriptVM; -use crate::scripting::tsc::text_script::{ScriptMode, TextScriptExecutionState, TextScriptVM}; -use crate::settings::ControllerType; -use crate::shared_game_state::{CutsceneSkipMode, PlayerCount, ReplayState, SharedGameState, TileSize}; -use crate::stage::{BackgroundType, Stage, StageTexturePaths}; -use crate::texture_set::SpriteBatch; -use crate::weapon::bullet::BulletManager; -use crate::weapon::{Weapon, WeaponType}; +use crate::scene::title_scene::TitleScene; +use crate::game::scripting::tsc::credit_script::CreditScriptVM; +use crate::game::scripting::tsc::text_script::{ScriptMode, TextScriptExecutionState, TextScriptVM}; +use crate::util::rng::RNG; +use crate::game::weapon::{Weapon, WeaponType}; +use crate::game::weapon::bullet::BulletManager; pub struct GameScene { pub tick: u32, @@ -199,14 +199,14 @@ impl GameScene { if npc.layer != layer || npc.x < (self.frame.x - 128 * 0x200 - npc.display_bounds.width() as i32 * 0x200) || npc.x - > (self.frame.x - + 128 * 0x200 - + (state.canvas_size.0 as i32 + npc.display_bounds.width() as i32) * 0x200) - && npc.y < (self.frame.y - 128 * 0x200 - npc.display_bounds.height() as i32 * 0x200) + > (self.frame.x + + 128 * 0x200 + + (state.canvas_size.0 as i32 + npc.display_bounds.width() as i32) * 0x200) + && npc.y < (self.frame.y - 128 * 0x200 - npc.display_bounds.height() as i32 * 0x200) || npc.y - > (self.frame.y - + 128 * 0x200 - + (state.canvas_size.1 as i32 + npc.display_bounds.height() as i32) * 0x200) + > (self.frame.y + + 128 * 0x200 + + (state.canvas_size.1 as i32 + npc.display_bounds.height() as i32) * 0x200) { continue; } @@ -420,45 +420,45 @@ impl GameScene { && y >= bymth && y <= bypth) || ((tile == 0x50 || tile == 0x70) - && x >= bxmth - && x <= bxpth - && y <= ((by as f32 * tf) - (x - bx as f32 * tf) / 2.0 + tfq) - && y >= bymth) + && x >= bxmth + && x <= bxpth + && y <= ((by as f32 * tf) - (x - bx as f32 * tf) / 2.0 + tfq) + && y >= bymth) || ((tile == 0x51 || tile == 0x71) - && x >= bxmth - && x <= bxpth - && y <= ((by as f32 * tf) - (x - bx as f32 * tf) / 2.0 - tfq) - && y >= bymth) + && x >= bxmth + && x <= bxpth + && y <= ((by as f32 * tf) - (x - bx as f32 * tf) / 2.0 - tfq) + && y >= bymth) || ((tile == 0x52 || tile == 0x72) - && x >= bxmth - && x <= bxpth - && y <= ((by as f32 * tf) + (x - bx as f32 * tf) / 2.0 - tfq) - && y >= bymth) + && x >= bxmth + && x <= bxpth + && y <= ((by as f32 * tf) + (x - bx as f32 * tf) / 2.0 - tfq) + && y >= bymth) || ((tile == 0x53 || tile == 0x73) - && x >= bxmth - && x <= bxpth - && y <= ((by as f32 * tf) + (x - bx as f32 * tf) / 2.0 + tfq) - && y >= bymth) + && x >= bxmth + && x <= bxpth + && y <= ((by as f32 * tf) + (x - bx as f32 * tf) / 2.0 + tfq) + && y >= bymth) || ((tile == 0x54 || tile == 0x74) - && x >= bxmth - && x <= bxpth - && y >= ((by as f32 * tf) + (x - bx as f32 * tf) / 2.0 - tfq) - && y <= bypth) + && x >= bxmth + && x <= bxpth + && y >= ((by as f32 * tf) + (x - bx as f32 * tf) / 2.0 - tfq) + && y <= bypth) || ((tile == 0x55 || tile == 0x75) - && x >= bxmth - && x <= bxpth - && y >= ((by as f32 * tf) + (x - bx as f32 * tf) / 2.0 + tfq) - && y <= bypth) + && x >= bxmth + && x <= bxpth + && y >= ((by as f32 * tf) + (x - bx as f32 * tf) / 2.0 + tfq) + && y <= bypth) || ((tile == 0x56 || tile == 0x76) - && x >= bxmth - && x <= bxpth - && y >= ((by as f32 * tf) - (x - bx as f32 * tf) / 2.0 + tfq) - && y <= bypth) + && x >= bxmth + && x <= bxpth + && y >= ((by as f32 * tf) - (x - bx as f32 * tf) / 2.0 + tfq) + && y <= bypth) || ((tile == 0x57 || tile == 0x77) - && x >= bxmth - && x <= bxpth - && y >= ((by as f32 * tf) - (x - bx as f32 * tf) / 2.0 - tfq) - && y <= bypth) + && x >= bxmth + && x <= bxpth + && y >= ((by as f32 * tf) - (x - bx as f32 * tf) / 2.0 - tfq) + && y <= bypth) { continue 'ray; } @@ -501,14 +501,14 @@ impl GameScene { for npc in self.npc_list.iter_alive() { if npc.x < (self.frame.x - 128 * 0x200 - npc.display_bounds.width() as i32 * 0x200) || npc.x - > (self.frame.x - + 128 * 0x200 - + (state.canvas_size.0 as i32 + npc.display_bounds.width() as i32) * 0x200) - && npc.y < (self.frame.y - 128 * 0x200 - npc.display_bounds.height() as i32 * 0x200) + > (self.frame.x + + 128 * 0x200 + + (state.canvas_size.0 as i32 + npc.display_bounds.width() as i32) * 0x200) + && npc.y < (self.frame.y - 128 * 0x200 - npc.display_bounds.height() as i32 * 0x200) || npc.y - > (self.frame.y - + 128 * 0x200 - + (state.canvas_size.1 as i32 + npc.display_bounds.height() as i32) * 0x200) + > (self.frame.y + + 128 * 0x200 + + (state.canvas_size.1 as i32 + npc.display_bounds.height() as i32) * 0x200) { continue; } @@ -520,7 +520,7 @@ impl GameScene { let batch = state.texture_set.get_or_load_batch(ctx, &state.constants, "builtin/lightmap/spot")?; 'cc: for (player, inv) in - [(&self.player1, &self.inventory_player1), (&self.player2, &self.inventory_player2)].iter() + [(&self.player1, &self.inventory_player1), (&self.player2, &self.inventory_player2)].iter() { if player.cond.alive() && !player.cond.hidden() && inv.get_current_weapon().is_some() { if state.settings.light_cone { @@ -615,15 +615,15 @@ impl GameScene { for npc in self.npc_list.iter_alive() { if npc.cond.hidden() || (npc.x < (self.frame.x - 128 * 0x200 - npc.display_bounds.width() as i32 * 0x200) - || npc.x - > (self.frame.x - + 128 * 0x200 - + (state.canvas_size.0 as i32 + npc.display_bounds.width() as i32) * 0x200) - && npc.y < (self.frame.y - 128 * 0x200 - npc.display_bounds.height() as i32 * 0x200) - || npc.y - > (self.frame.y - + 128 * 0x200 - + (state.canvas_size.1 as i32 + npc.display_bounds.height() as i32) * 0x200)) + || npc.x + > (self.frame.x + + 128 * 0x200 + + (state.canvas_size.0 as i32 + npc.display_bounds.width() as i32) * 0x200) + && npc.y < (self.frame.y - 128 * 0x200 - npc.display_bounds.height() as i32 * 0x200) + || npc.y + > (self.frame.y + + 128 * 0x200 + + (state.canvas_size.1 as i32 + npc.display_bounds.height() as i32) * 0x200)) { continue; } @@ -1236,10 +1236,10 @@ impl GameScene { && (npc.y - npc.hit_bounds.top as i32) < (bullet.y + bullet.enemy_hit_height as i32) && (npc.y + npc.hit_bounds.bottom as i32) > (bullet.y - bullet.enemy_hit_height as i32)) || (npc.npc_flags.invulnerable() - && (npc.x - npc.hit_bounds.right as i32) < (bullet.x + bullet.hit_bounds.right as i32) - && (npc.x + npc.hit_bounds.right as i32) > (bullet.x - bullet.hit_bounds.left as i32) - && (npc.y - npc.hit_bounds.top as i32) < (bullet.y + bullet.hit_bounds.bottom as i32) - && (npc.y + npc.hit_bounds.bottom as i32) > (bullet.y - bullet.hit_bounds.top as i32)); + && (npc.x - npc.hit_bounds.right as i32) < (bullet.x + bullet.hit_bounds.right as i32) + && (npc.x + npc.hit_bounds.right as i32) > (bullet.x - bullet.hit_bounds.left as i32) + && (npc.y - npc.hit_bounds.top as i32) < (bullet.y + bullet.hit_bounds.bottom as i32) + && (npc.y + npc.hit_bounds.bottom as i32) > (bullet.y - bullet.hit_bounds.top as i32)); if !hit { continue; @@ -1544,10 +1544,10 @@ impl GameScene { ) -> GameResult { if entity.x() < (self.frame.x - 128 - entity.display_bounds().width() as i32 * 0x200) || entity.x() - > (self.frame.x + 128 + (state.canvas_size.0 as i32 + entity.display_bounds().width() as i32) * 0x200) - && entity.y() < (self.frame.y - 128 - entity.display_bounds().height() as i32 * 0x200) + > (self.frame.x + 128 + (state.canvas_size.0 as i32 + entity.display_bounds().width() as i32) * 0x200) + && entity.y() < (self.frame.y - 128 - entity.display_bounds().height() as i32 * 0x200) || entity.y() - > (self.frame.y + 128 + (state.canvas_size.1 as i32 + entity.display_bounds().height() as i32) * 0x200) + > (self.frame.y + 128 + (state.canvas_size.1 as i32 + entity.display_bounds().height() as i32) * 0x200) { return Ok(()); } @@ -1653,7 +1653,7 @@ impl Scene for GameScene { state.textscript_vm.suspend = false; state.tile_size = self.stage.map.tile_size; #[cfg(feature = "scripting-lua")] - state.lua.set_game_scene(self as *mut _); + state.lua.set_game_scene(self as *mut _); self.player1.controller = state.settings.create_player1_controller(); self.player2.controller = state.settings.create_player2_controller(); @@ -1702,24 +1702,24 @@ impl Scene for GameScene { _ if self.intro_mode => LightingMode::None, _ if !state.constants.is_switch && (self.stage.data.background_type == BackgroundType::Black - || self.stage.data.background.name() == "bkBlack") => - { - LightingMode::Ambient - } + || self.stage.data.background.name() == "bkBlack") => + { + LightingMode::Ambient + } _ if state.constants.is_switch && (self.stage.data.background_type == BackgroundType::Black - || self.stage.data.background.name() == "bkBlack") => - { - LightingMode::None - } + || self.stage.data.background.name() == "bkBlack") => + { + LightingMode::None + } _ if self.stage.data.background.name() == "bkFall" => LightingMode::None, _ if self.stage.data.background_type != BackgroundType::Black && self.stage.data.background_type != BackgroundType::Outside && self.stage.data.background_type != BackgroundType::OutsideWind && self.stage.data.background.name() != "bkBlack" => - { - LightingMode::BackgroundOnly - } + { + LightingMode::BackgroundOnly + } _ => LightingMode::None, }; @@ -1795,31 +1795,31 @@ impl Scene for GameScene { | TextScriptExecutionState::Msg(_, _, _, _) | TextScriptExecutionState::MsgNewLine(_, _, _, _, _) | TextScriptExecutionState::FallingIsland(_, _, _, _, _, _) - if !state.control_flags.control_enabled() => - { - state.touch_controls.control_type = TouchControlType::Dialog; - match state.settings.cutscene_skip_mode { - CutsceneSkipMode::Hold if !state.textscript_vm.flags.cutscene_skip() => { - if self.player1.controller.skip() { - self.skip_counter += 1; - if self.skip_counter >= CUTSCENE_SKIP_WAIT { - state.textscript_vm.flags.set_cutscene_skip(true); - state.tutorial_counter = 0; + if !state.control_flags.control_enabled() => + { + state.touch_controls.control_type = TouchControlType::Dialog; + match state.settings.cutscene_skip_mode { + CutsceneSkipMode::Hold if !state.textscript_vm.flags.cutscene_skip() => { + if self.player1.controller.skip() { + self.skip_counter += 1; + if self.skip_counter >= CUTSCENE_SKIP_WAIT { + state.textscript_vm.flags.set_cutscene_skip(true); + state.tutorial_counter = 0; + } + } else if self.skip_counter > 0 { + self.skip_counter -= 1; } - } else if self.skip_counter > 0 { - self.skip_counter -= 1; } - } - CutsceneSkipMode::FastForward => { - if self.player1.controller.skip() { - state.textscript_vm.flags.set_cutscene_skip(true); - } else { - state.textscript_vm.flags.set_cutscene_skip(false); + CutsceneSkipMode::FastForward => { + if self.player1.controller.skip() { + state.textscript_vm.flags.set_cutscene_skip(true); + } else { + state.textscript_vm.flags.set_cutscene_skip(false); + } } + _ => (), } - _ => (), } - } _ => { self.skip_counter = 0; } @@ -1864,7 +1864,7 @@ impl Scene for GameScene { self.text_boxes.tick(state, ())?; #[cfg(feature = "scripting-lua")] - state.lua.scene_tick(); + state.lua.scene_tick(); if state.control_flags.tick_world() { self.tick = self.tick.wrapping_add(1); @@ -1938,13 +1938,13 @@ impl Scene for GameScene { self.inventory_dim += 0.1 * if state.textscript_vm.mode == ScriptMode::Inventory - || state.textscript_vm.state == TextScriptExecutionState::MapSystem - || self.pause_menu.is_paused() - { - state.frame_time as f32 - } else { - -(state.frame_time as f32) - }; + || state.textscript_vm.state == TextScriptExecutionState::MapSystem + || self.pause_menu.is_paused() + { + state.frame_time as f32 + } else { + -(state.frame_time as f32) + }; self.inventory_dim = self.inventory_dim.clamp(0.0, 1.0); self.background.draw_tick()?; @@ -2060,8 +2060,8 @@ impl Scene for GameScene { } else if self.player2.y - 0x1000 > self.frame.y + state.canvas_size.1 as i32 * 0x200 { let scale = 1.0 + (self.player2.y as f32 / (self.frame.y as f32 + state.canvas_size.1 * 0x200 as f32) - - 0.5) - .clamp(0.0, 2.0); + - 0.5) + .clamp(0.0, 2.0); let x = interpolate_fix9_scale( self.player2.prev_x - self.frame.prev_x, @@ -2132,8 +2132,8 @@ impl Scene for GameScene { } else if self.player2.x - 0x1000 > self.frame.x + state.canvas_size.0 as i32 * 0x200 { let scale = 1.0 + (self.player2.x as f32 / (self.frame.x as f32 + state.canvas_size.0 * 0x200 as f32) - - 0.5) - .clamp(0.0, 2.0); + - 0.5) + .clamp(0.0, 2.0); let y = interpolate_fix9_scale( self.player2.prev_y - self.frame.prev_y, diff --git a/src/scene/jukebox_scene.rs b/src/scene/jukebox_scene.rs index 757689a..6b4ed32 100644 --- a/src/scene/jukebox_scene.rs +++ b/src/scene/jukebox_scene.rs @@ -3,17 +3,18 @@ use itertools::Itertools; use crate::common::Color; use crate::common::Rect; use crate::components::background::Background; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::filesystem; +use crate::game::frame::Frame; +use crate::game::map::Map; +use crate::game::settings::ControllerType; +use crate::game::shared_game_state::{SharedGameState, TileSize}; +use crate::game::stage::{BackgroundType, NpcType, Stage, StageData, StageTexturePaths, Tileset}; use crate::input::combined_menu_controller::CombinedMenuController; -use crate::map::Map; -use crate::scene::title_scene::TitleScene; use crate::scene::Scene; -use crate::settings::ControllerType; -use crate::shared_game_state::{SharedGameState, TileSize}; -use crate::stage::{BackgroundType, NpcType, Stage, StageData, StageTexturePaths, Tileset}; +use crate::scene::title_scene::TitleScene; + pub struct JukeboxScene { selected_song: u16, song_list: Vec, @@ -38,7 +39,7 @@ impl JukeboxScene { boss_no: 0, tileset: Tileset { name: "0".to_string() }, pxpack_data: None, - background: crate::stage::Background::new("bkMoon"), + background: crate::game::stage::Background::new("bkMoon"), background_type: BackgroundType::Outside, background_color: Color { r: 0.0, g: 0.0, b: 0.0, a: 0.0 }, npc1: NpcType::new("0"), @@ -113,16 +114,16 @@ impl Scene for JukeboxScene { let mut song = self.selected_song as i16 + if self.controller.trigger_right() { - 1 - } else if self.controller.trigger_left() { - -1 - } else if self.controller.trigger_down() { - 8 - } else if self.controller.trigger_up() { - -8 - } else { - 0 - }; + 1 + } else if self.controller.trigger_left() { + -1 + } else if self.controller.trigger_down() { + 8 + } else if self.controller.trigger_up() { + -8 + } else { + 0 + }; if song < 0 { song += self.song_list.len() as i16; diff --git a/src/scene/loading_scene.rs b/src/scene/loading_scene.rs index 5c19904..a8feb90 100644 --- a/src/scene/loading_scene.rs +++ b/src/scene/loading_scene.rs @@ -1,9 +1,9 @@ use crate::framework::context::Context; use crate::framework::error::GameResult; -use crate::graphics; +use crate::framework::graphics; +use crate::game::shared_game_state::SharedGameState; use crate::scene::no_data_scene::NoDataScene; use crate::scene::Scene; -use crate::shared_game_state::SharedGameState; pub struct LoadingScene { tick: usize, diff --git a/src/scene/mod.rs b/src/scene/mod.rs index 4943159..838b121 100644 --- a/src/scene/mod.rs +++ b/src/scene/mod.rs @@ -2,7 +2,7 @@ use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::keyboard::ScanCode; use crate::framework::ui::Components; -use crate::shared_game_state::SharedGameState; +use crate::game::shared_game_state::SharedGameState; #[cfg(feature = "editor")] pub mod editor_scene; diff --git a/src/scene/no_data_scene.rs b/src/scene/no_data_scene.rs index 8f47f2c..993c96d 100644 --- a/src/scene/no_data_scene.rs +++ b/src/scene/no_data_scene.rs @@ -1,7 +1,7 @@ use crate::framework::context::Context; use crate::framework::error::{GameError, GameResult}; +use crate::game::shared_game_state::SharedGameState; use crate::scene::Scene; -use crate::shared_game_state::SharedGameState; pub struct NoDataScene { #[cfg(target_os = "android")] @@ -26,23 +26,23 @@ impl Scene for NoDataScene { #[allow(unused)] fn tick(&mut self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult { #[cfg(target_os = "android")] - { - use crate::common::Rect; + { + use crate::common::Rect; - if !self.flag { - self.flag = true; - let _ = std::fs::create_dir("/sdcard/doukutsu/"); - let _ = std::fs::write("/sdcard/doukutsu/extract game data here.txt", REL_URL); - let _ = std::fs::write("/sdcard/doukutsu/.nomedia", b""); - } + if !self.flag { + self.flag = true; + let _ = std::fs::create_dir("/sdcard/doukutsu/"); + let _ = std::fs::write("/sdcard/doukutsu/extract game data here.txt", REL_URL); + let _ = std::fs::write("/sdcard/doukutsu/.nomedia", b""); + } - let screen = Rect::new(0, 0, state.canvas_size.0 as isize, state.canvas_size.1 as isize); - if state.touch_controls.consume_click_in(screen) { - if let Err(err) = webbrowser::open(REL_URL) { - self.err = err.to_string(); + let screen = Rect::new(0, 0, state.canvas_size.0 as isize, state.canvas_size.1 as isize); + if state.touch_controls.consume_click_in(screen) { + if let Err(err) = webbrowser::open(REL_URL) { + self.err = err.to_string(); + } } } - } Ok(()) } @@ -76,43 +76,43 @@ impl Scene for NoDataScene { } #[cfg(target_os = "android")] - { - let ftl = "It's likely that you haven't extracted the game data properly."; - let ftl2 = "Click here to open the guide."; - let ftl_width = state.font.text_width(ftl.chars().clone(), &state.constants); - let ftl2_width = state.font.text_width(ftl2.chars().clone(), &state.constants); - let ftl3_width = state.font.text_width(REL_URL.chars().clone(), &state.constants); + { + let ftl = "It's likely that you haven't extracted the game data properly."; + let ftl2 = "Click here to open the guide."; + let ftl_width = state.font.text_width(ftl.chars().clone(), &state.constants); + let ftl2_width = state.font.text_width(ftl2.chars().clone(), &state.constants); + let ftl3_width = state.font.text_width(REL_URL.chars().clone(), &state.constants); - state.font.draw_colored_text( - ftl.chars(), - (state.canvas_size.0 - ftl_width) / 2.0, - 60.0, - (255, 255, 0, 255), - &state.constants, - &mut state.texture_set, - ctx, - )?; + state.font.draw_colored_text( + ftl.chars(), + (state.canvas_size.0 - ftl_width) / 2.0, + 60.0, + (255, 255, 0, 255), + &state.constants, + &mut state.texture_set, + ctx, + )?; - state.font.draw_colored_text( - ftl2.chars(), - (state.canvas_size.0 - ftl2_width) / 2.0, - 80.0, - (255, 255, 0, 255), - &state.constants, - &mut state.texture_set, - ctx, - )?; + state.font.draw_colored_text( + ftl2.chars(), + (state.canvas_size.0 - ftl2_width) / 2.0, + 80.0, + (255, 255, 0, 255), + &state.constants, + &mut state.texture_set, + ctx, + )?; - state.font.draw_colored_text( - REL_URL.chars(), - (state.canvas_size.0 - ftl3_width) / 2.0, - 100.0, - (255, 255, 0, 255), - &state.constants, - &mut state.texture_set, - ctx, - )?; - } + state.font.draw_colored_text( + REL_URL.chars(), + (state.canvas_size.0 - ftl3_width) / 2.0, + 100.0, + (255, 255, 0, 255), + &state.constants, + &mut state.texture_set, + ctx, + )?; + } { let err_width = state.font.text_width(self.err.chars().clone(), &state.constants); diff --git a/src/scene/title_scene.rs b/src/scene/title_scene.rs index 1670880..73e2cff 100644 --- a/src/scene/title_scene.rs +++ b/src/scene/title_scene.rs @@ -2,22 +2,22 @@ use crate::common::{Color, VERSION_BANNER}; use crate::components::background::Background; use crate::components::nikumaru::NikumaruCounter; use crate::entity::GameEntity; -use crate::frame::Frame; use crate::framework::context::Context; use crate::framework::error::GameResult; +use crate::game::frame::Frame; +use crate::game::map::Map; +use crate::game::shared_game_state::{ + GameDifficulty, MenuCharacter, ReplayKind, ReplayState, Season, SharedGameState, TileSize, +}; +use crate::game::stage::{BackgroundType, NpcType, Stage, StageData, StageTexturePaths, Tileset}; use crate::input::combined_menu_controller::CombinedMenuController; use crate::input::touch_controls::TouchControlType; -use crate::map::Map; +use crate::menu::{Menu, MenuEntry, MenuSelectionResult}; use crate::menu::coop_menu::PlayerCountMenu; use crate::menu::save_select_menu::SaveSelectMenu; use crate::menu::settings_menu::SettingsMenu; -use crate::menu::{Menu, MenuEntry, MenuSelectionResult}; use crate::scene::jukebox_scene::JukeboxScene; use crate::scene::Scene; -use crate::shared_game_state::{ - GameDifficulty, MenuCharacter, ReplayKind, ReplayState, Season, SharedGameState, TileSize, -}; -use crate::stage::{BackgroundType, NpcType, Stage, StageData, StageTexturePaths, Tileset}; #[derive(PartialEq, Eq, Copy, Clone)] #[repr(u8)] @@ -102,7 +102,7 @@ impl TitleScene { boss_no: 0, tileset: Tileset { name: "0".to_string() }, pxpack_data: None, - background: crate::stage::Background::new("bkMoon"), + background: crate::game::stage::Background::new("bkMoon"), background_type: BackgroundType::Outside, background_color: Color { r: 0.0, g: 0.0, b: 0.0, a: 0.0 }, npc1: NpcType::new("0"), @@ -184,7 +184,8 @@ impl TitleScene { } } -static COPYRIGHT_PIXEL: &str = "2004.12 Studio Pixel"; // Freeware +static COPYRIGHT_PIXEL: &str = "2004.12 Studio Pixel"; +// Freeware static COPYRIGHT_NICALIS: &str = "@2022 NICALIS INC."; // Nicalis font uses @ for copyright impl Scene for TitleScene { @@ -303,10 +304,10 @@ impl Scene for TitleScene { MenuSelectionResult::Selected(MainMenuEntry::Editor, _) => { // this comment is just there because rustfmt removes parenthesis around the match case and breaks compilation #[cfg(feature = "editor")] - { - use crate::scene::editor_scene::EditorScene; - state.next_scene = Some(Box::new(EditorScene::new())); - } + { + use crate::scene::editor_scene::EditorScene; + state.next_scene = Some(Box::new(EditorScene::new())); + } } MenuSelectionResult::Selected(MainMenuEntry::Jukebox, _) => { state.next_scene = Some(Box::new(JukeboxScene::new())); @@ -459,11 +460,11 @@ impl Scene for TitleScene { batch.draw(ctx)?; } else { let window_title = match self.current_menu { - CurrentMenu::ChallengesMenu => (state.t("menus.main_menu.challenges")), - CurrentMenu::ChallengeConfirmMenu | CurrentMenu::SaveSelectMenu => (state.t("menus.main_menu.start")), - CurrentMenu::OptionMenu => (state.t("menus.main_menu.options")), + CurrentMenu::ChallengesMenu => state.t("menus.main_menu.challenges"), + CurrentMenu::ChallengeConfirmMenu | CurrentMenu::SaveSelectMenu => state.t("menus.main_menu.start"), + CurrentMenu::OptionMenu => state.t("menus.main_menu.options"), CurrentMenu::MainMenu => unreachable!(), - CurrentMenu::PlayerCountMenu => (state.t("menus.main_menu.start")), + CurrentMenu::PlayerCountMenu => state.t("menus.main_menu.start"), }; state.font.draw_colored_text_with_shadow_scaled( window_title.chars(), diff --git a/src/scripting/lua/tsconfig.json b/src/scripting/lua/tsconfig.json deleted file mode 100644 index 99b6719..0000000 --- a/src/scripting/lua/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "files": [ - "doukutsu.d.ts" - ], - "compilerOptions": { - "module": "commonjs", - "target": "es6", - "lib": [ - "es2018" - ], - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "baseUrl": "./", - "typeRoots": [ - "./" - ], - "types": [], - "noEmit": true, - "forceConsistentCasingInFileNames": true - } -} diff --git a/src/shaders.rs b/src/shaders.rs deleted file mode 100644 index 11f0130..0000000 --- a/src/shaders.rs +++ /dev/null @@ -1,39 +0,0 @@ -use gfx::{self, *}; - -use crate::framework::context::Context; -use crate::framework::error::GameResult; - -gfx_defines! { - constant WaterShaderParams { - resolution: [f32; 2] = "u_Resolution", - frame_pos: [f32; 2] = "u_FramePos", - t: f32 = "u_Tick", - } -} - -pub struct Shaders { - //pub water_shader: Shader, - pub water_shader_params: WaterShaderParams, -} - -impl Shaders { - pub fn new(ctx: &mut Context) -> GameResult { - let water_shader_params = WaterShaderParams { - t: 0.0, - resolution: [0.0, 0.0], - frame_pos: [0.0, 0.0], - }; - - Ok(Shaders { - /*water_shader: Shader::new( - ctx, - "/builtin/shaders/basic_es300.vert.glsl", - "/builtin/shaders/water_es300.frag.glsl", - water_shader_params, - "WaterShaderParams", - None, - )?,*/ - water_shader_params, - }) - } -} diff --git a/src/sound/mod.rs b/src/sound/mod.rs index 84a9acc..8e42d8e 100644 --- a/src/sound/mod.rs +++ b/src/sound/mod.rs @@ -4,19 +4,19 @@ use std::str::FromStr; use std::sync::mpsc; use std::sync::mpsc::{Receiver, Sender}; -use cpal::traits::{DeviceTrait, HostTrait, StreamTrait}; use cpal::Sample; +use cpal::traits::{DeviceTrait, HostTrait, StreamTrait}; #[cfg(feature = "ogg-playback")] use lewton::inside_ogg::OggStreamReader; use num_traits::clamp; use crate::engine_constants::EngineConstants; use crate::framework::context::Context; -use crate::framework::error::GameError::{AudioError, InvalidValue}; use crate::framework::error::{GameError, GameResult}; +use crate::framework::error::GameError::{AudioError, InvalidValue}; use crate::framework::filesystem; use crate::framework::filesystem::File; -use crate::settings::Settings; +use crate::game::settings::Settings; #[cfg(feature = "ogg-playback")] use crate::sound::ogg_playback::{OggPlaybackEngine, SavedOggPlaybackState}; use crate::sound::org_playback::{OrgPlaybackEngine, SavedOrganyaPlaybackState}; @@ -274,19 +274,19 @@ impl SoundManager { paths.insert(0, "/Soundtracks/".to_owned() + &settings.soundtrack + "/"); if let Some(soundtrack) = - constants.soundtracks.iter().find(|s| s.available && s.name == settings.soundtrack) + constants.soundtracks.iter().find(|s| s.available && s.name == settings.soundtrack) { paths.insert(0, soundtrack.path.clone()); } let songs_paths = paths.iter().map(|prefix| { [ - #[cfg(feature = "ogg-playback")] + #[cfg(feature = "ogg-playback")] ( SongFormat::OggMultiPart, vec![format!("{}{}_intro.ogg", prefix, song_name), format!("{}{}_loop.ogg", prefix, song_name)], ), - #[cfg(feature = "ogg-playback")] + #[cfg(feature = "ogg-playback")] (SongFormat::OggSinglePart, vec![format!("{}{}.ogg", prefix, song_name)]), (SongFormat::Organya, vec![format!("{}{}.org", prefix, song_name)]), ] @@ -294,7 +294,7 @@ impl SoundManager { for songs in songs_paths { for (format, paths) in - songs.iter().filter(|(_, paths)| paths.iter().all(|path| filesystem::exists(ctx, path))) + songs.iter().filter(|(_, paths)| paths.iter().all(|path| filesystem::exists(ctx, path))) { match format { SongFormat::Organya => { @@ -372,7 +372,7 @@ impl SoundManager { Box::new(song_intro), Box::new(song_loop), )) - .unwrap(); + .unwrap(); return Ok(()); } @@ -583,8 +583,8 @@ fn run( device: cpal::Device, config: cpal::StreamConfig, ) -> GameResult -where - T: cpal::Sample, + where + T: cpal::Sample, { let sample_rate = config.sample_rate.0 as f32; let channels = config.channels as usize; @@ -593,17 +593,17 @@ where let mut speed = 1.0; let mut org_engine = Box::new(OrgPlaybackEngine::new()); #[cfg(feature = "ogg-playback")] - let mut ogg_engine = Box::new(OggPlaybackEngine::new()); + let mut ogg_engine = Box::new(OggPlaybackEngine::new()); let mut pixtone = Box::new(PixTonePlayback::new()); pixtone.create_samples(); log::info!("Audio format: {} {}", sample_rate, channels); org_engine.set_sample_rate(sample_rate as usize); #[cfg(feature = "ogg-playback")] - { - org_engine.loops = usize::MAX; - ogg_engine.set_sample_rate(sample_rate as usize); - } + { + org_engine.loops = usize::MAX; + ogg_engine.set_sample_rate(sample_rate as usize); + } let buf_size = sample_rate as usize * 10 / 1000; let mut bgm_buf = vec![0x8080; buf_size * 2]; @@ -693,7 +693,7 @@ where assert!(new_speed > 0.0); speed = new_speed; #[cfg(feature = "ogg-playback")] - ogg_engine.set_sample_rate((sample_rate / new_speed) as usize); + ogg_engine.set_sample_rate((sample_rate / new_speed) as usize); org_engine.set_sample_rate((sample_rate / new_speed) as usize); } Ok(PlaybackMessage::SetSongVolume(new_volume)) => { diff --git a/src/sound/org_playback.rs b/src/sound/org_playback.rs index efeb37e..7ed63a5 100644 --- a/src/sound/org_playback.rs +++ b/src/sound/org_playback.rs @@ -4,11 +4,11 @@ use std::mem::MaybeUninit; use crate::sound::fir::FIR; use crate::sound::fir::FIR_STEP; +use crate::sound::InterpolationMode; use crate::sound::organya::{Song as Organya, Version}; use crate::sound::stuff::*; use crate::sound::wav::*; use crate::sound::wave_bank::SoundBank; -use crate::sound::InterpolationMode; #[derive(Clone)] pub struct FIRData { diff --git a/src/sound/wav.rs b/src/sound/wav.rs index 85a1f47..6689c6d 100644 --- a/src/sound/wav.rs +++ b/src/sound/wav.rs @@ -2,7 +2,7 @@ use std::fmt; use std::io; use std::io::ErrorKind; -use byteorder::{ReadBytesExt, LE}; +use byteorder::{LE, ReadBytesExt}; #[derive(Copy, Clone, Eq, PartialEq, Debug)] pub struct RiffChunk { @@ -76,7 +76,7 @@ impl WavSample { b"RIFF" => {} b"RIFX" => return Err(io::Error::new(ErrorKind::InvalidData, "Cannot handle RIFX data!".to_owned())), _ => { - return Err(io::Error::new(ErrorKind::InvalidData, format!("Expected RIFF signature, found {}", riff))) + return Err(io::Error::new(ErrorKind::InvalidData, format!("Expected RIFF signature, found {}", riff))); } } diff --git a/src/util/bitvec.rs b/src/util/bitvec.rs new file mode 100644 index 0000000..f1c4620 --- /dev/null +++ b/src/util/bitvec.rs @@ -0,0 +1,93 @@ +pub struct BitVec { + bits: Vec, + len: usize, +} + +impl BitVec { + pub fn new() -> BitVec { + BitVec { bits: Vec::new(), len: 0 } + } + + pub fn with_capacity(capacity: usize) -> BitVec { + BitVec { bits: Vec::with_capacity(capacity), len: 0 } + } + + pub fn with_size(size: usize) -> BitVec { + let mut bits = Vec::with_capacity(size / 8 + 1); + for _ in 0..bits.capacity() { + bits.push(0); + } + + BitVec { bits, len: size } + } + + pub fn get(&self, index: usize) -> Option { + if index >= self.len { + None + } else { + unsafe { Some(*self.bits.get_unchecked(index / 8) & (1 << (index % 8)) != 0) } + } + } + + pub fn set(&mut self, index: usize, bit: bool) { + assert!(index < self.len); + if bit { + self.bits[index / 8] |= 1 << (index % 8); + } else { + self.bits[index / 8] &= !(1 << (index % 8)); + } + } + + pub fn resize(&mut self, new_size: usize) { + if new_size > self.len { + let new_capacity = new_size / 8 + 1; + if new_capacity > self.bits.capacity() { + self.bits.reserve(new_capacity - self.bits.capacity()); + } + for _ in 0..new_capacity - self.bits.len() { + self.bits.push(0); + } + } + self.len = new_size; + } + + pub fn len(&self) -> usize { + self.len + } + + pub fn capacity(&self) -> usize { + self.bits.capacity() * 8 + } + + pub fn iter(&self) -> BitVecIter { + BitVecIter { bitvec: self, index: 0 } + } + + pub fn copy_to_slice(&self, slice: &mut [u8]) -> usize { + let count = std::cmp::min(self.len / 8, slice.len()); + for i in 0..count { + slice[i] = self.bits[i]; + } + + count + } +} + +pub struct BitVecIter<'a> { + bitvec: &'a BitVec, + index: usize, +} + +impl<'a> Iterator for BitVecIter<'a> { + type Item = bool; + + fn next(&mut self) -> Option { + if self.index >= self.bitvec.len { + None + } else { + let bit = self.bitvec.get(self.index).unwrap(); + self.index += 1; + Some(bit) + } + } +} diff --git a/src/encoding.rs b/src/util/encoding.rs similarity index 99% rename from src/encoding.rs rename to src/util/encoding.rs index aacbfc7..b549044 100644 --- a/src/encoding.rs +++ b/src/util/encoding.rs @@ -4,7 +4,7 @@ use byteorder::ReadBytesExt; /// Decodes UTF-8 character in a less strict way. /// http://simonsapin.github.io/wtf-8/#decoding-wtf-8 -pub fn read_cur_wtf8>(cursor: &mut Cursor, max_bytes: u32) -> (u32, char) { +pub fn read_cur_wtf8>(cursor: &mut Cursor, max_bytes: u32) -> (u32, char) { let result: u32; let consumed: u32; diff --git a/src/util/mod.rs b/src/util/mod.rs new file mode 100644 index 0000000..66084cd --- /dev/null +++ b/src/util/mod.rs @@ -0,0 +1,3 @@ +pub mod bitvec; +pub mod encoding; +pub mod rng; diff --git a/src/rng.rs b/src/util/rng.rs similarity index 98% rename from src/rng.rs rename to src/util/rng.rs index 06a3bb6..a9f58ef 100644 --- a/src/rng.rs +++ b/src/util/rng.rs @@ -1,5 +1,5 @@ use std::cell::Cell; -use std::ops::{Range}; +use std::ops::Range; pub trait RNG { fn next(&self) -> i32; diff --git a/src/vanilla.rs b/src/vanilla.rs deleted file mode 100644 index 24d24c5..0000000 --- a/src/vanilla.rs +++ /dev/null @@ -1,209 +0,0 @@ -use std::{ - env, - io::{Read, Write}, - ops::Range, - path::PathBuf, -}; - -use byteorder::{WriteBytesExt, LE}; - -use crate::{ - exe_parser::ExeParser, - framework::{ - context::Context, - error::{GameError::ParseError, GameResult}, - filesystem, - }, -}; - -pub struct VanillaExtractor { - exe_buffer: Vec, - data_base_dir: String, -} - -const VANILLA_STAGE_COUNT: u32 = 95; -const VANILLA_STAGE_ENTRY_SIZE: u32 = 0xC8; -const VANILLA_STAGE_OFFSET: u32 = 0x937B0; -const VANILLA_STAGE_TABLE_SIZE: u32 = VANILLA_STAGE_COUNT * VANILLA_STAGE_ENTRY_SIZE; - -impl VanillaExtractor { - pub fn from(ctx: &mut Context, exe_name: String, data_base_dir: String) -> Option { - let mut vanilla_exe_path = env::current_exe().unwrap(); - vanilla_exe_path.pop(); - vanilla_exe_path.push(exe_name); - - if !vanilla_exe_path.is_file() { - return None; - } - - log::info!("Found vanilla game executable, attempting to extract resources."); - - if filesystem::exists(ctx, format!("{}/stage.sect", data_base_dir.clone())) { - log::info!("Vanilla resources are already extracted, not proceeding."); - return None; - } - - let file = std::fs::File::open(vanilla_exe_path); - if file.is_err() { - log::error!("Failed to open vanilla game executable: {}", file.unwrap_err()); - return None; - } - - let mut exe_buffer = Vec::new(); - let result = file.unwrap().read_to_end(&mut exe_buffer); - if result.is_err() { - log::error!("Failed to read vanilla game executable: {}", result.unwrap_err()); - return None; - } - - Some(Self { exe_buffer, data_base_dir }) - } - - pub fn extract_data(&self) -> GameResult { - let parser = ExeParser::from(&self.exe_buffer); - if parser.is_err() { - return Err(ParseError("Failed to create vanilla parser.".to_string())); - } - - let parser = parser.unwrap(); - - self.extract_organya(&parser)?; - self.extract_bitmaps(&parser)?; - self.extract_stage_table(&parser)?; - - Ok(()) - } - - fn deep_create_dir_if_not_exists(&self, path: PathBuf) -> GameResult { - if path.is_dir() { - return Ok(()); - } - - let result = std::fs::create_dir_all(path); - if result.is_err() { - return Err(ParseError(format!("Failed to create directory structure: {}", result.unwrap_err()))); - } - - Ok(()) - } - - fn extract_organya(&self, parser: &ExeParser) -> GameResult { - let orgs = parser.get_resource_dir("ORG".to_string()); - - if orgs.is_err() { - return Err(ParseError("Failed to retrieve Organya resource directory.".to_string())); - } - - for org in orgs.unwrap().data_files { - let mut org_path = env::current_exe().unwrap(); - org_path.pop(); - org_path.push(self.data_base_dir.clone()); - org_path.push("Org/"); - - if self.deep_create_dir_if_not_exists(org_path.clone()).is_err() { - return Err(ParseError("Failed to create directory structure.".to_string())); - } - - org_path.push(format!("{}.org", org.name)); - - let mut org_file = match std::fs::File::create(org_path) { - Ok(file) => file, - Err(_) => { - return Err(ParseError("Failed to create organya file.".to_string())); - } - }; - - let result = org_file.write_all(&org.bytes); - if result.is_err() { - return Err(ParseError("Failed to write organya file.".to_string())); - } - - log::info!("Extracted organya file: {}", org.name); - } - - Ok(()) - } - - fn extract_bitmaps(&self, parser: &ExeParser) -> GameResult { - let bitmaps = parser.get_bitmap_dir(); - - if bitmaps.is_err() { - return Err(ParseError("Failed to retrieve bitmap directory.".to_string())); - } - - for bitmap in bitmaps.unwrap().data_files { - let mut data_path = env::current_exe().unwrap(); - data_path.pop(); - data_path.push(self.data_base_dir.clone()); - - if self.deep_create_dir_if_not_exists(data_path.clone()).is_err() { - return Err(ParseError("Failed to create data directory structure.".to_string())); - } - - data_path.push(format!("{}.pbm", bitmap.name)); - - let file = std::fs::File::create(data_path); - if file.is_err() { - return Err(ParseError("Failed to create bitmap file.".to_string())); - } - - let mut file = file.unwrap(); - - file.write_u8(0x42)?; // B - file.write_u8(0x4D)?; // M - file.write_u32::(bitmap.bytes.len() as u32 + 0xE)?; // Size of BMP file - file.write_u32::(0)?; // unused null bytes - file.write_u32::(0x76)?; // Bitmap data offset (hardcoded for now, might wanna get the actual offset) - - let result = file.write_all(&bitmap.bytes); - if result.is_err() { - return Err(ParseError("Failed to write bitmap file.".to_string())); - } - - log::info!("Extracted bitmap file: {}", bitmap.name); - } - - Ok(()) - } - - fn extract_stage_table(&self, parser: &ExeParser) -> GameResult { - let range = parser.get_named_section_byte_range(".csmap".to_string()); - if range.is_err() { - return Err(ParseError("Failed to retrieve stage table from executable.".to_string())); - } - - let range = match range.unwrap() { - Some(range) => range, - None => Range { start: VANILLA_STAGE_OFFSET, end: VANILLA_STAGE_OFFSET + VANILLA_STAGE_TABLE_SIZE }, - }; - - let start = range.start as usize; - let end = range.end as usize; - - let byte_slice = &self.exe_buffer[start..end]; - - let mut stage_tbl_path = env::current_exe().unwrap(); - stage_tbl_path.pop(); - stage_tbl_path.push(self.data_base_dir.clone()); - - if self.deep_create_dir_if_not_exists(stage_tbl_path.clone()).is_err() { - return Err(ParseError("Failed to create data directory structure.".to_string())); - } - - stage_tbl_path.push("stage.sect"); - - let mut stage_tbl_file = match std::fs::File::create(stage_tbl_path) { - Ok(file) => file, - Err(_) => { - return Err(ParseError("Failed to create stage table file.".to_string())); - } - }; - - let result = stage_tbl_file.write_all(byte_slice); - if result.is_err() { - return Err(ParseError("Failed to write to stage table file.".to_string())); - } - - Ok(()) - } -}