Browse Source

added reach

Dave Schuyler 21 years ago
parent
commit
5d636da5de

+ 5 - 5
direct/src/showbase/ControlManager.py

@@ -194,30 +194,30 @@ class ControlManager:
         return self.currentControls.getSpeeds()
         return self.currentControls.getSpeeds()
     
     
     def initializeCollisions(self, cTrav,
     def initializeCollisions(self, cTrav,
-            wallBitmask, floorBitmask, ghostBitmask, avatarRadius, floorOffset):
+            wallBitmask, floorBitmask, ghostBitmask, avatarRadius, floorOffset, reach = 4.0):
         assert(self.debugPrint("initializeCollisions()"))
         assert(self.debugPrint("initializeCollisions()"))
         
         
         self.walkControls.initializeCollisions(cTrav, self.avatar,
         self.walkControls.initializeCollisions(cTrav, self.avatar,
-                wallBitmask, floorBitmask, avatarRadius, floorOffset)
+                wallBitmask, floorBitmask, avatarRadius, floorOffset, reach)
         self.walkControls.setAirborneHeightFunc(self.avatar.getAirborneHeight)
         self.walkControls.setAirborneHeightFunc(self.avatar.getAirborneHeight)
         self.walkControls.disableAvatarControls()
         self.walkControls.disableAvatarControls()
         self.walkControls.setCollisionsActive(0)
         self.walkControls.setCollisionsActive(0)
         
         
         self.swimControls.initializeCollisions(cTrav, self.avatar,
         self.swimControls.initializeCollisions(cTrav, self.avatar,
-                wallBitmask, floorBitmask, avatarRadius, floorOffset)
+                wallBitmask, floorBitmask, avatarRadius, floorOffset, reach)
         self.swimControls.setAirborneHeightFunc(self.avatar.getAirborneHeight)
         self.swimControls.setAirborneHeightFunc(self.avatar.getAirborneHeight)
         self.swimControls.disableAvatarControls()
         self.swimControls.disableAvatarControls()
         self.swimControls.setCollisionsActive(0)
         self.swimControls.setCollisionsActive(0)
         
         
         self.ghostControls.initializeCollisions(cTrav, self.avatar,
         self.ghostControls.initializeCollisions(cTrav, self.avatar,
-                ghostBitmask, floorBitmask, avatarRadius, floorOffset)
+                ghostBitmask, floorBitmask, avatarRadius, floorOffset, reach)
         self.ghostControls.setAirborneHeightFunc(self.avatar.getAirborneHeight)
         self.ghostControls.setAirborneHeightFunc(self.avatar.getAirborneHeight)
         self.ghostControls.disableAvatarControls()
         self.ghostControls.disableAvatarControls()
         self.ghostControls.setCollisionsActive(0)
         self.ghostControls.setCollisionsActive(0)
         
         
         if __debug__:
         if __debug__:
             self.devControls.initializeCollisions(cTrav, self.avatar,
             self.devControls.initializeCollisions(cTrav, self.avatar,
-                    wallBitmask, floorBitmask, avatarRadius, floorOffset)
+                    wallBitmask, floorBitmask, avatarRadius, floorOffset, reach)
             self.devControls.setAirborneHeightFunc(self.avatar.getAirborneHeight)
             self.devControls.setAirborneHeightFunc(self.avatar.getAirborneHeight)
             self.devControls.disableAvatarControls()
             self.devControls.disableAvatarControls()
             self.devControls.setCollisionsActive(0)
             self.devControls.setCollisionsActive(0)

+ 1 - 1
direct/src/showbase/DevWalker.py

@@ -48,7 +48,7 @@ class DevWalker(DirectObject.DirectObject):
 
 
     def initializeCollisions(self, collisionTraverser, avatarNodePath, 
     def initializeCollisions(self, collisionTraverser, avatarNodePath, 
             wallCollideMask, floorCollideMask,
             wallCollideMask, floorCollideMask,
-            avatarRadius = 1.4, floorOffset = 1.0):
+            avatarRadius = 1.4, floorOffset = 1.0, reach = 1.0):
         assert not avatarNodePath.isEmpty()
         assert not avatarNodePath.isEmpty()
 
 
         self.cTrav = collisionTraverser
         self.cTrav = collisionTraverser

+ 4 - 3
direct/src/showbase/GravityWalker.py

@@ -170,7 +170,7 @@ class GravityWalker(DirectObject.DirectObject):
         #assert(self.debugPrint("getSpeeds()"))
         #assert(self.debugPrint("getSpeeds()"))
         return (self.speed, self.rotationSpeed)
         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 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
         # 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
         # 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.addInPattern("enter%in")
         self.lifter.addOutPattern("exit%in")
         self.lifter.addOutPattern("exit%in")
         self.lifter.setOffset(floorOffset)
         self.lifter.setOffset(floorOffset)
+        self.lifter.setReach(reach)
 
 
         # Limit our rate-of-fall with the lifter.
         # Limit our rate-of-fall with the lifter.
         # If this is too low, we actually "fall" off steep stairs
         # If this is too low, we actually "fall" off steep stairs
@@ -273,7 +274,7 @@ class GravityWalker(DirectObject.DirectObject):
 
 
     def initializeCollisions(self, collisionTraverser, avatarNodePath, 
     def initializeCollisions(self, collisionTraverser, avatarNodePath, 
             wallBitmask, floorBitmask, 
             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
         floorOffset is how high the avatar can reach.  I.e. if the avatar
             walks under a ledge that is <= floorOffset above the ground (a
             walks under a ledge that is <= floorOffset above the ground (a
@@ -289,7 +290,7 @@ class GravityWalker(DirectObject.DirectObject):
         
         
         self.cTrav = collisionTraverser
         self.cTrav = collisionTraverser
 
 
-        self.setupRay(floorBitmask, floorOffset)
+        self.setupRay(floorBitmask, floorOffset, reach )
         self.setupWallSphere(wallBitmask, avatarRadius)
         self.setupWallSphere(wallBitmask, avatarRadius)
         self.setupEventSphere(wallBitmask, avatarRadius)
         self.setupEventSphere(wallBitmask, avatarRadius)
         if self.wantFloorSphere:
         if self.wantFloorSphere:

+ 8 - 4
direct/src/showbase/NonPhysicsWalker.py

@@ -48,7 +48,7 @@ class NonPhysicsWalker(DirectObject.DirectObject):
 
 
     def initializeCollisions(self, collisionTraverser, avatarNodePath, 
     def initializeCollisions(self, collisionTraverser, avatarNodePath, 
             wallCollideMask, floorCollideMask,
             wallCollideMask, floorCollideMask,
-            avatarRadius = 1.4, floorOffset = 1.0):
+            avatarRadius = 1.4, floorOffset = 1.0, reach = 1.0):
         """
         """
         Set up the avatar for collisions
         Set up the avatar for collisions
         """
         """
@@ -69,9 +69,12 @@ class NonPhysicsWalker(DirectObject.DirectObject):
         cSphereNode.setIntoCollideMask(BitMask32.allOff())
         cSphereNode.setIntoCollideMask(BitMask32.allOff())
 
 
         # Set up the collison ray
         # 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 = CollisionNode('NPW.cRayNode')
         cRayNode.addSolid(self.cRay)
         cRayNode.addSolid(self.cRay)
         self.cRayNodePath = avatarNodePath.attachNewNode(cRayNode)
         self.cRayNodePath = avatarNodePath.attachNewNode(cRayNode)
@@ -89,6 +92,7 @@ class NonPhysicsWalker(DirectObject.DirectObject):
         self.lifter.setInPattern("on-floor")
         self.lifter.setInPattern("on-floor")
         self.lifter.setOutPattern("off-floor")
         self.lifter.setOutPattern("off-floor")
         self.lifter.setOffset(floorOffset)
         self.lifter.setOffset(floorOffset)
+        self.lifter.setReach(reach)
 
 
         # Limit our rate-of-fall with the lifter.
         # Limit our rate-of-fall with the lifter.
         # If this is too low, we actually "fall" off steep stairs
         # If this is too low, we actually "fall" off steep stairs

+ 1 - 1
direct/src/showbase/PhysicsWalker.py

@@ -259,7 +259,7 @@ class PhysicsWalker(DirectObject.DirectObject):
 
 
     def initializeCollisions(self, collisionTraverser, avatarNodePath, 
     def initializeCollisions(self, collisionTraverser, avatarNodePath, 
             wallBitmask, floorBitmask, 
             wallBitmask, floorBitmask, 
-            avatarRadius = 1.4, floorOffset = 1.0):
+            avatarRadius = 1.4, floorOffset = 1.0, reach = 1.0):
         """
         """
         Set up the avatar collisions
         Set up the avatar collisions
         """
         """

+ 2 - 1
direct/src/showbase/ShadowPlacer.py

@@ -52,7 +52,7 @@ class ShadowPlacer(DirectObject.DirectObject):
         floorOffset = 0.025
         floorOffset = 0.025
         # Set up the collison ray
         # Set up the collison ray
         # This is a ray cast down to detect floor polygons
         # 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 = CollisionNode('shadowPlacer')
         cRayNode.addSolid(self.cRay)
         cRayNode.addSolid(self.cRay)
         self.cRayNodePath = NodePath(cRayNode)
         self.cRayNodePath = NodePath(cRayNode)
@@ -65,6 +65,7 @@ class ShadowPlacer(DirectObject.DirectObject):
         #self.lifter.setInPattern("on-floor")
         #self.lifter.setInPattern("on-floor")
         #self.lifter.setOutPattern("off-floor")
         #self.lifter.setOutPattern("off-floor")
         self.lifter.setOffset(floorOffset)
         self.lifter.setOffset(floorOffset)
+        self.lifter.setReach(4.0)
 
 
         # activate the collider with the traverser and pusher
         # activate the collider with the traverser and pusher
         #self.on()
         #self.on()