1304 lines
36 KiB
Text
1304 lines
36 KiB
Text
|
/***************************************************************************
|
||
|
|
||
|
Misc special effect materials
|
||
|
(seconds= file so it reloads faster)
|
||
|
|
||
|
***************************************************************************/
|
||
|
|
||
|
renderProgram sfx/stroggWindow {
|
||
|
|
||
|
program vertex arb { <%
|
||
|
OPTION ARB_position_invariant;
|
||
|
TEMP R0;
|
||
|
|
||
|
# Noise texture coordinates
|
||
|
DP4 result.texcoord.x, $texCoordAttrib, $diffuseMatrix_s;
|
||
|
DP4 result.texcoord.y, $texCoordAttrib, $diffuseMatrix_t;
|
||
|
|
||
|
# Glow texture coords go trough unmodified
|
||
|
MOV result.texcoord[1], $texCoordAttrib;
|
||
|
|
||
|
# Vertex coloring if needed
|
||
|
MAD R0, $colorAttrib, $colorModulate, $colorAdd;
|
||
|
MUL result.color, $diffuseColor, R0;
|
||
|
|
||
|
# Vector to eye for cubemap lookup
|
||
|
SUB result.texcoord[2], $viewOrigin, $positionAttrib;
|
||
|
%> }
|
||
|
|
||
|
program fragment arb { <%
|
||
|
OPTION ARB_precision_hint_fastest;
|
||
|
TEMP noise, glow, dsdt, R1, screen, glass;
|
||
|
PARAM power = { 1.5, 0.0, 0.0, 0.0 };
|
||
|
|
||
|
# Noise & scanlines texture lookup
|
||
|
TEX noise, fragment.texcoord[0], $map, 2D;
|
||
|
MUL noise, noise, fragment.color;
|
||
|
|
||
|
# Glowy edges texture lookup
|
||
|
TEX glow, fragment.texcoord[1], $selfIllumMap, 2D;
|
||
|
|
||
|
# Offset texture
|
||
|
TEX dsdt, fragment.texcoord[0], $mask, 2D;
|
||
|
|
||
|
# Screen buffer
|
||
|
MAD R1, dsdt, $parameters, fragment.position;
|
||
|
TEX screen, R1, $currentRender, RECT;
|
||
|
#POW screen.x, screen.x, power.x;
|
||
|
#POW screen.y, screen.y, power.x;
|
||
|
#POW screen.z, screen.z, power.x;
|
||
|
#MUL screen, screen, screen;
|
||
|
MUL screen, screen, 2;
|
||
|
|
||
|
# Montitor glass reflection
|
||
|
TEX glass, fragment.texcoord[2], $environmentCubeMap, CUBE;
|
||
|
MUL glass, glass, glass;
|
||
|
MUL glass, glass, 4;
|
||
|
|
||
|
#Composit together
|
||
|
MAD_SAT screen, screen, noise, glow;
|
||
|
|
||
|
|
||
|
#MAD result.color, glass, 1, screen;
|
||
|
LRP result.color, 0.8, screen, glass;
|
||
|
MOV result.color.a, 0.5;
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
renderProgram sfx/cheap_litsmoke {
|
||
|
|
||
|
depthVersion sfx/cheap_litsmoke_depth
|
||
|
earlyCullVersion sfx/cheap_litsmoke_early
|
||
|
|
||
|
program vertex cg { <%
|
||
|
|
||
|
struct VsInputs {
|
||
|
float3 pos : $positionAttrib;
|
||
|
float4 tex : $texCoordAttrib;
|
||
|
float3 center : $normalAttrib;
|
||
|
float4 tangent : $tangentAttrib;
|
||
|
float4 col : $colorAttrib;
|
||
|
$if r_32ByteVtx
|
||
|
float4 signs : $signAttrib;
|
||
|
$endif
|
||
|
};
|
||
|
|
||
|
struct VsOutputs {
|
||
|
float2 tex : TEXCOORD0;
|
||
|
float2 tex2 : TEXCOORD1;
|
||
|
float4 col : COLOR0;
|
||
|
};
|
||
|
|
||
|
uniform float3 viewOrigin : $viewOrigin;
|
||
|
uniform float3 sunDirection : $sunDirection;
|
||
|
uniform float4 colorModulate : $colorModulate;
|
||
|
uniform float4 colorAdd : $colorAdd;
|
||
|
uniform float4 textMatrixS : $diffuseMatrix_s;
|
||
|
uniform float4 textMatrixT : $diffuseMatrix_t;
|
||
|
uniform float4 coverage : $coverage;
|
||
|
|
||
|
float GetZ( float2 value, float sign ) {
|
||
|
return ( sqrt( 1.0f - ( dot( value.xy, value.xy ) ) ) * ( sign - 1.f ) );
|
||
|
}
|
||
|
|
||
|
VsOutputs vertex( VsInputs indata ) {
|
||
|
VsOutputs outdata;
|
||
|
|
||
|
$if r_32ByteVtx
|
||
|
indata.tex.xy *= 1.f/4096.f;
|
||
|
indata.tex.zw = 1.f;
|
||
|
|
||
|
indata.center.z = indata.tangent.x;
|
||
|
|
||
|
indata.tangent = indata.signs;
|
||
|
$endif
|
||
|
|
||
|
// Calculate the tangent space for this billboard, this is a bit tricky as our billboards are all lying in planes paralel
|
||
|
// to the near plane, this makes for cheap billboard calculations on the CPU. But then they all lit identical because they
|
||
|
// all have identical tangent space, and it is also dependent on the view angles. So we want a view-vector billboard tangent
|
||
|
// space. We fake this by taking the view-vector and thus not the billboard-normal as the normal for our tangent space and
|
||
|
// rederive the other two vectors.
|
||
|
float3 normal = normalize( viewOrigin - indata.center );
|
||
|
float3 bino = cross( normal, indata.tangent.xyz );
|
||
|
float3 tang = cross( normal, bino );
|
||
|
|
||
|
// Sun direction in tangent space
|
||
|
float3 sunT;
|
||
|
sunT.x = dot( sunDirection, tang );
|
||
|
sunT.y = dot( sunDirection, bino );
|
||
|
sunT.z = 0;
|
||
|
sunT = normalize( sunT );
|
||
|
|
||
|
// Rotate the texcords towards the sun
|
||
|
outdata.tex.x = dot( indata.tex, textMatrixS );
|
||
|
outdata.tex.y = dot( indata.tex, textMatrixT );
|
||
|
outdata.tex2.x = dot( indata.tex.xy * 2 - 1, sunT.xy ) * 0.5 + 0.5;
|
||
|
outdata.tex2.y = 0;
|
||
|
|
||
|
outdata.col = indata.col * colorModulate + colorAdd;
|
||
|
outdata.col.w *= coverage.x;
|
||
|
return outdata;
|
||
|
}
|
||
|
%> }
|
||
|
|
||
|
program fragment cg { <%
|
||
|
struct VsOutputs {
|
||
|
float2 tex : TEXCOORD0;
|
||
|
float3 tex2 : TEXCOORD1;
|
||
|
float4 col : COLOR0;
|
||
|
};
|
||
|
|
||
|
sampler2D colorMap : $map;
|
||
|
sampler2D lightMap : $gradientMap;
|
||
|
|
||
|
float4 fragment( VsOutputs indata ) : COLOR {
|
||
|
float4 color = tex2D( colorMap, indata.tex );
|
||
|
float4 light = tex2D( lightMap, indata.tex2.xy );
|
||
|
return color * light * indata.col;
|
||
|
/*
|
||
|
return indata.col;
|
||
|
*/
|
||
|
}
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
renderProgram sfx/cheap_litsmoke_early {
|
||
|
|
||
|
program vertex cg { <%
|
||
|
|
||
|
struct VsInputs {
|
||
|
float3 pos : $positionAttrib;
|
||
|
float4 tex : $texCoordAttrib;
|
||
|
float3 center : $normalAttrib;
|
||
|
float4 tangent : $tangentAttrib;
|
||
|
float4 col : $colorAttrib;
|
||
|
$if r_32ByteVtx
|
||
|
float4 signs : $signAttrib;
|
||
|
$endif
|
||
|
};
|
||
|
|
||
|
struct VsOutputs {
|
||
|
float2 tex : TEXCOORD0;
|
||
|
float2 tex2 : TEXCOORD1;
|
||
|
float distance : TEXCOORD2;
|
||
|
float4 col : COLOR0;
|
||
|
};
|
||
|
|
||
|
uniform float3 viewOrigin : $viewOrigin;
|
||
|
uniform float3 sunDirection : $sunDirection;
|
||
|
uniform float4 colorModulate : $colorModulate;
|
||
|
uniform float4 colorAdd : $colorAdd;
|
||
|
uniform float4 coverage : $coverage;
|
||
|
uniform float4 textMatrixS : $diffuseMatrix_s;
|
||
|
uniform float4 textMatrixT : $diffuseMatrix_t;
|
||
|
uniform float4 foliageHackDistance : $foliageHackDistance;
|
||
|
|
||
|
float GetZ( float2 value, float sign ) {
|
||
|
return ( sqrt( 1.0f - ( dot( value.xy, value.xy ) ) ) * ( sign - 1.f ) );
|
||
|
}
|
||
|
|
||
|
VsOutputs vertex( VsInputs indata ) {
|
||
|
VsOutputs outdata;
|
||
|
|
||
|
$if r_32ByteVtx
|
||
|
indata.tex.xy *= 1.f/4096.f;
|
||
|
indata.tex.zw = 1.f;
|
||
|
|
||
|
indata.center.z = indata.tangent.x;
|
||
|
|
||
|
indata.tangent = indata.signs;
|
||
|
$endif
|
||
|
|
||
|
// Calculate the tangent space for this billboard, this is a bit tricky as our billboards are all lying in planes paralel
|
||
|
// to the near plane, this makes for cheap billboard calculations on the CPU. But then they all lit identical because they
|
||
|
// all have identical tangent space, and it is also dependent on the view angles. So we want a view-vector billboard tangent
|
||
|
// space. We fake this by taking the view-vector and thus not the billboard-normal as the normal for our tangent space and
|
||
|
// rederive the other two vectors.
|
||
|
float3 dir = viewOrigin - indata.center;
|
||
|
float d = length( dir );
|
||
|
outdata.distance = d - foliageHackDistance.x;
|
||
|
float3 normal = dir * 1.f / d;
|
||
|
float3 bino = cross( normal, indata.tangent.xyz );
|
||
|
float3 tang = cross( normal, bino );
|
||
|
|
||
|
// Sun direction in tangent space
|
||
|
float3 sunT;
|
||
|
sunT.x = dot( sunDirection, tang );
|
||
|
sunT.y = dot( sunDirection, bino );
|
||
|
sunT.z = 0;
|
||
|
sunT = normalize( sunT );
|
||
|
|
||
|
// Rotate the texcords towards the sun
|
||
|
outdata.tex.x = dot( indata.tex, textMatrixS );
|
||
|
outdata.tex.y = dot( indata.tex, textMatrixT );
|
||
|
outdata.tex2.x = dot( indata.tex.xy * 2 - 1, sunT.xy ) * 0.5 + 0.5;
|
||
|
outdata.tex2.y = 0;
|
||
|
|
||
|
outdata.col = indata.col * colorModulate + colorAdd;
|
||
|
outdata.col.w *= coverage.x;
|
||
|
return outdata;
|
||
|
}
|
||
|
%> }
|
||
|
|
||
|
program fragment cg { <%
|
||
|
struct VsOutputs {
|
||
|
float2 tex : TEXCOORD0;
|
||
|
float3 tex2 : TEXCOORD1;
|
||
|
float distance : TEXCOORD2;
|
||
|
float4 col : COLOR0;
|
||
|
};
|
||
|
|
||
|
sampler2D colorMap : $map;
|
||
|
sampler2D lightMap : $gradientMap;
|
||
|
|
||
|
float4 fragment( VsOutputs indata ) : COLOR {
|
||
|
if ( indata.distance < 0.f ) {
|
||
|
discard;
|
||
|
}
|
||
|
float4 color = tex2D( colorMap, indata.tex );
|
||
|
float4 light = tex2D( lightMap, indata.tex2.xy );
|
||
|
return color * light * indata.col;
|
||
|
}
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
renderProgram sfx/cheap_litsmoke_depth {
|
||
|
|
||
|
earlyCullVersion sfx/cheap_litsmoke_depth_early
|
||
|
|
||
|
program vertex reference sfx/cheap_litsmoke
|
||
|
|
||
|
program fragment cg { <%
|
||
|
struct VsOutputs {
|
||
|
float4 pos : WPOS;
|
||
|
float2 tex : TEXCOORD0;
|
||
|
float3 tex2 : TEXCOORD1;
|
||
|
float4 col : COLOR0;
|
||
|
};
|
||
|
|
||
|
sampler2D colorMap : $map;
|
||
|
samplerRECT depthMap : $currentDepth;
|
||
|
sampler2D lightMap : $gradientMap;
|
||
|
|
||
|
float4 proj2view : $proj2View;
|
||
|
|
||
|
float4 fragment( VsOutputs indata ) : COLOR {
|
||
|
float4 color = tex2D( colorMap, indata.tex );
|
||
|
float4 light = tex2D( lightMap, indata.tex2.xy );
|
||
|
|
||
|
float depth = texRECT( depthMap, indata.pos.xy ).x;
|
||
|
depth = (depth * 2) - 1;
|
||
|
depth = 1.f/(-depth - proj2view.x) * proj2view.y;
|
||
|
float testdepth = indata.pos.z;
|
||
|
testdepth = (testdepth * 2) - 1;
|
||
|
testdepth = 1.f/(-testdepth - proj2view.x) * proj2view.y;
|
||
|
float sky = depth >= 1.f;
|
||
|
float diff = (-depth) - (-testdepth);
|
||
|
float o = min( max( (diff * 0.06f), 0 ) + sky, 1.f );
|
||
|
|
||
|
float3 rgb = color.xyz * light.xyz * indata.col.xyz;
|
||
|
float alpha = color.w * indata.col.w * o;
|
||
|
return float4(rgb,alpha);
|
||
|
//return color * light * indata.col;
|
||
|
/*
|
||
|
return indata.col;
|
||
|
*/
|
||
|
}
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
renderProgram sfx/cheap_litsmoke_depth_early {
|
||
|
|
||
|
program vertex reference sfx/cheap_litsmoke_early
|
||
|
|
||
|
program fragment cg { <%
|
||
|
struct VsOutputs {
|
||
|
float4 pos : WPOS;
|
||
|
float2 tex : TEXCOORD0;
|
||
|
float3 tex2 : TEXCOORD1;
|
||
|
float distance : TEXCOORD2;
|
||
|
float4 col : COLOR0;
|
||
|
};
|
||
|
|
||
|
sampler2D colorMap : $map;
|
||
|
samplerRECT depthMap : $currentDepth;
|
||
|
sampler2D lightMap : $gradientMap;
|
||
|
|
||
|
float4 proj2view : $proj2View;
|
||
|
|
||
|
float4 fragment( VsOutputs indata ) : COLOR {
|
||
|
if ( indata.distance < 0.f ) {
|
||
|
discard;
|
||
|
}
|
||
|
float4 color = tex2D( colorMap, indata.tex );
|
||
|
float4 light = tex2D( lightMap, indata.tex2.xy );
|
||
|
|
||
|
float depth = texRECT( depthMap, indata.pos.xy ).x;
|
||
|
depth = (depth * 2) - 1;
|
||
|
depth = 1.f/(-depth - proj2view.x) * proj2view.y;
|
||
|
float testdepth = indata.pos.z;
|
||
|
testdepth = (testdepth * 2) - 1;
|
||
|
testdepth = 1.f/(-testdepth - proj2view.x) * proj2view.y;
|
||
|
float sky = depth >= 1.f;
|
||
|
float diff = (-depth) - (-testdepth);
|
||
|
float o = min( max( (diff * 0.06f), 0 ) + sky, 1.f );
|
||
|
|
||
|
float3 rgb = color.xyz * light.xyz * indata.col.xyz;
|
||
|
float alpha = color.w * indata.col.w * o;
|
||
|
return float4(rgb,alpha);
|
||
|
//return color * light * indata.col;
|
||
|
/*
|
||
|
return indata.col;
|
||
|
*/
|
||
|
}
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
|
||
|
renderProgram sfx/cheap_litsmoke_fire {
|
||
|
|
||
|
program vertex reference sfx/cheap_litsmoke
|
||
|
|
||
|
program fragment cg { <%
|
||
|
struct VsOutputs {
|
||
|
float2 tex : TEXCOORD0;
|
||
|
float3 tex2 : TEXCOORD1;
|
||
|
float4 col : COLOR0;
|
||
|
};
|
||
|
|
||
|
sampler2D blendMap : $map;
|
||
|
sampler2D addMap : $mask;
|
||
|
sampler2D lightMap : $gradientMap;
|
||
|
|
||
|
float4 fragment( VsOutputs indata ) : COLOR {
|
||
|
float4 blend = tex2D( blendMap, indata.tex );
|
||
|
float4 add = tex2D( addMap, indata.tex );
|
||
|
float4 light = tex2D( lightMap, indata.tex2.xy );
|
||
|
|
||
|
// This is totally arcane magic... basically premultiplied alpha
|
||
|
// with some extra faff trown in
|
||
|
float addFactor = ( indata.col.a * 2 - 1 );
|
||
|
float blendFactor = 1 - abs( addFactor );
|
||
|
addFactor = min( max( addFactor, 0 ), 1 );
|
||
|
blendFactor = min( max( blendFactor, 0 ), 1 );
|
||
|
|
||
|
return float4( (( blend * light * blendFactor + add * addFactor ) * indata.col).rgb, blend.a * blendFactor );
|
||
|
}
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
renderProgram deform/ambient_expand {
|
||
|
|
||
|
state force {
|
||
|
depthFunc less // so it behaves like a proper depth fill pass
|
||
|
}
|
||
|
|
||
|
program vertex arb { <%
|
||
|
$define deform
|
||
|
$include "interaction/basic_ambient_vertex.inc"
|
||
|
%> }
|
||
|
program fragment reference ambient/basic
|
||
|
}
|
||
|
|
||
|
|
||
|
renderProgram deform/expand
|
||
|
{
|
||
|
interaction
|
||
|
|
||
|
amblitVersion deform/expand_amblit
|
||
|
ambientVersion deform/ambient_expand
|
||
|
|
||
|
state {
|
||
|
maskDepth
|
||
|
blend GL_ONE, GL_ONE
|
||
|
}
|
||
|
|
||
|
program vertex arb { <%
|
||
|
$define deform
|
||
|
$include "interaction/basic_vertex.inc"
|
||
|
%> }
|
||
|
|
||
|
program fragment reference interaction/basic
|
||
|
}
|
||
|
|
||
|
renderProgram deform/expand_amblit
|
||
|
{
|
||
|
interaction
|
||
|
|
||
|
state {
|
||
|
depthFunc less // so it behaves like a proper depth fill pass
|
||
|
}
|
||
|
|
||
|
program vertex reference deform/expand
|
||
|
|
||
|
program fragment reference interaction/basic_amblit
|
||
|
}
|
||
|
|
||
|
|
||
|
renderProgram sfx/lens {
|
||
|
program vertex arb { <%
|
||
|
OPTION ARB_position_invariant;
|
||
|
PARAM mv[4] = { state.matrix.modelview };
|
||
|
OUTPUT oNrm = result.texcoord[0];
|
||
|
DP3 oNrm.x, mv[0], $normalAttrib;
|
||
|
DP3 oNrm.y, mv[1], $normalAttrib;
|
||
|
DP3 oNrm.z, mv[2], $normalAttrib;
|
||
|
|
||
|
MAD result.texcoord[1], $texcoordAttrib, $currentRenderTexelSize, 0;
|
||
|
|
||
|
%> }
|
||
|
|
||
|
program fragment arb { <%
|
||
|
TEMP pos;
|
||
|
MAD pos, fragment.texcoord[0], 10.03, fragment.position;
|
||
|
#MOV pos, fragment.texcoord[1];
|
||
|
|
||
|
TEMP scr;
|
||
|
TEX scr, pos, $currentRender, RECT;
|
||
|
#MAD result.color, fragment.texcoord, 0.5, 0.5;
|
||
|
MOV result.color, scr.x;
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
renderProgram sfx/ambsunDecal {
|
||
|
program vertex arb { <%
|
||
|
OPTION ARB_position_invariant;
|
||
|
|
||
|
TEMP bitangent;
|
||
|
TEMP R0, R1, R2;
|
||
|
ATTRIB _pos = $positionAttrib;
|
||
|
$if !r_32ByteVtx
|
||
|
ATTRIB _nrm = $normalAttrib;
|
||
|
ATTRIB _tan = $tangentAttrib;
|
||
|
$else
|
||
|
TEMP _nrm, _tan;
|
||
|
MOV _nrm, $normalAttrib;
|
||
|
MOV _tan, $tangentAttrib;
|
||
|
$endif
|
||
|
|
||
|
PARAM defaultTexCoord = { 0, 0.5, 0, 1 };
|
||
|
|
||
|
XPD bitangent, _nrm, _tan;
|
||
|
MUL bitangent, bitangent, $tangentAttrib.w;
|
||
|
|
||
|
# textures 1 takes the base coordinates by the texture matrix
|
||
|
MOV result.texcoord[1], defaultTexCoord;
|
||
|
DP4 result.texcoord[1].x, $texCoordAttrib, $bumpMatrix_s;
|
||
|
DP4 result.texcoord[1].y, $texCoordAttrib, $bumpMatrix_t;
|
||
|
|
||
|
# textures 4 takes the base coordinates by the texture matrix
|
||
|
MOV result.texcoord[4], defaultTexCoord;
|
||
|
DP4 result.texcoord[4].x, $texCoordAttrib, $diffuseMatrix_s;
|
||
|
DP4 result.texcoord[4].y, $texCoordAttrib, $diffuseMatrix_t;
|
||
|
|
||
|
# generate the vertex color, which can be 1.0, color, or 1.0 - color
|
||
|
MAD result.color, $colorAttrib, $colorModulate, $colorAdd;
|
||
|
|
||
|
# build tangent space -> world space conversion matrix
|
||
|
DP3 result.texcoord[5].x, $transposedModelMatrix_x, _tan;
|
||
|
DP3 result.texcoord[6].x, $transposedModelMatrix_y, _tan;
|
||
|
DP3 result.texcoord[7].x, $transposedModelMatrix_z, _tan;
|
||
|
|
||
|
DP3 result.texcoord[5].y, $transposedModelMatrix_x, bitangent;
|
||
|
DP3 result.texcoord[6].y, $transposedModelMatrix_y, bitangent;
|
||
|
DP3 result.texcoord[7].y, $transposedModelMatrix_z, bitangent;
|
||
|
|
||
|
DP3 result.texcoord[5].z, $transposedModelMatrix_x, _nrm;
|
||
|
DP3 result.texcoord[6].z, $transposedModelMatrix_y, _nrm;
|
||
|
DP3 result.texcoord[7].z, $transposedModelMatrix_z, _nrm;
|
||
|
|
||
|
# calculate vector to eye
|
||
|
DP4 R0.x, $transposedModelMatrix_x, _pos;
|
||
|
DP4 R0.y, $transposedModelMatrix_y, _pos;
|
||
|
DP4 R0.z, $transposedModelMatrix_z, _pos;
|
||
|
|
||
|
# normalize
|
||
|
SUB R0.xyz, R0, $viewOriginWorld;
|
||
|
DP3 R0.w, R0, R0;
|
||
|
RSQ R0.w, R0.w;
|
||
|
MUL result.texcoord[2], R0, -R0.w;
|
||
|
|
||
|
%> }
|
||
|
program fragment arb { <%
|
||
|
OPTION ARB_precision_hint_fastest;
|
||
|
|
||
|
TEMP R0, R1, color, localNormal, worldNormal, ambient, localAmbient, specLook, diffuse;
|
||
|
|
||
|
PARAM subOne = { -1, -1, -1, -1 };
|
||
|
PARAM scaleTwo = { 2, 2, 2, 2 };
|
||
|
|
||
|
ATTRIB _diffTC = fragment.texcoord[4];
|
||
|
ATTRIB _bumpTC = fragment.texcoord[1];
|
||
|
|
||
|
# coverage dither mask
|
||
|
$ifdef r_useDitherMask
|
||
|
MUL R1.xy, fragment.position, 0.015625;
|
||
|
TEX R0.r, R1, $dithermask, 2D;
|
||
|
SUB R0.a, 0.5, R0.r;
|
||
|
KIL R0.a;
|
||
|
$endif
|
||
|
|
||
|
# modulate by the diffuse map and constant diffuse factor
|
||
|
TEX diffuse, _diffTC, $diffuseMap, 2D;
|
||
|
SUB R0.a, diffuse.a, 0.001;
|
||
|
KIL R0.a;
|
||
|
|
||
|
TEX localNormal, _bumpTC, $bumpMap, 2D;
|
||
|
MOV localNormal.x, localNormal.a;
|
||
|
MAD localNormal.xy, localNormal, scaleTwo, subOne;
|
||
|
|
||
|
#Renormalize
|
||
|
$if r_normalizeNormalMaps
|
||
|
MOV localNormal.z, 0;
|
||
|
DP3 R1.x, localNormal,localNormal;
|
||
|
ADD R1.x, 1, -R1.x;
|
||
|
RSQ R1.x, R1.x;
|
||
|
RCP localNormal.z, R1.x;
|
||
|
$endif
|
||
|
|
||
|
# put normal into world space
|
||
|
DP3 worldNormal.x, fragment.texcoord[5], localNormal;
|
||
|
DP3 worldNormal.y, fragment.texcoord[6], localNormal;
|
||
|
DP3 worldNormal.z, fragment.texcoord[7], localNormal;
|
||
|
|
||
|
# get diffuse lighting from cubemap
|
||
|
TEX ambient, worldNormal, $ambientCubeMap, CUBE;
|
||
|
MUL ambient, ambient, $ambientBrightness;
|
||
|
|
||
|
MUL color, diffuse, $diffuseColor;
|
||
|
# kill if we need this
|
||
|
$ifdef alphatest_kill
|
||
|
SUB diffuse.a, diffuse.a, $alphaThresh;
|
||
|
KIL diffuse.a;
|
||
|
$endif
|
||
|
|
||
|
TEMP lightdp;
|
||
|
DP3_SAT lightdp, worldNormal, $sunDirectionWorld;
|
||
|
|
||
|
# modulate by ambient
|
||
|
MAD ambient, lightdp, $sunColor, ambient;
|
||
|
MUL color, ambient, color;
|
||
|
|
||
|
$if !r_shaderSkipSpecCubeMaps
|
||
|
# calc reflection vector: i - 2 * dot(i, n) * n
|
||
|
TEMP refl;
|
||
|
DP3 R1, fragment.texcoord[2], worldNormal;
|
||
|
ADD R1, R1, R1;
|
||
|
MAD refl, -worldNormal, R1.x, fragment.texcoord[2];
|
||
|
|
||
|
# get specular from cubemap
|
||
|
TEX ambient, refl, $specularCubeMap, CUBE;
|
||
|
|
||
|
# modulate by the specular map * 2
|
||
|
TEX specLook, _diffTC, $specularMap, 2D;
|
||
|
ADD R0, specLook, specLook;
|
||
|
|
||
|
TEMP specdp;
|
||
|
DP3_SAT specdp, -refl, $sunDirectionWorld;
|
||
|
MUL lightdp, lightdp, specdp;
|
||
|
MUL lightdp, lightdp, lightdp;
|
||
|
MUL lightdp, lightdp, lightdp;
|
||
|
MUL lightdp, lightdp, lightdp;
|
||
|
MAD R0, lightdp, 2, R0;
|
||
|
|
||
|
MAD color, R0, ambient, color;
|
||
|
$endif
|
||
|
|
||
|
# modify by the vertex color
|
||
|
|
||
|
MUL result.color, color, fragment.color;
|
||
|
MOV result.color.a, diffuse.a;
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
renderProgram sfx/ambDecal {
|
||
|
program vertex arb { <%
|
||
|
OPTION ARB_position_invariant;
|
||
|
|
||
|
TEMP bitangent;
|
||
|
TEMP R0, R1, R2;
|
||
|
ATTRIB _pos = $positionAttrib;
|
||
|
$if !r_32ByteVtx
|
||
|
ATTRIB _nrm = $normalAttrib;
|
||
|
ATTRIB _tan = $tangentAttrib;
|
||
|
$else
|
||
|
TEMP _nrm, _tan;
|
||
|
MOV _nrm, $normalAttrib;
|
||
|
MOV _tan, $tangentAttrib;
|
||
|
$endif
|
||
|
|
||
|
PARAM defaultTexCoord = { 0, 0.5, 0, 1 };
|
||
|
|
||
|
XPD bitangent, _nrm, _tan;
|
||
|
MUL bitangent, bitangent, $tangentAttrib.w;
|
||
|
|
||
|
# textures 1 takes the base coordinates by the texture matrix
|
||
|
MOV result.texcoord[1], defaultTexCoord;
|
||
|
DP4 result.texcoord[1].x, $texCoordAttrib, $bumpMatrix_s;
|
||
|
DP4 result.texcoord[1].y, $texCoordAttrib, $bumpMatrix_t;
|
||
|
|
||
|
# textures 4 takes the base coordinates by the texture matrix
|
||
|
MOV result.texcoord[4], defaultTexCoord;
|
||
|
DP4 result.texcoord[4].x, $texCoordAttrib, $diffuseMatrix_s;
|
||
|
DP4 result.texcoord[4].y, $texCoordAttrib, $diffuseMatrix_t;
|
||
|
|
||
|
# generate the vertex color, which can be 1.0, color, or 1.0 - color
|
||
|
MAD result.color, $colorAttrib, $colorModulate, $colorAdd;
|
||
|
|
||
|
# build tangent space -> world space conversion matrix
|
||
|
DP3 result.texcoord[5].x, $transposedModelMatrix_x, _tan;
|
||
|
DP3 result.texcoord[6].x, $transposedModelMatrix_y, _tan;
|
||
|
DP3 result.texcoord[7].x, $transposedModelMatrix_z, _tan;
|
||
|
|
||
|
DP3 result.texcoord[5].y, $transposedModelMatrix_x, bitangent;
|
||
|
DP3 result.texcoord[6].y, $transposedModelMatrix_y, bitangent;
|
||
|
DP3 result.texcoord[7].y, $transposedModelMatrix_z, bitangent;
|
||
|
|
||
|
DP3 result.texcoord[5].z, $transposedModelMatrix_x, _nrm;
|
||
|
DP3 result.texcoord[6].z, $transposedModelMatrix_y, _nrm;
|
||
|
DP3 result.texcoord[7].z, $transposedModelMatrix_z, _nrm;
|
||
|
|
||
|
# calculate vector to eye
|
||
|
DP4 R0.x, $transposedModelMatrix_x, _pos;
|
||
|
DP4 R0.y, $transposedModelMatrix_y, _pos;
|
||
|
DP4 R0.z, $transposedModelMatrix_z, _pos;
|
||
|
|
||
|
# normalize
|
||
|
SUB R0.xyz, R0, $viewOriginWorld;
|
||
|
DP3 R0.w, R0, R0;
|
||
|
RSQ R0.w, R0.w;
|
||
|
MUL result.texcoord[2], R0, -R0.w;
|
||
|
|
||
|
%> }
|
||
|
program fragment arb { <%
|
||
|
OPTION ARB_precision_hint_fastest;
|
||
|
|
||
|
TEMP R0, R1, color, localNormal, worldNormal, ambient, localAmbient, specLook, diffuse;
|
||
|
|
||
|
PARAM subOne = { -1, -1, -1, -1 };
|
||
|
PARAM scaleTwo = { 2, 2, 2, 2 };
|
||
|
|
||
|
ATTRIB _diffTC = fragment.texcoord[4];
|
||
|
ATTRIB _bumpTC = fragment.texcoord[1];
|
||
|
|
||
|
# coverage dither mask
|
||
|
$ifdef r_useDitherMask
|
||
|
MUL R1.xy, fragment.position, 0.015625;
|
||
|
TEX R0.r, R1, $dithermask, 2D;
|
||
|
SUB R0.a, 0.5, R0.r;
|
||
|
KIL R0.a;
|
||
|
$endif
|
||
|
|
||
|
# modulate by the diffuse map and constant diffuse factor
|
||
|
TEX diffuse, _diffTC, $diffuseMap, 2D;
|
||
|
SUB R0.a, diffuse.a, 0.001;
|
||
|
KIL R0.a;
|
||
|
|
||
|
TEX localNormal, _bumpTC, $bumpMap, 2D;
|
||
|
MOV localNormal.x, localNormal.a;
|
||
|
MAD localNormal.xy, localNormal, scaleTwo, subOne;
|
||
|
|
||
|
#Renormalize
|
||
|
$if r_normalizeNormalMaps
|
||
|
MOV localNormal.z, 0;
|
||
|
DP3 R1.x, localNormal,localNormal;
|
||
|
ADD R1.x, 1, -R1.x;
|
||
|
RSQ R1.x, R1.x;
|
||
|
RCP localNormal.z, R1.x;
|
||
|
$endif
|
||
|
|
||
|
# put normal into world space
|
||
|
DP3 worldNormal.x, fragment.texcoord[5], localNormal;
|
||
|
DP3 worldNormal.y, fragment.texcoord[6], localNormal;
|
||
|
DP3 worldNormal.z, fragment.texcoord[7], localNormal;
|
||
|
|
||
|
# get diffuse lighting from cubemap
|
||
|
TEX ambient, worldNormal, $ambientCubeMap, CUBE;
|
||
|
MUL ambient, ambient, $ambientBrightness;
|
||
|
|
||
|
MUL color, diffuse, $diffuseColor;
|
||
|
# kill if we need this
|
||
|
$ifdef alphatest_kill
|
||
|
SUB diffuse.a, diffuse.a, $alphaThresh;
|
||
|
KIL diffuse.a;
|
||
|
$endif
|
||
|
|
||
|
# modulate by ambient
|
||
|
MUL color, ambient, color;
|
||
|
|
||
|
$if !r_shaderSkipSpecCubeMaps
|
||
|
# calc reflection vector: i - 2 * dot(i, n) * n
|
||
|
TEMP refl;
|
||
|
DP3 R1, fragment.texcoord[2], worldNormal;
|
||
|
ADD R1, R1, R1;
|
||
|
MAD refl, worldNormal, R1.x, fragment.texcoord[2];
|
||
|
|
||
|
# get specular from cubemap
|
||
|
TEX ambient, refl, $specularCubeMap, CUBE;
|
||
|
|
||
|
# modulate by the specular map * 2
|
||
|
TEX specLook, _diffTC, $specularMap, 2D;
|
||
|
ADD R0, specLook, specLook;
|
||
|
|
||
|
MAD color, R0, ambient, color;
|
||
|
$endif
|
||
|
|
||
|
# modify by the vertex color
|
||
|
|
||
|
MUL result.color, color, fragment.color;
|
||
|
MOV result.color.a, diffuse.a;
|
||
|
#MOV result.color, diffuse.a;
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
renderProgram sfx/feAmbDecal {
|
||
|
program vertex arb { <%
|
||
|
OPTION ARB_position_invariant;
|
||
|
|
||
|
TEMP bitangent;
|
||
|
TEMP R0, R1, R2;
|
||
|
ATTRIB _pos = $positionAttrib;
|
||
|
$if !r_32ByteVtx
|
||
|
ATTRIB _nrm = $normalAttrib;
|
||
|
ATTRIB _tan = $tangentAttrib;
|
||
|
$else
|
||
|
TEMP _nrm, _tan;
|
||
|
MOV _nrm, $normalAttrib;
|
||
|
MOV _tan, $tangentAttrib;
|
||
|
$endif
|
||
|
|
||
|
PARAM defaultTexCoord = { 0, 0.5, 0, 1 };
|
||
|
|
||
|
XPD bitangent, _nrm, _tan;
|
||
|
MUL bitangent, bitangent, $tangentAttrib.w;
|
||
|
|
||
|
# textures 1 takes the base coordinates by the texture matrix
|
||
|
MOV result.texcoord[1], defaultTexCoord;
|
||
|
DP4 result.texcoord[1].x, $texCoordAttrib, $bumpMatrix_s;
|
||
|
DP4 result.texcoord[1].y, $texCoordAttrib, $bumpMatrix_t;
|
||
|
|
||
|
# textures 4 takes the base coordinates by the texture matrix
|
||
|
MOV result.texcoord[4], defaultTexCoord;
|
||
|
DP4 result.texcoord[4].x, $texCoordAttrib, $diffuseMatrix_s;
|
||
|
DP4 result.texcoord[4].y, $texCoordAttrib, $diffuseMatrix_t;
|
||
|
|
||
|
# generate the vertex color, which can be 1.0, color, or 1.0 - color
|
||
|
MAD result.color, $colorAttrib, $colorModulate, $colorAdd;
|
||
|
|
||
|
# build tangent space -> world space conversion matrix
|
||
|
DP3 result.texcoord[5].x, $transposedModelMatrix_x, _tan;
|
||
|
DP3 result.texcoord[6].x, $transposedModelMatrix_y, _tan;
|
||
|
DP3 result.texcoord[7].x, $transposedModelMatrix_z, _tan;
|
||
|
|
||
|
DP3 result.texcoord[5].y, $transposedModelMatrix_x, bitangent;
|
||
|
DP3 result.texcoord[6].y, $transposedModelMatrix_y, bitangent;
|
||
|
DP3 result.texcoord[7].y, $transposedModelMatrix_z, bitangent;
|
||
|
|
||
|
DP3 result.texcoord[5].z, $transposedModelMatrix_x, _nrm;
|
||
|
DP3 result.texcoord[6].z, $transposedModelMatrix_y, _nrm;
|
||
|
DP3 result.texcoord[7].z, $transposedModelMatrix_z, _nrm;
|
||
|
|
||
|
# calculate vector to eye
|
||
|
DP4 R0.x, $transposedModelMatrix_x, _pos;
|
||
|
DP4 R0.y, $transposedModelMatrix_y, _pos;
|
||
|
DP4 R0.z, $transposedModelMatrix_z, _pos;
|
||
|
|
||
|
# normalize
|
||
|
SUB R0.xyz, R0, $viewOriginWorld;
|
||
|
DP3 R0.w, R0, R0;
|
||
|
RSQ R0.w, R0.w;
|
||
|
MUL result.texcoord[2], R0, -R0.w;
|
||
|
|
||
|
%> }
|
||
|
program fragment arb { <%
|
||
|
OPTION ARB_precision_hint_fastest;
|
||
|
|
||
|
TEMP R0, R1, color, localNormal, worldNormal, ambient, localAmbient, specLook, diffuse;
|
||
|
|
||
|
PARAM subOne = { -1, -1, -1, -1 };
|
||
|
PARAM scaleTwo = { 2, 2, 2, 2 };
|
||
|
|
||
|
ATTRIB _diffTC = fragment.texcoord[4];
|
||
|
ATTRIB _bumpTC = fragment.texcoord[4];
|
||
|
|
||
|
# coverage dither mask
|
||
|
$ifdef r_useDitherMask
|
||
|
MUL R1.xy, fragment.position, 0.015625;
|
||
|
TEX R0.r, R1, $dithermask, 2D;
|
||
|
SUB R0.a, 0.5, R0.r;
|
||
|
KIL R0.a;
|
||
|
$endif
|
||
|
|
||
|
# modulate by the diffuse map and constant diffuse factor
|
||
|
TEX diffuse, _diffTC, $diffuseMap, 2D;
|
||
|
SUB R0.a, diffuse.a, 0.001;
|
||
|
KIL R0.a;
|
||
|
|
||
|
TEX localNormal, _bumpTC, $bumpMap, 2D;
|
||
|
MOV localNormal.x, localNormal.a;
|
||
|
MAD localNormal.xy, localNormal, scaleTwo, subOne;
|
||
|
|
||
|
#Renormalize
|
||
|
$if r_normalizeNormalMaps
|
||
|
MOV localNormal.z, 0;
|
||
|
DP3 R1.x, localNormal,localNormal;
|
||
|
ADD R1.x, 1, -R1.x;
|
||
|
RSQ R1.x, R1.x;
|
||
|
RCP localNormal.z, R1.x;
|
||
|
$endif
|
||
|
|
||
|
# put normal into world space
|
||
|
DP3 worldNormal.x, fragment.texcoord[5], localNormal;
|
||
|
DP3 worldNormal.y, fragment.texcoord[6], localNormal;
|
||
|
DP3 worldNormal.z, fragment.texcoord[7], localNormal;
|
||
|
|
||
|
# get diffuse lighting from cubemap
|
||
|
TEX ambient, worldNormal, $ambientCubeMap, CUBE;
|
||
|
MUL ambient, ambient, $ambientBrightness;
|
||
|
MUL ambient, ambient, 2;
|
||
|
|
||
|
MUL color, diffuse, $diffuseColor;
|
||
|
# kill if we need this
|
||
|
$ifdef alphatest_kill
|
||
|
SUB diffuse.a, diffuse.a, $alphaThresh;
|
||
|
KIL diffuse.a;
|
||
|
$endif
|
||
|
|
||
|
# modulate by ambient
|
||
|
MUL color, ambient, color;
|
||
|
|
||
|
$if !r_shaderSkipSpecCubeMaps
|
||
|
# calc reflection vector: i - 2 * dot(i, n) * n
|
||
|
TEMP refl;
|
||
|
DP3 R1, fragment.texcoord[2], worldNormal;
|
||
|
ADD R1, R1, R1;
|
||
|
MAD refl, worldNormal, R1.x, -fragment.texcoord[2];
|
||
|
|
||
|
# get specular from cubemap
|
||
|
TEMP spec;
|
||
|
TEX spec, refl, $specularCubeMap, CUBE;
|
||
|
|
||
|
# modulate by the specular map * 2
|
||
|
TEX specLook, _diffTC, $specularMap, 2D;
|
||
|
ADD R0, specLook, specLook;
|
||
|
|
||
|
MAD color, R0, spec, color;
|
||
|
$endif
|
||
|
|
||
|
# modify by the vertex color
|
||
|
|
||
|
MUL R1, color, fragment.color;
|
||
|
MOV result.color.a, diffuse.a;
|
||
|
|
||
|
DP3 R0, fragment.texcoord[2], worldNormal;
|
||
|
ADD R0, 1, -R0; #worldNormal.x;
|
||
|
MUL R0, R0, R0;
|
||
|
MUL R0, R0, R0;
|
||
|
MUL R0, R0, $parameters;
|
||
|
TEMP R2;
|
||
|
MUL R2, R0, ambient;
|
||
|
MAD R2, R0, 0.1, R2;
|
||
|
|
||
|
TEMP night;
|
||
|
TEX night, _diffTC, $selfIllumMap, 2D;
|
||
|
|
||
|
MUL_SAT ambient, ambient, 8;
|
||
|
MAD R0, night, -ambient.r, night;
|
||
|
MAX R0, R0, 0;
|
||
|
ADD R2, R0, R2;
|
||
|
ADD result.color.rgb, R1, R2;
|
||
|
|
||
|
#MOV result.color.rgb, specLook;
|
||
|
|
||
|
|
||
|
#MAD result.color.rgb, fragment.texcoord[2], 0.5, 0.5;
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
renderProgram sfx/feAmbDecal_cloud {
|
||
|
program vertex reference sfx/feAmbDecal
|
||
|
|
||
|
program fragment arb { <%
|
||
|
OPTION ARB_precision_hint_fastest;
|
||
|
|
||
|
TEMP R0, R1, color, localNormal, worldNormal, ambient, localAmbient, specLook, diffuse;
|
||
|
|
||
|
PARAM subOne = { -1, -1, -1, -1 };
|
||
|
PARAM scaleTwo = { 2, 2, 2, 2 };
|
||
|
|
||
|
ATTRIB _diffTC = fragment.texcoord[4];
|
||
|
ATTRIB _bumpTC = fragment.texcoord[4];
|
||
|
|
||
|
# coverage dither mask
|
||
|
$ifdef r_useDitherMask
|
||
|
MUL R1.xy, fragment.position, 0.015625;
|
||
|
TEX R0.r, R1, $dithermask, 2D;
|
||
|
SUB R0.a, 0.5, R0.r;
|
||
|
KIL R0.a;
|
||
|
$endif
|
||
|
|
||
|
# modulate by the diffuse map and constant diffuse factor
|
||
|
TEX diffuse, _diffTC, $diffuseMap, 2D;
|
||
|
SUB R0.a, diffuse.a, 0.001;
|
||
|
#KIL R0.a;
|
||
|
|
||
|
TEX localNormal, _bumpTC, $bumpMap, 2D;
|
||
|
MOV localNormal.x, localNormal.a;
|
||
|
MAD localNormal.xy, localNormal, scaleTwo, subOne;
|
||
|
|
||
|
#Renormalize
|
||
|
$if r_normalizeNormalMaps
|
||
|
MOV localNormal.z, 0;
|
||
|
DP3 R1.x, localNormal,localNormal;
|
||
|
ADD R1.x, 1, -R1.x;
|
||
|
RSQ R1.x, R1.x;
|
||
|
RCP localNormal.z, R1.x;
|
||
|
$endif
|
||
|
|
||
|
# put normal into world space
|
||
|
DP3 worldNormal.x, fragment.texcoord[5], localNormal;
|
||
|
DP3 worldNormal.y, fragment.texcoord[6], localNormal;
|
||
|
DP3 worldNormal.z, fragment.texcoord[7], localNormal;
|
||
|
|
||
|
# get diffuse lighting from cubemap
|
||
|
TEX ambient, worldNormal, $ambientCubeMap, CUBE;
|
||
|
MUL ambient, ambient, $ambientBrightness;
|
||
|
MUL ambient, ambient, 2;
|
||
|
|
||
|
MUL color, diffuse, $diffuseColor;
|
||
|
# kill if we need this
|
||
|
$ifdef alphatest_kill
|
||
|
SUB diffuse.a, diffuse.a, $alphaThresh;
|
||
|
KIL diffuse.a;
|
||
|
$endif
|
||
|
|
||
|
# modulate by ambient
|
||
|
MUL color, ambient, color;
|
||
|
|
||
|
$if !r_shaderSkipSpecCubeMaps
|
||
|
# calc reflection vector: i - 2 * dot(i, n) * n
|
||
|
TEMP refl;
|
||
|
DP3 R1, fragment.texcoord[2], worldNormal;
|
||
|
ADD R1, R1, R1;
|
||
|
MAD refl, worldNormal, R1.x, -fragment.texcoord[2];
|
||
|
|
||
|
# get specular from cubemap
|
||
|
TEMP spec;
|
||
|
TEX spec, refl, $specularCubeMap, CUBE;
|
||
|
|
||
|
# modulate by the specular map * 2
|
||
|
TEX specLook, _diffTC, $specularMap, 2D;
|
||
|
ADD R0, specLook, specLook;
|
||
|
|
||
|
MAD color, R0, spec, color;
|
||
|
$endif
|
||
|
|
||
|
# modify by the vertex color
|
||
|
|
||
|
MUL R1, color, fragment.color;
|
||
|
|
||
|
DP3 R0, fragment.texcoord[2], worldNormal;
|
||
|
ADD R0, 1, -R0; #worldNormal.x;
|
||
|
MUL R0, R0, R0;
|
||
|
MUL R0, R0, R0;
|
||
|
TEMP DP;
|
||
|
MUL DP, R0, $parameters;
|
||
|
|
||
|
TEMP R2;
|
||
|
MUL R2, DP, ambient;
|
||
|
MAD R2, DP, 0.1, R2;
|
||
|
|
||
|
TEMP night;
|
||
|
TEX night, _diffTC, $selfIllumMap, 2D;
|
||
|
|
||
|
MUL_SAT ambient, ambient, 8;
|
||
|
MAD R0, night, -ambient.r, night;
|
||
|
# ADD R2, R0, R2;
|
||
|
ADD result.color.rgb, R1, R2;
|
||
|
|
||
|
SUB R0, 1, DP;
|
||
|
MUL result.color.a, diffuse.a, R0;
|
||
|
|
||
|
#MOV result.color.rgb, ambient;
|
||
|
|
||
|
|
||
|
#MAD result.color.rgb, fragment.texcoord[2], 0.5, 0.5;
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
|
||
|
renderProgram sfx/atmos {
|
||
|
program vertex reference sfx/feAmbDecal
|
||
|
|
||
|
program fragment arb { <%
|
||
|
OPTION ARB_precision_hint_fastest;
|
||
|
|
||
|
TEMP R0, R1, color, localNormal, worldNormal, ambient, localAmbient, specLook, diffuse;
|
||
|
|
||
|
PARAM subOne = { -1, -1, -1, -1 };
|
||
|
PARAM scaleTwo = { 2, 2, 2, 2 };
|
||
|
|
||
|
ATTRIB _bumpTC = fragment.texcoord[1];
|
||
|
|
||
|
TEX localNormal, _bumpTC, $bumpMap, 2D;
|
||
|
MOV localNormal.x, localNormal.a;
|
||
|
MAD localNormal.xy, localNormal, scaleTwo, subOne;
|
||
|
|
||
|
#Renormalize
|
||
|
$if r_normalizeNormalMaps
|
||
|
MOV localNormal.z, 0;
|
||
|
DP3 R1.x, localNormal,localNormal;
|
||
|
ADD R1.x, 1, -R1.x;
|
||
|
RSQ R1.x, R1.x;
|
||
|
RCP localNormal.z, R1.x;
|
||
|
$endif
|
||
|
|
||
|
# put normal into world space
|
||
|
DP3 worldNormal.x, fragment.texcoord[5], localNormal;
|
||
|
DP3 worldNormal.y, fragment.texcoord[6], localNormal;
|
||
|
DP3 worldNormal.z, fragment.texcoord[7], localNormal;
|
||
|
|
||
|
DP3 R0, fragment.texcoord[2], worldNormal;
|
||
|
MUL R0, R0, R0;
|
||
|
MUL_SAT R0, R0,5;
|
||
|
MUL R0, R0, $parameters;
|
||
|
MOV result.color.rgb, R0;
|
||
|
MOV result.color.a, 1;
|
||
|
#MAD result.color.rgb, worldNormal, 0.5, 0.5;
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
|
||
|
renderprogram sfx/foggyWaterSurface {
|
||
|
program vertex cg { <%
|
||
|
|
||
|
struct VsInputs {
|
||
|
float3 pos : $positionAttrib;
|
||
|
float4 tex : $texCoordAttrib;
|
||
|
float3 center : $normalAttrib;
|
||
|
float4 tangent : $tangentAttrib;
|
||
|
float4 col : $colorAttrib;
|
||
|
$if r_32ByteVtx
|
||
|
float4 signs : $signAttrib;
|
||
|
$endif
|
||
|
};
|
||
|
|
||
|
struct VsOutputs {
|
||
|
float2 tex : TEXCOORD0;
|
||
|
float dist : TEXCOORD1;
|
||
|
float3 diff : TEXCOORD2;
|
||
|
float4 col : COLOR0;
|
||
|
};
|
||
|
|
||
|
uniform float3 viewOrigin : $viewOrigin;
|
||
|
|
||
|
float GetZ( float2 value, float sign ) {
|
||
|
return ( sqrt( 1.0f - ( dot( value.xy, value.xy ) ) ) * ( sign - 1.f ) );
|
||
|
}
|
||
|
|
||
|
VsOutputs vertex( VsInputs indata ) {
|
||
|
VsOutputs outdata;
|
||
|
|
||
|
$if r_32ByteVtx
|
||
|
indata.tex.xy *= 1.f/4096.f;
|
||
|
indata.tex.zw = 1.f;
|
||
|
|
||
|
indata.center.z = indata.tangent.x;
|
||
|
|
||
|
indata.tangent = indata.signs;
|
||
|
$endif
|
||
|
|
||
|
float3 diff = indata.pos - viewOrigin;
|
||
|
outdata.dist = length( diff );
|
||
|
outdata.diff = diff;
|
||
|
outdata.col = indata.col;
|
||
|
|
||
|
return outdata;
|
||
|
}
|
||
|
%> }
|
||
|
|
||
|
program fragment cg { <%
|
||
|
struct VsOutputs {
|
||
|
float2 tex : TEXCOORD0;
|
||
|
float dist : TEXCOORD1;
|
||
|
float3 diff : TEXCOORD2;
|
||
|
float4 col : COLOR0;
|
||
|
};
|
||
|
|
||
|
sampler2D colorMap : $map;
|
||
|
uniform float4 parameters2 : $parameters2;
|
||
|
|
||
|
float4 fragment( VsOutputs indata ) : COLOR {
|
||
|
float dist = length( indata.diff );
|
||
|
float d = dist * parameters2.w;
|
||
|
return float4( parameters2.rgb, 1-exp( -(d*d) ) );
|
||
|
}
|
||
|
%> }
|
||
|
}
|
||
|
|
||
|
|
||
|
renderProgram sfx/ambsunDecalAlways {
|
||
|
program vertex arb { <%
|
||
|
PARAM mvp[4] = { state.matrix.mvp };
|
||
|
OUTPUT oPos = result.position;
|
||
|
# Transform the vertex to clip coordinates.
|
||
|
DP4 oPos.x, mvp[0], $positionAttrib;
|
||
|
DP4 oPos.y, mvp[1], $positionAttrib;
|
||
|
|
||
|
TEMP zw;
|
||
|
DP4 zw.z, mvp[2], $positionAttrib;
|
||
|
DP4 zw.w, mvp[3], $positionAttrib;
|
||
|
MOV oPos.w, zw;
|
||
|
TEMP res;
|
||
|
SLT res.x, zw.w, zw.z;
|
||
|
SLT res.y, zw.z, -zw.w;
|
||
|
MUL res.x, res.x, res.y;
|
||
|
MUL oPos.z, res.x, zw.z;
|
||
|
|
||
|
TEMP bitangent;
|
||
|
TEMP R0, R1, R2;
|
||
|
ATTRIB _pos = $positionAttrib;
|
||
|
$if !r_32ByteVtx
|
||
|
ATTRIB _nrm = $normalAttrib;
|
||
|
ATTRIB _tan = $tangentAttrib;
|
||
|
$else
|
||
|
TEMP _nrm, _tan;
|
||
|
MOV _nrm, $normalAttrib;
|
||
|
MOV _tan, $tangentAttrib;
|
||
|
$endif
|
||
|
|
||
|
PARAM defaultTexCoord = { 0, 0.5, 0, 1 };
|
||
|
|
||
|
XPD bitangent, _nrm, _tan;
|
||
|
MUL bitangent, bitangent, $tangentAttrib.w;
|
||
|
|
||
|
# textures 1 takes the base coordinates by the texture matrix
|
||
|
MOV result.texcoord[1], defaultTexCoord;
|
||
|
DP4 result.texcoord[1].x, $texCoordAttrib, $bumpMatrix_s;
|
||
|
DP4 result.texcoord[1].y, $texCoordAttrib, $bumpMatrix_t;
|
||
|
|
||
|
# textures 4 takes the base coordinates by the texture matrix
|
||
|
MOV result.texcoord[4], defaultTexCoord;
|
||
|
DP4 result.texcoord[4].x, $texCoordAttrib, $diffuseMatrix_s;
|
||
|
DP4 result.texcoord[4].y, $texCoordAttrib, $diffuseMatrix_t;
|
||
|
|
||
|
# generate the vertex color, which can be 1.0, color, or 1.0 - color
|
||
|
MAD result.color, $colorAttrib, $colorModulate, $colorAdd;
|
||
|
|
||
|
# build tangent space -> world space conversion matrix
|
||
|
DP3 result.texcoord[5].x, $transposedModelMatrix_x, _tan;
|
||
|
DP3 result.texcoord[6].x, $transposedModelMatrix_y, _tan;
|
||
|
DP3 result.texcoord[7].x, $transposedModelMatrix_z, _tan;
|
||
|
|
||
|
DP3 result.texcoord[5].y, $transposedModelMatrix_x, bitangent;
|
||
|
DP3 result.texcoord[6].y, $transposedModelMatrix_y, bitangent;
|
||
|
DP3 result.texcoord[7].y, $transposedModelMatrix_z, bitangent;
|
||
|
|
||
|
DP3 result.texcoord[5].z, $transposedModelMatrix_x, _nrm;
|
||
|
DP3 result.texcoord[6].z, $transposedModelMatrix_y, _nrm;
|
||
|
DP3 result.texcoord[7].z, $transposedModelMatrix_z, _nrm;
|
||
|
|
||
|
# calculate vector to eye
|
||
|
DP4 R0.x, $transposedModelMatrix_x, _pos;
|
||
|
DP4 R0.y, $transposedModelMatrix_y, _pos;
|
||
|
DP4 R0.z, $transposedModelMatrix_z, _pos;
|
||
|
|
||
|
# normalize
|
||
|
SUB R0.xyz, R0, $viewOriginWorld;
|
||
|
DP3 R0.w, R0, R0;
|
||
|
RSQ R0.w, R0.w;
|
||
|
MUL result.texcoord[2], R0, -R0.w;
|
||
|
|
||
|
%> }
|
||
|
program fragment arb { <%
|
||
|
OPTION ARB_precision_hint_fastest;
|
||
|
|
||
|
TEMP R0, R1, color, localNormal, worldNormal, ambient, localAmbient, specLook, diffuse;
|
||
|
|
||
|
PARAM subOne = { -1, -1, -1, -1 };
|
||
|
PARAM scaleTwo = { 2, 2, 2, 2 };
|
||
|
|
||
|
ATTRIB _diffTC = fragment.texcoord[4];
|
||
|
ATTRIB _bumpTC = fragment.texcoord[1];
|
||
|
|
||
|
# coverage dither mask
|
||
|
$ifdef r_useDitherMask
|
||
|
MUL R1.xy, fragment.position, 0.015625;
|
||
|
TEX R0.r, R1, $dithermask, 2D;
|
||
|
SUB R0.a, 0.5, R0.r;
|
||
|
KIL R0.a;
|
||
|
$endif
|
||
|
|
||
|
# modulate by the diffuse map and constant diffuse factor
|
||
|
TEX diffuse, _diffTC, $diffuseMap, 2D;
|
||
|
SUB R0.a, diffuse.a, 0.001;
|
||
|
KIL R0.a;
|
||
|
|
||
|
TEX localNormal, _bumpTC, $bumpMap, 2D;
|
||
|
MOV localNormal.x, localNormal.a;
|
||
|
MAD localNormal.xy, localNormal, scaleTwo, subOne;
|
||
|
|
||
|
#Renormalize
|
||
|
$if r_normalizeNormalMaps
|
||
|
MOV localNormal.z, 0;
|
||
|
DP3 R1.x, localNormal,localNormal;
|
||
|
ADD R1.x, 1, -R1.x;
|
||
|
RSQ R1.x, R1.x;
|
||
|
RCP localNormal.z, R1.x;
|
||
|
$endif
|
||
|
|
||
|
# put normal into world space
|
||
|
DP3 worldNormal.x, fragment.texcoord[5], localNormal;
|
||
|
DP3 worldNormal.y, fragment.texcoord[6], localNormal;
|
||
|
DP3 worldNormal.z, fragment.texcoord[7], localNormal;
|
||
|
|
||
|
# get diffuse lighting from cubemap
|
||
|
TEX ambient, worldNormal, $ambientCubeMap, CUBE;
|
||
|
MUL ambient, ambient, $ambientBrightness;
|
||
|
|
||
|
MUL color, diffuse, $diffuseColor;
|
||
|
# kill if we need this
|
||
|
$ifdef alphatest_kill
|
||
|
SUB diffuse.a, diffuse.a, $alphaThresh;
|
||
|
KIL diffuse.a;
|
||
|
$endif
|
||
|
|
||
|
TEMP lightdp;
|
||
|
DP3_SAT lightdp, worldNormal, $sunDirectionWorld;
|
||
|
|
||
|
# modulate by ambient
|
||
|
MAD ambient, lightdp, $sunColor, ambient;
|
||
|
MUL color, ambient, color;
|
||
|
|
||
|
$if !r_shaderSkipSpecCubeMaps
|
||
|
# calc reflection vector: i - 2 * dot(i, n) * n
|
||
|
TEMP refl;
|
||
|
DP3 R1, fragment.texcoord[2], worldNormal;
|
||
|
ADD R1, R1, R1;
|
||
|
MAD refl, -worldNormal, R1.x, fragment.texcoord[2];
|
||
|
|
||
|
# get specular from cubemap
|
||
|
TEX ambient, refl, $specularCubeMap, CUBE;
|
||
|
|
||
|
# modulate by the specular map * 2
|
||
|
TEX specLook, _diffTC, $specularMap, 2D;
|
||
|
ADD R0, specLook, specLook;
|
||
|
|
||
|
TEMP specdp;
|
||
|
DP3_SAT specdp, -refl, $sunDirectionWorld;
|
||
|
MUL lightdp, lightdp, specdp;
|
||
|
MUL lightdp, lightdp, lightdp;
|
||
|
MUL lightdp, lightdp, lightdp;
|
||
|
MUL lightdp, lightdp, lightdp;
|
||
|
MAD R0, lightdp, 2, R0;
|
||
|
|
||
|
MAD color, R0, ambient, color;
|
||
|
$endif
|
||
|
|
||
|
# modify by the vertex color
|
||
|
|
||
|
MUL result.color, color, fragment.color;
|
||
|
MOV result.color.a, diffuse.a;
|
||
|
%> }
|
||
|
}
|