def __init__(self,parent,name="unnamed",type=None): plObjInterface.__init__(self,parent,name,type) try: #Quick, dirty fix for NameError bug with classes from prp_GeomClasses self.ambient = RGBA('1.0','1.0','1.0','1.0',type=1) except NameError: #print "Damnit! Need reimport prp_GeomClasses.py" from prp_GeomClasses import RGBA,hsMatrix44 self.ambient = RGBA('1.0','1.0','1.0','1.0',type=1) self.diffuse = RGBA() self.specular = RGBA() self.LightToLocal = hsMatrix44() self.LocalToLight = hsMatrix44() self.LightToWorld = hsMatrix44() self.WorldToLight = hsMatrix44() self.fProjection = UruObjectRef(self.getVersion()) #plLayerInterface self.softvol = UruObjectRef(self.getVersion()) #plSoftVolume self.scenenode = UruObjectRef(self.getVersion()) #Dunno self.visregs = hsTArray([],self.getVersion()) #plVisRegion[]
def export_object(self,obj): lamp=obj.data objscript = AlcScript.objects.Find(obj.getName()) print " [Light Base]\n"; #set lighting flags try: p=obj.getProperty("flags") name=str(p.getData()) while len(name)<8: name = "0" + name b=binascii.unhexlify(str(name)) l,=struct.unpack(">I",b) except (AttributeError, RuntimeError): l=0 self.BitFlags.append(l) # Determine negative lighting.... if lamp.mode & (Lamp.Modes["Negative"]): print " >>>Negative light<<<" R = 0.0 - lamp.R G = 0.0 - lamp.G B = 0.0 - lamp.B else: R = lamp.R G = lamp.G B = lamp.B # Plasma has the same Lights as DirectX: # energy = lamp.energy * 2 # Diffuse: if lamp.mode & (Lamp.Modes["NoDiffuse"]): print " Diffuse Lighting Disabled"; self.diffuse=RGBA(0.0,0.0,0.0,1.0,type=1) else: print " Diffuse Lighting Enabled"; self.diffuse=RGBA(R*energy,G*energy,B*energy,1.0,type=1) # Specular if lamp.mode & (Lamp.Modes["NoSpecular"]): print " Specular Lighting Disabled"; self.specular=RGBA(0.0,0.0,0.0,1.0,type=1) else: print " Specular Lighting Enabled"; self.specular=RGBA(R*energy,G*energy,B*energy,1.0,type=1) # Ambient: # Light not directly emitted by the light source, but present because of it. # If one wants to use a lamp as ambient, disable both diffuse and specular colors # Else, it's just set to 0,0,0 aka not used. if lamp.mode & (Lamp.Modes["NoSpecular"] | Lamp.Modes["NoDiffuse"]): print " Lamp is set as ambient light" self.ambient = RGBA(R * energy, G * energy, B * energy,1.0,type=1) else: self.ambient = RGBA(0.0, 0.0, 0.0, 0.0, type=1) # Now Calculate the matrix: m=getMatrix(obj) m.transpose() # Note: # In Blender, the Light cannot be moved in local space, # so Light To Local is not needed, and can remain a unity matrix. # # # self.LightToLocal.set(m) # self.LocalToLight.set(m) self.LightToWorld.set(m) m.invert() self.WorldToLight.set(m) #Set some shadow flags if lamp.mode & (Lamp.Modes["RayShadow"]): if prp_Config.ver2==11: #Added because UU crashes on kLPCastShadows. Shadow is cast anyway because of kSelfShadow. #So do we need this flag at all? print " >>> !kLPCastShadows <<< UU compatible" self.BitFlags[plLightInfo.Props["kLPCastShadows"]] = 0 else: print " >>> kLPCastShadows <<<" self.BitFlags[plLightInfo.Props["kLPCastShadows"]] = 1 else: print " >>> !kLPCastShadows <<<" self.BitFlags[plLightInfo.Props["kLPCastShadows"]] = 0 if lamp.mode & (Lamp.Modes["OnlyShadow"]): print " >>> kLPShadowOnly <<<" self.BitFlags[plLightInfo.Props["kLPShadowOnly"]] = 1 else: print " >>> !kLPShadowOnly <<<" self.BitFlags[plLightInfo.Props["kLPShadowOnly"]] = 0 # Set the soft volume propString = FindInDict(objscript,"lamp.softvolume") propString = getTextPropertyOrDefault(obj,"softvolume",propString) if (propString != None): if(self.softVolumeParser != None and self.softVolumeParser.isStringProperty(propString)): self.softvol = self.softVolumeParser.parseProperty(propString,str(self.Key.name)) else: refparser = ScriptRefParser(self.getRoot(),str(self.Key.name),"softvolume") volume = refparser.MixedRef_FindCreate(propString) self.softvol = volume.data.getRef() propString = FindInDict(objscript,"lamp.visregions", []) if type(propString) == list: for reg in propString: if (reg != None): if(self.softVolumeParser != None and self.softVolumeParser.isStringProperty(str(reg))): volume = self.softVolumeParser.parseProperty(str(reg),str(self.Key.name)) else: refparser = ScriptRefParser(self.getRoot(),str(self.Key.name),"softvolume") volume = refparser.MixedRef_FindCreateRef(reg) vr = self.getRoot().find(0x0116, volume.Key.name, 1) vr.data.scenenode = self.scenenode vr.data.BitFlags.clear() vr.data.BitFlags.SetBit(plVisRegion.VecFlags["kReplaceNormal"]) vr.data.fRegion = volume self.visregs.append(vr.data.getRef()) flags = FindInDict(objscript,"lamp.flags",None) if type(flags) == list: self.BitFlags = hsBitVector() # reset for flag in flags: if flag.lower() in plLightInfo.scriptProps: print " set flag: " + flag.lower() idx = plLightInfo.scriptProps[flag.lower()] self.BitFlags.SetBit(idx)