示例#1
0
class plLightInfo(plObjInterface):                          #Type 0x54 (Uru)

    Props = \
    { \
        "kDisable"              : 0, \
        "kLPObsolete"           : 1, \
        "kLPCastShadows"        : 2, \
        "kLPMovable"            : 3, \
        "kLPHasIncludes"        : 4, \
        "kLPIncludesChars"      : 5, \
        "kLP_OBSOLECTE_0"       : 6, \
        "kLPOverAll"            : 7, \
        "kLPHasSpecular"        : 8, \
        "kLPShadowOnly"         : 9, \
        "kLPShadowLightGroup"   : 10, \
        "kLPForceProj"          : 11, \
        "kNumProps"             : 12  \
    }

    scriptProps = \
    { \
        "disable"              : 0, \
        "obsolete"             : 1, \
        "castshadows"          : 2, \
        "movable"              : 3, \
        "hasincludes"          : 4, \
        "includeschars"        : 5, \
        "obsolecte_0"          : 6, \
        "overall"              : 7, \
        "hasspecular"          : 8, \
        "shadowonly"           : 9, \
        "shadowlightgroup"     : 10, \
        "forceproj"            : 11, \
    }

    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 read(self,buf):
        plObjInterface.read(self,buf)
        self.ambient.read(buf)
        self.diffuse.read(buf)
        self.specular.read(buf)
        self.LightToLocal.read(buf)
        self.LocalToLight.read(buf)
        self.LightToWorld.read(buf)
        self.WorldToLight.read(buf)
        self.fProjection.read(buf)
        self.softvol.read(buf)
        self.scenenode.read(buf)


        self.visregs.read(buf)

    def write(self,buf):
        plObjInterface.write(self,buf)
        self.ambient.write(buf)
        self.diffuse.write(buf)
        self.specular.write(buf)
        self.LightToLocal.write(buf)
        self.LocalToLight.write(buf)
        self.LightToWorld.write(buf)
        self.WorldToLight.write(buf)
        self.fProjection.write(buf)
        self.softvol.write(buf)
        self.scenenode.write(buf)

        self.visregs.write(buf)

    def changePageRaw(self,sid,did,stype,dtype):
        plObjInterface.changePageRaw(self,sid,did,stype,dtype)
        self.softvol.changePageRaw(sid,did,stype,dtype)
        self.layerint.changePageRaw(sid,did,stype,dtype)
        self.scenenode.changePageRaw(sid,did,stype,dtype)
        self.visregs.changePageRaw(sid,did,stype,dtype)

    def _Import(scnobj,prp,obj):
        # Lights
        for li in  scnobj.data1.vector:
            if li.Key.object_type in [0x55,0x56,0x57]:
                light=prp.findref(li)
                light.data.import_obj(obj)
                break
        # Shadows
        for sh in  scnobj.data1.vector:
            if sh.Key.object_type in [0xD5,0xD6]:
                shadow=prp.findref(sh)
                shadow.data.import_obj(obj)

    Import = staticmethod(_Import)

    def _Export(page,obj,scnobj,name,SceneNodeRef,softVolumeParser):

        # --- Determine Lamp type and Shadow Type ---
        shadow = None
        if obj.data.type==Blender.Lamp.Types["Spot"]:
            # plSpotLightInfo
            lamp=plSpotLightInfo.FindCreate(page,name)
            if obj.data.mode & Blender.Lamp.Modes["RayShadow"]:
                # plPointShadowMaster
                shadow = plPointShadowMaster.FindCreate(page,name)
        elif obj.data.type==Blender.Lamp.Types["Lamp"]:
            # plOmniLightInfo
            lamp=plOmniLightInfo.FindCreate(page,name)
            if obj.data.mode & Blender.Lamp.Modes["RayShadow"]:
                # plPointShadowMaster
                shadow = plPointShadowMaster.FindCreate(page,name)
        elif obj.data.type==Blender.Lamp.Types["Area"]:
            # plLimitedDirLightInfo
            lamp=plLimitedDirLightInfo.FindCreate(page,name)
            if obj.data.mode & Blender.Lamp.Modes["RayShadow"]:
                # plDirectionalShadowMaster
                shadow = plDirectShadowMaster.FindCreate(page,name)
        else:
            # plDirectionalLightInfo
            lamp=plDirectionalLightInfo.FindCreate(page,name)
            if obj.data.mode & Blender.Lamp.Modes["RayShadow"]:
                # plDirectionalShadowMaster
                shadow = plDirectShadowMaster.FindCreate(page,name)

        # --- Check if Lamp has a projection layer --- (HACK WARNING)
        lampscript = AlcScript.objects.Find(obj.getName())
        layername = FindInDict(lampscript,"lamp.layer",None)
        if(layername != None):
            print " Attatching layer: " + layername
            refparser = ScriptRefParser(page, name, 0x0006, [0x0006, 0x0043,])
            layer = refparser.MixedRef_FindCreate(layername)
            lamp.data.fProjection = layer.data.getRef()
            # set the projection flags depending on the lamp type
            if obj.data.type==Blender.Lamp.Types["Spot"]:
                layer.data.fState.fMiscFlags |= hsGMatState.hsGMatMiscFlags["kMiscPerspProjection"]
            elif obj.data.type==Blender.Lamp.Types["Area"]:
                layer.data.fState.fMiscFlags |= hsGMatState.hsGMatMiscFlags["kMiscOrthoProjection"]
            # now we set the uvw transform on the layer
            texMatrix = getMatrix(obj)
            texMatrix.transpose()
            layer.data.fTransform.set(texMatrix)

        # --- Prepare and Export lamp object ---
        lamp.data.parentref=scnobj.data.getRef()
        lamp.data.scenenode=SceneNodeRef
        lamp.data.softVolumeParser = softVolumeParser
        lamp.data.export_object(obj)
        scnobj.data.data1.append(lamp.data.getRef())

        # --- Prepare and Export Shadow object ---
        if shadow != None:
            shadow.data.parentref=scnobj.data.getRef()
            shadow.data.export_obj(obj)
            scnobj.data.data1.append(shadow.data.getRef())

    Export = staticmethod(_Export)