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
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
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)
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
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()
def CreateMaterial(situation): material = trinity.Tr2ShaderMaterial() material.highLevelShaderName = 'SSAO' material.defaultSituation = situation return material
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