2002-10-12 11:37:38 +00:00
|
|
|
"""The Blender Lamp module
|
|
|
|
|
|
|
|
This module provides control over **Lamp** objects in Blender.
|
|
|
|
|
|
|
|
Example::
|
|
|
|
|
|
|
|
from Blender import Lamp
|
|
|
|
l = Lamp.New('Spot')
|
|
|
|
l.setMode('square', 'shadow')
|
|
|
|
ob = Object.New('Lamp')
|
|
|
|
ob.link(l)
|
|
|
|
"""
|
|
|
|
|
2003-01-06 17:27:43 +00:00
|
|
|
#import _Blender.Lamp as _Lamp
|
2002-10-12 11:37:38 +00:00
|
|
|
import shadow
|
|
|
|
|
|
|
|
_validBufferSizes = [512, 768, 1024, 1536, 2560]
|
|
|
|
|
|
|
|
def _setBufferSize(self, bufsize):
|
|
|
|
"""Set the lamp's buffersize. This function makes sure that a valid
|
|
|
|
bufferSize value is set (unlike setting lamp.bufferSize directly)"""
|
|
|
|
if bufsize not in _validBufferSizes:
|
|
|
|
print """Buffer size should be one of:
|
|
|
|
%s
|
|
|
|
Setting to default 512""" % _validBufferSizes
|
|
|
|
bufsize = 512
|
|
|
|
self._object.bufferSize = bufsize
|
|
|
|
|
|
|
|
class Lamp(shadow.hasIPO, shadow.hasModes):
|
|
|
|
"""Wrapper for Blender Lamp DataBlock
|
|
|
|
|
|
|
|
Attributes
|
|
|
|
|
|
|
|
mode -- Lamp mode value - see EditButtons. Do not access directly
|
|
|
|
See setMode()
|
|
|
|
|
|
|
|
type -- Lamp type value - see EditButtons. No direct access, please.
|
|
|
|
See setType()
|
|
|
|
|
|
|
|
col -- RGB vector (R, G, B) of lamp colour
|
|
|
|
|
|
|
|
energy -- Intensity (float)
|
|
|
|
|
|
|
|
dist -- clipping distance of a spot lamp or decay range
|
|
|
|
|
|
|
|
spotSize -- float angle (in degrees) of spot cone
|
|
|
|
(between 0.0 and 180.0)
|
|
|
|
|
|
|
|
spotBlend -- value defining the blurriness of the spot edge
|
|
|
|
|
|
|
|
haloInt -- Halo intensity
|
|
|
|
|
|
|
|
clipStart -- shadow buffer clipping start
|
|
|
|
|
|
|
|
clipStart -- shadow buffer clipping end
|
|
|
|
|
|
|
|
bias -- The bias value for the shadowbuffer routine
|
|
|
|
|
|
|
|
softness -- The filter value for the shadow blurring
|
|
|
|
|
|
|
|
samples -- Number of samples in shadow calculation - the
|
|
|
|
larger, the better
|
|
|
|
|
|
|
|
bufferSize -- Size of the shadow buffer which should be one of:
|
|
|
|
[512, 768, 1024, 1536, 2560]
|
|
|
|
|
|
|
|
haloStep -- Number of steps in halo calculation - the smaller, the
|
|
|
|
the better (and slower). A value of 0 disables shadow
|
|
|
|
halo calculation
|
|
|
|
"""
|
|
|
|
|
|
|
|
_emulation = {'Energ' : "energy",
|
|
|
|
'SpoSi' : "spotSize",
|
|
|
|
'SpoBl' : "SpotBlend",
|
|
|
|
'HaInt' : "haloInt",
|
|
|
|
'Dist' : "dist",
|
|
|
|
'Quad1' : "quad1",
|
|
|
|
'Quad2' : "quad2",
|
|
|
|
}
|
|
|
|
|
|
|
|
_setters = {'bufferSize' : _setBufferSize}
|
|
|
|
|
|
|
|
t = _Lamp.Types
|
|
|
|
|
|
|
|
Types = {'Lamp' : t.LOCAL,
|
|
|
|
'Spot' : t.SPOT,
|
|
|
|
'Sun' : t.SUN,
|
|
|
|
'Hemi' : t.HEMI,
|
|
|
|
}
|
|
|
|
|
|
|
|
t = _Lamp.Modes
|
|
|
|
|
|
|
|
Modes = {'quad' : t.QUAD,
|
|
|
|
'sphere' : t.SPHERE,
|
|
|
|
'shadow' : t.SHAD,
|
|
|
|
'halo' : t.HALO,
|
|
|
|
'layer' : t.LAYER,
|
|
|
|
'negative' : t.NEG,
|
|
|
|
'onlyShadow' : t.ONLYSHADOW,
|
|
|
|
'square' : t.SQUARE,
|
|
|
|
}
|
|
|
|
|
|
|
|
del t
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return "[Lamp \"%s\"]" % self.name
|
|
|
|
|
|
|
|
def setType(self, name):
|
|
|
|
"""Set the Lamp type of Lamp 'self'. 'name' must be a string of:
|
|
|
|
|
|
|
|
* 'Lamp': A standard point light source
|
|
|
|
|
|
|
|
* 'Spot': A spot light
|
|
|
|
|
|
|
|
* 'Sun' : A unidirectional light source, very far away (like a Sun!)
|
|
|
|
|
|
|
|
* 'Hemi': A diffuse hemispherical light source (daylight without sun)"""
|
|
|
|
|
|
|
|
try:
|
|
|
|
self._object.type = self.Types[name]
|
|
|
|
except:
|
|
|
|
raise TypeError, "type must be one of %s" % self.Types.keys()
|
|
|
|
|
|
|
|
def getType(self):
|
|
|
|
"""Returns the lamp's type as string. See setType()"""
|
|
|
|
for k in self.Types.keys():
|
|
|
|
if self.Types[k] == self.type:
|
|
|
|
return k
|
|
|
|
|
|
|
|
def getMode(self):
|
|
|
|
"""Returns the Lamp modes as a list of strings"""
|
|
|
|
return shadow._getModeBits(self.Modes, self._object.mode)
|
|
|
|
|
|
|
|
def setMode(self, *args):
|
|
|
|
"""Set the Lamp mode of Lamp 'self'. This function takes a variable number
|
|
|
|
of string arguments of the types listed in self.Modes.
|
|
|
|
|
|
|
|
Example::
|
|
|
|
|
|
|
|
l = Lamp.New()
|
|
|
|
l.setMode('quad', 'shadow')
|
|
|
|
"""
|
|
|
|
print args
|
|
|
|
self._object.mode = shadow._setModeBits(self.Modes, args)
|
|
|
|
|
|
|
|
def getBufferSize(self):
|
|
|
|
return self.bufferSize
|
|
|
|
|
|
|
|
def New(type = "Lamp", name = "Lamp"):
|
|
|
|
"""Returns a new Lamp datablock of type 'type' and optional name 'name'
|
|
|
|
"""
|
|
|
|
t = Lamp.Types[type]
|
|
|
|
rawlamp = _Lamp.New()
|
|
|
|
rawlamp.type = t
|
|
|
|
rawlamp.name = name
|
|
|
|
return Lamp(rawlamp)
|
|
|
|
|
|
|
|
|
|
|
|
def get(name = None):
|
|
|
|
"""If 'name' given, the Lamp 'name' is returned if existing, 'None' otherwise.
|
|
|
|
If no name is given, a list of all Lamps is returned"""
|
|
|
|
|
|
|
|
if name:
|
|
|
|
return Lamp(_Lamp.get(name))
|
|
|
|
else:
|
|
|
|
return shadow._List(_Lamp.get(), Lamp)
|
|
|
|
|
|
|
|
Types = _Lamp.Types
|