Add the new inputDeviceNode to the data graph

create node and add to data graph for any connected device
add function to add and remove devices and call them on dis-/connection
add poll call for all devices in the __dataLoop task
This commit is contained in:
fireclawthefox 2016-07-21 23:12:07 +02:00
parent ef7cc925c4
commit 2e8338c681

View File

@ -177,6 +177,7 @@ class ShowBase(DirectObject.DirectObject):
self.trackball = None
self.texmem = None
self.showVertices = None
self.deviceButtonThrowers = []
## This is a NodePath pointing to the Camera object set up for the 3D scene.
## This is usually a child of self.camera.
@ -301,6 +302,7 @@ class ShowBase(DirectObject.DirectObject):
## The global job manager, as imported from JobManagerGlobal.
self.jobMgr = jobMgr
## Particle manager
self.particleMgr = None
self.particleMgrEnabled = 0
@ -313,6 +315,12 @@ class ShowBase(DirectObject.DirectObject):
## This is the global input device manager, which keeps track of
## connected input devices.
self.devices = InputDeviceManager.getGlobalPtr()
# add existing devices to the data graph
for device in self.devices.devices:
self.connectDevice(device)
# Checks for device connection and disconnection
self.accept('connect-device', self.connectDevice)
self.accept('disconnect-device', self.disconnectDevice)
self.createStats()
@ -1664,6 +1672,74 @@ class ShowBase(DirectObject.DirectObject):
return self.mouseWatcherNode.getModifierButtons().isDown(
KeyboardButton.meta())
def connectDevice(self, device):
"""
This function will get called each time a new device got
connected and will add that new device to the data graph.
Each device class will get a specific prefix for thrown events. Those
are currently as follow
gamepad
flight_stick
steering_wheel
dance_pad
mouse
keyboard
unclassified_device
In addition, the index of that device will appended to the prefix,
so for example if you hit the A button of the first connected gamepad
you will get an event like "gamepad0-action_a" the second gamepad will
then be catchable via "gamepad1-button_event" and so on.
Note, each device class will have a separate 0 based index, this way
you can have a gamepad0 as well as a steering_wheel0 and flight_stick0.
All newly created button throwers will be stored in
the deviceButtonThrowers lsit
"""
idn = self.dataRoot.attachNewNode(InputDeviceNode(device, device.getName()))
prefix = "unclassified_device"
if device.getDeviceClass() == InputDevice.DC_gamepad:
prefix = "gamepad"
elif device.getDeviceClass() == InputDevice.DC_flight_stick:
prefix = "flight_stick"
elif device.getDeviceClass() == InputDevice.DC_steering_wheel:
prefix = "steering_wheel"
elif device.getDeviceClass() == InputDevice.DC_dance_pad:
prefix = "dance_pad"
elif device.getDeviceClass() == InputDevice.DC_mouse:
prefix = "mouse"
elif device.getDeviceClass() == InputDevice.DC_keyboard:
prefix = "keyboard"
id = 0
for dev in self.devices.devices:
if dev == device:
break
elif dev.getDeviceClass() == device.getDeviceClass():
id += 1
print ""
print "MAPPED", device, "AS", prefix, "SET CLASS", device.getDeviceClass()
print ""
bt = idn.attachNewNode(ButtonThrower(prefix))
bt.node().setPrefix("{}{}-".format(prefix, id))
self.deviceButtonThrowers.append(bt)
def disconnectDevice(self, device):
"""
This function will get called each time a new device got
connected. It is then used to clean up the given device from the
data graph.
"""
print device.getName()
idn = self.dataRoot.find("**/{}".format(device.getName))
for bt in self.deviceButtonThrowers.list():
if bt.getName() == idn.getName():
self.deviceButtonThrowers.remove(bt)
break
self.dataRoot.removeNode(idn)
def addAngularIntegrator(self):
if not self.physicsMgrAngular:
physics = importlib.import_module('panda3d.physics')
@ -1856,6 +1932,10 @@ class ShowBase(DirectObject.DirectObject):
# Check if there were newly connected devices.
self.devices.update()
# Poll all connected devices.
for device in self.devices.devices:
device.poll()
# traverse the data graph. This reads all the control
# inputs (from the mouse and keyboard, for instance) and also
# directly acts upon them (for instance, to move the avatar).