diff --git a/direct/src/controls/ObserverWalker.py b/direct/src/controls/ObserverWalker.py index 30900d9da2..1f7f4f3849 100755 --- a/direct/src/controls/ObserverWalker.py +++ b/direct/src/controls/ObserverWalker.py @@ -30,10 +30,71 @@ class ObserverWalker(NonPhysicsWalker.NonPhysicsWalker): """ Set up the avatar for collisions """ - NonPhysicsWalker.NonPhysicsWalker.initializeCollisions( - self, collisionTraverser, avatarNodePath, - avatarRadius, floorOffset, reach) - self.cTrav.removeCollider(self.cRayNodePath) + """ + Set up the avatar for collisions + """ + assert not avatarNodePath.isEmpty() + + self.cTrav = collisionTraverser + self.avatarNodePath = avatarNodePath + + # Set up the collision sphere + # This is a sphere on the ground to detect barrier collisions + self.cSphere = CollisionSphere(0.0, 0.0, 0.0, avatarRadius) + cSphereNode = CollisionNode('NPW.cSphereNode') + cSphereNode.addSolid(self.cSphere) + self.cSphereNodePath = avatarNodePath.attachNewNode(cSphereNode) + + cSphereNode.setFromCollideMask(self.cSphereBitMask) + cSphereNode.setIntoCollideMask(BitMask32.allOff()) + + # set up wall collision mechanism + self.pusher = CollisionHandlerPusher() + self.pusher.setInPattern("enter%in") + self.pusher.setOutPattern("exit%in") + + self.pusher.addCollider(self.cSphereNodePath, avatarNodePath) + + # activate the collider with the traverser and pusher + self.setCollisionsActive(1) + + class Foo: + def hasContact(self): + return 1 + + self.lifter = Foo() + + def deleteCollisions(self): + del self.cTrav + + del self.cSphere + self.cSphereNodePath.removeNode() + del self.cSphereNodePath + + del self.pusher + + def setCollisionsActive(self, active = 1): + assert(self.debugPrint("setCollisionsActive(active%s)"%(active,))) + if self.collisionsActive != active: + self.collisionsActive = active + if active: + self.cTrav.addCollider(self.cSphereNodePath, self.pusher) + else: + self.cTrav.removeCollider(self.cSphereNodePath) + + # Now that we have disabled collisions, make one more pass + # right now to ensure we aren't standing in a wall. + self.oneTimeCollide() + + def oneTimeCollide(self): + """ + Makes one quick collision pass for the avatar, for instance as + a one-time straighten-things-up operation after collisions + have been disabled. + """ + tempCTrav = CollisionTraverser("oneTimeCollide") + tempCTrav.addCollider(self.cSphereNodePath, self.pusher) + tempCTrav.traverse(render) def enableAvatarControls(self): """