2025-05-17 14:11:58 -04:00
//========= Copyright © 1996-2009, Valve Corporation, All rights reserved. ============//
2012-07-06 20:35:59 -05:00
//
// Purpose: General 'flesh' shader for AlienSwarm
//
//=============================================================================//
# include "BaseVSShader.h"
# include "flesh_helper.h"
# include "cpp_shader_constant_register_map.h"
// memdbgon must be the last include file in a .cpp file!!!
# include "tier0/memdbgon.h"
DEFINE_FALLBACK_SHADER ( Flesh , Flesh_dx9 )
BEGIN_VS_SHADER ( Flesh_dx9 , " Flesh " )
BEGIN_SHADER_PARAMS
SHADER_PARAM ( NORMALMAP , SHADER_PARAM_TYPE_TEXTURE , " models/shadertest/shader1_normal " , " normal map " )
SHADER_PARAM ( TRANSMATMASKSTEXTURE , SHADER_PARAM_TYPE_TEXTURE , " shadertest/BaseTexture " , " Masks for material changes: fresnel hue-shift, jellyfish, forward scatter and back scatter " ) ;
SHADER_PARAM ( EFFECTMASKSTEXTURE , SHADER_PARAM_TYPE_TEXTURE , " shadertest/BaseTexture " , " Masks for material effects: self-illum, color warping, iridescence and clearcoat " )
SHADER_PARAM ( COLORWARPTEXTURE , SHADER_PARAM_TYPE_TEXTURE , " shadertest/BaseTexture " , " 3D rgb-lookup table texture for tinting color map " )
SHADER_PARAM ( FRESNELCOLORWARPTEXTURE , SHADER_PARAM_TYPE_TEXTURE , " shadertest/BaseTexture " , " 3D rgb-lookup table texture for tinting fresnel-based hue shift color " )
SHADER_PARAM ( OPACITYTEXTURE , SHADER_PARAM_TYPE_TEXTURE , " shadertest/BaseTexture " , " Texture to control surface opacity when INTERIOR=1 " )
SHADER_PARAM ( IRIDESCENTWARP , SHADER_PARAM_TYPE_TEXTURE , " shader/BaseTexture " , " 1D lookup texture for iridescent effect " )
SHADER_PARAM ( DETAIL , SHADER_PARAM_TYPE_TEXTURE , " shader/BaseTexture " , " detail map " )
SHADER_PARAM ( UVSCALE , SHADER_PARAM_TYPE_FLOAT , " 1 " , " uv scale " )
SHADER_PARAM ( DETAILBLENDMODE , SHADER_PARAM_TYPE_INTEGER , " 0 " , " detail blend mode: 1=mod2x, 2=add, 3=alpha blend (detailalpha), 4=crossfade, 5=additive self-illum, 6=multiply " )
SHADER_PARAM ( DETAILBLENDFACTOR , SHADER_PARAM_TYPE_FLOAT , " 1.0 " , " strength of detail map " )
SHADER_PARAM ( DETAILSCALE , SHADER_PARAM_TYPE_FLOAT , " 4.0 " , " detail map scale based on original UV set " )
SHADER_PARAM ( DETAILFRAME , SHADER_PARAM_TYPE_INTEGER , " 0 " , " frame number for $detail " )
SHADER_PARAM ( DETAILTEXTURETRANSFORM , SHADER_PARAM_TYPE_MATRIX , " center .5 .5 scale 1 1 rotate 0 translate 0 0 " , " $detail texcoord transform " )
SHADER_PARAM ( BUMPSTRENGTH , SHADER_PARAM_TYPE_FLOAT , " 1.0 " , " bump map strength " )
SHADER_PARAM ( FRESNELBUMPSTRENGTH , SHADER_PARAM_TYPE_FLOAT , " 1.0 " , " bump map strength for fresnel " )
SHADER_PARAM ( TRANSLUCENTFRESNELMINMAXEXP , SHADER_PARAM_TYPE_VEC3 , " [0.8 1.0 1.0] " , " translucency fresnel params " )
SHADER_PARAM ( INTERIOR , SHADER_PARAM_TYPE_BOOL , " 1 " , " enable surface translucency (refractive/foggy interior) " )
SHADER_PARAM ( INTERIORFOGSTRENGTH , SHADER_PARAM_TYPE_FLOAT , " 0.06 " , " fog strength " )
SHADER_PARAM ( INTERIORBACKGROUNDBOOST , SHADER_PARAM_TYPE_FLOAT , " 7 " , " boosts the brightness of bright background pixels " )
SHADER_PARAM ( INTERIORAMBIENTSCALE , SHADER_PARAM_TYPE_FLOAT , " 0.3 " , " scales ambient light in the interior volume " ) ;
SHADER_PARAM ( INTERIORBACKLIGHTSCALE , SHADER_PARAM_TYPE_FLOAT , " 0.3 " , " scales backlighting in the interior volume " ) ;
SHADER_PARAM ( INTERIORCOLOR , SHADER_PARAM_TYPE_VEC3 , " [0.7 0.5 0.45] " , " tints light in the interior volume " )
SHADER_PARAM ( INTERIORREFRACTSTRENGTH , SHADER_PARAM_TYPE_FLOAT , " 0.015 " , " strength of bumped refract of the background seen through the interior " )
SHADER_PARAM ( INTERIORREFRACTBLUR , SHADER_PARAM_TYPE_FLOAT , " 0.2 " , " strength of blur applied to the background seen through the interior " )
SHADER_PARAM ( DIFFUSESOFTNORMAL , SHADER_PARAM_TYPE_FLOAT , " 0.0f " , " diffuse lighting uses softened normal " )
SHADER_PARAM ( DIFFUSEEXPONENT , SHADER_PARAM_TYPE_FLOAT , " 1.0f " , " diffuse lighting exponent " )
SHADER_PARAM ( PHONGEXPONENT , SHADER_PARAM_TYPE_FLOAT , " 1.0 " , " specular exponent " )
SHADER_PARAM ( PHONGSCALE , SHADER_PARAM_TYPE_FLOAT , " 1.0 " , " specular lighting scale " )
SHADER_PARAM ( PHONGEXPONENT2 , SHADER_PARAM_TYPE_FLOAT , " 1.0 " , " specular exponent 2 " )
SHADER_PARAM ( PHONGFRESNEL , SHADER_PARAM_TYPE_VEC3 , " [0 0.5 1] " , " phong fresnel terms view-forward, 45 degrees, edge " )
SHADER_PARAM ( PHONGSCALE2 , SHADER_PARAM_TYPE_FLOAT , " 1.0 " , " specular lighting 2 scale " )
SHADER_PARAM ( PHONGFRESNEL2 , SHADER_PARAM_TYPE_VEC3 , " [1 1 1] " , " phong fresnel terms view-forward, 45 degrees, edge " )
SHADER_PARAM ( PHONG2SOFTNESS , SHADER_PARAM_TYPE_FLOAT , " 1.0 " , " clearcoat uses softened normal " )
SHADER_PARAM ( RIMLIGHTEXPONENT , SHADER_PARAM_TYPE_FLOAT , " 1.0 " , " rim lighting exponent " )
SHADER_PARAM ( RIMLIGHTSCALE , SHADER_PARAM_TYPE_FLOAT , " 1.0 " , " rim lighting scale " )
SHADER_PARAM ( PHONGCOLORTINT , SHADER_PARAM_TYPE_VEC3 , " [1.0 1.0 1.0] " , " specular texture tint " )
SHADER_PARAM ( AMBIENTBOOST , SHADER_PARAM_TYPE_FLOAT , " 0.0 " , " ambient boost amount " )
SHADER_PARAM ( AMBIENTBOOSTMASKMODE , SHADER_PARAM_TYPE_INTEGER , " 0 " , " masking mode for ambient scale: 0 = allover, 1 or 2 = mask by transmatmask r or g, 3 to 5 effectmask g b or a " )
SHADER_PARAM ( BACKSCATTER , SHADER_PARAM_TYPE_FLOAT , " 0.0 " , " subsurface back-scatter intensity " )
SHADER_PARAM ( FORWARDSCATTER , SHADER_PARAM_TYPE_FLOAT , " 0.0 " , " subsurface forward-scatter intensity " )
SHADER_PARAM ( SSDEPTH , SHADER_PARAM_TYPE_FLOAT , " 0.1 " , " subsurface depth over which effect is not visible " )
SHADER_PARAM ( SSBENTNORMALINTENSITY , SHADER_PARAM_TYPE_FLOAT , " 0.2 " , " subsurface bent normal intensity: higher is more view-dependent " )
SHADER_PARAM ( SSCOLORTINT , SHADER_PARAM_TYPE_VEC3 , " [0.2, 0.05, 0.0] " , " color tint for subsurface effects " )
SHADER_PARAM ( SSTINTBYALBEDO , SHADER_PARAM_TYPE_FLOAT , " 0.0 " , " blend ss color tint to albedo color based on this factor " )
SHADER_PARAM ( NORMAL2SOFTNESS , SHADER_PARAM_TYPE_FLOAT , " 0.0 " , " mip level for effects with soft normal (clearcoat and subsurface) " )
SHADER_PARAM ( HUESHIFTINTENSITY , SHADER_PARAM_TYPE_FLOAT , " 0.5 " , " scales effect of fresnel-based hue-shift " )
SHADER_PARAM ( HUESHIFTFRESNELEXPONENT , SHADER_PARAM_TYPE_FLOAT , " 2.0f " , " fresnel exponent for hue-shift (edge-based) " )
SHADER_PARAM ( IRIDESCENCEBOOST , SHADER_PARAM_TYPE_FLOAT , " 1.0f " , " boost iridescence effect " )
SHADER_PARAM ( IRIDESCENCEEXPONENT , SHADER_PARAM_TYPE_FLOAT , " 2.0f " , " fresnel exponent for iridescence effect (center-based) " )
SHADER_PARAM ( SELFILLUMTINT , SHADER_PARAM_TYPE_VEC3 , " [0.7 0.5 0.45] " , " self-illum color tint " )
SHADER_PARAM ( UVPROJOFFSET , SHADER_PARAM_TYPE_VEC3 , " [0 0 0] " , " Center for UV projection " )
SHADER_PARAM ( BBMIN , SHADER_PARAM_TYPE_VEC3 , " [0 0 0] " , " UV projection bounding box min " )
SHADER_PARAM ( BBMAX , SHADER_PARAM_TYPE_VEC3 , " [0 0 0] " , " UV projection bounding box max " )
SHADER_PARAM ( BUMPFRAME , SHADER_PARAM_TYPE_INTEGER , " 0 " , " normal map animated texture frame " )
END_SHADER_PARAMS
void SetupVarsFlesh ( FleshVars_t & info )
{
info . m_nBaseTexture = BASETEXTURE ;
info . m_nBaseTextureTransform = BASETEXTURETRANSFORM ;
info . m_nNormalMap = NORMALMAP ;
info . m_nDetailTexture = DETAIL ;
info . m_nColorWarpTexture = COLORWARPTEXTURE ;
info . m_nFresnelColorWarpTexture = FRESNELCOLORWARPTEXTURE ;
info . m_nTransMatMasksTexture = TRANSMATMASKSTEXTURE ;
info . m_nEffectMasksTexture = EFFECTMASKSTEXTURE ;
info . m_nIridescentWarpTexture = IRIDESCENTWARP ;
info . m_nOpacityTexture = OPACITYTEXTURE ;
info . m_nBumpStrength = BUMPSTRENGTH ;
info . m_nFresnelBumpStrength = FRESNELBUMPSTRENGTH ;
info . m_nUVScale = UVSCALE ;
info . m_nDetailScale = DETAILSCALE ;
info . m_nDetailFrame = DETAILFRAME ;
info . m_nDetailBlendMode = DETAILBLENDMODE ;
info . m_nDetailBlendFactor = DETAILBLENDFACTOR ;
info . m_nDetailTextureTransform = DETAILTEXTURETRANSFORM ;
info . m_nInteriorEnable = INTERIOR ;
info . m_nInteriorFogStrength = INTERIORFOGSTRENGTH ;
info . m_nInteriorBackgroundBoost = INTERIORBACKGROUNDBOOST ;
info . m_nInteriorAmbientScale = INTERIORAMBIENTSCALE ;
info . m_nInteriorBackLightScale = INTERIORBACKLIGHTSCALE ;
info . m_nInteriorColor = INTERIORCOLOR ;
info . m_nInteriorRefractStrength = INTERIORREFRACTSTRENGTH ;
info . m_nInteriorRefractBlur = INTERIORREFRACTBLUR ;
info . m_nFresnelParams = TRANSLUCENTFRESNELMINMAXEXP ;
info . m_nDiffuseSoftNormal = DIFFUSESOFTNORMAL ;
info . m_nDiffuseExponent = DIFFUSEEXPONENT ;
info . m_nSpecExp = PHONGEXPONENT ;
info . m_nSpecScale = PHONGSCALE ;
info . m_nSpecFresnel = PHONGFRESNEL ;
info . m_nSpecExp2 = PHONGEXPONENT2 ;
info . m_nSpecScale2 = PHONGSCALE2 ;
info . m_nSpecFresnel2 = PHONGFRESNEL2 ;
info . m_nPhong2Softness = PHONG2SOFTNESS ;
info . m_nRimLightExp = RIMLIGHTEXPONENT ;
info . m_nRimLightScale = RIMLIGHTSCALE ;
info . m_nPhongColorTint = PHONGCOLORTINT ;
info . m_nSelfIllumTint = SELFILLUMTINT ;
info . m_nUVProjOffset = UVPROJOFFSET ;
info . m_nBBMin = BBMIN ;
info . m_nBBMax = BBMAX ;
info . m_nFlashlightTexture = FLASHLIGHTTEXTURE ;
info . m_nFlashlightTextureFrame = FLASHLIGHTTEXTUREFRAME ;
info . m_nBumpFrame = BUMPFRAME ;
info . m_nBackScatter = BACKSCATTER ;
info . m_nForwardScatter = FORWARDSCATTER ;
info . m_nAmbientBoost = AMBIENTBOOST ;
info . m_nAmbientBoostMaskMode = AMBIENTBOOSTMASKMODE ;
info . m_nIridescenceExponent = IRIDESCENCEEXPONENT ;
info . m_nIridescenceBoost = IRIDESCENCEBOOST ;
info . m_nHueShiftIntensity = HUESHIFTINTENSITY ;
info . m_nHueShiftFresnelExponent = HUESHIFTFRESNELEXPONENT ;
info . m_nSSDepth = SSDEPTH ;
info . m_nSSTintByAlbedo = SSTINTBYALBEDO ;
info . m_nSSBentNormalIntensity = SSBENTNORMALINTENSITY ;
info . m_nSSColorTint = SSCOLORTINT ;
info . m_nNormal2Softness = NORMAL2SOFTNESS ;
}
bool IsTranslucent ( IMaterialVar * * params ) const
{
// Could be alpha-blended or refractive ('interior')
return IS_FLAG_SET ( MATERIAL_VAR_TRANSLUCENT ) | | ! ! params [ INTERIOR ] - > GetIntValue ( ) ;
}
SHADER_INIT_PARAMS ( )
{
FleshVars_t info ;
SetupVarsFlesh ( info ) ;
InitParamsFlesh ( this , params , pMaterialName , info ) ;
}
SHADER_FALLBACK
{
// TODO: Reasonable fallback
if ( g_pHardwareConfig - > GetDXSupportLevel ( ) < 90 )
{
return " Wireframe " ;
}
return 0 ;
}
SHADER_INIT
{
FleshVars_t info ;
SetupVarsFlesh ( info ) ;
InitFlesh ( this , params , info ) ;
}
SHADER_DRAW
{
FleshVars_t info ;
SetupVarsFlesh ( info ) ;
DrawFlesh ( this , params , pShaderAPI , pShaderShadow , info , vertexCompression , pContextDataPtr ) ;
}
END_SHADER