diff --git a/direct/src/showbase/ControlManager.py b/direct/src/showbase/ControlManager.py new file mode 100755 index 0000000000..b1d5e8cc59 --- /dev/null +++ b/direct/src/showbase/ControlManager.py @@ -0,0 +1,168 @@ + +from ShowBaseGlobal import * +#from DirectGui import * +#from PythonUtil import * +#from IntervalGlobal import * + +import Avatar +import DirectNotifyGlobal +import NonPhysicsWalker +import PhysicsWalker +import Task + + +class ControlManager: + notify = DirectNotifyGlobal.directNotify.newCategory("ControlManager") + wantAvatarPhysics = base.config.GetBool('want-avatar-physics', 0) + wantAvatarPhysicsIndicator = base.config.GetBool('want-avatar-physics-indicator', 0) + wantAvatarPhysicsDebug = base.config.GetBool('want-avatar-physics-debug', 0) + + def __init__(self, avatar): + self.avatar = avatar + assert(self.debugPrint("ControlManager()")) + self.swimControls=NonPhysicsWalker.NonPhysicsWalker() + if self.wantAvatarPhysics: + self.walkControls=PhysicsWalker.PhysicsWalker( + gravity = -32.1740 * 2.0) # * 2.0 is a hack; + else: + self.walkControls=NonPhysicsWalker.NonPhysicsWalker() + self.currentControls = self.walkControls + self.isEnabled = 1 + #self.monitorTask = taskMgr.add(self.monitor, "ControlManager-%s"%(id(self)), priority=-1) + inputState.watch("forward", "arrow_up", "arrow_up-up") + inputState.watch("forward", "control-arrow_up", "control-arrow_up-up") + inputState.watch("forward", "alt-arrow_up", "alt-arrow_up-up") + inputState.watch("forward", "shift-arrow_up", "shift-arrow_up-up") + + inputState.watch("reverse", "arrow_down", "arrow_down-up") + inputState.watch("reverse", "control-arrow_down", "control-arrow_down-up") + inputState.watch("reverse", "alt-arrow_down", "alt-arrow_down-up") + inputState.watch("reverse", "shift-arrow_down", "shift-arrow_down-up") + + inputState.watch("turnLeft", "arrow_left", "arrow_left-up") + inputState.watch("turnLeft", "control-arrow_left", "control-arrow_left-up") + inputState.watch("turnLeft", "alt-arrow_left", "alt-arrow_left-up") + inputState.watch("turnLeft", "shift-arrow_left", "shift-arrow_left-up") + + inputState.watch("turnRight", "arrow_right", "arrow_right-up") + inputState.watch("turnRight", "control-arrow_right", "control-arrow_right-up") + inputState.watch("turnRight", "alt-arrow_right", "alt-arrow_right-up") + inputState.watch("turnRight", "shift-arrow_right", "shift-arrow_right-up") + + inputState.watch("jump", "control", "control-up") + inputState.watch("jump", "alt-control", "alt-control-up") + inputState.watch("jump", "shift-control", "shift-control-up") + + inputState.watch("slide", "slide-is-disabled", "slide-is-disabled") + inputState.watch("pie", "begin-pie", "end-pie") + + #inputState.watch("slideLeft", "shift-arrow_left", "shift-arrow_left-up") + #inputState.watch("slideLeft", "control-arrow_up", "control-arrow_up-up") + #inputState.watch("slideLeft", "alt-arrow_up", "alt-arrow_up-up") + #inputState.watch("slideLeft", "shift-arrow_up", "shift-arrow_up-up") + + #inputState.watch("slideRight", "shift-arrow_right", "shift-arrow_right-up") + #inputState.watch("slideRight", "control-arrow_up", "control-arrow_up-up") + #inputState.watch("slideRight", "alt-arrow_up", "alt-arrow_up-up") + #inputState.watch("slideRight", "shift-arrow_up", "shift-arrow_up-up") + + def useSwimControls(self): + assert(self.debugPrint("useSwimControls()")) + self.currentControls.disableAvatarControls() + self.currentControls = self.swimControls + if self.isEnabled: + self.currentControls.enableAvatarControls() + + def useWalkControls(self): + assert(self.debugPrint("useWalkControls()")) + self.currentControls.disableAvatarControls() + self.currentControls = self.walkControls + if self.isEnabled: + self.currentControls.enableAvatarControls() + + def delete(self): + self.disable() + #self.monitorTask.remove() + + def setSpeeds(self, toonForwardSpeed, toonJumpForce, + toonReverseSpeed, toonRotateSpeed): + assert(self.debugPrint( + "setSpeeds(toonForwardSpeed=%s, toonJumpForce=%s, toonReverseSpeed=%s, toonRotateSpeed=%s)"%( + toonForwardSpeed, toonJumpForce, + toonReverseSpeed, toonRotateSpeed))) + self.swimControls.setWalkSpeed( + toonForwardSpeed, + toonJumpForce, + toonReverseSpeed, + toonRotateSpeed) + self.walkControls.setWalkSpeed( + toonForwardSpeed, + toonJumpForce, + toonReverseSpeed, + toonRotateSpeed) + + def getSpeeds(self): + return self.currentControls.getSpeeds() + + def initializeCollisions(self, cTrav, + wallBitmask, floorBitmask, avatarRadius, floorOffset): + assert(self.debugPrint("initializeCollisions()")) + + self.walkControls.initializeCollisions(cTrav, self.avatar, + wallBitmask, floorBitmask, avatarRadius, floorOffset) + self.walkControls.setAirborneHeightFunc(self.avatar.getAirborneHeight) + self.walkControls.disableAvatarControls() + + self.swimControls.initializeCollisions(cTrav, self.avatar, + wallBitmask, floorBitmask, avatarRadius, floorOffset) + self.swimControls.setAirborneHeightFunc(self.avatar.getAirborneHeight) + self.swimControls.disableAvatarControls() + + self.walkControls.enableAvatarControls() + + if self.wantAvatarPhysicsIndicator: + indicator=loader.loadModelCopy('phase_5/models/props/dagger') + self.walkControls.setAvatarPhysicsIndicator(indicator) + + def deleteCollisions(self): + assert(self.debugPrint("deleteCollisions()")) + self.walkControls.deleteCollisions() + self.swimControls.deleteCollisions() + + def collisionsOn(self): + assert(self.debugPrint("collisionsOn()")) + self.currentControls.setCollisionsActive(1) + #self.swimControls.collisionsOn() + + def collisionsOff(self): + assert(self.debugPrint("collisionsOff()")) + self.currentControls.setCollisionsActive(0) + #self.swimControls.collisionsOff() + + def enable(self): + assert(self.debugPrint("enable()")) + self.isEnabled = 1 + self.currentControls.enableAvatarControls() + + def disable(self): + assert(self.debugPrint("disable()")) + self.isEnabled = 0 + self.currentControls.disableAvatarControls() + + def monitor(self, foo): + #assert(self.debugPrint("monitor()")) + if 1: + airborneHeight=self.avatar.getAirborneHeight() + onScreenDebug.add("airborneHeight", "% 10.4f"%(airborneHeight,)) + if 0: + onScreenDebug.add("InputState forward", "%d"%(inputState.isSet("forward"))) + onScreenDebug.add("InputState reverse", "%d"%(inputState.isSet("reverse"))) + onScreenDebug.add("InputState turnLeft", "%d"%(inputState.isSet("turnLeft"))) + onScreenDebug.add("InputState turnRight", "%d"%(inputState.isSet("turnRight"))) + return Task.cont + + if __debug__: + def debugPrint(self, message): + """for debugging""" + return self.notify.debug( + str(id(self))+' '+message)