void CBaseShader::SetDynamicEnvMappingState( int envMapVar, int envMapMaskVar, int baseTextureVar, int envMapFrameVar, int envMapMaskFrameVar, int frameVar, int maskOffsetVar, int maskScaleVar, int tintVar ) { Assert( !IsSnapshotting() ); IMaterialVar** params = s_ppParams; int varFlags = params[FLAGS]->GetIntValue(); if( (varFlags & MATERIAL_VAR_ENVMAPSPHERE) == 0 ) { if ( (varFlags & MATERIAL_VAR_ENVMAPCAMERASPACE) == 0 ) { LoadCameraToWorldTransform( MATERIAL_TEXTURE0 ); } else { LoadIdentity( MATERIAL_TEXTURE0 ); } } else { LoadCameraSpaceSphereMapTransform( MATERIAL_TEXTURE0 ); } BindTexture( SHADER_TEXTURE_STAGE0, envMapVar, envMapFrameVar ); if (params[envMapMaskVar]->IsDefined()) { SetFixedFunctionTextureScaledTransform( MATERIAL_TEXTURE1, maskOffsetVar, maskScaleVar ); BindTexture( SHADER_TEXTURE_STAGE1, envMapMaskVar, envMapMaskFrameVar ); } else if (varFlags & MATERIAL_VAR_BASEALPHAENVMAPMASK) { SetFixedFunctionTextureScaledTransform( MATERIAL_TEXTURE1, maskOffsetVar, maskScaleVar ); BindTexture( SHADER_TEXTURE_STAGE1, baseTextureVar, frameVar ); } SetModulationDynamicState( tintVar ); }
//----------------------------------------------------------------------------- // Fixed function multiply by detail texture pass //----------------------------------------------------------------------------- void CBaseShader::FixedFunctionMultiplyByDetailPass( int baseTextureVar, int frameVar, int textureTransformVar, int detailVar, int detailScaleVar ) { IMaterialVar** params = s_ppParams; if (!params[detailVar]->IsDefined()) return; if (IsSnapshotting()) { s_pShaderShadow->EnableAlphaTest( IS_FLAG_SET(MATERIAL_VAR_ALPHATEST) ); bool translucentTexture = TextureIsTranslucent( baseTextureVar, true ) || IS_FLAG_SET(MATERIAL_VAR_ALPHATEST); s_pShaderShadow->EnableTexture( SHADER_TEXTURE_STAGE0, translucentTexture ); s_pShaderShadow->EnableTexture( SHADER_TEXTURE_STAGE1, true ); s_pShaderShadow->EnableTexGen( SHADER_TEXTURE_STAGE0, false ); s_pShaderShadow->EnableTexGen( SHADER_TEXTURE_STAGE1, false ); // Mod 2x blend here EnableAlphaBlending( SHADER_BLEND_DST_COLOR, SHADER_BLEND_SRC_COLOR ); s_pShaderShadow->EnableCustomPixelPipe( true ); s_pShaderShadow->CustomTextureStages( 2 ); // We need to blend towards grey based on alpha... // We can never get the perfect alpha (vertex alpha * cc alpha * texture alpha) // so we'll just choose to use cc alpha * texture alpha int flags = SHADER_DRAW_POSITION | SHADER_DRAW_TEXCOORD1; // Compute alpha, stage 0 is used, stage 1 isn't. if ( translucentTexture ) { s_pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0, SHADER_TEXCHANNEL_ALPHA, SHADER_TEXOP_MODULATE, SHADER_TEXARG_TEXTURE, SHADER_TEXARG_CONSTANTCOLOR ); flags |= SHADER_DRAW_TEXCOORD0; } else { bool hasVertexAlpha = (CurrentMaterialVarFlags() & MATERIAL_VAR_VERTEXALPHA) != 0; if (hasVertexAlpha) { flags |= SHADER_DRAW_COLOR; } s_pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0, SHADER_TEXCHANNEL_ALPHA, hasVertexAlpha ? SHADER_TEXOP_MODULATE : SHADER_TEXOP_SELECTARG2, SHADER_TEXARG_VERTEXCOLOR, SHADER_TEXARG_CONSTANTCOLOR ); } s_pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE1, SHADER_TEXCHANNEL_ALPHA, SHADER_TEXOP_SELECTARG1, SHADER_TEXARG_PREVIOUSSTAGE, SHADER_TEXARG_NONE ); // This here will perform color = vertex light * alpha + 0.5f * (1 - alpha) // Stage 0 really doesn't do anything s_pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE0, SHADER_TEXCHANNEL_COLOR, SHADER_TEXOP_SELECTARG1, SHADER_TEXARG_TEXTURE, SHADER_TEXARG_CONSTANTCOLOR ); s_pShaderShadow->CustomTextureOperation( SHADER_TEXTURE_STAGE1, SHADER_TEXCHANNEL_COLOR, SHADER_TEXOP_BLEND_PREVIOUSSTAGEALPHA, SHADER_TEXARG_TEXTURE, SHADER_TEXARG_CONSTANTCOLOR ); s_pShaderShadow->DrawFlags( flags ); Draw( ); s_pShaderShadow->EnableCustomPixelPipe( false ); DisableAlphaBlending(); } else { if (TextureIsTranslucent( baseTextureVar, true ) ) { SetFixedFunctionTextureTransform( MATERIAL_TEXTURE0, textureTransformVar ); BindTexture( SHADER_TEXTURE_STAGE0, baseTextureVar, frameVar ); } BindTexture( SHADER_TEXTURE_STAGE1, detailVar, frameVar ); SetFixedFunctionTextureScaledTransform( MATERIAL_TEXTURE1, textureTransformVar, detailScaleVar ); float alpha = GetAlpha(); s_pShaderAPI->Color4ub( 128, 128, 128, 255 * alpha ); FogToGrey(); Draw( ); } }
//----------------------------------------------------------------------------- // Fixed function Base * detail pass //----------------------------------------------------------------------------- void CBaseShader::FixedFunctionBaseTimesDetailPass( int baseTextureVar, int frameVar, int baseTextureTransformVar, int detailVar, int detailScaleVar ) { IMaterialVar** params = s_ppParams; // We can't do this one one pass if CC and VC are both active... bool hasDetail = (detailVar != -1) && params[detailVar]->IsDefined(); bool detailInSecondPass = hasDetail && IsColorModulating() && (IS_FLAG_SET(MATERIAL_VAR_VERTEXCOLOR) || IS_FLAG_SET(MATERIAL_VAR_VERTEXALPHA)); if (IsSnapshotting()) { IMaterialVar** params = s_ppParams; s_pShaderShadow->EnableTexGen( SHADER_TEXTURE_STAGE0, false ); s_pShaderShadow->EnableTexGen( SHADER_TEXTURE_STAGE1, false ); // alpha test s_pShaderShadow->EnableAlphaTest( IS_FLAG_SET(MATERIAL_VAR_ALPHATEST) ); // Alpha blending SetDefaultBlendingShadowState( baseTextureVar, true ); // independently configure alpha and color s_pShaderShadow->EnableAlphaPipe( true ); // Here's the color states (NOTE: SHADER_DRAW_COLOR == use Vertex Color) s_pShaderShadow->EnableConstantColor( IsColorModulating() ); s_pShaderShadow->EnableTexture( SHADER_TEXTURE_STAGE0, true ); int flags = SHADER_DRAW_POSITION | SHADER_DRAW_TEXCOORD0; // Detail texture.. if (hasDetail && (!detailInSecondPass)) { s_pShaderShadow->EnableTexture( SHADER_TEXTURE_STAGE1, true ); // Force mod2x s_pShaderShadow->OverbrightValue( SHADER_TEXTURE_STAGE1, 2.0f ); flags |= SHADER_DRAW_TEXCOORD1; } // Here's the alpha states s_pShaderShadow->EnableConstantAlpha( IsAlphaModulating() ); s_pShaderShadow->EnableVertexAlpha( IS_FLAG_SET(MATERIAL_VAR_VERTEXALPHA) ); s_pShaderShadow->EnableTextureAlpha( SHADER_TEXTURE_STAGE0, TextureIsTranslucent(baseTextureVar, true) ); if (IS_FLAG_SET(MATERIAL_VAR_VERTEXCOLOR)) flags |= SHADER_DRAW_COLOR; s_pShaderShadow->DrawFlags( flags ); Draw(); s_pShaderShadow->EnableAlphaPipe( false ); } else { SetFixedFunctionTextureTransform( MATERIAL_TEXTURE0, baseTextureTransformVar ); BindTexture( SHADER_TEXTURE_STAGE0, baseTextureVar, frameVar ); // Detail texture.. if (hasDetail && (!detailInSecondPass)) { BindTexture( SHADER_TEXTURE_STAGE1, detailVar, frameVar ); SetFixedFunctionTextureScaledTransform( MATERIAL_TEXTURE1, baseTextureTransformVar, detailScaleVar ); } SetModulationDynamicState(); DefaultFog(); Draw(); } if (detailInSecondPass) { FixedFunctionMultiplyByDetailPass( baseTextureVar, frameVar, baseTextureTransformVar, detailVar, detailScaleVar ); } }
void SetDetailDymamicState(IShaderShadow* pShaderShadow) { BindTexture( SHADER_SAMPLER1, DETAIL, FRAME ); SetFixedFunctionTextureScaledTransform( MATERIAL_TEXTURE1, BASETEXTURETRANSFORM, DETAILSCALE ); }