You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
6.8 KiB
206 lines
6.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//============================================================================= |
|
|
|
#include "shaderlib/cshader.h" |
|
#include "worldvertextransition_dx6_helper.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
|
|
void InitParamsWorldVertexTransition_DX6( IMaterialVar** params, WorldVertexTransition_DX6_Vars_t &info ) |
|
{ |
|
SET_FLAGS2( MATERIAL_VAR2_LIGHTING_LIGHTMAP ); |
|
// FLASHLIGHTFIXME |
|
params[info.m_nFlashlightTextureVar]->SetStringValue( "effects/flashlight001" ); |
|
} |
|
|
|
void InitWorldVertexTransition_DX6( CBaseShader *pShader, IMaterialVar** params, WorldVertexTransition_DX6_Vars_t &info ) |
|
{ |
|
// FLASHLIGHTFIXME |
|
if ( params[info.m_nFlashlightTextureVar]->IsDefined() ) |
|
{ |
|
pShader->LoadTexture( info.m_nFlashlightTextureVar ); |
|
} |
|
|
|
if ( params[info.m_nBaseTextureVar]->IsDefined() ) |
|
{ |
|
pShader->LoadTexture( info.m_nBaseTextureVar ); |
|
} |
|
|
|
if ( params[info.m_nBaseTexture2Var]->IsDefined() ) |
|
{ |
|
pShader->LoadTexture( info.m_nBaseTexture2Var ); |
|
} |
|
} |
|
|
|
static void DrawFlashlightPass( CBaseShader *pShader, IMaterialVar** params, IShaderDynamicAPI *pShaderAPI, IShaderShadow* pShaderShadow, int nPass, WorldVertexTransition_DX6_Vars_t &info ) |
|
{ |
|
SHADOW_STATE |
|
{ |
|
SET_FLAGS2( MATERIAL_VAR2_NEEDS_FIXED_FUNCTION_FLASHLIGHT ); |
|
pShaderShadow->EnableDepthWrites( false ); |
|
pShaderShadow->EnableAlphaWrites( false ); |
|
|
|
pShaderShadow->SetDiffuseMaterialSource( SHADER_MATERIALSOURCE_COLOR1 ); |
|
if( nPass == 0 ) |
|
{ |
|
pShader->EnableAlphaBlending( SHADER_BLEND_SRC_ALPHA, SHADER_BLEND_ONE ); |
|
} |
|
else |
|
{ |
|
pShader->EnableAlphaBlending( SHADER_BLEND_ONE_MINUS_SRC_ALPHA, SHADER_BLEND_ONE ); |
|
} |
|
|
|
int flags = SHADER_DRAW_POSITION | SHADER_DRAW_TEXCOORD1 | SHADER_DRAW_COLOR | SHADER_DRAW_NORMAL; |
|
pShaderShadow->DrawFlags( flags ); |
|
pShader->FogToBlack(); |
|
|
|
pShaderShadow->EnableLighting( true ); |
|
|
|
pShaderShadow->EnableCustomPixelPipe( true ); |
|
pShaderShadow->CustomTextureStages( 2 ); |
|
|
|
// color stage 0 |
|
// projected texture * vertex color (lighting) |
|
pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0, |
|
SHADER_TEXCHANNEL_COLOR, |
|
SHADER_TEXOP_MODULATE, |
|
SHADER_TEXARG_TEXTURE, |
|
SHADER_TEXARG_VERTEXCOLOR ); |
|
|
|
// color stage 1 |
|
// * base texture |
|
pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE1, |
|
SHADER_TEXCHANNEL_COLOR, |
|
SHADER_TEXOP_MODULATE, |
|
SHADER_TEXARG_TEXTURE, SHADER_TEXARG_PREVIOUSSTAGE ); |
|
|
|
// alpha stage 0 |
|
// get alpha from constant alpha * vertex color |
|
pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0, |
|
SHADER_TEXCHANNEL_ALPHA, |
|
SHADER_TEXOP_MODULATE, |
|
SHADER_TEXARG_CONSTANTCOLOR, SHADER_TEXARG_VERTEXCOLOR ); |
|
|
|
// alpha stage 1 |
|
// get alpha from $basetexture |
|
pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE1, |
|
SHADER_TEXCHANNEL_ALPHA, |
|
SHADER_TEXOP_MODULATE, |
|
SHADER_TEXARG_TEXTURE, SHADER_TEXARG_PREVIOUSSTAGE ); |
|
|
|
pShaderShadow->EnableTexture( SHADER_SAMPLER0, true ); |
|
pShaderShadow->EnableTexture( SHADER_SAMPLER1, true ); |
|
|
|
// Shove the view position into texcoord 0 before the texture matrix. |
|
pShaderShadow->TexGen( SHADER_TEXTURE_STAGE0, SHADER_TEXGENPARAM_EYE_LINEAR ); |
|
pShaderShadow->EnableTexGen( SHADER_TEXTURE_STAGE0, true ); |
|
} |
|
DYNAMIC_STATE |
|
{ |
|
pShader->SetFlashlightFixedFunctionTextureTransform( MATERIAL_TEXTURE0 ); |
|
|
|
// NOTE: This has to come after the loadmatrix since the loadmatrix screws with the |
|
// transform flags!!!!!! |
|
// Specify that we have XYZ texcoords that need to be divided by W before the pixel shader. |
|
// NOTE Tried to divide XY by Z, but doesn't work. |
|
pShaderAPI->SetTextureTransformDimension( SHADER_TEXTURE_STAGE0, 3, true ); |
|
|
|
pShader->BindTexture( SHADER_SAMPLER0, FLASHLIGHTTEXTURE, FLASHLIGHTTEXTUREFRAME ); |
|
if( nPass == 0 ) |
|
{ |
|
pShader->BindTexture( SHADER_SAMPLER1, info.m_nBaseTexture2Var, -1 ); |
|
} |
|
else |
|
{ |
|
pShader->BindTexture( SHADER_SAMPLER1, info.m_nBaseTextureVar, info.m_nBaseTextureFrameVar ); |
|
} |
|
} |
|
pShader->Draw(); |
|
} |
|
|
|
|
|
void DrawWorldVertexTransition_DX6( CBaseShader *pShader, IMaterialVar** params, IShaderDynamicAPI *pShaderAPI, IShaderShadow* pShaderShadow, WorldVertexTransition_DX6_Vars_t &info ) |
|
{ |
|
bool bHasFlashlight = pShader->UsingFlashlight( params ); |
|
if( bHasFlashlight ) |
|
{ |
|
DrawFlashlightPass( pShader, params, pShaderAPI, pShaderShadow, 0, info ); |
|
DrawFlashlightPass( pShader, params, pShaderAPI, pShaderShadow, 1, info ); |
|
return; |
|
} |
|
|
|
SHADOW_STATE |
|
{ |
|
SET_FLAGS2( MATERIAL_VAR2_LIGHTING_LIGHTMAP ); |
|
pShaderShadow->EnableTexture( SHADER_SAMPLER0, true ); |
|
pShaderShadow->EnableTexture( SHADER_SAMPLER1, true ); |
|
pShaderShadow->OverbrightValue( SHADER_TEXTURE_STAGE1, OVERBRIGHT ); |
|
|
|
pShaderShadow->DrawFlags( SHADER_DRAW_COLOR | SHADER_DRAW_POSITION | SHADER_DRAW_TEXCOORD1 | SHADER_DRAW_LIGHTMAP_TEXCOORD0 ); |
|
pShader->FogToFogColor(); |
|
} |
|
DYNAMIC_STATE |
|
{ |
|
//pShaderAPI->TexMinFilter( SHADER_TEXFILTERMODE_NEAREST ); |
|
//pShaderAPI->TexMagFilter( SHADER_TEXFILTERMODE_NEAREST ); |
|
pShader->BindTexture( SHADER_SAMPLER1, info.m_nBaseTextureVar ); |
|
pShaderAPI->BindStandardTexture( SHADER_SAMPLER0, TEXTURE_LIGHTMAP ); |
|
} |
|
pShader->Draw(); |
|
|
|
SHADOW_STATE |
|
{ |
|
SET_FLAGS2( MATERIAL_VAR2_LIGHTING_LIGHTMAP ); |
|
pShaderShadow->EnableTexture( SHADER_SAMPLER0, true ); |
|
pShaderShadow->EnableTexture( SHADER_SAMPLER1, true ); |
|
pShaderShadow->EnableBlending( true ); |
|
|
|
pShaderShadow->EnableCustomPixelPipe( true ); |
|
pShaderShadow->CustomTextureStages( 2 ); |
|
|
|
// alpha and color stage 0 |
|
pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0, |
|
SHADER_TEXCHANNEL_ALPHA, |
|
SHADER_TEXOP_SELECTARG1, |
|
SHADER_TEXARG_TEXTURE, |
|
SHADER_TEXARG_TEXTURE ); |
|
|
|
pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0, |
|
SHADER_TEXCHANNEL_COLOR, |
|
SHADER_TEXOP_SELECTARG1, |
|
SHADER_TEXARG_TEXTURE, |
|
SHADER_TEXARG_TEXTURE ); |
|
|
|
// alpha and color stage 1 |
|
pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE1, |
|
SHADER_TEXCHANNEL_ALPHA, |
|
SHADER_TEXOP_MODULATE, |
|
SHADER_TEXARG_TEXTURE, |
|
SHADER_TEXARG_VERTEXCOLOR ); |
|
|
|
pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE1, |
|
SHADER_TEXCHANNEL_COLOR, |
|
SHADER_TEXOP_MODULATE2X, |
|
SHADER_TEXARG_PREVIOUSSTAGE, |
|
SHADER_TEXARG_TEXTURE ); |
|
|
|
// Looks backwards, but this is done so that lightmap alpha = 1 when only |
|
// using 1 texture (needed for translucent displacements). |
|
pShaderShadow->BlendFunc( SHADER_BLEND_SRC_ALPHA, SHADER_BLEND_ONE_MINUS_SRC_ALPHA ); |
|
|
|
pShaderShadow->DrawFlags( SHADER_DRAW_COLOR | SHADER_DRAW_POSITION | SHADER_DRAW_TEXCOORD1 | SHADER_DRAW_LIGHTMAP_TEXCOORD0 ); |
|
pShader->FogToFogColor(); |
|
} |
|
DYNAMIC_STATE |
|
{ |
|
pShader->BindTexture( SHADER_SAMPLER1, info.m_nBaseTexture2Var ); |
|
pShaderAPI->BindStandardTexture( SHADER_SAMPLER0, TEXTURE_LIGHTMAP ); |
|
} |
|
pShader->Draw(); |
|
}
|
|
|