Bullet: CCD and CollideMask

On the forum of another engine, I saw a problem. And I decided to repeat it on Panda3D. Obviously the problem is not related to Panda3D, however it is interesting how can get around it.

Essence, when using a CCD, is not possible to achieve fullness of the absence of a collision when using collision masks.

Example:

from direct.showbase.DirectObject import DirectObject   
import direct.directbase.DirectStart   
from pandac.PandaModules import *
from panda3d.bullet import BulletWorld   
from panda3d.bullet import BulletPlaneShape   
from panda3d.bullet import BulletRigidBodyNode   
from panda3d.bullet import BulletBoxShape
from panda3d.bullet import BulletDebugNode 

base.cam.setPos(0, -20, 0)   

mask1 = BitMask32.allOn()
mask2 = BitMask32.allOff()
 
debugNode = BulletDebugNode('Debug')   
debugNP = render.attachNewNode(debugNode)   
debugNP.show()

world = BulletWorld()     
world.setDebugNode(debugNP.node())   
world.setGravity(Vec3(0, 0, -9.81))

csProjectile = BulletBoxShape(Vec3(0.05, 0.05, 0.05))
nodeBox = BulletRigidBodyNode('Box')
nodeBox.addShape(csProjectile)
nodeControlBox = render.attachNewNode(nodeBox)
nodeControlBox.setPos(0, 0, 5)
nodeBox.setMass(1)

nodeBox.setCcdMotionThreshold(0.05)
nodeBox.setCcdSweptSphereRadius(0.05)

nodeBox.setIntoCollideMask(mask1)
world.attachRigidBody(nodeBox)  

for i in xrange(0, 5):
    csFloor = BulletBoxShape(Vec3(5, 5, 0.05))   
    nodeFloor = BulletRigidBodyNode('Floor')
    nodeFloor.addShape(csFloor) 
    nodeControlFloor = render.attachNewNode(nodeFloor)
    nodeControlFloor.setPos(0, 0, 2-i)
    nodeFloor.setMass(0)
    
    nodeFloor.setIntoCollideMask(mask2)
    world.attachRigidBody(nodeFloor)   
  
  
def update(task):
  world.doPhysics(globalClock.getDt())
  
  if nodeControlBox.getZ() < -3:
    world.setGravity(Vec3(0, 0, 9.81))
  if nodeControlBox.getZ() > 3:
    world.setGravity(Vec3(0, 0, -9.81))
  
  return task.cont
  
taskMgr.add(update, 'update')

base.run()

If you delete these lines, then it starts to work as expected.

nodeBox.setCcdMotionThreshold(0.05)
nodeBox.setCcdSweptSphereRadius(0.05)