| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633 |
- #################################################################
- # seLights.py
- # Written by Yi-Hong Lin, [email protected], 2004
- #################################################################
- from direct.showbase.DirectObject import *
- from string import lower
- from direct.directtools import DirectUtil
- from pandac.PandaModules import *
- import string
- class seLight(NodePath):
- #################################################################
- # seLight(NodePath)
- # This is an object for keeping light data and let we can manipulate
- # lights as otherNopaths.
- # This idea basically is from directLight.
- # But the way directLight object worked is not we want in our
- # sceneEditor. So, we wrote one by ourself.
- #################################################################
- def __init__(self, light, parent, type,
- lightcolor=VBase4(0.3,0.3,0.3,1),
- specularColor = VBase4(1),
- position = Point3(0,0,0),
- orientation = Vec3(1,0,0),
- constant = 1.0,
- linear = 0.0,
- quadratic = 0.0,
- exponent = 0.0,
- tag="",
- lence = None):
- #################################################################
- # __init__(self, light, parent, type,
- # lightcolor=VBase4(0.3,0.3,0.3,1),
- # specularColor = VBase4(1),
- # position = Point3(0,0,0),
- # orientation = Vec3(1,0,0),
- # constant = 1.0,
- # linear = 0.0,
- # quadratic = 0.0,
- # exponent = 0.0,
- # tag="",
- # lence = None):
- # This constructor will create a light node inside it and upcast
- # this light node to itself as a nodePath.
- # Also, it will load a model as a reference to itself on the secene so that
- # user can easily recognize where is the light and can easily manipulate
- # by mouse picking and widget control.
- #################################################################
- # Initialize the super class
- NodePath.__init__(self)
- # Initialize and save values
- self.light = light
- self.type = type
- self.lightcolor=lightcolor
- self.specularColor = specularColor
- self.position = position
- self.orientation = orientation
- self.constant = constant
- self.linear = linear
- self.quadratic = quadratic
- self.exponent = exponent
- self.lence = lence
- self.active = True
-
- if isinstance(light, Spotlight):
- node = light.upcastToLensNode()
- else:
- node = light.upcastToPandaNode()
- # Attach node to self
- self.LightNode=parent.attachNewNode(node)
- self.LightNode.setTag("Metadata",tag)
- if(self.type=='spot'):
- self.LightNode.setHpr(self.orientation)
- self.LightNode.setPos(self.position)
- else:
- self.LightNode.setHpr(self.orientation)
- self.LightNode.setPos(self.position)
-
-
- self.assign(self.LightNode)
- if(self.type=='spot'):
- self.helpModel = loader.loadModel( "models/misc/Spotlight" )
- elif(self.type=='point'):
- self.helpModel = loader.loadModel( "models/misc/Pointlight" )
- elif(self.type=='directional'):
- self.helpModel = loader.loadModel( "models/misc/Dirlight" )
- else:
- self.helpModel = loader.loadModel( "models/misc/sphere" )
- self.helpModel.setColor(self.lightcolor)
- self.helpModel.reparentTo(self)
- DirectUtil.useDirectRenderStyle(self.helpModel)
- if not ((self.type == 'directional')or(self.type == 'point')or(self.type == 'spot')):
- self.helpModel.hide()
- def getLight(self):
- #################################################################
- # getLight(self)
- # This function will return the light object it contains.
- #################################################################
-
- return self.light
- def getLightColor(self):
- #################################################################
- # getLightColor(self)
- # This function will return the color of the light color of this light node.
- #################################################################
- return self.lightcolor
-
- def getName(self):
- #################################################################
- # getName(self)
- # This function will return the name of this light.
- #################################################################
- return self.light.getName()
-
- def rename(self,name):
- #################################################################
- # rename(self, name)
- # User should specify a string object, name, as the new name of this
- # light node. This function will rename itself and light object
- # to this new name.
- #################################################################
- self.light.setName(name)
- self.setName(name)
- def getType(self):
- #################################################################
- # getType(self)
- # This function will return a string which is the type of this
- # light node. (We only have four types of light)
- #################################################################
- return self.type
- def setColor(self,color):
- #################################################################
- # setColor(self, color)
- # This function takes one input parameter, color, which is a
- # VBase4 object. This function will simply set this object into
- # light node it has to change the property of light.
- # Also, if the light type is either "directional" or "point", which
- # means it has a reference model with it, this function will also
- # change the reference model's color to input value.
- #################################################################
- self.light.setColor(color)
- self.lightcolor = color
- if (self.type == 'directional')or(self.type == 'point'):
- self.helpModel.setColor(self.lightcolor)
- return
- def getSpecColor(self):
- #################################################################
- # getSpecColor(self)
- # This function will return the specular color of the light.
- # Although you can call this function for all kinds of light,
- # it will only meanful if this light is not a ambient light.
- #################################################################
- return self.specularColor
- def setSpecColor(self,color):
- #################################################################
- # setSpecColor(self, color)
- # This function can be used to set the specular color of the light.
- # Although you can call this function for all kinds of light,
- # it will only meanful if the light type is not "ambient"
- #################################################################
- self.light.setSpecularColor(color)
- self.specularcolor = color
- return
- def getPosition(self):
- #################################################################
- # getPosition(self)
- # getPosition(self)
- # This functioln will return a Point3 object which contains
- # the x, y, z position data of this light node.
- # It only has meaning for "point Light" and "Directional light"
- #################################################################
- self.position = self.LightNode.getPos()
- return self.position
- def setPosition(self, pos):
- #################################################################
- # setPosition(self, pos)
- # This function will take a Point3 object as a input.
- # Then, this function will set the itself andd light node to the
- # target point.
- #################################################################
- self.LightNode.setPos(pos)
- self.position = pos
- return
- def getOrientation(self):
- #################################################################
- # getOrientation(self)
- # This function will return a Vec3-type object which contains the
- # orientation data of this light node
- #
- # This function will only have meaning for point light and directional light.
- #
- #################################################################
- self.orientation = self.LightNode.getHpr()
- return self.orientation
-
- def setOrientation(self,orient):
- #################################################################
- # setOrientation(self, orient)
- # This funtction will take a Vec3-type object as an input.
- # Then this function will set itself nad light node to face
- # the target orientation.
- #
- # This function only has meaning for point light and directional light
- # type of lights.
- #
- #################################################################
- self.LightNode.setHpr(orient)
- self.orientation = orient
- return
- def getAttenuation(self):
- #################################################################
- # getAttenuation(self)
- # This function will return a Vec3 type of object which contains
- # the constant, linear and quadratic attenuation for this light node.
- #
- # This function will only have meaning for point light and spot light
- # tyoe of lights.
- #
- #################################################################
- return Vec3(self.constant,self.linear,self.quadratic)
- def setConstantAttenuation(self, value):
- #################################################################
- # setConstantAttenuation(self, value)
- # This function will take a float number as an input.
- # Then, this function will set the Constant Atenuation value
- # to this number.
- #################################################################
- self.light.setAttenuation(Vec3(value, self.linear, self.quadratic))
- self.constant = value
- return
-
- def setLinearAttenuation(self, value):
- #################################################################
- # setLinearAttenuation(self, value)
- # This function will take a float number as an input.
- # Then, this function will set the Linear Atenuation value
- # to this number.
- #################################################################
- self.light.setAttenuation(Vec3(self.constant, value, self.quadratic))
- self.linear = value
- return
-
- def setQuadraticAttenuation(self, value):
- #################################################################
- # setQuadraticAttenuation(self, value)
- # This function will take a float number as an input.
- # Then, this function will set the Quadratic Atenuation value
- # to this number.
- #################################################################
- self.light.setAttenuation(Vec3(self.constant, self.linear, value))
- self.quadratic = value
- return
- def getExponent(self):
- #################################################################
- # getExponent(self)
- # This function will return the value of the Exponent Attenuation
- # of this light node. (float)
- #################################################################
- return self.exponent
- def setExponent(self, value):
- #################################################################
- # setExponent(self, value)
- # This function will take a float number as an input.
- # Then, this function will set the Exponent Atenuation value
- # to this number.
- #################################################################
- self.light.setExponent(value)
- self.exponent = value
- return
-
- class seLightManager(NodePath):
- #################################################################
- # seLightManager(NodePath)
- # This is the class we used to control al lightings in our sceneEditor.
- #################################################################
- def __init__(self):
- # Initialize the superclass
- NodePath.__init__(self)
- # Create a node for the lights
- self.lnode=render.attachNewNode('Lights')
- self.assign(self.lnode)
- # Create a light attrib
- self.lightAttrib = LightAttrib.makeAllOff()
- self.lightDict = {}
- self.ambientCount = 0
- self.directionalCount = 0
- self.pointCount = 0
- self.spotCount = 0
- # Originally, we don't do this load model thing.
- # But the problem is, if we don't, then it will cause some
- # Bounding calculation error...
- self.helpModel = loader.loadModel( "models/misc/sphere" )
- self.helpModel.reparentTo(self)
- self.helpModel.hide()
-
- def create(self, type = 'ambient',
- lightcolor=VBase4(0.3,0.3,0.3,1),
- specularColor = VBase4(1),
- position = Point3(0,0,0),
- orientation = Vec3(1,0,0),
- constant = 1.0,
- linear = 0.0,
- quadratic = 0.0,
- exponent = 0.0,
- tag= "",
- name='DEFAULT_NAME'):
- #################################################################
- # create(self, type = 'ambient',
- # lightcolor=VBase4(0.3,0.3,0.3,1),
- # specularColor = VBase4(1),
- # position = Point3(0,0,0),
- # orientation = Vec3(1,0,0),
- # constant = 1.0,
- # linear = 0.0,
- # quadratic = 0.0,
- # exponent = 0.0,
- # tag= "",
- # name='DEFAULT_NAME')
- # As you can see, once user call this function and specify those
- # variables, this function will create a seLight node.
- # In the default, the light which just has been created will be
- # set to off.
- #################################################################
- ### create the light
- lence = None
-
- if type == 'ambient':
- self.ambientCount += 1
- if(name=='DEFAULT_NAME'):
- light = AmbientLight('ambient_' + `self.ambientCount`)
- else:
- light = AmbientLight(name)
- light.setColor(lightcolor)
- elif type == 'directional':
- self.directionalCount += 1
- if(name=='DEFAULT_NAME'):
- light = DirectionalLight('directional_' + `self.directionalCount`)
- else:
- light = DirectionalLight(name)
- light.setColor(lightcolor)
- light.setSpecularColor(specularColor)
- elif type == 'point':
- self.pointCount += 1
- if(name=='DEFAULT_NAME'):
- light = PointLight('point_' + `self.pointCount`)
- else:
- light = PointLight(name)
-
- light.setColor(lightcolor)
- light.setSpecularColor(specularColor)
- light.setAttenuation(Vec3(constant, linear, quadratic))
- elif type == 'spot':
- self.spotCount += 1
- if(name=='DEFAULT_NAME'):
- light = Spotlight('spot_' + `self.spotCount`)
- else:
- light = Spotlight(name)
- light.setColor(lightcolor)
- lence = PerspectiveLens()
- light.setLens(lence)
- light.setSpecularColor(specularColor)
- light.setAttenuation(Vec3(constant, linear, quadratic))
- light.setExponent(exponent)
- else:
- print 'Invalid light type'
- return None
- # Create the seLight objects and put the light object we just created into it.
- lightNode = seLight(light,self,type,
- lightcolor=lightcolor,
- specularColor = specularColor,
- position = position,
- orientation = orientation,
- constant = constant,
- linear = linear,
- quadratic = quadratic,
- exponent = exponent,
- tag=tag,
- lence = lence
- )
- self.lightDict[light.getName()] = lightNode
- self.setOn(lightNode)
-
- return self.lightDict.keys(),lightNode
- def addLight(self, light):
- #################################################################
- # addLight(self, light)
- # This function will put light in and save its properties in to a seLight Node
- # Attention!!
- # only Spotlight obj nneds to be specified a lens node first. i.e. setLens() first!
- #################################################################
- type = lower(light.getType().getName())
- light.upcastToNamable()
- specularColor = VBase4(1)
- position = Point3(0,0,0)
- orientation = Vec3(1,0,0)
- constant = 1.0
- linear = 0.0
- quadratic = 0.0
- exponent = 0.0
- lence = None
- lightcolor = light.getColor()
- if type == 'ambientlight':
- type = 'ambient'
- self.ambientCount += 1
- elif type == 'directionallight':
- type = 'directional'
- self.directionalCount += 1
- orientation = light.getDirection()
- position = light.getPoint()
- specularColor = light.getSpecularColor()
- elif type == 'pointlight':
- type = 'point'
- self.pointCount += 1
- position = light.getPoint()
- specularColor = light.getSpecularColor()
- Attenuation = light.getAttenuation()
- constant = Attenuation.getX()
- linear = Attenuation.getY()
- quadratic = Attenuation.getZ()
- elif type == 'spotlight':
- type = 'spot'
- self.spotCount += 1
- specularColor = light.getSpecularColor()
- Attenuation = light.getAttenuation()
- constant = Attenuation.getX()
- linear = Attenuation.getY()
- quadratic = Attenuation.getZ()
- exponent = light.getExponent()
- else:
- print 'Invalid light type'
- return None
- lightNode = seLight(light,self,type,
- lightcolor=lightcolor,
- specularColor = specularColor,
- position = position,
- orientation = orientation,
- constant = constant,
- linear = linear,
- quadratic = quadratic,
- exponent = exponent,
- lence = lence)
- self.lightDict[light.getName()] = lightNode
- self.setOn(lightNode)
- return self.lightDict.keys(),lightNode
- def delete(self, name, removeEntry = True):
- #################################################################
- # delete(self, name, removeEntry = True)
- # This function will remove light node had the same name with user input.
- # Also, you can specify the removeEntry to decide to remove the entry from the lightDict or not.
- # Normaly, you alway want to remove the entry from the dictionary. Thsi is only used for "deleteAll" function.
- #################################################################
- type = self.lightDict[name].getType()
- if type == 'ambient':
- self.ambientCount -= 1
- elif type == 'directional':
- self.directionalCount -= 1
- elif type == 'point':
- self.pointCount -= 1
- elif type == 'spot':
- self.spotCount -= 1
- self.setOff(self.lightDict[name])
- self.lightDict[name].removeChildren()
- self.lightDict[name].removeNode()
- if removeEntry:
- del self.lightDict[name]
- return self.lightDict.keys()
- def deleteAll(self):
- #################################################################
- # deleteAll(self)
- # This function will keep calling delete and put exist lights in
- # until all lights have been eliminated.
- #################################################################
- for name in self.lightDict:
- self.delete(name, removeEntry = False)
-
- self.lightDict.clear()
- def isLight(self,name):
- #################################################################
- # isLight(self.name)
- # Use a string as a index to check if there existing a light named "name"
- #################################################################
- return self.lightDict.has_key(name)
- def rename(self,oName,nName):
- #################################################################
- # rename(self, oName, nName)
- # This function will reanem the light named "oName(String)" to
- # nName(String)
- #################################################################
- if self.isLight(oName):
- lightNode = self.lightDict[oName]
- self.lightDict[nName] = lightNode
- lightNode.rename(nName)
- del self.lightDict[oName]
- return self.lightDict.keys(),lightNode
- else:
- print '----Light Mnager: No such Light!'
-
- def getLightNodeList(self):
- #################################################################
- # getLightNodeList(self)
- # Return a list which contains all seLight nodes
- #################################################################
- list = []
- for name in self.lightDict:
- list.append(self.lightDict[name])
- return list
- def getLightNodeDict(self):
- #################################################################
- # getLightNodeDict(self)
- # Return the light dictionary itself.
- #
- # Attention!
- # Because it doesn't make a copy when you return a dictionary, it
- # means when you can change the value from outside and that change
- # will directly reflect back to here.
- #
- #################################################################
- return self.lightDict
- def getLightList(self):
- #################################################################
- # getLightList(self)
- # Return a list which contains names of all lights.
- #################################################################
- list = []
- for name in self.lightDict:
- list.append(name)
- return list
- def getLightNode(self,lightName):
- #################################################################
- # getLightNode(self, lightName)
- # This function will return a seLight Node using a string, lightName. as a index.
- #################################################################
- if lightName in self.lightDict:
- return self.lightDict[lightName]
- def allOn(self):
- #################################################################
- # allOb(self)
- # Enable the lighting system.
- #################################################################
- # Turn on all lighting
- render.node().setAttrib(self.lightAttrib)
- # Make sure there is a default material
- render.setMaterial(Material())
- def allOff(self):
- #################################################################
- # allOff(self)
- # Disable whole lighting system
- #################################################################
- # Turn off all lighting
- render.node().clearAttrib(LightAttrib.getClassType())
- def toggle(self):
- #################################################################
- # 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, lightNode):
- #################################################################
- # setOn(lightNode)
- # This function will enable the input seLight node.
- # If the light system itself is down, activate it.
- #################################################################
- self.lightAttrib = self.lightAttrib.addLight(lightNode.getLight())
- lightNode.active = True
- if render.node().hasAttrib(LightAttrib.getClassType()):
- render.node().setAttrib(self.lightAttrib)
-
- def setOff(self, lightNode):
- #################################################################
- # setOff(self, lightNode)
- # This function will disable the input seLight node
- # If the light system itself is down, activate it.
- #################################################################
- lightNode.active = False
- self.lightAttrib = self.lightAttrib.removeLight(lightNode.getLight())
- if render.node().hasAttrib(LightAttrib.getClassType()):
- render.node().setAttrib(self.lightAttrib)
- def getList(self):
- #################################################################
- # getList(self)
- # This function actually has the same functionality with getLightList(),
- # but this one should be more efficient.
- #################################################################
- return self.lightDict.keys()
|