From d9dcbfc429bc554699fe9c6bcecf3565f3b88e29 Mon Sep 17 00:00:00 2001 From: Josh Wilson Date: Fri, 20 Apr 2007 19:08:31 +0000 Subject: [PATCH] "using new ShipFloorCollide for avatars on a ship" --- direct/src/controls/ControlManager.py | 4 ++ direct/src/controls/GravityWalker.py | 7 +++ direct/src/controls/NonPhysicsWalker.py | 7 +++ direct/src/controls/ShipPilot.py | 79 +++++++++++++++++-------- 4 files changed, 71 insertions(+), 26 deletions(-) diff --git a/direct/src/controls/ControlManager.py b/direct/src/controls/ControlManager.py index 0699ac9aeb..ad4dbaf41f 100755 --- a/direct/src/controls/ControlManager.py +++ b/direct/src/controls/ControlManager.py @@ -93,6 +93,9 @@ class ControlManager: controls.setCollisionsActive(0) self.controls[name] = controls + def get(self, name): + return self.controls.get(name) + def remove(self, name): """ name is any key that was used to refer to the @@ -245,3 +248,4 @@ class ControlManager: onScreenDebug.add("InputState slideLeft", "%d"%(inputState.isSet("slideLeft"))) onScreenDebug.add("InputState slideRight", "%d"%(inputState.isSet("slideRight"))) return Task.cont + diff --git a/direct/src/controls/GravityWalker.py b/direct/src/controls/GravityWalker.py index f395559467..712df6cb54 100755 --- a/direct/src/controls/GravityWalker.py +++ b/direct/src/controls/GravityWalker.py @@ -280,6 +280,13 @@ class GravityWalker(DirectObject.DirectObject): def setFloorBitMask(self, bitMask): self.floorBitmask = bitMask + def swapFloorBitMask(self, oldMask, newMask): + self.floorBitmask = self.floorBitmask &~ oldMask + self.floorBitmask |= newMask + + if self.cRayNodePath and not self.cRayNodePath.isEmpty(): + self.cRayNodePath.node().setFromCollideMask(self.floorBitmask) + def initializeCollisions(self, collisionTraverser, avatarNodePath, avatarRadius = 1.4, floorOffset = 1.0, reach = 1.0): """ diff --git a/direct/src/controls/NonPhysicsWalker.py b/direct/src/controls/NonPhysicsWalker.py index 3670fbaa8a..1bf8260603 100755 --- a/direct/src/controls/NonPhysicsWalker.py +++ b/direct/src/controls/NonPhysicsWalker.py @@ -64,6 +64,13 @@ class NonPhysicsWalker(DirectObject.DirectObject): def setFloorBitMask(self, bitMask): self.cRayBitMask = bitMask + def swapFloorBitMask(self, oldMask, newMask): + self.cRayBitMask = self.cRayBitMask &~ oldMask + self.cRayBitMask |= newMask + + if self.cRayNodePath and not self.cRayNodePath.isEmpty(): + self.cRayNodePath.node().setFromCollideMask(self.cRayBitMask) + def initializeCollisions(self, collisionTraverser, avatarNodePath, avatarRadius = 1.4, floorOffset = 1.0, reach = 1.0): """ diff --git a/direct/src/controls/ShipPilot.py b/direct/src/controls/ShipPilot.py index 0eb2789da0..92cf0a3b6c 100755 --- a/direct/src/controls/ShipPilot.py +++ b/direct/src/controls/ShipPilot.py @@ -56,6 +56,13 @@ class ShipPilot(PhysicsWalker): def setWallBitMask(self, bitMask): self.wallBitmask = bitMask + def swapWallBitMask(self, oldMask, newMask): + self.wallBitmask = self.wallBitmask &~ oldMask + self.wallBitmask |= newMask + + if self.cSphereNodePath and not self.cSphereNodePath.isEmpty(): + self.cSphereNodePath.node().setFromCollideMask(self.wallBitmask) + def setFloorBitMask(self, bitMask): self.floorBitmask = bitMask @@ -102,33 +109,40 @@ class ShipPilot(PhysicsWalker): self.pusher = PhysicsCollisionHandler() self.pusher.setInPattern("enter%in") self.pusher.setOutPattern("exit%in") - + + cSphereNode = CollisionNode('SP.cSphereNode') + # Front sphere: sRadius = abs((self.portPos - self.starboardPos)[0] / 2.0) cBowSphere = CollisionSphere( 0.0, self.bowPos[1]+sRadius, 0.0, sRadius) - cBowSphereNode = CollisionNode('SP.cBowSphereNode') - cBowSphereNode.addSolid(cBowSphere) - self.cBowSphereNodePath = self.ship.getInteractCollisionRoot().attachNewNode( - cBowSphereNode) - # self.cBowSphereNodePath.show() + cSphereNode.addSolid(cBowSphere) + # cBowSphereNode = CollisionNode('SP.cBowSphereNode') + # cBowSphereNode.addSolid(cBowSphere) + # self.cBowSphereNodePath = self.ship.getInteractCollisionRoot().attachNewNode( + # cBowSphereNode) - self.pusher.addCollider( - self.cBowSphereNodePath, self.shipNodePath) - self.pusher.setHorizontal(True) + # self.pusher.addCollider( + # self.cBowSphereNodePath, self.shipNodePath) # Back sphere: cSternSphere = CollisionSphere( 0.0, self.sternPos[1]-sRadius, 0.0, sRadius) cSternSphereNode = CollisionNode('SP.cSternSphereNode') - cSternSphereNode.addSolid(cSternSphere) - self.cSternSphereNodePath = self.ship.getInteractCollisionRoot().attachNewNode( - cSternSphereNode) - # self.cSternSphereNodePath.show() + cSphereNode.addSolid(cSternSphere) + # cSternSphereNode.addSolid(cSternSphere) + # self.cSternSphereNodePath = self.ship.getInteractCollisionRoot().attachNewNode( + # cSternSphereNode) + + # self.pusher.addCollider( + # self.cSternSphereNodePath, self.shipNodePath) - self.pusher.addCollider( - self.cSternSphereNodePath, self.shipNodePath) + self.cSphereNodePath = self.ship.getInteractCollisionRoot().attachNewNode( + cSphereNode) + self.pusher.addCollider( + self.cSphereNodePath, self.shipNodePath) + self.pusher.setHorizontal(True) # hide other things on my ship that these spheres might collide # with and which I dont need anyways... shipCollWall = self.shipNodePath.find("**/collision_hull") @@ -144,26 +158,38 @@ class ShipPilot(PhysicsWalker): self.collisionsActive = active shipCollWall = self.shipNodePath.find("**/collision_hull;+s") if active: - self.cBowSphereNodePath.node().setFromCollideMask(self.wallBitmask | self.floorBitmask) - self.cBowSphereNodePath.node().setIntoCollideMask(BitMask32.allOff()) - self.cSternSphereNodePath.node().setFromCollideMask(self.wallBitmask | self.floorBitmask) - self.cSternSphereNodePath.node().setIntoCollideMask(BitMask32.allOff()) - self.cTrav.addCollider(self.cBowSphereNodePath, self.pusher) - self.cTrav.addCollider(self.cSternSphereNodePath, self.pusher) + # self.cBowSphereNodePath.node().setFromCollideMask(self.wallBitmask | self.floorBitmask) + # self.cBowSphereNodePath.node().setIntoCollideMask(BitMask32.allOff()) + # self.cSternSphereNodePath.node().setFromCollideMask(self.wallBitmask | self.floorBitmask) + # self.cSternSphereNodePath.node().setIntoCollideMask(BitMask32.allOff()) + self.cSphereNodePath.node().setFromCollideMask(self.wallBitmask | self.floorBitmask) + self.cSphereNodePath.node().setIntoCollideMask(BitMask32.allOff()) + # self.cTrav.addCollider(self.cBowSphereNodePath, self.pusher) + # self.cTrav.addCollider(self.cSternSphereNodePath, self.pusher) + self.cTrav.addCollider(self.cSphereNodePath, self.pusher) shipCollWall.stash() else: - self.cTrav.removeCollider(self.cBowSphereNodePath) - self.cTrav.removeCollider(self.cSternSphereNodePath) + # self.cTrav.removeCollider(self.cBowSphereNodePath) + # self.cTrav.removeCollider(self.cSternSphereNodePath) + self.cTrav.removeCollider(self.cSphereNodePath) shipCollWall.unstash() # Now that we have disabled collisions, make one more pass # right now to ensure we aren't standing in a wall. self.oneTimeCollide() def deleteCollisions(self): - import pdb;pdb.set_trace() assert self.debugPrint("deleteCollisions()") del self.cTrav + """ + if hasattr(self, "cBowSphereNodePath"): + self.cBowSphereNodePath.removeNode() + del self.cBowSphereNodePath + + if hasattr(self, "cSternSphereNodePath"): + self.cSternSphereNodePath.removeNode() + del self.cSternSphereNodePath + """ if hasattr(self, "cSphereNodePath"): self.cSphereNodePath.removeNode() del self.cSphereNodePath @@ -186,8 +212,9 @@ class ShipPilot(PhysicsWalker): assert self.debugPrint("takedownPhysics()") def setTag(self, key, value): - self.cSternSphereNodePath.setTag(key, value) - self.cBowSphereNodePath.setTag(key, value) + # self.cSternSphereNodePath.setTag(key, value) + # self.cBowSphereNodePath.setTag(key, value) + self.cSphereNodePath.setTag(key, value) def setAvatarPhysicsIndicator(self, indicator): """