mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-25 20:52:26 -06:00
133 lines
3.8 KiB
Python
133 lines
3.8 KiB
Python
|
|
from pandac.PandaModules import *
|
|
from string import lower
|
|
|
|
class DirectLight(NodePath):
|
|
def __init__(self, light, parent):
|
|
# Initialize the superclass
|
|
NodePath.__init__(self)
|
|
# Record light and name
|
|
self.light = light
|
|
|
|
# Attach node to self
|
|
self.assign(parent.attachNewNode(self.light))
|
|
|
|
def getName(self):
|
|
return self.light.getName()
|
|
|
|
def getLight(self):
|
|
return self.light
|
|
|
|
class DirectLights(NodePath):
|
|
def __init__(self, parent = render):
|
|
# Initialize the superclass
|
|
NodePath.__init__(self)
|
|
# Create a node for the lights
|
|
self.assign(parent.attachNewNode('DIRECT Lights'))
|
|
# Create a list of all active lights
|
|
self.lightDict = {}
|
|
# Counts of the various types of lights
|
|
self.ambientCount = 0
|
|
self.directionalCount = 0
|
|
self.pointCount = 0
|
|
self.spotCount = 0
|
|
|
|
def __getitem__(self, name):
|
|
return self.lightDict.get(name, None)
|
|
|
|
def __len__(self):
|
|
return len(self.lightDict)
|
|
|
|
def delete(self, light):
|
|
del self.lightDict[light.getName()]
|
|
self.setOff(light)
|
|
light.removeNode()
|
|
|
|
def deleteAll(self):
|
|
for light in self:
|
|
self.delete(light)
|
|
|
|
def asList(self):
|
|
return [self[n] for n in self.getNameList()]
|
|
|
|
def getNameList(self):
|
|
# Return a sorted list of all lights in the light dict
|
|
nameList = [x.getName() for x in self.lightDict.values()]
|
|
nameList.sort()
|
|
return nameList
|
|
|
|
def create(self, type):
|
|
type = type.lower()
|
|
if type == 'ambient':
|
|
self.ambientCount += 1
|
|
light = AmbientLight('ambient-' + repr(self.ambientCount))
|
|
light.setColor(VBase4(.3, .3, .3, 1))
|
|
elif type == 'directional':
|
|
self.directionalCount += 1
|
|
light = DirectionalLight('directional-' + repr(self.directionalCount))
|
|
light.setColor(VBase4(1))
|
|
elif type == 'point':
|
|
self.pointCount += 1
|
|
light = PointLight('point-' + repr(self.pointCount))
|
|
light.setColor(VBase4(1))
|
|
elif type == 'spot':
|
|
self.spotCount += 1
|
|
light = Spotlight('spot-' + repr(self.spotCount))
|
|
light.setColor(VBase4(1))
|
|
light.setLens(PerspectiveLens())
|
|
else:
|
|
print 'Invalid light type'
|
|
return None
|
|
# Add the new light
|
|
directLight = DirectLight(light, self)
|
|
self.lightDict[directLight.getName()] = directLight
|
|
# Turn it on as a default
|
|
self.setOn(directLight)
|
|
# Send an event to all watching objects
|
|
messenger.send('DIRECT_addLight', [directLight])
|
|
# Return the new light
|
|
return directLight
|
|
|
|
def createDefaultLights(self):
|
|
self.create('ambient')
|
|
self.create('directional')
|
|
|
|
def allOn(self):
|
|
"""
|
|
Turn on all DIRECT lights
|
|
"""
|
|
for light in self.lightDict.values():
|
|
self.setOn(light)
|
|
# Make sure there is a default material
|
|
render.setMaterial(Material())
|
|
|
|
def allOff(self):
|
|
"""
|
|
Turn off all DIRECT lights
|
|
"""
|
|
for light in self.lightDict.values():
|
|
self.setOff(light)
|
|
|
|
def toggle(self):
|
|
"""
|
|
Toggles light attribute, but doesn't toggle individual lights
|
|
"""
|
|
if render.node().hasAttrib(LightAttrib.getClassType()):
|
|
self.allOff()
|
|
else:
|
|
self.allOn()
|
|
|
|
def setOn(self, directLight):
|
|
"""
|
|
Turn on the given directLight
|
|
"""
|
|
render.setLight(directLight)
|
|
|
|
def setOff(self, directLight):
|
|
"""
|
|
Turn off the given directLight
|
|
"""
|
|
render.clearLight(directLight)
|
|
|
|
|
|
|