!!ARBvp1.0 OPTION ARB_position_invariant ;

# Parallax Mapping Mod v1.0
# by Junkguy
# junkguy@gmail.com
# www.junkguy.tk
# Released on August 14, 2004
#
#   YOU -MAY- MAKE YOUR OWN LEVEL AND ITS TEXTURES BE COMPATIBLE WITH THIS MOD AND
#      MAKE USE OF THE PARALLAX MAPPING TECHNOLOGY.  SEE THE README FOR DETAILS.
#
#   YOU MAY -NOT- USE THIS MOD AS A BASE FOR YOUR OWN MODS OR LEVELS.
#
#   YOU MAY -NOT- INCLUDE THIS MOD, THIS SHADER, THE TEXTURES, 
#      OR ANY OF THIS CODE IN YOUR OWN MOD OR LEVEL WITHOUT PERMISSION FROM JUNKGUY.

TEMP	R0, R1, R2;

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

SUB		R0, program.env[4], vertex.position;

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;
MOV		result.texcoord[1], defaultTexCoord;
DP4		result.texcoord[1].x, vertex.attrib[8], program.env[10];
DP4		result.texcoord[1].y, vertex.attrib[8], program.env[11];
MOV		result.texcoord[2], defaultTexCoord;
DP4		result.texcoord[2].x, vertex.position, program.env[9];
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];
MOV		result.texcoord[4], defaultTexCoord;
DP4		result.texcoord[4].x, vertex.attrib[8], program.env[12];
DP4		result.texcoord[4].y, vertex.attrib[8], program.env[13];
MOV		result.texcoord[5], defaultTexCoord;
DP4		result.texcoord[5].x, vertex.attrib[8], program.env[14];
DP4		result.texcoord[5].y, vertex.attrib[8], program.env[15];

SUB		R0, program.env[4], vertex.position;

DP3		R1, R0, R0;
RSQ		R1, R1.x;
MUL		R0, R0, R1.x;

SUB		R1, program.env[5], vertex.position;

DP3		R2, R1, R1;
RSQ		R2, R2.x;
MUL		R1, R1, R2.x;
ADD		R0, R0, R1;

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;

SUB		R1, program.env[5], vertex.position;

DP3		result.texcoord[7].x, vertex.attrib[9], R1;
DP3		result.texcoord[7].y, vertex.attrib[10], R1;
DP3		result.texcoord[7].z, vertex.attrib[11], R1;
MOV		result.texcoord[7].w, 1.0;

MAD result.color.xyz, vertex.color, program.env[16], program.env[17];
#MAD result.color.xyz, vertex.color, program.env[16].x, program.env[16].y;

END

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

!!ARBfp1.0 
#OPTION ARB_precision_hint_nicest;

TEMP	light, color, R1, R2, localNormal, specular, eye, height, newtexcoord, newbumpcoord, newspeccoord, newspeclook;

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

#PARAM	xero = { 0, 0, 0, 1 };

PARAM	saab = { 0, 0, 0, 0.5 };	# 0.5 specular AA bias

DP3	R1, fragment.texcoord[7], fragment.texcoord[7];
RSQ	R1, R1.x;
MUL	eye, fragment.texcoord[7], R1;

TEX	height, fragment.texcoord[1], texture[1], 2D;
MAD	height.x, height.z, -0.025, 0.025;
MAD	newbumpcoord, height.xxxx, eye, fragment.texcoord[1];
MAD	newtexcoord, height.xxxx, eye, fragment.texcoord[4];
MAD	newspeccoord, height.xxxx, eye, fragment.texcoord[5];
MAD	newspeclook, height.xxxx, eye, fragment.texcoord[6];

# load the specular half angle first, because
# the ATI shader gives a "too many indirections" error
# if this is done right before the texture indirection

#-----------------
#TEX	specular, newspeclook, texture[0], CUBE;		#ORIGINALE
#MAD	specular, specular, scaleTwo, subOne;			#ORIGINALE

# instead of using the normalization cube map, normalize with math
DP3	specular, newspeclook,newspeclook;
RSQ	specular, specular.x;
MUL	specular, specular.x, newspeclook;

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

# perform the diffuse bump mapping

#-----------------
TEX	light, fragment.texcoord[0], texture[0], CUBE;
MAD	light, light, scaleTwo, subOne;

TEX	localNormal, newbumpcoord, texture[1], 2D;
MOV	localNormal.x, localNormal.a;
MOV	localNormal.z, 0.75;
MAD	localNormal, localNormal, scaleTwo, subOne;
#DP3	light, light, localNormal;

# localNormal filter
ADD	R1, newbumpcoord, saab;
TXB	R2, R1, texture[1], 2D;
MOV 	R2.x, R2.a;
MAD	R2, R2, scaleTwo, subOne;

ADD	localNormal, localNormal, R2;
MUL	localNormal, localNormal, 0.5;

# localNormal (normalize)
DP3	R1.w, localNormal, localNormal;
RSQ	R1.w, R1.w;
MUL	localNormal.xyz, R1.w, localNormal;

# -------- diffuse map modulated by light color -- #

TEX	R1, newtexcoord, texture[4], 2D;
MUL	color.xyz, R1, program.env[0];

# ------------------------------------- reflect -- #

# reflect light from localNormal

DP3	R2.w, localNormal, localNormal;
DP3	R2.x, localNormal, light;
MUL	R2.x, R2, 2.0;

# divide by mul
RCP	R1.w, R2.w;
MUL	R2.x, R2.x, R1.w;

MAD	R1.xyz, R2.xxxx, localNormal, -light;

# ------------------------------------------------ #

# specular.w is the specular volume
DP3	specular.w, R1, specular;
#SUB	specular.w, specular, clamp.w;

DP3	light, light, localNormal;
#SUB_SAT light, light, clamp.w;

# --------------------------------------------- #

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

# boost projection, specular light reaches further - DFM added
ADD_SAT	R1.rgb, R1, R1;
MUL	R2.rgb, R2, R1;

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

#
# the light will be modulated by the diffuse and
# specular surface characteristics
#

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

# perform the specular bump mapping
DP3_SAT specular.w, specular, localNormal;

# perform a dependent table read for the specular falloff
#TEX	R1, specular.w, texture[6], 2D;	#ORIGINALE DI JC
#MAD_SAT R1, specular.w, 18.0, -16.5;	#ALTERNATIVO CON ACCENTUAZIONE SPECULARE
MAD_SAT R1, specular.w, 10.0, -8.5;
#MAD_SAT R1, specular.w, 4.0, -3.0;	#VERSIONE DI HUMUS ESTREMAMENTE SIMILE ALL'ORIGINALE
MUL R1, R1, R1;

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

# modulate by the specular map * 2
TEX	R2, newspeccoord, texture[5], 2D;
MUL	R2, R2, 1.4;
#ADD	R2, R2, R2;
MAD	color.xyz, R1, R2, color;

MUL	color.xyz, light, color;

MUL	result.color.xyz, color, fragment.color;

END

