pyglet update
This commit is contained in:
parent
b40d6fb30b
commit
55f3d362c6
@ -65,7 +65,7 @@ MOD_info = MODInfo(
|
|||||||
write_loader_version=semver_loader_version
|
write_loader_version=semver_loader_version
|
||||||
)
|
)
|
||||||
|
|
||||||
print(MOD_info.serialize())
|
# print(MOD_info.serialize())
|
||||||
|
|
||||||
"""
|
"""
|
||||||
一些重置用函数
|
一些重置用函数
|
||||||
|
@ -156,7 +156,7 @@ options = {
|
|||||||
'xsync': True,
|
'xsync': True,
|
||||||
'xlib_fullscreen_override_redirect': False,
|
'xlib_fullscreen_override_redirect': False,
|
||||||
'search_local_libs': True,
|
'search_local_libs': True,
|
||||||
'advanced_font_features': False,
|
'win32_gdi_font': False,
|
||||||
'headless': False,
|
'headless': False,
|
||||||
'headless_device': 0,
|
'headless_device': 0,
|
||||||
}
|
}
|
||||||
@ -183,7 +183,7 @@ _option_types = {
|
|||||||
'xsync': bool,
|
'xsync': bool,
|
||||||
'xlib_fullscreen_override_redirect': bool,
|
'xlib_fullscreen_override_redirect': bool,
|
||||||
'search_local_libs': bool,
|
'search_local_libs': bool,
|
||||||
'advanced_font_features': bool,
|
'win32_gdi_font': bool,
|
||||||
'headless': bool,
|
'headless': bool,
|
||||||
'headless_device': int
|
'headless_device': int
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ class NotificationDevice(XlibSelectDevice):
|
|||||||
app.platform_event_loop.dispatch_posted_events()
|
app.platform_event_loop.dispatch_posted_events()
|
||||||
|
|
||||||
def poll(self):
|
def poll(self):
|
||||||
return self._event.isSet()
|
return self._event.is_set()
|
||||||
|
|
||||||
|
|
||||||
class XlibEventLoop(PlatformEventLoop):
|
class XlibEventLoop(PlatformEventLoop):
|
||||||
|
@ -111,11 +111,13 @@ Multiple and derived clocks potentially allow you to separate "game-time" and
|
|||||||
of the system clock.
|
of the system clock.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import time
|
import time as _time
|
||||||
|
|
||||||
from heapq import heappush, heappop, heappushpop
|
from heapq import heappop as _heappop
|
||||||
from operator import attrgetter
|
from heapq import heappush as _heappush
|
||||||
from collections import deque
|
from heapq import heappushpop as _heappushpop
|
||||||
|
from operator import attrgetter as _attrgetter
|
||||||
|
from collections import deque as _deque
|
||||||
|
|
||||||
|
|
||||||
class _ScheduledItem:
|
class _ScheduledItem:
|
||||||
@ -159,7 +161,7 @@ class Clock:
|
|||||||
# If True, a sleep(0) is inserted on every tick.
|
# If True, a sleep(0) is inserted on every tick.
|
||||||
_force_sleep = False
|
_force_sleep = False
|
||||||
|
|
||||||
def __init__(self, time_function=time.perf_counter):
|
def __init__(self, time_function=_time.perf_counter):
|
||||||
"""Initialise a Clock, with optional custom time function.
|
"""Initialise a Clock, with optional custom time function.
|
||||||
|
|
||||||
:Parameters:
|
:Parameters:
|
||||||
@ -175,7 +177,7 @@ class Clock:
|
|||||||
self.last_ts = None
|
self.last_ts = None
|
||||||
|
|
||||||
# Used by self.get_fps to show update frequency
|
# Used by self.get_fps to show update frequency
|
||||||
self.times = deque()
|
self.times = _deque()
|
||||||
self.cumulative_time = 0
|
self.cumulative_time = 0
|
||||||
self.window_size = 60
|
self.window_size = 60
|
||||||
|
|
||||||
@ -185,7 +187,7 @@ class Clock:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def sleep(microseconds):
|
def sleep(microseconds):
|
||||||
time.sleep(microseconds * 1e-6)
|
_time.sleep(microseconds * 1e-6)
|
||||||
|
|
||||||
def update_time(self):
|
def update_time(self):
|
||||||
"""Get the elapsed time since the last call to `update_time`.
|
"""Get the elapsed time since the last call to `update_time`.
|
||||||
@ -257,9 +259,9 @@ class Clock:
|
|||||||
# case it needs to be rescheduled. it is more efficient
|
# case it needs to be rescheduled. it is more efficient
|
||||||
# to push and pop the heap at once rather than two operations
|
# to push and pop the heap at once rather than two operations
|
||||||
if item is None:
|
if item is None:
|
||||||
item = heappop(interval_items)
|
item = _heappop(interval_items)
|
||||||
else:
|
else:
|
||||||
item = heappushpop(interval_items, item)
|
item = _heappushpop(interval_items, item)
|
||||||
|
|
||||||
# a scheduled function may try and unschedule itself
|
# a scheduled function may try and unschedule itself
|
||||||
# so we need to keep a reference to the current
|
# so we need to keep a reference to the current
|
||||||
@ -304,7 +306,7 @@ class Clock:
|
|||||||
self._current_interval_item = item = None
|
self._current_interval_item = item = None
|
||||||
|
|
||||||
if item is not None:
|
if item is not None:
|
||||||
heappush(interval_items, item)
|
_heappush(interval_items, item)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -415,7 +417,7 @@ class Clock:
|
|||||||
# and will not always catch smallest value, so sort here.
|
# and will not always catch smallest value, so sort here.
|
||||||
# do not remove the sort key...it is faster than relaying comparisons
|
# do not remove the sort key...it is faster than relaying comparisons
|
||||||
# NOTE: do not rewrite as popping from heap, as that is super slow!
|
# NOTE: do not rewrite as popping from heap, as that is super slow!
|
||||||
self._schedule_interval_items.sort(key=attrgetter('next_ts'))
|
self._schedule_interval_items.sort(key=_attrgetter('next_ts'))
|
||||||
|
|
||||||
# Binary division over interval:
|
# Binary division over interval:
|
||||||
#
|
#
|
||||||
@ -483,7 +485,7 @@ class Clock:
|
|||||||
last_ts = self._get_nearest_ts()
|
last_ts = self._get_nearest_ts()
|
||||||
next_ts = last_ts + delay
|
next_ts = last_ts + delay
|
||||||
item = _ScheduledIntervalItem(func, 0, last_ts, next_ts, args, kwargs)
|
item = _ScheduledIntervalItem(func, 0, last_ts, next_ts, args, kwargs)
|
||||||
heappush(self._schedule_interval_items, item)
|
_heappush(self._schedule_interval_items, item)
|
||||||
|
|
||||||
def schedule_interval(self, func, interval, *args, **kwargs):
|
def schedule_interval(self, func, interval, *args, **kwargs):
|
||||||
"""Schedule a function to be called every `interval` seconds.
|
"""Schedule a function to be called every `interval` seconds.
|
||||||
@ -503,7 +505,7 @@ class Clock:
|
|||||||
last_ts = self._get_nearest_ts()
|
last_ts = self._get_nearest_ts()
|
||||||
next_ts = last_ts + interval
|
next_ts = last_ts + interval
|
||||||
item = _ScheduledIntervalItem(func, interval, last_ts, next_ts, args, kwargs)
|
item = _ScheduledIntervalItem(func, interval, last_ts, next_ts, args, kwargs)
|
||||||
heappush(self._schedule_interval_items, item)
|
_heappush(self._schedule_interval_items, item)
|
||||||
|
|
||||||
def schedule_interval_soft(self, func, interval, *args, **kwargs):
|
def schedule_interval_soft(self, func, interval, *args, **kwargs):
|
||||||
"""Schedule a function to be called every ``interval`` seconds.
|
"""Schedule a function to be called every ``interval`` seconds.
|
||||||
@ -537,7 +539,7 @@ class Clock:
|
|||||||
next_ts = self._get_soft_next_ts(self._get_nearest_ts(), interval)
|
next_ts = self._get_soft_next_ts(self._get_nearest_ts(), interval)
|
||||||
last_ts = next_ts - interval
|
last_ts = next_ts - interval
|
||||||
item = _ScheduledIntervalItem(func, interval, last_ts, next_ts, args, kwargs)
|
item = _ScheduledIntervalItem(func, interval, last_ts, next_ts, args, kwargs)
|
||||||
heappush(self._schedule_interval_items, item)
|
_heappush(self._schedule_interval_items, item)
|
||||||
|
|
||||||
def unschedule(self, func):
|
def unschedule(self, func):
|
||||||
"""Remove a function from the schedule.
|
"""Remove a function from the schedule.
|
||||||
|
@ -66,16 +66,12 @@ if not getattr(sys, 'is_pyglet_doc_run', False):
|
|||||||
|
|
||||||
elif pyglet.compat_platform in ('win32', 'cygwin'):
|
elif pyglet.compat_platform in ('win32', 'cygwin'):
|
||||||
from pyglet.libs.win32.constants import WINDOWS_7_OR_GREATER
|
from pyglet.libs.win32.constants import WINDOWS_7_OR_GREATER
|
||||||
if WINDOWS_7_OR_GREATER:
|
if WINDOWS_7_OR_GREATER and not pyglet.options['win32_gdi_font']:
|
||||||
if pyglet.options["advanced_font_features"] is True:
|
|
||||||
from pyglet.font.directwrite import Win32DirectWriteFont
|
from pyglet.font.directwrite import Win32DirectWriteFont
|
||||||
_font_class = Win32DirectWriteFont
|
_font_class = Win32DirectWriteFont
|
||||||
else:
|
else:
|
||||||
from pyglet.font.win32 import GDIPlusFont
|
from pyglet.font.win32 import GDIPlusFont
|
||||||
_font_class = GDIPlusFont
|
_font_class = GDIPlusFont
|
||||||
else:
|
|
||||||
from pyglet.font.win32 import GDIPlusFont
|
|
||||||
_font_class = GDIPlusFont
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
from pyglet.font.freetype import FreeTypeFont
|
from pyglet.font.freetype import FreeTypeFont
|
||||||
|
@ -345,7 +345,6 @@ def _enum_font_names(logfont, textmetricex, fonttype, param):
|
|||||||
except UnicodeDecodeError:
|
except UnicodeDecodeError:
|
||||||
name = lf.lfFaceName.decode('ANSI')
|
name = lf.lfFaceName.decode('ANSI')
|
||||||
|
|
||||||
|
|
||||||
# detect font type (vector|raster) and format (ttf)
|
# detect font type (vector|raster) and format (ttf)
|
||||||
# [ ] use Windows constant TRUETYPE_FONTTYPE
|
# [ ] use Windows constant TRUETYPE_FONTTYPE
|
||||||
if fonttype & 4:
|
if fonttype & 4:
|
||||||
|
@ -189,8 +189,7 @@ class Config:
|
|||||||
return isinstance(self, CanvasConfig)
|
return isinstance(self, CanvasConfig)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
import pprint
|
return f"{self.__class__.__name__}({self.get_gl_attributes()})"
|
||||||
return '%s(%s)' % (self.__class__.__name__, pprint.pformat(self.get_gl_attributes()))
|
|
||||||
|
|
||||||
|
|
||||||
class CanvasConfig(Config):
|
class CanvasConfig(Config):
|
||||||
@ -277,7 +276,7 @@ class Context:
|
|||||||
self.object_space = ObjectSpace()
|
self.object_space = ObjectSpace()
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '%s()' % self.__class__.__name__
|
return f"{self.__class__.__name__}(id={id(self)}, share={self.context_share})"
|
||||||
|
|
||||||
def attach(self, canvas):
|
def attach(self, canvas):
|
||||||
if self.canvas is not None:
|
if self.canvas is not None:
|
||||||
|
@ -163,14 +163,14 @@ import weakref
|
|||||||
|
|
||||||
import pyglet
|
import pyglet
|
||||||
from pyglet.gl import *
|
from pyglet.gl import *
|
||||||
from pyglet.graphics import vertexbuffer, vertexattribute, vertexdomain
|
from pyglet.graphics import vertexattribute, vertexdomain
|
||||||
from pyglet.graphics.vertexarray import VertexArray
|
from pyglet.graphics.vertexarray import VertexArray
|
||||||
from pyglet.graphics.vertexbuffer import BufferObject
|
from pyglet.graphics.vertexbuffer import BufferObject
|
||||||
|
|
||||||
_debug_graphics_batch = pyglet.options['debug_graphics_batch']
|
_debug_graphics_batch = pyglet.options['debug_graphics_batch']
|
||||||
|
|
||||||
|
|
||||||
def draw(size, mode, *data):
|
def draw(size, mode, **kwargs):
|
||||||
"""Draw a primitive immediately.
|
"""Draw a primitive immediately.
|
||||||
|
|
||||||
:Parameters:
|
:Parameters:
|
||||||
@ -179,9 +179,10 @@ def draw(size, mode, *data):
|
|||||||
`mode` : gl primitive type
|
`mode` : gl primitive type
|
||||||
OpenGL drawing mode, e.g. ``GL_TRIANGLES``,
|
OpenGL drawing mode, e.g. ``GL_TRIANGLES``,
|
||||||
avoiding quotes.
|
avoiding quotes.
|
||||||
`data` : data items
|
`**data` : keyword arguments for passing vertex attribute data.
|
||||||
Attribute formats and data. See the module summary for
|
The keyword should be the vertex attribute name, and the
|
||||||
details.
|
argument should be a tuple of (format, data). For example:
|
||||||
|
`position=('f', array)`
|
||||||
|
|
||||||
"""
|
"""
|
||||||
# Create and bind a throwaway VAO
|
# Create and bind a throwaway VAO
|
||||||
@ -189,16 +190,19 @@ def draw(size, mode, *data):
|
|||||||
glGenVertexArrays(1, vao_id)
|
glGenVertexArrays(1, vao_id)
|
||||||
glBindVertexArray(vao_id)
|
glBindVertexArray(vao_id)
|
||||||
# Activate shader program:
|
# Activate shader program:
|
||||||
group = get_default_group()
|
program = get_default_shader()
|
||||||
group.set_state()
|
program.use()
|
||||||
|
|
||||||
buffers = []
|
buffers = []
|
||||||
for fmt, array in data:
|
for name, (fmt, array) in kwargs.items():
|
||||||
attribute = vertexattribute.create_attribute(group.program, fmt)
|
location = program.attributes[name]['location']
|
||||||
|
count = program.attributes[name]['count']
|
||||||
|
gl_type = vertexdomain._gl_types[fmt[0]]
|
||||||
|
normalize = 'n' in fmt
|
||||||
|
attribute = vertexattribute.VertexAttribute(name, location, count, gl_type, normalize)
|
||||||
assert size == len(array) // attribute.count, 'Data for %s is incorrect length' % fmt
|
assert size == len(array) // attribute.count, 'Data for %s is incorrect length' % fmt
|
||||||
|
|
||||||
buffer = vertexbuffer.create_buffer(size * attribute.stride, mappable=False)
|
buffer = BufferObject(size * attribute.stride, GL_ARRAY_BUFFER)
|
||||||
|
|
||||||
attribute.set_region(buffer, 0, size, array)
|
attribute.set_region(buffer, 0, size, array)
|
||||||
attribute.enable()
|
attribute.enable()
|
||||||
attribute.set_pointer(buffer.ptr)
|
attribute.set_pointer(buffer.ptr)
|
||||||
@ -208,14 +212,14 @@ def draw(size, mode, *data):
|
|||||||
glDrawArrays(mode, 0, size)
|
glDrawArrays(mode, 0, size)
|
||||||
|
|
||||||
# Deactivate shader program:
|
# Deactivate shader program:
|
||||||
group.unset_state()
|
program.stop()
|
||||||
# Discard everything after drawing:
|
# Discard everything after drawing:
|
||||||
del buffers
|
del buffers
|
||||||
glBindVertexArray(0)
|
glBindVertexArray(0)
|
||||||
glDeleteVertexArrays(1, vao_id)
|
glDeleteVertexArrays(1, vao_id)
|
||||||
|
|
||||||
|
|
||||||
def draw_indexed(size, mode, indices, *data):
|
def draw_indexed(size, mode, indices, **data):
|
||||||
"""Draw a primitive with indexed vertices immediately.
|
"""Draw a primitive with indexed vertices immediately.
|
||||||
|
|
||||||
:Parameters:
|
:Parameters:
|
||||||
@ -225,8 +229,10 @@ def draw_indexed(size, mode, indices, *data):
|
|||||||
OpenGL drawing mode, e.g. ``GL_TRIANGLES``
|
OpenGL drawing mode, e.g. ``GL_TRIANGLES``
|
||||||
`indices` : sequence of int
|
`indices` : sequence of int
|
||||||
Sequence of integers giving indices into the vertex list.
|
Sequence of integers giving indices into the vertex list.
|
||||||
`data` : data items
|
`**data` : keyword arguments for passing vertex attribute data.
|
||||||
Attribute formats and data. See the module summary for details.
|
The keyword should be the vertex attribute name, and the
|
||||||
|
argument should be a tuple of (format, data). For example:
|
||||||
|
`position=('f', array)`
|
||||||
|
|
||||||
"""
|
"""
|
||||||
# Create and bind a throwaway VAO
|
# Create and bind a throwaway VAO
|
||||||
@ -234,16 +240,19 @@ def draw_indexed(size, mode, indices, *data):
|
|||||||
glGenVertexArrays(1, vao_id)
|
glGenVertexArrays(1, vao_id)
|
||||||
glBindVertexArray(vao_id)
|
glBindVertexArray(vao_id)
|
||||||
# Activate shader program:
|
# Activate shader program:
|
||||||
group = get_default_group()
|
program = get_default_shader()
|
||||||
group.set_state()
|
program.use()
|
||||||
|
|
||||||
buffers = []
|
buffers = []
|
||||||
for fmt, array in data:
|
for name, (fmt, array) in data.items():
|
||||||
attribute = vertexattribute.create_attribute(group.program, fmt)
|
location = program.attributes[name]['location']
|
||||||
|
count = program.attributes[name]['count']
|
||||||
|
gl_type = vertexdomain._gl_types[fmt[0]]
|
||||||
|
normalize = 'n' in fmt
|
||||||
|
attribute = vertexattribute.VertexAttribute(name, location, count, gl_type, normalize)
|
||||||
assert size == len(array) // attribute.count, 'Data for %s is incorrect length' % fmt
|
assert size == len(array) // attribute.count, 'Data for %s is incorrect length' % fmt
|
||||||
|
|
||||||
buffer = vertexbuffer.create_buffer(size * attribute.stride, mappable=False)
|
buffer = BufferObject(size * attribute.stride, GL_ARRAY_BUFFER)
|
||||||
|
|
||||||
attribute.set_region(buffer, 0, size, array)
|
attribute.set_region(buffer, 0, size, array)
|
||||||
attribute.enable()
|
attribute.enable()
|
||||||
attribute.set_pointer(buffer.ptr)
|
attribute.set_pointer(buffer.ptr)
|
||||||
@ -262,18 +271,14 @@ def draw_indexed(size, mode, indices, *data):
|
|||||||
# With GL 3.3 vertex arrays indices needs to be in a buffer
|
# With GL 3.3 vertex arrays indices needs to be in a buffer
|
||||||
# bound to the ELEMENT_ARRAY slot
|
# bound to the ELEMENT_ARRAY slot
|
||||||
index_array = (index_c_type * len(indices))(*indices)
|
index_array = (index_c_type * len(indices))(*indices)
|
||||||
index_buffer = BufferObject(
|
index_buffer = BufferObject(ctypes.sizeof(index_array), GL_ELEMENT_ARRAY_BUFFER)
|
||||||
ctypes.sizeof(index_array),
|
|
||||||
GL_ELEMENT_ARRAY_BUFFER,
|
|
||||||
GL_DYNAMIC_DRAW,
|
|
||||||
)
|
|
||||||
index_buffer.set_data(index_array)
|
index_buffer.set_data(index_array)
|
||||||
|
|
||||||
glDrawElements(mode, len(indices), index_type, 0)
|
glDrawElements(mode, len(indices), index_type, 0)
|
||||||
glFlush()
|
glFlush()
|
||||||
|
|
||||||
# Deactivate shader program:
|
# Deactivate shader program:
|
||||||
group.unset_state()
|
program.stop()
|
||||||
# Discard everything after drawing:
|
# Discard everything after drawing:
|
||||||
del buffers
|
del buffers
|
||||||
del index_buffer
|
del index_buffer
|
||||||
@ -281,22 +286,6 @@ def draw_indexed(size, mode, indices, *data):
|
|||||||
glDeleteVertexArrays(1, vao_id)
|
glDeleteVertexArrays(1, vao_id)
|
||||||
|
|
||||||
|
|
||||||
def _parse_data(data):
|
|
||||||
"""Given a list of data items, returns (formats, initial_arrays)."""
|
|
||||||
assert data, 'No attribute formats given'
|
|
||||||
|
|
||||||
# Return tuple (formats, initial_arrays).
|
|
||||||
formats = []
|
|
||||||
initial_arrays = []
|
|
||||||
for i, fmt in enumerate(data):
|
|
||||||
if isinstance(fmt, tuple):
|
|
||||||
fmt, array = fmt
|
|
||||||
initial_arrays.append((i, array))
|
|
||||||
formats.append(fmt)
|
|
||||||
formats = tuple(formats)
|
|
||||||
return formats, initial_arrays
|
|
||||||
|
|
||||||
|
|
||||||
def get_default_batch():
|
def get_default_batch():
|
||||||
try:
|
try:
|
||||||
return pyglet.gl.current_context.pyglet_graphics_default_batch
|
return pyglet.gl.current_context.pyglet_graphics_default_batch
|
||||||
@ -324,42 +313,6 @@ def get_default_shader():
|
|||||||
return pyglet.gl.current_context.pyglet_graphics_default_shader
|
return pyglet.gl.current_context.pyglet_graphics_default_shader
|
||||||
|
|
||||||
|
|
||||||
def vertex_list(count, *data):
|
|
||||||
"""Create a :py:class:`~pyglet.graphics.vertexdomain.VertexList` not associated with a batch, group or mode.
|
|
||||||
|
|
||||||
:Parameters:
|
|
||||||
`count` : int
|
|
||||||
The number of vertices in the list.
|
|
||||||
`data` : data items
|
|
||||||
Attribute formats and initial data for the vertex list. See the
|
|
||||||
module summary for details.
|
|
||||||
|
|
||||||
:rtype: :py:class:`~pyglet.graphics.vertexdomain.VertexList`
|
|
||||||
"""
|
|
||||||
# Note that mode=0 because the default batch is never drawn: vertex lists
|
|
||||||
# returned from this function are drawn directly by their draw() method.
|
|
||||||
return get_default_batch().add(count, 0, None, *data)
|
|
||||||
|
|
||||||
|
|
||||||
def vertex_list_indexed(count, indices, *data):
|
|
||||||
"""Create an `IndexedVertexList` not associated with a batch, group or mode.
|
|
||||||
|
|
||||||
:Parameters:
|
|
||||||
`count` : int
|
|
||||||
The number of vertices in the list.
|
|
||||||
`indices` : sequence
|
|
||||||
Sequence of integers giving indices into the vertex list.
|
|
||||||
`data` : data items
|
|
||||||
Attribute formats and initial data for the vertex list. See the
|
|
||||||
module summary for details.
|
|
||||||
|
|
||||||
:rtype: `IndexedVertexList`
|
|
||||||
"""
|
|
||||||
# Note that mode=0 because the default batch is never drawn: vertex lists
|
|
||||||
# returned from this function are drawn directly by their draw() method.
|
|
||||||
return get_default_batch().add_indexed(count, 0, None, indices, *data)
|
|
||||||
|
|
||||||
|
|
||||||
class Batch:
|
class Batch:
|
||||||
"""Manage a collection of vertex lists for batched rendering.
|
"""Manage a collection of vertex lists for batched rendering.
|
||||||
|
|
||||||
@ -387,12 +340,6 @@ class Batch:
|
|||||||
self._draw_list = []
|
self._draw_list = []
|
||||||
self._draw_list_dirty = False
|
self._draw_list_dirty = False
|
||||||
|
|
||||||
# Each Batch encompasses one VAO
|
|
||||||
self.vao = VertexArray()
|
|
||||||
|
|
||||||
if _debug_graphics_batch:
|
|
||||||
print("Batch created. VAO ID: {0}".format(self.vao.id))
|
|
||||||
|
|
||||||
def invalidate(self):
|
def invalidate(self):
|
||||||
"""Force the batch to update the draw list.
|
"""Force the batch to update the draw list.
|
||||||
|
|
||||||
@ -403,66 +350,6 @@ class Batch:
|
|||||||
"""
|
"""
|
||||||
self._draw_list_dirty = True
|
self._draw_list_dirty = True
|
||||||
|
|
||||||
def add(self, count, mode, group, *data):
|
|
||||||
"""Add a vertex list to the batch.
|
|
||||||
|
|
||||||
:Parameters:
|
|
||||||
`count` : int
|
|
||||||
The number of vertices in the list.
|
|
||||||
`mode` : int
|
|
||||||
OpenGL drawing mode enumeration; for example, one of
|
|
||||||
``GL_POINTS``, ``GL_LINES``, ``GL_TRIANGLES``, etc.
|
|
||||||
See the module summary for additional information.
|
|
||||||
`group` : `~pyglet.graphics.Group`
|
|
||||||
Group of the vertex list, or ``None`` if no group is required.
|
|
||||||
`data` : data items
|
|
||||||
Attribute formats and initial data for the vertex list. See
|
|
||||||
the module summary for details.
|
|
||||||
|
|
||||||
:rtype: :py:class:`~pyglet.graphics.vertexdomain.VertexList`
|
|
||||||
"""
|
|
||||||
formats, initial_arrays = _parse_data(data)
|
|
||||||
domain = self._get_domain(False, mode, group, formats)
|
|
||||||
|
|
||||||
# Create vertex list and initialize
|
|
||||||
vlist = domain.create(count)
|
|
||||||
for i, array in initial_arrays:
|
|
||||||
vlist.set_attribute_data(i, array)
|
|
||||||
|
|
||||||
return vlist
|
|
||||||
|
|
||||||
def add_indexed(self, count, mode, group, indices, *data):
|
|
||||||
"""Add an indexed vertex list to the batch.
|
|
||||||
|
|
||||||
:Parameters:
|
|
||||||
`count` : int
|
|
||||||
The number of vertices in the list.
|
|
||||||
`mode` : int
|
|
||||||
OpenGL drawing mode enumeration; for example, one of
|
|
||||||
``GL_POINTS``, ``GL_LINES``, ``GL_TRIANGLES``, etc.
|
|
||||||
See the module summary for additional information.
|
|
||||||
`group` : `~pyglet.graphics.Group`
|
|
||||||
Group of the vertex list, or ``None`` if no group is required.
|
|
||||||
`indices` : sequence
|
|
||||||
Sequence of integers giving indices into the vertex list.
|
|
||||||
`data` : data items
|
|
||||||
Attribute formats and initial data for the vertex list. See
|
|
||||||
the module summary for details.
|
|
||||||
|
|
||||||
:rtype: `IndexedVertexList`
|
|
||||||
"""
|
|
||||||
formats, initial_arrays = _parse_data(data)
|
|
||||||
domain = self._get_domain(True, mode, group, formats)
|
|
||||||
|
|
||||||
# Create vertex list and initialize
|
|
||||||
vlist = domain.create(count, len(indices))
|
|
||||||
start = vlist.start
|
|
||||||
vlist.set_index_data([i + start for i in indices])
|
|
||||||
for i, array in initial_arrays:
|
|
||||||
vlist.set_attribute_data(i, array)
|
|
||||||
|
|
||||||
return vlist
|
|
||||||
|
|
||||||
def migrate(self, vertex_list, mode, group, batch):
|
def migrate(self, vertex_list, mode, group, batch):
|
||||||
"""Migrate a vertex list to another batch and/or group.
|
"""Migrate a vertex list to another batch and/or group.
|
||||||
|
|
||||||
@ -486,14 +373,15 @@ class Batch:
|
|||||||
The batch to migrate to (or the current batch).
|
The batch to migrate to (or the current batch).
|
||||||
|
|
||||||
"""
|
"""
|
||||||
formats = vertex_list.domain.__formats
|
program = vertex_list.domain.program
|
||||||
|
attributes = vertex_list.domain.attribute_meta
|
||||||
if isinstance(vertex_list, vertexdomain.IndexedVertexList):
|
if isinstance(vertex_list, vertexdomain.IndexedVertexList):
|
||||||
domain = batch._get_domain(True, mode, group, formats)
|
domain = batch.get_domain(True, mode, group, program, attributes)
|
||||||
else:
|
else:
|
||||||
domain = batch._get_domain(False, mode, group, formats)
|
domain = batch.get_domain(False, mode, group, program, attributes)
|
||||||
vertex_list.migrate(domain)
|
vertex_list.migrate(domain)
|
||||||
|
|
||||||
def _get_domain(self, indexed, mode, group, formats):
|
def get_domain(self, indexed, mode, group, program, attributes):
|
||||||
if group is None:
|
if group is None:
|
||||||
group = get_default_group()
|
group = get_default_group()
|
||||||
|
|
||||||
@ -501,18 +389,17 @@ class Batch:
|
|||||||
if group not in self.group_map:
|
if group not in self.group_map:
|
||||||
self._add_group(group)
|
self._add_group(group)
|
||||||
|
|
||||||
# If not a ShaderGroup, use the default ShaderProgram
|
|
||||||
shader_program = getattr(group, 'program', get_default_shader())
|
|
||||||
|
|
||||||
# Find domain given formats, indices and mode
|
# Find domain given formats, indices and mode
|
||||||
domain_map = self.group_map[group]
|
domain_map = self.group_map[group]
|
||||||
key = (formats, mode, indexed, shader_program.id)
|
key = (indexed, mode, program, str(attributes))
|
||||||
try:
|
try:
|
||||||
domain = domain_map[key]
|
domain = domain_map[key]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
# Create domain
|
# Create domain
|
||||||
domain = vertexdomain.create_domain(shader_program, *formats, indexed=indexed)
|
if indexed:
|
||||||
domain.__formats = formats
|
domain = vertexdomain.IndexedVertexDomain(program, attributes)
|
||||||
|
else:
|
||||||
|
domain = vertexdomain.VertexDomain(program, attributes)
|
||||||
domain_map[key] = domain
|
domain_map[key] = domain
|
||||||
self._draw_list_dirty = True
|
self._draw_list_dirty = True
|
||||||
|
|
||||||
@ -613,7 +500,6 @@ class Batch:
|
|||||||
|
|
||||||
def draw(self):
|
def draw(self):
|
||||||
"""Draw the batch."""
|
"""Draw the batch."""
|
||||||
self.vao.bind()
|
|
||||||
|
|
||||||
if self._draw_list_dirty:
|
if self._draw_list_dirty:
|
||||||
self._update_draw_list()
|
self._update_draw_list()
|
||||||
@ -637,8 +523,6 @@ class Batch:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.vao.bind()
|
|
||||||
|
|
||||||
# Horrendously inefficient.
|
# Horrendously inefficient.
|
||||||
def visit(group):
|
def visit(group):
|
||||||
group.set_state()
|
group.set_state()
|
||||||
|
@ -1,18 +1,21 @@
|
|||||||
import ctypes
|
|
||||||
from weakref import proxy
|
|
||||||
from ctypes import *
|
from ctypes import *
|
||||||
|
from weakref import proxy
|
||||||
|
|
||||||
import pyglet
|
import pyglet
|
||||||
|
|
||||||
from pyglet.graphics import vertexbuffer
|
from pyglet.graphics.vertexbuffer import BufferObject
|
||||||
from pyglet.gl import *
|
from pyglet.gl import *
|
||||||
|
|
||||||
|
|
||||||
_debug_gl_shaders = pyglet.options['debug_gl_shaders']
|
_debug_gl_shaders = pyglet.options['debug_gl_shaders']
|
||||||
|
|
||||||
|
|
||||||
|
class ShaderException(BaseException):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# TODO: test other shader types, and update if necessary.
|
# TODO: test other shader types, and update if necessary.
|
||||||
shader_types = {
|
_shader_types = {
|
||||||
'vertex': GL_VERTEX_SHADER,
|
'vertex': GL_VERTEX_SHADER,
|
||||||
'geometry': GL_GEOMETRY_SHADER,
|
'geometry': GL_GEOMETRY_SHADER,
|
||||||
'fragment': GL_FRAGMENT_SHADER,
|
'fragment': GL_FRAGMENT_SHADER,
|
||||||
@ -90,22 +93,6 @@ _attribute_types = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class _Attribute:
|
|
||||||
__slots__ = 'program', 'name', 'type', 'size', 'location', 'count', 'format'
|
|
||||||
|
|
||||||
def __init__(self, program, name, attr_type, size, location):
|
|
||||||
self.program = program
|
|
||||||
self.name = name
|
|
||||||
self.type = attr_type
|
|
||||||
self.size = size
|
|
||||||
self.location = location
|
|
||||||
self.count, self.format = _attribute_types[attr_type]
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return f"Attribute('{self.name}', program={self.program}, " \
|
|
||||||
f"location={self.location}, count={self.count}, format={self.format})"
|
|
||||||
|
|
||||||
|
|
||||||
class _Uniform:
|
class _Uniform:
|
||||||
__slots__ = 'program', 'name', 'type', 'location', 'length', 'count', 'get', 'set'
|
__slots__ = 'program', 'name', 'type', 'location', 'length', 'count', 'get', 'set'
|
||||||
|
|
||||||
@ -186,7 +173,7 @@ class Shader:
|
|||||||
"""
|
"""
|
||||||
self._id = None
|
self._id = None
|
||||||
|
|
||||||
if shader_type not in shader_types:
|
if shader_type not in _shader_types:
|
||||||
raise TypeError("The `shader_type` '{}' is not yet supported".format(shader_type))
|
raise TypeError("The `shader_type` '{}' is not yet supported".format(shader_type))
|
||||||
self.type = shader_type
|
self.type = shader_type
|
||||||
|
|
||||||
@ -194,7 +181,7 @@ class Shader:
|
|||||||
source_buffer_pointer = cast(c_char_p(shader_source_utf8), POINTER(c_char))
|
source_buffer_pointer = cast(c_char_p(shader_source_utf8), POINTER(c_char))
|
||||||
source_length = c_int(len(shader_source_utf8))
|
source_length = c_int(len(shader_source_utf8))
|
||||||
|
|
||||||
shader_id = glCreateShader(shader_types[shader_type])
|
shader_id = glCreateShader(_shader_types[shader_type])
|
||||||
glShaderSource(shader_id, 1, byref(source_buffer_pointer), source_length)
|
glShaderSource(shader_id, 1, byref(source_buffer_pointer), source_length)
|
||||||
glCompileShader(shader_id)
|
glCompileShader(shader_id)
|
||||||
|
|
||||||
@ -282,7 +269,7 @@ class ShaderProgram:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def uniforms(self):
|
def uniforms(self):
|
||||||
return self._uniforms.keys()
|
return self._uniforms
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def uniform_blocks(self):
|
def uniform_blocks(self):
|
||||||
@ -374,7 +361,8 @@ class ShaderProgram:
|
|||||||
for index in range(self._get_number(GL_ACTIVE_ATTRIBUTES)):
|
for index in range(self._get_number(GL_ACTIVE_ATTRIBUTES)):
|
||||||
a_name, a_type, a_size = self._query_attribute(index)
|
a_name, a_type, a_size = self._query_attribute(index)
|
||||||
loc = glGetAttribLocation(program, create_string_buffer(a_name.encode('utf-8')))
|
loc = glGetAttribLocation(program, create_string_buffer(a_name.encode('utf-8')))
|
||||||
attributes[a_name] = _Attribute(program, a_name, a_type, a_size, loc)
|
count, fmt = _attribute_types[a_type]
|
||||||
|
attributes[a_name] = dict(type=a_type, size=a_size, location=loc, count=count, format=fmt)
|
||||||
self._attributes = attributes
|
self._attributes = attributes
|
||||||
|
|
||||||
if _debug_gl_shaders:
|
if _debug_gl_shaders:
|
||||||
@ -387,7 +375,7 @@ class ShaderProgram:
|
|||||||
u_name, u_type, u_size = self._query_uniform(index)
|
u_name, u_type, u_size = self._query_uniform(index)
|
||||||
loc = glGetUniformLocation(prg_id, create_string_buffer(u_name.encode('utf-8')))
|
loc = glGetUniformLocation(prg_id, create_string_buffer(u_name.encode('utf-8')))
|
||||||
|
|
||||||
if loc == -1: # Skip uniforms that may be inside of a Uniform Block
|
if loc == -1: # Skip uniforms that may be inside a Uniform Block
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -470,6 +458,94 @@ class ShaderProgram:
|
|||||||
except GLException:
|
except GLException:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
def vertex_list(self, count, mode, batch=None, group=None, **data):
|
||||||
|
"""Create a VertexList.
|
||||||
|
|
||||||
|
:Parameters:
|
||||||
|
`count` : int
|
||||||
|
The number of vertices in the list.
|
||||||
|
`mode` : int
|
||||||
|
OpenGL drawing mode enumeration; for example, one of
|
||||||
|
``GL_POINTS``, ``GL_LINES``, ``GL_TRIANGLES``, etc.
|
||||||
|
`batch` : `~pyglet.graphics.Batch`
|
||||||
|
Batch to add the VertexList to, or ``None`` if a Batch will not be used.
|
||||||
|
Using a Batch is strongly recommended.
|
||||||
|
`group` : `~pyglet.graphics.Group`
|
||||||
|
Group to add the VertexList to, or ``None`` if no group is required.
|
||||||
|
`**data` : str or tuple
|
||||||
|
Attribute formats and initial data for the vertex list.
|
||||||
|
|
||||||
|
:rtype: :py:class:`~pyglet.graphics.vertexdomain.VertexList`
|
||||||
|
"""
|
||||||
|
attributes = self._attributes.copy()
|
||||||
|
initial_arrays = []
|
||||||
|
|
||||||
|
for name, fmt in data.items():
|
||||||
|
try:
|
||||||
|
if isinstance(fmt, tuple):
|
||||||
|
fmt, array = fmt
|
||||||
|
initial_arrays.append((attributes[name]['location'], array))
|
||||||
|
attributes[name] = {**attributes[name], **{'format': fmt}}
|
||||||
|
except KeyError:
|
||||||
|
raise ShaderException(f"\nThe attribute `{name}` doesn't exist. Valid names: \n{attributes.keys()}")
|
||||||
|
|
||||||
|
batch = batch or pyglet.graphics.get_default_batch()
|
||||||
|
domain = batch.get_domain(False, mode, group, self._id, attributes)
|
||||||
|
|
||||||
|
# Create vertex list and initialize
|
||||||
|
vlist = domain.create(count)
|
||||||
|
|
||||||
|
for index, array in initial_arrays:
|
||||||
|
vlist.set_attribute_data(index, array)
|
||||||
|
|
||||||
|
return vlist
|
||||||
|
|
||||||
|
def vertex_list_indexed(self, count, mode, indices, batch=None, group=None, **data):
|
||||||
|
"""Create a IndexedVertexList.
|
||||||
|
|
||||||
|
:Parameters:
|
||||||
|
`count` : int
|
||||||
|
The number of vertices in the list.
|
||||||
|
`mode` : int
|
||||||
|
OpenGL drawing mode enumeration; for example, one of
|
||||||
|
``GL_POINTS``, ``GL_LINES``, ``GL_TRIANGLES``, etc.
|
||||||
|
`indices` : sequence of int
|
||||||
|
Sequence of integers giving indices into the vertex list.
|
||||||
|
`batch` : `~pyglet.graphics.Batch`
|
||||||
|
Batch to add the VertexList to, or ``None`` if a Batch will not be used.
|
||||||
|
Using a Batch is strongly recommended.
|
||||||
|
`group` : `~pyglet.graphics.Group`
|
||||||
|
Group to add the VertexList to, or ``None`` if no group is required.
|
||||||
|
`**data` : str or tuple
|
||||||
|
Attribute formats and initial data for the vertex list.
|
||||||
|
|
||||||
|
:rtype: :py:class:`~pyglet.graphics.vertexdomain.IndexedVertexList`
|
||||||
|
"""
|
||||||
|
attributes = self._attributes.copy()
|
||||||
|
initial_arrays = []
|
||||||
|
|
||||||
|
for name, fmt in data.items():
|
||||||
|
try:
|
||||||
|
if isinstance(fmt, tuple):
|
||||||
|
fmt, array = fmt
|
||||||
|
initial_arrays.append((attributes[name]['location'], array))
|
||||||
|
attributes[name] = {**attributes[name], **{'format': fmt}}
|
||||||
|
except KeyError:
|
||||||
|
raise ShaderException(f"\nThe attribute `{name}` doesn't exist. Valid names: \n{list(attributes)}")
|
||||||
|
|
||||||
|
batch = batch or pyglet.graphics.get_default_batch()
|
||||||
|
domain = batch.get_domain(True, mode, group, self._id, attributes)
|
||||||
|
|
||||||
|
# Create vertex list and initialize
|
||||||
|
vlist = domain.create(count, len(indices))
|
||||||
|
start = vlist.start
|
||||||
|
vlist.indices = [i + start for i in indices]
|
||||||
|
|
||||||
|
for index, array in initial_arrays:
|
||||||
|
vlist.set_attribute_data(index, array)
|
||||||
|
|
||||||
|
return vlist
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "{0}(id={1})".format(self.__class__.__name__, self.id)
|
return "{0}(id={1})".format(self.__class__.__name__, self.id)
|
||||||
|
|
||||||
@ -497,7 +573,7 @@ class UniformBufferObject:
|
|||||||
def __init__(self, block, index):
|
def __init__(self, block, index):
|
||||||
assert type(block) == UniformBlock, "Must be a UniformBlock instance"
|
assert type(block) == UniformBlock, "Must be a UniformBlock instance"
|
||||||
self.block = block
|
self.block = block
|
||||||
self.buffer = vertexbuffer.create_buffer(self.block.size, target=GL_UNIFORM_BUFFER, mappable=False)
|
self.buffer = BufferObject(self.block.size, GL_UNIFORM_BUFFER)
|
||||||
self.buffer.bind()
|
self.buffer.bind()
|
||||||
self.view = self._introspect_uniforms()
|
self.view = self._introspect_uniforms()
|
||||||
self._view_ptr = pointer(self.view)
|
self._view_ptr = pointer(self.view)
|
||||||
@ -557,7 +633,7 @@ class UniformBufferObject:
|
|||||||
args.append((f'_padding{i}', gl_type * padding_bytes))
|
args.append((f'_padding{i}', gl_type * padding_bytes))
|
||||||
|
|
||||||
# Custom ctypes Structure for Uniform access:
|
# Custom ctypes Structure for Uniform access:
|
||||||
class View(ctypes.Structure):
|
class View(Structure):
|
||||||
_fields_ = args
|
_fields_ = args
|
||||||
__repr__ = lambda self: str(dict(self._fields_))
|
__repr__ = lambda self: str(dict(self._fields_))
|
||||||
|
|
||||||
|
@ -33,93 +33,10 @@
|
|||||||
# POSSIBILITY OF SUCH DAMAGE.
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
"""Access byte arrays as arrays of vertex attributes.
|
|
||||||
|
|
||||||
Use :py:func:`create_attribute` to create an attribute accessor given a
|
|
||||||
simple format string. Alternatively, the classes may be constructed directly.
|
|
||||||
|
|
||||||
Attribute format strings
|
|
||||||
========================
|
|
||||||
|
|
||||||
An attribute format string specifies the format of a vertex attribute. Format
|
|
||||||
strings are accepted by the :py:func:`create_attribute` function as well as most
|
|
||||||
methods in the :py:mod:`pyglet.graphics` module.
|
|
||||||
|
|
||||||
Format strings have the following (BNF) syntax::
|
|
||||||
|
|
||||||
attribute ::= name count type normalized
|
|
||||||
|
|
||||||
``name`` describes the vertex attribute, and can be any valid ascii characters.
|
|
||||||
The following single letter constants remain for backwards compatibility, but
|
|
||||||
are deprecated:
|
|
||||||
|
|
||||||
``v``
|
|
||||||
'vertices' Shader attribute
|
|
||||||
``c``
|
|
||||||
'color' Shader attribute
|
|
||||||
``t``
|
|
||||||
'tex_coords' Shader attribute
|
|
||||||
``n``
|
|
||||||
'normals' Shader attribute
|
|
||||||
``e``
|
|
||||||
'edge_flags' Shader attribute
|
|
||||||
``f``
|
|
||||||
'fog_coords' Shader attribute
|
|
||||||
``s``
|
|
||||||
'secondary_colors' Shader attribute
|
|
||||||
|
|
||||||
``count`` gives the number of data components in the attribute. For
|
|
||||||
example, a 3D vertex position has a count of 3. Some attributes
|
|
||||||
constrain the possible counts that can be used; for example, a normal
|
|
||||||
vector must have a count of 3.
|
|
||||||
|
|
||||||
``type`` gives the data type of each component of the attribute. The
|
|
||||||
following types can be used:
|
|
||||||
|
|
||||||
``b``
|
|
||||||
``GLbyte``
|
|
||||||
``B``
|
|
||||||
``GLubyte``
|
|
||||||
``s``
|
|
||||||
``GLshort``
|
|
||||||
``S``
|
|
||||||
``GLushort``
|
|
||||||
``i``
|
|
||||||
``GLint``
|
|
||||||
``I``
|
|
||||||
``GLuint``
|
|
||||||
``f``
|
|
||||||
``GLfloat``
|
|
||||||
``d``
|
|
||||||
``GLdouble``
|
|
||||||
|
|
||||||
``normalized`` indicates if the value should be normalized by OpenGL.
|
|
||||||
|
|
||||||
Some attributes constrain the possible data types; for example,
|
|
||||||
normal vectors must use one of the signed data types. The use of
|
|
||||||
some data types, while not illegal, may have severe performance
|
|
||||||
concerns. For example, the use of ``GLdouble`` is discouraged,
|
|
||||||
and colors should be specified with ``GLubyte``.
|
|
||||||
|
|
||||||
Whitespace is prohibited within the format string.
|
|
||||||
|
|
||||||
Some examples follow:
|
|
||||||
|
|
||||||
``vertices3f``
|
|
||||||
3-float vertex position
|
|
||||||
``colors4bn``
|
|
||||||
4-byte color, normalized
|
|
||||||
``colors3Bn``
|
|
||||||
3-unsigned byte color, normalized
|
|
||||||
``tex_coords3f``
|
|
||||||
3-float texture coordinate
|
|
||||||
"""
|
|
||||||
|
|
||||||
import re
|
|
||||||
import ctypes
|
import ctypes
|
||||||
|
|
||||||
from pyglet.gl import *
|
from pyglet.gl import *
|
||||||
from pyglet.graphics import vertexbuffer
|
|
||||||
|
|
||||||
_c_types = {
|
_c_types = {
|
||||||
GL_BYTE: ctypes.c_byte,
|
GL_BYTE: ctypes.c_byte,
|
||||||
@ -132,102 +49,6 @@ _c_types = {
|
|||||||
GL_DOUBLE: ctypes.c_double,
|
GL_DOUBLE: ctypes.c_double,
|
||||||
}
|
}
|
||||||
|
|
||||||
_gl_types = {
|
|
||||||
'b': GL_BYTE,
|
|
||||||
'B': GL_UNSIGNED_BYTE,
|
|
||||||
's': GL_SHORT,
|
|
||||||
'S': GL_UNSIGNED_SHORT,
|
|
||||||
'i': GL_INT,
|
|
||||||
'I': GL_UNSIGNED_INT,
|
|
||||||
'f': GL_FLOAT,
|
|
||||||
'd': GL_DOUBLE,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
_attribute_format_re = re.compile(r"""
|
|
||||||
(?P<name> .+?(?=[0-9]))
|
|
||||||
(?P<count>[1234])
|
|
||||||
(?P<type>[bBsSiIfd])
|
|
||||||
(?P<normalize>n?)
|
|
||||||
""", re.VERBOSE)
|
|
||||||
|
|
||||||
|
|
||||||
def _align(v, align):
|
|
||||||
return ((v - 1) & ~(align - 1)) + align
|
|
||||||
|
|
||||||
|
|
||||||
def interleave_attributes(attributes):
|
|
||||||
"""Interleave attribute offsets.
|
|
||||||
|
|
||||||
Adjusts the offsets and strides of the given attributes so that
|
|
||||||
they are interleaved. Alignment constraints are respected.
|
|
||||||
|
|
||||||
:Parameters:
|
|
||||||
`attributes` : sequence of `VertexAttribute`
|
|
||||||
Attributes to interleave in-place.
|
|
||||||
|
|
||||||
"""
|
|
||||||
stride = 0
|
|
||||||
max_size = 0
|
|
||||||
for attribute in attributes:
|
|
||||||
stride = _align(stride, attribute.align)
|
|
||||||
attribute.offset = stride
|
|
||||||
stride += attribute.size
|
|
||||||
max_size = max(max_size, attribute.size)
|
|
||||||
stride = _align(stride, max_size)
|
|
||||||
for attribute in attributes:
|
|
||||||
attribute.stride = stride
|
|
||||||
|
|
||||||
|
|
||||||
def serialize_attributes(count, attributes):
|
|
||||||
"""Serialize attribute offsets.
|
|
||||||
|
|
||||||
Adjust the offsets of the given attributes so that they are
|
|
||||||
packed serially against each other for `count` vertices.
|
|
||||||
|
|
||||||
:Parameters:
|
|
||||||
`count` : int
|
|
||||||
Number of vertices.
|
|
||||||
`attributes` : sequence of `VertexAttribute`
|
|
||||||
Attributes to serialize in-place.
|
|
||||||
|
|
||||||
"""
|
|
||||||
offset = 0
|
|
||||||
for attribute in attributes:
|
|
||||||
offset = _align(offset, attribute.align)
|
|
||||||
attribute.offset = offset
|
|
||||||
offset += count * attribute.stride
|
|
||||||
|
|
||||||
|
|
||||||
def create_attribute(shader_program, fmt):
|
|
||||||
"""Create a vertex attribute description from a format string.
|
|
||||||
|
|
||||||
The initial stride and offset of the attribute will be 0.
|
|
||||||
|
|
||||||
:Parameters:
|
|
||||||
`shader_program_id` : int
|
|
||||||
ID of the Shader Program that this attribute will belong to.
|
|
||||||
`fmt` : str
|
|
||||||
Attribute format string. See the module summary for details.
|
|
||||||
|
|
||||||
:rtype: `VertexAttribute`
|
|
||||||
"""
|
|
||||||
|
|
||||||
match = _attribute_format_re.match(fmt)
|
|
||||||
assert match, 'Invalid attribute format %r' % fmt
|
|
||||||
|
|
||||||
name = match.group('name')
|
|
||||||
count = int(match.group('count'))
|
|
||||||
gl_type = _gl_types[match.group('type')]
|
|
||||||
normalize = True if match.group('normalize') else False
|
|
||||||
|
|
||||||
attribute_meta = shader_program.attributes.get(name, None)
|
|
||||||
assert attribute_meta, f"No '{name}' attribute found in {shader_program}.\n"\
|
|
||||||
f"Valid attibutes are: {shader_program.attributes}."
|
|
||||||
assert count == attribute_meta.count, f"Invalid count of '{count}' for {attribute_meta}."
|
|
||||||
|
|
||||||
return VertexAttribute(name, attribute_meta.location, count, gl_type, normalize)
|
|
||||||
|
|
||||||
|
|
||||||
class VertexAttribute:
|
class VertexAttribute:
|
||||||
"""Abstract accessor for an attribute in a mapped buffer."""
|
"""Abstract accessor for an attribute in a mapped buffer."""
|
||||||
@ -239,7 +60,7 @@ class VertexAttribute:
|
|||||||
`name` : str
|
`name` : str
|
||||||
Name of the vertex attribute.
|
Name of the vertex attribute.
|
||||||
`location` : int
|
`location` : int
|
||||||
Location of the vertex attribute.
|
Location (index) of the vertex attribute.
|
||||||
`count` : int
|
`count` : int
|
||||||
Number of components in the attribute.
|
Number of components in the attribute.
|
||||||
`gl_type` : int
|
`gl_type` : int
|
||||||
@ -248,7 +69,6 @@ class VertexAttribute:
|
|||||||
True if OpenGL should normalize the values
|
True if OpenGL should normalize the values
|
||||||
|
|
||||||
"""
|
"""
|
||||||
assert count in (1, 2, 3, 4), 'Vertex attribute component count out of range'
|
|
||||||
self.name = name
|
self.name = name
|
||||||
self.location = location
|
self.location = location
|
||||||
self.count = count
|
self.count = count
|
||||||
@ -260,7 +80,6 @@ class VertexAttribute:
|
|||||||
self.align = ctypes.sizeof(self.c_type)
|
self.align = ctypes.sizeof(self.c_type)
|
||||||
self.size = count * self.align
|
self.size = count * self.align
|
||||||
self.stride = self.size
|
self.stride = self.size
|
||||||
self.offset = 0
|
|
||||||
|
|
||||||
def enable(self):
|
def enable(self):
|
||||||
"""Enable the attribute."""
|
"""Enable the attribute."""
|
||||||
@ -279,15 +98,11 @@ class VertexAttribute:
|
|||||||
attribute.
|
attribute.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
glVertexAttribPointer(self.location, self.count, self.gl_type, self.normalize, self.stride, self.offset+pointer)
|
glVertexAttribPointer(self.location, self.count, self.gl_type, self.normalize, self.stride, pointer)
|
||||||
|
|
||||||
def get_region(self, buffer, start, count):
|
def get_region(self, buffer, start, count):
|
||||||
"""Map a buffer region using this attribute as an accessor.
|
"""Map a buffer region using this attribute as an accessor.
|
||||||
|
|
||||||
The returned region can be modified as if the buffer was a contiguous
|
|
||||||
array of this attribute (though it may actually be interleaved or
|
|
||||||
otherwise non-contiguous).
|
|
||||||
|
|
||||||
The returned region consists of a contiguous array of component
|
The returned region consists of a contiguous array of component
|
||||||
data elements. For example, if this attribute uses 3 floats per
|
data elements. For example, if this attribute uses 3 floats per
|
||||||
vertex, and the `count` parameter is 4, the number of floats mapped
|
vertex, and the `count` parameter is 4, the number of floats mapped
|
||||||
@ -306,20 +121,8 @@ class VertexAttribute:
|
|||||||
byte_start = self.stride * start
|
byte_start = self.stride * start
|
||||||
byte_size = self.stride * count
|
byte_size = self.stride * count
|
||||||
array_count = self.count * count
|
array_count = self.count * count
|
||||||
|
|
||||||
if self.stride == self.size or not array_count:
|
|
||||||
# non-interleaved
|
|
||||||
ptr_type = ctypes.POINTER(self.c_type * array_count)
|
ptr_type = ctypes.POINTER(self.c_type * array_count)
|
||||||
return buffer.get_region(byte_start, byte_size, ptr_type)
|
return buffer.get_region(byte_start, byte_size, ptr_type)
|
||||||
else:
|
|
||||||
# interleaved
|
|
||||||
byte_start += self.offset
|
|
||||||
byte_size -= self.offset
|
|
||||||
elem_stride = self.stride // ctypes.sizeof(self.c_type)
|
|
||||||
elem_offset = self.offset // ctypes.sizeof(self.c_type)
|
|
||||||
ptr_type = ctypes.POINTER(self.c_type * (count * elem_stride - elem_offset))
|
|
||||||
region = buffer.get_region(byte_start, byte_size, ptr_type)
|
|
||||||
return vertexbuffer.IndirectArrayRegion(region, array_count, self.count, elem_stride)
|
|
||||||
|
|
||||||
def set_region(self, buffer, start, count, data):
|
def set_region(self, buffer, start, count, data):
|
||||||
"""Set the data over a region of the buffer.
|
"""Set the data over a region of the buffer.
|
||||||
@ -335,17 +138,11 @@ class VertexAttribute:
|
|||||||
Sequence of data components.
|
Sequence of data components.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if self.stride == self.size:
|
|
||||||
# non-interleaved
|
|
||||||
byte_start = self.stride * start
|
byte_start = self.stride * start
|
||||||
byte_size = self.stride * count
|
byte_size = self.stride * count
|
||||||
array_count = self.count * count
|
array_count = self.count * count
|
||||||
data = (self.c_type * array_count)(*data)
|
data = (self.c_type * array_count)(*data)
|
||||||
buffer.set_data_region(data, byte_start, byte_size)
|
buffer.set_data_region(data, byte_start, byte_size)
|
||||||
else:
|
|
||||||
# interleaved
|
|
||||||
region = self.get_region(buffer, start, count)
|
|
||||||
region[:] = data
|
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"VertexAttribute(name='{self.name}', location={self.location}, count={self.count})"
|
return f"VertexAttribute(name='{self.name}', location={self.location}, count={self.count})"
|
||||||
|
@ -50,27 +50,6 @@ import pyglet
|
|||||||
from pyglet.gl import *
|
from pyglet.gl import *
|
||||||
|
|
||||||
|
|
||||||
def create_buffer(size, target=GL_ARRAY_BUFFER, usage=GL_DYNAMIC_DRAW, mappable=True):
|
|
||||||
"""Create a buffer object for vertex or other data.
|
|
||||||
|
|
||||||
:Parameters:
|
|
||||||
`size` : int
|
|
||||||
Size of the buffer, in bytes
|
|
||||||
`target` : int
|
|
||||||
OpenGL target buffer (defaults to GL_ARRAY_BUFFER)
|
|
||||||
`usage` : int
|
|
||||||
OpenGL usage constant (defaults to GL_DYNAMIC_DRAW)
|
|
||||||
`mappable` : bool
|
|
||||||
True to create a mappable buffer (defaults to True)
|
|
||||||
|
|
||||||
:rtype: `AbstractBuffer` or `AbstractBuffer` with `AbstractMappable`
|
|
||||||
"""
|
|
||||||
if mappable:
|
|
||||||
return MappableBufferObject(size, target, usage)
|
|
||||||
else:
|
|
||||||
return BufferObject(size, target, usage)
|
|
||||||
|
|
||||||
|
|
||||||
class AbstractBuffer:
|
class AbstractBuffer:
|
||||||
"""Abstract buffer of byte data.
|
"""Abstract buffer of byte data.
|
||||||
|
|
||||||
@ -122,7 +101,7 @@ class AbstractBuffer:
|
|||||||
"""
|
"""
|
||||||
raise NotImplementedError('abstract')
|
raise NotImplementedError('abstract')
|
||||||
|
|
||||||
def map(self, invalidate=False):
|
def map(self):
|
||||||
"""Map the entire buffer into system memory.
|
"""Map the entire buffer into system memory.
|
||||||
|
|
||||||
The mapped region must be subsequently unmapped with `unmap` before
|
The mapped region must be subsequently unmapped with `unmap` before
|
||||||
@ -198,7 +177,7 @@ class BufferObject(AbstractBuffer):
|
|||||||
that does implement :py:meth:`~AbstractMappable.get_region`.
|
that does implement :py:meth:`~AbstractMappable.get_region`.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, size, target, usage):
|
def __init__(self, size, target, usage=GL_DYNAMIC_DRAW):
|
||||||
self.size = size
|
self.size = size
|
||||||
self.target = target
|
self.target = target
|
||||||
self.usage = usage
|
self.usage = usage
|
||||||
@ -211,6 +190,9 @@ class BufferObject(AbstractBuffer):
|
|||||||
glBindBuffer(target, self.id)
|
glBindBuffer(target, self.id)
|
||||||
glBufferData(target, self.size, None, self.usage)
|
glBufferData(target, self.size, None, self.usage)
|
||||||
|
|
||||||
|
def invalidate(self):
|
||||||
|
glBufferData(self.target, self.size, None, self.usage)
|
||||||
|
|
||||||
def bind(self):
|
def bind(self):
|
||||||
glBindBuffer(self.target, self.id)
|
glBindBuffer(self.target, self.id)
|
||||||
|
|
||||||
@ -225,17 +207,14 @@ class BufferObject(AbstractBuffer):
|
|||||||
glBindBuffer(self.target, self.id)
|
glBindBuffer(self.target, self.id)
|
||||||
glBufferSubData(self.target, start, length, data)
|
glBufferSubData(self.target, start, length, data)
|
||||||
|
|
||||||
def map(self, invalidate=False):
|
def map(self):
|
||||||
glBindBuffer(self.target, self.id)
|
glBindBuffer(self.target, self.id)
|
||||||
if invalidate:
|
|
||||||
glBufferData(self.target, self.size, None, self.usage)
|
|
||||||
ptr = ctypes.cast(glMapBuffer(self.target, GL_WRITE_ONLY), ctypes.POINTER(ctypes.c_byte * self.size)).contents
|
ptr = ctypes.cast(glMapBuffer(self.target, GL_WRITE_ONLY), ctypes.POINTER(ctypes.c_byte * self.size)).contents
|
||||||
return ptr
|
return ptr
|
||||||
|
|
||||||
def map_range(self, start, size, ptr_type):
|
def map_range(self, start, size, ptr_type):
|
||||||
glBindBuffer(self.target, self.id)
|
glBindBuffer(self.target, self.id)
|
||||||
ptr = ctypes.cast(glMapBufferRange(self.target, start, size, GL_MAP_WRITE_BIT), ptr_type).contents
|
ptr = ctypes.cast(glMapBufferRange(self.target, start, size, GL_MAP_WRITE_BIT), ptr_type).contents
|
||||||
glUnmapBuffer(self.target)
|
|
||||||
return ptr
|
return ptr
|
||||||
|
|
||||||
def unmap(self):
|
def unmap(self):
|
||||||
@ -268,6 +247,9 @@ class BufferObject(AbstractBuffer):
|
|||||||
self.size = size
|
self.size = size
|
||||||
glBufferData(self.target, self.size, temp, self.usage)
|
glBufferData(self.target, self.size, temp, self.usage)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"{self.__class__.__name__}(id={self.id}, size={self.size})"
|
||||||
|
|
||||||
|
|
||||||
class MappableBufferObject(BufferObject, AbstractMappable):
|
class MappableBufferObject(BufferObject, AbstractMappable):
|
||||||
"""A buffer with system-memory backed store.
|
"""A buffer with system-memory backed store.
|
||||||
@ -280,7 +262,7 @@ class MappableBufferObject(BufferObject, AbstractMappable):
|
|||||||
|
|
||||||
Updates to data via :py:meth:`map` are committed immediately.
|
Updates to data via :py:meth:`map` are committed immediately.
|
||||||
"""
|
"""
|
||||||
def __init__(self, size, target, usage):
|
def __init__(self, size, target, usage=GL_DYNAMIC_DRAW):
|
||||||
super(MappableBufferObject, self).__init__(size, target, usage)
|
super(MappableBufferObject, self).__init__(size, target, usage)
|
||||||
self.data = (ctypes.c_byte * size)()
|
self.data = (ctypes.c_byte * size)()
|
||||||
self.data_ptr = ctypes.addressof(self.data)
|
self.data_ptr = ctypes.addressof(self.data)
|
||||||
@ -337,29 +319,8 @@ class MappableBufferObject(BufferObject, AbstractMappable):
|
|||||||
self._dirty_max = 0
|
self._dirty_max = 0
|
||||||
|
|
||||||
|
|
||||||
class AbstractBufferRegion:
|
class BufferObjectRegion:
|
||||||
"""A mapped region of a buffer.
|
"""A mapped region of a MappableBufferObject."""
|
||||||
|
|
||||||
Buffer regions are obtained using :py:meth:`~AbstractMappable.get_region`.
|
|
||||||
|
|
||||||
:Ivariables:
|
|
||||||
`array` : ctypes array
|
|
||||||
Array of data, of the type and count requested by
|
|
||||||
:py:meth:`~AbstractMappable.get_region`.
|
|
||||||
|
|
||||||
"""
|
|
||||||
def invalidate(self):
|
|
||||||
"""Mark this region as changed.
|
|
||||||
|
|
||||||
The buffer may not be updated with the latest contents of the
|
|
||||||
array until this method is called. (However, it may not be updated
|
|
||||||
until the next time the buffer is used, for efficiency).
|
|
||||||
"""
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class BufferObjectRegion(AbstractBufferRegion):
|
|
||||||
"""A mapped region of a BufferObject."""
|
|
||||||
|
|
||||||
__slots__ = 'buffer', 'start', 'end', 'array'
|
__slots__ = 'buffer', 'start', 'end', 'array'
|
||||||
|
|
||||||
@ -370,115 +331,12 @@ class BufferObjectRegion(AbstractBufferRegion):
|
|||||||
self.array = array
|
self.array = array
|
||||||
|
|
||||||
def invalidate(self):
|
def invalidate(self):
|
||||||
|
"""Mark this region as changed.
|
||||||
|
|
||||||
|
The buffer may not be updated with the latest contents of the
|
||||||
|
array until this method is called. (However, it may not be updated
|
||||||
|
until the next time the buffer is used, for efficiency).
|
||||||
|
"""
|
||||||
buffer = self.buffer
|
buffer = self.buffer
|
||||||
buffer._dirty_min = min(buffer._dirty_min, self.start)
|
buffer._dirty_min = min(buffer._dirty_min, self.start)
|
||||||
buffer._dirty_max = max(buffer._dirty_max, self.end)
|
buffer._dirty_max = max(buffer._dirty_max, self.end)
|
||||||
|
|
||||||
|
|
||||||
class IndirectArrayRegion(AbstractBufferRegion):
|
|
||||||
"""A mapped region in which data elements are not necessarily contiguous.
|
|
||||||
|
|
||||||
This region class is used to wrap buffer regions in which the data
|
|
||||||
must be accessed with some stride. For example, in an interleaved buffer
|
|
||||||
this region can be used to access a single interleaved component as if the
|
|
||||||
data was contiguous.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, region, size, component_count, component_stride):
|
|
||||||
"""Wrap a buffer region.
|
|
||||||
|
|
||||||
Use the `component_count` and `component_stride` parameters to specify
|
|
||||||
the data layout of the encapsulated region. For example, if RGBA
|
|
||||||
data is to be accessed as if it were packed RGB, ``component_count``
|
|
||||||
would be set to 3 and ``component_stride`` to 4. If the region
|
|
||||||
contains 10 RGBA tuples, the ``size`` parameter is ``3 * 10 = 30``.
|
|
||||||
|
|
||||||
:Parameters:
|
|
||||||
`region` : `AbstractBufferRegion`
|
|
||||||
The region with interleaved data
|
|
||||||
`size` : int
|
|
||||||
The number of elements that this region will provide access to.
|
|
||||||
`component_count` : int
|
|
||||||
The number of elements that are contiguous before some must
|
|
||||||
be skipped.
|
|
||||||
`component_stride` : int
|
|
||||||
The number of elements of interleaved data separating
|
|
||||||
the contiguous sections.
|
|
||||||
|
|
||||||
"""
|
|
||||||
self.region = region
|
|
||||||
self.size = size
|
|
||||||
self.count = component_count
|
|
||||||
self.stride = component_stride
|
|
||||||
self.array = self
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return 'IndirectArrayRegion(size=%d, count=%d, stride=%d)' % (
|
|
||||||
self.size, self.count, self.stride)
|
|
||||||
|
|
||||||
def __getitem__(self, index):
|
|
||||||
count = self.count
|
|
||||||
if not isinstance(index, slice):
|
|
||||||
elem = index // count
|
|
||||||
j = index % count
|
|
||||||
return self.region.array[elem * self.stride + j]
|
|
||||||
|
|
||||||
start = index.start or 0
|
|
||||||
stop = index.stop
|
|
||||||
step = index.step or 1
|
|
||||||
if start < 0:
|
|
||||||
start = self.size + start
|
|
||||||
if stop is None:
|
|
||||||
stop = self.size
|
|
||||||
elif stop < 0:
|
|
||||||
stop = self.size + stop
|
|
||||||
|
|
||||||
assert step == 1 or step % count == 0, 'Step must be multiple of component count'
|
|
||||||
|
|
||||||
data_start = (start // count) * self.stride + start % count
|
|
||||||
data_stop = (stop // count) * self.stride + stop % count
|
|
||||||
data_step = step * self.stride
|
|
||||||
|
|
||||||
# TODO stepped getitem is probably wrong, see setitem for correct.
|
|
||||||
value_step = step * count
|
|
||||||
|
|
||||||
value = [0] * ((stop - start) // step)
|
|
||||||
stride = self.stride
|
|
||||||
for i in range(count):
|
|
||||||
value[i::value_step] = self.region.array[data_start + i:data_stop + i:data_step]
|
|
||||||
return value
|
|
||||||
|
|
||||||
def __setitem__(self, index, value):
|
|
||||||
count = self.count
|
|
||||||
if not isinstance(index, slice):
|
|
||||||
elem = index // count
|
|
||||||
j = index % count
|
|
||||||
self.region.array[elem * self.stride + j] = value
|
|
||||||
return
|
|
||||||
|
|
||||||
start = index.start or 0
|
|
||||||
stop = index.stop
|
|
||||||
step = index.step or 1
|
|
||||||
if start < 0:
|
|
||||||
start = self.size + start
|
|
||||||
if stop is None:
|
|
||||||
stop = self.size
|
|
||||||
elif stop < 0:
|
|
||||||
stop = self.size + stop
|
|
||||||
|
|
||||||
assert step == 1 or step % count == 0, 'Step must be multiple of component count'
|
|
||||||
|
|
||||||
data_start = (start // count) * self.stride + start % count
|
|
||||||
data_stop = (stop // count) * self.stride + stop % count
|
|
||||||
|
|
||||||
if step == 1:
|
|
||||||
data_step = self.stride
|
|
||||||
value_step = count
|
|
||||||
for i in range(count):
|
|
||||||
self.region.array[data_start + i:data_stop + i:data_step] = value[i::value_step]
|
|
||||||
else:
|
|
||||||
data_step = (step // count) * self.stride
|
|
||||||
self.region.array[data_start:data_stop:data_step] = value
|
|
||||||
|
|
||||||
def invalidate(self):
|
|
||||||
self.region.invalidate()
|
|
||||||
|
@ -56,24 +56,13 @@ The entire domain can be efficiently drawn in one step with the
|
|||||||
primitives of the same OpenGL primitive mode.
|
primitives of the same OpenGL primitive mode.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import re
|
|
||||||
import ctypes
|
import ctypes
|
||||||
|
|
||||||
import pyglet
|
import pyglet
|
||||||
|
|
||||||
from pyglet.gl import *
|
from pyglet.gl import *
|
||||||
from pyglet.graphics import allocation, vertexattribute, vertexbuffer
|
from pyglet.graphics import allocation, vertexattribute, vertexarray
|
||||||
|
from pyglet.graphics.vertexbuffer import BufferObject, MappableBufferObject
|
||||||
_usage_format_re = re.compile(r"""
|
|
||||||
(?P<attribute>[^/]*)
|
|
||||||
(/ (?P<usage> static|dynamic|stream|none))?
|
|
||||||
""", re.VERBOSE)
|
|
||||||
|
|
||||||
_gl_usages = {
|
|
||||||
'static': GL_STATIC_DRAW,
|
|
||||||
'dynamic': GL_DYNAMIC_DRAW,
|
|
||||||
'stream': GL_STREAM_DRAW,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def _nearest_pow2(v):
|
def _nearest_pow2(v):
|
||||||
@ -88,52 +77,28 @@ def _nearest_pow2(v):
|
|||||||
return v + 1
|
return v + 1
|
||||||
|
|
||||||
|
|
||||||
def create_attribute_usage(shader_program, fmt):
|
_c_types = {
|
||||||
"""Create an attribute and usage pair from a format string. The
|
GL_BYTE: ctypes.c_byte,
|
||||||
format string is as documented in `pyglet.graphics.vertexattribute`, with
|
GL_UNSIGNED_BYTE: ctypes.c_ubyte,
|
||||||
the addition of an optional usage component::
|
GL_SHORT: ctypes.c_short,
|
||||||
|
GL_UNSIGNED_SHORT: ctypes.c_ushort,
|
||||||
usage ::= attribute ( '/' ('static' | 'dynamic' | 'stream') )?
|
GL_INT: ctypes.c_int,
|
||||||
|
GL_UNSIGNED_INT: ctypes.c_uint,
|
||||||
If the usage is not given it defaults to 'dynamic'. The usage corresponds
|
GL_FLOAT: ctypes.c_float,
|
||||||
to the OpenGL VBO usage hint, and for ``static`` also indicates a
|
GL_DOUBLE: ctypes.c_double,
|
||||||
preference for interleaved arrays.
|
}
|
||||||
|
|
||||||
Some examples:
|
|
||||||
|
|
||||||
``v3f/stream``
|
|
||||||
3D vertex position using floats, for stream usage
|
|
||||||
``c4b/static``
|
|
||||||
4-byte color attribute, for static usage
|
|
||||||
|
|
||||||
:return: attribute, usage
|
|
||||||
"""
|
|
||||||
match = _usage_format_re.match(fmt)
|
|
||||||
attribute_format = match.group('attribute')
|
|
||||||
attribute = vertexattribute.create_attribute(shader_program, attribute_format)
|
|
||||||
usage = match.group('usage')
|
|
||||||
if usage:
|
|
||||||
usage = _gl_usages[usage]
|
|
||||||
else:
|
|
||||||
usage = GL_DYNAMIC_DRAW
|
|
||||||
|
|
||||||
return attribute, usage
|
|
||||||
|
|
||||||
|
|
||||||
def create_domain(shader_program, *attribute_usage_formats, indexed):
|
_gl_types = {
|
||||||
"""Create a vertex domain covering the given attribute usage formats.
|
'b': GL_BYTE,
|
||||||
See documentation for :py:func:`create_attribute_usage` and
|
'B': GL_UNSIGNED_BYTE,
|
||||||
:py:func:`pyglet.graphics.vertexattribute.create_attribute` for the grammar
|
's': GL_SHORT,
|
||||||
of these format strings.
|
'S': GL_UNSIGNED_SHORT,
|
||||||
|
'i': GL_INT,
|
||||||
:rtype: :py:class:`VertexDomain`
|
'I': GL_UNSIGNED_INT,
|
||||||
"""
|
'f': GL_FLOAT,
|
||||||
attribute_usages = [create_attribute_usage(shader_program, f) for f in attribute_usage_formats]
|
'd': GL_DOUBLE,
|
||||||
|
}
|
||||||
if indexed:
|
|
||||||
return IndexedVertexDomain(attribute_usages)
|
|
||||||
else:
|
|
||||||
return VertexDomain(attribute_usages)
|
|
||||||
|
|
||||||
|
|
||||||
class VertexDomain:
|
class VertexDomain:
|
||||||
@ -145,47 +110,32 @@ class VertexDomain:
|
|||||||
version = 0
|
version = 0
|
||||||
_initial_count = 16
|
_initial_count = 16
|
||||||
|
|
||||||
def __init__(self, attribute_usages):
|
def __init__(self, program, attribute_meta):
|
||||||
|
self.program = program
|
||||||
|
self.attribute_meta = attribute_meta
|
||||||
self.allocator = allocation.Allocator(self._initial_count)
|
self.allocator = allocation.Allocator(self._initial_count)
|
||||||
|
self.vao = vertexarray.VertexArray()
|
||||||
|
|
||||||
static_attributes = []
|
self.attributes = []
|
||||||
attributes = []
|
|
||||||
self.buffer_attributes = [] # list of (buffer, attributes)
|
self.buffer_attributes = [] # list of (buffer, attributes)
|
||||||
for attribute, usage in attribute_usages:
|
|
||||||
|
|
||||||
if usage == GL_STATIC_DRAW:
|
for name, meta in attribute_meta.items():
|
||||||
# Group attributes for interleaved buffer
|
location = meta['location']
|
||||||
static_attributes.append(attribute)
|
count = meta['count']
|
||||||
attributes.append(attribute)
|
gl_type = _gl_types[meta['format'][0]]
|
||||||
else:
|
normalize = 'n' in meta['format']
|
||||||
# Create non-interleaved buffer
|
attribute = vertexattribute.VertexAttribute(name, location, count, gl_type, normalize)
|
||||||
attributes.append(attribute)
|
self.attributes.append(attribute)
|
||||||
attribute.buffer = vertexbuffer.create_buffer(
|
# Create buffer:
|
||||||
attribute.stride * self.allocator.capacity, usage=usage)
|
attribute.buffer = MappableBufferObject(attribute.stride * self.allocator.capacity, GL_ARRAY_BUFFER)
|
||||||
attribute.buffer.element_size = attribute.stride
|
attribute.buffer.element_size = attribute.stride
|
||||||
attribute.buffer.attributes = (attribute,)
|
attribute.buffer.attributes = (attribute,)
|
||||||
self.buffer_attributes.append((attribute.buffer, (attribute,)))
|
self.buffer_attributes.append((attribute.buffer, (attribute,)))
|
||||||
|
|
||||||
# Create buffer for interleaved data
|
|
||||||
if static_attributes:
|
|
||||||
vertexattribute.interleave_attributes(static_attributes)
|
|
||||||
stride = static_attributes[0].stride
|
|
||||||
buffer = vertexbuffer.create_buffer(
|
|
||||||
stride * self.allocator.capacity, usage=GL_STATIC_DRAW)
|
|
||||||
buffer.element_size = stride
|
|
||||||
self.buffer_attributes.append((buffer, static_attributes))
|
|
||||||
|
|
||||||
attributes.extend(static_attributes)
|
|
||||||
for attribute in static_attributes:
|
|
||||||
attribute.buffer = buffer
|
|
||||||
|
|
||||||
# Create named attributes for each attribute
|
# Create named attributes for each attribute
|
||||||
self.attributes = attributes
|
|
||||||
self.attribute_names = {}
|
self.attribute_names = {}
|
||||||
for attribute in attributes:
|
for attribute in self.attributes:
|
||||||
name = attribute.name
|
self.attribute_names[attribute.name] = attribute
|
||||||
assert name not in self.attributes, 'More than one "%s" attribute given' % name
|
|
||||||
self.attribute_names[name] = attribute
|
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
# Break circular refs that Python GC seems to miss even when forced
|
# Break circular refs that Python GC seems to miss even when forced
|
||||||
@ -245,6 +195,8 @@ class VertexDomain:
|
|||||||
OpenGL drawing mode, e.g. ``GL_POINTS``, ``GL_LINES``, etc.
|
OpenGL drawing mode, e.g. ``GL_POINTS``, ``GL_LINES``, etc.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
self.vao.bind()
|
||||||
|
|
||||||
for buffer, attributes in self.buffer_attributes:
|
for buffer, attributes in self.buffer_attributes:
|
||||||
buffer.bind()
|
buffer.bind()
|
||||||
for attribute in attributes:
|
for attribute in attributes:
|
||||||
@ -279,6 +231,8 @@ class VertexDomain:
|
|||||||
Vertex list to draw.
|
Vertex list to draw.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
self.vao.bind()
|
||||||
|
|
||||||
for buffer, attributes in self.buffer_attributes:
|
for buffer, attributes in self.buffer_attributes:
|
||||||
buffer.bind()
|
buffer.bind()
|
||||||
for attribute in attributes:
|
for attribute in attributes:
|
||||||
@ -317,10 +271,7 @@ class VertexList:
|
|||||||
OpenGL drawing mode, e.g. ``GL_POINTS``, ``GL_LINES``, etc.
|
OpenGL drawing mode, e.g. ``GL_POINTS``, ``GL_LINES``, etc.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
with pyglet.graphics.get_default_batch().vao:
|
|
||||||
pyglet.graphics.get_default_group().set_state()
|
|
||||||
self.domain.draw_subset(mode, self)
|
self.domain.draw_subset(mode, self)
|
||||||
pyglet.graphics.get_default_group().unset_state()
|
|
||||||
|
|
||||||
def resize(self, count, index_count=None):
|
def resize(self, count, index_count=None):
|
||||||
"""Resize this group.
|
"""Resize this group.
|
||||||
@ -380,10 +331,7 @@ class VertexList:
|
|||||||
|
|
||||||
def set_attribute_data(self, i, data):
|
def set_attribute_data(self, i, data):
|
||||||
attribute = self.domain.attributes[i]
|
attribute = self.domain.attributes[i]
|
||||||
# TODO without region
|
attribute.set_region(attribute.buffer, self.start, self.count, data)
|
||||||
region = attribute.get_region(attribute.buffer, self.start, self.count)
|
|
||||||
region.array[:] = data
|
|
||||||
region.invalidate()
|
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
"""dynamic access to vertex attributes, for backwards compatibility.
|
"""dynamic access to vertex attributes, for backwards compatibility.
|
||||||
@ -414,17 +362,16 @@ class IndexedVertexDomain(VertexDomain):
|
|||||||
"""
|
"""
|
||||||
_initial_index_count = 16
|
_initial_index_count = 16
|
||||||
|
|
||||||
def __init__(self, attribute_usages, index_gl_type=GL_UNSIGNED_INT):
|
def __init__(self, program, attribute_meta, index_gl_type=GL_UNSIGNED_INT):
|
||||||
super(IndexedVertexDomain, self).__init__(attribute_usages)
|
super(IndexedVertexDomain, self).__init__(program, attribute_meta)
|
||||||
|
|
||||||
self.index_allocator = allocation.Allocator(self._initial_index_count)
|
self.index_allocator = allocation.Allocator(self._initial_index_count)
|
||||||
|
|
||||||
self.index_gl_type = index_gl_type
|
self.index_gl_type = index_gl_type
|
||||||
self.index_c_type = vertexattribute._c_types[index_gl_type]
|
self.index_c_type = vertexattribute._c_types[index_gl_type]
|
||||||
self.index_element_size = ctypes.sizeof(self.index_c_type)
|
self.index_element_size = ctypes.sizeof(self.index_c_type)
|
||||||
self.index_buffer = vertexbuffer.create_buffer(
|
self.index_buffer = BufferObject(
|
||||||
self.index_allocator.capacity * self.index_element_size,
|
self.index_allocator.capacity * self.index_element_size, GL_ELEMENT_ARRAY_BUFFER)
|
||||||
target=GL_ELEMENT_ARRAY_BUFFER)
|
|
||||||
|
|
||||||
def safe_index_alloc(self, count):
|
def safe_index_alloc(self, count):
|
||||||
"""Allocate indices, resizing the buffers if necessary."""
|
"""Allocate indices, resizing the buffers if necessary."""
|
||||||
@ -463,7 +410,7 @@ class IndexedVertexDomain(VertexDomain):
|
|||||||
return IndexedVertexList(self, start, count, index_start, index_count)
|
return IndexedVertexList(self, start, count, index_start, index_count)
|
||||||
|
|
||||||
def get_index_region(self, start, count):
|
def get_index_region(self, start, count):
|
||||||
"""Get a region of the index buffer.
|
"""Get a data from a region of the index buffer.
|
||||||
|
|
||||||
:Parameters:
|
:Parameters:
|
||||||
`start` : int
|
`start` : int
|
||||||
@ -476,7 +423,18 @@ class IndexedVertexDomain(VertexDomain):
|
|||||||
byte_start = self.index_element_size * start
|
byte_start = self.index_element_size * start
|
||||||
byte_count = self.index_element_size * count
|
byte_count = self.index_element_size * count
|
||||||
ptr_type = ctypes.POINTER(self.index_c_type * count)
|
ptr_type = ctypes.POINTER(self.index_c_type * count)
|
||||||
return self.index_buffer.get_region(byte_start, byte_count, ptr_type)
|
map_ptr = self.index_buffer.map_range(byte_start, byte_count, ptr_type)
|
||||||
|
data = map_ptr[:]
|
||||||
|
self.index_buffer.unmap()
|
||||||
|
return data
|
||||||
|
|
||||||
|
def set_index_region(self, start, count, data):
|
||||||
|
byte_start = self.index_element_size * start
|
||||||
|
byte_count = self.index_element_size * count
|
||||||
|
ptr_type = ctypes.POINTER(self.index_c_type * count)
|
||||||
|
map_ptr = self.index_buffer.map_range(byte_start, byte_count, ptr_type)
|
||||||
|
map_ptr[:] = data
|
||||||
|
self.index_buffer.unmap()
|
||||||
|
|
||||||
def draw(self, mode):
|
def draw(self, mode):
|
||||||
"""Draw all vertices in the domain.
|
"""Draw all vertices in the domain.
|
||||||
@ -489,6 +447,8 @@ class IndexedVertexDomain(VertexDomain):
|
|||||||
OpenGL drawing mode, e.g. ``GL_POINTS``, ``GL_LINES``, etc.
|
OpenGL drawing mode, e.g. ``GL_POINTS``, ``GL_LINES``, etc.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
self.vao.bind()
|
||||||
|
|
||||||
for buffer, attributes in self.buffer_attributes:
|
for buffer, attributes in self.buffer_attributes:
|
||||||
buffer.bind()
|
buffer.bind()
|
||||||
for attribute in attributes:
|
for attribute in attributes:
|
||||||
@ -527,6 +487,8 @@ class IndexedVertexDomain(VertexDomain):
|
|||||||
Vertex list to draw.
|
Vertex list to draw.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
self.vao.bind()
|
||||||
|
|
||||||
for buffer, attributes in self.buffer_attributes:
|
for buffer, attributes in self.buffer_attributes:
|
||||||
buffer.bind()
|
buffer.bind()
|
||||||
for attribute in attributes:
|
for attribute in attributes:
|
||||||
@ -552,7 +514,6 @@ class IndexedVertexList(VertexList):
|
|||||||
|
|
||||||
def __init__(self, domain, start, count, index_start, index_count):
|
def __init__(self, domain, start, count, index_start, index_count):
|
||||||
super().__init__(domain, start, count)
|
super().__init__(domain, start, count)
|
||||||
|
|
||||||
self.index_start = index_start
|
self.index_start = index_start
|
||||||
self.index_count = index_count
|
self.index_count = index_count
|
||||||
|
|
||||||
@ -575,15 +536,13 @@ class IndexedVertexList(VertexList):
|
|||||||
self.indices[:] = [i + diff for i in self.indices]
|
self.indices[:] = [i + diff for i in self.indices]
|
||||||
|
|
||||||
# Resize indices
|
# Resize indices
|
||||||
new_start = self.domain.safe_index_realloc(
|
new_start = self.domain.safe_index_realloc(self.index_start, self.index_count, index_count)
|
||||||
self.index_start, self.index_count, index_count)
|
|
||||||
if new_start != self.index_start:
|
if new_start != self.index_start:
|
||||||
old = self.domain.get_index_region(
|
old = self.domain.get_index_region(self.index_start, self.index_count)
|
||||||
self.index_start, self.index_count)
|
new = self.domain.get_index_region(self.index_start, self.index_count)
|
||||||
new = self.domain.get_index_region(
|
|
||||||
self.index_start, self.index_count)
|
|
||||||
new.array[:] = old.array[:]
|
new.array[:] = old.array[:]
|
||||||
new.invalidate()
|
new.invalidate()
|
||||||
|
|
||||||
self.index_start = new_start
|
self.index_start = new_start
|
||||||
self.index_count = index_count
|
self.index_count = index_count
|
||||||
self._indices_cache_version = None
|
self._indices_cache_version = None
|
||||||
@ -611,30 +570,21 @@ class IndexedVertexList(VertexList):
|
|||||||
# because the vertices are in a new position in the new domain
|
# because the vertices are in a new position in the new domain
|
||||||
if old_start != self.start:
|
if old_start != self.start:
|
||||||
diff = self.start - old_start
|
diff = self.start - old_start
|
||||||
region = old_domain.get_index_region(self.index_start, self.index_count)
|
old_indices = old_domain.get_index_region(self.index_start, self.index_count)
|
||||||
old_indices = region.array
|
old_domain.set_index_region(self.index_start, self.index_count, [i + diff for i in old_indices])
|
||||||
old_indices[:] = [i + diff for i in old_indices]
|
|
||||||
region.invalidate()
|
|
||||||
|
|
||||||
# copy indices to new domain
|
# copy indices to new domain
|
||||||
old = old_domain.get_index_region(self.index_start, self.index_count)
|
old_array = old_domain.get_index_region(self.index_start, self.index_count)
|
||||||
# must delloc before calling safe_index_alloc or else problems when same
|
# must delloc before calling safe_index_alloc or else problems when same
|
||||||
# batch is migrated to because index_start changes after dealloc
|
# batch is migrated to because index_start changes after dealloc
|
||||||
old_domain.index_allocator.dealloc(self.index_start, self.index_count)
|
old_domain.index_allocator.dealloc(self.index_start, self.index_count)
|
||||||
|
|
||||||
new_start = self.domain.safe_index_alloc(self.index_count)
|
new_start = self.domain.safe_index_alloc(self.index_count)
|
||||||
new = self.domain.get_index_region(new_start, self.index_count)
|
self.domain.set_index_region(new_start, self.index_count, old_array)
|
||||||
new.array[:] = old.array[:]
|
|
||||||
new.invalidate()
|
|
||||||
|
|
||||||
self.index_start = new_start
|
self.index_start = new_start
|
||||||
self._indices_cache_version = None
|
self._indices_cache_version = None
|
||||||
|
|
||||||
def set_index_data(self, data):
|
|
||||||
# TODO without region
|
|
||||||
region = self.domain.get_index_region(self.index_start, self.index_count)
|
|
||||||
region.array[:] = data
|
|
||||||
region.invalidate()
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def indices(self):
|
def indices(self):
|
||||||
"""Array of index data."""
|
"""Array of index data."""
|
||||||
@ -643,10 +593,8 @@ class IndexedVertexList(VertexList):
|
|||||||
self._indices_cache = domain.get_index_region(self.index_start, self.index_count)
|
self._indices_cache = domain.get_index_region(self.index_start, self.index_count)
|
||||||
self._indices_cache_version = domain.version
|
self._indices_cache_version = domain.version
|
||||||
|
|
||||||
region = self._indices_cache
|
return self._indices_cache
|
||||||
region.invalidate()
|
|
||||||
return region.array
|
|
||||||
|
|
||||||
@indices.setter
|
@indices.setter
|
||||||
def indices(self, data):
|
def indices(self, data):
|
||||||
self.indices[:] = data
|
self.domain.set_index_region(self.index_start, self.index_count, data)
|
||||||
|
@ -287,11 +287,6 @@ def _color_as_bytes(color):
|
|||||||
return bytes(color)
|
return bytes(color)
|
||||||
|
|
||||||
|
|
||||||
def _is_pow2(v):
|
|
||||||
# http://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2
|
|
||||||
return (v & (v - 1)) == 0
|
|
||||||
|
|
||||||
|
|
||||||
class ImagePattern:
|
class ImagePattern:
|
||||||
"""Abstract image creation class."""
|
"""Abstract image creation class."""
|
||||||
|
|
||||||
@ -396,22 +391,8 @@ class AbstractImage:
|
|||||||
def get_texture(self, rectangle=False):
|
def get_texture(self, rectangle=False):
|
||||||
"""A :py:class:`~pyglet.image.Texture` view of this image.
|
"""A :py:class:`~pyglet.image.Texture` view of this image.
|
||||||
|
|
||||||
By default, textures are created with dimensions that are powers of
|
The Texture target will be (``GL_TEXTURE_RECTANGLE``) if the `rectangle`
|
||||||
two. Smaller images will return a :py:class:`~pyglet.image.TextureRegion` that covers just
|
parameter is ``True``, otherwise it will be (``GL_TEXTURE_2D``).
|
||||||
the image portion of the larger texture. This restriction is required
|
|
||||||
on older video cards, and for compressed textures, or where texture
|
|
||||||
repeat modes will be used, or where mipmapping is desired.
|
|
||||||
|
|
||||||
If the `rectangle` parameter is ``True``, this restriction is ignored
|
|
||||||
and a texture the size of the image may be created if the driver
|
|
||||||
supports the ``GL_ARB_texture_rectangle`` or
|
|
||||||
``GL_NV_texture_rectangle`` extensions. If the extensions are not
|
|
||||||
present, the image already is a texture, or the image has power 2
|
|
||||||
dimensions, the `rectangle` parameter is ignored.
|
|
||||||
|
|
||||||
Examine `Texture.target` to determine if the returned texture is a
|
|
||||||
rectangle (``GL_TEXTURE_RECTANGLE``) or not (``GL_TEXTURE_2D``).
|
|
||||||
|
|
||||||
Changes to the returned instance may or may not be reflected in this
|
Changes to the returned instance may or may not be reflected in this
|
||||||
image.
|
image.
|
||||||
|
|
||||||
@ -429,8 +410,6 @@ class AbstractImage:
|
|||||||
def get_mipmapped_texture(self):
|
def get_mipmapped_texture(self):
|
||||||
"""Retrieve a :py:class:`~pyglet.image.Texture` instance with all mipmap levels filled in.
|
"""Retrieve a :py:class:`~pyglet.image.Texture` instance with all mipmap levels filled in.
|
||||||
|
|
||||||
Requires that image dimensions be powers of 2.
|
|
||||||
|
|
||||||
:rtype: :py:class:`~pyglet.image.Texture`
|
:rtype: :py:class:`~pyglet.image.Texture`
|
||||||
|
|
||||||
.. versionadded:: 1.1
|
.. versionadded:: 1.1
|
||||||
@ -755,9 +734,6 @@ class ImageData(AbstractImage):
|
|||||||
if level == 0:
|
if level == 0:
|
||||||
raise ImageException('Cannot set mipmap image at level 0 (it is this image)')
|
raise ImageException('Cannot set mipmap image at level 0 (it is this image)')
|
||||||
|
|
||||||
if not _is_pow2(self.width) or not _is_pow2(self.height):
|
|
||||||
raise ImageException('Image dimensions must be powers of 2 to use mipmaps.')
|
|
||||||
|
|
||||||
# Check dimensions of mipmap
|
# Check dimensions of mipmap
|
||||||
width, height = self.width, self.height
|
width, height = self.width, self.height
|
||||||
for i in range(level):
|
for i in range(level):
|
||||||
@ -773,10 +749,6 @@ class ImageData(AbstractImage):
|
|||||||
def create_texture(self, cls, rectangle=False):
|
def create_texture(self, cls, rectangle=False):
|
||||||
"""Create a texture containing this image.
|
"""Create a texture containing this image.
|
||||||
|
|
||||||
If the image's dimensions are not powers of 2, a TextureRegion of
|
|
||||||
a larger Texture will be returned that matches the dimensions of this
|
|
||||||
image.
|
|
||||||
|
|
||||||
:Parameters:
|
:Parameters:
|
||||||
`cls` : class (subclass of Texture)
|
`cls` : class (subclass of Texture)
|
||||||
Class to construct.
|
Class to construct.
|
||||||
@ -811,8 +783,6 @@ class ImageData(AbstractImage):
|
|||||||
of images defined will be used. Otherwise, mipmaps will be
|
of images defined will be used. Otherwise, mipmaps will be
|
||||||
automatically generated.
|
automatically generated.
|
||||||
|
|
||||||
The texture dimensions must be powers of 2 to use mipmaps.
|
|
||||||
|
|
||||||
:rtype: :py:class:`~pyglet.image.Texture`
|
:rtype: :py:class:`~pyglet.image.Texture`
|
||||||
|
|
||||||
.. versionadded:: 1.1
|
.. versionadded:: 1.1
|
||||||
@ -820,9 +790,6 @@ class ImageData(AbstractImage):
|
|||||||
if self._current_mipmap_texture:
|
if self._current_mipmap_texture:
|
||||||
return self._current_mipmap_texture
|
return self._current_mipmap_texture
|
||||||
|
|
||||||
if not _is_pow2(self.width) or not _is_pow2(self.height):
|
|
||||||
raise ImageException('Image dimensions must be powers of 2 to use mipmaps.')
|
|
||||||
|
|
||||||
texture = Texture.create(self.width, self.height, GL_TEXTURE_2D, None)
|
texture = Texture.create(self.width, self.height, GL_TEXTURE_2D, None)
|
||||||
if self.anchor_x or self.anchor_y:
|
if self.anchor_x or self.anchor_y:
|
||||||
texture.anchor_x = self.anchor_x
|
texture.anchor_x = self.anchor_x
|
||||||
@ -1422,9 +1389,9 @@ class Texture(AbstractImage):
|
|||||||
glBindTexture(self.target, self.id)
|
glBindTexture(self.target, self.id)
|
||||||
|
|
||||||
pyglet.graphics.draw_indexed(4, GL_TRIANGLES, [0, 1, 2, 0, 2, 3],
|
pyglet.graphics.draw_indexed(4, GL_TRIANGLES, [0, 1, 2, 0, 2, 3],
|
||||||
('position3f', vertices),
|
position=('f', vertices),
|
||||||
('tex_coords3f', self.tex_coords),
|
tex_coords=('f', self.tex_coords),
|
||||||
('colors4Bn', self.colors))
|
colors=('Bn', self.colors))
|
||||||
|
|
||||||
glBindTexture(self.target, 0)
|
glBindTexture(self.target, 0)
|
||||||
|
|
||||||
@ -1758,14 +1725,9 @@ TextureArrayRegion.region_class = TextureArrayRegion
|
|||||||
class TileableTexture(Texture):
|
class TileableTexture(Texture):
|
||||||
"""A texture that can be tiled efficiently.
|
"""A texture that can be tiled efficiently.
|
||||||
|
|
||||||
Use :py:class:`~pyglet.image.create_for_Image` classmethod to construct.
|
Use :py:class:`~pyglet.image.create_for_image` classmethod to construct.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, width, height, target, tex_id):
|
|
||||||
if not _is_pow2(width) or not _is_pow2(height):
|
|
||||||
raise ImageException('TileableTexture requires dimensions that are powers of 2')
|
|
||||||
super().__init__(width, height, target, tex_id)
|
|
||||||
|
|
||||||
def get_region(self, x, y, width, height):
|
def get_region(self, x, y, width, height):
|
||||||
raise ImageException('Cannot get region of %r' % self)
|
raise ImageException('Cannot get region of %r' % self)
|
||||||
|
|
||||||
@ -1795,8 +1757,8 @@ class TileableTexture(Texture):
|
|||||||
glActiveTexture(GL_TEXTURE0)
|
glActiveTexture(GL_TEXTURE0)
|
||||||
glBindTexture(self.target, self.id)
|
glBindTexture(self.target, self.id)
|
||||||
pyglet.graphics.draw_indexed(4, GL_TRIANGLES, [0, 1, 2, 0, 2, 3],
|
pyglet.graphics.draw_indexed(4, GL_TRIANGLES, [0, 1, 2, 0, 2, 3],
|
||||||
('position3f', vertices),
|
position=('f', vertices),
|
||||||
('tex_coords3f', tex_coords))
|
tex_coords=('f', tex_coords))
|
||||||
glBindTexture(self.target, 0)
|
glBindTexture(self.target, 0)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -2207,8 +2169,6 @@ class DepthBufferImage(BufferImage):
|
|||||||
|
|
||||||
def get_texture(self, rectangle=False):
|
def get_texture(self, rectangle=False):
|
||||||
assert rectangle is False, 'Depth textures cannot be rectangular'
|
assert rectangle is False, 'Depth textures cannot be rectangular'
|
||||||
if not _is_pow2(self.width) or not _is_pow2(self.height):
|
|
||||||
raise ImageException('Depth texture requires that buffer dimensions be powers of 2')
|
|
||||||
|
|
||||||
texture = DepthTexture.create(self.width, self.height, GL_TEXTURE_2D, None)
|
texture = DepthTexture.create(self.width, self.height, GL_TEXTURE_2D, None)
|
||||||
if self.anchor_x or self.anchor_y:
|
if self.anchor_x or self.anchor_y:
|
||||||
|
@ -172,7 +172,7 @@ class IWICStream(com.pIUnknown):
|
|||||||
('InitializeFromFilename',
|
('InitializeFromFilename',
|
||||||
com.STDMETHOD(LPCWSTR, DWORD)),
|
com.STDMETHOD(LPCWSTR, DWORD)),
|
||||||
('InitializeFromMemory',
|
('InitializeFromMemory',
|
||||||
com.STDMETHOD()),
|
com.STDMETHOD(c_void_p, DWORD)),
|
||||||
('InitializeFromIStreamRegion',
|
('InitializeFromIStreamRegion',
|
||||||
com.STDMETHOD()),
|
com.STDMETHOD()),
|
||||||
]
|
]
|
||||||
@ -583,30 +583,19 @@ class WICEncoder(ImageEncoder):
|
|||||||
return [ext for ext in extension_to_container]
|
return [ext for ext in extension_to_container]
|
||||||
|
|
||||||
def encode(self, image, file, filename):
|
def encode(self, image, file, filename):
|
||||||
# Close default file handler.file.close()
|
image = image.get_image_data()
|
||||||
|
|
||||||
stream = IWICStream()
|
stream = IWICStream()
|
||||||
encoder = IWICBitmapEncoder()
|
encoder = IWICBitmapEncoder()
|
||||||
frame = IWICBitmapFrameEncode()
|
frame = IWICBitmapFrameEncode()
|
||||||
property_bag = IPropertyBag2()
|
property_bag = IPropertyBag2()
|
||||||
|
|
||||||
_factory.CreateStream(byref(stream))
|
ext = (filename and os.path.splitext(filename)[1]) or '.png'
|
||||||
|
|
||||||
stream.InitializeFromFilename(filename, GENERIC_WRITE)
|
|
||||||
name, ext = os.path.splitext(filename)
|
|
||||||
|
|
||||||
# Choose container based on extension. Default to PNG.
|
# Choose container based on extension. Default to PNG.
|
||||||
container = extension_to_container.get(ext, GUID_ContainerFormatPng)
|
container = extension_to_container.get(ext, GUID_ContainerFormatPng)
|
||||||
|
|
||||||
_factory.CreateEncoder(container, None, byref(encoder))
|
_factory.CreateStream(byref(stream))
|
||||||
|
|
||||||
encoder.Initialize(stream, WICBitmapEncoderNoCache)
|
|
||||||
|
|
||||||
encoder.CreateNewFrame(byref(frame), byref(property_bag))
|
|
||||||
|
|
||||||
frame.Initialize(property_bag)
|
|
||||||
|
|
||||||
frame.SetSize(image.width, image.height)
|
|
||||||
|
|
||||||
# https://docs.microsoft.com/en-us/windows/win32/wic/-wic-codec-native-pixel-formats#native-image-formats
|
# https://docs.microsoft.com/en-us/windows/win32/wic/-wic-codec-native-pixel-formats#native-image-formats
|
||||||
if container == GUID_ContainerFormatJpeg:
|
if container == GUID_ContainerFormatJpeg:
|
||||||
# Expects BGR, no transparency available. Hard coded.
|
# Expects BGR, no transparency available. Hard coded.
|
||||||
@ -621,27 +610,47 @@ class WICEncoder(ImageEncoder):
|
|||||||
fmt = 'BGRA'
|
fmt = 'BGRA'
|
||||||
default_format = GUID_WICPixelFormat32bppBGRA
|
default_format = GUID_WICPixelFormat32bppBGRA
|
||||||
|
|
||||||
frame.SetPixelFormat(default_format)
|
|
||||||
|
|
||||||
pitch = image.width * len(fmt)
|
pitch = image.width * len(fmt)
|
||||||
actual_pitch = -pitch
|
|
||||||
|
|
||||||
image_data = image.get_data(fmt, actual_pitch)
|
image_data = image.get_data(fmt, -pitch)
|
||||||
|
|
||||||
size = len(image_data)
|
size = len(image_data)
|
||||||
|
|
||||||
|
if file:
|
||||||
|
buf = create_string_buffer(size)
|
||||||
|
|
||||||
|
stream.InitializeFromMemory(byref(buf), size)
|
||||||
|
else:
|
||||||
|
stream.InitializeFromFilename(filename, GENERIC_WRITE)
|
||||||
|
|
||||||
|
_factory.CreateEncoder(container, None, byref(encoder))
|
||||||
|
|
||||||
|
encoder.Initialize(stream, WICBitmapEncoderNoCache)
|
||||||
|
|
||||||
|
encoder.CreateNewFrame(byref(frame), byref(property_bag))
|
||||||
|
|
||||||
|
frame.Initialize(property_bag)
|
||||||
|
|
||||||
|
frame.SetSize(image.width, image.height)
|
||||||
|
|
||||||
|
frame.SetPixelFormat(default_format)
|
||||||
|
|
||||||
data = (c_byte * size).from_buffer(bytearray(image_data))
|
data = (c_byte * size).from_buffer(bytearray(image_data))
|
||||||
|
|
||||||
frame.WritePixels(image.height, pitch, size, data)
|
frame.WritePixels(image.height, abs(image.pitch), size, data)
|
||||||
|
|
||||||
frame.Commit()
|
frame.Commit()
|
||||||
|
|
||||||
encoder.Commit()
|
encoder.Commit()
|
||||||
|
|
||||||
|
if file:
|
||||||
|
file.write(buf)
|
||||||
|
|
||||||
encoder.Release()
|
encoder.Release()
|
||||||
frame.Release()
|
frame.Release()
|
||||||
property_bag.Release()
|
property_bag.Release()
|
||||||
stream.Release()
|
stream.Release()
|
||||||
|
|
||||||
|
|
||||||
def get_encoders():
|
def get_encoders():
|
||||||
return [WICEncoder()]
|
return [WICEncoder()]
|
||||||
|
@ -84,7 +84,7 @@ handlers.
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
from .base import Device, Control, RelativeAxis, AbsoluteAxis
|
from .base import Device, Control, RelativeAxis, AbsoluteAxis
|
||||||
from .base import Button, Joystick, AppleRemote, Tablet, GameController
|
from .base import Button, Joystick, AppleRemote, Tablet, Controller
|
||||||
from .base import DeviceException, DeviceOpenException, DeviceExclusiveException
|
from .base import DeviceException, DeviceOpenException, DeviceExclusiveException
|
||||||
|
|
||||||
|
|
||||||
@ -133,8 +133,8 @@ if _is_pyglet_doc_run:
|
|||||||
:rtype: list of :py:class:`Joystick`
|
:rtype: list of :py:class:`Joystick`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def get_game_controllers(display=None):
|
def get_controllers(display=None):
|
||||||
"""Get a list of attached game controllers.
|
"""Get a list of attached controllers.
|
||||||
|
|
||||||
:Parameters:
|
:Parameters:
|
||||||
display : `~pyglet.canvas.Display`
|
display : `~pyglet.canvas.Display`
|
||||||
@ -142,7 +142,7 @@ if _is_pyglet_doc_run:
|
|||||||
OS X and Windows. On Linux, defaults to the default display
|
OS X and Windows. On Linux, defaults to the default display
|
||||||
device.
|
device.
|
||||||
|
|
||||||
:rtype: list of :py:class:`GameController`
|
:rtype: list of :py:class:`Controller`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def get_tablets(display=None):
|
def get_tablets(display=None):
|
||||||
@ -174,7 +174,7 @@ else:
|
|||||||
from .x11_xinput import get_devices as xinput_get_devices
|
from .x11_xinput import get_devices as xinput_get_devices
|
||||||
from .evdev import get_devices as evdev_get_devices
|
from .evdev import get_devices as evdev_get_devices
|
||||||
from .evdev import get_joysticks
|
from .evdev import get_joysticks
|
||||||
from .evdev import get_game_controllers
|
from .evdev import get_controllers
|
||||||
|
|
||||||
def get_devices(display=None):
|
def get_devices(display=None):
|
||||||
return evdev_get_devices(display) + xinput_get_devices(display)
|
return evdev_get_devices(display) + xinput_get_devices(display)
|
||||||
@ -182,7 +182,7 @@ else:
|
|||||||
elif compat_platform in ('cygwin', 'win32'):
|
elif compat_platform in ('cygwin', 'win32'):
|
||||||
from .directinput import get_devices
|
from .directinput import get_devices
|
||||||
from .directinput import get_joysticks
|
from .directinput import get_joysticks
|
||||||
from .directinput import get_game_controllers
|
from .directinput import get_controllers
|
||||||
try:
|
try:
|
||||||
from .wintab import get_tablets
|
from .wintab import get_tablets
|
||||||
except:
|
except:
|
||||||
@ -192,4 +192,4 @@ else:
|
|||||||
from .darwin_hid import get_devices
|
from .darwin_hid import get_devices
|
||||||
from .darwin_hid import get_joysticks
|
from .darwin_hid import get_joysticks
|
||||||
from .darwin_hid import get_apple_remote
|
from .darwin_hid import get_apple_remote
|
||||||
from .darwin_hid import get_game_controllers
|
from .darwin_hid import get_controllers
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
from pyglet.event import EventDispatcher
|
from pyglet.event import EventDispatcher
|
||||||
from .gamecontroller import get_mapping
|
|
||||||
|
|
||||||
_is_pyglet_doc_run = hasattr(sys, "is_pyglet_doc_run") and sys.is_pyglet_doc_run
|
_is_pyglet_doc_run = hasattr(sys, "is_pyglet_doc_run") and sys.is_pyglet_doc_run
|
||||||
|
|
||||||
@ -112,18 +112,18 @@ class Device:
|
|||||||
def get_guid(self):
|
def get_guid(self):
|
||||||
"""Get the device GUID, in SDL2 format.
|
"""Get the device GUID, in SDL2 format.
|
||||||
|
|
||||||
Return a string containing a unique device identification
|
Return a str containing a unique device identification
|
||||||
string. This is generated from the various hardware IDs,
|
string. This is generated from the hardware identifiers,
|
||||||
in the same format as is used by SDL2. This allows reusing
|
and is in the same format as was popularized by SDL2.
|
||||||
the Game Controller mapping strings that have become a
|
GUIDs differ between platforms, but are generally 32
|
||||||
fairly standard.
|
hexidecimal characters.
|
||||||
|
|
||||||
:rtype: The GUID, as a string
|
:rtype: str containing the device's GUID.
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError('abstract')
|
raise NotImplementedError('abstract')
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '%s(name=%s)' % (self.__class__.__name__, self.name)
|
return f"{self.__class__.__name__}(name={self.name})"
|
||||||
|
|
||||||
|
|
||||||
class Control(EventDispatcher):
|
class Control(EventDispatcher):
|
||||||
@ -174,10 +174,9 @@ class Control(EventDispatcher):
|
|||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
if self.name:
|
if self.name:
|
||||||
return '%s(name=%s, raw_name=%s)' % (
|
return f"{self.__class__.__name__}(name={self.name}, raw_name={self.raw_name})"
|
||||||
self.__class__.__name__, self.name, self.raw_name)
|
|
||||||
else:
|
else:
|
||||||
return '%s(raw_name=%s)' % (self.__class__.__name__, self.raw_name)
|
return f"{self.__class__.__name__}(raw_name={self.raw_name})"
|
||||||
|
|
||||||
if _is_pyglet_doc_run:
|
if _is_pyglet_doc_run:
|
||||||
def on_change(self, value):
|
def on_change(self, value):
|
||||||
@ -227,12 +226,12 @@ class RelativeAxis(Control):
|
|||||||
class AbsoluteAxis(Control):
|
class AbsoluteAxis(Control):
|
||||||
"""An axis whose value represents a physical measurement from the device.
|
"""An axis whose value represents a physical measurement from the device.
|
||||||
|
|
||||||
The value is advertised to range over ``min`` and ``max``.
|
The value is advertised to range over ``minimum`` and ``maximum``.
|
||||||
|
|
||||||
:Ivariables:
|
:Ivariables:
|
||||||
`min` : float
|
`minimum` : float
|
||||||
Minimum advertised value.
|
Minimum advertised value.
|
||||||
`max` : float
|
`maximum` : float
|
||||||
Maximum advertised value.
|
Maximum advertised value.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -258,11 +257,10 @@ class AbsoluteAxis(Control):
|
|||||||
#: described by two orthogonal controls.
|
#: described by two orthogonal controls.
|
||||||
HAT_Y = 'hat_y'
|
HAT_Y = 'hat_y'
|
||||||
|
|
||||||
def __init__(self, name, min, max, raw_name=None, inverted=False):
|
def __init__(self, name, minimum, maximum, raw_name=None, inverted=False):
|
||||||
super(AbsoluteAxis, self).__init__(name, raw_name, inverted)
|
super().__init__(name, raw_name, inverted)
|
||||||
|
self.min = minimum
|
||||||
self.min = min
|
self.max = maximum
|
||||||
self.max = max
|
|
||||||
|
|
||||||
|
|
||||||
class Button(Control):
|
class Button(Control):
|
||||||
@ -302,10 +300,14 @@ Button.register_event_type('on_release')
|
|||||||
|
|
||||||
|
|
||||||
class Joystick(EventDispatcher):
|
class Joystick(EventDispatcher):
|
||||||
"""High-level interface for joystick-like devices. This includes analogue
|
"""High-level interface for joystick-like devices. This includes a wide range
|
||||||
and digital joysticks, gamepads, game controllers, and possibly even
|
of analog and digital joysticks, gamepads, controllers, and possibly even
|
||||||
steering wheels and other input devices. There is unfortunately no way to
|
steering wheels and other input devices. There is unfortunately no easy way to
|
||||||
distinguish between these different device types.
|
distinguish between most of these different device types.
|
||||||
|
|
||||||
|
For a simplified subset of Joysticks, see the :py:class:`~pyglet.input.Controller`
|
||||||
|
interface. This covers a variety of popular game console controllers. Unlike
|
||||||
|
Joysticks, Controllers have strictly defined layouts and inputs.
|
||||||
|
|
||||||
To use a joystick, first call `open`, then in your game loop examine
|
To use a joystick, first call `open`, then in your game loop examine
|
||||||
the values of `x`, `y`, and so on. These values are normalized to the
|
the values of `x`, `y`, and so on. These values are normalized to the
|
||||||
@ -340,7 +342,7 @@ class Joystick(EventDispatcher):
|
|||||||
(bottom).
|
(bottom).
|
||||||
`z` : float
|
`z` : float
|
||||||
Current Z value ranging from -1.0 to 1.0. On joysticks the Z
|
Current Z value ranging from -1.0 to 1.0. On joysticks the Z
|
||||||
value is usually the throttle control. On game controllers the Z
|
value is usually the throttle control. On controllers the Z
|
||||||
value is usually the secondary thumb vertical axis.
|
value is usually the secondary thumb vertical axis.
|
||||||
`rx` : float
|
`rx` : float
|
||||||
Current rotational X value ranging from -1.0 to 1.0.
|
Current rotational X value ranging from -1.0 to 1.0.
|
||||||
@ -532,20 +534,75 @@ Joystick.register_event_type('on_joybutton_release')
|
|||||||
Joystick.register_event_type('on_joyhat_motion')
|
Joystick.register_event_type('on_joyhat_motion')
|
||||||
|
|
||||||
|
|
||||||
class GameController(EventDispatcher):
|
class Controller(EventDispatcher):
|
||||||
|
|
||||||
__slots__ = ('device', 'guid', '_mapping', 'name', 'a', 'b', 'x', 'y',
|
__slots__ = ('device', 'guid', '_mapping', 'name', 'a', 'b', 'x', 'y',
|
||||||
'back', 'start', 'guide', 'leftshoulder', 'rightshoulder',
|
'back', 'start', 'guide', 'leftshoulder', 'rightshoulder',
|
||||||
'leftstick', 'rightstick', 'lefttrigger', 'righttrigger',
|
'leftstick', 'rightstick', 'lefttrigger', 'righttrigger',
|
||||||
'leftx', 'lefty', 'rightx', 'righty', 'dpup', 'dpdown', 'dpleft',
|
'leftx', 'lefty', 'rightx', 'righty', 'dpup', 'dpdown', 'dpleft',
|
||||||
'dpright', '_button_controls', '_axis_controls', '_hat_control',
|
'dpright', '_button_controls', '_axis_controls', '_hat_control',
|
||||||
'hat_x_control', '_hat_y_control')
|
'_hat_x_control', '_hat_y_control')
|
||||||
|
|
||||||
|
def __init__(self, device, mapping):
|
||||||
|
"""High-level interface for Game Controllers.
|
||||||
|
|
||||||
|
Unlike Joysticks, Controllers have a strictly defined set of inputs
|
||||||
|
that matches the layout of popular home video game console Controllers.
|
||||||
|
This includes a variety of face and shoulder buttons, analog sticks and
|
||||||
|
triggers, a directional pad, and optional rumble (force feedback)
|
||||||
|
effects.
|
||||||
|
|
||||||
|
To use a Controller, you must first call `open`. Controllers will then
|
||||||
|
dispatch a variety of events whenever the inputs change. They can also
|
||||||
|
be polled at any time to find the current value of any inputs. Analog
|
||||||
|
inputs are normalized to the range [-1.0, 1.0].
|
||||||
|
|
||||||
|
:note: A running application event loop is required
|
||||||
|
|
||||||
|
The following event types are dispatched:
|
||||||
|
`on_button_press`
|
||||||
|
`on_button_release`
|
||||||
|
`on_stick_motion`
|
||||||
|
`on_dpad_motion`
|
||||||
|
`on_trigger_motion`
|
||||||
|
|
||||||
|
The device name can be queried to get the name of the joystick.
|
||||||
|
|
||||||
|
:Ivariables:
|
||||||
|
`device` : `Device`
|
||||||
|
The underlying device used by this joystick interface.
|
||||||
|
`name` : str
|
||||||
|
The name of the Controller as reported by the OS.
|
||||||
|
`guid` : str
|
||||||
|
The unique device identification string, in SDL2 format.
|
||||||
|
`a` : bool
|
||||||
|
`b` : bool
|
||||||
|
`x` : bool
|
||||||
|
`x` : bool
|
||||||
|
`back` : bool
|
||||||
|
`start` : bool
|
||||||
|
`guide` : bool
|
||||||
|
`leftshoulder` : bool
|
||||||
|
`rightshoulder` : bool
|
||||||
|
`leftstick` : bool
|
||||||
|
`rightstick` : bool
|
||||||
|
`leftx` : float
|
||||||
|
`lefty` : float
|
||||||
|
`rightx` : float
|
||||||
|
`righty` : float
|
||||||
|
`lefttrigger` : float
|
||||||
|
`righttrigger` : float
|
||||||
|
`dpup` : bool
|
||||||
|
`dpdown` : bool
|
||||||
|
`dpleft` : bool
|
||||||
|
`dpright` : bool
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, device):
|
|
||||||
self.device = device
|
self.device = device
|
||||||
self.guid = device.get_guid()
|
self._mapping = mapping
|
||||||
self._mapping = get_mapping(self.guid)
|
|
||||||
self.name = self._mapping['name']
|
self.name = self._mapping['name']
|
||||||
|
self.guid = self._mapping['guid']
|
||||||
|
|
||||||
self.a = False
|
self.a = False
|
||||||
self.b = False
|
self.b = False
|
||||||
@ -720,11 +777,11 @@ class GameController(EventDispatcher):
|
|||||||
# add_axis(self._hat_x_control, "dpleft")
|
# add_axis(self._hat_x_control, "dpleft")
|
||||||
|
|
||||||
def open(self, window=None, exclusive=False):
|
def open(self, window=None, exclusive=False):
|
||||||
"""Open the game controller. See `Device.open`. """
|
"""Open the controller. See `Device.open`. """
|
||||||
self.device.open(window, exclusive)
|
self.device.open(window, exclusive)
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
"""Close the game controller. See `Device.close`. """
|
"""Close the controller. See `Device.close`. """
|
||||||
self.device.close()
|
self.device.close()
|
||||||
|
|
||||||
# Rumble (force feedback) methods:
|
# Rumble (force feedback) methods:
|
||||||
@ -755,14 +812,14 @@ class GameController(EventDispatcher):
|
|||||||
def rumble_stop_strong(self):
|
def rumble_stop_strong(self):
|
||||||
"""Stop playing rumble effects on the strong motor."""
|
"""Stop playing rumble effects on the strong motor."""
|
||||||
|
|
||||||
# Event types:
|
# Input Event types:
|
||||||
|
|
||||||
def on_stick_motion(self, gamecontroller, axis, xvalue, yvalue):
|
def on_stick_motion(self, controller, axis, xvalue, yvalue):
|
||||||
"""The value of a game controller analogue stick changed.
|
"""The value of a controller analogue stick changed.
|
||||||
|
|
||||||
:Parameters:
|
:Parameters:
|
||||||
`gamecontroller` : `GameController`
|
`controller` : `Controller`
|
||||||
The game controller whose analogue stick changed.
|
The controller whose analogue stick changed.
|
||||||
`axis` : string
|
`axis` : string
|
||||||
The name of the axis that changed.
|
The name of the axis that changed.
|
||||||
`xvalue` : float
|
`xvalue` : float
|
||||||
@ -771,12 +828,12 @@ class GameController(EventDispatcher):
|
|||||||
The current y axis value, normalized to [-1, 1].
|
The current y axis value, normalized to [-1, 1].
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def on_dpad_motion(self, gamecontroller, dpleft, dpright, dpup, dpdown):
|
def on_dpad_motion(self, controller, dpleft, dpright, dpup, dpdown):
|
||||||
"""The direction pad of the game controller changed.
|
"""The direction pad of the controller changed.
|
||||||
|
|
||||||
:Parameters:
|
:Parameters:
|
||||||
`gamecontroller` : `GameController`
|
`controller` : `Controller`
|
||||||
The game controller whose hat control changed.
|
The controller whose hat control changed.
|
||||||
`dpleft` : boolean
|
`dpleft` : boolean
|
||||||
True if left is pressed on the directional pad.
|
True if left is pressed on the directional pad.
|
||||||
`dpright` : boolean
|
`dpright` : boolean
|
||||||
@ -787,44 +844,44 @@ class GameController(EventDispatcher):
|
|||||||
True if down is pressed on the directional pad.
|
True if down is pressed on the directional pad.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def on_trigger_motion(self, gamecontroller, trigger, value):
|
def on_trigger_motion(self, controller, trigger, value):
|
||||||
"""The value of a game controller analogue stick changed.
|
"""The value of a controller analogue stick changed.
|
||||||
|
|
||||||
:Parameters:
|
:Parameters:
|
||||||
`gamecontroller` : `GameController`
|
`controller` : `Controller`
|
||||||
The game controller whose analogue stick changed.
|
The controller whose analogue stick changed.
|
||||||
`trigger` : string
|
`trigger` : string
|
||||||
The name of the trigger that changed.
|
The name of the trigger that changed.
|
||||||
`value` : float
|
`value` : float
|
||||||
The current value of the trigger, normalized to [-1, 1].
|
The current value of the trigger, normalized to [-1, 1].
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def on_button_press(self, gamecontroller, button):
|
def on_button_press(self, controller, button):
|
||||||
"""A button on the game controller was pressed.
|
"""A button on the controller was pressed.
|
||||||
|
|
||||||
:Parameters:
|
:Parameters:
|
||||||
`gamecontroller` : `GameController`
|
`controller` : `Controller`
|
||||||
The game controller whose button was pressed.
|
The controller whose button was pressed.
|
||||||
`button` : string
|
`button` : string
|
||||||
The name of the button that was pressed.
|
The name of the button that was pressed.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def on_button_release(self, gamecontroller, button):
|
def on_button_release(self, controller, button):
|
||||||
"""A button on the joystick was released.
|
"""A button on the joystick was released.
|
||||||
|
|
||||||
:Parameters:
|
:Parameters:
|
||||||
`gamecontroller` : `GameController`
|
`controller` : `Controller`
|
||||||
The game controller whose button was released.
|
The controller whose button was released.
|
||||||
`button` : string
|
`button` : string
|
||||||
The name of the button that was released.
|
The name of the button that was released.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
GameController.register_event_type('on_button_press')
|
Controller.register_event_type('on_button_press')
|
||||||
GameController.register_event_type('on_button_release')
|
Controller.register_event_type('on_button_release')
|
||||||
GameController.register_event_type('on_stick_motion')
|
Controller.register_event_type('on_stick_motion')
|
||||||
GameController.register_event_type('on_dpad_motion')
|
Controller.register_event_type('on_dpad_motion')
|
||||||
GameController.register_event_type('on_trigger_motion')
|
Controller.register_event_type('on_trigger_motion')
|
||||||
|
|
||||||
|
|
||||||
class AppleRemote(EventDispatcher):
|
class AppleRemote(EventDispatcher):
|
||||||
|
208
libs/pyglet/input/controller.py
Normal file
208
libs/pyglet/input/controller.py
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# pyglet
|
||||||
|
# Copyright (c) 2006-2008 Alex Holkner
|
||||||
|
# Copyright (c) 2008-2021 pyglet contributors
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in
|
||||||
|
# the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
# * Neither the name of pyglet nor the names of its
|
||||||
|
# contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written
|
||||||
|
# permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
"""Game Controller support.
|
||||||
|
|
||||||
|
This module provides an interface for Game Controller devices, which are a
|
||||||
|
subset of Joysticks. Game Controllers have consistent button and axis mapping,
|
||||||
|
which resembles common dual-stick home video game console controllers.
|
||||||
|
Devices that are of this design can be automatically mapped to the "virtual"
|
||||||
|
Game Controller layout, providing a consistent abstraction for a large number
|
||||||
|
of different devices, with no tedious button and axis mapping for each one.
|
||||||
|
To achieve this, an internal mapping database contains lists of device ids
|
||||||
|
and their corresponding button and axis mappings. The mapping database is in
|
||||||
|
the same format as originated by the `SDL` library, which has become a
|
||||||
|
semi-standard and is in common use. Most popular controllers are included in
|
||||||
|
the built-in database, and additional mappings can be added at runtime.
|
||||||
|
|
||||||
|
|
||||||
|
Some Joysticks, such as Flight Sticks, etc., do not necessarily fit into the
|
||||||
|
layout (and limitations) of GameControllers. For those such devices, it is
|
||||||
|
recommended to use the Joystick interface instead.
|
||||||
|
|
||||||
|
To query which GameControllers are available, call :py:func:`get_controllers`.
|
||||||
|
|
||||||
|
.. versionadded:: 2.0
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
|
||||||
|
from .controller_db import mapping_list
|
||||||
|
|
||||||
|
|
||||||
|
env_config = os.environ.get('SDL_GAMECONTROLLERCONFIG')
|
||||||
|
if env_config:
|
||||||
|
# insert at the front of the list
|
||||||
|
mapping_list.insert(0, env_config)
|
||||||
|
|
||||||
|
|
||||||
|
class _Relation:
|
||||||
|
__slots__ = 'control_type', 'index', 'inverted'
|
||||||
|
|
||||||
|
def __init__(self, control_type, index, inverted=False):
|
||||||
|
self.control_type = control_type
|
||||||
|
self.index = index
|
||||||
|
self.inverted = inverted
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"Relation(type={self.control_type}, index={self.index}, inverted={self.inverted})"
|
||||||
|
|
||||||
|
|
||||||
|
def _map_pair(raw_relation):
|
||||||
|
inverted = False
|
||||||
|
relation_string = raw_relation.split(":")[1]
|
||||||
|
if relation_string.startswith("+"):
|
||||||
|
relation_string = relation_string[1:]
|
||||||
|
inverted = False
|
||||||
|
elif relation_string.startswith("-"):
|
||||||
|
relation_string = relation_string[1:]
|
||||||
|
inverted = True
|
||||||
|
if "~" in relation_string:
|
||||||
|
# TODO: handle this
|
||||||
|
return None
|
||||||
|
if relation_string.startswith("b"): # Button
|
||||||
|
return _Relation("button", int(relation_string[1:]), inverted)
|
||||||
|
elif relation_string.startswith("a"): # Axis
|
||||||
|
return _Relation("axis", int(relation_string[1:]), inverted)
|
||||||
|
elif relation_string.startswith("h0"): # Hat
|
||||||
|
return _Relation("hat0", int(relation_string.split(".")[1]), inverted)
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_mapping(mapping_string):
|
||||||
|
"""Parse a SDL2 style GameController mapping string.
|
||||||
|
|
||||||
|
:Parameters:
|
||||||
|
`mapping_string` : str
|
||||||
|
A raw string containing an SDL style controller mapping.
|
||||||
|
|
||||||
|
:rtype: A dict containing axis/button mapping relations.
|
||||||
|
"""
|
||||||
|
relations = dict(guid=None, name=None, guide=None, a=None, b=None,
|
||||||
|
x=None, y=None, leftshoulder=None, leftstick=None,
|
||||||
|
rightshoulder=None, rightstick=None, back=None,
|
||||||
|
start=None, dpup=None, dpdown=None, dpleft=None,
|
||||||
|
dpright=None, lefttrigger=None, righttrigger=None,
|
||||||
|
leftx=None, lefty=None, rightx=None, righty=None)
|
||||||
|
|
||||||
|
split_mapping = mapping_string.strip().split(",")
|
||||||
|
|
||||||
|
relations["guid"] = split_mapping[0]
|
||||||
|
relations["name"] = split_mapping[1]
|
||||||
|
for item in split_mapping:
|
||||||
|
if item.startswith("guide:"):
|
||||||
|
relations["guide"] = _map_pair(item)
|
||||||
|
elif item.startswith("a:"):
|
||||||
|
relations["a"] = _map_pair(item)
|
||||||
|
elif item.startswith("b:"):
|
||||||
|
relations["b"] = _map_pair(item)
|
||||||
|
elif item.startswith("x:"):
|
||||||
|
relations["x"] = _map_pair(item)
|
||||||
|
elif item.startswith("y:"):
|
||||||
|
relations["y"] = _map_pair(item)
|
||||||
|
elif item.startswith("leftshoulder:"):
|
||||||
|
relations["leftshoulder"] = _map_pair(item)
|
||||||
|
elif item.startswith("leftstick:"):
|
||||||
|
relations["leftstick"] = _map_pair(item)
|
||||||
|
elif item.startswith("rightshoulder:"):
|
||||||
|
relations["rightshoulder"] = _map_pair(item)
|
||||||
|
elif item.startswith("rightstick:"):
|
||||||
|
relations["rightstick"] = _map_pair(item)
|
||||||
|
elif item.startswith("back:"):
|
||||||
|
relations["back"] = _map_pair(item)
|
||||||
|
elif item.startswith("start:"):
|
||||||
|
relations["start"] = _map_pair(item)
|
||||||
|
elif item.startswith("lefttrigger:"):
|
||||||
|
relations["lefttrigger"] = _map_pair(item)
|
||||||
|
elif item.startswith("righttrigger:"):
|
||||||
|
relations["righttrigger"] = _map_pair(item)
|
||||||
|
elif item.startswith("dpup"):
|
||||||
|
relations["dpup"] = _map_pair(item)
|
||||||
|
elif item.startswith("dpdown"):
|
||||||
|
relations["dpdown"] = _map_pair(item)
|
||||||
|
elif item.startswith("dpleft"):
|
||||||
|
relations["dpleft"] = _map_pair(item)
|
||||||
|
elif item.startswith("dpright"):
|
||||||
|
relations["dpright"] = _map_pair(item)
|
||||||
|
elif item.startswith("leftx"):
|
||||||
|
relations["leftx"] = _map_pair(item)
|
||||||
|
elif item.startswith("lefty"):
|
||||||
|
relations["lefty"] = _map_pair(item)
|
||||||
|
elif item.startswith("rightx"):
|
||||||
|
relations["rightx"] = _map_pair(item)
|
||||||
|
elif item.startswith("righty"):
|
||||||
|
relations["righty"] = _map_pair(item)
|
||||||
|
|
||||||
|
return relations
|
||||||
|
|
||||||
|
|
||||||
|
def get_mapping(guid):
|
||||||
|
"""Return a mapping for the passed device GUID.
|
||||||
|
|
||||||
|
:Parameters:
|
||||||
|
`guid` : str
|
||||||
|
A pyglet input device GUID
|
||||||
|
|
||||||
|
:rtype: dict of axis/button mapping relations, or None
|
||||||
|
if no mapping is available for this Controller.
|
||||||
|
"""
|
||||||
|
for mapping in mapping_list:
|
||||||
|
if mapping.startswith(guid):
|
||||||
|
return _parse_mapping(mapping)
|
||||||
|
|
||||||
|
|
||||||
|
def add_mappings_from_file(filename) -> None:
|
||||||
|
"""Add mappings from a file.
|
||||||
|
|
||||||
|
Given a file path, open and parse the file for mappings.
|
||||||
|
|
||||||
|
:Parameters:
|
||||||
|
`filename` : str
|
||||||
|
A file path.
|
||||||
|
"""
|
||||||
|
assert os.path.exists(filename), f"Invalid path: {filename}"
|
||||||
|
with open(filename) as f:
|
||||||
|
add_mappings_from_string(f.read())
|
||||||
|
|
||||||
|
|
||||||
|
def add_mappings_from_string(string) -> None:
|
||||||
|
"""Add one or more mappings from a raw string.
|
||||||
|
|
||||||
|
:Parameters:
|
||||||
|
`string` : str
|
||||||
|
A string containing one or more mappings,
|
||||||
|
"""
|
||||||
|
for line in string.splitlines():
|
||||||
|
if line.startswith('#'):
|
||||||
|
continue
|
||||||
|
line = line.strip()
|
||||||
|
mapping_list.append(line)
|
772
libs/pyglet/input/controller_db.py
Normal file
772
libs/pyglet/input/controller_db.py
Normal file
@ -0,0 +1,772 @@
|
|||||||
|
from pyglet import compat_platform
|
||||||
|
|
||||||
|
|
||||||
|
# This file is automatically generated by 'pyglet/tools/gen_controller_db.py'
|
||||||
|
# Generated on: Thu Mar 3 16:25:08 2022
|
||||||
|
|
||||||
|
if compat_platform.startswith("linux"):
|
||||||
|
mapping_list = [
|
||||||
|
"xinput,*,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,",
|
||||||
|
"03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b0,b:b1,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:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00001038000000010000,8BitDo FC30 Pro,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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000650000011010000,8BitDo M30 Gamepad,a:b0,b:b1,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a5,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00005106000000010000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001590000011010000,8BitDo N30 Pro 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:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001590000011010000,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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00006528000000010000,8BitDo N30 Pro 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:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00006528000000010000,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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"030000003512000012ab000010010000,8BitDo NES30 Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"030000003512000012ab000010010000,8BitDo NES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000022000000090000011010000,8BitDo NES30 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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000190000011010000,8BitDo NES30 Pro,a:b0,b:b1,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:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000203800000900000000010000,8BitDo NES30 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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00002038000000010000,8BitDo NES30 Pro,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:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00000061000000010000,8BitDo SF30 Pro,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:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000102800000900000000010000,8BitDo SFC30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000102800000900000000010000,8BitDo SFC30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00003028000000010000,8BitDo SFC30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00003028000000010000,8BitDo SFC30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000260000011010000,8BitDo SN30 Pro+,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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000260000011010000,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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00000261000000010000,8BitDo SN30 Pro+,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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00000261000000010000,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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000160000011010000,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:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"030000003512000020ab000010010000,8BitDo SNES30 Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"030000003512000020ab000010010000,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000202800000900000000010000,8BitDo SNES30 Gamepad,a:b0,b:b1,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000202800000900000000010000,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001890000011010000,8BitDo Zero 2,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00003032000000010000,8BitDo Zero 2,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000a00500003232000001000000,8BitDo Zero Gamepad,a:b0,b:b1,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000a00500003232000001000000,8BitDo Zero Gamepad,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000a00500003232000008010000,8BitDo Zero Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000a00500003232000008010000,8BitDo Zero Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000031000011010000,8Bitdo Receiver,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,",
|
||||||
|
"03000000c82d00001290000011010000,8Bitdo SN30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001290000011010000,8Bitdo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00006228000000010000,8Bitdo SN30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"05000000c82d00006228000000010000,8Bitdo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000006f0e00003901000020060000,Afterglow Controller for 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,",
|
||||||
|
"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,",
|
||||||
|
"030000006f0e00001302000000010000,Afterglow,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,",
|
||||||
|
"03000000100000008200000011010000,Akishop Customs PS360+ v1.66,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,",
|
||||||
|
"05000000491900000204000021000000,Amazon Fire Game 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000503200000210000000000000,Atari Game 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,",
|
||||||
|
"05000000503200000210000000000000,Atari Game 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,",
|
||||||
|
"030000005e0400008e02000047010000,Atari Xbox 360 Game 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,",
|
||||||
|
"03000000c62400001b89000011010000,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,",
|
||||||
|
"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,",
|
||||||
|
"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,leftx:,lefty:,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:,righty:,start:b9,x:b0,y:b3,",
|
||||||
|
"03000000b40400000a01000000010000,CYPRESS USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,",
|
||||||
|
"03000000ffff0000ffff000000010000,Chinese-made 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000a306000022f6000011010000,Cyborg V.3 Rumble Pad,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,",
|
||||||
|
"03000000790000000600000010010000,DragonRise Inc. Generic USB 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:a3,righty:a4,start:b9,x:b3,y:b0,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000341a000005f7000010010000,GameCube {HuiJia USB box},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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000c01100000140000011010000,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,",
|
||||||
|
"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,",
|
||||||
|
"030000008f0e00000800000010010000,Gasia Co. Ltd PS(R) 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,",
|
||||||
|
"030000006f0e00001304000000010000,Generic X-Box pad,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,",
|
||||||
|
"03000000f0250000c183000010010000,Goodbetterbest Ltd USB 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,",
|
||||||
|
"03000000d11800000094000011010000,Google 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,",
|
||||||
|
"03000000280400000140000000010000,Gravis Gamepad Pro USB ,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||||
|
"030000008f0e00000610000000010000,GreenAsia Electronics 4Axes 12Keys Gamepad,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,",
|
||||||
|
"030000008f0e00001200000010010000,GreenAsia Inc. USB 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,",
|
||||||
|
"03000000c9110000f055000011010000,HJC Game 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,",
|
||||||
|
"030000000d0f00001000000011010000,HORI CO. LTD. FIGHTING STICK 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,",
|
||||||
|
"030000000d0f00002200000011010000,HORI CO. LTD. 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,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||||
|
"030000000d0f00006a00000011010000,HORI CO. LTD. 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,",
|
||||||
|
"030000000d0f00006b00000011010000,HORI CO. LTD. 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,",
|
||||||
|
"030000000d0f00005001000009040000,HORI Fighting Commander OCTA,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,",
|
||||||
|
"030000000d0f00008400000011010000,HORI Fighting Commander,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,",
|
||||||
|
"030000000d0f00008500000010010000,HORI Fighting Commander,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,",
|
||||||
|
"030000000d0f0000d800000072056800,HORI Real Arcade Pro S,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"06000000adde0000efbe000002010000,Hidromancer Game 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,",
|
||||||
|
"03000000d81400000862000011010000,HitBox (PS3/PC) Analog Mode,a:b1,b:b2,back:b8,guide:b9,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000000d0f00008600000002010000,Hori Fighting Commander,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000d80400008200000003000000,IMS PCU#0 Gamepad Interface,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,",
|
||||||
|
"03000000fd0500000030000000010000,InterAct GoPad I-73000 (Fighting Game Layout),a:b3,b:b4,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b7,x:b0,y:b1,",
|
||||||
|
"05000000491900000204000000000000,Ipega PG-9087S,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,",
|
||||||
|
"030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,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,",
|
||||||
|
"03000000300f00001001000010010000,Jess Tech Dual Analog Rumble Pad,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,",
|
||||||
|
"03000000ba2200002010000001010000,Jess Technology USB Game 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),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,",
|
||||||
|
"030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),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,",
|
||||||
|
"030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),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,",
|
||||||
|
"030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000c62400002b89000011010000,MOGA XP5-A 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,",
|
||||||
|
"05000000c62400002a89000000010000,MOGA XP5-A 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,",
|
||||||
|
"05000000c62400001a89000000010000,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,",
|
||||||
|
"03000000250900006688000000010000,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,",
|
||||||
|
"05000000380700006652000025010000,Mad Catz C.T.R.L.R ,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000380700003847000090040000,Mad Catz Wired Xbox 360 Controller (SFIV),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,",
|
||||||
|
"03000000380700001647000010040000,Mad Catz Wired 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000380700001888000010010000,MadCatz PC USB Wired Stick 8818,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,",
|
||||||
|
"03000000380700003888000010010000,MadCatz PC USB Wired Stick 8838,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,",
|
||||||
|
"03000000790000004418000010010000,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,",
|
||||||
|
"03000000780000000600000010010000,Microntek USB 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,",
|
||||||
|
"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,",
|
||||||
|
"030000005e0400008e02000004010000,Microsoft X-Box 360 pad,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,",
|
||||||
|
"030000005e0400008e02000062230000,Microsoft X-Box 360 pad,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,",
|
||||||
|
"030000005e040000d102000003020000,Microsoft X-Box One pad v2,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,",
|
||||||
|
"030000005e040000d102000001010000,Microsoft X-Box One pad,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,",
|
||||||
|
"030000005e0400008502000000010000,Microsoft X-Box pad (Japan),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,",
|
||||||
|
"030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),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,",
|
||||||
|
"030000005e0400008902000020010000,Microsoft Xbox Controller S,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,",
|
||||||
|
"03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b17,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,",
|
||||||
|
"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,",
|
||||||
|
"030000004b120000014d000000010000,NYKO AIRFLO EX,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:a3,righty:a2,start:b9,x:b2,y:b3,",
|
||||||
|
"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,",
|
||||||
|
"03000000790000004318000010010000,Nintendo 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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000790000004318000010010000,Nintendo 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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,",
|
||||||
|
"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,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b1,b:b0,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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,",
|
||||||
|
"05000000010000000100000003000000,Nintendo Wiimote,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,",
|
||||||
|
"030000000d0500000308000010010000,Nostromo n45 Dual Analog Gamepad,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,",
|
||||||
|
"05000000362800000100000002010000,OUYA Game 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,",
|
||||||
|
"05000000362800000100000003010000,OUYA Game 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,",
|
||||||
|
"030000005e0400000202000000010000,Old Xbox pad,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,",
|
||||||
|
"03000000ff1100003133000010010000,PC Game 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,",
|
||||||
|
"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,",
|
||||||
|
"030000006f0e00000901000011010000,PDP Versus Fighting Pad,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000004c0500006802000011010000,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||||
|
"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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||||
|
"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,",
|
||||||
|
"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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000c62400003a54000001010000,PowerA XBox One Controller,a:b0,b:b1,back:b6,dpdown:h0.7,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000008916000000fd000024010000,Razer Onza Tournament 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000321500000011000011010000,Razer Raion Fightpad for 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,",
|
||||||
|
"03000000790000001100000010010000,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000632500007505000010010000,SHANWAN PS3/PC 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,",
|
||||||
|
"03000000341a00000908000010010000,SL-6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,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,",
|
||||||
|
"03000000457500002211000010010000,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,",
|
||||||
|
"03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,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,",
|
||||||
|
"03000000a30600000cff000010010000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,",
|
||||||
|
"03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,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,",
|
||||||
|
"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,",
|
||||||
|
"03000000a30600000b04000000010000,Saitek P990 Dual Analog Pad,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,",
|
||||||
|
"03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,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,",
|
||||||
|
"03000000c01600008704000011010000,Serial/Keyboard/Mouse/Joystick,a:b12,b:b10,back:b4,dpdown:b2,dpleft:b3,dpright:b1,dpup:b0,leftshoulder:b9,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b8,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b5,x:b13,y:b11,",
|
||||||
|
"03000000f025000021c1000010010000,ShanWan Gioteck PS3 Wired 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,",
|
||||||
|
"03000000632500002305000010010000,ShanWan 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:a2,righty:a3,start:b9,x:b3,y:b0,",
|
||||||
|
"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,",
|
||||||
|
"030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad pad,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,",
|
||||||
|
"030000005e0400008e02000073050000,Speedlink TORID Wireless 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000de280000fc11000001000000,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,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b18,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,",
|
||||||
|
"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,",
|
||||||
|
"030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,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,",
|
||||||
|
"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,",
|
||||||
|
"030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3-in-1,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,",
|
||||||
|
"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,",
|
||||||
|
"030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless 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,",
|
||||||
|
"030000004f04000008d0000000010000,Thrustmaster Run N Drive Wireless,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,",
|
||||||
|
"03000000bd12000015d0000010010000,Tomee SNES USB 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,",
|
||||||
|
"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,",
|
||||||
|
"03000000100800000100000010010000,Twin USB 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000790000001100000000010000,USB Gamepad1,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,",
|
||||||
|
"05000000ac0500003232000001000000,VR-BOX,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,",
|
||||||
|
"030000006f0e00000302000011010000,Victrix Pro Fight Stick for 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,",
|
||||||
|
"030000006f0e00000702000011010000,Victrix Pro Fight Stick for 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,",
|
||||||
|
"030000005e0400008e02000010010000,X360 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,",
|
||||||
|
"030000005e0400008e02000014010000,X360 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,",
|
||||||
|
"030000005e0400001907000000010000,X360 Wireless 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,",
|
||||||
|
"030000005e0400009102000007010000,X360 Wireless 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,",
|
||||||
|
"030000005e040000a102000000010000,X360 Wireless 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,",
|
||||||
|
"030000005e040000a102000007010000,X360 Wireless 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,",
|
||||||
|
"03000000450c00002043000010010000,XEOX Gamepad SL-6556-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,",
|
||||||
|
"0000000058626f782033363020576900,Xbox 360 Wireless 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,",
|
||||||
|
"030000005e040000a102000014010000,Xbox 360 Wireless Receiver (XBOX),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,",
|
||||||
|
"0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),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,",
|
||||||
|
"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,",
|
||||||
|
"050000005e040000050b000003090000,Xbox One Elite Series 2,a:b0,b:b1,back:b121,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,",
|
||||||
|
"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,",
|
||||||
|
"030000005e040000ea02000000000000,Xbox One Wireless 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,",
|
||||||
|
"030000005e040000ea02000001030000,Xbox One Wireless 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,",
|
||||||
|
"050000005e040000e002000003090000,Xbox One Wireless 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,",
|
||||||
|
"050000005e040000fd02000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,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,",
|
||||||
|
"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,",
|
||||||
|
"05000000172700004431000029010000,XiaoMi Game 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,",
|
||||||
|
"03000000c0160000e105000001010000,Xin-Mo Xin-Mo 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,",
|
||||||
|
"03000000120c0000100e000011010000,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,",
|
||||||
|
"03000000120c0000101e000011010000,ZEROPLUS P4 Wired 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,",
|
||||||
|
"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,",
|
||||||
|
"030000000d0f00000d00000000010000,hori,a:b0,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftx:b4,lefty:b5,rightshoulder:b7,start:b9,x:b1,y:b2,",
|
||||||
|
"03000000830500006020000010010000,iBuffalo SNES Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"050000006964726f69643a636f6e0000,idroid:con,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,",
|
||||||
|
"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,",
|
||||||
|
"030000009b2800000300000001010000,raphnet.net 4nes4snes v1.5,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,",
|
||||||
|
]
|
||||||
|
elif compat_platform.startswith("darwin"):
|
||||||
|
mapping_list = [
|
||||||
|
"03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b0,b:b1,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:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001038000000010000,8BitDo FC30 Pro,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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000650000001000000,8BitDo M30 Gamepad,a:b0,b:b1,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a5,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000650000001000000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a5,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00005106000000010000,8BitDo M30 Gamepad,a:b0,b:b1,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00005106000000010000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001590000001000000,8BitDo N30 Pro 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:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00006528000000010000,8BitDo N30 Pro 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:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"030000003512000012ab000001000000,8BitDo NES30 Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"030000003512000012ab000001000000,8BitDo NES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000022000000090000001000000,8BitDo NES30 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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000203800000900000000010000,8BitDo NES30 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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000102800000900000000000000,8BitDo SFC30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000102800000900000000000000,8BitDo SFC30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001290000001000000,8BitDo SN30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001290000001000000,8BitDo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000260000001000000,8BitDo SN30 Pro+,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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000261000000010000,8BitDo SN30 Pro+,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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000160000001000000,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:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001890000001000000,8BitDo Zero 2,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00003032000000010000,8BitDo Zero 2,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000a00500003232000008010000,8BitDo Zero Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000a00500003232000008010000,8BitDo Zero Gamepad,a:b1,b:b2,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000a00500003232000009010000,8BitDo Zero Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000a00500003232000009010000,8BitDo Zero Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000a306000022f6000001030000,Cyborg V.3 Rumble Pad,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,",
|
||||||
|
"030000000d0f00008400000000010000,Fighting Commander,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,",
|
||||||
|
"030000000d0f00008500000000010000,Fighting Commander,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000790000000600000000000000,G-Shark GS-GP702,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000ad1b000001f9000000000000,Gamestop BB-070 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,",
|
||||||
|
"03000000d11800000094000000010000,Google 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000000d0f0000aa00000072050000,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000006d04000016c2000000000000,Logitech F310 Gamepad (DInput),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,",
|
||||||
|
"030000006d04000018c2000000000000,Logitech F510 Gamepad (DInput),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,",
|
||||||
|
"030000006d0400001fc2000000000000,Logitech F710 Gamepad (XInput),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,",
|
||||||
|
"030000006d04000019c2000000000000,Logitech Wireless Gamepad (DInput),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,",
|
||||||
|
"03000000d8140000cecf000000000000,MC 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,",
|
||||||
|
"03000000c62400002a89000000010000,MOGA XP5-A 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,",
|
||||||
|
"03000000c62400002b89000000010000,MOGA XP5-A 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,",
|
||||||
|
"03000000380700005032000000010000,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,",
|
||||||
|
"03000000380700005082000000010000,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,",
|
||||||
|
"03000000380700008433000000010000,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,",
|
||||||
|
"03000000380700008483000000010000,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,",
|
||||||
|
"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,",
|
||||||
|
"0300000025090000e803000000000000,Mayflash Wii Classic Controller,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,",
|
||||||
|
"03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),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,",
|
||||||
|
"030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,",
|
||||||
|
"03000000550900001472000025050000,NVIDIA Controller v01.04,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,",
|
||||||
|
"030000004b120000014d000000010000,NYKO AIRFLO EX,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:a3,righty:a2,start:b9,x:b2,y:b3,",
|
||||||
|
"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,",
|
||||||
|
"030000006f0e00000901000002010000,PDP Versus Fighting Pad,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||||
|
"030000008f0e00000300000000000000,Piranha xtreme,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,",
|
||||||
|
"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,",
|
||||||
|
"03000000321500000204000000010000,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000321500000011000000010000,Razer Raion Fightpad for 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000790000001100000000000000,Retrolink Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a3,lefty:a4,rightshoulder:b5,start:b9,x:b3,y:b0,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,",
|
||||||
|
"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,",
|
||||||
|
"03000000b40400000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000004c050000a00b000000000000,Sony DualShock 4 Wireless Adaptor,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,",
|
||||||
|
"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,",
|
||||||
|
"050000004e696d6275732b0000000000,SteelSeries Nimbus+,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,",
|
||||||
|
"03000000110100002014000000000000,SteelSeries Nimbus,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000bd12000015d0000000000000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,",
|
||||||
|
"03000000bd12000015d0000000010000,Tomee SNES USB 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,",
|
||||||
|
"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,",
|
||||||
|
"030000006f0e00000302000025040000,Victrix Pro Fight Stick for 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,",
|
||||||
|
"030000006f0e00000702000003060000,Victrix Pro Fight Stick for 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000005e0400008e02000000000000,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,",
|
||||||
|
"03000000c6240000045d000000000000,Xbox 360 Wired 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,",
|
||||||
|
"030000005e040000050b000003090000,Xbox Elite Wireless Controller,a:b0,b:b1,back:b38,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,",
|
||||||
|
"030000005e040000d102000000000000,Xbox One Wired 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,",
|
||||||
|
"030000005e040000dd02000000000000,Xbox One Wired 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,",
|
||||||
|
"030000005e040000e302000000000000,Xbox One Wired 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,",
|
||||||
|
"030000005e040000200b000011050000,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,",
|
||||||
|
"030000005e040000e002000000000000,Xbox Wireless 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,",
|
||||||
|
"030000005e040000e002000003090000,Xbox Wireless 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,",
|
||||||
|
"030000005e040000ea02000000000000,Xbox Wireless 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,",
|
||||||
|
"030000005e040000fd02000003090000,Xbox Wireless 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,",
|
||||||
|
"03000000172700004431000029010000,XiaoMi Game 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,",
|
||||||
|
"03000000120c0000100e000000010000,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,",
|
||||||
|
"03000000120c0000101e000000010000,ZEROPLUS P4 Wired 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,",
|
||||||
|
"03000000830500006020000000010000,iBuffalo SNES Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000830500006020000000010000,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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000830500006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,",
|
||||||
|
]
|
||||||
|
elif compat_platform.startswith("win"):
|
||||||
|
mapping_list = [
|
||||||
|
"03000000fa2d00000100000000000000,3DRUDDER,leftx:a0,lefty:a1,rightx:a5,righty:a2,",
|
||||||
|
"03000000c82d00000090000000000000,8BitDo FC30 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:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000090000000000000,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:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001038000000000000,8BitDo FC30 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:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001038000000000000,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:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000650000000000000,8BitDo M30 Gamepad,a:b0,b:b1,back:b10,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000650000000000000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00005106000000000000,8BitDo M30 Gamepad,a:b0,b:b1,back:b10,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00005106000000000000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001590000000000000,8BitDo N30 Pro 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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00006528000000000000,8BitDo N30 Pro 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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"030000003512000012ab000000000000,8BitDo NES30 Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"030000003512000012ab000000000000,8BitDo NES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000022000000090000000000000,8BitDo NES30 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:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000203800000900000000000000,8BitDo NES30 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:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00002038000000000000,8BitDo NES30 Pro,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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000060000000000000,8BitDo SF30 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:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000061000000000000,8BitDo SF30 Pro,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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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:a3,righty:a4,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000102800000900000000000000,8BitDo SFC30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000102800000900000000000000,8BitDo SFC30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001290000000000000,8BitDo SN30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001290000000000000,8BitDo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00006228000000000000,8BitDo SN30 Gamepad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00006228000000000000,8BitDo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000260000000000000,8BitDo SN30 Pro+,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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000261000000000000,8BitDo SN30 Pro+,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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00000160000000000000,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:a3,righty:a4,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"030000003512000020ab000000000000,8BitDo SNES30 Gamepad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"030000003512000020ab000000000000,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001890000000000000,8BitDo Zero 2,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00003032000000000000,8BitDo Zero 2,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000a00500003232000000000000,8BitDo Zero Gamepad,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000a00500003232000000000000,8BitDo Zero Gamepad,a:b1,b:b0,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"030000008f0e00001200000000000000,Acme GA-02,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000d62000001d57000000000000,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000d6200000e557000000000000,Batarang,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,",
|
||||||
|
"03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000bc2000000055000000000000,Betop BFM Gamepad,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"0300000066f700000500000000000000,BrutalLegendTest,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000a306000022f6000000000000,Cyborg V.3 Rumble Pad,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000bd12000002e0000000000000,Dual USB 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,",
|
||||||
|
"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,",
|
||||||
|
"03000000341a00000108000000000000,EXEQ RF USB Gamepad 8206,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000000d0f00002700000000000000,FIGHTING STICK 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,",
|
||||||
|
"030000000d0f00008700000000000000,Fighting Stick mini 4,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,",
|
||||||
|
"030000000d0f00008800000000000000,Fighting Stick mini 4,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,",
|
||||||
|
"78696e70757403000000000000000000,Fightstick TES,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000790000000600000000000000,G-Shark GS-GP702,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,",
|
||||||
|
"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,",
|
||||||
|
"03000000300f00000b01000000000000,GGE909 Recoil Pad,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,",
|
||||||
|
"03000000790000002201000000000000,Game Controller for PC,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,",
|
||||||
|
"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,",
|
||||||
|
"03000000ac0500003d03000000000000,GameSir,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,",
|
||||||
|
"03000000ac0500004d04000000000000,GameSir,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,",
|
||||||
|
"03000000ffff00000000000000000000,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000280400000140000000000000,Gamepad Pro USB,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000f0250000c383000000000000,Gioteck VX2 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,",
|
||||||
|
"03000000f0250000c483000000000000,Gioteck VX2 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,",
|
||||||
|
"03000000f0250000c283000000000000,Gioteck,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,",
|
||||||
|
"03000000d11800000094000000000000,Google 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,",
|
||||||
|
"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,",
|
||||||
|
"030000000d0f00008400000000000000,HORI Fighting Commander,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,",
|
||||||
|
"030000000d0f00008500000000000000,HORI Fighting Commander,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000000d0f0000ee00000000000000,HORIPAD mini4,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,",
|
||||||
|
"03000000250900000017000000000000,HRAP2 on PS/SS/N64 Joypad to USB BOX,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,",
|
||||||
|
"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,",
|
||||||
|
"030000000d0f00004900000000000000,Hatsune Miku Sho 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000000d0f00004000000000000000,Hori Fighting Stick 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000ac0500002c02000000000000,IPEGA,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,",
|
||||||
|
"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,",
|
||||||
|
"03000000491900000204000000000000,Ipega PG-9023,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,",
|
||||||
|
"030000006e0500000520000000000000,JC-P301U,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,",
|
||||||
|
"030000006e0500000320000000000000,JC-U3613M (DInput),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,",
|
||||||
|
"030000006e0500000720000000000000,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000006d04000018c2000000000000,Logitech F510 Gamepad,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,",
|
||||||
|
"030000006d04000019c2000000000000,Logitech F710 Gamepad,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,",
|
||||||
|
"03000000380700008081000000000000,MADCATZ 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,",
|
||||||
|
"03000000380700006382000000000000,MLG Gamepad 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,",
|
||||||
|
"03000000c62400002a89000000000000,MOGA XP5-A 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,",
|
||||||
|
"03000000c62400002b89000000000000,MOGA XP5-A 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,",
|
||||||
|
"03000000c62400001a89000000000000,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:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||||
|
"03000000c62400001b89000000000000,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:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||||
|
"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,",
|
||||||
|
"03000000380700006652000000000000,Mad Catz C.T.R.L.R,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000380700006252000000000000,Mad Catz Micro C.T.R.L.R,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000380700001888000000000000,MadCatz 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,",
|
||||||
|
"03000000380700008532000000000000,Madcatz 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,",
|
||||||
|
"03000000380700003888000000000000,Madcatz 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000008f0e00001030000000000000,Mayflash USB Adapter for original Sega Saturn controller,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,",
|
||||||
|
"0300000025090000e803000000000000,Mayflash Wii Classic Controller,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,",
|
||||||
|
"03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000001008000001e5000000000000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b6,start:b9,x:b3,y:b0,",
|
||||||
|
"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,",
|
||||||
|
"030000005509000000b4000000000000,NVIDIA 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,",
|
||||||
|
"030000004b120000014d000000000000,NYKO AIRFLO EX,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:a3,righty:a2,start:b9,x:b2,y:b3,",
|
||||||
|
"03000000790000004318000000000000,Nintendo 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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000790000004318000000000000,Nintendo GameCube Controller,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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000bd12000015d0000000000000,Nintendo Retrolink USB Super SNES Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,",
|
||||||
|
"030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b1,b:b0,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,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000362800000100000000000000,OUYA Game 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,",
|
||||||
|
"03000000782300000a10000000000000,Onlive Wireless 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,",
|
||||||
|
"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,",
|
||||||
|
"03000000120c0000f60e000000000000,P4 Wired 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,",
|
||||||
|
"030000006f0e00000901000000000000,PDP Versus Fighting Pad,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,",
|
||||||
|
"03000000632500002306000000000000,PS 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,",
|
||||||
|
"03000000e30500009605000000000000,PS to USB convert cable,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000250900000500000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000003807000056a8000000000000,PS3 RF pad,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,",
|
||||||
|
"03000000100000008200000000000000,PS360+ v1.66,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:h0.4,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,",
|
||||||
|
"030000008f0e00000300000000000000,Piranha xtreme,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000222c00000020000000000000,QANBA DRONE 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:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,",
|
||||||
|
"03000000300f00000011000000000000,QanBa Arcade JoyStick 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,",
|
||||||
|
"03000000300f00001611000000000000,QanBa Arcade JoyStick 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000222c00000223000000000000,Qanba Obsidian Arcade Joystick PS3 Mode,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,",
|
||||||
|
"03000000222c00000023000000000000,Qanba Obsidian Arcade Joystick PS4 Mode,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,",
|
||||||
|
"030000000d0f00001100000000000000,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,",
|
||||||
|
"030000000d0f00007000000000000000,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,",
|
||||||
|
"030000000d0f00002200000000000000,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,",
|
||||||
|
"03000000050b00005819000000000000,ROG Chakram Core,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,",
|
||||||
|
"03000000050b0000181a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,",
|
||||||
|
"03000000050b00001a1a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,",
|
||||||
|
"03000000050b00001c1a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,",
|
||||||
|
"03000000050b0000e318000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,",
|
||||||
|
"03000000050b0000e518000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,",
|
||||||
|
"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,",
|
||||||
|
"03000000321500000204000000000000,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000321500000011000000000000,Razer Raion Fightpad for 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,",
|
||||||
|
"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,",
|
||||||
|
"030000000d0f00006a00000000000000,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,",
|
||||||
|
"030000000d0f00006b00000000000000,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,",
|
||||||
|
"030000000d0f00008a00000000000000,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,",
|
||||||
|
"030000000d0f00008b00000000000000,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,",
|
||||||
|
"030000000d0f00005b00000000000000,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,",
|
||||||
|
"030000000d0f00005c00000000000000,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,",
|
||||||
|
"0300000000f000000300000000000000,RetroUSB.com RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,",
|
||||||
|
"0300000000f00000f100000000000000,RetroUSB.com Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,",
|
||||||
|
"03000000790000001100000000000000,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000341a00000208000000000000,SL-6555-SBK,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,",
|
||||||
|
"03000000341a00000908000000000000,SL-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,",
|
||||||
|
"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,",
|
||||||
|
"03000000ff1100003133000000000000,SVEN X-PAD,a:b2,b:b3,back:b4,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:a4,start:b5,x:b0,y:b1,",
|
||||||
|
"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,",
|
||||||
|
"03000000a306000023f6000000000000,Saitek Cyborg V.1 Game pad,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,",
|
||||||
|
"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,",
|
||||||
|
"03000000300f00001201000000000000,Saitek Dual Analog Pad,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,",
|
||||||
|
"03000000a30600000cff000000000000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,x:b0,y:b1,",
|
||||||
|
"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,",
|
||||||
|
"03000000300f00001001000000000000,Saitek P480 Rumble Pad,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,",
|
||||||
|
"03000000a30600000b04000000010000,Saitek P990 Dual Analog Pad,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,",
|
||||||
|
"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,",
|
||||||
|
"03000000a30600002106000000000000,Saitek PS1000,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,",
|
||||||
|
"03000000a306000020f6000000000000,Saitek PS2700,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,",
|
||||||
|
"03000000300f00001101000000000000,Saitek Rumble Pad,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,",
|
||||||
|
"0300000000050000289b000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,",
|
||||||
|
"030000009b2800000500000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,",
|
||||||
|
"03000000d620000011a7000000000000,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:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,",
|
||||||
|
"030000004f04000007d0000000000000,T Mini Wireless,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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"030000004f04000023b3000000000000,Thrustmaster Dual Trigger 3-in-1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,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,",
|
||||||
|
"030000004f04000004b3000000000000,Thrustmaster Firestorm 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,",
|
||||||
|
"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,",
|
||||||
|
"03000000666600000488000000000000,TigerGame PS/PS2 Game Controller 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000d90400000200000000000000,TwinShock PS2,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,",
|
||||||
|
"03000000300f00000701000000000000,USB 4-Axis 12-Button 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:a2,start:b9,x:b3,y:b0,",
|
||||||
|
"03000000341a00002308000000000000,USB Gamepad,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,",
|
||||||
|
"030000006b1400000203000000000000,USB Gamepad,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,",
|
||||||
|
"03000000790000000a00000000000000,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:a2,righty:a4,start:b9,x:b3,y:b0,",
|
||||||
|
"03000000f0250000c183000000000000,USB 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,",
|
||||||
|
"03000000ff1100004133000000000000,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:a4,righty:a2,start:b9,x:b3,y:b0,",
|
||||||
|
"03000000632500002305000000000000,USB Vibration Joystick (BM),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,",
|
||||||
|
"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,",
|
||||||
|
"030000006f0e00000302000000000000,Victrix Pro Fight Stick for 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,",
|
||||||
|
"030000006f0e00000702000000000000,Victrix Pro Fight Stick for 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,",
|
||||||
|
"03000000450c00002043000000000000,XEOX Gamepad SL-6556-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,",
|
||||||
|
"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,",
|
||||||
|
"03000000172700004431000000000000,XiaoMi Game 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,",
|
||||||
|
"03000000790000004f18000000000000,ZD-T 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,",
|
||||||
|
"03000000120c0000101e000000000000,ZEROPLUS P4 Wired 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,",
|
||||||
|
"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,",
|
||||||
|
"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,",
|
||||||
|
"03000000830500006020000000000000,iBuffalo SNES Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"03000000830500006020000000000000,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,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,",
|
||||||
|
"030000004f04000003d0000000000000,run'n'drive,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,",
|
||||||
|
"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,",
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
mapping_list = []
|
@ -37,9 +37,9 @@ import sys
|
|||||||
|
|
||||||
from ctypes import CFUNCTYPE, byref, c_void_p, c_int, c_ubyte, c_bool, c_uint32, c_uint64
|
from ctypes import CFUNCTYPE, byref, c_void_p, c_int, c_ubyte, c_bool, c_uint32, c_uint64
|
||||||
|
|
||||||
from .gamecontroller import is_game_controller
|
from .controller import get_mapping
|
||||||
from .base import Device, AbsoluteAxis, RelativeAxis, Button
|
from .base import Device, AbsoluteAxis, RelativeAxis, Button
|
||||||
from .base import Joystick, GameController, AppleRemote
|
from .base import Joystick, Controller, AppleRemote
|
||||||
|
|
||||||
from pyglet.libs.darwin.cocoapy import CFSTR, CFIndex, CFTypeID, known_cftypes
|
from pyglet.libs.darwin.cocoapy import CFSTR, CFIndex, CFTypeID, known_cftypes
|
||||||
from pyglet.libs.darwin.cocoapy import kCFRunLoopDefaultMode, CFAllocatorRef, cf
|
from pyglet.libs.darwin.cocoapy import kCFRunLoopDefaultMode, CFAllocatorRef, cf
|
||||||
@ -689,6 +689,14 @@ def get_apple_remote(display=None):
|
|||||||
return AppleRemote(PygletDevice(display, device, _manager))
|
return AppleRemote(PygletDevice(display, device, _manager))
|
||||||
|
|
||||||
|
|
||||||
def get_game_controllers(display=None):
|
def _create_controller(device, display):
|
||||||
return [GameController(PygletDevice(display, device, _manager)) for device in _manager.devices
|
mapping = get_mapping(device.get_guid())
|
||||||
if is_game_controller(device)]
|
if not mapping:
|
||||||
|
return
|
||||||
|
return Controller(PygletDevice(display, device, _manager), mapping)
|
||||||
|
|
||||||
|
|
||||||
|
def get_controllers(display=None):
|
||||||
|
return [controller for controller in
|
||||||
|
[_create_controller(device, display) for device in _manager.devices]
|
||||||
|
if controller is not None]
|
||||||
|
@ -40,7 +40,7 @@ from pyglet.input import base
|
|||||||
from pyglet.libs import win32
|
from pyglet.libs import win32
|
||||||
from pyglet.libs.win32 import dinput
|
from pyglet.libs.win32 import dinput
|
||||||
from pyglet.libs.win32 import _kernel32
|
from pyglet.libs.win32 import _kernel32
|
||||||
from .gamecontroller import is_game_controller
|
from .controller import get_mapping
|
||||||
|
|
||||||
# These instance names are not defined anywhere, obtained by experiment. The
|
# These instance names are not defined anywhere, obtained by experiment. The
|
||||||
# GUID names (which seem to be ideally what are needed) are wrong/missing for
|
# GUID names (which seem to be ideally what are needed) are wrong/missing for
|
||||||
@ -251,16 +251,15 @@ def get_joysticks(display=None):
|
|||||||
if joystick is not None]
|
if joystick is not None]
|
||||||
|
|
||||||
|
|
||||||
def _create_game_controller(device):
|
def _create_controller(device):
|
||||||
if not is_game_controller(device):
|
mapping = get_mapping(device.get_guid())
|
||||||
return
|
if mapping is not None and device._type in (dinput.DI8DEVTYPE_JOYSTICK,
|
||||||
if device._type in (dinput.DI8DEVTYPE_JOYSTICK,
|
|
||||||
dinput.DI8DEVTYPE_1STPERSON,
|
dinput.DI8DEVTYPE_1STPERSON,
|
||||||
dinput.DI8DEVTYPE_GAMEPAD):
|
dinput.DI8DEVTYPE_GAMEPAD):
|
||||||
return base.GameController(device)
|
return base.Controller(device, mapping)
|
||||||
|
|
||||||
|
|
||||||
def get_game_controllers(display=None):
|
def get_controllers(display=None):
|
||||||
return [controller for controller in
|
return [controller for controller in
|
||||||
[_create_game_controller(device) for device in get_devices(display)]
|
[_create_controller(device) for device in get_devices(display)]
|
||||||
if controller is not None]
|
if controller is not None]
|
||||||
|
@ -42,10 +42,10 @@ import ctypes
|
|||||||
import pyglet
|
import pyglet
|
||||||
|
|
||||||
from pyglet.app.xlib import XlibSelectDevice
|
from pyglet.app.xlib import XlibSelectDevice
|
||||||
from .base import Device, RelativeAxis, AbsoluteAxis, Button, Joystick, GameController
|
from .base import Device, RelativeAxis, AbsoluteAxis, Button, Joystick, Controller
|
||||||
from .base import DeviceOpenException
|
from .base import DeviceOpenException
|
||||||
from .evdev_constants import *
|
from .evdev_constants import *
|
||||||
from .gamecontroller import is_game_controller
|
from .controller import get_mapping
|
||||||
|
|
||||||
c = pyglet.lib.load_library('c')
|
c = pyglet.lib.load_library('c')
|
||||||
|
|
||||||
@ -366,7 +366,7 @@ class EvdevDevice(XlibSelectDevice, Device):
|
|||||||
return self._fileno
|
return self._fileno
|
||||||
|
|
||||||
def poll(self):
|
def poll(self):
|
||||||
return True
|
return False
|
||||||
|
|
||||||
def select(self):
|
def select(self):
|
||||||
if not self._fileno:
|
if not self._fileno:
|
||||||
@ -386,7 +386,7 @@ class EvdevDevice(XlibSelectDevice, Device):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class EvdevGameController(GameController):
|
class EvdevController(Controller):
|
||||||
|
|
||||||
_rumble_weak = -1
|
_rumble_weak = -1
|
||||||
_rumble_strong = -1
|
_rumble_strong = -1
|
||||||
@ -455,31 +455,28 @@ def get_joysticks(display=None):
|
|||||||
if joystick is not None]
|
if joystick is not None]
|
||||||
|
|
||||||
|
|
||||||
def _create_game_controller(device):
|
def _create_controller(device):
|
||||||
# Look for something with an ABS X and ABS Y axis, and a joystick 0 button
|
# Look for something with an ABS X and ABS Y axis, and BTN_GAMEPAD
|
||||||
have_x = False
|
|
||||||
have_y = False
|
|
||||||
have_button = False
|
have_button = False
|
||||||
if not is_game_controller(device):
|
|
||||||
return
|
|
||||||
device.controls.sort(key=lambda ctrl: ctrl._event_code)
|
device.controls.sort(key=lambda ctrl: ctrl._event_code)
|
||||||
for control in device.controls:
|
for control in device.controls:
|
||||||
if control._event_type == EV_ABS and control._event_code == ABS_X:
|
if control._event_type == EV_KEY and control._event_code == BTN_GAMEPAD:
|
||||||
have_x = True
|
|
||||||
elif control._event_type == EV_ABS and control._event_code == ABS_Y:
|
|
||||||
have_y = True
|
|
||||||
elif control._event_type == EV_KEY and control._event_code in (BTN_JOYSTICK, BTN_GAMEPAD):
|
|
||||||
have_button = True
|
have_button = True
|
||||||
if not (have_x and have_y and have_button):
|
|
||||||
|
mapping = get_mapping(device.get_guid())
|
||||||
|
# TODO: detect via device types, and use default mapping.
|
||||||
|
|
||||||
|
if have_button is False or mapping is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
if device.supports_ff():
|
if device.supports_ff():
|
||||||
return EvdevGameController(device)
|
return EvdevController(device, mapping)
|
||||||
else:
|
else:
|
||||||
return GameController(device)
|
return Controller(device, mapping)
|
||||||
|
|
||||||
|
|
||||||
def get_game_controllers(display=None):
|
def get_controllers(display=None):
|
||||||
return [controller for controller in
|
return [controller for controller in
|
||||||
[_create_game_controller(device) for device in get_devices(display)]
|
[_create_controller(device) for device in get_devices(display)]
|
||||||
if controller is not None]
|
if controller is not None]
|
||||||
|
@ -579,7 +579,7 @@ class Vec4(tuple):
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
def clamp(self, min_val, max_val):
|
def clamp(self, min_val, max_val):
|
||||||
return Vec3(clamp(self[0], min_val, max_val),
|
return Vec4(clamp(self[0], min_val, max_val),
|
||||||
clamp(self[1], min_val, max_val),
|
clamp(self[1], min_val, max_val),
|
||||||
clamp(self[2], min_val, max_val),
|
clamp(self[2], min_val, max_val),
|
||||||
clamp(self[3], min_val, max_val))
|
clamp(self[3], min_val, max_val))
|
||||||
|
@ -126,7 +126,7 @@ def have_ffmpeg():
|
|||||||
print('FFmpeg available, using to load media files.')
|
print('FFmpeg available, using to load media files.')
|
||||||
return True
|
return True
|
||||||
|
|
||||||
except (ImportError, FileNotFoundError):
|
except (ImportError, FileNotFoundError, AttributeError):
|
||||||
if _debug:
|
if _debug:
|
||||||
print('FFmpeg not available.')
|
print('FFmpeg not available.')
|
||||||
return False
|
return False
|
||||||
|
@ -962,6 +962,7 @@ class FFmpegSource(StreamingSource):
|
|||||||
self._decode_video_packet(video_packet)
|
self._decode_video_packet(video_packet)
|
||||||
if video_packet.image is not None:
|
if video_packet.image is not None:
|
||||||
ts = video_packet.timestamp
|
ts = video_packet.timestamp
|
||||||
|
self.videoq.appendleft(video_packet) # put it back
|
||||||
break
|
break
|
||||||
self._get_video_packet()
|
self._get_video_packet()
|
||||||
else:
|
else:
|
||||||
|
@ -616,7 +616,7 @@ class WMFSource(Source):
|
|||||||
|
|
||||||
imfmedia.Release()
|
imfmedia.Release()
|
||||||
|
|
||||||
uncompressed_mt.SetGUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32)
|
uncompressed_mt.SetGUID(MF_MT_SUBTYPE, MFVideoFormat_ARGB32)
|
||||||
uncompressed_mt.SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive)
|
uncompressed_mt.SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive)
|
||||||
uncompressed_mt.SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1)
|
uncompressed_mt.SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1)
|
||||||
|
|
||||||
|
@ -478,6 +478,11 @@ class Player(pyglet.event.EventDispatcher):
|
|||||||
|
|
||||||
pyglet.clock.schedule_once(self._video_finished, 0)
|
pyglet.clock.schedule_once(self._video_finished, 0)
|
||||||
return
|
return
|
||||||
|
elif ts > time:
|
||||||
|
# update_texture called too early (probably manually!)
|
||||||
|
pyglet.clock.schedule_once(self.update_texture, ts - time)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
image = source.get_next_video_frame()
|
image = source.get_next_video_frame()
|
||||||
if image is not None:
|
if image is not None:
|
||||||
|
@ -243,25 +243,23 @@ class OBJModelDecoder(ModelDecoder):
|
|||||||
|
|
||||||
for mesh in mesh_list:
|
for mesh in mesh_list:
|
||||||
material = mesh.material
|
material = mesh.material
|
||||||
|
count = len(mesh.vertices) // 3
|
||||||
if material.texture_name:
|
if material.texture_name:
|
||||||
texture = pyglet.resource.texture(material.texture_name)
|
texture = pyglet.resource.texture(material.texture_name)
|
||||||
group = TexturedMaterialGroup(material, texture)
|
group = TexturedMaterialGroup(material, texture)
|
||||||
vertex_lists.append(batch.add(len(mesh.vertices) // 3,
|
program = pyglet.model.get_default_textured_shader()
|
||||||
GL_TRIANGLES,
|
vertex_lists.append(program.vertex_list(count, GL_TRIANGLES, batch, group,
|
||||||
group,
|
vertices=('f', mesh.vertices),
|
||||||
('vertices3f', mesh.vertices),
|
normals=('f', mesh.normals),
|
||||||
('normals3f', mesh.normals),
|
tex_coords=('f', mesh.tex_coords),
|
||||||
('tex_coords2f', mesh.tex_coords),
|
colors=('f', material.diffuse * count)))
|
||||||
('colors4f', material.diffuse * (len(mesh.vertices) // 3))))
|
|
||||||
else:
|
else:
|
||||||
group = MaterialGroup(material)
|
group = MaterialGroup(material)
|
||||||
vertex_lists.append(batch.add(len(mesh.vertices) // 3,
|
program = pyglet.model.get_default_shader()
|
||||||
GL_TRIANGLES,
|
vertex_lists.append(program.vertex_list(count, GL_TRIANGLES, batch, group,
|
||||||
group,
|
vertices=('f', mesh.vertices),
|
||||||
('vertices3f', mesh.vertices),
|
normals=('f', mesh.normals),
|
||||||
('normals3f', mesh.normals),
|
colors=('f', material.diffuse * count)))
|
||||||
('colors4f', material.diffuse * (len(mesh.vertices) // 3))))
|
|
||||||
|
|
||||||
groups.append(group)
|
groups.append(group)
|
||||||
|
|
||||||
return Model(vertex_lists=vertex_lists, groups=groups, batch=batch)
|
return Model(vertex_lists=vertex_lists, groups=groups, batch=batch)
|
||||||
|
@ -125,6 +125,32 @@ def get_default_shader():
|
|||||||
return default_shader_program
|
return default_shader_program
|
||||||
|
|
||||||
|
|
||||||
|
def _rotate(vertices, angle, x, y):
|
||||||
|
"""Rotate the vertices by the angle around x, y.
|
||||||
|
|
||||||
|
:Parameters:
|
||||||
|
`vertices` : list
|
||||||
|
A list of (x, y) tuples, representing each vertex to rotate.
|
||||||
|
`angle` : float
|
||||||
|
The angle of the rotation in degrees.
|
||||||
|
`x` : int or float
|
||||||
|
X coordinate of the center of rotation.
|
||||||
|
`y` : int or float
|
||||||
|
Y coordinate of the center of rotation.
|
||||||
|
"""
|
||||||
|
r = -math.radians(angle)
|
||||||
|
cr = math.cos(r)
|
||||||
|
sr = math.sin(r)
|
||||||
|
|
||||||
|
rotated_vertices = []
|
||||||
|
for vertex in vertices:
|
||||||
|
rotated_x = (vertex[0] - x) * cr - (vertex[1] - y) * sr + x
|
||||||
|
rotated_y = (vertex[1] - y) * cr + (vertex[0] - x) * sr + y
|
||||||
|
rotated_vertices.append((rotated_x, rotated_y))
|
||||||
|
|
||||||
|
return rotated_vertices
|
||||||
|
|
||||||
|
|
||||||
class _ShapeGroup(ShaderGroup):
|
class _ShapeGroup(ShaderGroup):
|
||||||
"""Shared Shape rendering Group.
|
"""Shared Shape rendering Group.
|
||||||
|
|
||||||
@ -132,7 +158,7 @@ class _ShapeGroup(ShaderGroup):
|
|||||||
sharing the same parent group and blend parameters.
|
sharing the same parent group and blend parameters.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, blend_src, blend_dest, parent=None):
|
def __init__(self, blend_src, blend_dest, program, parent=None):
|
||||||
"""Create a Shape group.
|
"""Create a Shape group.
|
||||||
|
|
||||||
The group is created internally. Usually you do not
|
The group is created internally. Usually you do not
|
||||||
@ -148,7 +174,7 @@ class _ShapeGroup(ShaderGroup):
|
|||||||
`parent` : `~pyglet.graphics.Group`
|
`parent` : `~pyglet.graphics.Group`
|
||||||
Optional parent group.
|
Optional parent group.
|
||||||
"""
|
"""
|
||||||
super().__init__(get_default_shader(), parent=parent)
|
super().__init__(program, parent=parent)
|
||||||
self.blend_src = blend_src
|
self.blend_src = blend_src
|
||||||
self.blend_dest = blend_dest
|
self.blend_dest = blend_dest
|
||||||
|
|
||||||
@ -398,10 +424,10 @@ class Arc(_ShapeBase):
|
|||||||
self._rotation = 0
|
self._rotation = 0
|
||||||
|
|
||||||
self._batch = batch or Batch()
|
self._batch = batch or Batch()
|
||||||
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, group)
|
program = get_default_shader()
|
||||||
|
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, program, group)
|
||||||
self._vertex_list = self._batch.add(self._num_verts, GL_LINES, self._group, 'position2f', 'colors4Bn')
|
|
||||||
|
|
||||||
|
self._vertex_list = program.vertex_list(self._num_verts, GL_LINES, self._batch, self._group, colors='Bn')
|
||||||
self._update_position()
|
self._update_position()
|
||||||
self._update_color()
|
self._update_color()
|
||||||
|
|
||||||
@ -491,10 +517,11 @@ class Circle(_ShapeBase):
|
|||||||
self._segments = segments or max(14, int(radius / 1.25))
|
self._segments = segments or max(14, int(radius / 1.25))
|
||||||
self._rgb = color
|
self._rgb = color
|
||||||
|
|
||||||
|
program = get_default_shader()
|
||||||
self._batch = batch or Batch()
|
self._batch = batch or Batch()
|
||||||
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, group)
|
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, program, group)
|
||||||
|
|
||||||
self._vertex_list = self._batch.add(self._segments*3, GL_TRIANGLES, self._group, 'position2f', 'colors4Bn')
|
self._vertex_list = program.vertex_list(self._segments*3, GL_TRIANGLES, self._batch, self._group, colors='Bn')
|
||||||
self._update_position()
|
self._update_position()
|
||||||
self._update_color()
|
self._update_color()
|
||||||
|
|
||||||
@ -568,10 +595,11 @@ class Ellipse(_ShapeBase):
|
|||||||
self._segments = int(max(a, b) / 1.25)
|
self._segments = int(max(a, b) / 1.25)
|
||||||
self._num_verts = self._segments * 2
|
self._num_verts = self._segments * 2
|
||||||
|
|
||||||
|
program = get_default_shader()
|
||||||
self._batch = batch or Batch()
|
self._batch = batch or Batch()
|
||||||
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, group)
|
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, program, group)
|
||||||
self._vertex_list = self._batch.add(self._num_verts, GL_LINES, self._group, 'position2f', 'colors4Bn')
|
|
||||||
|
|
||||||
|
self._vertex_list = program.vertex_list(self._num_verts, GL_LINES, self._batch, self._group, colors='Bn')
|
||||||
self._update_position()
|
self._update_position()
|
||||||
self._update_color()
|
self._update_color()
|
||||||
|
|
||||||
@ -589,15 +617,7 @@ class Ellipse(_ShapeBase):
|
|||||||
|
|
||||||
# Rotate all points:
|
# Rotate all points:
|
||||||
if self._rotation:
|
if self._rotation:
|
||||||
r = -math.radians(self._rotation)
|
points = _rotate(points, self._rotation, x, y)
|
||||||
cr = math.cos(r)
|
|
||||||
sr = math.sin(r)
|
|
||||||
now_points = []
|
|
||||||
for point in points:
|
|
||||||
now_x = (point[0] - x) * cr - (point[1] - y) * sr + x
|
|
||||||
now_y = (point[1] - y) * cr + (point[0] - x) * sr + y
|
|
||||||
now_points.append((now_x, now_y))
|
|
||||||
points = now_points
|
|
||||||
|
|
||||||
# Create a list of lines from the points:
|
# Create a list of lines from the points:
|
||||||
vertices = []
|
vertices = []
|
||||||
@ -702,10 +722,11 @@ class Sector(_ShapeBase):
|
|||||||
self._start_angle = start_angle
|
self._start_angle = start_angle
|
||||||
self._rotation = 0
|
self._rotation = 0
|
||||||
|
|
||||||
|
program = get_default_shader()
|
||||||
self._batch = batch or Batch()
|
self._batch = batch or Batch()
|
||||||
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, group)
|
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, program, group)
|
||||||
|
|
||||||
self._vertex_list = self._batch.add(self._segments * 3, GL_TRIANGLES, self._group, 'position2f', 'colors4Bn')
|
self._vertex_list = program.vertex_list(self._segments*3, GL_TRIANGLES, self._batch, self._group, colors='Bn')
|
||||||
self._update_position()
|
self._update_position()
|
||||||
self._update_color()
|
self._update_color()
|
||||||
|
|
||||||
@ -825,9 +846,11 @@ class Line(_ShapeBase):
|
|||||||
self._rotation = math.degrees(math.atan2(y2 - y, x2 - x))
|
self._rotation = math.degrees(math.atan2(y2 - y, x2 - x))
|
||||||
self._rgb = color
|
self._rgb = color
|
||||||
|
|
||||||
|
program = get_default_shader()
|
||||||
self._batch = batch or Batch()
|
self._batch = batch or Batch()
|
||||||
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, group)
|
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, program, group)
|
||||||
self._vertex_list = self._batch.add(6, GL_TRIANGLES, self._group, 'position2f', 'colors4Bn')
|
|
||||||
|
self._vertex_list = program.vertex_list(6, GL_TRIANGLES, self._batch, self._group, colors='Bn')
|
||||||
self._update_position()
|
self._update_position()
|
||||||
self._update_color()
|
self._update_color()
|
||||||
|
|
||||||
@ -937,41 +960,31 @@ class Rectangle(_ShapeBase):
|
|||||||
self._rotation = 0
|
self._rotation = 0
|
||||||
self._rgb = color
|
self._rgb = color
|
||||||
|
|
||||||
|
program = get_default_shader()
|
||||||
self._batch = batch or Batch()
|
self._batch = batch or Batch()
|
||||||
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, group)
|
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, program, group)
|
||||||
self._vertex_list = self._batch.add(6, GL_TRIANGLES, self._group, 'position2f', 'colors4Bn')
|
|
||||||
|
self._vertex_list = program.vertex_list(6, GL_TRIANGLES, self._batch, self._group, colors='Bn')
|
||||||
self._update_position()
|
self._update_position()
|
||||||
self._update_color()
|
self._update_color()
|
||||||
|
|
||||||
def _update_position(self):
|
def _update_position(self):
|
||||||
if not self._visible:
|
if not self._visible:
|
||||||
self._vertex_list.position[:] = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
self._vertex_list.position[:] = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
||||||
elif self._rotation:
|
|
||||||
x1 = -self._anchor_x
|
|
||||||
y1 = -self._anchor_y
|
|
||||||
x2 = x1 + self._width
|
|
||||||
y2 = y1 + self._height
|
|
||||||
x = self._x
|
|
||||||
y = self._y
|
|
||||||
|
|
||||||
r = -math.radians(self._rotation)
|
|
||||||
cr = math.cos(r)
|
|
||||||
sr = math.sin(r)
|
|
||||||
ax = x1 * cr - y1 * sr + x
|
|
||||||
ay = x1 * sr + y1 * cr + y
|
|
||||||
bx = x2 * cr - y1 * sr + x
|
|
||||||
by = x2 * sr + y1 * cr + y
|
|
||||||
cx = x2 * cr - y2 * sr + x
|
|
||||||
cy = x2 * sr + y2 * cr + y
|
|
||||||
dx = x1 * cr - y2 * sr + x
|
|
||||||
dy = x1 * sr + y2 * cr + y
|
|
||||||
self._vertex_list.position[:] = (ax, ay, bx, by, cx, cy, ax, ay, cx, cy, dx, dy)
|
|
||||||
else:
|
else:
|
||||||
x1 = self._x - self._anchor_x
|
x1 = self._x - self._anchor_x
|
||||||
y1 = self._y - self._anchor_y
|
y1 = self._y - self._anchor_y
|
||||||
x2 = x1 + self._width
|
x2 = x1 + self._width
|
||||||
y2 = y1 + self._height
|
y2 = y1 + self._height
|
||||||
self._vertex_list.position[:] = (x1, y1, x2, y1, x2, y2, x1, y1, x2, y2, x1, y2)
|
x = self._x
|
||||||
|
y = self._y
|
||||||
|
|
||||||
|
vertices = [(x1, y1), (x2, y1), (x2, y2), (x1, y1), (x2, y2), (x1, y2)]
|
||||||
|
|
||||||
|
if self._rotation:
|
||||||
|
vertices = _rotate(vertices, self._rotation, x, y)
|
||||||
|
|
||||||
|
self._vertex_list.position[:] = tuple(value for vertex in vertices for value in vertex)
|
||||||
|
|
||||||
def _update_color(self):
|
def _update_color(self):
|
||||||
self._vertex_list.colors[:] = [*self._rgb, int(self._opacity)] * 6
|
self._vertex_list.colors[:] = [*self._rgb, int(self._opacity)] * 6
|
||||||
@ -1058,23 +1071,26 @@ class BorderedRectangle(_ShapeBase):
|
|||||||
self._rgb = color
|
self._rgb = color
|
||||||
self._brgb = border_color
|
self._brgb = border_color
|
||||||
|
|
||||||
|
program = get_default_shader()
|
||||||
self._batch = batch or Batch()
|
self._batch = batch or Batch()
|
||||||
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, group)
|
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, program, group)
|
||||||
|
|
||||||
indices = [0, 1, 2, 0, 2, 3, 0, 4, 3, 4, 7, 3, 0, 1, 5, 0, 5, 4, 1, 2, 5, 5, 2, 6, 6, 2, 3, 6, 3, 7]
|
indices = [0, 1, 2, 0, 2, 3, 0, 4, 3, 4, 7, 3, 0, 1, 5, 0, 5, 4, 1, 2, 5, 5, 2, 6, 6, 2, 3, 6, 3, 7]
|
||||||
self._vertex_list = self._batch.add_indexed(8, GL_TRIANGLES, self._group, indices, 'position2f', 'colors4Bn')
|
self._vertex_list = program.vertex_list_indexed(
|
||||||
|
8, GL_TRIANGLES, indices, self._batch, self._group, colors='Bn')
|
||||||
self._update_position()
|
self._update_position()
|
||||||
self._update_color()
|
self._update_color()
|
||||||
|
|
||||||
def _update_position(self):
|
def _update_position(self):
|
||||||
if not self._visible:
|
if not self._visible:
|
||||||
self._vertex_list.position = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
self._vertex_list.position[:] = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
||||||
elif self._rotation:
|
else:
|
||||||
b = self._border
|
b = self._border
|
||||||
x = self._x
|
x = self._x
|
||||||
y = self._y
|
y = self._y
|
||||||
|
|
||||||
bx1 = -self._anchor_x
|
bx1 = x - self._anchor_x
|
||||||
by1 = -self._anchor_y
|
by1 = y - self._anchor_y
|
||||||
bx2 = bx1 + self._width
|
bx2 = bx1 + self._width
|
||||||
by2 = by1 + self._height
|
by2 = by1 + self._height
|
||||||
ix1 = bx1 + b
|
ix1 = bx1 + b
|
||||||
@ -1082,42 +1098,14 @@ class BorderedRectangle(_ShapeBase):
|
|||||||
ix2 = bx2 - b
|
ix2 = bx2 - b
|
||||||
iy2 = by2 - b
|
iy2 = by2 - b
|
||||||
|
|
||||||
r = -math.radians(self._rotation)
|
vertices = [(ix1, iy1), (ix2, iy1), (ix2, iy2), (ix1, iy2),
|
||||||
cr = math.cos(r)
|
(bx1, by1), (bx2, by1), (bx2, by2), (bx1, by2)]
|
||||||
sr = math.sin(r)
|
|
||||||
|
|
||||||
bax = bx1 * cr - by1 * sr + x
|
if self._rotation:
|
||||||
bay = bx1 * sr + by1 * cr + y
|
vertices = _rotate(vertices, self._rotation, x, y)
|
||||||
bbx = bx2 * cr - by1 * sr + x
|
|
||||||
bby = bx2 * sr + by1 * cr + y
|
|
||||||
bcx = bx2 * cr - by2 * sr + x
|
|
||||||
bcy = bx2 * sr + by2 * cr + y
|
|
||||||
bdx = bx1 * cr - by2 * sr + x
|
|
||||||
bdy = bx1 * sr + by2 * cr + y
|
|
||||||
|
|
||||||
iax = ix1 * cr - iy1 * sr + x
|
# Flattening the list.
|
||||||
iay = ix1 * sr + iy1 * cr + y
|
self._vertex_list.position[:] = tuple(value for vertex in vertices for value in vertex)
|
||||||
ibx = ix2 * cr - iy1 * sr + x
|
|
||||||
iby = ix2 * sr + iy1 * cr + y
|
|
||||||
icx = ix2 * cr - iy2 * sr + x
|
|
||||||
icy = ix2 * sr + iy2 * cr + y
|
|
||||||
idx = ix1 * cr - iy2 * sr + x
|
|
||||||
idy = ix1 * sr + iy2 * cr + y
|
|
||||||
|
|
||||||
self._vertex_list.position[:] = (iax, iay, ibx, iby, icx, icy, idx, idy,
|
|
||||||
bax, bay, bbx, bby, bcx, bcy, bdx, bdy,)
|
|
||||||
else:
|
|
||||||
b = self._border
|
|
||||||
bx1 = self._x - self._anchor_x
|
|
||||||
by1 = self._y - self._anchor_y
|
|
||||||
bx2 = bx1 + self._width
|
|
||||||
by2 = by1 + self._height
|
|
||||||
ix1 = bx1 + b
|
|
||||||
iy1 = by1 + b
|
|
||||||
ix2 = bx2 - b
|
|
||||||
iy2 = by2 - b
|
|
||||||
self._vertex_list.position[:] = (ix1, iy1, ix2, iy1, ix2, iy2, ix1, iy2,
|
|
||||||
bx1, by1, bx2, by1, bx2, by2, bx1, by2,)
|
|
||||||
|
|
||||||
def _update_color(self):
|
def _update_color(self):
|
||||||
opacity = int(self._opacity)
|
opacity = int(self._opacity)
|
||||||
@ -1218,12 +1206,13 @@ class Triangle(_ShapeBase):
|
|||||||
self._x3 = x3
|
self._x3 = x3
|
||||||
self._y3 = y3
|
self._y3 = y3
|
||||||
self._rotation = 0
|
self._rotation = 0
|
||||||
|
|
||||||
self._rgb = color
|
self._rgb = color
|
||||||
|
|
||||||
|
program = get_default_shader()
|
||||||
self._batch = batch or Batch()
|
self._batch = batch or Batch()
|
||||||
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, group)
|
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, program, group)
|
||||||
self._vertex_list = self._batch.add(3, GL_TRIANGLES, self._group, 'position2f', 'colors4Bn')
|
|
||||||
|
self._vertex_list = program.vertex_list(3, GL_TRIANGLES, self._batch, self._group, colors='Bn')
|
||||||
self._update_position()
|
self._update_position()
|
||||||
self._update_color()
|
self._update_color()
|
||||||
|
|
||||||
@ -1360,10 +1349,11 @@ class Star(_ShapeBase):
|
|||||||
self._rgb = color
|
self._rgb = color
|
||||||
self._rotation = rotation
|
self._rotation = rotation
|
||||||
|
|
||||||
|
program = get_default_shader()
|
||||||
self._batch = batch or Batch()
|
self._batch = batch or Batch()
|
||||||
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, group)
|
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, program, group)
|
||||||
|
|
||||||
self._vertex_list = self._batch.add(self._num_spikes*6, GL_TRIANGLES, self._group, 'position2f', 'colors4Bn')
|
self._vertex_list = program.vertex_list(self._num_spikes*6, GL_TRIANGLES, self._batch, self._group, colors='Bn')
|
||||||
self._update_position()
|
self._update_position()
|
||||||
self._update_color()
|
self._update_color()
|
||||||
|
|
||||||
@ -1468,47 +1458,30 @@ class Polygon(_ShapeBase):
|
|||||||
|
|
||||||
self._rgb = color
|
self._rgb = color
|
||||||
|
|
||||||
|
program = get_default_shader()
|
||||||
self._batch = batch or Batch()
|
self._batch = batch or Batch()
|
||||||
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, group)
|
self._group = _ShapeGroup(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, program, group)
|
||||||
|
|
||||||
length = (len(self._coordinates) - 2) * 3
|
length = (len(self._coordinates) - 2) * 3
|
||||||
self._vertex_list = self._batch.add(length, GL_TRIANGLES, self._group, 'position2f', 'colors4Bn')
|
self._vertex_list = program.vertex_list(length, GL_TRIANGLES, self._batch, self._group, colors='Bn')
|
||||||
|
|
||||||
self._update_position()
|
self._update_position()
|
||||||
self._update_color()
|
self._update_color()
|
||||||
|
|
||||||
def _update_position(self):
|
def _update_position(self):
|
||||||
if not self._visible:
|
if not self._visible:
|
||||||
self._vertex_list.vertices = tuple([0] * ((len(self._coordinates) - 2) * 6))
|
self._vertex_list.position[:] = tuple([0] * ((len(self._coordinates) - 2) * 6))
|
||||||
elif self._rotation:
|
|
||||||
# Adjust all coordinates by the anchor.
|
|
||||||
anchor_x = self._anchor_x
|
|
||||||
anchor_y = self._anchor_y
|
|
||||||
coords = [[x - anchor_x, y - anchor_y] for x, y in self._coordinates]
|
|
||||||
|
|
||||||
# Rotate the polygon around its first vertex.
|
|
||||||
x, y = self._coordinates[0]
|
|
||||||
r = -math.radians(self._rotation)
|
|
||||||
cr = math.cos(r)
|
|
||||||
sr = math.sin(r)
|
|
||||||
|
|
||||||
for i, c in enumerate(coords):
|
|
||||||
c = [c[0] - x, c[1] - y]
|
|
||||||
c = [c[0] * cr - c[1] * sr + x, c[0] * sr + c[1] * cr + y]
|
|
||||||
coords[i] = c
|
|
||||||
|
|
||||||
# Triangulate the convex polygon.
|
|
||||||
triangles = []
|
|
||||||
for n in range(len(coords) - 2):
|
|
||||||
triangles += [coords[0], coords[n + 1], coords[n + 2]]
|
|
||||||
|
|
||||||
# Flattening the list before setting vertices to it.
|
|
||||||
self._vertex_list.position[:] = tuple(value for coordinate in triangles for value in coordinate)
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# Adjust all coordinates by the anchor.
|
# Adjust all coordinates by the anchor.
|
||||||
anchor_x = self._anchor_x
|
anchor_x = self._anchor_x
|
||||||
anchor_y = self._anchor_y
|
anchor_y = self._anchor_y
|
||||||
coords = [[x - anchor_x, y - anchor_y] for x, y in self._coordinates]
|
coords = [[x - anchor_x, y - anchor_y] for x, y in self._coordinates]
|
||||||
|
|
||||||
|
if self._rotation:
|
||||||
|
# Rotate the polygon around its first vertex.
|
||||||
|
x, y = self._coordinates[0]
|
||||||
|
coords = _rotate(coords, self._rotation, x, y)
|
||||||
|
|
||||||
# Triangulate the convex polygon.
|
# Triangulate the convex polygon.
|
||||||
triangles = []
|
triangles = []
|
||||||
for n in range(len(coords) - 2):
|
for n in range(len(coords) - 2):
|
||||||
|
@ -293,7 +293,6 @@ class Sprite(event.EventDispatcher):
|
|||||||
blend_dest=GL_ONE_MINUS_SRC_ALPHA,
|
blend_dest=GL_ONE_MINUS_SRC_ALPHA,
|
||||||
batch=None,
|
batch=None,
|
||||||
group=None,
|
group=None,
|
||||||
usage='dynamic',
|
|
||||||
subpixel=False):
|
subpixel=False):
|
||||||
"""Create a sprite.
|
"""Create a sprite.
|
||||||
|
|
||||||
@ -314,10 +313,6 @@ class Sprite(event.EventDispatcher):
|
|||||||
Optional batch to add the sprite to.
|
Optional batch to add the sprite to.
|
||||||
`group` : `~pyglet.graphics.Group`
|
`group` : `~pyglet.graphics.Group`
|
||||||
Optional parent group of the sprite.
|
Optional parent group of the sprite.
|
||||||
`usage` : str
|
|
||||||
Vertex buffer object usage hint, one of ``"none"``,
|
|
||||||
``"stream"``, ``"dynamic"`` (default) or ``"static"``. Applies
|
|
||||||
only to vertex data.
|
|
||||||
`subpixel` : bool
|
`subpixel` : bool
|
||||||
Allow floating-point coordinates for the sprite. By default,
|
Allow floating-point coordinates for the sprite. By default,
|
||||||
coordinates are restricted to integer values.
|
coordinates are restricted to integer values.
|
||||||
@ -335,13 +330,12 @@ class Sprite(event.EventDispatcher):
|
|||||||
self._texture = img.get_texture()
|
self._texture = img.get_texture()
|
||||||
|
|
||||||
if isinstance(img, image.TextureArrayRegion):
|
if isinstance(img, image.TextureArrayRegion):
|
||||||
program = get_default_array_shader()
|
self.program = get_default_array_shader()
|
||||||
else:
|
else:
|
||||||
program = get_default_shader()
|
self.program = get_default_shader()
|
||||||
|
|
||||||
self._batch = batch or graphics.get_default_batch()
|
self._batch = batch or graphics.get_default_batch()
|
||||||
self._group = SpriteGroup(self._texture, blend_src, blend_dest, program, 0, group)
|
self._group = SpriteGroup(self._texture, blend_src, blend_dest, self.program, 0, group)
|
||||||
self._usage = usage
|
|
||||||
self._subpixel = subpixel
|
self._subpixel = subpixel
|
||||||
self._create_vertex_list()
|
self._create_vertex_list()
|
||||||
|
|
||||||
@ -479,15 +473,13 @@ class Sprite(event.EventDispatcher):
|
|||||||
self._texture = texture
|
self._texture = texture
|
||||||
|
|
||||||
def _create_vertex_list(self):
|
def _create_vertex_list(self):
|
||||||
usage = self._usage
|
self._vertex_list = self.program.vertex_list_indexed(
|
||||||
self._vertex_list = self._batch.add_indexed(
|
4, GL_TRIANGLES, [0, 1, 2, 0, 2, 3], self._batch, self._group,
|
||||||
4, GL_TRIANGLES, self._group, [0, 1, 2, 0, 2, 3],
|
colors=('Bn', (*self._rgb, int(self._opacity)) * 4),
|
||||||
'position2f/%s' % usage,
|
translate=('f', (self._x, self._y) * 4),
|
||||||
('colors4Bn/%s' % usage, (*self._rgb, int(self._opacity)) * 4),
|
scale=('f', (self._scale*self._scale_x, self._scale*self._scale_y) * 4),
|
||||||
('translate2f/%s' % usage, (self._x, self._y) * 4),
|
rotation=('f', (self._rotation,) * 4),
|
||||||
('scale2f/%s' % usage, (self._scale*self._scale_x, self._scale*self._scale_y) * 4),
|
tex_coords=('f', self._texture.tex_coords))
|
||||||
('rotation1f/%s' % usage, (self._rotation,) * 4),
|
|
||||||
('tex_coords3f/%s' % usage, self._texture.tex_coords))
|
|
||||||
self._update_position()
|
self._update_position()
|
||||||
|
|
||||||
def _update_position(self):
|
def _update_position(self):
|
||||||
|
@ -120,9 +120,10 @@ class Caret:
|
|||||||
from pyglet import gl
|
from pyglet import gl
|
||||||
self._layout = layout
|
self._layout = layout
|
||||||
batch = batch or layout.batch
|
batch = batch or layout.batch
|
||||||
|
group = layout.foreground_decoration_group
|
||||||
colors = (*color, 255, *color, 255)
|
colors = (*color, 255, *color, 255)
|
||||||
self._list = batch.add(2, gl.GL_LINES, layout.foreground_decoration_group, 'position2f', ('colors4Bn', colors))
|
|
||||||
|
|
||||||
|
self._list = group.program.vertex_list(2, gl.GL_LINES, batch, group, colors=('Bn', colors))
|
||||||
self._ideal_x = None
|
self._ideal_x = None
|
||||||
self._ideal_line = None
|
self._ideal_line = None
|
||||||
self._next_attributes = {}
|
self._next_attributes = {}
|
||||||
|
@ -44,10 +44,10 @@ from pyglet.gl import *
|
|||||||
|
|
||||||
|
|
||||||
class _InlineElementGroup(pyglet.graphics.Group):
|
class _InlineElementGroup(pyglet.graphics.Group):
|
||||||
def __init__(self, texture, order=0, parent=None):
|
def __init__(self, texture, program, order=0, parent=None):
|
||||||
super().__init__(order, parent)
|
super().__init__(order, parent)
|
||||||
self.program = pyglet.graphics.get_default_shader()
|
|
||||||
self.texture = texture
|
self.texture = texture
|
||||||
|
self.program = program
|
||||||
|
|
||||||
def set_state(self):
|
def set_state(self):
|
||||||
self.program.use()
|
self.program.use()
|
||||||
@ -89,15 +89,16 @@ class ImageElement(pyglet.text.document.InlineElement):
|
|||||||
super().__init__(ascent, descent, self.width)
|
super().__init__(ascent, descent, self.width)
|
||||||
|
|
||||||
def place(self, layout, x, y):
|
def place(self, layout, x, y):
|
||||||
group = _InlineElementGroup(self.image.get_texture(), 0, layout.group)
|
program = pyglet.text.layout.get_default_layout_shader()
|
||||||
|
group = _InlineElementGroup(self.image.get_texture(), program, 0, layout.group)
|
||||||
x1 = x
|
x1 = x
|
||||||
y1 = y + self.descent
|
y1 = y + self.descent
|
||||||
x2 = x + self.width
|
x2 = x + self.width
|
||||||
y2 = y + self.height + self.descent
|
y2 = y + self.height + self.descent
|
||||||
vertex_list = layout.batch.add_indexed(4, pyglet.gl.GL_TRIANGLES, group,
|
vertex_list = program.vertex_list_indexed(4, pyglet.gl.GL_TRIANGLES, [0, 1, 2, 0, 2, 3],
|
||||||
[0, 1, 2, 0, 2, 3],
|
layout.batch, group,
|
||||||
('position3f', (x1, y1, 0, x2, y1, 0, x2, y2, 0, x1, y2, 0)),
|
position=('f', (x1, y1, x2, y1, x2, y2, x1, y2)),
|
||||||
('tex_coords3f', self.image.tex_coords))
|
tex_coords=('f', self.image.tex_coords))
|
||||||
self.vertex_lists[layout] = vertex_list
|
self.vertex_lists[layout] = vertex_list
|
||||||
|
|
||||||
def remove(self, layout):
|
def remove(self, layout):
|
||||||
|
@ -324,11 +324,12 @@ class _GlyphBox(_AbstractBox):
|
|||||||
|
|
||||||
def place(self, layout, i, x, y, context):
|
def place(self, layout, i, x, y, context):
|
||||||
assert self.glyphs
|
assert self.glyphs
|
||||||
|
program = get_default_layout_shader()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
group = layout.group_cache[self.owner]
|
group = layout.group_cache[self.owner]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
group = layout.group_class(self.owner, get_default_layout_shader(), order=1, parent=layout.group)
|
group = layout.group_class(self.owner, program, order=1, parent=layout.group)
|
||||||
layout.group_cache[self.owner] = group
|
layout.group_cache[self.owner] = group
|
||||||
|
|
||||||
n_glyphs = self.length
|
n_glyphs = self.length
|
||||||
@ -363,12 +364,10 @@ class _GlyphBox(_AbstractBox):
|
|||||||
for i in range(n_glyphs):
|
for i in range(n_glyphs):
|
||||||
indices.extend([element + (i * 4) for element in [0, 1, 2, 0, 2, 3]])
|
indices.extend([element + (i * 4) for element in [0, 1, 2, 0, 2, 3]])
|
||||||
|
|
||||||
vertex_list = layout.batch.add_indexed(n_glyphs * 4, GL_TRIANGLES, group,
|
vertex_list = program.vertex_list_indexed(n_glyphs * 4, GL_TRIANGLES, indices, layout.batch, group,
|
||||||
indices,
|
position=('f', vertices),
|
||||||
('position2f/dynamic', vertices),
|
colors=('Bn', colors),
|
||||||
('colors4Bn/dynamic', colors),
|
tex_coords=('f', tex_coords))
|
||||||
('tex_coords3f/dynamic', tex_coords),
|
|
||||||
'translation2f/dynamic')
|
|
||||||
|
|
||||||
context.add_list(vertex_list)
|
context.add_list(vertex_list)
|
||||||
|
|
||||||
@ -402,20 +401,18 @@ class _GlyphBox(_AbstractBox):
|
|||||||
x1 = x2
|
x1 = x2
|
||||||
|
|
||||||
if background_vertices:
|
if background_vertices:
|
||||||
background_list = layout.batch.add_indexed(len(background_vertices) // 2,
|
background_list = program.vertex_list_indexed(len(background_vertices) // 2,
|
||||||
GL_TRIANGLES, layout.background_decoration_group,
|
GL_TRIANGLES, [0, 1, 2, 0, 2, 3],
|
||||||
[0, 1, 2, 0, 2, 3],
|
layout.batch, layout.background_decoration_group,
|
||||||
('position2f/dynamic', background_vertices),
|
position=('f', background_vertices),
|
||||||
('colors4Bn/dynamic', background_colors),
|
colors=('Bn', background_colors))
|
||||||
'translation2f/dynamic')
|
|
||||||
context.add_list(background_list)
|
context.add_list(background_list)
|
||||||
|
|
||||||
if underline_vertices:
|
if underline_vertices:
|
||||||
underline_list = layout.batch.add(len(underline_vertices) // 2,
|
underline_list = program.vertex_list(len(underline_vertices) // 2, GL_LINES,
|
||||||
GL_LINES, layout.foreground_decoration_group,
|
layout.batch, layout.foreground_decoration_group,
|
||||||
('position2f/dynamic', underline_vertices),
|
position=('f',underline_vertices),
|
||||||
('colors4Bn/dynamic', underline_colors),
|
colors=('Bn', underline_colors))
|
||||||
'translation2f/dynamic')
|
|
||||||
context.add_list(underline_list)
|
context.add_list(underline_list)
|
||||||
|
|
||||||
def delete(self, layout):
|
def delete(self, layout):
|
||||||
@ -869,12 +866,8 @@ class TextLayout:
|
|||||||
self.content_height = 0
|
self.content_height = 0
|
||||||
|
|
||||||
self._user_group = group
|
self._user_group = group
|
||||||
|
|
||||||
decoration_shader = get_default_decoration_shader()
|
|
||||||
self.background_decoration_group = self.decoration_class(decoration_shader, order=0, parent=self._user_group)
|
|
||||||
self.foreground_decoration_group = self.decoration_class(decoration_shader, order=2, parent=self._user_group)
|
|
||||||
|
|
||||||
self.group_cache = {}
|
self.group_cache = {}
|
||||||
|
self._initialize_groups()
|
||||||
|
|
||||||
if batch is None:
|
if batch is None:
|
||||||
batch = graphics.Batch()
|
batch = graphics.Batch()
|
||||||
@ -894,10 +887,21 @@ class TextLayout:
|
|||||||
self._dpi = dpi or 96
|
self._dpi = dpi or 96
|
||||||
self.document = document
|
self.document = document
|
||||||
|
|
||||||
|
def _initialize_groups(self):
|
||||||
|
decoration_shader = get_default_decoration_shader()
|
||||||
|
self.background_decoration_group = self.decoration_class(decoration_shader, order=0, parent=self._user_group)
|
||||||
|
self.foreground_decoration_group = self.decoration_class(decoration_shader, order=2, parent=self._user_group)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def group(self):
|
def group(self):
|
||||||
return self._user_group
|
return self._user_group
|
||||||
|
|
||||||
|
@group.setter
|
||||||
|
def group(self, group):
|
||||||
|
self._user_group = group
|
||||||
|
self._initialize_groups()
|
||||||
|
self._update()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def dpi(self):
|
def dpi(self):
|
||||||
"""Get DPI used by this layout.
|
"""Get DPI used by this layout.
|
||||||
|
@ -127,10 +127,11 @@ import sys
|
|||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
import pyglet
|
import pyglet
|
||||||
|
|
||||||
from pyglet import gl
|
from pyglet import gl
|
||||||
from pyglet.math import Mat4
|
from pyglet.math import Mat4
|
||||||
from pyglet.event import EventDispatcher
|
from pyglet.event import EventDispatcher
|
||||||
from pyglet.window import key
|
from pyglet.window import key, event
|
||||||
from pyglet.util import with_metaclass
|
from pyglet.util import with_metaclass
|
||||||
from pyglet.graphics import shader
|
from pyglet.graphics import shader
|
||||||
|
|
||||||
@ -411,6 +412,7 @@ class BaseWindow(with_metaclass(_WindowMetaclass, EventDispatcher)):
|
|||||||
_context = None
|
_context = None
|
||||||
_projection_matrix = pyglet.math.Mat4()
|
_projection_matrix = pyglet.math.Mat4()
|
||||||
_view_matrix = pyglet.math.Mat4()
|
_view_matrix = pyglet.math.Mat4()
|
||||||
|
_viewport = 0, 0, 0, 0
|
||||||
|
|
||||||
# Used to restore window size and position after fullscreen
|
# Used to restore window size and position after fullscreen
|
||||||
_windowed_size = None
|
_windowed_size = None
|
||||||
@ -1669,7 +1671,7 @@ class BaseWindow(with_metaclass(_WindowMetaclass, EventDispatcher)):
|
|||||||
"""The window was shown.
|
"""The window was shown.
|
||||||
|
|
||||||
This event is triggered when a window is restored after being
|
This event is triggered when a window is restored after being
|
||||||
minimised, or after being displayed for the first time.
|
minimised, hidden, or after being displayed for the first time.
|
||||||
|
|
||||||
:event:
|
:event:
|
||||||
"""
|
"""
|
||||||
@ -1677,8 +1679,8 @@ class BaseWindow(with_metaclass(_WindowMetaclass, EventDispatcher)):
|
|||||||
def on_hide(self):
|
def on_hide(self):
|
||||||
"""The window was hidden.
|
"""The window was hidden.
|
||||||
|
|
||||||
This event is triggered when a window is minimised or (on Mac OS X)
|
This event is triggered when a window is minimised
|
||||||
hidden by the user.
|
or hidden by the user.
|
||||||
|
|
||||||
:event:
|
:event:
|
||||||
"""
|
"""
|
||||||
|
@ -38,6 +38,7 @@ from ctypes import *
|
|||||||
import pyglet
|
import pyglet
|
||||||
from pyglet.window import BaseWindow
|
from pyglet.window import BaseWindow
|
||||||
from pyglet.window import MouseCursor, DefaultMouseCursor
|
from pyglet.window import MouseCursor, DefaultMouseCursor
|
||||||
|
from pyglet.window import WindowException
|
||||||
from pyglet.event import EventDispatcher
|
from pyglet.event import EventDispatcher
|
||||||
|
|
||||||
from pyglet.canvas.cocoa import CocoaCanvas
|
from pyglet.canvas.cocoa import CocoaCanvas
|
||||||
@ -403,14 +404,15 @@ class CocoaWindow(BaseWindow):
|
|||||||
# Move frame origin down so that top-left corner of window doesn't move.
|
# Move frame origin down so that top-left corner of window doesn't move.
|
||||||
window_frame = self._nswindow.frame()
|
window_frame = self._nswindow.frame()
|
||||||
rect = self._nswindow.contentRectForFrameRect_(window_frame)
|
rect = self._nswindow.contentRectForFrameRect_(window_frame)
|
||||||
rect.origin.y += rect.size.height - self._height
|
rect.origin.y += rect.size.height - height
|
||||||
rect.size.width = self._width
|
rect.size.width = width
|
||||||
rect.size.height = self._height
|
rect.size.height = height
|
||||||
new_frame = self._nswindow.frameRectForContentRect_(rect)
|
new_frame = self._nswindow.frameRectForContentRect_(rect)
|
||||||
# The window background flashes when the frame size changes unless it's
|
# The window background flashes when the frame size changes unless it's
|
||||||
# animated, but we can set the window's animationResizeTime to zero.
|
# animated, but we can set the window's animationResizeTime to zero.
|
||||||
is_visible = self._nswindow.isVisible()
|
is_visible = self._nswindow.isVisible()
|
||||||
self._nswindow.setFrame_display_animate_(new_frame, True, is_visible)
|
self._nswindow.setFrame_display_animate_(new_frame, True, is_visible)
|
||||||
|
self.dispatch_event('on_resize', width, height)
|
||||||
|
|
||||||
def set_minimum_size(self, width: int, height: int) -> None:
|
def set_minimum_size(self, width: int, height: int) -> None:
|
||||||
super().set_minimum_size(width, height)
|
super().set_minimum_size(width, height)
|
||||||
@ -437,8 +439,6 @@ class CocoaWindow(BaseWindow):
|
|||||||
|
|
||||||
if self._nswindow is not None:
|
if self._nswindow is not None:
|
||||||
if visible:
|
if visible:
|
||||||
# Not really sure why on_resize needs to be here,
|
|
||||||
# but it's what pyglet wants.
|
|
||||||
self.dispatch_event('on_resize', self._width, self._height)
|
self.dispatch_event('on_resize', self._width, self._height)
|
||||||
self.dispatch_event('on_show')
|
self.dispatch_event('on_show')
|
||||||
self.dispatch_event('on_expose')
|
self.dispatch_event('on_expose')
|
||||||
|
@ -406,13 +406,11 @@ class Win32Window(BaseWindow):
|
|||||||
return point.x, point.y
|
return point.x, point.y
|
||||||
|
|
||||||
def set_size(self, width, height):
|
def set_size(self, width, height):
|
||||||
if self._fullscreen:
|
super().set_size(width, height)
|
||||||
raise WindowException('Cannot set size of fullscreen window.')
|
|
||||||
width, height = self._client_to_window_size(width, height)
|
width, height = self._client_to_window_size(width, height)
|
||||||
_user32.SetWindowPos(self._hwnd, 0, 0, 0, width, height,
|
_user32.SetWindowPos(self._hwnd, 0, 0, 0, width, height,
|
||||||
(SWP_NOZORDER |
|
(SWP_NOZORDER | SWP_NOMOVE | SWP_NOOWNERZORDER))
|
||||||
SWP_NOMOVE |
|
self.dispatch_event('on_resize', width, height)
|
||||||
SWP_NOOWNERZORDER))
|
|
||||||
|
|
||||||
def get_size(self):
|
def get_size(self):
|
||||||
# rect = RECT()
|
# rect = RECT()
|
||||||
|
Loading…
Reference in New Issue
Block a user