//=============== Copyright © Valve Corporation, All rights reserved. =================// // //=====================================================================================// #include "BaseVSShader.h" #include "shaderlib/commandbuilder.h" #include "character_vs30.inc" #include "character_ps30.inc" #include "character_vs20.inc" #include "character_ps20b.inc" #include "../materialsystem_global.h" // NOTE: This has to be the last file included! #include "tier0/memdbgon.h" //#define CHARACTER_LIMIT_LIGHTS_WITH_PHONGWARP 1 BEGIN_VS_SHADER( Character, "Help for Character Shader" ) BEGIN_SHADER_PARAMS SHADER_PARAM( BUMPMAP, SHADER_PARAM_TYPE_TEXTURE, "", "" ) SHADER_PARAM( MASKS1, SHADER_PARAM_TYPE_TEXTURE, "", "" ) SHADER_PARAM( METALNESS, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( WARPINDEX, SHADER_PARAM_TYPE_FLOAT, "", "" ) // Phong terms SHADER_PARAM( PHONGBOOST, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( PHONGALBEDOBOOST, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( PHONGTINT, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( PHONGWARPTEXTURE, SHADER_PARAM_TYPE_TEXTURE, "", "" ) SHADER_PARAM( PHONGEXPONENT, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( BASEALPHAPHONGMASK, SHADER_PARAM_TYPE_BOOL, "", "" ) // Envmap terms SHADER_PARAM( ENVMAP, SHADER_PARAM_TYPE_TEXTURE, "", "" ) SHADER_PARAM( ENVMAPCONTRAST, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( ENVMAPSATURATION, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( ENVMAPTINT, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( BASEALPHAENVMASK, SHADER_PARAM_TYPE_BOOL, "", "" ) SHADER_PARAM( BUMPALPHAENVMASK, SHADER_PARAM_TYPE_BOOL, "", "" ) SHADER_PARAM( ENVMAPLIGHTSCALE, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( ENVMAPLIGHTSCALEMINMAX, SHADER_PARAM_TYPE_VEC2, "", "" ) // Phong and envmap SHADER_PARAM( FRESNELRANGESTEXTURE, SHADER_PARAM_TYPE_TEXTURE, "", "" ) SHADER_PARAM( FRESNELRANGES, SHADER_PARAM_TYPE_VEC3, "", "" ) SHADER_PARAM( MASKS2, SHADER_PARAM_TYPE_TEXTURE, "", "" ) SHADER_PARAM( ANISOTROPYAMOUNT, SHADER_PARAM_TYPE_FLOAT, "", "" ) // Rim lighting terms SHADER_PARAM( RIMLIGHTEXPONENT, SHADER_PARAM_TYPE_FLOAT, "4.0", "Exponent for rim lights" ) SHADER_PARAM( RIMLIGHTBOOST, SHADER_PARAM_TYPE_FLOAT, "1.0", "Boost for rim lights" ) SHADER_PARAM( RIMLIGHTALBEDO, SHADER_PARAM_TYPE_FLOAT, "0.0", "" ) SHADER_PARAM( RIMLIGHTTINT, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( SHADOWRIMBOOST, SHADER_PARAM_TYPE_FLOAT, "2.0f", "Extra boost for rim lights in shadow" ) SHADER_PARAM( FAKERIMBOOST, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( FAKERIMTINT, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( RIMHALOBOOST, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( RIMHALOBOUNDS, SHADER_PARAM_TYPE_VEC4, "", "" ) // Ambient reflection terms SHADER_PARAM( AMBIENTREFLECTIONBOOST, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( AMBIENTREFLECTIONBOUNCECOLOR, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( AMBIENTREFLECTIONBOUNCECENTER, SHADER_PARAM_TYPE_VEC3, "", "" ) // Diffuse shading params SHADER_PARAM( SHADOWSATURATION, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( SHADOWSATURATIONBOUNDS, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( SHADOWTINT, SHADER_PARAM_TYPE_VEC4, "", "Color and alpha" ) SHADER_PARAM( SHADOWCONTRAST, SHADER_PARAM_TYPE_FLOAT, "", "" ) // Self-illum SHADER_PARAM( SELFILLUMBOOST, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( BASEALPHASELFILLUMMASK, SHADER_PARAM_TYPE_BOOL, "", "" ) // Composite Preview SHADER_PARAM( PREVIEW, SHADER_PARAM_TYPE_BOOL, "", "" ) // Composite Preview Samplers SHADER_PARAM( MATERIALMASK, SHADER_PARAM_TYPE_TEXTURE, "", "" ) SHADER_PARAM( AO, SHADER_PARAM_TYPE_TEXTURE, "", "" ) SHADER_PARAM( DETAIL, SHADER_PARAM_TYPE_TEXTURE, "", "" ) SHADER_PARAM( DETAILNORMAL, SHADER_PARAM_TYPE_TEXTURE, "", "" ) SHADER_PARAM( GRUNGE, SHADER_PARAM_TYPE_TEXTURE, "", "" ) SHADER_PARAM( GRUNGETEXTURETRANSFORM, SHADER_PARAM_TYPE_MATRIX, "", "" ) SHADER_PARAM( NOISE, SHADER_PARAM_TYPE_TEXTURE, "", "" ) // Composite Preview Parameters Per-Material SHADER_PARAM( DETAILSCALE, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DETAILPHONGBOOST, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( WEARDETAILPHONGBOOST, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DAMAGEDETAILPHONGBOOST, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DETAILENVBOOST, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( WEARDETAILENVBOOST, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DAMAGEDETAILENVBOOST, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DETAILPHONGALBEDOTINT, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DAMAGEDETAILSATURATION, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DAMAGEDETAILBRIGHTNESSADJUSTMENT, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DETAILWARPINDEX, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DETAILMETALNESS, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DETAILNORMALDEPTH, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DAMAGENORMALEDGEDEPTH, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DAMAGEEDGEPHONGBOOST, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DAMAGEEDGEENVBOOST, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( CURVATUREWEARBOOST, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( CURVATUREWEARPOWER, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( GRIME, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( GRIMESATURATION, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( GRIMEBRIGHTNESSADJUSTMENT, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DAMAGEGRUNGE, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DETAILGRUNGE, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( GRUNGEMAX, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( DAMAGELEVELS1, SHADER_PARAM_TYPE_VEC2, "", "" ) SHADER_PARAM( DAMAGELEVELS2, SHADER_PARAM_TYPE_VEC2, "", "" ) SHADER_PARAM( DAMAGELEVELS3, SHADER_PARAM_TYPE_VEC2, "", "" ) SHADER_PARAM( DAMAGELEVELS4, SHADER_PARAM_TYPE_VEC2, "", "" ) // Composite Preview Pattern Parameters SHADER_PARAM( PATTERN, SHADER_PARAM_TYPE_TEXTURE, "", "" ) SHADER_PARAM( PATTERNTEXTURETRANSFORM, SHADER_PARAM_TYPE_MATRIX, "", "" ) SHADER_PARAM( PATTERNREPLACEINDEX, SHADER_PARAM_TYPE_INTEGER, "", "" ) SHADER_PARAM( PATTERNCOLORINDICES, SHADER_PARAM_TYPE_VEC4, "", "" ) SHADER_PARAM( PATTERNDETAILINFLUENCE, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( PATTERNPHONGFACTOR, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( PATTERNPAINTTHICKNESS, SHADER_PARAM_TYPE_FLOAT, "", "" ) // Composite Preview Parameters SHADER_PARAM( PALETTECOLOR1, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( PALETTECOLOR2, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( PALETTECOLOR3, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( PALETTECOLOR4, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( PALETTECOLOR5, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( PALETTECOLOR6, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( PALETTECOLOR7, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( PALETTECOLOR8, SHADER_PARAM_TYPE_COLOR, "", "" ) SHADER_PARAM( CUSTOMPAINTJOB, SHADER_PARAM_TYPE_BOOL, "", "" ) SHADER_PARAM( ALLOVERPAINTJOB, SHADER_PARAM_TYPE_BOOL, "", "" ) SHADER_PARAM( WEARPROGRESS, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM( WEAREXPONENT, SHADER_PARAM_TYPE_FLOAT, "", "" ) SHADER_PARAM(GRUNGETEXTUREROTATION, SHADER_PARAM_TYPE_MATRIX, "", "") SHADER_PARAM(PATTERNTEXTUREROTATION, SHADER_PARAM_TYPE_MATRIX, "", "") SHADER_PARAM( ENTITYORIGIN, SHADER_PARAM_TYPE_VEC3, "", "" ) END_SHADER_PARAMS SHADER_INIT_PARAMS() { if ( !params[PHONGBOOST]->IsDefined() ) { params[PHONGBOOST]->SetFloatValue( 1.0f ); } if ( !params[PHONGEXPONENT]->IsDefined() ) { params[PHONGEXPONENT]->SetFloatValue( 1.0f ); } if ( !params[PHONGALBEDOBOOST]->IsDefined() ) { params[PHONGALBEDOBOOST]->SetFloatValue( 1.0f ); } if ( !params[PHONGTINT]->IsDefined() ) { params[PHONGTINT]->SetVecValue( 1.0f, 1.0f, 1.0f ); } if ( !params[BASEALPHAPHONGMASK]->IsDefined() ) { params[BASEALPHAPHONGMASK]->SetIntValue( 0 ); } if ( !params[ENVMAPCONTRAST]->IsDefined() ) { params[ENVMAPCONTRAST]->SetFloatValue( 0.0f ); } if ( !params[ENVMAPSATURATION]->IsDefined() ) { params[ENVMAPSATURATION]->SetFloatValue( 0.0 ); } if ( !params[ENVMAPTINT]->IsDefined() ) { params[ENVMAPTINT]->SetVecValue( 1.0f, 1.0f, 1.0f ); } if ( !params[BASEALPHAENVMASK]->IsDefined() ) { params[BASEALPHAENVMASK]->SetIntValue( 0 ); } if ( !params[BUMPALPHAENVMASK]->IsDefined() ) { params[BUMPALPHAENVMASK]->SetIntValue( 0 ); } if ( !params[SHADOWSATURATION]->IsDefined() ) { params[SHADOWSATURATION]->SetFloatValue( 0.0f ); } if ( !params[SHADOWSATURATIONBOUNDS]->IsDefined() ) { params[SHADOWSATURATIONBOUNDS]->SetVecValue( 0.4f, 0.5f, 0.5f, 0.6f ); } if ( !params[SHADOWTINT]->IsDefined() ) { params[SHADOWTINT]->SetVecValue( 1.0f, 1.0f, 1.0f ); } if ( !params[RIMLIGHTEXPONENT]->IsDefined() ) { params[RIMLIGHTEXPONENT]->SetFloatValue( 4.0f ); } if ( !params[RIMLIGHTBOOST]->IsDefined() ) { params[RIMLIGHTBOOST]->SetFloatValue( 0.0f ); } if ( !params[RIMLIGHTALBEDO]->IsDefined() ) { params[RIMLIGHTALBEDO]->SetFloatValue( 0.0f ); } if ( !params[AMBIENTREFLECTIONBOOST]->IsDefined() ) { params[AMBIENTREFLECTIONBOOST]->SetFloatValue( 0.0f ); } if ( !params[AMBIENTREFLECTIONBOUNCECOLOR]->IsDefined() ) { params[AMBIENTREFLECTIONBOUNCECOLOR]->SetVecValue( 0.0f, 0.0f, 0.0f ); } if ( !params[AMBIENTREFLECTIONBOUNCECENTER]->IsDefined() ) { params[AMBIENTREFLECTIONBOUNCECENTER]->SetVecValue( 0.0f, 42.0f, 0.0f ); } if ( !params[FRESNELRANGES]->IsDefined() ) { params[FRESNELRANGES]->SetVecValue( 1.0f, 1.0f, 1.0f ); } // Metalness is just a multiply on the albedo, so invert the defined amount to get the multiplier if ( !params[METALNESS]->IsDefined() ) { params[METALNESS]->SetFloatValue( 1.0f ); } else { params[METALNESS]->SetFloatValue( 1 - clamp( params[METALNESS]->GetFloatValue(), 0.0f, 1.0f ) ); } if ( !params[ENVMAPLIGHTSCALE]->IsDefined() ) { params[ENVMAPLIGHTSCALE]->SetFloatValue( 0.0f ); } if ( !params[ENVMAPLIGHTSCALEMINMAX]->IsDefined() ) { params[ENVMAPLIGHTSCALEMINMAX]->SetVecValue( 0.0f, 1.0f ); } if ( !params[RIMLIGHTTINT]->IsDefined() ) { params[RIMLIGHTTINT]->SetVecValue( 1.0f, 1.0f, 1.0f ); } if ( !params[WARPINDEX]->IsDefined() ) { params[WARPINDEX]->SetFloatValue( 0.0f ); } if ( !params[SHADOWCONTRAST]->IsDefined() ) { params[SHADOWCONTRAST]->SetFloatValue( 0.0f ); } if ( !params[FAKERIMTINT]->IsDefined() ) { params[FAKERIMTINT]->SetVecValue( 1.0f, 1.0f, 1.0f ); } if ( !params[RIMHALOBOOST]->IsDefined() ) { params[RIMHALOBOOST]->SetFloatValue( 0.0f ); } if ( !params[RIMHALOBOUNDS]->IsDefined() ) { params[RIMHALOBOUNDS]->SetVecValue( 0.4f, 0.5f, 0.5f, 0.6f ); } if ( !params[PREVIEW]->IsDefined() ) { params[PREVIEW]->SetIntValue( 0 ); } if ( !params[SHADOWRIMBOOST]->IsDefined() ) { params[SHADOWRIMBOOST]->SetIntValue( 2.0f ); } if ( params[PREVIEW]->GetIntValue() > 0 ) { if ( !params[DETAILSCALE]->IsDefined() ) { params[DETAILSCALE]->SetFloatValue( 4.0f ); } if ( !params[DETAILPHONGBOOST]->IsDefined() ) { params[DETAILPHONGBOOST]->SetVecValue( 1.0f, 1.0f, 1.0f, 1.0f ); } if ( !params[WEARDETAILPHONGBOOST]->IsDefined() ) { params[WEARDETAILPHONGBOOST]->SetVecValue( 0.0f, 0.0f, 0.0f, 0.0f ); } if ( !params[DAMAGEDETAILPHONGBOOST]->IsDefined() ) { params[DAMAGEDETAILPHONGBOOST]->SetVecValue( 1.0f, 1.0f, 1.0f, 1.0f ); } if ( !params[DETAILENVBOOST]->IsDefined() ) { params[DETAILENVBOOST]->SetVecValue( 1.0f, 1.0f, 1.0f, 1.0f ); } if ( !params[WEARDETAILENVBOOST]->IsDefined() ) { params[WEARDETAILENVBOOST]->SetVecValue( 0.0f, 0.0f, 0.0f, 0.0f ); } if ( !params[DAMAGEDETAILENVBOOST]->IsDefined() ) { params[DAMAGEDETAILENVBOOST]->SetVecValue( 0.0f, 0.0f, 0.0f, 0.0f ); } if ( !params[DETAILPHONGALBEDOTINT]->IsDefined() ) { params[DETAILPHONGALBEDOTINT]->SetVecValue( 0.0f, 0.0f, 0.0f, 0.0f ); } if ( !params[DETAILWARPINDEX]->IsDefined() ) { params[DETAILWARPINDEX]->SetVecValue( 0.0f, 0.0f, 0.0f, 0.0f ); } // Metalness is just a multiply on the albedo, so invert the defined amount to get the multiplier if ( !params[DETAILMETALNESS]->IsDefined() ) { params[DETAILMETALNESS]->SetVecValue( 1.0f, 1.0f, 1.0f, 1.0f ); } if ( !params[DETAILNORMALDEPTH]->IsDefined() ) { params[DETAILNORMALDEPTH]->SetVecValue( 1.0f, 1.0f, 1.0f, 1.0f ); } if ( !params[DAMAGENORMALEDGEDEPTH]->IsDefined() ) { params[DAMAGENORMALEDGEDEPTH]->SetVecValue( 1.0f, 1.0f, 1.0f, 1.0f ); } if ( !params[DAMAGEEDGEPHONGBOOST]->IsDefined() ) { params[DAMAGEEDGEPHONGBOOST]->SetVecValue( 0.0f, 0.0f, 0.0f, 0.0f ); } if ( !params[DAMAGEEDGEENVBOOST]->IsDefined() ) { params[DAMAGEEDGEENVBOOST]->SetVecValue( 0.0f, 0.0f, 0.0f, 0.0f ); } if ( !params[DAMAGELEVELS1]->IsDefined() ) { params[DAMAGELEVELS1]->SetVecValue( 0.0f, 1.0f ); } if ( !params[DAMAGELEVELS2]->IsDefined() ) { params[DAMAGELEVELS2]->SetVecValue( 0.0f, 1.0f ); } if ( !params[DAMAGELEVELS3]->IsDefined() ) { params[DAMAGELEVELS3]->SetVecValue( 0.0f, 1.0f ); } if ( !params[DAMAGELEVELS4]->IsDefined() ) { params[DAMAGELEVELS4]->SetVecValue( 0.0f, 1.0f ); } if ( !params[CUSTOMPAINTJOB]->IsDefined() ) { params[CUSTOMPAINTJOB]->SetIntValue( 0 ); } if ( !params[PATTERNDETAILINFLUENCE]->IsDefined() ) { params[PATTERNDETAILINFLUENCE]->SetFloatValue( 32.0f ); } if ( !params[ALLOVERPAINTJOB]->IsDefined() ) { params[ALLOVERPAINTJOB]->SetIntValue( 0 ); } if ( !params[CURVATUREWEARBOOST]->IsDefined() ) { params[CURVATUREWEARBOOST]->SetVecValue( 0.0f, 0.0f, 0.0f, 0.0f ); } if ( !params[CURVATUREWEARPOWER]->IsDefined() ) { params[CURVATUREWEARPOWER]->SetVecValue( 1.0f, 1.0f, 1.0f, 1.0f ); } if ( !params[DAMAGEDETAILSATURATION]->IsDefined() ) { params[DAMAGEDETAILSATURATION]->SetVecValue( 0.0f, 0.0f, 0.0f, 0.0f ); } if (!params[DAMAGEDETAILBRIGHTNESSADJUSTMENT]->IsDefined()) { params[DAMAGEDETAILBRIGHTNESSADJUSTMENT]->SetVecValue(0.0f, 0.0f, 0.0f, 0.0f); } if ( !params[GRIME]->IsDefined() ) { params[GRIME]->SetVecValue( 0.25f, 0.25f, 0.25f, 0.25f ); } if ( !params[GRIMESATURATION]->IsDefined() ) { params[GRIMESATURATION]->SetVecValue( 0.0f, 0.0f, 0.0f, 0.0f ); } if ( !params[GRIMEBRIGHTNESSADJUSTMENT]->IsDefined() ) { params[GRIMEBRIGHTNESSADJUSTMENT]->SetVecValue( 0.0f, 0.0f, 0.0f, 0.0f ); } if ( !params[DAMAGEGRUNGE]->IsDefined() ) { params[DAMAGEGRUNGE]->SetVecValue( 0.25f, 0.25f, 0.25f, 0.25f ); } if ( !params[DETAILGRUNGE]->IsDefined() ) { params[DETAILGRUNGE]->SetVecValue( 0.0f, 0.0f, 0.0f, 0.0f ); } if (!params[GRUNGEMAX]->IsDefined()) { params[GRUNGEMAX]->SetVecValue( 1.0f, 1.0f, 1.0f, 1.0f ); } if ( !params[WEARPROGRESS]->IsDefined() ) { params[WEARPROGRESS]->SetFloatValue( 0.0f ); } if ( !params[WEAREXPONENT]->IsDefined() ) { params[WEAREXPONENT]->SetFloatValue( 1.0f ); } if ( !params[PATTERNCOLORINDICES]->IsDefined() ) { params[PATTERNCOLORINDICES]->SetVecValue( 1, 2, 3, 4 ); } if ( !params[PATTERNREPLACEINDEX]->IsDefined() ) { params[PATTERNREPLACEINDEX]->SetIntValue( 1 ); } if ( !params[NOISE]->IsDefined() ) { params[NOISE]->SetStringValue( "models/weapons/customization/materials/noise" ); } if (!params[PATTERNPHONGFACTOR]->IsDefined()) { params[PATTERNPHONGFACTOR]->SetFloatValue( 0.0f ); } if (!params[PATTERNPAINTTHICKNESS]->IsDefined()) { params[PATTERNPAINTTHICKNESS]->SetFloatValue(0.0f); } if (!params[PATTERNTEXTURETRANSFORM]->IsDefined()) { params[PATTERNTEXTURETRANSFORM]->SetStringValue( "scale 1 1 translate 0 0 rotate 0" ); } if (!params[GRUNGETEXTURETRANSFORM]->IsDefined()) { params[GRUNGETEXTURETRANSFORM]->SetStringValue( "scale 1 1 translate 0 0 rotate 0" ); } if (!params[GRUNGETEXTUREROTATION]->IsDefined()) { params[GRUNGETEXTUREROTATION]->SetStringValue("scale 1 1 translate 0 0 rotate 0"); } if (!params[PATTERNTEXTUREROTATION]->IsDefined()) { params[PATTERNTEXTUREROTATION]->SetStringValue("scale 1 1 translate 0 0 rotate 0"); } } SET_FLAGS2( MATERIAL_VAR2_NEEDS_TANGENT_SPACES ); SET_FLAGS2( MATERIAL_VAR2_SUPPORTS_HW_SKINNING ); SET_FLAGS2( MATERIAL_VAR2_LIGHTING_VERTEX_LIT ); } SHADER_FALLBACK { return 0; } SHADER_INIT { LoadTexture( BASETEXTURE ); if ( params[BUMPMAP]->IsDefined() ) { LoadTexture( BUMPMAP ); } if ( params[MASKS1]->IsDefined() ) { LoadTexture( MASKS1 ); } if ( params[PHONGWARPTEXTURE]->IsDefined() ) { LoadTexture( PHONGWARPTEXTURE ); } if ( params[FRESNELRANGESTEXTURE]->IsDefined() ) { LoadTexture( FRESNELRANGESTEXTURE ); } if ( params[MASKS2]->IsDefined() ) { LoadTexture( MASKS2 ); } if ( params[ENVMAP]->IsDefined() ) { LoadCubeMap( ENVMAP ); } bool bPreview = params[PREVIEW]->IsDefined() && ( params[PREVIEW]->GetIntValue() > 0 ); if ( bPreview && params[MATERIALMASK]->IsDefined() ) { LoadTexture( MATERIALMASK ); } if ( bPreview && params[AO]->IsDefined() ) { LoadTexture( AO ); } if ( bPreview && params[GRUNGE]->IsDefined() ) { LoadTexture( GRUNGE ); } if ( bPreview && params[DETAIL]->IsDefined() ) { LoadTexture( DETAIL ); } if ( bPreview && params[DETAILNORMAL]->IsDefined() ) { LoadTexture( DETAILNORMAL ); } if ( bPreview && params[PATTERN]->IsDefined() ) { LoadTexture( PATTERN ); } if ( bPreview ) { LoadTexture( NOISE ); } } SHADER_DRAW { bool bIsTranslucent = IS_FLAG_SET( MATERIAL_VAR_TRANSLUCENT ) != 0; bool bHasMasks1 = IsTextureSet( MASKS1, params ); bool bHasFresnelRangesTexture = IsTextureSet( FRESNELRANGESTEXTURE, params ); bool bHasPhongWarpTexture = IsTextureSet( PHONGWARPTEXTURE, params ); bool bHasBumpMap = IsTextureSet( BUMPMAP, params ); bool bHasEnvmap = params[ENVMAP]->IsDefined(); bool bHasAmbientReflection = params[AMBIENTREFLECTIONBOOST]->IsDefined() && ( params[AMBIENTREFLECTIONBOOST]->GetFloatValue() > 0 ); bool bHasBounceColor = bHasAmbientReflection && params[AMBIENTREFLECTIONBOUNCECOLOR]->IsDefined(); //bool bHasRim = params[RIMLIGHTBOOST]->IsDefined() && ( params[RIMLIGHTBOOST]->GetFloatValue() > 0 ); bool bBaseAlphaSelfIllumMask = !bIsTranslucent && params[BASEALPHASELFILLUMMASK]->IsDefined() && ( params[BASEALPHASELFILLUMMASK]->GetIntValue() > 0 ); // Phong mask uses bump alpha by default, but can use base alpha if specified bool bBaseAlphaPhongMask = !bBaseAlphaSelfIllumMask && !bIsTranslucent && params[BASEALPHAPHONGMASK]->IsDefined() && ( params[BASEALPHAPHONGMASK]->GetIntValue() > 0 ); bool bHasAnisotropy = params[ANISOTROPYAMOUNT]->IsDefined() && ( params[ANISOTROPYAMOUNT]->GetFloatValue() > 0 ); bool bHasShadowSaturation = params[SHADOWSATURATION]->IsDefined() && ( params[SHADOWSATURATION]->GetFloatValue() > 0 ); bool bHasMasks2 = IsTextureSet( MASKS2, params ) && ( bHasEnvmap || bHasShadowSaturation || bHasAnisotropy ); // Envmap uses same mask as spec bool bBaseAlphaEnvMask = bHasEnvmap && bBaseAlphaPhongMask; bool bBumpAlphaEnvMask = bHasEnvmap && !bBaseAlphaPhongMask; // Unless we've specified it should be different. bBaseAlphaEnvMask = !bBaseAlphaSelfIllumMask && ( bBaseAlphaEnvMask || ( bHasEnvmap && !bIsTranslucent && ( params[BASEALPHAENVMASK]->IsDefined() && ( params[BASEALPHAENVMASK]->GetIntValue() > 0 ) ) ) ); bBumpAlphaEnvMask = bHasEnvmap && bHasBumpMap && ( params[BUMPALPHAENVMASK]->IsDefined() && ( params[BUMPALPHAENVMASK]->GetIntValue() > 0 ) ); // Can't have both. bBaseAlphaEnvMask = bBaseAlphaEnvMask && !bBumpAlphaEnvMask; bool bHasFakeRim = params[FAKERIMBOOST]->IsDefined() && ( params[FAKERIMBOOST]->GetFloatValue() > 0 ); bool bPreview = params[PREVIEW]->IsDefined() && ( params[PREVIEW]->GetIntValue() > 0 ); bool bPattern = bPreview && IsTextureSet( PATTERN, params ); bool bHasCustomPaint = bPattern && params[CUSTOMPAINTJOB]->IsDefined() && ( params[CUSTOMPAINTJOB]->GetIntValue() > 0 ); bool bHasAlloverPaint = bPattern && params[ALLOVERPAINTJOB]->IsDefined() && ( params[ALLOVERPAINTJOB]->GetIntValue() > 0 ); bool bHasAO = bPreview && IsTextureSet( AO, params ); bool bHasMaterialMask = bPreview && IsTextureSet( MATERIALMASK, params ); bool bHasGrunge = bPreview && IsTextureSet( GRUNGE, params ); bool bHasDetail = bPreview && IsTextureSet( DETAIL, params ); bool bHasDetailNormal = bPreview && IsTextureSet( DETAILNORMAL, params ); bool bHasFlashlight = UsingFlashlight( params ); if ( bPreview ) // need to turn off some features for shadercompile to complete, otherwise it runs out of memory before all combos are compiled { bHasBounceColor = false; bBaseAlphaSelfIllumMask = false; bHasFakeRim = false; bHasFlashlight = false; } bool bSupportsCSM = g_pHardwareConfig->SupportsCascadedShadowMapping(); // need to turn off some features for shadercompile to complete, otherwise it runs out of memory before all combos are compiled if ( bHasFlashlight ) bSupportsCSM = false; if ( bPreview ) bSupportsCSM = false; int nCSMQualityComboValue = 0; if ( bSupportsCSM ) nCSMQualityComboValue = g_pHardwareConfig->GetCSMShaderMode( materials->GetCurrentConfigForVideoCard().GetCSMQualityMode() ); bool bUseStaticControlFlow = g_pHardwareConfig->SupportsStaticControlFlow(); SHADOW_STATE { SetInitialShadowState(); // Set stream format int userDataSize = 4; // tangent S unsigned int flags = VERTEX_POSITION | VERTEX_NORMAL | VERTEX_FORMAT_COMPRESSED; int nTexCoordCount = 1; pShaderShadow->VertexShaderVertexFormat( flags, nTexCoordCount, NULL, userDataSize ); ShadowFilterMode_t nShadowFilterMode = SHADOWFILTERMODE_DEFAULT; if ( bHasFlashlight ) { nShadowFilterMode = g_pHardwareConfig->GetShadowFilterMode( false, true ); // Based upon vendor and device dependent formats } // Vertex Shader DECLARE_STATIC_VERTEX_SHADER( character_vs30 ); SET_STATIC_VERTEX_SHADER_COMBO( USEBOUNCECOLOR, bHasBounceColor ); SET_STATIC_VERTEX_SHADER_COMBO( FLASHLIGHT, bHasFlashlight ); SET_STATIC_VERTEX_SHADER_COMBO( FLATTEN_STATIC_CONTROL_FLOW, !bUseStaticControlFlow ); SET_STATIC_VERTEX_SHADER( character_vs30 ); // Pixel Shader DECLARE_STATIC_PIXEL_SHADER( character_ps30 ); SET_STATIC_PIXEL_SHADER_COMBO( MASKS1, bHasMasks1 ); SET_STATIC_PIXEL_SHADER_COMBO( MASKS2, bHasMasks2 ); SET_STATIC_PIXEL_SHADER_COMBO( FRESNELRANGESTEXTURE, bHasFresnelRangesTexture ); SET_STATIC_PIXEL_SHADER_COMBO( PHONGWARPTEXTURE, bHasPhongWarpTexture ); SET_STATIC_PIXEL_SHADER_COMBO( ENVMAP, bHasEnvmap ); SET_STATIC_PIXEL_SHADER_COMBO( AMBIENTREFLECTION, bHasAmbientReflection ); SET_STATIC_PIXEL_SHADER_COMBO( USEBOUNCECOLOR, bHasBounceColor ); SET_STATIC_PIXEL_SHADER_COMBO( ANISOTROPY, bHasAnisotropy ); SET_STATIC_PIXEL_SHADER_COMBO( BASEALPHAPHONGMASK, bBaseAlphaPhongMask ); SET_STATIC_PIXEL_SHADER_COMBO( BASEALPHAENVMASK, bBaseAlphaEnvMask ); SET_STATIC_PIXEL_SHADER_COMBO( BUMPALPHAENVMASK, bBumpAlphaEnvMask ); SET_STATIC_PIXEL_SHADER_COMBO( SHADOWSATURATION, bHasShadowSaturation ); SET_STATIC_PIXEL_SHADER_COMBO( BASEALPHASELFILLUMMASK, bBaseAlphaSelfIllumMask ); SET_STATIC_PIXEL_SHADER_COMBO( FAKERIM, bHasFakeRim && !bHasFlashlight ); SET_STATIC_PIXEL_SHADER_COMBO( CASCADED_SHADOW_MAPPING, bSupportsCSM ); SET_STATIC_PIXEL_SHADER_COMBO( CSM_MODE, nCSMQualityComboValue); SET_STATIC_PIXEL_SHADER_COMBO( DOPREVIEW, bPreview ); SET_STATIC_PIXEL_SHADER_COMBO( USEPATTERN, bPattern + bHasCustomPaint + ( 2 * bHasAlloverPaint ) ); SET_STATIC_PIXEL_SHADER_COMBO( FLASHLIGHT, bHasFlashlight ); SET_STATIC_PIXEL_SHADER_COMBO( FLASHLIGHTDEPTHFILTERMODE, nShadowFilterMode ); SET_STATIC_PIXEL_SHADER( character_ps30 ); // Base texture pShaderShadow->EnableTexture( SHADER_SAMPLER0, true ); // Bump map pShaderShadow->EnableTexture( SHADER_SAMPLER1, true ); if ( bHasMasks2 ) { pShaderShadow->EnableTexture( SHADER_SAMPLER3, true ); } if ( bHasFresnelRangesTexture ) { pShaderShadow->EnableTexture( SHADER_SAMPLER4, true ); } if ( bHasPhongWarpTexture ) { pShaderShadow->EnableTexture( SHADER_SAMPLER7, true ); } if ( bHasEnvmap ) { pShaderShadow->EnableTexture( SHADER_SAMPLER6, true ); } // Normalize sampler pShaderShadow->EnableTexture( SHADER_SAMPLER5, true ); // CSM sampler pShaderShadow->EnableTexture( SHADER_SAMPLER8, true ); if ( bHasMaterialMask ) { pShaderShadow->EnableTexture( SHADER_SAMPLER9, true ); } if ( bPreview ) { if ( bHasMasks1 ) { pShaderShadow->EnableTexture(SHADER_SAMPLER2, true); } if ( bHasAO ) { pShaderShadow->EnableTexture( SHADER_SAMPLER10, true ); } if ( bHasGrunge ) { pShaderShadow->EnableTexture( SHADER_SAMPLER11, true ); } if ( bHasDetail ) { pShaderShadow->EnableTexture( SHADER_SAMPLER12, true ); } if ( bHasDetailNormal ) { pShaderShadow->EnableTexture( SHADER_SAMPLER13, true ); } if ( bPattern ) { pShaderShadow->EnableTexture( SHADER_SAMPLER14, true ); } // noise for color modulation pShaderShadow->EnableTexture( SHADER_SAMPLER15, true ); } else { if ( bHasMasks1 ) { pShaderShadow->EnableTexture( SHADER_SAMPLER10, true ); } if ( bHasFlashlight ) { pShaderShadow->EnableTexture( SHADER_SAMPLER11, true ); } } if ( bIsTranslucent || IsAlphaModulating() ) { EnableAlphaBlending( SHADER_BLEND_SRC_ALPHA, SHADER_BLEND_ONE_MINUS_SRC_ALPHA ); } else { pShaderShadow->EnableAlphaWrites( false ); pShaderShadow->EnableDepthWrites( true ); } pShaderShadow->EnableAlphaTest( IS_FLAG_SET(MATERIAL_VAR_ALPHATEST) ); pShaderShadow->EnableSRGBWrite( true ); DefaultFog(); bool bFullyOpaque = !bIsTranslucent && !( IS_FLAG_SET( MATERIAL_VAR_ALPHATEST ) ); // HACK HACK HACK - enable alpha writes all the time so that we have them for underwater stuff pShaderShadow->EnableAlphaWrites( bFullyOpaque ); PI_BeginCommandBuffer(); PI_SetPixelShaderAmbientLightCube( PSREG_AMBIENT_CUBE ); PI_SetVertexShaderAmbientLightCube(); PI_SetPixelShaderLocalLighting( PSREG_LIGHT_INFO_ARRAY ); PI_SetModulationPixelShaderDynamicState_LinearColorSpace( 1 ); PI_EndCommandBuffer(); } DYNAMIC_STATE { pShaderAPI->SetDefaultState(); bool bCSMEnabled = bSupportsCSM && pShaderAPI->IsCascadedShadowMapping(); // need to turn off some features for shadercompile to complete, otherwise it runs out of memory before all combos are compiled if ( bPreview ) bCSMEnabled = false; BindTexture( SHADER_SAMPLER0, TEXTURE_BINDFLAGS_SRGBREAD, BASETEXTURE, -1 ); ShaderApiFast( pShaderAPI )->BindStandardTexture( SHADER_SAMPLER5, TEXTURE_BINDFLAGS_NONE, TEXTURE_NORMALIZATION_CUBEMAP_SIGNED ); if ( bHasBumpMap ) { BindTexture( SHADER_SAMPLER1, TEXTURE_BINDFLAGS_NONE, BUMPMAP, -1 ); } else { pShaderAPI->BindStandardTexture( SHADER_SAMPLER1, TEXTURE_BINDFLAGS_NONE, TEXTURE_NORMALMAP_FLAT ); } if ( bHasMasks1 ) { if ( bPreview ) { BindTexture( SHADER_SAMPLER2, TEXTURE_BINDFLAGS_NONE, MASKS1, -1 ); } else { BindTexture(SHADER_SAMPLER10, TEXTURE_BINDFLAGS_NONE, MASKS1, -1); } } if ( bHasMasks2 ) { BindTexture( SHADER_SAMPLER3, TEXTURE_BINDFLAGS_NONE, MASKS2, -1 ); } if ( bHasFresnelRangesTexture ) { BindTexture( SHADER_SAMPLER4, TEXTURE_BINDFLAGS_NONE, FRESNELRANGESTEXTURE, -1 ); } if ( bHasPhongWarpTexture ) { BindTexture( SHADER_SAMPLER7, TEXTURE_BINDFLAGS_SRGBREAD, PHONGWARPTEXTURE, -1 ); } if ( bHasEnvmap ) { bool bHdr = ( g_pHardwareConfig->GetHDRType() != HDR_TYPE_NONE ); if ( params[ENVMAP]->IsTextureValueInternalEnvCubemap() ) { pShaderAPI->BindStandardTexture( SHADER_SAMPLER6, bHdr ? TEXTURE_BINDFLAGS_NONE : TEXTURE_BINDFLAGS_SRGBREAD, TEXTURE_LOCAL_ENV_CUBEMAP ); } else { BindTexture( SHADER_SAMPLER6, bHdr ? TEXTURE_BINDFLAGS_NONE : TEXTURE_BINDFLAGS_SRGBREAD, ENVMAP, -1 ); } } if ( bCSMEnabled ) { ITexture *pDepthTextureAtlas = NULL; const CascadedShadowMappingState_t &cascadeState = pShaderAPI->GetCascadedShadowMappingState( &pDepthTextureAtlas ); if ( pDepthTextureAtlas ) { BindTexture( SHADER_SAMPLER8, TEXTURE_BINDFLAGS_SHADOWDEPTH, pDepthTextureAtlas, 0 ); pShaderAPI->SetPixelShaderConstant( 64, &cascadeState.m_vLightColor.x, CASCADED_SHADOW_MAPPING_CONSTANT_BUFFER_SIZE ); } else { bCSMEnabled = false; } } else if ( bHasFlashlight ) { CBCmdSetPixelShaderFlashlightState_t state; state.m_LightSampler = SHADER_SAMPLER8; state.m_DepthSampler = SHADER_SAMPLER11; state.m_ShadowNoiseSampler = SHADER_SAMPLER5; state.m_nColorConstant = PSREG_FLASHLIGHT_COLOR; state.m_nAttenConstant = PSREG_FLASHLIGHT_ATTENUATION; state.m_nOriginConstant = PSREG_FLASHLIGHT_POSITION_RIM_BOOST; state.m_nDepthTweakConstant = 109; state.m_nScreenScaleConstant = PSREG_FLASHLIGHT_SCREEN_SCALE; state.m_nWorldToTextureConstant = PSREG_FLASHLIGHT_TO_WORLD_TEXTURE; state.m_bFlashlightNoLambert = false; state.m_bSinglePassFlashlight = true; CCommandBufferBuilder< CFixedCommandStorageBuffer< 256 > > DynamicCmdsOut; DynamicCmdsOut.SetPixelShaderFlashlightState( state ); DynamicCmdsOut.End(); pShaderAPI->ExecuteCommandBuffer(DynamicCmdsOut.Base()); } if ( bHasMaterialMask ) { BindTexture( SHADER_SAMPLER9, TEXTURE_BINDFLAGS_NONE, MATERIALMASK, -1 ); } if ( bHasAO ) { BindTexture( SHADER_SAMPLER10, TEXTURE_BINDFLAGS_NONE, AO, -1 ); } if ( bHasGrunge ) { BindTexture( SHADER_SAMPLER11, TEXTURE_BINDFLAGS_SRGBREAD, GRUNGE, -1 ); } if ( bHasDetail ) { BindTexture( SHADER_SAMPLER12, TEXTURE_BINDFLAGS_NONE, DETAIL, -1 ); } if ( bHasDetailNormal ) { BindTexture( SHADER_SAMPLER13, TEXTURE_BINDFLAGS_NONE, DETAILNORMAL, -1 ); } if ( bPattern ) { BindTexture( SHADER_SAMPLER14, bHasCustomPaint ? TEXTURE_BINDFLAGS_SRGBREAD : TEXTURE_BINDFLAGS_NONE, PATTERN, -1 ); } if ( bPreview ) { BindTexture( SHADER_SAMPLER15, TEXTURE_BINDFLAGS_NONE, NOISE, -1 ); } int numBones = ShaderApiFast( pShaderAPI )->GetCurrentNumBones(); LightState_t lightState = { 0, false, false }; ShaderApiFast( pShaderAPI )->GetDX9LightState( &lightState ); MaterialFogMode_t fogType = ShaderApiFast( pShaderAPI )->GetSceneFogMode(); bool bWriteDepthToAlpha; bool bWriteWaterFogToAlpha; bool bFullyOpaque = !bIsTranslucent && !( IS_FLAG_SET( MATERIAL_VAR_VERTEXALPHA ) ) && !( IS_FLAG_SET( MATERIAL_VAR_ALPHATEST ) ); if( bFullyOpaque ) { bWriteDepthToAlpha = false; bWriteWaterFogToAlpha = (fogType == MATERIAL_FOG_LINEAR_BELOW_FOG_Z); AssertMsg( !(bWriteDepthToAlpha && bWriteWaterFogToAlpha), "Can't write two values to alpha at the same time." ); } else { //can't write a special value to dest alpha if we're actually using as-intended alpha bWriteDepthToAlpha = false; bWriteWaterFogToAlpha = false; } int nNumLights = lightState.m_nNumLights; nNumLights = bUseStaticControlFlow ? nNumLights : MIN( 2, nNumLights ); // need to turn off some features for shadercompile to complete, otherwise it runs out of memory before all combos are compiled if ( bPreview ) nNumLights = clamp( nNumLights, 0, 1 ); #if defined( CHARACTER_LIMIT_LIGHTS_WITH_PHONGWARP ) if ( bHasPhongWarpTexture ) nNumLights = clamp( nNumLights, 0, 3 ); #endif // Vertex Shader DECLARE_DYNAMIC_VERTEX_SHADER( character_vs30 ); SET_DYNAMIC_VERTEX_SHADER_COMBO( SKINNING, numBones > 0 ); SET_DYNAMIC_VERTEX_SHADER_COMBO( COMPRESSED_VERTS, (int)vertexCompression ); SET_DYNAMIC_VERTEX_SHADER_COMBO( NUM_LIGHTS, nNumLights ); SET_DYNAMIC_VERTEX_SHADER( character_vs30 ); SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_0, AMBIENTREFLECTIONBOUNCECENTER ); SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_1, ENTITYORIGIN ); // Pixel Shader DECLARE_DYNAMIC_PIXEL_SHADER( character_ps30 ); SET_DYNAMIC_PIXEL_SHADER_COMBO( NUM_LIGHTS, nNumLights ); SET_DYNAMIC_PIXEL_SHADER_COMBO( DYN_CSM_ENABLED, (bCSMEnabled) ); SET_DYNAMIC_PIXEL_SHADER_COMBO( WRITE_DEPTH_TO_DESTALPHA, bWriteDepthToAlpha ); SET_DYNAMIC_PIXEL_SHADER_COMBO( WRITEWATERFOGTODESTALPHA, bWriteWaterFogToAlpha ); SET_DYNAMIC_PIXEL_SHADER( character_ps30 ); float vEyePos[4] = { 0, 0, 0, 0 }; ShaderApiFast( pShaderAPI )->GetWorldSpaceCameraPosition( vEyePos ); pShaderAPI->SetPixelShaderConstant( 3, vEyePos, 1 ); pShaderAPI->SetPixelShaderFogParams( 19 ); float vParams[4] = { 0, 0, 0, 0 }; params[AMBIENTREFLECTIONBOUNCECOLOR]->GetVecValue( vParams, 3 ); vParams[3] = params[AMBIENTREFLECTIONBOOST]->GetFloatValue(); pShaderAPI->SetPixelShaderConstant( 0, vParams, 1 ); vParams[0] = params[ENVMAPLIGHTSCALE]->GetFloatValue(); vParams[1] = params[SHADOWSATURATION]->GetFloatValue(); vParams[2] = params[METALNESS]->GetFloatValue(); vParams[3] = params[RIMLIGHTALBEDO]->GetFloatValue(); pShaderAPI->SetPixelShaderConstant( 101, vParams, 1 ); SetPixelShaderConstant( 2, SHADOWSATURATIONBOUNDS ); vParams[0] = params[PHONGBOOST]->GetFloatValue(); vParams[1] = params[PHONGALBEDOBOOST]->GetFloatValue(); vParams[2] = params[PHONGEXPONENT]->GetFloatValue(); vParams[3] = params[ANISOTROPYAMOUNT]->GetFloatValue(); pShaderAPI->SetPixelShaderConstant( 10, vParams, 1 ); params[PHONGTINT]->GetVecValue(vParams, 3); vParams[3] = params[SHADOWRIMBOOST]->GetFloatValue(); pShaderAPI->SetPixelShaderConstant( 11, vParams, 1 ); SetPixelShaderConstant( 12, FRESNELRANGES ); SetPixelShaderConstant( 102, SHADOWTINT ); params[ENVMAPLIGHTSCALEMINMAX]->GetVecValue( vParams, 2 ); vParams[2] = params[ENVMAPCONTRAST]->GetFloatValue(); vParams[3] = params[ENVMAPSATURATION]->GetFloatValue(); pShaderAPI->SetPixelShaderConstant( 103, vParams, 1 ); SetPixelShaderConstant( 104, ENVMAPTINT ); float fRimLightBoost = params[RIMLIGHTBOOST]->GetFloatValue(); vParams[0] = params[RIMLIGHTEXPONENT]->GetFloatValue(); vParams[1] = fRimLightBoost; vParams[2] = params[SELFILLUMBOOST]->GetFloatValue(); vParams[3] = params[WARPINDEX]->GetFloatValue(); pShaderAPI->SetPixelShaderConstant( 105, vParams, 1 ); float fRimHaloBoost = params[RIMHALOBOOST]->GetFloatValue(); params[RIMLIGHTTINT]->GetVecValue( vParams, 3 ); vParams[3] = fRimHaloBoost * fRimLightBoost; pShaderAPI->SetPixelShaderConstant( 106, vParams, 1 ); params[FAKERIMTINT]->GetVecValue( vParams, 3 ); float fFakeRimBoost = params[FAKERIMBOOST]->GetFloatValue(); vParams[0] *= fFakeRimBoost; vParams[1] *= fFakeRimBoost; vParams[2] *= fFakeRimBoost; vParams[3] = clamp( 1.0f - params[SHADOWCONTRAST]->GetFloatValue(), 0.0f, 1.0f ); pShaderAPI->SetPixelShaderConstant( 107, vParams, 1 ); //20-25 used //26-27 used SetPixelShaderConstant( 33, RIMHALOBOUNDS ); if ( bPreview ) { params[DETAILSCALE]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 108, vParams, 1 ); params[DETAILPHONGBOOST]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 32, vParams, 1 ); params[DAMAGEDETAILPHONGBOOST]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 100, vParams, 1 ); params[DETAILENVBOOST]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 34, vParams, 1 ); params[DAMAGEDETAILENVBOOST]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 35, vParams, 1 ); params[DETAILPHONGALBEDOTINT]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 36, vParams, 1 ); params[DETAILWARPINDEX]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 37, vParams, 1 ); params[DETAILMETALNESS]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 38, vParams, 1 ); params[DETAILNORMALDEPTH]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 39, vParams, 1 ); params[DAMAGENORMALEDGEDEPTH]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 40, vParams, 1 ); float vParams2[2] = { 0, 0 }; params[DAMAGELEVELS1]->GetVecValue( vParams, 2 ); params[DAMAGELEVELS2]->GetVecValue( vParams2, 2 ); vParams[2] = vParams2[0]; vParams[3] = vParams2[1]; pShaderAPI->SetPixelShaderConstant( 41, vParams, 1 ); params[DAMAGELEVELS3]->GetVecValue( vParams, 2 ); params[DAMAGELEVELS4]->GetVecValue( vParams2, 2 ); vParams[2] = vParams2[0]; vParams[3] = vParams2[1]; pShaderAPI->SetPixelShaderConstant( 42, vParams, 1 ); SetPixelShaderTextureTransform( 43, PATTERNTEXTURETRANSFORM ); // 43-44 params[PATTERNCOLORINDICES]->GetVecValue( vParams, 4 ); vParams[0] = clamp( vParams[0] - 1, 0, 7 ); vParams[1] = clamp( vParams[1] - 1, 0, 7 ); vParams[2] = clamp( vParams[2] - 1, 0, 7 ); vParams[3] = clamp( vParams[3] - 1, 0, 7 ); pShaderAPI->SetPixelShaderConstant( 45, vParams, 1 ); vParams[0] = pow( params[WEARPROGRESS]->GetFloatValue(), params[WEAREXPONENT]->GetFloatValue() ); vParams[1] = params[PATTERNDETAILINFLUENCE]->GetFloatValue(); if ( bPattern ) { vParams[2] = clamp( params[PATTERNREPLACEINDEX]->GetIntValue() - 1, 0, 7 ); } else { vParams[2] = -1; } vParams[3] = 1.0f / 1024.0f; // assuming texture size of 1024. Should be dynamic? pShaderAPI->SetPixelShaderConstant( 46, vParams, 1 ); float vParams3[3] = { 0, 0, 0 }; params[PALETTECOLOR4]->GetVecValue( vParams3, 3 ); vParams3[0] = SrgbGammaToLinear( vParams3[0] / 255.0f ); vParams3[1] = SrgbGammaToLinear( vParams3[1] / 255.0f ); vParams3[2] = SrgbGammaToLinear( vParams3[2] / 255.0f ); params[PALETTECOLOR1]->GetVecValue( vParams, 3 ); vParams[0] = SrgbGammaToLinear( vParams[0] / 255.0f ); vParams[1] = SrgbGammaToLinear( vParams[1] / 255.0f ); vParams[2] = SrgbGammaToLinear( vParams[2] / 255.0f ); vParams[3] = vParams3[0]; pShaderAPI->SetPixelShaderConstant( 47, vParams, 1 ); params[PALETTECOLOR2]->GetVecValue( vParams, 3 ); vParams[0] = SrgbGammaToLinear( vParams[0] / 255.0f ); vParams[1] = SrgbGammaToLinear( vParams[1] / 255.0f ); vParams[2] = SrgbGammaToLinear( vParams[2] / 255.0f ); vParams[3] = vParams3[1]; pShaderAPI->SetPixelShaderConstant( 48, vParams, 1 ); params[PALETTECOLOR3]->GetVecValue( vParams, 3 ); vParams[0] = SrgbGammaToLinear( vParams[0] / 255.0f ); vParams[1] = SrgbGammaToLinear( vParams[1] / 255.0f ); vParams[2] = SrgbGammaToLinear( vParams[2] / 255.0f ); vParams[3] = vParams3[2]; pShaderAPI->SetPixelShaderConstant( 49, vParams, 1 ); params[PALETTECOLOR8]->GetVecValue( vParams3, 3 ); vParams3[0] = SrgbGammaToLinear( vParams3[0] / 255.0f ); vParams3[1] = SrgbGammaToLinear( vParams3[1] / 255.0f ); vParams3[2] = SrgbGammaToLinear( vParams3[2] / 255.0f ); params[PALETTECOLOR5]->GetVecValue( vParams, 3 ); vParams[0] = SrgbGammaToLinear( vParams[0] / 255.0f ); vParams[1] = SrgbGammaToLinear( vParams[1] / 255.0f ); vParams[2] = SrgbGammaToLinear( vParams[2] / 255.0f ); vParams[3] = vParams3[0]; pShaderAPI->SetPixelShaderConstant( 50, vParams, 1 ); params[PALETTECOLOR6]->GetVecValue( vParams, 3 ); vParams[0] = SrgbGammaToLinear( vParams[0] / 255.0f ); vParams[1] = SrgbGammaToLinear( vParams[1] / 255.0f ); vParams[2] = SrgbGammaToLinear( vParams[2] / 255.0f ); vParams[3] = vParams3[1]; pShaderAPI->SetPixelShaderConstant( 51, vParams, 1 ); params[PALETTECOLOR7]->GetVecValue( vParams, 3 ); vParams[0] = SrgbGammaToLinear( vParams[0] / 255.0f ); vParams[1] = SrgbGammaToLinear( vParams[1] / 255.0f ); vParams[2] = SrgbGammaToLinear( vParams[2] / 255.0f ); vParams[3] = vParams3[2]; pShaderAPI->SetPixelShaderConstant( 52, vParams, 1 ); SetPixelShaderTextureTransform( 53, GRUNGETEXTURETRANSFORM ); // 53-54 params[GRIME]->GetVecValue( vParams, 4); pShaderAPI->SetPixelShaderConstant( 55, vParams, 1 ); params[WEARDETAILPHONGBOOST]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 56, vParams, 1 ); params[WEARDETAILENVBOOST]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 57, vParams, 1 ); params[DAMAGEEDGEPHONGBOOST]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 58, vParams, 1 ); params[DAMAGEEDGEENVBOOST]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 59, vParams, 1 ); params[CURVATUREWEARBOOST]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 60, vParams, 1 ); params[CURVATUREWEARPOWER]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 61, vParams, 1 ); params[DAMAGEDETAILSATURATION]->GetVecValue( vParams, 4 ); pShaderAPI->SetPixelShaderConstant( 62, vParams, 1 ); params[DAMAGEGRUNGE]->GetVecValue( vParams, 4); pShaderAPI->SetPixelShaderConstant( 63, vParams, 1 ); params[DETAILGRUNGE]->GetVecValue(vParams, 4); pShaderAPI->SetPixelShaderConstant(90, vParams, 1); vParams[0] = params[PATTERNPHONGFACTOR]->GetFloatValue(); vParams[1] = params[PATTERNPAINTTHICKNESS]->GetFloatValue(); vParams[2] = 1; vParams[3] = 0; pShaderAPI->SetPixelShaderConstant(91, vParams, 1); params[DAMAGEDETAILBRIGHTNESSADJUSTMENT]->GetVecValue(vParams, 4); pShaderAPI->SetPixelShaderConstant(92, vParams, 1); params[GRUNGEMAX]->GetVecValue(vParams, 4); pShaderAPI->SetPixelShaderConstant(93, vParams, 1); // c68-89 used by csms params[GRIMESATURATION]->GetVecValue(vParams, 4); pShaderAPI->SetPixelShaderConstant(94, vParams, 1); params[GRIMEBRIGHTNESSADJUSTMENT]->GetVecValue(vParams, 4); pShaderAPI->SetPixelShaderConstant(95, vParams, 1); SetPixelShaderTextureTransform(96, GRUNGETEXTUREROTATION); SetPixelShaderTextureTransform( 98, PATTERNTEXTUREROTATION ); } } Draw(); } END_SHADER