Example #1
0
def GetDefaultParametersFromMetashader(metaShaderName):
    materialMap = {}
    metaLib = LoadMetaMaterialLibrary()
    shaderInfo = metaLib[metaShaderName]
    for area in shaderInfo:
        shader = area['shader']
        mat = trinity.Tr2ShaderMaterial()
        mat.highLevelShaderName = shader
        if 'situation' in area:
            mat.defaultSituation = area['situation']
        mat.BindLowLevelShader([])
        if mat.highLevelShader:
            for desc in mat.highLevelShader.parameterDescriptions:
                defVal = None
                if hasattr(desc, 'CreateDefaultParameter'):
                    defVal = desc.CreateDefaultParameter()
                materialMap[desc.parameterName] = MetaMaterialParam(
                    name=desc.parameterName,
                    desc=desc,
                    value=defVal,
                    default=defVal)

        del mat

    return materialMap
Example #2
0
def ConvertEffectToTr2ShaderMaterial(fx, defaultSituation = None, meshName = None):
    if hasattr(fx, 'effectFilePath'):
        fxpath = fx.effectFilePath.lower()
        newMaterial = trinity.Tr2ShaderMaterial()
        if defaultSituation is not None:
            newMaterial.defaultSituation = defaultSituation
        if hasattr(fx, 'name'):
            name = fx.name.lower()
            if name.startswith('c_eyes'):
                newMaterial.defaultSituation = newMaterial.defaultSituation + ' EyeShader'
        if 'double' in fxpath:
            newMaterial.highLevelShaderName = 'SkinnedAvatarBRDFDouble'
            CopyCommonAvatarMaterialParams(newMaterial, fx, meshName)
            CopyParameters(fx, newMaterial, set({'Material2LibraryID',
             'Material2SpecularCurve',
             'Material2SpecularColor',
             'Material2SpecularFactors'}))
            if pd.IsSkin(fx):
                newMaterial.defaultSituation = newMaterial.defaultSituation + ' Skin'
            return newMaterial
        if 'eyeshader' in fxpath or 'skinnedavatarbrdf' in fxpath or 'portraitbasic' in fxpath:
            newMaterial.highLevelShaderName = 'SkinnedAvatarBrdf'
            CopyCommonAvatarMaterialParams(newMaterial, fx, meshName)
            if pd.IsSkin(fx):
                newMaterial.defaultSituation = newMaterial.defaultSituation + ' Skin'
            return newMaterial
        if 'skinnedavatar' in fxpath:
            newMaterial.highLevelShaderName = 'SkinnedAvatar'
            CopyCommonAvatarMaterialParams(newMaterial, fx, meshName)
            return newMaterial
        if 'clothavatar' in fxpath:
            newMaterial.highLevelShaderName = 'ClothAvatar'
            CopyCommonAvatarMaterialParams(newMaterial, fx, meshName)
            return newMaterial
    return fx
Example #3
0
def ConvertDepthNormalAreaToTr2ShaderMaterial(area):
    if area.effect is None:
        return 0
    if type(area.effect) is trinity.Tr2ShaderMaterial:
        return 0
    originalEffect = area.effect
    newMaterial = trinity.Tr2ShaderMaterial()
    newMaterial.highLevelShaderName = 'NormalDepth'
    if 'skinned' in originalEffect.effectFilePath.lower():
        if 'decal' in originalEffect.effectFilePath.lower():
            newMaterial.name = 'Skinned_Cutout_NormalDepth'
            newMaterial.defaultSituation = 'AlphaCutout'
        elif 'alphatest' in originalEffect.effectFilePath.lower():
            newMaterial.name = 'Skinned_Cutout_NormalDepth'
            newMaterial.defaultSituation = 'AlphaCutout'
        else:
            newMaterial.name = 'Skinned_Opaque_NormalDepth'
            newMaterial.defaultSituation = ''
    elif 'decal' in originalEffect.effectFilePath.lower():
        newMaterial.name = 'Cutout_NormalDepth'
        newMaterial.defaultSituation = 'AlphaCutout'
    elif 'alphatest' in originalEffect.effectFilePath.lower():
        newMaterial.name = 'Cutout_NormalDepth'
        newMaterial.defaultSituation = 'AlphaCutout'
    else:
        newMaterial.name = 'Opaque_NormalDepth'
        newMaterial.defaultSituation = ''
    newParam = CopyResourceByName(area.effect, 'NormalMap')
    if newParam is not None:
        newMaterial.parameters['NormalMap'] = newParam
    newParam = CopyResourceByName(area.effect, 'SpecularMap')
    if newParam is not None:
        newMaterial.parameters['SpecularMap'] = newParam
    newParam = CopyVector4Parameter(area.effect, 'TransformUV0')
    if newParam is not None:
        newMaterial.parameters['TransformUV0'] = newParam
    newParam = CopyVector4Parameter(area.effect, 'MaterialSpecularCurve')
    if newParam is not None:
        newMaterial.parameters['MaterialSpecularCurve'] = newParam
    newParam = CopyVector4Parameter(area.effect, 'MaterialLibraryID')
    if newParam is None:
        newParam = trinity.Tr2Vector4Parameter()
        newParam.name = 'MaterialLibraryID'
        newParam.value = (11, 0, 0, 0)
    newMaterial.parameters['MaterialLibraryID'] = newParam
    if 'decal' in originalEffect.effectFilePath.lower():
        newParam = CopyVector4Parameter(area.effect, 'MaterialDiffuseColor')
        if newParam is not None:
            newMaterial.parameters['MaterialDiffuseColor'] = newParam
        newParam = CopyResourceByName(area.effect, 'DiffuseMap')
        if newParam is not None:
            newMaterial.parameters['DiffuseMap'] = newParam
        newParam = CopyFloatParameter(area.effect, 'CutMaskInfluence')
        if newParam is not None:
            newMaterial.parameters['CutMaskInfluence'] = newParam
    area.effect = newMaterial
    return 1
def CopyHairShader(fx):
    newMaterial = trinity.Tr2ShaderMaterial()
    lowPath = fx.effectFilePath.lower()
    newMaterial.highLevelShaderName = 'Hair'
    if 'detailed' in lowPath:
        newMaterial.defaultSituation = 'Detailed'
    if 'dxt5n' in lowPath:
        newMaterial.defaultSituation = newMaterial.defaultSituation + ' OPT_USE_DXT5N'
    CopyCommonAvatarMaterialParams(newMaterial, fx)
    CopyResources(fx, newMaterial, {'TangentSampler'})
    CopyParameters(
        fx, newMaterial, {
            'HairParameters', 'HairSpecularFactors1', 'HairSpecularFactors2',
            'HairSpecularColor1', 'HairSpecularColor2', 'TangentMapParameters',
            'HairDiffuseBias'
        })
    return newMaterial
    def Initialize(self, size, speed, amplitude, tiling, texturePath):
        """
        Initializes the output texture, render job, builds render steps.
        Returns the output texture.
        """
        def TextureDestroyed():
            """
            Closure for weakref callback. Destroys the
            render job.
            """
            self.Destroy()

        texture = trinity.Tr2RenderTarget(size, size, 1,
                                          trinity.PIXEL_FORMAT.B8G8R8A8_UNORM)
        self.name = 'Caustics'
        self.size = size
        self.texture = blue.BluePythonWeakRef(texture)
        self.texture.callback = TextureDestroyed
        self.steps.append(trinity.TriStepPushRenderTarget(texture))
        self.steps.append(trinity.TriStepClear((0, 0, 0, 0)))
        self.steps.append(trinity.TriStepSetStdRndStates(
            trinity.RM_FULLSCREEN))
        material = trinity.Tr2ShaderMaterial()
        material.highLevelShaderName = 'Caustics'
        param = trinity.TriTexture2DParameter()
        param.name = 'Texture'
        param.resourcePath = texturePath
        material.parameters['Texture'] = param
        param = trinity.Tr2FloatParameter()
        param.name = 'Speed'
        param.value = speed
        material.parameters['Speed'] = param
        param = trinity.Tr2FloatParameter()
        param.name = 'Amplitude'
        param.value = amplitude
        material.parameters['Amplitude'] = param
        param = trinity.Tr2FloatParameter()
        param.name = 'Tiling'
        param.value = tiling
        material.parameters['Tiling'] = param
        material.BindLowLevelShader([])
        self.steps.append(trinity.TriStepRenderFullScreenShader(material))
        self.steps.append(trinity.TriStepPopRenderTarget())
        trinity.renderJobs.recurring.append(self)
        return trinity.TriTextureRes(texture)
def ApplyAreaRes(areaRes, mesh, areaIdx):
    """
    This function ensures that the specified Area is
    in the correct areaLists in the specified Mesh,
    and then applies the material from the specified
    areaRes.
    """
    geo = mesh.geometry
    if not (geo.isPrepared and geo.isGood):
        log.LogWarn('FAILED TO PREPARE MESH %s' % mesh.name)
        return
    metashaders = LoadMetaMaterialLibrary()
    try:
        currentShader = metashaders[str(areaRes.metatype)]
    except KeyError:
        log.LogWarn('Unknown MetaMaterial: %s' % areaRes.metatype)
        return

    for typeIdx in xrange(mesh.GetAreasCount()):
        areaList = mesh.GetAreas(typeIdx)
        if areaList is not None:
            for area in areaList:
                if area.index == areaIdx:
                    areaList.remove(area)
                    break

    for area in currentShader:
        areaList = getattr(mesh, area['name'])
        if areaList is not None:
            areaName = geo.GetMeshAreaName(mesh.meshIndex, areaIdx)
            newArea = trinity.Tr2MeshArea()
            newArea.index = areaIdx
            newArea.count = 1
            newArea.name = areaName
            if 'shLighting' in area and area['shLighting']:
                newArea.useSHLighting = True
            newArea.effect = trinity.Tr2ShaderMaterial()
            newArea.effect.highLevelShaderName = area['shader']
            if 'situation' in area:
                newArea.effect.defaultSituation = area['situation']
            newArea.effect.PopulateDefaultParameters()
            areaList.append(newArea)
            ApplyMaterialStoreToEffect(newArea.effect, areaRes.material)
Example #7
0
def CopyHairShaderDepthNormal(fx):
    newMaterial = trinity.Tr2ShaderMaterial()
    lowPath = fx.effectFilePath.lower()
    newMaterial.highLevelShaderName = 'NormalDepth'
    newMaterial.defaultSituation = 'AlphaCutout TwoSided'
    if 'detailed' in lowPath:
        newMaterial.defaultSituation = newMaterial.defaultSituation + ' Detailed'
    if 'dxt5n' in lowPath:
        newMaterial.defaultSituation = newMaterial.defaultSituation + ' OPT_USE_DXT5N'
    CopyCommonAvatarMaterialParams(newMaterial, fx)
    param = trinity.Tr2FloatParameter()
    param.name = 'MaterialLibraryID'
    param.value = 75
    newMaterial.parameters['MaterialLibraryID'] = param
    param = trinity.Tr2FloatParameter()
    param.name = 'AlphaTestValue'
    param.value = 0.0235
    newMaterial.parameters['AlphaTestValue'] = param
    return newMaterial
Example #8
0
 def EnableFXAA(self, enable):
     self.fxaaEnabled = enable
     if not self.prepared:
         return
     if enable:
         if getattr(self, 'fxaaEffect', None) is None:
             self.fxaaEffect = trinity.Tr2ShaderMaterial()
             self.fxaaEffect.highLevelShaderName = 'PostProcess'
         self.fxaaEffect.defaultSituation = self.fxaaQuality
         self.fxaaEffect.BindLowLevelShader([])
         self.AddStep('FXAA', trinity.TriStepRenderFullScreenShader(self.fxaaEffect))
         if not self.usePostProcessing:
             self.AddStep('FXAA_CLEAR', trinity.TriStepClear((0, 0, 0, 1), 1.0))
         self.RemoveStep('FINAL_BLIT')
     else:
         self.RemoveStep('FXAA')
         self.RemoveStep('FXAA_CLEAR')
     if not self.enabled:
         return
     self._CreateRenderTargets()
     self._RefreshRenderTargets()
Example #9
0
def CreateMaterial(situation):
    material = trinity.Tr2ShaderMaterial()
    material.highLevelShaderName = 'SSAO'
    material.defaultSituation = situation
    return material
Example #10
0
def ConvertAreaToTr2ShaderMaterial(area, defaultSituation = None):
    fx = area.effect
    if hasattr(fx, 'effectFilePath'):
        fxpath = area.effect.effectFilePath.lower()
        newMaterial = trinity.Tr2ShaderMaterial()
        if defaultSituation is not None:
            newMaterial.defaultSituation = defaultSituation
        if 'unpacked_staticstandardwithglowenlighten' in fxpath:
            newMaterial.highLevelShaderName = 'StaticStandardWithGlowEnlighten'
            if defaultSituation is None:
                newMaterial.defaultSituation = 'Unpacked'
            else:
                newMaterial.defaultSituation = defaultSituation + ' Unpacked'
            CopyCommonMaterialParams(newMaterial, fx)
            CopyGlowMaterialParams(newMaterial, fx)
            area.effect = newMaterial
            return 1
        if 'unpacked_staticfresnelreflectionenlighten' in fxpath:
            newMaterial.highLevelShaderName = 'StaticFresnelReflectionEnlighten'
            if defaultSituation is None:
                newMaterial.defaultSituation = 'Unpacked'
            else:
                newMaterial.defaultSituation = defaultSituation + ' Unpacked'
            CopyCommonMaterialParams(newMaterial, fx)
            area.effect = newMaterial
            return 1
        if 'staticdecalalphatestenlighten' in fxpath:
            newMaterial.highLevelShaderName = 'StaticDecalAlphaTestEnlighten'
            CopyCommonMaterialParams(newMaterial, fx)
            area.effect = newMaterial
            return 1
        if 'staticdecalenlighten' in fxpath:
            newMaterial.highLevelShaderName = 'StaticDecalEnlighten'
            CopyCommonMaterialParams(newMaterial, fx)
            area.effect = newMaterial
            return 1
        if 'staticemissive' in fxpath:
            newMaterial.highLevelShaderName = 'StaticEmissive'
            param = CopyResourceByName(fx, 'DiffuseMap')
            if param is not None:
                newMaterial.parameters['DiffuseMap'] = param
            param = CopyVector4Parameter(fx, 'MaterialDiffuseColor')
            if param is not None:
                newMaterial.parameters['MaterialDiffuseColor'] = param
            area.effect = newMaterial
            return 1
        if 'staticfresnelreflectionenlighten' in fxpath:
            newMaterial.highLevelShaderName = 'StaticFresnelReflectionEnlighten'
            CopyCommonMaterialParams(newMaterial, fx)
            area.effect = newMaterial
            return 1
        if 'staticfresnelreflectionsh' in fxpath:
            newMaterial.highLevelShaderName = 'StaticFresnelReflectionSH'
            CopyCommonMaterialParams(newMaterial, fx)
            area.effect = newMaterial
            return 1
        if 'skinnedavatarbrdf' in fxpath:
            newMaterial.highLevelShaderName = 'SkinnedAvatarBrdf'
            CopyCommonMaterialParams(newMaterial, fx)
            param = CopyVector4Parameter(fx, 'MaterialLibraryID')
            if param is not None:
                newMaterial.parameters['MaterialLibraryID'] = param
            param = CopyVector4Parameter(fx, 'TransformUV0')
            if param is not None:
                newMaterial.parameters['TransformUV0'] = param
            param = CopyFloatParameter(fx, 'CutMaskInfluence')
            if param is not None:
                newMaterial.parameters['CutMaskInfluence'] = param
            param = CopyResourceByName(fx, 'FresnelLookupMap')
            if param is not None:
                newMaterial.parameters['FresnelLookupMap'] = param
            param = CopyResourceByName(fx, 'CutMaskMap')
            if param is not None:
                newMaterial.parameters['CutMaskMap'] = param
            area.effect = newMaterial
            return 1
        if 'skinnedavatar' in fxpath:
            newMaterial.highLevelShaderName = 'SkinnedAvatar'
            CopyCommonMaterialParams(newMaterial, fx)
            param = CopyVector4Parameter(fx, 'FresnelFactors')
            if param is not None:
                newMaterial.parameters['FresnelFactors'] = param
            area.effect = newMaterial
            return 1
        if 'staticstandardwithglowenlighten' in fxpath:
            newMaterial.highLevelShaderName = 'StaticStandardWithGlowEnlighten'
            CopyCommonMaterialParams(newMaterial, fx)
            CopyGlowMaterialParams(newMaterial, fx)
            area.effect = newMaterial
            return 1
        if 'staticstandardwithglowsh' in fxpath:
            newMaterial.highLevelShaderName = 'StaticStandardWithGlowSH'
            CopyCommonMaterialParams(newMaterial, fx)
            CopyGlowMaterialParams(newMaterial, fx)
            area.effect = newMaterial
            return 1
        print 'Area ' + area.name + ' using ' + fxpath + ' not converted to Tr2ShaderMaterial, conversion not yet supported'
    return 0
def AddPrepassAreasToAvatar(avatar,
                            visualModel,
                            doll,
                            clothSimulationActive=True,
                            **kwargs):
    """
    This function is split into two parts - first, update the visual models with both the pre-pass and shadow areas,
    but then update the shaders for the cloth.
    """
    createShadows = doll.overrideLod <= pdCfg.PerformanceOptions.shadowLod
    useLightControlMap = doll.overrideLod < 1
    collapseShadowMesh = kwargs.get('collapseShadowMesh', False)
    collapsePLPMesh = kwargs.get('collapsePLPMesh', False)
    collapseMainMesh = kwargs.get('collapseMainMesh', False)
    for mesh in visualModel.meshes:
        if mesh.name[0:4] == 'hair':
            if AddPrepassAreasToHair(
                    mesh,
                    processDepthAreas=createShadows and not collapseShadowMesh,
                    processDepthNormalAreas=not collapsePLPMesh,
                    usePrepassAlphaTestHair=doll.usePrepassAlphaTestHair):
                continue
        AddPrepassAreasToStandardMesh(
            mesh,
            processDepthAreas=createShadows and not collapseShadowMesh,
            processDepthNormalAreas=not collapsePLPMesh,
            doll=doll,
            avatar=avatar,
            useLightControlMap=useLightControlMap)

    if doll.overrideLod >= pdCfg.PerformanceOptions.singleBoneLod:
        for mesh in visualModel.meshes:
            for dn in mesh.depthNormalAreas:
                dn.effect.defaultSituation = dn.effect.defaultSituation + ' SingleBone'

            for dn in mesh.opaquePrepassAreas:
                if hasattr(dn.effect, 'defaultSituation'):
                    dn.effect.defaultSituation = dn.effect.defaultSituation + ' SingleBone'

            for dn in mesh.decalPrepassAreas:
                dn.effect.defaultSituation = dn.effect.defaultSituation + ' SingleBone'

    if doll.overrideLod == 2:
        for mesh in visualModel.meshes:
            for dn in mesh.depthNormalAreas:
                dn.effect.defaultSituation = dn.effect.defaultSituation + ' OPT_USE_OBJECT_NORMAL'

    if collapseMainMesh:
        for mesh in visualModel.meshes:
            for dn in mesh.opaquePrepassAreas:
                dn.effect.defaultSituation = dn.effect.defaultSituation + ' OPT_COLLAPSED_PLP'

    if doll.useDXT5N:
        for mesh in visualModel.meshes:
            for areas in pdCcf.MeshAreaListIterator(mesh, includePLP=True):
                for area in areas:
                    if hasattr(area.effect, 'defaultSituation'):
                        area.effect.defaultSituation = area.effect.defaultSituation + ' OPT_USE_DXT5N'

    if clothSimulationActive:
        for mesh in avatar.clothMeshes:
            if mesh.effect and mesh.effect.name:
                mesh.depthEffect = None
                newEffect = trinity.Tr2ShaderMaterial()
                newEffect.highLevelShaderName = 'Shadow'
                newEffect.defaultSituation = 'Cloth'
                CopyResources(mesh.effect, newEffect,
                              {'DiffuseMap', 'CutMaskMap'})
                CopyParameters(mesh.effect, newEffect, {
                    'TransformUV0', 'MaterialDiffuseColor', 'CutMaskInfluence'
                })
                mesh.depthEffect = newEffect
                mesh.depthNormalEffect = None
                isTr2Effect = hasattr(mesh.effect, 'effectFilePath')
                effectIsHairEffect = False
                if isTr2Effect:
                    effectIsHairEffect = 'hair' in mesh.effect.effectFilePath.lower(
                    )
                if isTr2Effect and not effectIsHairEffect:
                    newEffect = trinity.Tr2ShaderMaterial()
                    newEffect.highLevelShaderName = 'NormalDepth'
                    newEffect.defaultSituation = 'Cloth'
                    if doll.useDXT5N:
                        newEffect.defaultSituation = newEffect.defaultSituation + ' OPT_USE_DXT5N'
                    CopyResources(mesh.effect, newEffect, {
                        'NormalMap', 'SpecularMap', 'DiffuseMap', 'CutMaskMap'
                    })
                    CopyParameters(
                        mesh.effect, newEffect, {
                            'TransformUV0', 'MaterialSpecularCurve',
                            'MaterialLibraryID', 'MaterialDiffuseColor',
                            'CutMaskInfluence'
                        })
                    mesh.depthNormalEffect = newEffect
                if isTr2Effect:
                    reversedIsTr2Effect = hasattr(mesh.effectReversed,
                                                  'effectFilePath')
                    reversedEffectIsHair = False
                    if reversedIsTr2Effect:
                        reversedEffectIsHair = 'hair' in mesh.effectReversed.effectFilePath.lower(
                        )
                    if effectIsHairEffect:
                        newMaterial = CopyHairShader(mesh.effect)
                        newMaterial.name = mesh.effect.name
                        newMaterial.defaultSituation += ' Cloth'
                        newMaterial.defaultSituation += ' Detailed'
                        if doll.useDXT5N:
                            newMaterial.defaultSituation += ' OPT_USE_DXT5N'
                        if not doll.usePrepassAlphaTestHair:
                            mesh.useTransparentBatches = True
                            mesh.useSHLighting = True
                            mesh.depthNormalEffect = None
                            mesh.depthNormalEffectReversed = None
                            if reversedIsTr2Effect and reversedEffectIsHair:
                                newMaterial = CopyHairShader(
                                    mesh.effectReversed)
                                newMaterial.name = mesh.effectReversed.name
                                newMaterial.defaultSituation += ' Cloth'
                                newMaterial.defaultSituation += ' Detailed'
                                if doll.useDXT5N:
                                    newMaterial.defaultSituation += ' OPT_USE_DXT5N'
                                mesh.effectReversed = newMaterial
                                mesh.useTransparentBatches = True
                                mesh.useSHLighting = True
                        else:
                            mesh.useTransparentBatches = False
                            mesh.useSHLighting = False
                            mesh.effectReversed = None
                            mesh.depthNormalEffectReversed = None
                            depthNormalMaterial = CopyHairShaderDepthNormal(
                                mesh.effect)
                            depthNormalMaterial.name = mesh.effect.name
                            depthNormalMaterial.defaultSituation += ' Cloth'
                            mesh.depthNormalEffect = depthNormalMaterial
                        mesh.effect = newMaterial
                    else:
                        situation = 'Prepass Cloth'
                        if doll.useDXT5N:
                            situation = situation + ' OPT_USE_DXT5N'
                        newMaterial = ConvertEffectToTr2ShaderMaterial(
                            mesh.effect, situation, mesh.name)
                        newMaterial.name = mesh.effect.name
                        mesh.effect = newMaterial
                        if reversedIsTr2Effect and not reversedEffectIsHair:
                            newMaterial = ConvertEffectToTr2ShaderMaterial(
                                mesh.effectReversed, situation, mesh.name)
                            newMaterial.name = mesh.effectReversed.name
                            mesh.effectReversed = newMaterial
                elif mesh.effect.highLevelShaderName == 'Hair':
                    if not doll.usePrepassAlphaTestHair:
                        mesh.depthNormalEffect = None
                        mesh.useTransparentBatches = True
                        mesh.useSHLighting = True
                        mesh.depthNormalEffect = None
                        mesh.depthNormalEffectReversed = None
                        mesh.effectReversed = mesh.effect.CopyTo()
                    else:
                        mesh.useTransparentBatches = False
                        mesh.useSHLighting = False
                        mesh.effectReversed = None
                        mesh.depthNormalEffectReversed = None
                        depthNormalMaterial = trinity.Tr2ShaderMaterial()
                        depthNormalMaterial.highLevelShaderName = 'NormalDepth'
                        depthNormalMaterial.defaultSituation = 'AlphaCutout TwoSided ' + mesh.effect.defaultSituation
                        for p in mesh.effect.parameters:
                            param = mesh.effect.parameters[p]
                            if type(param) == trinity.TriTexture2DParameter:
                                newParameter = CopyResource(param)
                            else:
                                newParameter = type(param)()
                                newParameter.name = param.name
                                newParameter.value = param.value
                            depthNormalMaterial.parameters[
                                param.name] = newParameter

                        param = trinity.Tr2FloatParameter()
                        param.name = 'MaterialLibraryID'
                        param.value = 75
                        depthNormalMaterial.parameters[
                            'MaterialLibraryID'] = param
                        param = trinity.Tr2FloatParameter()
                        param.name = 'AlphaTestValue'
                        param.value = 0.0235
                        depthNormalMaterial.parameters[
                            'AlphaTestValue'] = param
                        depthNormalMaterial.name = mesh.effect.name
                        depthNormalMaterial.defaultSituation += ' Cloth'
                        mesh.depthNormalEffect = depthNormalMaterial

    avatar.BindLowLevelShaders()
def CopyAreaForPrePassDepthNormal(area,
                                  sourceAreaType=SOURCE_AREA_TYPE_OPAQUE,
                                  materialLookupTable=None):
    """
    Copies and converts a particular Tr2MeshArea, producing a new one with the correct effect setup to use
    pre-pass rendering.
    """
    originalEffect = area.effect
    if originalEffect is None:
        return
    if hasattr(originalEffect, 'effectFilePath'
               ) and 'glass' in originalEffect.effectFilePath.lower():
        return
    newArea = trinity.Tr2MeshArea()
    newArea.name = area.name
    newArea.index = area.index
    newArea.count = area.count
    newArea.reversed = area.reversed
    newMaterial = trinity.Tr2ShaderMaterial()
    newMaterial.highLevelShaderName = 'NormalDepth'
    if sourceAreaType == SOURCE_AREA_TYPE_DECAL:
        newMaterial.name = 'Skinned_Cutout_NormalDepth'
        newMaterial.defaultSituation = 'AlphaCutout'
    else:
        newMaterial.name = 'Skinned_Opaque_NormalDepth'
        newMaterial.defaultSituation = ''
    if hasattr(originalEffect, 'effectFilePath'
               ) and 'double' in originalEffect.effectFilePath.lower():
        newMaterial.defaultSituation = newMaterial.defaultSituation + ' DoubleMaterial'
    if hasattr(originalEffect, 'name'):
        name = originalEffect.name.lower()
        if name.startswith('c_skin_'):
            newMaterial.defaultSituation = newMaterial.defaultSituation + ' SmoothNormal'
        elif name.startswith('c_eyes'):
            newMaterial.defaultSituation = newMaterial.defaultSituation + ' EyeShader'
    CopyResources(area.effect, newMaterial,
                  {'NormalMap', 'SpecularMap', 'DiffuseMap', 'CutMaskMap'})
    CopyParameters(
        area.effect, newMaterial, {
            'TransformUV0', 'MaterialDiffuseColor', 'CutMaskInfluence',
            'MaterialSpecularFactors', 'ArrayOfCutMaskInfluence',
            'ArrayOfMaterialLibraryID', 'ArrayOfMaterial2LibraryID',
            'ArrayOfMaterialSpecularFactors'
        })
    if 'MaterialSpecularFactors' in newMaterial.parameters:
        newMaterial.parameters[
            'MaterialSpecularFactors'].z = newMaterial.parameters[
                'MaterialSpecularFactors'].z * 0.7
    MaterialLibraryID = pdCcf.FindParameterByName(area.effect,
                                                  'MaterialLibraryID')
    if MaterialLibraryID is None:
        MaterialLibraryID = 11
    else:
        MaterialLibraryID = MaterialLibraryID.x
    MaterialSpecularCurve = pdCcf.FindParameterByName(area.effect,
                                                      'MaterialSpecularCurve')
    if MaterialSpecularCurve is None:
        MaterialSpecularCurve = (0, 50, 0, 0)
    else:
        MaterialSpecularCurve = (MaterialSpecularCurve.x,
                                 MaterialSpecularCurve.y,
                                 MaterialSpecularCurve.z,
                                 MaterialSpecularCurve.w)
    param = trinity.Tr2FloatParameter()
    param.name = 'MaterialLibraryID'
    param.value = FindMaterialID(MaterialLibraryID,
                                 1 + MaterialSpecularCurve[3],
                                 MaterialSpecularCurve[1],
                                 materialLookupTable=materialLookupTable)
    newMaterial.parameters['MaterialLibraryID'] = param
    MaterialLibraryID = pdCcf.FindParameterByName(area.effect,
                                                  'Material2LibraryID')
    if MaterialLibraryID is not None:
        param = trinity.Tr2FloatParameter()
        param.name = 'Material2LibraryID'
        param.value = FindMaterialID(MaterialLibraryID.x,
                                     1 + MaterialSpecularCurve[3],
                                     MaterialSpecularCurve[1])
        newMaterial.parameters['Material2LibraryID'] = param
    newArea.effect = newMaterial
    return newArea