Poodletooth-iLand/toontown/cogdominium/CogdoFlyingShadowPlacer.py

68 lines
2.4 KiB
Python

from direct.controls.ControlManager import CollisionHandlerRayStart
from direct.directnotify import DirectNotifyGlobal
from panda3d.core import *
from direct.task.Task import Task
from direct.showbase.DirectObject import DirectObject
from direct.showbase.ShadowPlacer import ShadowPlacer
class CogdoFlyingShadowPlacer(ShadowPlacer):
def __init__(self, cTrav, shadowNodePath, wallCollideMask, floorCollideMask, name):
ShadowPlacer.__init__(self, cTrav, shadowNodePath, wallCollideMask, floorCollideMask)
self.name = name
def setup(self, cTrav, shadowNodePath, wallCollideMask, floorCollideMask):
if not cTrav:
base.initShadowTrav()
cTrav = base.shadowTrav
self.cTrav = cTrav
self.shadowNodePath = shadowNodePath
floorOffset = 0.025
self.cRay = CollisionRay(0.0, 0.0, 1.0, 0.0, 0.0, -1.0)
cRayNode = CollisionNode('shadowPlacer')
cRayNode.addSolid(self.cRay)
self.cRayNodePath = NodePath(cRayNode)
self.cRayBitMask = floorCollideMask
cRayNode.setFromCollideMask(self.cRayBitMask)
cRayNode.setIntoCollideMask(BitMask32.allOff())
self.queue = CollisionHandlerQueue()
def update(self):
self.cTrav.traverse(render)
self.queue.sortEntries()
if self.queue.getNumEntries() > 0:
entry = self.queue.getEntry(0)
pos = entry.getSurfacePoint(render)
self.shadowNodePath.setPos(render, pos)
return Task.cont
def delete(self):
self.off()
del self.cTrav
del self.shadowNodePath
del self.cRay
self.cRayNodePath.removeNode()
del self.cRayNodePath
del self.queue
def on(self):
if self.isActive:
return
self.cRayNodePath.reparentTo(self.shadowNodePath.getParent())
self.cTrav.addCollider(self.cRayNodePath, self.queue)
self.isActive = 1
taskMgr.add(self.update, 'ShadowPlacer.update.%s' % self.name, -45, extraArgs=[])
def off(self):
if not self.isActive:
return
didIt = self.cTrav.removeCollider(self.cRayNodePath)
self.oneTimeCollide()
self.cRayNodePath.detachNode()
self.isActive = 0
taskMgr.remove('ShadowPlacer.update.%s' % self.name)
def oneTimeCollide(self):
tempCTrav = CollisionTraverser('oneTimeCollide')
tempCTrav.addCollider(self.cRayNodePath, self.queue)
tempCTrav.traverse(render)