!!ARBvp1.0 OPTION ARB_position_invariant ;

# VPROG_INTERACTION
# 
# input:
# 
# attrib[8] TEX0	texture coordinates
# attrib[9] TEX1	normal
# attrib[10] TEX2	tangent[0]
# attrib[11] TEX3	tangent[1]
# COL			vertex color
#
# c[4]	localLightOrigin
# c[5]	localViewOrigin
# c[6]	lightProjection S
# c[7]	lightProjection T
# c[8]	lightProjection Q
# c[9]	lightFalloff S
# c[10]	bumpMatrix S
# c[11]	bumpMatrix T
# c[12]	diffuseMatrix S
# c[13]	diffuseMatrix T
# c[14]	specularMatrix S
# c[15]	specularMatrix T
# c[16]	vertex color modulate
# c[17]	vertex color add
#
# output:
# 
# texture 0 is the cube map
# texture 1 is the per-surface bump map
# texture 2 is the light falloff texture
# texture 3 is the light projection texture
# texture 4 is the per-surface diffuse map
# texture 5 is the per-surface specular map
# texture 6 is the specular lookup table

TEMP	R0, R1, R2;

PARAM	defaultTexCoord = { 0, 0.5, 0, 1 };


# calculate vector to light in R0
SUB		R0, program.env[4], vertex.position;

# put into texture space for TEX0
DP3		result.texcoord[0].x, vertex.attrib[9], R0;
DP3		result.texcoord[0].y, vertex.attrib[10], R0;
DP3		result.texcoord[0].z, vertex.attrib[11], R0;

#take the texture coordinates and add a scroll
MOV		result.texcoord[1], defaultTexCoord;
MOV		result.texcoord[1], vertex.attrib[8];

# texture 2 has one texgen
MOV		result.texcoord[2], defaultTexCoord;
DP4		result.texcoord[2].x, vertex.position, program.env[9];

# texture 3 has three texgens
DP4		result.texcoord[3].x, vertex.position, program.env[6];
DP4		result.texcoord[3].y, vertex.position, program.env[7];
DP4		result.texcoord[3].w, vertex.position, program.env[8];

# calculate vector to viewer in R0
SUB		R0, program.env[5], vertex.position;

# put into texture space for TEX6
DP3		result.texcoord[6].x, vertex.attrib[9], R0;
DP3		result.texcoord[6].y, vertex.attrib[10], R0;
DP3		result.texcoord[6].z, vertex.attrib[11], R0;

# generate the vertex color, which can be 1.0, color, or 1.0 - color
# for 1.0 : env[16] = 0, env[17] = 1
# for color : env[16] = 1, env[17] = 0
# for 1.0-color : env[16] = -1, env[17] = 1
MAD		result.color.xyz, vertex.color, program.env[16].x, program.env[16].y;

END


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

!!ARBfp1.0 
OPTION ARB_precision_hint_nicest;

# texture 0 is the cube map
# texture 1 is the per-surface bump map
# texture 2 is the light falloff texture
# texture 3 is the light projection texture
# texture 4 is the per-surface diffuse map
# texture 5 is the per-surface specular map
# texture 6 is the specular lookup table

# env[0] is the diffuse modifier
# env[1] is the specular modifier

TEMP	toLight, light, toViewer, halfAngle, color, R1, R2, R0, localNormal;

PARAM	subOne = { -1, -1, -1, -1 };
PARAM	scaleTwo = { 2, 2, 2, 2 };

PARAM	scroll = program.local[1];

#
# the amount of light contacting the fragment is the
# product of the two light projections and the surface
# bump mapping
#

# normalize the direction to the light
#DP3		toLight, fragment.texcoord[0],fragment.texcoord[0];
#RSQ		toLight, toLight.x;
#MUL		toLight, toLight.x, fragment.texcoord[0];

TEX		toLight, fragment.texcoord[0], texture[0], CUBE;
MAD		toLight, toLight, scaleTwo, subOne;

# normalize the direction to the viewer
#DP3		toViewer, fragment.texcoord[6],fragment.texcoord[6];
#RSQ		toViewer, toViewer.x;
#MUL		toViewer, toViewer.x, fragment.texcoord[6];

TEX		toViewer, fragment.texcoord[6], texture[0], CUBE;
MAD		toViewer, toViewer, scaleTwo, subOne;

# load the filtered normal map
MAD		R0, 0.02, scroll, fragment.texcoord[1];
MUL		R0, 0.9, R0;
TEX		localNormal, R0, texture[1], 2D;

MAD		R0, 0.1, scroll.zyxy, fragment.texcoord[1];
MUL		R0, 0.125, R0;
TEX		R0, R0, texture[1], 2D;
ADD		localNormal, R0, localNormal;

MAD		R0, -0.17, scroll.wxxy, fragment.texcoord[1];
MUL		R0, 0.5, R0;
TEX		R0, R0, texture[1], 2D;
ADD		localNormal, R0, localNormal;

MAD		R0, 0.2, scroll.wwxy, fragment.texcoord[1];
MUL		R0, 0.25, R0;
TEX		R0, R0, texture[1], 2D;
ADD		localNormal, R0, localNormal;

MAD		localNormal, localNormal.agbr, scaleTwo, -4.0;
MUL		localNormal.xy, localNormal, 1.5;

# normalize the bumpmap
DP3		R1, localNormal,localNormal;
RSQ		R1, R1.x;
MUL		localNormal.xyz, localNormal, R1;

# diffuse dot product
DP3		light, toLight, localNormal;

# modulate by the light projection
TXP		R1, fragment.texcoord[3], texture[3], 2D;
MUL		light, light, R1;

# modulate by the light falloff
TXP		R1, fragment.texcoord[2], texture[2], 2D;
MUL		light, light, R1;

# modulate by the diffuse map and constant diffuse factor
TEX		color.xyz, fragment.texcoord[1], texture[4], 2D;
#MUL		color.xyz, R1, program.env[0];

# calculate the half angle vector and normalize
ADD		halfAngle, toLight, toViewer;
DP3		R1, halfAngle, halfAngle;
RSQ		R1, R1.x;
MUL		halfAngle.xyz, halfAngle, R1;

# calculate specular
DP3_SAT	R1, halfAngle, localNormal;

# use power instead of table
POW		R1, R1.x, program.local[0].x;

# modulate by the constant specular factor
#MUL	R1, R1, program.env[1];

# modulate by the specular map * 2
TEX	R2, fragment.texcoord[1], texture[5], 2D;
ADD	R2, R2, R2;
MAD	color.xyz, R1, R2, color;

MUL	color.xyz, light, color;

# light color
MUL color.xyz, color, program.env[0];

# modify by the vertex color
MUL result.color.xyz, color, fragment.color;

END
