diff --git a/direct/src/showbase/ControlManager.py b/direct/src/showbase/ControlManager.py index 7415266b05..ad4723aa4a 100755 --- a/direct/src/showbase/ControlManager.py +++ b/direct/src/showbase/ControlManager.py @@ -194,30 +194,30 @@ class ControlManager: return self.currentControls.getSpeeds() def initializeCollisions(self, cTrav, - wallBitmask, floorBitmask, ghostBitmask, avatarRadius, floorOffset): + wallBitmask, floorBitmask, ghostBitmask, avatarRadius, floorOffset, reach = 4.0): assert(self.debugPrint("initializeCollisions()")) self.walkControls.initializeCollisions(cTrav, self.avatar, - wallBitmask, floorBitmask, avatarRadius, floorOffset) + wallBitmask, floorBitmask, avatarRadius, floorOffset, reach) self.walkControls.setAirborneHeightFunc(self.avatar.getAirborneHeight) self.walkControls.disableAvatarControls() self.walkControls.setCollisionsActive(0) self.swimControls.initializeCollisions(cTrav, self.avatar, - wallBitmask, floorBitmask, avatarRadius, floorOffset) + wallBitmask, floorBitmask, avatarRadius, floorOffset, reach) self.swimControls.setAirborneHeightFunc(self.avatar.getAirborneHeight) self.swimControls.disableAvatarControls() self.swimControls.setCollisionsActive(0) self.ghostControls.initializeCollisions(cTrav, self.avatar, - ghostBitmask, floorBitmask, avatarRadius, floorOffset) + ghostBitmask, floorBitmask, avatarRadius, floorOffset, reach) self.ghostControls.setAirborneHeightFunc(self.avatar.getAirborneHeight) self.ghostControls.disableAvatarControls() self.ghostControls.setCollisionsActive(0) if __debug__: self.devControls.initializeCollisions(cTrav, self.avatar, - wallBitmask, floorBitmask, avatarRadius, floorOffset) + wallBitmask, floorBitmask, avatarRadius, floorOffset, reach) self.devControls.setAirborneHeightFunc(self.avatar.getAirborneHeight) self.devControls.disableAvatarControls() self.devControls.setCollisionsActive(0) diff --git a/direct/src/showbase/DevWalker.py b/direct/src/showbase/DevWalker.py index a3a5592a5c..8f6124ca4d 100755 --- a/direct/src/showbase/DevWalker.py +++ b/direct/src/showbase/DevWalker.py @@ -48,7 +48,7 @@ class DevWalker(DirectObject.DirectObject): def initializeCollisions(self, collisionTraverser, avatarNodePath, wallCollideMask, floorCollideMask, - avatarRadius = 1.4, floorOffset = 1.0): + avatarRadius = 1.4, floorOffset = 1.0, reach = 1.0): assert not avatarNodePath.isEmpty() self.cTrav = collisionTraverser diff --git a/direct/src/showbase/GravityWalker.py b/direct/src/showbase/GravityWalker.py index b692bcf95a..7bfef1f179 100755 --- a/direct/src/showbase/GravityWalker.py +++ b/direct/src/showbase/GravityWalker.py @@ -170,7 +170,7 @@ class GravityWalker(DirectObject.DirectObject): #assert(self.debugPrint("getSpeeds()")) return (self.speed, self.rotationSpeed) - def setupRay(self, bitmask, floorOffset): + def setupRay(self, bitmask, floorOffset, reach): # This is a ray cast from your head down to detect floor polygons. # This ray start is arbitrarily high in the air. Feel free to use # a higher or lower value depending on whether you want an avatar @@ -189,6 +189,7 @@ class GravityWalker(DirectObject.DirectObject): self.lifter.addInPattern("enter%in") self.lifter.addOutPattern("exit%in") self.lifter.setOffset(floorOffset) + self.lifter.setReach(reach) # Limit our rate-of-fall with the lifter. # If this is too low, we actually "fall" off steep stairs @@ -273,7 +274,7 @@ class GravityWalker(DirectObject.DirectObject): def initializeCollisions(self, collisionTraverser, avatarNodePath, wallBitmask, floorBitmask, - avatarRadius = 1.4, floorOffset = 1.0): + avatarRadius = 1.4, floorOffset = 1.0, reach = 1.0): """ floorOffset is how high the avatar can reach. I.e. if the avatar walks under a ledge that is <= floorOffset above the ground (a @@ -289,7 +290,7 @@ class GravityWalker(DirectObject.DirectObject): self.cTrav = collisionTraverser - self.setupRay(floorBitmask, floorOffset) + self.setupRay(floorBitmask, floorOffset, reach ) self.setupWallSphere(wallBitmask, avatarRadius) self.setupEventSphere(wallBitmask, avatarRadius) if self.wantFloorSphere: diff --git a/direct/src/showbase/NonPhysicsWalker.py b/direct/src/showbase/NonPhysicsWalker.py index 605a799b6a..5a011ccc5e 100755 --- a/direct/src/showbase/NonPhysicsWalker.py +++ b/direct/src/showbase/NonPhysicsWalker.py @@ -48,7 +48,7 @@ class NonPhysicsWalker(DirectObject.DirectObject): def initializeCollisions(self, collisionTraverser, avatarNodePath, wallCollideMask, floorCollideMask, - avatarRadius = 1.4, floorOffset = 1.0): + avatarRadius = 1.4, floorOffset = 1.0, reach = 1.0): """ Set up the avatar for collisions """ @@ -69,9 +69,12 @@ class NonPhysicsWalker(DirectObject.DirectObject): cSphereNode.setIntoCollideMask(BitMask32.allOff()) # Set up the collison ray - # This is a ray cast from your head down to detect floor polygons - # A toon is about 4.0 feet high, so start it there - self.cRay = CollisionRay(0.0, 0.0, 4.0, 0.0, 0.0, -1.0) + # This is a ray cast from your head down to detect floor polygons. + # This ray start is arbitrarily high in the air. Feel free to use + # a higher or lower value depending on whether you want an avatar + # that is outside of the world to step up to the floor when they + # get under valid floor: + self.cRay = CollisionRay(0.0, 0.0, 400000.0, 0.0, 0.0, -1.0) cRayNode = CollisionNode('NPW.cRayNode') cRayNode.addSolid(self.cRay) self.cRayNodePath = avatarNodePath.attachNewNode(cRayNode) @@ -89,6 +92,7 @@ class NonPhysicsWalker(DirectObject.DirectObject): self.lifter.setInPattern("on-floor") self.lifter.setOutPattern("off-floor") self.lifter.setOffset(floorOffset) + self.lifter.setReach(reach) # Limit our rate-of-fall with the lifter. # If this is too low, we actually "fall" off steep stairs diff --git a/direct/src/showbase/PhysicsWalker.py b/direct/src/showbase/PhysicsWalker.py index 5087027b86..67b6ce5dd9 100755 --- a/direct/src/showbase/PhysicsWalker.py +++ b/direct/src/showbase/PhysicsWalker.py @@ -259,7 +259,7 @@ class PhysicsWalker(DirectObject.DirectObject): def initializeCollisions(self, collisionTraverser, avatarNodePath, wallBitmask, floorBitmask, - avatarRadius = 1.4, floorOffset = 1.0): + avatarRadius = 1.4, floorOffset = 1.0, reach = 1.0): """ Set up the avatar collisions """ diff --git a/direct/src/showbase/ShadowPlacer.py b/direct/src/showbase/ShadowPlacer.py index 592e3cc812..111e253553 100755 --- a/direct/src/showbase/ShadowPlacer.py +++ b/direct/src/showbase/ShadowPlacer.py @@ -52,7 +52,7 @@ class ShadowPlacer(DirectObject.DirectObject): floorOffset = 0.025 # Set up the collison ray # This is a ray cast down to detect floor polygons - self.cRay = CollisionRay(0.0, 0.0, 4.0, 0.0, 0.0, -1.0) + self.cRay = CollisionRay(0.0, 0.0, 400.0, 0.0, 0.0, -1.0) cRayNode = CollisionNode('shadowPlacer') cRayNode.addSolid(self.cRay) self.cRayNodePath = NodePath(cRayNode) @@ -65,6 +65,7 @@ class ShadowPlacer(DirectObject.DirectObject): #self.lifter.setInPattern("on-floor") #self.lifter.setOutPattern("off-floor") self.lifter.setOffset(floorOffset) + self.lifter.setReach(4.0) # activate the collider with the traverser and pusher #self.on()