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)
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)
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)
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)
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)
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