!!ARBvp1.0 OPTION ARB_position_invariant ;

# input:
# 
# texcoord[0]	TEX0	texcoords
#
# local[0]	scroll
# local[1]	deform magnitude (1.0 is reasonable, 2.0 is twice as wavy, 0.5 is half as wavy, etc)
#
# output:
# 
# texture 0 is _currentRender
# texture 1 is a normal map that we will use to deform texture 0
#
# texCoord[1] is the model surface texture coords
# texCoord[2] is the copied deform magnitude

TEMP	R0, R1, R2;
# texture 1 takes the texture coordinates and adds a scroll
ADD	result.texcoord[1], vertex.texcoord[0], program.local[0];
MUL	R0, program.local[0], .25;
# 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, vertex.position, 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, program.local[1];


# PBMax
# subtract vertex position with eye position (program.env[5])
SUB	R0, program.env[5], vertex.position;
# normalize this vector
DP3	R1.x, R0, R0;
RSQ	R1.x, R1.x;
MUL	result.texcoord[3], R0, R1.x;
# PBMax


END

#======================================================================

!!ARBfp1.0 
OPTION ARB_precision_hint_nicest;

# texture 0 is _currentRender
# texture 1 is a normal map that we will use to deform texture 0
#
# env[0] is the 1.0 to _currentRender conversion
# env[1] is the fragment.position to 0.0 - 1.0 conversion

TEMP	localNormal, R0;
PARAM	subOne = { -1, -1, -1, -1 };
PARAM	scaleTwo = { 2, 2, 2, 2 };
# load the filtered normal map
TEX	localNormal, fragment.texcoord[1], texture[1], 2D;
# rxgb normal map compression
MOV	localNormal.x, localNormal.a;
# convert to -1 to 1 range
MAD	localNormal, localNormal, scaleTwo, subOne;
# calculate the screen texcoord in the 0.0 to 1.0 range
MUL	R0, fragment.position, program.env[1];
# offset by the scaled localNormal and clamp it to 0.0 - 1.0 (_SAT clamps it)
MAD_SAT	R0, localNormal, fragment.texcoord[2], R0;


# PBMax, since _scratch should already be a power of two, skip this step
# MUL	R0, R0, program.env[0];


TEX	R0, R0, texture[0], 2D;
MUL	R0, R0, 1;
MOV	result.color.xyz, R0;


# PBMax
# viewing straight down the pixel's normal = 1
# viewing at 90 degrees to the pixel's normal = 0
DP3	R0.x, fragment.texcoord[3], localNormal;
# adjust to increase the fresnel reflection a little bit (not the "proper" fresnel formula)
MUL	R0.x, R0.x, .7;
# adjust so viewing at 90 degrees to the pixel's normal = 1
SUB	R0.x, 1.0, R0.x;
# square it for better results (not the "proper" fresnel formula) 
MUL	result.color.a, R0.x, R0.x;
# PBMax


END