Exemplo n.º 1
0
 def CopyBlitTexture(self, path, subrect = None, srcRect = None, isNormalMap = False, alphaMultiplier = 1.0):
     effect = self.MakeEffect('Copyblit')
     self.AppendResource(effect, 'Texture', path, 'TextureReverseUV', mapType='N' if isNormalMap else '')
     if srcRect:
         self.AppendParameter(effect, trinity.Tr2Vector4Parameter(), 'SourceUVs', srcRect)
     self.AppendParameter(effect, trinity.Tr2FloatParameter(), 'AlphaMultiplier', alphaMultiplier)
     self.renderJob.SetRenderState(trinity.D3DRS_SEPARATEALPHABLENDENABLE, 1)
     self.renderJob.SetRenderState(trinity.D3DRS_BLENDOPALPHA, trinity.TRIBLENDOP_ADD)
     self.renderJob.SetRenderState(trinity.D3DRS_SRCBLENDALPHA, trinity.TRIBLEND_ONE)
     self.renderJob.SetRenderState(trinity.D3DRS_DESTBLENDALPHA, trinity.TRIBLEND_ZERO)
     self.CompositeTexture(effect, subrect)
Exemplo n.º 2
0
 def MaskedNormalBlitTexture(self, path, strength, subrect = None, srcRect = None):
     effect = self.MakeEffect('MaskedNormalBlit')
     self.AppendResource(effect, 'Texture', path, 'TextureReverseUV')
     self.AppendParameter(effect, trinity.Tr2FloatParameter(), 'Strength', strength)
     if srcRect:
         self.AppendParameter(effect, trinity.Tr2Vector4Parameter(), 'SourceUVs', srcRect)
     self.renderJob.SetRenderState(trinity.D3DRS_SEPARATEALPHABLENDENABLE, 1)
     self.renderJob.SetRenderState(trinity.D3DRS_BLENDOPALPHA, trinity.TRIBLENDOP_ADD)
     self.renderJob.SetRenderState(trinity.D3DRS_SRCBLENDALPHA, trinity.TRIBLEND_ZERO)
     self.renderJob.SetRenderState(trinity.D3DRS_DESTBLENDALPHA, trinity.TRIBLEND_ONE)
     self.CompositeTexture(effect, subrect)
def CopyHairShaderDepthNormal(fx):
    """
    Creates depth normal shader for alpha-tested hair.
    """
    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
 def ColorizedCopyBlitTexture(self,
                              detail,
                              zone,
                              overlay,
                              color1,
                              color2,
                              color3,
                              subrect=None,
                              addAlpha=False,
                              srcRect=None,
                              weight=1.0):
     effect = self.MakeEffect('ColorizedCopyBlit')
     effect.StartUpdate()
     res = []
     res.append(
         self.CreateResource(effect, 'DetailMap', detail,
                             'DetailReverseUV'))
     res.append(
         self.CreateResource(effect, 'ZoneMap', zone, 'ZoneReverseUV'))
     res.append(
         self.CreateResource(effect, 'OverlayMap', overlay,
                             'OverlayReverseUV'))
     effect.resources.extend(res)
     self.AppendParameter(effect, trinity.Tr2FloatParameter(), 'Strength',
                          weight)
     param = []
     param.append(
         self.CreateParameter(trinity.Tr2Vector4Parameter(), 'Color1',
                              color1))
     param.append(
         self.CreateParameter(trinity.Tr2Vector4Parameter(), 'Color2',
                              color2))
     param.append(
         self.CreateParameter(trinity.Tr2Vector4Parameter(), 'Color3',
                              color3))
     if srcRect:
         param.append(
             self.CreateParameter(effect, trinity.Tr2Vector4Parameter(),
                                  'SourceUVs', srcRect))
     effect.parameters.extend(param)
     effect.EndUpdate()
     self.renderJob.SetRenderState(trinity.D3DRS_SEPARATEALPHABLENDENABLE,
                                   1)
     self.renderJob.SetRenderState(trinity.D3DRS_BLENDOPALPHA,
                                   trinity.TRIBLENDOP_ADD)
     self.renderJob.SetRenderState(trinity.D3DRS_SRCBLENDALPHA,
                                   trinity.TRIBLEND_ONE)
     self.renderJob.SetRenderState(trinity.D3DRS_DESTBLENDALPHA,
                                   trinity.TRIBLEND_ZERO)
     self.CompositeTexture(effect, subrect)
Exemplo n.º 5
0
    def Initialize(self, size, speed, amplitude, tiling, texturePath):
        def TextureDestroyed():
            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.TriTextureParameter()
        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)
Exemplo n.º 6
0
def makeCubemapStep(filePath, scaleToFit = True, color = (1.0, 1.0, 1.0, 1.0), cubeFace = 0, targetSize = None):
    """
    Helper function to create a renderstep that shows a cubemap.
    http://carbon/wiki/Core_Graphics_Snippets
    """
    tex = trinity.TriTextureCubeParameter()
    tex.name = 'BlitSource'
    tex.resourcePath = filePath
    if targetSize is None:
        bb = trinity.device.GetRenderContext().GetDefaultBackBuffer()
        targetSize = (bb.width, bb.height)
    targetAspect = float(targetSize[0]) / float(targetSize[1])
    fx = trinity.Tr2Effect()
    fx.effectFilePath = 'res:/Graphics/Effect/Managed/Space/System/ColoredBlitCube.fx'
    fx.effectResource.Reload()
    fx.resources.append(tex)
    v = trinity.Tr2Vector4Parameter()
    v.name = 'Color'
    v.value = color
    fx.parameters.append(v)
    v = trinity.Tr2FloatParameter()
    v.name = 'cubeFace'
    v.value = cubeFace
    fx.parameters.append(v)
    v = trinity.Tr2Vector4Parameter()
    v.name = 'ScaleXY'
    fx.parameters.append(v)
    if scaleToFit:
        if targetAspect >= 1.0:
            v.value = (targetAspect,
             1.0,
             1.0,
             1.0)
        else:
            v.value = (1.0,
             1.0 / targetAspect,
             1.0,
             1.0)
    elif targetAspect < 1.0:
        v.value = (targetAspect,
         1.0,
         1.0,
         1.0)
    else:
        v.value = (1.0,
         1.0 / targetAspect,
         1.0,
         1.0)
    return trinity.TriStepRenderEffect(fx)
Exemplo n.º 7
0
    def EnableResourceLayer(self):
        """Enables the resource layer and sets it up if required"""
        if self.planetTransform is not None:
            if self.resourceLayer is None:
                self.LogInfo(
                    '_ShowResource no resourceLayer found. Loading resource layer'
                )
                self.resourceLayer = trinity.Load(
                    'res:/dx9/model/worldobject/planet/uiplanet.red')
                trinity.WaitForResourceLoads()
                effect = self.resourceLayer.mesh.transparentAreas[0].effect
                for resource in effect.resources:
                    if resource.name == 'ColorRampMap':
                        resource.resourcePath = 'res:/dx9/model/worldobject/planet/resource_colorramp.dds'

                for param in effect.parameters:
                    if param.name == 'MainColor':
                        param.value = RESOURCE_BASE_COLOR
                    elif param.name == 'ResourceTextureInfo':
                        param.value = (PLANET_RESOURCE_TEX_WIDTH,
                                       PLANET_RESOURCE_TEX_HEIGHT, 0, 0)

                offset = trinity.Tr2FloatParameter()
                offset.name = 'HeatOffset'
                offset.value = 0.0
                effect.parameters.append(offset)
                stretch = trinity.Tr2FloatParameter()
                stretch.name = 'HeatStretch'
                stretch.value = 1.0
                effect.parameters.append(stretch)
                self.planetTransform.children.append(self.resourceLayer)
            else:
                self.resourceLayer.display = True
            low, hi = settings.char.ui.Get('planet_resource_display_range',
                                           (0.0, 1.0))
            self.SetResourceDisplayRange(low, hi)
        def createMeshAreaParams(self, meshArea, isDecal, isCloth = False, isTranslucent = False):
            """
            Create the effect needed to draw mesh into the shadow map during the depth pass.
            The effect will use a skinned or non-skinned shader, based on not-cloth or cloth.
            For opaque vs. decals, only one shader is needed -- a spotlight.x parameter controls
            if the diffuse alpha should be used or not to do alphatesting.
            """
            shadowEffect = trinity.Tr2Effect()
            shadowEffect.effectFilePath = SPOTLIGHT_SHADOW_EFFECT if not isCloth else SPOTLIGHT_SHADOW_EFFECT_CLOTH
            v = trinity.Tr2Vector4Parameter()
            v.name = 'spotlight'
            v.value = (float(isDecal),
             1.0 / self.shadowResolution,
             float(isTranslucent),
             1)
            shadowEffect.parameters.append(v)
            effect = None
            if hasattr(meshArea, 'effect') and meshArea.effect:
                effect = meshArea.effect
            elif hasattr(meshArea, 'effectReversed') and meshArea.effectReversed:
                effect = meshArea.effectReversed
            if type(effect) is not trinity.Tr2Effect:
                return
            if effect and isDecal:
                for p in effect.parameters:
                    if p.name == 'TransformUV0':
                        v = trinity.Tr2Vector4Parameter()
                        v.name = p.name
                        v.value = p.value
                        shadowEffect.parameters.append(v)
                    elif p.name == 'CutMaskInfluence':
                        v = trinity.Tr2FloatParameter()
                        v.name = p.name
                        v.value = p.value
                        shadowEffect.parameters.append(v)

                for r in effect.resources:
                    if r.name == 'DiffuseMap' or r.name == 'CutMaskMap':
                        t = trinity.TriTexture2DParameter()
                        t.name = r.name
                        t.SetResource(r.resource)
                        shadowEffect.resources.append(t)

            shadowEffect.RebuildCachedData()
            if effect:
                pdCcf.AddWeakBlue(self, 'meshAreaShadowEffect', meshArea, shadowEffect)
                pdCcf.AddWeakBlue(self, 'meshAreaOriginalEffect', meshArea, meshArea.effect)
Exemplo n.º 9
0
        def createMeshAreaParams(self,
                                 meshArea,
                                 isDecal,
                                 isCloth=False,
                                 isTranslucent=False):
            shadowEffect = trinity.Tr2Effect()
            shadowEffect.effectFilePath = SPOTLIGHT_SHADOW_EFFECT if not isCloth else SPOTLIGHT_SHADOW_EFFECT_CLOTH
            v = trinity.Tr2Vector4Parameter()
            v.name = 'spotlight'
            v.value = (float(isDecal), 1.0 / self.shadowResolution,
                       float(isTranslucent), 1)
            shadowEffect.parameters.append(v)
            effect = None
            if hasattr(meshArea, 'effect') and meshArea.effect:
                effect = meshArea.effect
            elif hasattr(meshArea,
                         'effectReversed') and meshArea.effectReversed:
                effect = meshArea.effectReversed
            if type(effect) is not trinity.Tr2Effect:
                return
            if effect and isDecal:
                for p in effect.parameters:
                    if p.name == 'TransformUV0':
                        v = trinity.Tr2Vector4Parameter()
                        v.name = p.name
                        v.value = p.value
                        shadowEffect.parameters.append(v)
                    elif p.name == 'CutMaskInfluence':
                        v = trinity.Tr2FloatParameter()
                        v.name = p.name
                        v.value = p.value
                        shadowEffect.parameters.append(v)

                for r in effect.resources:
                    if r.name == 'DiffuseMap' or r.name == 'CutMaskMap':
                        t = trinity.TriTexture2DParameter()
                        t.name = r.name
                        t.SetResource(r.resource)
                        shadowEffect.resources.append(t)

            shadowEffect.RebuildCachedData()
            if effect:
                PD.AddWeakBlue(self, 'meshAreaShadowEffect', meshArea,
                               shadowEffect)
                PD.AddWeakBlue(self, 'meshAreaOriginalEffect', meshArea,
                               meshArea.effect)
 def PatternBlitTexture(self,
                        pattern,
                        detail,
                        zone,
                        overlay,
                        patterncolor1,
                        patterncolor2,
                        patterncolor3,
                        color2,
                        color3,
                        subrect=None,
                        patternTransform=(0, 0, 8, 8),
                        patternRotation=0.0,
                        addAlpha=False,
                        skipAlpha=False,
                        srcRect=None):
     effect = self.MakeEffect('PatternBlit')
     effect.StartUpdate()
     res = []
     res.append(
         self.CreateResource(effect, 'PatternMap', pattern,
                             'PatternReverseUV'))
     res.append(
         self.CreateResource(effect, 'DetailMap', detail,
                             'DetailReverseUV'))
     res.append(
         self.CreateResource(effect, 'ZoneMap', zone, 'ZoneReverseUV'))
     res.append(
         self.CreateResource(effect, 'OverlayMap', overlay,
                             'OverlayReverseUV'))
     effect.resources.extend(res)
     param = []
     param.append(
         self.CreateParameter(trinity.Tr2Vector4Parameter(),
                              'PatternColor1', patterncolor1))
     param.append(
         self.CreateParameter(trinity.Tr2Vector4Parameter(),
                              'PatternColor2', patterncolor2))
     param.append(
         self.CreateParameter(trinity.Tr2Vector4Parameter(),
                              'PatternColor3', patterncolor3))
     param.append(
         self.CreateParameter(trinity.Tr2Vector4Parameter(),
                              'PatternTransform', patternTransform))
     param.append(
         self.CreateParameter(trinity.Tr2FloatParameter(),
                              'PatternRotation', patternRotation))
     param.append(
         self.CreateParameter(trinity.Tr2Vector4Parameter(), 'Color2',
                              color2))
     param.append(
         self.CreateParameter(trinity.Tr2Vector4Parameter(), 'Color3',
                              color3))
     if srcRect:
         param.append(
             self.CreateParameter(trinity.Tr2Vector4Parameter(),
                                  'SourceUVs', srcRect))
     effect.parameters.extend(param)
     effect.EndUpdate()
     self.renderJob.SetRenderState(trinity.D3DRS_SEPARATEALPHABLENDENABLE,
                                   1)
     self.renderJob.SetRenderState(trinity.D3DRS_BLENDOPALPHA,
                                   trinity.TRIBLENDOP_ADD)
     self.renderJob.SetRenderState(trinity.D3DRS_SRCBLENDALPHA,
                                   trinity.TRIBLEND_ONE)
     if skipAlpha:
         self.renderJob.SetRenderState(trinity.D3DRS_SRCBLENDALPHA,
                                       trinity.TRIBLEND_ZERO)
     else:
         self.renderJob.SetRenderState(trinity.D3DRS_SRCBLENDALPHA,
                                       trinity.TRIBLEND_ONE)
     if addAlpha:
         self.renderJob.SetRenderState(trinity.D3DRS_DESTBLENDALPHA,
                                       trinity.TRIBLEND_ONE)
     else:
         self.renderJob.SetRenderState(trinity.D3DRS_DESTBLENDALPHA,
                                       trinity.TRIBLEND_ZERO)
     self.CompositeTexture(effect, subrect)
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 AddPrepassAreasToStandardMesh(mesh,
                                  processDepthAreas,
                                  processDepthNormalAreas,
                                  avatar=None,
                                  doll=None,
                                  useLightControlMap=False):
    opaqueAreas = mesh.opaqueAreas
    processDepthAreas = len(mesh.depthAreas) <= 0
    if processDepthNormalAreas:
        mesh.depthNormalAreas.removeAt(-1)
    mesh.decalPrepassAreas.removeAt(-1)
    mesh.opaquePrepassAreas.removeAt(-1)
    for area in mesh.transparentAreas:
        if area.name[0:8] == 'Prepass_':
            mesh.transparentAreas.remove(area)

    newAreas = []
    for area in opaqueAreas:
        if IsGlassRelated(area):
            newArea = CopyAreaOnly(area)
            if newArea is not None:
                newArea.name = 'Prepass_' + newArea.name
                newArea.effect = ConvertEffectToTr2ShaderMaterial(
                    area.effect, 'SHLighting', mesh.name)
                newArea.useSHLighting = True
                newAreas.append(newArea)
                area.debugIsHidden = True
            if processDepthAreas:
                newArea = CopyAreaForPrePassShadows(area,
                                                    SOURCE_AREA_TYPE_OPAQUE)
                if newArea is not None:
                    mesh.depthAreas.append(newArea)
            continue
        if area.effect is not None and hasattr(
                area.effect, 'effectFilePath'
        ) and 'hair' in area.effect.effectFilePath.lower():
            continue
        if processDepthNormalAreas:
            newArea = CopyAreaForPrePassDepthNormal(area,
                                                    SOURCE_AREA_TYPE_OPAQUE)
            if newArea is not None:
                mesh.depthNormalAreas.append(newArea)
        if processDepthAreas:
            newArea = CopyAreaForPrePassShadows(area, SOURCE_AREA_TYPE_OPAQUE)
            if newArea is not None:
                mesh.depthAreas.append(newArea)
        newArea = CopyAreaOnly(area)
        if newArea is not None:
            if mesh.name.startswith('head') and useLightControlMap:
                newArea.effect = ConvertEffectToTr2ShaderMaterial(
                    area.effect, 'Prepass SHLighting', mesh.name)
                useLightControl = trinity.Tr2FloatParameter()
                useLightControl.name = 'UseLightControl'
                useLightControl.value = 0.5
                newArea.effect.parameters[
                    useLightControl.name] = useLightControl
                lightControlMap = trinity.TriTexture2DParameter()
                lightControlMap.name = 'LightControlMap'
                lcmPath = LIGHT_CONTROL_MAP_FEMALE_PATH
                if doll and doll.gender == pdDef.GENDER.MALE:
                    lcmPath = LIGHT_CONTROL_MAP_MALE_PATH
                lightControlMap.resourcePath = lcmPath
                newArea.effect.parameters[
                    lightControlMap.name] = lightControlMap
                lightControlMatrix = trinity.Tr2Matrix4Parameter()
                lightControlMatrix.name = 'LightControlMatrix'
                newArea.effect.parameters[
                    lightControlMatrix.name] = lightControlMatrix
                newArea.useSHLighting = True
                if avatar:
                    headMatrixCurves = None
                    boneMatrixCurve = None
                    for cs in avatar.curveSets:
                        if cs.name == 'HeadMatrixCurves':
                            headMatrixCurves = cs
                            for curve in headMatrixCurves.curves:
                                if curve.bone == 'Head':
                                    boneMatrixCurve = curve

                            break

                    if not headMatrixCurves:
                        headMatrixCurves = trinity.TriCurveSet()
                        headMatrixCurves.name = 'HeadMatrixCurves'
                        avatar.curveSets.append(headMatrixCurves)
                    if not boneMatrixCurve:
                        boneMatrixCurve = trinity.Tr2BoneMatrixCurve()
                        boneMatrixCurve.bone = 'Head'
                        boneMatrixCurve.name = 'HeadMatrixCurve'
                        boneMatrixCurve.skinnedObject = avatar
                        headMatrixCurves.curves.append(boneMatrixCurve)
                    if len(headMatrixCurves.bindings):
                        bind = headMatrixCurves.bindings[0]
                    else:
                        bind = trinity.TriValueBinding()
                        headMatrixCurves.bindings.append(bind)
                    bind.sourceObject = boneMatrixCurve
                    bind.destinationObject = lightControlMatrix
                    bind.sourceAttribute = 'currentValue'
                    bind.destinationAttribute = 'value'
                    headMatrixCurves.Play()
            else:
                newArea.effect = ConvertEffectToTr2ShaderMaterial(
                    area.effect, 'Prepass', mesh.name)
            mesh.opaquePrepassAreas.append(newArea)

    def FixCutMask(area):
        if area.effect and 'CutMaskInfluence' in area.effect.parameters:
            area.effect.parameters['CutMaskInfluence'].value = 1.0

    def AddAreasForRegularPLP(area,
                              materialLookupTable=None,
                              isTransparent=False):
        if area.effect is not None and hasattr(
                area.effect, 'effectFilePath'
        ) and 'hair' in area.effect.effectFilePath.lower():
            return
        if processDepthNormalAreas:
            newArea = CopyAreaForPrePassDepthNormal(
                area,
                SOURCE_AREA_TYPE_DECAL,
                materialLookupTable=materialLookupTable)
            if newArea is not None:
                if isTransparent:
                    FixCutMask(newArea)
                mesh.depthNormalAreas.append(newArea)
        if processDepthAreas:
            newArea = CopyAreaForPrePassShadows(area, SOURCE_AREA_TYPE_DECAL)
            if newArea is not None:
                if isTransparent:
                    FixCutMask(newArea)
                mesh.depthAreas.append(newArea)
        newArea = CopyAreaOnly(area)
        if newArea is not None:
            newArea.effect = ConvertEffectToTr2ShaderMaterial(
                area.effect, 'Prepass Decal', mesh.name)
            if isTransparent:
                FixCutMask(newArea)
            mesh.decalPrepassAreas.append(newArea)
        area.debugIsHidden = True

    for area in mesh.decalAreas:
        if IsGlassRelated(area):
            newArea = CopyAreaOnly(area)
            if newArea is not None:
                newArea.name = 'Prepass_' + newArea.name
                newArea.effect = ConvertEffectToTr2ShaderMaterial(
                    area.effect, 'SHLighting', mesh.name)
                newArea.useSHLighting = True
                newAreas.append(newArea)
                area.debugIsHidden = True
            if processDepthAreas:
                newArea = CopyAreaForPrePassShadows(area,
                                                    SOURCE_AREA_TYPE_DECAL)
                if newArea is not None:
                    mesh.depthAreas.append(newArea)
        else:
            AddAreasForRegularPLP(area)

    for area in mesh.transparentAreas:
        if area.effect is None:
            continue
        if hasattr(area.effect, 'effectFilePath'
                   ) and 'hair' in area.effect.effectFilePath.lower():
            continue
        if USE_DECAL_PLP_FOR_TRANSPARENT_AREAS and not IsEyeRelated(
                area) and not IsGlassRelated(area):
            AddAreasForRegularPLP(
                area,
                materialLookupTable=MATERIAL_ID_TRANSPARENT_HACK_EXACT,
                isTransparent=True)
            area.effect = None
        else:
            newArea = CopyAreaOnly(area)
            if newArea is not None:
                if 'C_SkinShiny' in area.effect.name:
                    newArea.effect = ConvertEffectToTr2ShaderMaterial(
                        area.effect, 'Prepass Decal', mesh.name)
                    mesh.decalPrepassAreas.append(newArea)
                else:
                    newArea.effect = ConvertEffectToTr2ShaderMaterial(
                        area.effect, 'SHLighting', mesh.name)
                    newArea.useSHLighting = True
                    newAreas.append(newArea)
                area.debugIsHidden = True

    mesh.transparentAreas.extend(newAreas)
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