Beispiel #1
0
 def __init__(self, text, parent, size=72, shadow=0, hspace=8, font=None):
     self.transform = trinity.EveTransform()
     self.transform.mesh = trinity.Tr2Mesh()
     self.transform.mesh.geometryResPath = 'res:/Model/Global/zsprite.gr2'
     self.transform.modifier = 1
     self.measurer = trinity.Tr2FontMeasurer()
     self.measurer.limit = 0
     if font is None:
         font = _GetDefaultFont()
     self.measurer.font = font
     self.measurer.fontSize = size
     self.measurer.letterSpace = hspace
     area = trinity.Tr2MeshArea()
     self.transform.mesh.transparentAreas.append(area)
     area.effect = self.effect = trinity.Tr2Effect()
     sampler = list(self.effect.samplerOverrides.GetDefaultValue())
     sampler[0] = 'DiffuseMapSampler'
     sampler[1] = trinity.TRITADDRESS_CLAMP
     sampler[2] = trinity.TRITADDRESS_CLAMP
     self.effect.samplerOverrides.append(tuple(sampler))
     self.effect.effectFilePath = 'res:/Graphics/Effect/Managed/Space/SpecialFX/TextureColor.fx'
     diffuseColor = trinity.Tr2Vector4Parameter()
     diffuseColor.name = 'DiffuseColor'
     self.effect.parameters.append(diffuseColor)
     self.diffuseColor = diffuseColor
     self.diffuseMap = trinity.TriTextureParameter()
     self.diffuseMap.name = 'DiffuseMap'
     self.effect.resources.append(self.diffuseMap)
     parent.children.append(self.transform)
     trinity.device.RegisterResource(self)
     self.SetText(text)
Beispiel #2
0
def CreateParticles():
    particleTransform = trinity.EveTransform()
    particleTransform.name = 'particleTransform'
    tex = trinity.TriTextureParameter()
    tex.name = 'TexMap'
    tex.resourcePath = PARTICLE_SPRITE_TEXTURE
    heattex = trinity.TriTextureParameter()
    heattex.name = 'HeatTexture'
    heattex.resourcePath = PARTICLE_SPRITE_HEAT_TEXTURE
    distanceFadeControl = trinity.Tr2Vector4Parameter()
    distanceFadeControl.name = DISTANCE_RANGE
    distanceFadeControl.value = (0, 1, 0, 0)
    particles = trinity.Tr2RuntimeInstanceData()
    particles.SetElementLayout([(trinity.PARTICLE_ELEMENT_TYPE.POSITION, 0, 3),
     (trinity.PARTICLE_ELEMENT_TYPE.POSITION, 1, 3),
     (trinity.PARTICLE_ELEMENT_TYPE.CUSTOM, 0, 1),
     (trinity.PARTICLE_ELEMENT_TYPE.CUSTOM, 1, 4)])
    mesh = trinity.Tr2InstancedMesh()
    mesh.geometryResPath = 'res:/Graphics/Generic/UnitPlane/UnitPlane.gr2'
    mesh.instanceGeometryResource = particles
    particleTransform.mesh = mesh
    area = trinity.Tr2MeshArea()
    area.effect = trinity.Tr2Effect()
    area.effect.effectFilePath = PARTICLE_EFFECT
    area.effect.resources.append(tex)
    area.effect.resources.append(heattex)
    area.effect.parameters.append(distanceFadeControl)
    mesh.additiveAreas.append(area)
    return (particleTransform, particles, distanceFadeControl)
Beispiel #3
0
 def CreatePlanet(self, planetPosition):
     scaling = 0.01 / mapViewConst.SOLARSYSTEM_SCALE
     planetTransform = trinity.EveTransform()
     planetTransform.name = 'planetTransform'
     planetTransform.scaling = (scaling, scaling, scaling)
     planetTransform.translation = planetPosition
     self.systemMapTransform.children.append(planetTransform)
     planetTransform.useDistanceBasedScale = True
     planetTransform.distanceBasedScaleArg1 = 1.0
     planetTransform.distanceBasedScaleArg2 = 0.0
     planetTransform.mesh = trinity.Tr2Mesh()
     planetTransform.mesh.geometryResPath = 'res:/Model/Global/zsprite.gr2'
     planetTransform.modifier = 1
     area = trinity.Tr2MeshArea()
     planetTransform.mesh.additiveAreas.append(area)
     effect = trinity.Tr2Effect()
     effect.effectFilePath = 'res:/Graphics/Effect/Managed/Space/SpecialFX/TextureColor.fx'
     area.effect = effect
     diffuseColor = trinity.Tr2Vector4Parameter()
     diffuseColor.name = 'DiffuseColor'
     effect.parameters.append(diffuseColor)
     diffuseMap = trinity.TriTextureParameter()
     diffuseMap.name = 'DiffuseMap'
     diffuseMap.resourcePath = 'res:/UI/Texture/Classes/MapView/spotSprite.dds'
     effect.resources.append(diffuseMap)
def CopyAreaOnly(area):
    newArea = trinity.Tr2MeshArea()
    newArea.name = area.name
    newArea.index = area.index
    newArea.count = area.count
    newArea.reversed = area.reversed
    return newArea
def CopyAreaForPrePassShadows(area, sourceAreaType=SOURCE_AREA_TYPE_OPAQUE):
    originalEffect = area.effect
    if originalEffect is None or not hasattr(originalEffect, 'effectFilePath'):
        return
    newArea = trinity.Tr2MeshArea()
    newArea.name = area.name
    newArea.index = area.index
    newArea.count = area.count
    newEffect = trinity.Tr2Effect()
    if originalEffect.effectFilePath.lower().find('avatar') == -1:
        if sourceAreaType == SOURCE_AREA_TYPE_DECAL and originalEffect.effectFilePath.lower(
        ).find('alphatest') == -1:
            return
    elif originalEffect.effectFilePath.lower().find('cloth') == -1:
        if sourceAreaType == SOURCE_AREA_TYPE_DECAL:
            newEffect.effectFilePath = SHADOW_ALPHATEST_EFFECT_PATH
        else:
            newEffect.effectFilePath = SHADOW_OPAQUE_EFFECT_PATH
    elif sourceAreaType == SOURCE_AREA_TYPE_DECAL:
        newEffect.effectFilePath = SHADOW_CLOTH_ALPHATEST_EFFECT_PATH
    else:
        newEffect.effectFilePath = SHADOW_CLOTH_OPAQUE_EFFECT_PATH
    newEffect.name = originalEffect.name
    CopyResources(originalEffect, newEffect, {'DiffuseMap', 'CutMaskMap'})
    CopyParameters(
        originalEffect, newEffect, {
            'TransformUV0', 'MaterialDiffuseColor', 'CutMaskInfluence',
            'ArrayOfCutMaskInfluence'
        })
    newArea.effect = newEffect
    return newArea
Beispiel #6
0
 def Create3DRender(self):
     self.renderTexture = trinity.TriTexture2DParameter()
     self.renderTexture.name = 'DiffuseMap'
     self.renderColor = trinity.TriVector4Parameter()
     self.renderColor.name = 'DiffuseColor'
     self.renderColor.value = (1, 1, 1, 1)
     self.renderEffect = trinity.Tr2Effect()
     self.renderEffect.effectFilePath = 'res:/Graphics/Effect/Managed/Space/SpecialFX/TextureColor.fx'
     self.renderEffect.resources.append(self.renderTexture)
     self.renderEffect.parameters.append(self.renderColor)
     self.renderArea = trinity.Tr2MeshArea()
     self.renderArea.effect = self.renderEffect
     self.renderMesh = trinity.Tr2Mesh()
     self.renderMesh.name = 'orbitalBombardmentTarget'
     self.renderMesh.geometryResPath = 'res:/Graphics/Generic/UnitPlane/UnitPlane.gr2'
     self.renderMesh.transparentAreas.append(self.renderArea)
     self.transform = trinity.EveRootTransform()
     self.transform.mesh = self.renderMesh
     self.renderScene.objects.append(self.transform)
     self.renderJob = trinity.CreateRenderJob()
     self.renderJob.Update(self.renderScene)
     self.renderObject = self.GetRenderObject()
     self.renderObject.is2dPick = False
     self.renderTarget = trinity.Tr2RenderTarget(
         self.width, self.height, 1, trinity.PIXEL_FORMAT.B8G8R8A8_UNORM)
     self.renderJob.PushRenderTarget(self.renderTarget)
     self.renderJob.RenderScene(self.renderObject)
     self.renderJob.PopRenderTarget()
     self.renderJob.ScheduleRecurring(insertFront=True)
     self.renderTexture.SetResource(trinity.TriTextureRes(
         self.renderTarget))
     self.renderSteps[-1].enabled = False
     return self.transform
Beispiel #7
0
def _ApplyIsisEffect(ship, isSkinned):
    if isSkinned:
        isisEffect = blue.resMan.LoadObject(
            'res:/dx9/model/ui/isisEffectSkinned.red')
    else:
        isisEffect = blue.resMan.LoadObject('res:/dx9/model/ui/isisEffect.red')
    blue.resMan.Wait()
    areaCount = ship.mesh.geometry.GetMeshAreaCount(0)
    resourceList = ship.mesh.opaqueAreas[0].effect.resources
    normalMapParam = [res for res in resourceList
                      if res.name == 'NormalMap'][0]
    if hasattr(normalMapParam, 'lodResource'):
        normalMapPath = normalMapParam.lodResource.highDetailResPath
    else:
        normalMapPath = normalMapParam.resourcePath
    del ship.spriteSets[:]
    del ship.spotlightSets[:]
    del ship.planeSets[:]
    del ship.decals[:]
    del ship.mesh.opaqueAreas[:]
    del ship.mesh.depthAreas[:]
    del ship.mesh.transparentAreas[:]
    del ship.mesh.additiveAreas[:]
    del ship.mesh.decalAreas[:]
    del ship.mesh.distortionAreas[:]
    area = trinity.Tr2MeshArea()
    area.index = 0
    area.count = areaCount
    area.effect = isisEffect
    normalMap = [
        res for res in area.effect.resources if res.name == 'NormalMap'
    ][0]
    normalMap.resourcePath = normalMapPath
    ship.mesh.additiveAreas.append(area)
Beispiel #8
0
    def SetupStubble(meshes, name, stubblePath, adding = True):
        ret = []
        stubbleName = '{0}Stubble'.format(name)
        stubbleMeshes = (mesh for mesh in meshes if mesh.name.startswith(pdDef.DOLL_PARTS.HEAD))
        for mesh in stubbleMeshes:
            if adding:
                if any(map(lambda x: 'stubble' in x.name.lower(), mesh.decalAreas)):
                    ret.append(mesh)
                    continue
                c_skin_areas = (area for area in mesh.opaqueAreas if area.effect.name.lower().startswith('c_skin_'))
                for area in c_skin_areas:
                    stubbleArea = trinity.Tr2MeshArea()
                    stubbleArea.name = stubbleName
                    stubbleArea.index = area.index
                    stubbleArea.count = area.count
                    stubbleArea.effect = trinity.Load(stubblePath)
                    for resource in stubbleArea.effect.resources:
                        if resource.name == 'LengthTexture':
                            while resource.resource.IsLoading():
                                pdCf.Yield()

                    mesh.decalAreas.append(stubbleArea)
                    ret.append(mesh)
                    if SkinSpotLightShadows.instance:
                        SkinSpotLightShadows.instance.CreateEffectParamsForMesh(mesh, False)
                    for instance in SkinLightmapRenderer.instances:
                        if instance():
                            instance().BindLightmapShader(mesh)

            else:
                targetAreasToRemove = [ area for area in mesh.decalAreas if area.name == stubbleName ]
                for ta in targetAreasToRemove:
                    mesh.decalAreas.remove(ta)

        return ret
Beispiel #9
0
def CopyAreaForPrePassDepthNormal(area,
                                  sourceAreaType=SOURCE_AREA_TYPE_OPAQUE):
    originalEffect = area.effect
    if originalEffect is None:
        return
    newArea = trinity.Tr2MeshArea()
    newArea.name = area.name
    newArea.index = area.index
    newArea.count = area.count
    newArea.effect = area.effect
    ConvertDepthNormalAreaToTr2ShaderMaterial(newArea)
    return newArea
Beispiel #10
0
def CopyAreaForPrePassDepthNormal(area, sourceAreaType = SOURCE_AREA_TYPE_OPAQUE):
    """
    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
    newArea = trinity.Tr2MeshArea()
    newArea.name = area.name
    newArea.index = area.index
    newArea.count = area.count
    newArea.effect = area.effect
    ConvertDepthNormalAreaToTr2ShaderMaterial(newArea)
    return newArea
Beispiel #11
0
    def CreateSun(self, sunGraphic):

        def GetEffectParameter(effect, parameterName):
            for each in effect.parameters:
                if each.name == parameterName:
                    return each

        scaling = 1.0 / mapViewConst.SOLARSYSTEM_SCALE * 16
        sunTransform = trinity.EveTransform()
        sunTransform.name = 'Sun'
        sunTransform.scaling = (scaling, scaling, scaling)
        sunTransform.useDistanceBasedScale = True
        sunTransform.distanceBasedScaleArg1 = 0.02
        sunTransform.distanceBasedScaleArg2 = 0.1
        self.systemMapTransform.children.append(sunTransform)
        for each in sunGraphic.mesh.additiveAreas:
            if 'flare' not in each.name.lower() and 'rainbow' not in each.name.lower():
                transform = trinity.EveTransform()
                try:
                    size = GetEffectParameter(each.effect, 'Size')
                    transform.scaling = (size.x, size.y, size.z)
                except:
                    continue

                transform.mesh = trinity.Tr2Mesh()
                transform.mesh.geometryResPath = 'res:/Model/Global/zsprite.gr2'
                transform.modifier = 1
                transform.name = each.name
                area = trinity.Tr2MeshArea()
                transform.mesh.additiveAreas.append(area)
                effect = trinity.Tr2Effect()
                effect.effectFilePath = 'res:/Graphics/Effect/Managed/Space/SpecialFX/TextureColor.fx'
                area.effect = effect
                diffuseColor = trinity.Tr2Vector4Parameter()
                diffuseColor.name = 'DiffuseColor'
                effect.parameters.append(diffuseColor)
                diffuseColor = diffuseColor
                diffuseMap = trinity.TriTextureParameter()
                diffuseMap.name = 'DiffuseMap'
                diffuseMap.resourcePath = each.effect.resources[0].resourcePath
                effect.resources.append(diffuseMap)
                try:
                    color = GetEffectParameter(each.effect, 'Color')
                    diffuseColor.value = color.value
                except:
                    continue

                sunTransform.children.append(transform)
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)
def _CreateRuntimeInstanceMesh(instanceType, additive=False):
    effect = ''
    if instanceType in INSTANCE_EFFECTS:
        effect = INSTANCE_EFFECTS[instanceType]
    mesh = trinity.Tr2InstancedMesh()
    mesh.instanceGeometryResPath = ''
    mesh.geometryResPath = _DEFAULT_GEOMETRY
    mesh.instanceGeometryResource = trinity.Tr2RuntimeInstanceData()
    area = trinity.Tr2MeshArea()
    area.effect = trinity.Tr2Effect()
    area.effect.effectFilePath = effect
    trinity.WaitForResourceLoads()
    area.effect.PopulateParameters()
    for each in area.effect.resources:
        each.resourcePath = _DEFAULT_TEXTURE

    if additive:
        mesh.additiveAreas.append(area)
    else:
        mesh.transparentAreas.append(area)
    return mesh
Beispiel #14
0
def AddPrepassAreasToStatic(static):
    if static.displayTargetMesh:
        mesh = trinity.Tr2Mesh()
        mesh.name = 'EnlightenAreas'
        mesh.geometryResPath = static.geometryResPath
        static.detailMeshes.append(mesh)
        for area in static.enlightenAreas:
            newArea = trinity.Tr2MeshArea()
            newArea.name = area.name
            newArea.index = area.index
            newArea.count = area.count
            newArea.effect = area.effect
            mesh.opaqueAreas.append(newArea)
            area.effect = None

        static.detailMeshes.append(mesh)
    for mesh in static.detailMeshes:
        AddPrepassAreasToStandardMesh(mesh)

    if ENABLE_MATERIAL_RES_SUPPORT:
        materialRes = Materials.LoadMaterialResFromObject(static)
        Materials.ApplyMaterialRes(static, materialRes)
Beispiel #15
0
def CopyAreaForPrePassShadows(area, sourceAreaType = SOURCE_AREA_TYPE_OPAQUE):
    originalEffect = area.effect
    if originalEffect is None:
        return
    newArea = trinity.Tr2MeshArea()
    newArea.name = area.name
    newArea.index = area.index
    newArea.count = area.count
    newEffect = trinity.Tr2Effect()
    if 'skinned' in originalEffect.effectFilePath.lower():
        if sourceAreaType == SOURCE_AREA_TYPE_DECAL:
            newEffect.effectFilePath = SKINNED_SHADOW_ALPHATEST_EFFECT_PATH
        elif 'alphatest' in originalEffect.effectFilePath.lower():
            newEffect.effectFilePath = SKINNED_SHADOW_ALPHATEST_EFFECT_PATH
        else:
            newEffect.effectFilePath = SKINNED_SHADOW_OPAQUE_EFFECT_PATH
    elif sourceAreaType == SOURCE_AREA_TYPE_DECAL:
        newEffect.effectFilePath = STATIC_SHADOW_ALPHATEST_EFFECT_PATH
    elif 'alphatest' in originalEffect.effectFilePath.lower():
        newEffect.effectFilePath = STATIC_SHADOW_ALPHATEST_EFFECT_PATH
    else:
        newEffect.effectFilePath = STATIC_SHADOW_OPAQUE_EFFECT_PATH
    newEffect.name = originalEffect.name
    newParam = CopyVector4Parameter(area.effect, 'TransformUV0')
    if newParam is not None:
        newEffect.parameters.append(newParam)
    if sourceAreaType == SOURCE_AREA_TYPE_DECAL:
        newParam = CopyVector4Parameter(area.effect, 'MaterialDiffuseColor')
        if newParam is not None:
            newEffect.parameters.append(newParam)
        newParam = CopyResourceByName(area.effect, 'DiffuseMap')
        if newParam is not None:
            newEffect.resources.append(newParam)
        newParam = CopyFloatParameter(area.effect, 'CutMaskInfluence')
        if newParam is not None:
            newEffect.parameters.append(newParam)
    newArea.effect = newEffect
    return newArea
Beispiel #16
0
 def __init__(self, text, parent, size=72, shadow=0, hspace=8):
     self.transform = trinity.EveTransform()
     self.transform.mesh = trinity.Tr2Mesh()
     self.transform.mesh.geometryResPath = 'res:/Model/Global/zsprite.gr2'
     self.transform.modifier = 1
     self.measurer = trinity.Tr2FontMeasurer()
     self.measurer.limit = 0
     fontFamily = uicore.font.GetFontFamilyBasedOnClientLanguageID()[
         fontConst.STYLE_DEFAULT]
     self.measurer.font = fontFamily[2]
     self.measurer.fontSize = size
     self.measurer.letterSpace = hspace
     self.measurer.AddText(text.upper())
     height = self.measurer.ascender - self.measurer.descender
     width = self.measurer.cursorX
     self.measurer.CommitText(0, self.measurer.ascender)
     self.transform.scaling = (width, height, 0)
     area = trinity.Tr2MeshArea()
     self.transform.mesh.transparentAreas.append(area)
     area.effect = self.effect = trinity.Tr2Effect()
     sampler = list(self.effect.samplerOverrides.GetDefaultValue())
     sampler[0] = 'DiffuseMapSampler'
     sampler[1] = trinity.TRITADDRESS_CLAMP
     sampler[2] = trinity.TRITADDRESS_CLAMP
     self.effect.samplerOverrides.append(tuple(sampler))
     self.effect.effectFilePath = 'res:/Graphics/Effect/Managed/Space/SpecialFX/TextureColor.fx'
     diffuseColor = trinity.Tr2Vector4Parameter()
     diffuseColor.name = 'DiffuseColor'
     self.effect.parameters.append(diffuseColor)
     self.diffuseColor = diffuseColor
     self.diffuseMap = trinity.TriTextureParameter()
     self.diffuseMap.name = 'DiffuseMap'
     self.effect.resources.append(self.diffuseMap)
     parent.children.append(self.transform)
     trinity.device.RegisterResource(self)
     self.OnCreate(trinity.device)
    def SetShipModel(self, entity):
        hologramComponent = entity.GetComponent('shipHologram')
        if hologramComponent is None or not hologramComponent.graphicLoaded:
            return
        interiorPlaceable = entity.GetComponent('interiorPlaceable')
        if interiorPlaceable is None:
            return
        effect = trinity.Load(
            'res:/graphics/interior/effect/hologram/shipHologramEffect.red')
        targetPlaceable = interiorPlaceable.renderObject
        targetPlaceable.isUnique = True
        targetPlaceable.BindLowLevelShaders()
        targetVisual = targetPlaceable.placeableRes.visualModel
        mesh = None
        for each in targetVisual.meshes:
            if each.name == 'shipHologramMesh':
                mesh = each
                break

        if mesh is not None:
            targetVisual.meshes.remove(mesh)
        targetPlaceable.BoundingBoxReset()
        if self.activeShipModel is None:
            return
        if self.activeShipID is None:
            return
        mesh = trinity.Tr2Mesh()
        mesh.name = 'shipHologramMesh'
        mesh.geometryResPath = self.activeShipModel.mesh.GetGeometryResPath()
        maxIndex = 0
        for area in self.activeShipModel.mesh.opaqueAreas:
            maxIndex = max(maxIndex, area.index)

        for area in self.activeShipModel.mesh.decalAreas:
            maxIndex = max(maxIndex, area.index)

        for area in self.activeShipModel.mesh.transparentAreas:
            maxIndex = max(maxIndex, area.index)

        meshArea = trinity.Tr2MeshArea()
        meshArea.effect = effect
        meshArea.count = maxIndex + 1
        mesh.transparentAreas.append(meshArea)
        effect.BindLowLevelShader([])
        bbMinOriginal, bbMaxOriginal = targetVisual.GetBoundingBoxInLocalSpace(
        )
        scale, extra = self.CalculateModelScale(
            hologramComponent, self.activeShipModel.boundingSphereRadius,
            self.activeShipID)
        param = effect.parameters['ScalingAndOffset']
        x = param.x = hologramComponent.positionOffset[0]
        y = param.y = hologramComponent.positionOffset[1]
        z = param.z = hologramComponent.positionOffset[2]
        param.w = scale * extra
        param = effect.parameters['Color']
        param.x = hologramComponent.color[0]
        param.y = hologramComponent.color[1]
        param.z = hologramComponent.color[2]
        param = effect.parameters['SpotlightOrigin']
        param.x = hologramComponent.spotlightOrigin[0]
        param.y = hologramComponent.spotlightOrigin[1]
        param.z = hologramComponent.spotlightOrigin[2]
        targetVisual.meshes.append(mesh)
        trinity.WaitForResourceLoads()
        bbMin, bbMax = self.activeShipModel.GetLocalBoundingBox()
        maxBounds = max(abs(bbMin[0]),
                        max(bbMax[0], max(abs(bbMin[2]), bbMax[2])))
        bbMin = (-maxBounds, bbMin[2], -maxBounds)
        bbMax = (maxBounds, bbMax[2], maxBounds)
        bbMin = geo2.Vec3Scale(bbMin, scale)
        bbMax = geo2.Vec3Scale(bbMax, scale)
        bbMin = geo2.Vec3Add(bbMin, (x, y, z))
        bbMax = geo2.Vec3Add(bbMax, (x, y, z))
        bbMin = geo2.Min(bbMin, bbMinOriginal)
        bbMax = geo2.Max(bbMax, bbMaxOriginal)
        targetPlaceable.BoundingBoxOverride(bbMin, bbMax)
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