sqwarmed/sdk_src/materialsystem/stdshaders/flesh_dx9.cpp

184 lines
10 KiB
C++

//========= Copyright © 1996-2009, Valve Corporation, All rights reserved. ============//
//
// 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