From e5c464101c28104fa4b299c27aefdb6ee5f6a4fb Mon Sep 17 00:00:00 2001 From: Dave Schuyler Date: Thu, 6 Nov 2003 05:41:58 +0000 Subject: [PATCH] fixes and changes to allow switching between walker controls. --- direct/src/showbase/NonPhysicsWalker.py | 10 +++++ direct/src/showbase/PhysicsWalker.py | 50 ++++++++++++++++++------- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/direct/src/showbase/NonPhysicsWalker.py b/direct/src/showbase/NonPhysicsWalker.py index ae65509ec0..42bad02f55 100755 --- a/direct/src/showbase/NonPhysicsWalker.py +++ b/direct/src/showbase/NonPhysicsWalker.py @@ -124,6 +124,7 @@ class NonPhysicsWalker(DirectObject.DirectObject): del self.lifter def collisionsOff(self): + assert(self.debugPrint("collisionsOff")) self.cTrav.removeCollider(self.cSphereNode) self.cTrav.removeCollider(self.cRayNode) @@ -132,6 +133,7 @@ class NonPhysicsWalker(DirectObject.DirectObject): self.oneTimeCollide() def collisionsOn(self): + assert(self.debugPrint("collisionsOn")) self.cTrav.addCollider(self.cSphereNode, self.pusher) self.cTrav.addCollider(self.cRayNode, self.lifter) @@ -193,6 +195,8 @@ class NonPhysicsWalker(DirectObject.DirectObject): """ Activate the arrow keys, etc. """ + assert(self.debugPrint("enableAvatarControls")) + print id(self), "NPW.enableAvatarControls()" self.accept("control-arrow_left", self.moveTurnLeft, [1]) self.accept("control-arrow_left-up", self.moveTurnLeft, [0]) self.accept("control-arrow_right", self.moveTurnRight, [1]) @@ -210,6 +214,8 @@ class NonPhysicsWalker(DirectObject.DirectObject): self.accept("arrow_up-up", self.moveForward, [0]) self.accept("arrow_down", self.moveInReverse, [1]) self.accept("arrow_down-up", self.moveInReverse, [0]) + + self.collisionsOn() taskName = "AvatarControls%s"%(id(self),) # remove any old @@ -221,6 +227,8 @@ class NonPhysicsWalker(DirectObject.DirectObject): """ Ignore the arrow keys, etc. """ + assert(self.debugPrint("disableAvatarControls")) + print id(self), "NPW.enableAvatarControls()" taskName = "AvatarControls%s"%(id(self),) taskMgr.remove(taskName) @@ -243,6 +251,8 @@ class NonPhysicsWalker(DirectObject.DirectObject): self.ignore("arrow_up-up") self.ignore("arrow_down") self.ignore("arrow_down-up") + + self.collisionsOff() # reset state self.moveTurnLeft(0) diff --git a/direct/src/showbase/PhysicsWalker.py b/direct/src/showbase/PhysicsWalker.py index f908ed3556..d803b98214 100755 --- a/direct/src/showbase/PhysicsWalker.py +++ b/direct/src/showbase/PhysicsWalker.py @@ -28,7 +28,7 @@ class PhysicsWalker(DirectObject.DirectObject): notify = DirectNotifyGlobal.directNotify.newCategory("PhysicsWalker") wantAvatarPhysicsIndicator = base.config.GetBool('want-avatar-physics-indicator', 0) - + # special methods def __init__(self, gravity = -32.1740, standableGround=0.707, hardLandingForce=16.0): @@ -373,13 +373,19 @@ class PhysicsWalker(DirectObject.DirectObject): onScreenDebug.add("physObject orien", physObject.getOrientation().pPrintValues()) + if 1: + onScreenDebug.add("physObject vel", + physObject.getVelocity().pPrintValues()) + onScreenDebug.add("physObject len", + "% 10.4f"%physObject.getVelocity().length()) + if 0: onScreenDebug.add("posDelta4", self.priorParentNp.getRelativeVector( render, self.avatarNodePath.getPosDelta(render)).pPrintValues()) - if 0: + if 1: onScreenDebug.add("priorParent", self.priorParent.getLocalVector().pPrintValues()) @@ -392,14 +398,16 @@ class PhysicsWalker(DirectObject.DirectObject): self.__oldPosDelta.pPrintValues()) if 1: - onScreenDebug.add("__oldContact", - contact.pPrintValues()) onScreenDebug.add("contact", contact.pPrintValues()) - onScreenDebug.add("__oldAirborneHeight", "% 10.4f"%( - self.getAirborneHeight(),)) onScreenDebug.add("airborneHeight", "% 10.4f"%( self.getAirborneHeight(),)) + + if 0: + onScreenDebug.add("__oldContact", + contact.pPrintValues()) + onScreenDebug.add("__oldAirborneHeight", "% 10.4f"%( + self.getAirborneHeight(),)) airborneHeight=self.getAirborneHeight() if airborneHeight > self.highMark: self.highMark = airborneHeight @@ -407,7 +415,7 @@ class PhysicsWalker(DirectObject.DirectObject): self.highMark,)) #if airborneHeight < 0.1: #contact!=Vec3.zero(): if 1: - if airborneHeight > 0.7: + if airborneHeight > 0.7: # Check stair angles before chaning this. # ...the avatar is airborne (maybe a lot or a tiny amount). self.isAirborne = 1 else: @@ -422,6 +430,7 @@ class PhysicsWalker(DirectObject.DirectObject): else: #print "jumpLand" messenger.send("jumpLand") + self.priorParent.setVector(Vec3.zero()) self.isAirborne = 0 elif self.__jumpButton: #print "jump" @@ -447,14 +456,11 @@ class PhysicsWalker(DirectObject.DirectObject): # ...avatar was airborne. self.jumpCount-=1 if contactLength>self.__hardLandingForce: - print "jumpHardLand" messenger.send("jumpHardLand") else: - print "jumpLand" messenger.send("jumpLand") elif self.__jumpButton: self.jumpCount+=1 - print "jump" self.__jumpButton=0 messenger.send("jumpStart") jump=Vec3(contact+Vec3.up()) @@ -467,7 +473,15 @@ class PhysicsWalker(DirectObject.DirectObject): # We must copy the vector to preserve it: self.__oldContact=Vec3(contact) self.__oldAirborneHeight=airborneHeight - self.phys.doPhysics(dt) + + moveToGround = Vec3.zero() + if self.isAirborne: + # ...the airborne check is a hack to stop sliding. + self.phys.doPhysics(dt) + else: + physObject.setVelocity(Vec3.zero()) + if airborneHeight>0.001 and contact==Vec3.zero(): + moveToGround = Vec3(0.0, 0.0, -airborneHeight) # Check to see if we're moving at all: if self.__speed or self.__slideSpeed or self.__rotationSpeed: distance = dt * self.__speed @@ -489,7 +503,7 @@ class PhysicsWalker(DirectObject.DirectObject): rotMat=Mat3.rotateMatNormaxis(self.avatarNodePath.getH(), Vec3.up()) step=rotMat.xform(self.__vel) physObject.setPosition(Point3( - physObject.getPosition()+step)) + physObject.getPosition()+step+moveToGround)) # update hpr: o=physObject.getOrientation() @@ -614,7 +628,12 @@ class PhysicsWalker(DirectObject.DirectObject): def setPriorParentVector(self): assert(self.debugPrint("doDeltaPos()")) + print "self.__oldDt", self.__oldDt, "self.__oldPosDelta", self.__oldPosDelta + onScreenDebug.add("__oldDt", "% 10.4f"%self.__oldDt) + onScreenDebug.add("self.__oldPosDelta", + self.__oldPosDelta.pPrintValues()) + velocity = self.__oldPosDelta*(1/self.__oldDt) assert(self.debugPrint(" __oldPosDelta=%s"%(self.__oldPosDelta,))) assert(self.debugPrint(" velocity=%s"%(velocity,))) @@ -640,6 +659,7 @@ class PhysicsWalker(DirectObject.DirectObject): Activate the arrow keys, etc. """ assert(self.debugPrint("enableAvatarControls()")) + print id(self), "PW.enableAvatarControls()" self.accept("control", self.moveJump, [1]) self.accept("control-up", self.moveJump, [0]) self.accept("control-arrow_left", self.moveJumpLeft, [1]) @@ -659,6 +679,8 @@ class PhysicsWalker(DirectObject.DirectObject): self.accept("arrow_up-up", self.moveForward, [0]) self.accept("arrow_down", self.moveInReverse, [1]) self.accept("arrow_down-up", self.moveInReverse, [0]) + + self.collisionsOn() if __debug__: self.accept("control-f3", self.spawnTest) #*# @@ -677,6 +699,7 @@ class PhysicsWalker(DirectObject.DirectObject): Ignore the arrow keys, etc. """ assert(self.debugPrint("disableAvatarControls()")) + print id(self), "PW.disableAvatarControls()" taskName = "AvatarControls%s"%(id(self),) taskMgr.remove(taskName) @@ -702,7 +725,8 @@ class PhysicsWalker(DirectObject.DirectObject): self.ignore("arrow_up-up") self.ignore("arrow_down") self.ignore("arrow_down-up") - + + self.collisionsOff() if __debug__: self.ignore("control-f3") #*#