etqw-sdk/base/renderprogs/heathaze.rprog

411 lines
11 KiB
Text
Raw Permalink Normal View History

2008-05-29 00:00:00 +00:00
renderBinding deformScroll { vector { 0 } }
renderBinding deformMagnitude { vector { 1 } }
renderProgram heatHaze {
state {
maskAlpha
}
program vertex arb { <%
OPTION ARB_position_invariant;
TEMP R0, R1, R2;
TEMP TC;
DP4 TC.x, $texCoordAttrib, $diffuseMatrix_s;
DP4 TC.y, $texCoordAttrib, $diffuseMatrix_t;
# texture 1 takes the texture coordinates and adds a scroll
ADD result.texcoord[1], TC, $deformScroll;
# texture 2 takes the deform magnitude and scales it by the projection distance
PARAM vec = { 1, 0, 0, 1 };
MOV R0, vec;
DP4 R0.z, $positionAttrib, state.matrix.modelview.row[2];
DP4 R1, R0, state.matrix.projection.row[0];
DP4 R2, R0, state.matrix.projection.row[3];
# don't let the recip get near zero for polygons that cross the view plane
MAX R2, R2, 1;
RCP R2, R2.w;
MUL R1, R1, R2;
# clamp the distance so the the deformations don't get too wacky near the view
MIN R1, R1, 0.02;
MUL result.texcoord[2], R1, $deformMagnitude;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP localNormal, R0;
PARAM subOne = { -1, -1, -1, -1 };
PARAM scaleTwo = { 2, 2, 2, 2 };
# load the filtered normal map and convert to -1 to 1 range
TEX localNormal, fragment.texcoord[1], $bumpMap, 2D;
$if !r_dxnNormalMaps
MOV localNormal.x, localNormal.a;
$endif
MAD localNormal, localNormal, scaleTwo, subOne;
$if r_normalizeNormalMaps
MOV localNormal.z, 0;
DP3 R0.x, localNormal,localNormal;
ADD R0.x, 1, -R0.x;
RSQ R0.x, R0.x;
RCP localNormal.z, R0.x;
$endif
# calculate the screen texcoord in the 0.0 to 1.0 range
MUL R0, fragment.position, $currentRenderTexelSize.zwzw;
# offset by the scaled localNormal and clamp it to 0.0 - 1.0
MAD_SAT R0, localNormal, fragment.texcoord[2], R0;
# scale by the screen adjust
MUL R0, R0, $currentRenderTexelSize.xyzy;
# load the screen render
TEX result.color.xyz, R0, $currentRender, RECT;
%> }
}
renderProgram heatHazeWithVertex {
state {
maskAlpha
}
program vertex arb { <%
OPTION ARB_position_invariant;
TEMP R0, R1, R2;
TEMP TC;
DP4 TC.x, $texCoordAttrib, $diffuseMatrix_s;
DP4 TC.y, $texCoordAttrib, $diffuseMatrix_t;
# texture 1 takes the texture coordinates and adds a scroll
ADD result.texcoord[1], TC, $deformScroll;
# texture 2 takes the deform magnitude and scales it by the projection distance
PARAM vec = { 1, 0, 0, 1 };
MOV R0, vec;
DP4 R0.z, $positionAttrib, state.matrix.modelview.row[2];
DP4 R1, R0, state.matrix.projection.row[0];
DP4 R2, R0, state.matrix.projection.row[3];
# don't let the recip get near zero for polygons that cross the view plane
MAX R2, R2, 1;
RCP R2, R2.w;
MUL R1, R1, R2;
# clamp the distance so the the deformations don't get too wacky near the view
MIN R1, R1, 0.02;
MUL result.texcoord[2], R1, $deformMagnitude;
MOV result.color, $colorAttrib;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP localNormal, mask, R0;
PARAM subOne = { -1, -1, -1, -1 };
PARAM scaleTwo = { 2, 2, 2, 2 };
# kill the pixel if the distortion wound up being very small
SUB mask.xy, fragment.color, 0.01;
MOV mask.zw, 0;
KIL mask;
# load the filtered normal map and convert to -1 to 1 range
TEX localNormal, fragment.texcoord[1], $bumpMap, 2D;
$if !r_dxnNormalMaps
MOV localNormal.x, localNormal.a;
$endif
MAD localNormal, localNormal, scaleTwo, subOne;
$if r_normalizeNormalMaps
MOV localNormal.z, 0;
DP3 R0.x, localNormal,localNormal;
ADD R0.x, 1, -R0.x;
RSQ R0.x, R0.x;
RCP localNormal.z, R0.x;
$endif
MUL localNormal, localNormal, mask;
# calculate the screen texcoord in the 0.0 to 1.0 range
MUL R0, fragment.position, $currentRenderTexelSize.zwzw;
# offset by the scaled localNormal and clamp it to 0.0 - 1.0
MAD_SAT R0, localNormal, fragment.texcoord[2], R0;
# scale by the screen adjust
MUL R0, R0, $currentRenderTexelSize.xyzy;
# load the screen render
TEX result.color.xyz, R0, $currentRender, RECT;
%> }
}
renderProgram heatHazeWithMask {
state {
maskAlpha
}
program vertex arb { <%
OPTION ARB_position_invariant;
TEMP R0, R1, R2;
TEMP TC;
DP4 TC.x, $texCoordAttrib, $diffuseMatrix_s;
DP4 TC.y, $texCoordAttrib, $diffuseMatrix_t;
MOV result.texcoord[0], TC;
# texture 1 takes the texture coordinates and adds a scroll
ADD result.texcoord[1], TC, $deformScroll;
# texture 2 takes the deform magnitude and scales it by the projection distance
PARAM vec = { 1, 0, 0, 1 };
MOV R0, vec;
DP4 R0.z, $positionAttrib, state.matrix.modelview.row[2];
DP4 R1, R0, state.matrix.projection.row[0];
DP4 R2, R0, state.matrix.projection.row[3];
# don't let the recip get near zero for polygons that cross the view plane
MAX R2, R2, 1;
RCP R2, R2.w;
MUL R1, R1, R2;
# clamp the distance so the the deformations don't get too wacky near the view
MIN R1, R1, 0.02;
MUL result.texcoord[2], R1, $deformMagnitude;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP localNormal, mask, R0;
PARAM subOne = { -1, -1, -1, -1 };
PARAM scaleTwo = { 2, 2, 2, 2 };
# load the distortion map
TEX mask, fragment.texcoord[0], $mask, 2D;
# kill the pixel if the distortion wound up being very small
SUB mask.xy, mask, 0.01;
MOV mask.zw, 0;
KIL mask;
# load the filtered normal map and convert to -1 to 1 range
TEX localNormal, fragment.texcoord[1], $bumpMap, 2D;
$if !r_dxnNormalMaps
MOV localNormal.x, localNormal.a;
$endif
MAD localNormal, localNormal, scaleTwo, subOne;
$if r_normalizeNormalMaps
MOV localNormal.z, 0;
DP3 R0.x, localNormal,localNormal;
ADD R0.x, 1, -R0.x;
RSQ R0.x, R0.x;
RCP localNormal.z, R0.x;
$endif
MUL localNormal, localNormal, mask;
# calculate the screen texcoord in the 0.0 to 1.0 range
MUL R0, fragment.position, $currentRenderTexelSize.zwzw;
# offset by the scaled localNormal and clamp it to 0.0 - 1.0
MAD_SAT R0, localNormal, fragment.texcoord[2], R0;
# scale by the screen adjust
MUL R0, R0, $currentRenderTexelSize.xyxy;
# load the screen render
TEX result.color.xyz, R0, $currentRender, RECT;
%> }
}
renderProgram heatHazeWithMaskAndVertex {
state {
maskAlpha
}
program vertex arb { <%
OPTION ARB_position_invariant;
TEMP R0, R1, R2;
TEMP TC;
DP4 TC.x, $texCoordAttrib, $diffuseMatrix_s;
DP4 TC.y, $texCoordAttrib, $diffuseMatrix_t;
MOV result.texcoord[0], TC;
# texture 1 takes the texture coordinates and adds a scroll
ADD result.texcoord[1], TC, $deformScroll;
# texture 2 takes the deform magnitude and scales it by the projection distance
PARAM vec = { 1, 0, 0, 1 };
MOV R0, vec;
DP4 R0.z, $positionAttrib, state.matrix.modelview.row[2];
DP4 R1, R0, state.matrix.projection.row[0];
DP4 R2, R0, state.matrix.projection.row[3];
# don't let the recip get near zero for polygons that cross the view plane
MAX R2, R2, 1;
RCP R2, R2.w;
MUL R1, R1, R2;
# clamp the distance so the the deformations don't get too wacky near the view
MIN R1, R1, 0.02;
MUL result.texcoord[2], R1, $deformMagnitude;
MOV result.color, $colorAttrib;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP localNormal, mask, R0;
PARAM subOne = { -1, -1, -1, -1 };
PARAM scaleTwo = { 2, 2, 2, 2 };
# load the distortion map
TEX mask, fragment.texcoord[0], $mask, 2D;
# kill the pixel if the distortion wound up being very small
MUL mask.xy, mask, fragment.color;
SUB mask.xy, mask, 0.01;
MOV mask.zw, 0;
KIL mask;
# load the filtered normal map and convert to -1 to 1 range
TEX localNormal, fragment.texcoord[1], $bumpMap, 2D;
$if !r_dxnNormalMaps
MOV localNormal.x, localNormal.a;
$endif
MAD localNormal, localNormal, scaleTwo, subOne;
$if r_normalizeNormalMaps
MOV localNormal.z, 0;
DP3 R0.x, localNormal,localNormal;
ADD R0.x, 1, -R0.x;
RSQ R0.x, R0.x;
RCP localNormal.z, R0.x;
$endif
MUL localNormal, localNormal, mask;
# calculate the screen texcoord in the 0.0 to 1.0 range
MUL R0, fragment.position, $currentRenderTexelSize.zwzw;
# offset by the scaled localNormal and clamp it to 0.0 - 1.0
MAD_SAT R0, localNormal, fragment.texcoord[2], R0;
# scale by the screen adjust
MUL R0, R0, $currentRenderTexelSize.xyxy;
# load the screen render
TEX result.color.xyz, R0, $currentRender, RECT;
%> }
}
// With a proper matrix instead of just a scroll
renderProgram heatHazeMatrix {
state {
maskAlpha
}
program vertex arb { <%
OPTION ARB_position_invariant;
TEMP R0, R1, R2;
# texture 1 takes the texture coordinates and adds a scroll
#ADD result.texcoord[1], $texCoordAttrib, $deformScroll;
DP4 result.texcoord[1].x, $texCoordAttrib, $diffuseMatrix_s;
DP4 result.texcoord[1].y, $texCoordAttrib, $diffuseMatrix_t;
# texture 2 takes the deform magnitude and scales it by the projection distance
PARAM vec = { 1, 0, 0, 1 };
MOV R0, vec;
DP4 R0.z, $positionAttrib, state.matrix.modelview.row[2];
DP4 R1, R0, state.matrix.projection.row[0];
DP4 R2, R0, state.matrix.projection.row[3];
# don't let the recip get near zero for polygons that cross the view plane
MAX R2, R2, 1;
RCP R2, R2.w;
MUL R1, R1, R2;
# clamp the distance so the the deformations don't get too wacky near the view
MIN R1, R1, 0.02;
MUL result.texcoord[2], R1, $deformMagnitude;
%> }
program fragment arb { <%
OPTION ARB_precision_hint_fastest;
TEMP localNormal, R0;
PARAM subOne = { -1, -1, -1, -1 };
PARAM scaleTwo = { 2, 2, 2, 2 };
# load the filtered normal map and convert to -1 to 1 range
TEX localNormal, fragment.texcoord[1], $bumpMap, 2D;
$if !r_dxnNormalMaps
MOV localNormal.x, localNormal.a;
$endif
MAD localNormal, localNormal, scaleTwo, subOne;
$if r_normalizeNormalMaps
MOV localNormal.z, 0;
DP3 R0.x, localNormal,localNormal;
ADD R0.x, 1, -R0.x;
RSQ R0.x, R0.x;
RCP localNormal.z, R0.x;
$endif
# calculate the screen texcoord in the 0.0 to 1.0 range
MUL R0, fragment.position, $currentRenderTexelSize.zwzw;
# offset by the scaled localNormal and clamp it to 0.0 - 1.0
MAD_SAT R0, localNormal, fragment.texcoord[2], R0;
# scale by the screen adjust
MUL R0, R0, $currentRenderTexelSize.xyzy;
# load the screen render
TEX result.color.xyz, R0, $currentRender, RECT;
%> }
}