diff --git a/direct/src/showbase/ControlManager.py b/direct/src/showbase/ControlManager.py index 7f6fd26d9f..570d93a0cb 100755 --- a/direct/src/showbase/ControlManager.py +++ b/direct/src/showbase/ControlManager.py @@ -68,7 +68,11 @@ class ControlManager: inputState.watch("jump", "alt-control", "alt-control-up") inputState.watch("jump", "shift-control", "shift-control-up") - inputState.watch("shift", "shift", "shift-up") + inputState.watch("slideLeft", "home", "home-up") + inputState.watch("slideRight", "end", "end-up") + inputState.watch("levitateUp", "page_up", "page_up-up") + inputState.watch("levitateDown", "page_down", "page_down-up") + inputState.watch("run", "shift", "shift-up") # FYI, ghost mode uses jump for slide. inputState.watch("slide", "slide-is-disabled", "slide-is-disabled") @@ -77,13 +81,13 @@ class ControlManager: #inputState.watch("slideLeft", "control-arrow_left", "control-arrow_left-up") #inputState.watch("slideLeft", "alt-arrow_left", "alt-arrow_left-up") #inputState.watch("slideLeft", "shift-arrow_left", "shift-arrow_left-up") - inputState.watch("slideLeft", "slide-is-disabled", "slide-is-disabled") + #inputState.watch("slideLeft", "slide-is-disabled", "slide-is-disabled") #inputState.watch("slideRight", "shift-arrow_right", "shift-arrow_right-up") #inputState.watch("slideRight", "control-arrow_right", "control-arrow_right-up") #inputState.watch("slideRight", "alt-arrow_right", "alt-arrow_right-up") #inputState.watch("slideRight", "shift-arrow_right", "shift-arrow_right-up") - inputState.watch("slideRight", "slide-is-disabled", "slide-is-disabled") + #inputState.watch("slideRight", "slide-is-disabled", "slide-is-disabled") def add(self, controls, name="basic"): @@ -223,8 +227,8 @@ class ControlManager: self.devControls.disableAvatarControls() self.devControls.setCollisionsActive(0) - self.walkControls.setCollisionsActive(1) - self.walkControls.enableAvatarControls() + #self.walkControls.setCollisionsActive(1) + #self.walkControls.enableAvatarControls() def deleteCollisions(self): assert(self.debugPrint("deleteCollisions()")) diff --git a/direct/src/showbase/DevWalker.py b/direct/src/showbase/DevWalker.py index 8df678aa9e..ebad6c45d2 100755 --- a/direct/src/showbase/DevWalker.py +++ b/direct/src/showbase/DevWalker.py @@ -75,18 +75,22 @@ class DevWalker(DirectObject.DirectObject): reverse = inputState.isSet("reverse") turnLeft = inputState.isSet("turnLeft") turnRight = inputState.isSet("turnRight") - shift = inputState.isSet("shift") + slideLeft = inputState.isSet("slideLeft") + slideRight = inputState.isSet("slideRight") + levitateUp = inputState.isSet("levitateUp") + levitateDown = inputState.isSet("levitateDown") + run = inputState.isSet("run") and 4.0 or 1.0 # Determine what the speeds are based on the buttons: - self.speed=shift and ( + self.speed=( (forward and self.avatarControlForwardSpeed or reverse and -self.avatarControlReverseSpeed)) - self.liftSpeed=not shift and ( - (forward and self.avatarControlForwardSpeed or - reverse and -self.avatarControlReverseSpeed)) - self.slideSpeed=not shift and ( - (turnLeft and -self.avatarControlForwardSpeed) or - (turnRight and self.avatarControlForwardSpeed)) - self.rotationSpeed=shift and ( + self.liftSpeed=( + (levitateUp and self.avatarControlForwardSpeed or + levitateDown and -self.avatarControlReverseSpeed)) + self.slideSpeed=( + (slideLeft and -self.avatarControlForwardSpeed) or + (slideRight and self.avatarControlForwardSpeed)) + self.rotationSpeed=( (turnLeft and self.avatarControlRotateSpeed) or (turnRight and -self.avatarControlRotateSpeed)) @@ -94,9 +98,9 @@ class DevWalker(DirectObject.DirectObject): if self.speed or self.liftSpeed or self.slideSpeed or self.rotationSpeed: # How far did we move based on the amount of time elapsed? dt=min(ClockObject.getGlobalClock().getDt(), 0.1) - distance = dt * self.speed - lift = dt * self.liftSpeed - slideDistance = dt * self.slideSpeed + distance = dt * self.speed * run + lift = dt * self.liftSpeed * run + slideDistance = dt * self.slideSpeed * run rotation = dt * self.rotationSpeed # Take a step in the direction of our previous heading. diff --git a/direct/src/showbase/GravityWalker.py b/direct/src/showbase/GravityWalker.py index 92e46cb1f5..c0c4b1624a 100755 --- a/direct/src/showbase/GravityWalker.py +++ b/direct/src/showbase/GravityWalker.py @@ -52,8 +52,12 @@ class GravityWalker(DirectObject.DirectObject): self.avatarControlReverseSpeed=0 self.avatarControlRotateSpeed=0 self.getAirborneHeight=None + + self.priorParent=Vec3(0) self.__oldPosDelta=Vec3(0) self.__oldDt=0 + + self.moving=0 self.speed=0.0 self.rotationSpeed=0.0 self.slideSpeed=0.0 @@ -213,8 +217,8 @@ class GravityWalker(DirectObject.DirectObject): self.setCollisionsActive(1) - def setAirborneHeightFunc(self, getAirborneHeight): - self.getAirborneHeight = getAirborneHeight + def setAirborneHeightFunc(self, unused_parameter): + self.getAirborneHeight = self.lifter.getAirborneHeight def setAvatarPhysicsIndicator(self, indicator): """ @@ -236,6 +240,8 @@ class GravityWalker(DirectObject.DirectObject): del self.pusher del self.event del self.lifter + + del self.getAirborneHeight def setCollisionsActive(self, active = 1): assert(self.debugPrint("collisionsActive(active=%s)"%(active,))) @@ -264,7 +270,10 @@ class GravityWalker(DirectObject.DirectObject): as floor, but are nearly vertical. This ray is a hack to help deal with the cliff. """ - if self.lifter.isInOuterSpace(): + if (base.isRendering + and self.collisionsActive + and self.moving + and self.lifter.isInOuterSpace()): temp = self.cRayNodePath.getZ() self.cRayNodePath.setZ(14.0) self.oneTimeCollide() @@ -325,6 +334,9 @@ class GravityWalker(DirectObject.DirectObject): (turnLeft and self.avatarControlRotateSpeed) or (turnRight and -self.avatarControlRotateSpeed)) + if self.needToDeltaPos: + self.setPriorParentVector() + self.needToDeltaPos = 0 if self.wantDebugIndicator: onScreenDebug.add("airborneHeight", self.lifter.getAirborneHeight()) #*# onScreenDebug.add("falling", self.falling) #*# @@ -343,14 +355,15 @@ class GravityWalker(DirectObject.DirectObject): if self.lifter.isOnGround(): if self.isAirborne: self.isAirborne = 0 + self.priorParent = Vec3(0) impact = self.lifter.getImpactVelocity() if impact < -30.0: messenger.send("jumpHardLand") - self.startJumpDelay(0.1) + self.startJumpDelay(0.3) else: messenger.send("jumpLand") if impact < -5.0: - self.startJumpDelay(0.05) + self.startJumpDelay(0.2) # else, ignore the little potholes. if jump and self.mayJump: # ...the jump button is down and we're close @@ -363,10 +376,14 @@ class GravityWalker(DirectObject.DirectObject): # if self.lifter.getAirborneHeight() > 10000.0: # assert(0) + self.__oldPosDelta = self.avatarNodePath.getPosDelta(render) + # How far did we move based on the amount of time elapsed? + self.__oldDt = ClockObject.getGlobalClock().getDt() + dt=min(self.__oldDt, 0.1) + # Check to see if we're moving at all: - if self.speed or self.slideSpeed or self.rotationSpeed: - # How far did we move based on the amount of time elapsed? - dt=min(ClockObject.getGlobalClock().getDt(), 0.1) + self.moving = self.speed or self.slideSpeed or self.rotationSpeed or (self.priorParent!=Vec3.zero()) + if self.moving: distance = dt * self.speed slideDistance = dt * self.slideSpeed rotation = dt * self.rotationSpeed @@ -374,11 +391,11 @@ class GravityWalker(DirectObject.DirectObject): # Take a step in the direction of our previous heading. self.vel=Vec3(Vec3.forward() * distance + Vec3.right() * slideDistance) - if self.vel != Vec3.zero(): + if self.vel != Vec3.zero() or self.priorParent != Vec3.zero(): # rotMat is the rotation matrix corresponding to # our previous heading. rotMat=Mat3.rotateMatNormaxis(self.avatarNodePath.getH(), Vec3.up()) - step=rotMat.xform(self.vel) + step=rotMat.xform(self.vel) + (self.priorParent * dt) self.avatarNodePath.setFluidPos(Point3( self.avatarNodePath.getPos()+step)) self.avatarNodePath.setH(self.avatarNodePath.getH()+rotation) @@ -392,25 +409,22 @@ class GravityWalker(DirectObject.DirectObject): self.needToDeltaPos = 1 def setPriorParentVector(self): - assert(self.debugPrint("doDeltaPos()")) - - print "self.__oldDt", self.__oldDt, "self.__oldPosDelta", self.__oldPosDelta + assert(self.debugPrint("setPriorParentVector()")) if __debug__: onScreenDebug.add("__oldDt", "% 10.4f"%self.__oldDt) onScreenDebug.add("self.__oldPosDelta", self.__oldPosDelta.pPrintValues()) - - velocity = self.__oldPosDelta*(1/self.__oldDt)*4.0 # *4.0 is a hack - assert(self.debugPrint(" __oldPosDelta=%s"%(self.__oldPosDelta,))) - assert(self.debugPrint(" velocity=%s"%(velocity,))) - self.priorParent.setVector(Vec3(velocity)) + velocity = self.__oldPosDelta*(1.0/self.__oldDt) + self.priorParent = Vec3(velocity) + self.priorParent.setZ(0.0) # The lifter handles the z value. if __debug__: if self.wantDebugIndicator: - onScreenDebug.add("velocity", velocity.pPrintValues()) + onScreenDebug.add("priorParent", self.priorParent.pPrintValues()) def reset(self): assert(self.debugPrint("reset()")) self.lifter.setVelocity(0.0) + self.priorParent=Vec3(0.0) def enableAvatarControls(self): """ diff --git a/direct/src/showbase/PhysicsWalker.py b/direct/src/showbase/PhysicsWalker.py index c3564bd5b8..937b5e7911 100755 --- a/direct/src/showbase/PhysicsWalker.py +++ b/direct/src/showbase/PhysicsWalker.py @@ -348,6 +348,8 @@ class PhysicsWalker(DirectObject.DirectObject): del self.cSphereNodePath del self.pusher + + del self.getAirborneHeight def setCollisionsActive(self, active = 1): assert(self.debugPrint("collisionsActive(active=%s)"%(active,))) @@ -410,9 +412,9 @@ class PhysicsWalker(DirectObject.DirectObject): reverse = inputState.isSet("reverse") turnLeft = inputState.isSet("turnLeft") turnRight = inputState.isSet("turnRight") - slide = inputState.isSet("slide") - slideLeft = inputState.isSet("slideLeft") - slideRight = inputState.isSet("slideRight") + slide = 0#inputState.isSet("slide") + slideLeft = 0#inputState.isSet("slideLeft") + slideRight = 0#inputState.isSet("slideRight") jump = inputState.isSet("jump") # Determine what the speeds are based on the buttons: self.__speed=(forward and self.avatarControlForwardSpeed or diff --git a/direct/src/showbase/ShowBase.py b/direct/src/showbase/ShowBase.py index 9213cb9a01..b7a0616359 100644 --- a/direct/src/showbase/ShowBase.py +++ b/direct/src/showbase/ShowBase.py @@ -67,6 +67,12 @@ class ShowBase(DirectObject.DirectObject): # the program by closing the main window. self.exitFunc = None + # There are times when we are not drawing anything new to the + # screen, but we were grinding away on all the collision loops + # and shadow stuff and actually rendering. This is to test + # not doing some of that: + self.isRendering = 0 + taskMgr.taskTimerVerbose = self.config.GetBool('task-timer-verbose', 0) taskMgr.extendedExceptions = self.config.GetBool('extended-exceptions', 0) @@ -831,34 +837,37 @@ class ShowBase(DirectObject.DirectObject): def shadowCollisionLoop(self, state): # run the collision traversal if we have a # CollisionTraverser set. - if self.shadowTrav: - self.shadowTrav.traverse(self.render) + if self.isRendering: + if self.shadowTrav: + self.shadowTrav.traverse(self.render) return Task.cont def collisionloop(self, state): # run the collision traversal if we have a # CollisionTraverser set. - if self.cTrav: - self.cTrav.traverse(self.render) - if self.appTrav: - self.appTrav.traverse(self.render) + if self.isRendering: + if self.cTrav: + self.cTrav.traverse(self.render) + if self.appTrav: + self.appTrav.traverse(self.render) return Task.cont def igloop(self, state): - if __debug__: - # We render the watch variables for the onScreenDebug as soon - # as we reasonably can before the renderFrame(). - onScreenDebug.render() + if self.isRendering: + if __debug__: + # We render the watch variables for the onScreenDebug as soon + # as we reasonably can before the renderFrame(). + onScreenDebug.render() - # Finally, render the frame. - self.graphicsEngine.renderFrame() - if self.clusterSyncFlag: - self.graphicsEngine.syncFrame() + # Finally, render the frame. + self.graphicsEngine.renderFrame() + if self.clusterSyncFlag: + self.graphicsEngine.syncFrame() - if __debug__: - # We clear the text buffer for the onScreenDebug as soon - # as we reasonably can after the renderFrame(). - onScreenDebug.clear() + if __debug__: + # We clear the text buffer for the onScreenDebug as soon + # as we reasonably can after the renderFrame(). + onScreenDebug.clear() if self.mainWinMinimized: # If the main window is minimized, slow down the app a bit @@ -876,6 +885,10 @@ class ShowBase(DirectObject.DirectObject): throwNewFrame() return Task.cont + def setRendering(self, isRendering): + self.isRendering = isRendering + print "** base.isRendering=%s **"%isRendering + def restart(self): self.shutdown() # resetPrevTransform goes at the very beginning of the frame.