home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GameStar 2005 April
/
Gamestar_72_2005-04_dvd.iso
/
Dema
/
Liquidator
/
Liquidator.tma
/
data
/
renderer
/
shadows.fx
< prev
next >
Wrap
Text File
|
2004-12-13
|
3KB
|
100 lines
#ifndef __SHADOWS_FX__
#define __SHADOWS_FX__
void CalculateHClipDistance( uniform int Stage ){
float4 fTVertex;
if( Stage == 0 ){
fTVertex = mul(g_fVertexPosition,matProjection);
}
else if( Stage == 1 ){
fTVertex = mul(g_fVertexPosition,matTextureProjection[0]);
}
g_fTexCoords[Stage] = fTVertex.zzzw;
}
void CalculateShadowVolume(){
float4 fLightRdius = vecShadowParams.x;
float4 fVertex2Light;
fVertex2Light.xyz = (float3)g_fVertexPosition - (float3)vecPointLightPosition[0];
fVertex2Light.w = rsqrt( dot((float3)fVertex2Light,(float3)fVertex2Light) );
fVertex2Light.xyz *=fVertex2Light.w;
fVertex2Light.w = dot( fVertex2Light.xyz,-g_fNormal);
if( fVertex2Light.w < 0.0 ){
float4 fDistance = 1.0 / fVertex2Light.w;
float4 fRange = ( fDistance < fLightRdius ) ? 1.0 : 0.0;
fDistance = fDistance * fRange;
fLightRdius = fLightRdius * fRange + (-fDistance);
float3 fLightDir = (float3)fVertex2Light * fLightRdius.x;
g_fVertexPosition.xyz = fLightDir + g_fVertexPosition.xyz;
}
}
void CalculateVisualShadowVolume(){
float4 fLightRdius = vecShadowParams.x;
float4 fVertex2Light;
fVertex2Light.xyz = (float3)g_fVertexPosition - (float3)vecPointLightPosition[0];
fVertex2Light.w = rsqrt( dot((float3)fVertex2Light,(float3)fVertex2Light) );
fVertex2Light.xyz *=fVertex2Light.w;
fVertex2Light.w = dot( fVertex2Light.xyz,-g_fNormal);
if( fVertex2Light.w < 0.0 ){
float4 fDistance = 1.0 / fVertex2Light.w;
float4 fRange = ( fDistance < fLightRdius ) ? 1.0 : 0.0;
fDistance = fDistance * fRange;
fLightRdius = fLightRdius * fRange + (-fDistance);
float3 fLightDir = (float3)fVertex2Light * fLightRdius.x;
g_fVertexPosition.xyz = fLightDir + g_fVertexPosition.xyz;
}
g_fColor0.w = dot(g_fNormal,(float3)fVertex2Light);
g_fColor0.zw = g_fColor0.w * vecShadowParams.z + vecShadowParams.w;
}
void CalculateProjectiveShadow( uniform int NumShadows ){
for( int i =0; i < NumShadows; i++ ){
g_fTexCoords[i] = mul(g_fVertexPosition,matTextureProjection[i]);
}
if( NumShadows == 1 ){
Vector clippingPlane = vecDiffuseColor;
Vector fTVertex = mul(g_fVertexPosition,matProjection);
float c = dot(clippingPlane, fTVertex);
g_fTexCoords[NumShadows] = c;
}
}
void TransformPositionWithDirMask( uniform int NumShadows,uniform bool bAttenuated ){
for( int i =0; i<NumShadows; i++ ){
g_fTexCoords[i] = mul(g_fVertexPosition,matTextureProjection[i]);
float1 fZDistance = ( g_fTexCoords[i].z >= 0.0001 ) ? 1.0 : 0.0;
float3 fZRow;
fZRow.x = matTextureProjection[i][0][2];
fZRow.y = matTextureProjection[i][1][2];
fZRow.z = matTextureProjection[i][2][2];
float fDot;
if( bAttenuated ){
fDot = -dot(g_fNormal,fZRow) * fZDistance;
}else{
fDot = (dot(g_fNormal,fZRow) < 0.0001) ? 1.0 : 0.0;
fDot *= fZDistance;
}
if( i == 0 ){
g_fColor0.xyz = fDot;
}else if( i == 1 ){
g_fColor0.w = fDot;
}else if( i == 2 ){
g_fColor1.xyz = fDot;
}else if( i == 3 ){
g_fColor1.w = fDot;
} // if
}// for
}
#endif //__SHADOWS_FX__