; STATIC: "NORMALMAPALPHAENVMAPMASK" "0..1"
ps.1.1

;------------------------------------------------------------------------------
; Environment mapping on a bumped surface
; t0 - Normalmap
; t3 - Cube environment map (*must* be a cube map!)
;
; c0 - color to multiply the results by
; c1 - envmap contrast
; c2 - envmap saturation
; c3 - grey weights
; c4 - fresnel amount
; Input texture coords required here are a little wonky.
; tc0.uv <- U,V into the normal map
; tc1.uvw, tc2.uvw, tc3.uvw <- 3x3 matrix transform 
;								from tangent space->env map space
; tc1.q, tc2.q, tc3.q <- eye vector in env map space
;------------------------------------------------------------------------------

; Get the 3-vector from the normal map
tex t0

; Perform matrix multiply to get a local normal bump.  Then
; reflect the eye vector through the normal and sample from 
; a cubic environment map.
texm3x3pad t1, t0_bx2
texm3x3pad t2, t0_bx2		
texm3x3vspec t3, t0_bx2

; FIXME FIXME - Need to do specialized versions of this with and without:
; - constant color
; - fresnel amount of exactly 0 or 1 or in between
; - envmap contrast of 0, 1, or in between
; - envmap saturation of 0, 1, or in between

; r0 = constant color * result of bump into envmap
mul r0.rgb, t3, c0

; dot eye-vector with per-pixel normal from t0
dp3_sat	r1, v0_bx2, t0_bx2

; run Fresnel approx. on it: R0 + (1-R0) (1-cos(q))^5 in alpha channel
mul r1.rgb, r0, r0					; color squared
+mul r0.a, 1-r1.a, 1-r1.a			; squared

lrp r0.rgb, c1, r1, r0				; blend between color and color * color
+mul r0.a, r0.a, r0.a				; quartic

dp3 r1.rgb, r0, c3				; color greyscaled
+mul r0.a, r0.a, 1-r1.a				; quintic

; FIXME - these should be able to pair (I think), but don't on nvidia for some reason.
; (I think) cannot pair due to use of >2 constants in single stage
lrp	r0.rgb, c2, r0, r1 			; blend between color and greyscale
mad r0.a, r0.a, c6.a, c4.a			; Take Fresnel R(0) into consideration

mul r0.rgb, r0, r0.a				; multiply output color by result of fresnel calc

#if NORMALMAPALPHAENVMAPMASK
+mul r0.a, c0.a, t0.a				; Fade amount * alpha from the texture
#else
+mov r0.a, c0.a					; Just use the fade amount
#endif


