!!ARBvp1.0
PARAM MV[4] = { state.matrix.modelview };
PARAM MVInv[4] = { state.matrix.modelview.invtrans };
PARAM MVP[4] = { state.matrix.mvp };
TEMP ObjectCoord, EyeCoord, ClippingCoord;
TEMP Normal, EyeNormal, TexCoord;
TEMP Ray, Temp, Reflect;
MOV ObjectCoord, vertex.position;
MOV Normal, vertex.normal;
DP4 EyeCoord.x, MV[0], ObjectCoord;
DP4 EyeCoord.y, MV[1], ObjectCoord;
DP4 EyeCoord.z, MV[2], ObjectCoord;
DP4 EyeCoord.w, MV[3], ObjectCoord;
DP4 ClippingCoord.x, MVP[0], ObjectCoord;
DP4 ClippingCoord.y, MVP[1], ObjectCoord;
DP4 ClippingCoord.z, MVP[2], ObjectCoord;
DP4 ClippingCoord.w, MVP[3], ObjectCoord;
DP3 EyeNormal.x, MVInv[0], Normal;
DP3 EyeNormal.y, MVInv[1], Normal;
DP3 EyeNormal.z, MVInv[2], Normal;
SUB Ray.xyz, EyeCoord, MV[3];
# Normalize Ray
DP3 Ray.w, Ray, Ray; # Ray.x*Ray.x + Ray.y*Ray.y + Ray.z*Ray.z
RSQ Ray.w, Ray.w; # 1/Sqrt(Ray.w)
MUL Ray.xyz, Ray, Ray.w; # Ray.x*Ray.w, Ray.y*Ray.w, Ray.z*Ray.w
# Reflect = Ray - 2.0 * EyeNormal * dot(Ray, EyeNormal)
DP3 Temp.x, Ray, EyeNormal; # dot(Ray, EyeNormal)
MUL Temp.x, Temp.x, 2.0; # dot(Ray, EyeNormal) * 2.0
MUL Temp, EyeNormal, Temp.x; # dot(Ray, EyeNormal) * 2.0 * EyeNormal
SUB Reflect, Ray, Temp; # Ray - dot(Ray, EyeNormal) * 2.0 * EyeNormal
# m = Sqrt(Reflect.x^2 + Reflect.y^2 + (Reflect.z + 1)^2)
MUL Temp.x, Reflect.x, Reflect.x; # Reflect.x^2
MUL Temp.y, Reflect.y, Reflect.y; # Reflect.y^2
ADD Temp.w, Reflect.z, 1.0; # Reflect.z + 1
MUL Temp.z, Temp.w, Temp.w; # (Reflect.z+1)^2
ADD Temp.w, Temp.x, Temp.y; # Reflect.x^2 + Reflect.y^2
ADD Temp.w, Temp.w, Temp.z; # Reflect.x^2 + Reflect.x^2 + (Reflect.z + 1)^2
RSQ Temp.x, Temp.w; # 1/Sqrt(Reflect.x^2 + Reflect.x^2 + (Reflect.z + 1)^2)
# s = Reflect.x/m + 0.5
MUL TexCoord.x, Reflect.x, Temp.x; # Reflect.x * (1/m)
ADD TexCoord.x, TexCoord.x, 0.5; # Reflect.x * (1/m) + 0.5
# t = Reflect.y/m + 0.5
MUL TexCoord.y, Reflect.y, Temp.x; # Reflect.y * (1/m)
ADD TexCoord.y, TexCoord.y, 0.5; # Reflect.y * (1/m) + 0.5
MOV TexCoord.z, 0.0;
MOV TexCoord.w, 1.0;
MOV result.position, ClippingCoord;
MOV result.texcoord, TexCoord;
MOV result.color, vertex.color;
END