mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
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:
parent
ef7cc925c4
commit
2e8338c681
@ -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).
|
||||
|
Loading…
x
Reference in New Issue
Block a user