示例#1
0
    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[]
示例#2
0
    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)