diff --git a/direct/src/directtools/DirectSelection.py b/direct/src/directtools/DirectSelection.py index b8223a04bc..f64319c722 100644 --- a/direct/src/directtools/DirectSelection.py +++ b/direct/src/directtools/DirectSelection.py @@ -561,7 +561,7 @@ class SelectionRay(SelectionQueue): self.collider.setDirection( dir ) self.ct.traverse( targetNodePath ) self.sortEntries() - + def pickGeom3D(self, targetNodePath = render, origin = Point3(0), dir = Vec3(0,0,-1), skipFlags = SKIP_HIDDEN | SKIP_CAMERA ): @@ -623,3 +623,61 @@ class SelectionSegment(SelectionQueue): # Determine collision entry return self.findCollisionEntry(skipFlags) + +class SelectionSphere(SelectionQueue): + # Wrapper around collision sphere + def __init__(self, parentNP = render, numSpheres = 1): + # Initialize the superclass + SelectionQueue.__init__(self, parentNP) + self.colliders = [] + self.numColliders = 0 + for i in range(numSpheres): + self.addCollider(CollisionSphere(Point3(0), 1)) + + def addCollider(self, collider): + # Record new collision object + self.colliders.append(collider) + # Add the collider to the collision Node + self.collisionNode.addSolid( collider ) + self.numColliders += 1 + + def setCenter(self, i, center): + c = self.colliders[i] + c.setCenter(center) + + def setRadius(self, i, radius): + c = self.colliders[i] + c.setRadius(radius) + + def setCenterRadius(self, i, center, radius): + c = self.colliders[i] + c.setCenter(center) + c.setRadius(radius) + + def isEntryBackfacing(self, entry): + # If dot product of collision point surface normal and + # ray from sphere origin to collision point is positive, we are + # looking at the backface of the polygon + v = Vec3(entry.getFromIntersectionPoint() - + entry.getFrom().getCenter()) + n = entry.getFromSurfaceNormal() + # Normalize and check angle between to vectors + v.normalize() + return v.dot(n) >= 0 + + def pick(self, targetNodePath, skipFlags): + self.ct.traverse( targetNodePath ) + self.sortEntries() + return self.findCollisionEntry(skipFlags) + + def pickGeom(self, targetNodePath = render, + skipFlags = SKIP_HIDDEN | SKIP_CAMERA ): + self.collideWithGeom() + return self.pick(targetNodePath, skipFlags) + + def pickBitMask(self, bitMask = BitMask32.allOff(), + targetNodePath = render, + skipFlags = SKIP_HIDDEN | SKIP_CAMERA ): + self.collideWithBitMask(bitMask) + return self.pick(targetNodePath, skipFlags) +