etqw-sdk/base/renderprogs/sfx.rprog

1519 lines
40 KiB
Plaintext

/***************************************************************************
Misc special effect materials
***************************************************************************/
renderBinding rainbowMap { texture { textures/effects/stroggshell2.tga } }
renderProgram sfx/desecratorEffect {
state {
depthFunc equal
blend GL_ONE, GL_ONE
}
program vertex cg { <%
struct VsInputs {
float3 pos : $positionAttrib;
float2 tex : $texCoordAttrib;
float3 normal : $normalAttrib;
float4 tangent : $tangentAttrib;
$if r_32ByteVtx
float4 signs : $signAttrib;
$endif
};
struct VsOutputs {
float2 tex : TEXCOORD0;
float3 toEye : TEXCOORD1;
float3 pos : TEXCOORD2;
float3 toLight : TEXCOORD3;
};
uniform float3 viewOrigin : $viewOrigin;
uniform float3 sunDirection : $sunDirection;
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 *= 1.f/4096.f;
indata.normal.xy *= 1.f / 32767.f;
indata.tangent.xy *= 1.f / 32767.f;
indata.normal.z = GetZ( indata.normal.xy, indata.signs.x );
indata.tangent.z = GetZ( indata.tangent.xy, indata.signs.y );
indata.tangent.w = ( indata.signs.z - 1.f );
$endif
float3 tangent = indata.tangent.xyz;
float3 biTangent = cross( indata.normal, tangent ) * indata.tangent.w;
float3 toEye = indata.pos - viewOrigin;
outData.toEye.x = dot( tangent, toEye );
outData.toEye.y = dot( biTangent, toEye );
outData.toEye.z = dot( indata.normal, toEye );
outData.toEye = normalize( outData.toEye );
outData.toLight.x = dot( tangent, sunDirection );
outData.toLight.y = dot( biTangent, sunDirection );
outData.toLight.z = dot( indata.normal, sunDirection );
outData.pos = indata.pos;
outData.tex = indata.tex;
return outData;
}
%> }
program fragment cg { <%
struct VsOutputs {
float2 tex : TEXCOORD0;
float3 toEye : TEXCOORD1;
float3 pos : TEXCOORD2;
float3 toLight : TEXCOORD3;
};
sampler2D rainbowMap : $map;
sampler2D bumpMap : $bumpMap;
sampler2D specularMap : $specularMap;
samplerCUBE skyMap : $skyGradientCubeMap;
float4 fragment( VsOutputs indata ) : COLOR {
float4 normal = tex2D( bumpMap, indata.tex );
float4 gloss = tex2D( specularMap, indata.tex ) * 1.8 + 0.05;
float4 skyColor = texCUBE( skyMap , float3( 1.0, 1.0, 1.0 ) );
$if !r_dxnNormalMaps
normal.x = normal.a;
$endif
normal = normal * 2 - 1;
normal.z = sqrt( 1.f - dot( normal.xy, normal.xy ) );
float dotp = dot( normal.rgb, -indata.toEye );
float lookup = dotp;
return tex2D( rainbowMap, float2( lookup, 0) ) * gloss * skyColor * 1.5;
}
%> }
}
/*
* Desaturate and tint with the stage color
* parameters array is: Amount to desaturate
*/
renderProgram sfx/desaturate {
program vertex arb { <%
OPTION ARB_position_invariant;
MOV result.texcoord[0], $texCoordAttrib;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
PARAM scale = {0.20, 0.11, 0.69, 1.0};
TEMP colorSource, R0;
TEX colorSource, fragment.texcoord[0], $map, 2D;
MOV R0.a, colorSource.a;
# greyscale factor
DP3 R0.rgb, colorSource, scale;
LRP R0.rgb, $parameters.x, colorSource, R0;
MUL result.color, $diffuseColor, R0;
%> }
}
/*
* Desaturate and do some extra color processing on the map
* parameters array is: Result Alpha, Exposure (just a color scale, can be > 1)
*/
renderProgram sfx/warroom_desat {
program vertex arb { <%
OPTION ARB_position_invariant ;
MOV result.texcoord[0], $texCoordAttrib;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
PARAM scale = {0.20, 0.11, 0.69, 1.0};
TEMP colorSource, R0;
TEX colorSource, fragment.texcoord[ 0 ], $map, 2D;
# greyscale factor
DP3 R0, colorSource, scale;
LRP colorSource, 0.5, colorSource, R0;
# exposure
MUL_SAT R0, $parameters.y, colorSource;
# colorize
MUL result.color.rgb, R0, $diffuseColor;
MOV result.color.a, $parameters.x;
%> }
}
/*
* A static surface with cubemap reflections
* parameters array is: Exponent power, brightness scale, base reflection
* + the enviroment is squared, giving a more plasticy look than the window glass one
* + there is no support for a mask all of the material is equally reflective
*/
renderProgram sfx/visor {
hwSkinningVersion sfx/visor_skinned sfx/visor_hardskinned
program vertex arb { <%
OPTION ARB_position_invariant;
TEMP R1, bitangent;
XPD bitangent, $normalAttrib, $tangentAttrib;
MUL bitangent, bitangent, $tangentAttrib.w;
# texture coords
DP4 result.texcoord[0].x, $texCoordAttrib, $diffuseMatrix_s;
DP4 result.texcoord[0].y, $texCoordAttrib, $diffuseMatrix_t;
# vector to eye
SUB R1, $positionAttrib, $viewOrigin;
DP3 result.texcoord[2].x, R1, $transposedModelMatrix_x;
DP3 result.texcoord[2].y, R1, $transposedModelMatrix_y;
DP3 result.texcoord[2].z, R1, $transposedModelMatrix_z;
# tangent->world matrix
DP3 result.texcoord[3].x, $tangentAttrib, $transposedModelMatrix_x;
DP3 result.texcoord[3].y, bitangent, $transposedModelMatrix_x;
DP3 result.texcoord[3].z, $normalAttrib, $transposedModelMatrix_x;
DP3 result.texcoord[4].x, $tangentAttrib, $transposedModelMatrix_y;
DP3 result.texcoord[4].y, bitangent, $transposedModelMatrix_y;
DP3 result.texcoord[4].z, $normalAttrib, $transposedModelMatrix_y;
DP3 result.texcoord[5].x, $tangentAttrib, $transposedModelMatrix_z;
DP3 result.texcoord[5].y, bitangent, $transposedModelMatrix_z;
DP3 result.texcoord[5].z, $normalAttrib, $transposedModelMatrix_z;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP R1, R2, R3, R4, eye, mix;
# get normal from normal map
TEX R1, fragment.texcoord[0], $bumpMap, 2D;
$if !r_dxnNormalMaps
MOV R1.x, R1.a;
$endif
MAD R2, R1, 2, -1;
$if r_normalizeNormalMaps
MOV R2.z, 0;
DP3 R1.x, R2,R2;
ADD R1.x, 1, -R1.x;
RSQ R1.x, R1.x;
RCP R2.z, R1.x;
$endif
# put in world space
DP3 R1.x, R2, fragment.texcoord[3];
DP3 R1.y, R2, fragment.texcoord[4];
DP3 R1.z, R2, fragment.texcoord[5];
# normalize to eye
DP3 eye.w, fragment.texcoord[2], fragment.texcoord[2];
RSQ eye.w, eye.w;
MUL eye, fragment.texcoord[2], eye.w;
# calc reflection vector: i - 2 * dot(i, n) * n
DP3 R2, eye, R1;
MUL R2, R2, 2;
MAD R4, -R1, R2.x, eye;
# reflect refract mixing (sorta fresnel)
DP3_SAT R1, -eye, R1;
SUB R1, 1, R1;
POW mix, R1.x, $parameters.x;
# lookup textures and interpolate
TEX R4, R4, $environmentCubeMap, CUBE;
MUL R4, R4, R4;
MUL result.color, R4, $parameters.y;
#MOV result.color, R4;
ADD mix.a, mix, $parameters.z;
MUL result.color.a, $diffuseColor.a, mix.a;
#MOV result.color.a, 1;
%> }
}
renderProgram sfx/visor_skinned {
program vertex arb { <%
TEMP R1, bitangent;
TEMP R0;
TEMP position;
TEMP normal;
TEMP tangent;
useTemplate skinningMatrix_ARB< "position", "normal", "tangent", "bitangent" >
XPD bitangent, $normalAttrib, $tangentAttrib;
MUL bitangent, bitangent, $tangentAttrib.w;
# texture coords
DP4 result.texcoord[0].x, $texCoordAttrib, $diffuseMatrix_s;
DP4 result.texcoord[0].y, $texCoordAttrib, $diffuseMatrix_t;
# vector to eye
SUB R1, position, $viewOrigin;
DP3 result.texcoord[2].x, R1, $transposedModelMatrix_x;
DP3 result.texcoord[2].y, R1, $transposedModelMatrix_y;
DP3 result.texcoord[2].z, R1, $transposedModelMatrix_z;
# tangent->world matrix
DP3 result.texcoord[3].x, tangent, $transposedModelMatrix_x;
DP3 result.texcoord[3].y, bitangent, $transposedModelMatrix_x;
DP3 result.texcoord[3].z, normal, $transposedModelMatrix_x;
DP3 result.texcoord[4].x, tangent, $transposedModelMatrix_y;
DP3 result.texcoord[4].y, bitangent, $transposedModelMatrix_y;
DP3 result.texcoord[4].z, normal, $transposedModelMatrix_y;
DP3 result.texcoord[5].x, tangent, $transposedModelMatrix_z;
DP3 result.texcoord[5].y, bitangent, $transposedModelMatrix_z;
DP3 result.texcoord[5].z, normal, $transposedModelMatrix_z;
%> }
program fragment reference sfx/visor
}
renderProgram sfx/visor_hardskinned {
program vertex arb { <%
TEMP R1, bitangent;
TEMP position;
TEMP normal;
TEMP tangent;
TEMP R0;
useTemplate hardSkinningMatrix_ARB< "position", "normal", "tangent", "bitangent" >
# texture coords
DP4 result.texcoord[0].x, $texCoordAttrib, $diffuseMatrix_s;
DP4 result.texcoord[0].y, $texCoordAttrib, $diffuseMatrix_t;
# vector to eye
SUB R1, position, $viewOrigin;
DP3 result.texcoord[2].x, R1, $transposedModelMatrix_x;
DP3 result.texcoord[2].y, R1, $transposedModelMatrix_y;
DP3 result.texcoord[2].z, R1, $transposedModelMatrix_z;
# tangent->world matrix
DP3 result.texcoord[3].x, tangent, $transposedModelMatrix_x;
DP3 result.texcoord[3].y, bitangent, $transposedModelMatrix_x;
DP3 result.texcoord[3].z, normal, $transposedModelMatrix_x;
DP3 result.texcoord[4].x, tangent, $transposedModelMatrix_y;
DP3 result.texcoord[4].y, bitangent, $transposedModelMatrix_y;
DP3 result.texcoord[4].z, normal, $transposedModelMatrix_y;
DP3 result.texcoord[5].x, tangent, $transposedModelMatrix_z;
DP3 result.texcoord[5].y, bitangent, $transposedModelMatrix_z;
DP3 result.texcoord[5].z, normal, $transposedModelMatrix_z;
%> }
program fragment reference sfx/visor
}
/*
* A static surface with cubemap reflections
* parameters array is: Exponent power, brightness scale, base reflection
*
* The "diffusemap" alpha is used as a mask that indicates where the glassy bits
* are in the material. The colors of the diffuse are NOT used
*/
renderProgram sfx/windowglass {
instanceVersion sfx/windowglass_instance
program vertex arb { <%
OPTION ARB_position_invariant;
TEMP R1, bitangent;
XPD bitangent, $normalAttrib, $tangentAttrib;
MUL bitangent, bitangent, $tangentAttrib.w;
# texture coords
MOV result.texcoord[0], $texCoordAttrib;
DP4 result.texcoord[0].x, $texCoordAttrib, $diffuseMatrix_s;
DP4 result.texcoord[0].y, $texCoordAttrib, $diffuseMatrix_t;
# vector to eye in worldspace
SUB R1, $positionAttrib, $viewOrigin;
DP3 result.texcoord[2].x, R1, $transposedModelMatrix_x;
DP3 result.texcoord[2].y, R1, $transposedModelMatrix_y;
DP3 result.texcoord[2].z, R1, $transposedModelMatrix_z;
# tangent->world matrix
DP3 result.texcoord[3].x, $tangentAttrib, $transposedModelMatrix_x;
DP3 result.texcoord[3].y, bitangent, $transposedModelMatrix_x;
DP3 result.texcoord[3].z, $normalAttrib, $transposedModelMatrix_x;
DP3 result.texcoord[4].x, $tangentAttrib, $transposedModelMatrix_y;
DP3 result.texcoord[4].y, bitangent, $transposedModelMatrix_y;
DP3 result.texcoord[4].z, $normalAttrib, $transposedModelMatrix_y;
DP3 result.texcoord[5].x, $tangentAttrib, $transposedModelMatrix_z;
DP3 result.texcoord[5].y, bitangent, $transposedModelMatrix_z;
DP3 result.texcoord[5].z, $normalAttrib, $transposedModelMatrix_z;
TEMP R0;
MAD R0, $colorAttrib, $colorModulate, $colorAdd;
MUL result.color, $diffuseColor, R0;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP R1, R2, R3, R4, eye, mix;
# get normal from normal map
TEX R1, fragment.texcoord[0], $bumpMap, 2D;
$if !r_dxnNormalMaps
MOV R1.x, R1.a;
$endif
MAD R2, R1, 2, -1;
$if r_normalizeNormalMaps
MOV R2.z, 0;
DP3 R1.x, R2,R2;
ADD R1.x, 1, -R1.x;
RSQ R1.x, R1.x;
RCP R2.z, R1.x;
$endif
# put in world space
DP3 R1.x, R2, fragment.texcoord[3];
DP3 R1.y, R2, fragment.texcoord[4];
DP3 R1.z, R2, fragment.texcoord[5];
# normalize to eye
DP3 eye.w, fragment.texcoord[2], fragment.texcoord[2];
RSQ eye.w, eye.w;
MUL eye, fragment.texcoord[2], eye.w;
# calc reflection vector: i - 2 * dot(i, n) * n
DP3 R2, eye, R1;
MUL R2, R2, 2;
MAD R4, -R1, R2.x, eye;
# reflect refract mixing (sorta fresnel)
DP3_SAT R1, -eye, R1;
SUB R1, 1, R1;
POW mix, R1.x, $parameters.x;
# lookup textures and interpolate
TEX R4, R4, $environmentCubeMap, CUBE;
TEX R2, fragment.texcoord[0], $diffuseMap, 2D;
TEMP col;
MUL col.rgb, R4, $parameters.y;
ADD mix, mix, $parameters.z;
MUL col.a, R2.a, mix;
MUL result.color, col, fragment.color;
%> }
}
renderProgram sfx/windowglass_instance {
program vertex arb { <%
TEMP R1, bitangent;
TEMP _pos;
TEMP _nrm;
TEMP _tan;
DP4 _pos.x, vertex.texcoord[5], $positionAttrib;
DP4 _pos.y, vertex.texcoord[6], $positionAttrib;
DP4 _pos.z, vertex.texcoord[7], $positionAttrib;
MOV _pos.w, $positionAttrib.w;
DP3 _nrm.x, vertex.texcoord[5], $normalAttrib;
DP3 _nrm.y, vertex.texcoord[6], $normalAttrib;
DP3 _nrm.z, vertex.texcoord[7], $normalAttrib;
DP3 _tan.x, vertex.texcoord[5], $tangentAttrib;
DP3 _tan.y, vertex.texcoord[6], $tangentAttrib;
DP3 _tan.z, vertex.texcoord[7], $tangentAttrib;
PARAM mvp[4] = { state.matrix.mvp };
OUTPUT oPos = result.position;
# Transform the vertex to clip coordinates.
DP4 oPos.x, mvp[0], _pos;
DP4 oPos.y, mvp[1], _pos;
DP4 oPos.z, mvp[2], _pos;
DP4 oPos.w, mvp[3], _pos;
XPD bitangent, _nrm, _tan;
MUL bitangent, bitangent, $tangentAttrib.w;
# texture coords
MOV result.texcoord[0], $texCoordAttrib;
DP4 result.texcoord[0].x, $texCoordAttrib, $diffuseMatrix_s;
DP4 result.texcoord[0].y, $texCoordAttrib, $diffuseMatrix_t;
# vector to eye in worldspace
SUB R1, _pos, $viewOrigin;
DP3 result.texcoord[2].x, R1, $transposedModelMatrix_x;
DP3 result.texcoord[2].y, R1, $transposedModelMatrix_y;
DP3 result.texcoord[2].z, R1, $transposedModelMatrix_z;
# tangent->world matrix
DP3 result.texcoord[3].x, _tan, $transposedModelMatrix_x;
DP3 result.texcoord[3].y, bitangent, $transposedModelMatrix_x;
DP3 result.texcoord[3].z, _nrm, $transposedModelMatrix_x;
DP3 result.texcoord[4].x, _tan, $transposedModelMatrix_y;
DP3 result.texcoord[4].y, bitangent, $transposedModelMatrix_y;
DP3 result.texcoord[4].z, _nrm, $transposedModelMatrix_y;
DP3 result.texcoord[5].x, _tan, $transposedModelMatrix_z;
DP3 result.texcoord[5].y, bitangent, $transposedModelMatrix_z;
DP3 result.texcoord[5].z, _nrm, $transposedModelMatrix_z;
TEMP R0;
MAD R0, $colorAttrib, $colorModulate, $colorAdd;
MUL result.color, $diffuseColor, R0;
%> }
program fragment reference sfx/windowglass
}
/*
* A static surface with cubemap reflections
* parameters array is: Exponent power, brightness scale, base reflection
*
* The "mask" red is used as a mask that indicates where the glassy bits
* are in the material.
*/
renderProgram sfx/windowglass_mask {
instanceVersion sfx/windowglass_mask_instance
program vertex reference sfx/windowglass
state {
depthFunc less
}
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP R1, R2, R3, R4, eye, mix;
# get normal from normal map
TEX R1, fragment.texcoord[0], $bumpMap, 2D;
$if !r_dxnNormalMaps
MOV R1.x, R1.a;
$endif
MAD R2, R1, 2, -1;
$if r_normalizeNormalMaps
MOV R2.z, 0;
DP3 R1.x, R2,R2;
ADD R1.x, 1, -R1.x;
RSQ R1.x, R1.x;
RCP R2.z, R1.x;
$endif
# put in world space
DP3 R1.x, R2, fragment.texcoord[3];
DP3 R1.y, R2, fragment.texcoord[4];
DP3 R1.z, R2, fragment.texcoord[5];
# normalize to eye
DP3 eye.w, fragment.texcoord[2], fragment.texcoord[2];
RSQ eye.w, eye.w;
MUL eye, fragment.texcoord[2], eye.w;
# calc reflection vector: i - 2 * dot(i, n) * n
DP3 R2, eye, R1;
MUL R2, R2, 2;
MAD R4, -R1, R2.x, eye;
# reflect refract mixing (sorta fresnel)
DP3_SAT R1, -eye, R1;
SUB R1, 1, R1;
POW mix, R1.x, $parameters.x;
# lookup textures and interpolate
TEX R4, R4, $environmentCubeMap, CUBE;
TEX R2, fragment.texcoord[0], $mask, 2D;
MUL result.color.rgb, R4, $parameters.y;
ADD mix, mix, $parameters.z;
MUL result.color.a, R2.x, mix;
##MOV result.color, R2.x;
##MOV result.color.a, 1;
%> }
}
renderProgram sfx/windowglass_mask_instance {
state {
depthFunc less
}
program vertex reference sfx/windowglass_instance
program fragment reference sfx/windowglass_mask
}
/*
* This is a replacement for the old "cubeMap" and "texgen reflect" materials
* per-pixel cubic reflextion map calculation
*/
renderProgram sfx/cubemap {
hwSkinningVersion sfx/cubeMapSkinningMatrix sfx/cubeMapHardSkinningMatrix
program vertex arb { <%
OPTION ARB_position_invariant;
TEMP R0;
MOV result.texcoord[0], $normalAttrib;
SUB result.texcoord[1], $viewOrigin, $positionAttrib;
#support vertex colors and shader red,green,blue keywords
MAD R0, $colorAttrib, $colorModulate, $colorAdd;
MUL result.color, R0, $diffuseColor;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP toEye, normal, R0;
PARAM scaleTwo = { 2, 2, 2, 2 };
# normalize surface normal
DP3 R0, fragment.texcoord[0], fragment.texcoord[0];
RSQ R0, R0.x;
MUL normal, fragment.texcoord[0], R0;
# normalize vector to eye
DP3 R0, fragment.texcoord[1], fragment.texcoord[1];
RSQ R0, R0.x;
MUL toEye, fragment.texcoord[1], R0;
# calculate reflection vector
DP3 R0, toEye, normal;
MUL R0, R0, normal;
MAD R0, R0, scaleTwo, -toEye;
TEX R0, R0, $environmentCubeMap, CUBE;
MUL result.color, R0, fragment.color;
%> }
}
renderProgram sfx/cubeMapSkinningMatrix {
program vertex arb { <%
TEMP position, normal;
TEMP R0;
useTemplate skinningMatrix_ARB< "position", "normal" >
MOV result.texcoord[0], normal;
SUB result.texcoord[1], $viewOrigin, position;
#support vertex colors and shader red,green,blue keywords
MAD R0, $colorAttrib, $colorModulate, $colorAdd;
MUL result.color, R0, $diffuseColor;
%> }
program fragment reference sfx/cubemap
}
renderProgram sfx/cubeMapHardSkinningMatrix {
program vertex arb { <%
TEMP position, normal;
TEMP R0;
useTemplate hardSkinningMatrix_ARB< "position", "normal" >
MOV result.texcoord[0], normal;
SUB result.texcoord[1], $viewOrigin, position;
#support vertex colors and shader red,green,blue keywords
MAD R0, $colorAttrib, $colorModulate, $colorAdd;
MUL result.color, R0, $diffuseColor;
%> }
program fragment reference sfx/cubemap
}
/*
* Normal mapped smoke
*/
renderProgram sfx/litsmoke {
program vertex cg { <%
$include "litsmoke.hg"
%> }
program fragment cg { <%
$include "litsmoke.hg"
%> }
}
/*
* Normal mapped smoke with one dynamic light source
*/
renderProgram sfx/litsmoke_1 {
program vertex cg { <%
#define LIGHT_1
$include "litsmoke.hg"
%> }
program fragment cg { <%
#define LIGHT_1
$include "litsmoke.hg"
%> }
}
/*
* Normal mapped smoke trail
* parameters array is: Scroll Factor
*/
renderProgram sfx/littrail {
program vertex cg { <%
#define TRAIL
$include "litsmoke.hg"
%> }
program fragment cg { <%
#define TRAIL
$include "litsmoke.hg"
%> }
}
/*
* Deploy wireframe effect
*/
renderProgram sfx/deploy {
program vertex cg { <%
struct VsInputs {
float3 pos : $positionAttrib;
float2 tex : $texCoordAttrib;
float4 tang : $tangentAttrib;
float3 norm : $normalAttrib;
float4 color : $colorAttrib;
};
struct VsOutputs {
float3 pos : TEXCOORD2;
};
VsOutputs vertex(VsInputs indata) {
VsOutputs outData;
outData.pos = indata.pos;
return outData;
}
%> }
program fragment cg { <%
struct VsOutputs {
float3 pos : TEXCOORD2;
};
uniform float4 color : $diffuseColor; //Fragment
sampler2D texture : $map;
float pattern( float3 pos, float freq) {
pos = pos*freq;
float a = tex2D( texture , pos.xy ).r;
a *= tex2D( texture , float2( 0.5, pos.z ) ).r;
a = 1-a;
return 0.1 + a;
}
float4 fragment(VsOutputs indata) : COLOR {
return color * pattern( indata.pos + 1.46, 0.058 );
}
%> }
}
renderProgram sfx/horizon {
program vertex cg { <%
struct VsInputs {
float3 pos : $positionAttrib;
float2 tex : $texCoordAttrib;
float4 tang : $tangentAttrib;
float3 norm : $normalAttrib;
float4 color: COLOR0;
$if r_32ByteVtx
float4 signs : $signAttrib;
$endif
};
struct VsOutputs {
float2 tex : TEXCOORD0;
float3 toLight : TEXCOORD1;
float3 tang : TEXCOORD2;
float3 bino : TEXCOORD3;
float3 norm : TEXCOORD4;
float4 color : COLOR0;
};
uniform float3 toSun : $sunDirection;
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 *= 1.f/4096.f;
indata.norm.xy *= 1.f / 32767.f;
indata.tang.xy *= 1.f / 32767.f;
indata.norm.z = GetZ( indata.norm.xy, indata.signs.x );
indata.tang.z = GetZ( indata.tang.xy, indata.signs.y );
indata.tang.w = ( indata.signs.z - 1.f );
$endif
outData.tex = indata.tex;
float3 tangent = indata.tang.xyz;
float3 biTangent = cross( indata.norm, tangent ) * indata.tang.w;
outData.toLight.x = dot( tangent, toSun );
outData.toLight.y = dot( biTangent, toSun );
outData.toLight.z = dot( indata.norm, toSun );
//Transpose for ambient cubemap lookup
outData.tang.x = tangent.x;
outData.tang.y = biTangent.x;
outData.tang.z = indata.norm.x;
outData.bino.x = tangent.y;
outData.bino.y = biTangent.y;
outData.bino.z = indata.norm.y;
outData.norm.x = tangent.z;
outData.norm.y = biTangent.z;
outData.norm.z = indata.norm.z;
return outData;
}
%> }
program fragment cg { <%
struct VsOutputs {
float2 tex : TEXCOORD0;
float3 toLight : TEXCOORD1;
float3 tang : TEXCOORD2;
float3 bino : TEXCOORD3;
float3 norm : TEXCOORD4;
float4 color : COLOR0;
};
sampler2D diffuseMap : $diffuseMap;
sampler2D normalMap : $bumpMap;
samplerCUBE ambientCubemap : $ambientCubeMap;
uniform float ambientBrightness : $ambientBrightness;
uniform float4 sunColor : $sunColor;
float4 fragment(VsOutputs indata) : COLOR {
// Load diffuse
float4 diffuse = tex2D( diffuseMap, indata.tex );
if( diffuse.a < 0.5f ) discard;
// Decode normal
float4 normal = tex2D( normalMap, indata.tex ) * 2.0f - 1.0f;
normal.x = normal.w;
normal.z = sqrt( 1.f - dot( normal.xy, normal.xy ) );
// Sunlight
float3 sunLight = max( dot( normal.xyz, indata.toLight ), 0) * sunColor.rgb;
// Ambient
float3 localNormal;
localNormal.x = dot( normal.xyz, indata.tang );
localNormal.y = dot( normal.xyz, indata.bino );
localNormal.z = dot( normal.xyz, indata.norm );
float3 ambLight = texCUBE( ambientCubemap, localNormal ).rgb * ambientBrightness;
// Result
return float4( diffuse.rgb * ( sunLight + ambLight ), diffuse.a );
}
%> }
}
/*
* The glowing edge of fading out objects
* parameters array is: Alpha test threshold, Edge thickness scale ( higher values mean thinner edges)
*/
renderProgram sfx/fadeedge {
hwSkinningVersion sfx/fadeedgeSkinningMatrix sfx/fadeedgeHardSkinningMatrix
state {
blend blend
depthFunc less
}
program vertex arb { <%
OPTION ARB_position_invariant;
MOV result.color, $colorAttrib;
DP4 result.texcoord[0].x, $texCoordAttrib, $maskMatrix_s;
DP4 result.texcoord[0].y, $texCoordAttrib, $maskMatrix_t;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP R0, R1, mask;
# lookup mask texture
TEX mask, fragment.texcoord[0], $mask, 2D;
SUB R1, mask.a, $parameters.x;
#MUL R1, -1, R1;
#KIL R1;
ABS R1, R1;
MUL_SAT R1, $parameters.y, R1;
SUB R1, 1, R1;
#MUL mask, R1, mask;
SUB R0, R1, 0.05;
KIL R0;
#MUL R1.x, 0.5, R1;
TEX result.color, R1.x, $map, 2D;
#MOV result.color, mask;
MOV result.color.a, R1.a;
#MOV result.color.gb, 0;
%> }
}
renderProgram sfx/fadeedgeSkinningMatrix {
program vertex arb { <%
TEMP position;
useTemplate skinningMatrix_ARB< "position" >
MOV result.color, $colorAttrib;
DP4 result.texcoord[0].x, $texCoordAttrib, $maskMatrix_s;
DP4 result.texcoord[0].y, $texCoordAttrib, $maskMatrix_t;
%> }
program fragment reference sfx/fadeedge
}
renderProgram sfx/fadeedgeHardSkinningMatrix {
program vertex arb { <%
TEMP position;
useTemplate hardSkinningMatrix_ARB< "position" >
MOV result.color, $colorAttrib;
DP4 result.texcoord[0].x, $texCoordAttrib, $maskMatrix_s;
DP4 result.texcoord[0].y, $texCoordAttrib, $maskMatrix_t;
%> }
program fragment reference sfx/fadeedge
}
/**
Generic strogg force field shader
Diffuse Matrix: Scales the noise frequency
parameters: The time (for the noise animation)
Mask Texture: The density of the force field, centered around 128, so 0 is take away force field, 1 is full force field
Mask Matrix: Affects the density texture coordinates
parameters2: Noise scale for the density texture, some of the noise will be added to the density texture coordinates
*/
renderProgram sfx/stroggForceField {
hwSkinningVersion sfx/stroggForceFieldSkinningMatrix sfx/stroggForceFieldHardSkinningMatrix
program vertex arb { <%
OPTION ARB_position_invariant;
TEMP R1;
DP4 result.texcoord[1].x, $texCoordAttrib, $diffuseMatrix_s;
DP4 result.texcoord[1].y, $texCoordAttrib, $diffuseMatrix_t;
MOV result.texcoord[1].z, $parameters.x;
DP4 result.texcoord[0].x, $texCoordAttrib, $maskMatrix_s;
DP4 result.texcoord[0].y, $texCoordAttrib, $maskMatrix_t;
MAD R1, $colorAttrib, $colorModulate, $colorAdd;
MUL R1, R1, $diffuseColor;
SUB R1, 1, R1;
ADD result.color, R1, R1;
MOV result.color.w, $colorAttrib;
MAD R1, $colorAttrib, $colorModulate, $colorAdd;
MUL result.color.w, $diffuseColor, R1;
TEMP _F1, _F2;
SUB _F2, $positionAttrib, $viewOrigin;
DP3 _F1.x, _F2, _F2;
RSQ _F1.y, _F1.x;
MUL _F1.x, _F1.y, _F1.x;
MUL _F2.x, $fogDepths.z, 0.5;
MAD result.color.secondary, _F1.x, _F2.x, $fogDepths.w;
%> }
program fragment cg { <%
$include "noise.hg"
struct VsOutputs {
float2 tex : TEXCOORD0;
float3 noisePos : TEXCOORD1;
float4 color : COLOR0;
float4 color1 : COLOR1;
};
sampler2D rainbowMap : $map;
sampler2D refreshMap : $mask;
sampler2D diffuseMap : $diffuseMap;
uniform float2 noiseScale : $parameters2;
float4 fragment( VsOutputs indata ) : COLOR {
// Do a traditional perlin noise lookup
float noise = perlin( indata.noisePos );
// Make bands in this noise (marble style)
float bands = tex2D( rainbowMap, float2( noise, 0 ) ).x;
// The refresh map is where the field is "fresh" or "old" it allows the field to be nonuniform this is a "signed" texture (+1 is fresh -1 is old )
float refresh = tex2D( refreshMap, indata.tex + noise * noiseScale ).x * 2 - 1;
bands += refresh;
// The vertex color takes away density so we can fade it
bands -= indata.color.x;
// Map the grayscale "field density" value to a nice color gradient
return tex2D( diffuseMap, float2( bands, 0 ) ) * indata.color.a * (1-(indata.color1.r*indata.color1.r));
}
%> }
}
renderProgram sfx/stroggForceFieldSkinningMatrix {
program vertex arb { <%
TEMP position;
TEMP R1;
useTemplate skinningMatrix_ARB< "position" >
DP4 result.texcoord[1].x, $texCoordAttrib, $diffuseMatrix_s;
DP4 result.texcoord[1].y, $texCoordAttrib, $diffuseMatrix_t;
MOV result.texcoord[1].z, $parameters.x;
DP4 result.texcoord[0].x, $texCoordAttrib, $maskMatrix_s;
DP4 result.texcoord[0].y, $texCoordAttrib, $maskMatrix_t;
MAD R1, $colorAttrib, $colorModulate, $colorAdd;
MUL R1, R1, $diffuseColor;
SUB R1, 1, R1;
ADD result.color, R1, R1;
MAD R1, $colorAttrib, $colorModulate, $colorAdd;
MUL result.color.w, $diffuseColor, R1;
%> }
program fragment reference sfx/stroggForceField
}
renderProgram sfx/stroggForceFieldHardSkinningMatrix {
program vertex arb { <%
TEMP position;
TEMP R1;
useTemplate hardSkinningMatrix_ARB< "position" >
DP4 result.texcoord[1].x, $texCoordAttrib, $diffuseMatrix_s;
DP4 result.texcoord[1].y, $texCoordAttrib, $diffuseMatrix_t;
MOV result.texcoord[1].z, $parameters.x;
DP4 result.texcoord[0].x, $texCoordAttrib, $maskMatrix_s;
DP4 result.texcoord[0].y, $texCoordAttrib, $maskMatrix_t;
MAD R1, $colorAttrib, $colorModulate, $colorAdd;
MUL R1, R1, $diffuseColor;
SUB R1, 1, R1;
ADD result.color, R1, R1;
MAD R1, $colorAttrib, $colorModulate, $colorAdd;
MUL result.color.w, $diffuseColor, R1;
%> }
program fragment reference sfx/stroggForceField
}
renderProgram sfx/stroggForceFieldLarge {
program vertex cg { <%
struct VsInputs {
float3 pos : $positionAttrib;
float4 tex : $texCoordAttrib;
float4 color : $colorAttrib;
float3 normal: $normalAttrib;
$if r_32ByteVtx
float4 signs : $signAttrib;
$endif
};
struct VsOutputs {
float2 tex : TEXCOORD0;
float3 noisePos : TEXCOORD1;
float4 color : TEXCOORD2; // may go over 1
};
uniform float4 matrixS : $diffuseMatrix_s;
uniform float4 matrixT : $diffuseMatrix_t;
uniform float4 matrix2S : $maskMatrix_s;
uniform float4 matrix2T : $maskMatrix_t;
uniform float3 time : $parameters;
uniform float4 colorModulate : $colorModulate;
uniform float4 colorAdd : $colorAdd;
uniform float3 eyePos : $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.normal.xy *= 1.f / 32767.f;
indata.normal.z = GetZ( indata.normal.xy, indata.signs.x );
$endif
outData.noisePos.x = dot( indata.tex, matrixS );
outData.noisePos.y = dot( indata.tex, matrixT );
outData.noisePos.z = time.x;
outData.tex.x = dot( indata.tex, matrix2S );
outData.tex.y = dot( indata.tex, matrix2T );
//float4 color = indata.color * colorModulate + colorAdd;
//outData.color = 1.0f - color; //works substractive so flip it here
//outData.color *= 2;
float3 toEye = indata.pos - eyePos;
float color = pow( 1.0f - abs( dot ( indata.normal, normalize( toEye ) ) ), 8.0f );
outData.color = color; //works substractive so flip it here
//outData.color *= 2;
return outData;
}
%> }
program fragment cg { <%
$include "noise.hg"
struct VsOutputs {
float2 tex : TEXCOORD0;
float3 noisePos : TEXCOORD1;
float4 color : TEXCOORD2;
};
sampler2D rainbowMap : $map;
sampler2D refreshMap : $mask;
sampler2D diffuseMap : $diffuseMap;
uniform float2 noiseScale : $parameters2;
float4 fragment( VsOutputs indata ) : COLOR {
// Do a traditional perlin noise lookup
float noise = perlin( indata.noisePos );
// Make bands in this noise (marble style)
float bands = tex2D( rainbowMap, float2( noise, 0 ) ).x;
// The refresh map is where the field is "fresh" or "old" it allows the field to be nonuniform this is a "signed" texture (+1 is fresh -1 is old )
//float refresh = tex2D( refreshMap, indata.tex + noise * noiseScale ).x * 2 - 1;
//bands += refresh;
// The vertex color takes away density so we can fade it
//bands -= indata.color.x;
// Map the grayscale "field density" value to a nice color gradient
bands *= indata.color.x;
return tex2D( diffuseMap, float2( bands, 0 ) );
}
%> }
}
renderProgram sfx/slipgate {
program vertex cg { <%
struct VsInputs {
float3 pos : $positionAttrib;
float2 tex : $texCoordAttrib;
float4 color : $colorAttrib;
};
struct VsOutputs {
float2 tex : TEXCOORD0;
};
VsOutputs vertex( VsInputs indata ) {
VsOutputs outData;
$if r_32ByteVtx
indata.tex *= 1.f/4096.f;
$endif
outData.tex = indata.tex;
return outData;
}
%> }
program fragment cg { <%
struct VsOutputs {
float2 tex : TEXCOORD0;
};
sampler2D starMap : $map;
sampler2D diffuseMap : $diffuseMap;
sampler2D rainbowMap : $mask;
float4 diffuseColor : $diffuseColor;
float time : $parameters;
$include "noise.hg"
float4 fragment( VsOutputs indata ) : COLOR {
float2 center = indata.tex - float2( 0.5, 0.5 );
float len = length( center );
float2 dir = center * ( 1.0f / len );
float angle = atan2( center.y, center.x ) / 3.14159265;
float2 texCoord;
texCoord.y = ( (1.0f / len ) - time * 0.3 ) * 0.5;
texCoord.x = (angle + time * 0.002 * ( len * 10 ) );
float4 color = tex2D( starMap, texCoord );
color.a = (1.0f - (len * 2) * (len * 2) * (len * 2)) * color.r + (1.0f - (len * 2));//color.r + 0.5 * ( 0.5f - len );
color.rgb += (1.0f - (len * 2)) * 0.5; //Make centre brighter
return color * diffuseColor;
}
%> }
}
// Works as a normal tivial shader except that the vertex color alpha is used to fade to white
// giving the proper meaning of alpha as "disappearing when zero"
renderProgram sfx/blendFilterFade {
program vertex cg { <%
struct VsInputs {
float3 pos : POSITION;
float4 tex : $texCoordAttrib;
float4 col : $colorAttrib;
};
struct VsOutputs {
float4 col : COLOR0;
float2 tex : TEXCOORD0;
};
float4 diffuse_s : $diffuseMatrix_s;
float4 diffuse_t : $diffuseMatrix_t;
VsOutputs vertex(VsInputs indata) {
VsOutputs outdata;
$if r_32ByteVtx
indata.tex.xy *= 1.f/4096.f;
indata.tex.zw = 1.f;
$endif
outdata.tex.x = dot( indata.tex, diffuse_s);
outdata.tex.y = dot( indata.tex, diffuse_t );
outdata.col = indata.col;
return outdata;
}
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP R0, R1;
TEX R1, fragment.texcoord, $map, 2D;
SUB R0, R1, 1;
MAD result.color, R0, fragment.color.a, 1;
%> }
}
// Works as a normal tivial shader except that the vertex color alpha is used to fade to 0.5,0.5,0.5
// giving the proper meaning of alpha as "disappearing when zero"
renderProgram sfx/blendDecalBlendFade {
hwSkinningVersion sfx/blendDecalBlendFade_HardSkin sfx/blendDecalBlendFade_HardSkin
program vertex cg { <%
struct VsInputs {
float3 pos : POSITION;
float4 tex : $texCoordAttrib;
float4 col : $colorAttrib;
float4 tangent: $tangentAttrib;
$if r_32ByteVtx
float4 signs : $signAttrib;
$endif
};
struct VsOutputs {
float4 col : COLOR0;
float2 tex : TEXCOORD0;
};
float4 diffuse_s : $diffuseMatrix_s;
float4 diffuse_t : $diffuseMatrix_t;
float3 timeParms : $parameters; // Current time, 1 / length of time to fade
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;
// I feel dirty
indata.tangent.w = indata.tangent.x * 32767 + indata.tangent.y;
$endif
outdata.tex.x = dot( indata.tex, diffuse_s);
outdata.tex.y = dot( indata.tex, diffuse_t );
outdata.col = indata.col;
// Tangent .w has the time of death, timeParms.x has current time, normalize the time delta
// if the delta is larger than time to fade we use full opacity (i.e. alpha gets clamped to 1)
outdata.col.a = (indata.tangent.w - timeParms.x) * timeParms.y;
return outdata;
}
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP R0, R1;
TEX R1, fragment.texcoord, $map, 2D;
MOV result.color.xyz, R1;
MUL result.color.w, R1, fragment.color.a;
%> }
}
renderProgram sfx/blendDecalBlendFade_HardSkin {
program vertex arb userDecompress { <%
TEMP pos;
PARAM _joints[213] = { program.env[32..244] }; # 74 joints
PARAM _mvp[4] = { state.matrix.mvp };
ADDRESS _A0;
TEMP _R0, _R1, _R2;
TEMP _tex;
MOV _tex.zw, $texCoordAttrib;
$if r_32ByteVtx
MUL _tex.xy, $texCoordAttrib, 0.000244140625;
$else
MUL _tex.xy, $texCoordAttrib, 1;
$endif
# accumulate weighted joint matrices
$if r_32ByteVtx
ARL _A0.x, $signAttrib.w;
$else
ARL _A0.x, $tangentAttrib.x;
$endif
MOV _R0, _joints[_A0.x+0];
MOV _R1, _joints[_A0.x+1];
MOV _R2, _joints[_A0.x+2];
# transform vertex
DP4 pos.x, _R0, $positionAttrib;
DP4 pos.y, _R1, $positionAttrib;
DP4 pos.z, _R2, $positionAttrib;
MOV pos.w, 1;
DP4 result.position.x, _mvp[0], pos;
DP4 result.position.y, _mvp[1], pos;
DP4 result.position.z, _mvp[2], pos;
DP4 result.position.w, _mvp[3], pos;
DP4 result.texcoord.x, _tex, $diffuseMatrix_s;
DP4 result.texcoord.y, _tex, $diffuseMatrix_t;
MOV result.color, $colorAttrib;
TEMP R0;
$if r_32ByteVtx
MAD R0.x, $tangentAttrib.x, 32767, $tangentAttrib.y;
$else
MOV R0.x, $tangentAttrib.w;
$endif
SUB R0.x, R0.x, $parameters;
MUL result.color.w, R0.x, $parameters.y;
%> }
program fragment reference sfx/blendDecalBlendFade
}
renderProgram sfx/maskedInvert {
program vertex reference trivialWithTextureMatrix
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP R0;
TEX R0, fragment.texcoord, $map, 2D;
MUL R0, R0, fragment.color;
SUB result.color.a, 1, R0.a;
MOV result.color.xyz, R0.a;
%> }
}
renderProgram sfx/beam {
program vertex cg { <%
struct VsInputs {
float3 pos : $positionAttrib;
float2 tex : $texCoordAttrib;
};
struct VsOutputs {
float2 tex : TEXCOORD0;
float1 toEye : TEXCOORD1;
};
uniform float3 viewOrigin : $viewOrigin;
VsOutputs vertex( VsInputs indata ) {
VsOutputs outData;
$if r_32ByteVtx
indata.tex *= 1.f/4096.f;
$endif
float3 toEye = indata.pos - viewOrigin;
outData.toEye = sqrt( dot( toEye, toEye ) );
outData.tex = indata.tex;
return outData;
}
%> }
program fragment cg { <%
struct VsOutputs {
float2 tex : TEXCOORD0;
float toEye : TEXCOORD1;
};
sampler2D baseMap : $map;
uniform float4 parameters : $parameters;
float4 fragment( VsOutputs indata ) : COLOR {
float4 base = tex2D( baseMap, indata.tex );
float distance = saturate( (indata.toEye - parameters.x) / parameters.y );
base *= distance;
base.xyz *= parameters.z;
base.w *= parameters.w;
return base;
}
%> }
}
renderProgram sfx/displace {
program vertex arb { <%
TEMP R0;
TEMP _pos;
MAD _pos.xyz, $normalAttrib, $parameters.x, $positionAttrib;
MOV _pos.w, $positionAttrib.w;
PARAM mvp[4] = { state.matrix.mvp };
OUTPUT oPos = result.position;
# Transform the vertex to clip coordinates.
DP4 oPos.x, mvp[0], _pos;
DP4 oPos.y, mvp[1], _pos;
DP4 oPos.z, mvp[2], _pos;
DP4 oPos.w, mvp[3], _pos;
DP4 result.texcoord.x, $texCoordAttrib, $diffuseMatrix_s;
DP4 result.texcoord.y, $texCoordAttrib, $diffuseMatrix_t;
MAD R0, $colorAttrib, $colorModulate, $colorAdd;
MUL result.color, $diffuseColor, R0;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP R0;
TEX R0, fragment.texcoord, $map, 2D;
MUL result.color, R0, fragment.color;
%> }
}