mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-09-20 20:46:03 +08:00
103 lines
3.5 KiB
Plaintext
103 lines
3.5 KiB
Plaintext
![]() |
//========== Copyright (c) Valve Corporation, All rights reserved. ==========//
|
||
|
|
||
|
#include "common_fog_vs_fxc.h"
|
||
|
// DYNAMIC: "COMPRESSED_VERTS" "0..1"
|
||
|
// DYNAMIC: "SKINNING" "0..1"
|
||
|
|
||
|
// Includes
|
||
|
#include "common_vs_fxc.h"
|
||
|
|
||
|
// Globals
|
||
|
const float g_flUVScale : register( SHADER_SPECIFIC_CONST_0 );
|
||
|
const float g_flDetailUVScale : register( SHADER_SPECIFIC_CONST_1 );
|
||
|
const float4 cDetailTexCoordTransform[2] : register( SHADER_SPECIFIC_CONST_2 ); // 2 & 3
|
||
|
|
||
|
// Structs
|
||
|
struct VS_INPUT
|
||
|
{
|
||
|
float4 vPos : POSITION; // Position
|
||
|
float4 vNormal : NORMAL; // Normal
|
||
|
float4 vUserData : TANGENT; // Tangent
|
||
|
float4 vBoneWeights : BLENDWEIGHT; // Skin weights
|
||
|
float4 vBoneIndices : BLENDINDICES; // Skin indices
|
||
|
float4 vTexCoord : TEXCOORD0;
|
||
|
float4 vColor : COLOR0;
|
||
|
|
||
|
// Position and normal/tangent deltas
|
||
|
float4 vPosFlex : POSITION1;
|
||
|
float4 vNormalFlex : NORMAL1;
|
||
|
};
|
||
|
|
||
|
struct VS_OUTPUT
|
||
|
{
|
||
|
float4 vProjPosition : POSITION; // Projection-space position
|
||
|
float4 vWorldNormal : TEXCOORD0; // w is proj. z coord (for depth stuff)
|
||
|
float4 vColor : TEXCOORD1;
|
||
|
float4 vWorldPos : TEXCOORD2; // w is proj. w coord
|
||
|
float4 vUV0 : TEXCOORD3;
|
||
|
float2 vUV1 : TEXCOORD4;
|
||
|
float4 vLightAtten : TEXCOORD5;
|
||
|
float3 vAmbient : TEXCOORD6;
|
||
|
float3 vWorldTangent : TEXCOORD7;
|
||
|
float3 vWorldBinormal : TEXCOORD8;
|
||
|
};
|
||
|
|
||
|
// Main
|
||
|
VS_OUTPUT main( const VS_INPUT i )
|
||
|
{
|
||
|
VS_OUTPUT o;
|
||
|
|
||
|
float4 vObjPosition = i.vPos;
|
||
|
float4 vObjTangent;
|
||
|
float3 vObjNormal;
|
||
|
DecompressVertex_NormalTangent( i.vNormal, i.vUserData, vObjNormal, vObjTangent );
|
||
|
|
||
|
float flWrinkleWeight;
|
||
|
ApplyMorph( i.vPosFlex, i.vNormalFlex, vObjPosition.xyz, vObjNormal.xyz, vObjTangent.xyz, flWrinkleWeight ); // not keeping wrinkle weight
|
||
|
|
||
|
// Transform the position and normal
|
||
|
float3 vWorldPosition = { 0.0f, 0.0f, 0.0f };
|
||
|
float3 vWorldNormal = { 0.0f, 0.0f, 0.0f };
|
||
|
float3 vWorldTangent = { 0.0f, 0.0f, 0.0f };
|
||
|
float3 vWorldBinormal = { 0.0f, 0.0f, 0.0f };
|
||
|
SkinPositionNormalAndTangentSpace( SKINNING ? true : false,
|
||
|
vObjPosition, vObjNormal.xyz, vObjTangent.xyzw,
|
||
|
i.vBoneWeights, i.vBoneIndices,
|
||
|
vWorldPosition, vWorldNormal, vWorldTangent, vWorldBinormal );
|
||
|
vWorldNormal.xyz = normalize( vWorldNormal.xyz );
|
||
|
|
||
|
o.vWorldNormal.xyz = vWorldNormal.xyz;
|
||
|
o.vWorldTangent = normalize( vWorldTangent.xyz );
|
||
|
o.vWorldBinormal = normalize( vWorldBinormal.xyz );
|
||
|
o.vWorldPos.xyz = vWorldPosition.xyz;
|
||
|
|
||
|
// Transform into projection space
|
||
|
float4 vProjPosition = mul( float4( vWorldPosition, 1.0f ), cViewProj );
|
||
|
o.vProjPosition = vProjPosition;
|
||
|
o.vWorldNormal.w = vProjPosition.z;
|
||
|
o.vWorldPos.w = vProjPosition.w;
|
||
|
o.vUV0.xy = g_flUVScale * i.vTexCoord.xy;
|
||
|
// Detail texture coords:
|
||
|
o.vUV1.xy = i.vTexCoord.xy;//g_flDetailUVScale * i.vTexCoord.xy;
|
||
|
o.vUV1.x = dot( i.vTexCoord, cDetailTexCoordTransform[0] );
|
||
|
o.vUV1.y = dot( i.vTexCoord, cDetailTexCoordTransform[1] );
|
||
|
|
||
|
// Screen-space texcoord
|
||
|
float2 vScreenPos = float2( 0.5, -0.5 ) * vProjPosition.xy + 0.5 * vProjPosition.w;
|
||
|
o.vUV0.wz = vScreenPos;
|
||
|
|
||
|
// Dynamic light attenuation factors
|
||
|
o.vLightAtten.x = GetVertexAttenForLight( vWorldPosition, 0 );
|
||
|
o.vLightAtten.y = GetVertexAttenForLight( vWorldPosition, 1 );
|
||
|
o.vLightAtten.z = GetVertexAttenForLight( vWorldPosition, 2 );
|
||
|
o.vLightAtten.w = GetVertexAttenForLight( vWorldPosition, 3 );
|
||
|
|
||
|
// Ambient light
|
||
|
o.vAmbient = AmbientLight( vWorldNormal );
|
||
|
|
||
|
// Vertex colour for self-illumination glow
|
||
|
o.vColor.rgba = i.vColor.rgba * 2.0f;
|
||
|
|
||
|
return o;
|
||
|
}
|