Browse Source

Implement projection lamps

pull/38/head
Adam Johnson 9 years ago
parent
commit
12e5f8177a
  1. 47
      korman/exporter/rtlight.py

47
korman/exporter/rtlight.py

@ -162,9 +162,51 @@ class LightConverter:
sv_key = sv_mod.get_key(self._exporter()) sv_key = sv_mod.get_key(self._exporter())
pl_light.softVolume = sv_key pl_light.softVolume = sv_key
# Is this a projector?
projectors = tuple(self.get_projectors(bl_light))
if projectors:
self._export_rt_projector(bo, pl_light, projectors)
# *Sigh* # *Sigh*
pl_light.sceneNode = self.mgr.get_scene_node(location=so.key.location) pl_light.sceneNode = self.mgr.get_scene_node(location=so.key.location)
def _export_rt_projector(self, bo, pl_light, tex_slots):
mat = self._exporter().mesh.material
slot = tex_slots[0]
# There is a Material available in the caller, but that is for the parent Mesh. We are a
# projection Lamp with our own faux Material. Unfortunately, Plasma only supports projecting
# one layer. We could exploit the fUnderLay and fOverLay system to export everything, but meh.
if len(tex_slots) > 1:
self._exporter().warn("Only one texture slot can be exported per Lamp. Picking the first one: '{}'".format(slot.name), indent=3)
layer = mat.export_texture_slot(bo, None, None, tex_slots, 0, blend_flags=False)
state = layer.state
# Colors science'd from PRPs
layer.preshade = hsColorRGBA(0.5, 0.5, 0.5)
layer.runtime = hsColorRGBA(0.5, 0.5, 0.5)
# Props for projectors...
# Note that we tell the material exporter to (try not to) do any blend flags for us
layer.UVWSrc |= plLayer.kUVWPosition
if bo.data.type == "SPOT":
state.miscFlags |= hsGMatState.kMiscPerspProjection
else:
state.miscFlags |= hsGMatState.kMiscOrthoProjection
state.ZFlags |= hsGMatState.kZNoZWrite
pl_light.setProperty(plLightInfo.kLPMovable, True)
pl_light.setProperty(plLightInfo.kLPCastShadows, False)
if slot.blend_type == "ADD":
state.blendFlags |= hsGMatState.kBlendAdd
pl_light.setProperty(plLightInfo.kLPOverAll, True)
elif slot.blend_type == "MULTIPLY":
# From PlasmaMAX
state.blendFlags |= hsGMatState.kBlendMult | hsGMatState.kBlendInvertColor | hsGMatState.kBlendInvertFinalColor
pl_light.setProperty(plLightInfo.kLPOverAll, True)
pl_light.projection = layer.key
def find_material_light_keys(self, bo, bm): def find_material_light_keys(self, bo, bm):
"""Given a blender material, we find the keys of all matching Plasma RT Lights. """Given a blender material, we find the keys of all matching Plasma RT Lights.
NOTE: We return a tuple of lists: ([permaLights], [permaProjs])""" NOTE: We return a tuple of lists: ([permaLights], [permaProjs])"""
@ -218,6 +260,11 @@ class LightConverter:
except LookupError: except LookupError:
raise BlenderOptionNotSupportedError("Object ('{}') lamp type '{}'".format(bo.name, bl_light.type)) raise BlenderOptionNotSupportedError("Object ('{}') lamp type '{}'".format(bo.name, bl_light.type))
def get_projectors(self, bl_light):
for tex in bl_light.texture_slots:
if tex is not None and tex.texture is not None:
yield tex
def _is_projection_lamp(self, bl_light): def _is_projection_lamp(self, bl_light):
for tex in bl_light.texture_slots: for tex in bl_light.texture_slots:
if tex is None or tex.texture is None: if tex is None or tex.texture is None:

Loading…
Cancel
Save