mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-12-15 01:58:34 +00:00
106 lines
3.2 KiB
Plaintext
106 lines
3.2 KiB
Plaintext
//====== Copyright © 1996-2004, Valve Corporation, All rights reserved. =======
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================
|
|
|
|
// STATIC: "NORMALMAP" "0..1"
|
|
// STATIC: "NORMALMAP2" "0..1"
|
|
// STATIC: "WORLDVERTEXTRANSITION" "0..1"
|
|
// STATIC: "HDRTYPE" "0..2"
|
|
|
|
// DYNAMIC: "HDRENABLED" "0..1"
|
|
// DYNAMIC: "FOGTYPE" "0..2"
|
|
// DYNAMIC: "FLASHLIGHTDEPTH" "0..0"
|
|
|
|
// SKIP: !$WORLDVERTEXTRANSITION && $NORMALMAP2
|
|
// SKIP: !$NORMALMAP && $NORMALMAP2
|
|
|
|
#include "common_ps_fxc.h"
|
|
|
|
sampler SpotSampler : register( s0 );
|
|
sampler BaseTextureSampler : register( s1 );
|
|
sampler NormalizingCubemapSampler : register( s2 );
|
|
// use a normalizing cube map here if we aren't normal mapping
|
|
#if NORMALMAP
|
|
sampler NormalMapSampler : register( s3 );
|
|
#else
|
|
sampler NormalizingCubemapSampler2 : register( s3 );
|
|
#endif
|
|
#ifdef WORLDVERTEXTRANSITION
|
|
sampler BaseTexture2Sampler : register( s4 );
|
|
sampler NormalMap2Sampler : register( s6 );
|
|
#endif
|
|
|
|
sampler FlashlightDepthSampler : register( s7 );
|
|
|
|
static const HALF g_OverbrightFactor = 2.0f;
|
|
|
|
struct PS_INPUT
|
|
{
|
|
float4 spotTexCoord : TEXCOORD0;
|
|
float2 baseTexCoord : TEXCOORD1;
|
|
#if NORMALMAP
|
|
float3 tangentPosToLightVector : TEXCOORD2;
|
|
float2 normalMapTexCoord : TEXCOORD3;
|
|
#else
|
|
float3 worldPosToLightVector : TEXCOORD2;
|
|
float3 normal : TEXCOORD3;
|
|
#endif
|
|
#if WORLDVERTEXTRANSITION
|
|
float2 baseTexCoord2 : TEXCOORD4;
|
|
float2 lightmapTexCoord : TEXCOORD5;
|
|
#endif
|
|
float4 vertAtten : COLOR0;
|
|
float4 fogFactorW : COLOR1;
|
|
};
|
|
|
|
HDR_PS_OUTPUT main( PS_INPUT i ) : COLOR
|
|
{
|
|
bool bDoShadow = (FLASHLIGHTDEPTH==1)?1:0;
|
|
|
|
#if WORLDVERTEXTRANSITION
|
|
float lerpAlpha = 1-i.vertAtten.a;
|
|
#endif
|
|
|
|
#if NORMALMAP
|
|
float3 normal = tex2D( NormalMapSampler, i.normalMapTexCoord ) * 2.0f - 1.0f;
|
|
# if NORMALMAP2
|
|
float3 normal2 = tex2D( NormalMap2Sampler, i.normalMapTexCoord ) * 2.0f - 1.0f;
|
|
normal = lerp( normal2, normal, lerpAlpha );
|
|
# endif
|
|
#else
|
|
float3 normal = texCUBE( NormalizingCubemapSampler2, i.normal ) * 2.0f - 1.0f;
|
|
#endif
|
|
float3 spotColor = tex2D( SpotSampler, i.spotTexCoord.xyz / i.spotTexCoord.w ) * cFlashlightColor;
|
|
if( i.spotTexCoord.w < 0.0f )
|
|
spotColor = float3(0,0,0);
|
|
|
|
if( bDoShadow )
|
|
spotColor *= DoShadow( FlashlightDepthSampler, i.spotTexCoord );
|
|
|
|
float4 baseSample = tex2D( BaseTextureSampler, i.baseTexCoord );
|
|
float3 baseColor = baseSample.xyz;
|
|
|
|
#if WORLDVERTEXTRANSITION
|
|
float3 baseColor2 = tex2D( BaseTexture2Sampler, i.baseTexCoord2 ).xyz;
|
|
baseColor = lerp( baseColor2, baseColor, lerpAlpha );
|
|
#endif
|
|
|
|
#if NORMALMAP
|
|
// flashlightfixme: wrap this!
|
|
float3 tangentPosToLightVector = texCUBE( NormalizingCubemapSampler, i.tangentPosToLightVector ) * 2.0f - 1.0f;
|
|
float nDotL = dot( tangentPosToLightVector, normal );
|
|
#else
|
|
float3 worldPosToLightVector = texCUBE( NormalizingCubemapSampler, i.worldPosToLightVector ) * 2.0f - 1.0f;
|
|
float nDotL = dot( worldPosToLightVector, normal );
|
|
#endif
|
|
float3 outcolor;
|
|
outcolor = spotColor * baseColor * nDotL * g_OverbrightFactor;
|
|
|
|
// NOTE!! This has to be last to avoid loss of range.
|
|
outcolor *= i.vertAtten;
|
|
|
|
return LinearColorToHDROutput( float4( outcolor, baseSample.a ), i.fogFactorW.w );
|
|
}
|