renderBinding water_tint { vector { 1 } } renderBinding water_distortion { vector { 1 } } renderBinding water_fresnel { vector { 1 } } renderBinding water_glare { vector { 1 } } renderBinding water_offset { vector { 1 } } // how many pixels to offset the refraction (only use for special hacks like the sniper rifle scope) renderBinding water_desat { vector { 1 } } /* A static surface with cubemap reflections */ renderProgram water/simple_cube { program vertex arb { <% OPTION ARB_position_invariant; TEMP R0, R1, R2, bitangent; XPD bitangent, $normalAttrib, $tangentAttrib; MUL bitangent, bitangent, $tangentAttrib.w; # bumpmap texture coords DP4 result.texcoord[0].x, $texCoordAttrib, $diffuseMatrix_s; DP4 result.texcoord[0].y, $texCoordAttrib, $diffuseMatrix_t; # vector to eye SUB R1, $positionAttrib, $viewOrigin; $if ( r_shaderQuality > 1 ) DP3 R0.x, R1, $transposedModelMatrix_x; DP3 R0.y, R1, $transposedModelMatrix_y; DP3 R0.z, R1, $transposedModelMatrix_z; DP3 R0.w, R0, R0; RSQ R0.w, R0.w; MUL result.texcoord[2].xyz, R0, R0.w; $else DP3 result.texcoord[2].x, R1, $transposedModelMatrix_x; DP3 result.texcoord[2].y, R1, $transposedModelMatrix_y; DP3 result.texcoord[2].z, R1, $transposedModelMatrix_z; $endif DP3 R1.w, R1, R1; RSQ R0.w, R1.w; MUL result.texcoord[2].w, R0.w, R1.w; # tangent->world matrix DP3 result.texcoord[3].x, $tangentAttrib, $transposedModelMatrix_x; DP3 result.texcoord[3].y, bitangent, $transposedModelMatrix_x; DP3 result.texcoord[3].z, $normalAttrib, $transposedModelMatrix_x; DP3 result.texcoord[4].x, $tangentAttrib, $transposedModelMatrix_y; DP3 result.texcoord[4].y, bitangent, $transposedModelMatrix_y; DP3 result.texcoord[4].z, $normalAttrib, $transposedModelMatrix_y; DP3 result.texcoord[5].x, $tangentAttrib, $transposedModelMatrix_z; DP3 result.texcoord[5].y, bitangent, $transposedModelMatrix_z; DP3 result.texcoord[5].z, $normalAttrib, $transposedModelMatrix_z; MOV result.color, $colorAttrib; # this doesn't even change per vertex so don't bother to calculate it per pixel # texture 1 takes the deform magnitude and scales it by the projection distance PARAM vec = { 1, 0, 0, 1 }; MOV R0, vec; DP4 R0.z, $positionAttrib, 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 R1, R1, $water_distortion; MUL result.texcoord[1], R1, $currentRenderTexelSize; $if ( r_megaDrawMethod != 0 ) TEMP _F1, _F2; SUB _F2, $positionAttrib, $viewOrigin; DP3 _F1.x, _F2, _F2; RSQ _F1.y, _F1.x; MUL _F1.x, _F1.y, _F1.x; MAD result.color.secondary, _F1.x, $fogDepths.z, $fogDepths.w; $endif %> } program fragment arb { <% OPTION ARB_precision_hint_fastest; TEMP R0, R1, R2, R3, R4, eye, mix, spec; # get normal from normal map TEX R0, fragment.texcoord[0], $bumpMap, 2D; $if !r_dxnNormalMaps MOV R0.x, R0.a; $endif MAD R2, R0, 2, -1; MUL R2.xy, R2, $water_distortion.z; $if r_normalizeNormalMaps TEMP NR1; MOV R2.z, 0; DP3 NR1.x, R2,R2; ADD NR1.x, 1, -NR1.x; RSQ NR1.x, NR1.x; RCP R2.z, NR1.x; $endif # put in world space DP3 R1.x, R2, fragment.texcoord[3]; DP3 R1.y, R2, fragment.texcoord[4]; DP3 R1.z, R2, fragment.texcoord[5]; #MAD result.color, R1, 0.5, 0.5; # warped texcoords ( normalmap * scale ) + fragpos MAD R3, R1, fragment.texcoord[1], fragment.position; ADD R3, $water_offset, R3; # normalize to eye DP3 eye.w, fragment.texcoord[2], fragment.texcoord[2]; RSQ eye.w, eye.w; MUL eye, fragment.texcoord[2], eye.w; #MAD result.color, eye, 0.5, 0.5; # calc reflection vector: i - 2 * dot(i, n) * n DP3 R2, eye, R1; MUL R2, R2, 2; MAD R4, -R1, R2.x, eye; #spec $if ( r_shaderQuality < 1 ) DP3_SAT R0, R4, $sunDirection; TEX spec, R0, $map, 2D; MUL spec, spec, $sunColor; MUL spec, spec, $water_glare; $endif # reflect refract mixing (sorta fresnel) DP3 R1, -eye, R1; ADD R1, R1, 1; POW R1, R1.x, $water_fresnel.x; RCP_SAT mix, R1.x; # lookup textures and interpolate TEX R1, R3, $currentRender, RECT; MUL R1, R1, $water_tint; #modulate with water color TEX R2, R4, $environmentCubeMap, CUBE; LRP R2, $water_desat, 0.5, R2; SUB R3, R2, R1; MAD R3, R3, mix, R1; $if ( r_shaderQuality < 1 ) ADD result.color, R3, spec; $else MOV result.color, R3; $endif ADD result.color.a, spec.r, spec.g; %> } } renderProgram water/simple_cube_fallback { program vertex reference water/simple_cube program fragment arb { <% OPTION ARB_precision_hint_fastest; TEMP R0, R1, R2, R3, R4, eye, mix, spec; # get normal from normal map TEX R0, fragment.texcoord[0], $bumpMap, 2D; $if !r_dxnNormalMaps MOV R0.x, R0.a; $endif MAD R2, R0, 2, -1; MUL R2.xy, R2, $water_distortion.z; $if r_normalizeNormalMaps TEMP NR1; MOV R2.z, 0; DP3 NR1.x, R2,R2; ADD NR1.x, 1, -NR1.x; RSQ NR1.x, NR1.x; RCP R2.z, NR1.x; $endif # put in world space DP3 R1.x, R2, fragment.texcoord[3]; DP3 R1.y, R2, fragment.texcoord[4]; DP3 R1.z, R2, fragment.texcoord[5]; # warped texcoords ( normalmap * scale ) + fragpos MAD R3, R1, fragment.texcoord[1], fragment.position; ADD R3, $water_offset, R3; # normalize to eye DP3 eye.w, fragment.texcoord[2], fragment.texcoord[2]; RSQ eye.w, eye.w; MUL eye, fragment.texcoord[2], eye.w; # calc reflection vector: i - 2 * dot(i, n) * n DP3 R2, eye, R1; MUL R2, R2, 2; MAD R4, -R1, R2.x, eye; # reflect refract mixing (sorta fresnel) DP3 R1, -eye, R1; ADD R1, R1, 1; POW R1, R1.x, $water_fresnel.x; RCP_SAT mix, R1.x; # lookup textures and interpolate TEX R2, R4, $environmentCubeMap, CUBE; LRP R3, $water_desat, 0.5, R2; MOV result.color, R3; MOV result.color.a, 0.3; %> } } //Exactly like the normal simple_cube but the diffuseMap alpha channel is used as an mask image.. renderProgram water/simple_cube_mask { program vertex reference water/simple_cube program fragment arb { <% OPTION ARB_precision_hint_fastest; TEMP R0, R1, R2, R3, R4, eye, mix, spec; # get mask TEX R1, fragment.texcoord[0], $diffuseMap, 2D; SUB R1.a, R1.a, 0.2; KIL R1.a; #MOV result.color, R1.a; # get normal from normal map TEX R0, fragment.texcoord[0], $bumpMap, 2D; $if !r_dxnNormalMaps MOV R0.x, R0.a; $endif MAD R2, R0, 2, -1; MUL R2.xy, R2, $water_distortion.z; $if r_normalizeNormalMaps TEMP NR1; MOV R2.z, 0; DP3 NR1.x, R2,R2; ADD NR1.x, 1, -NR1.x; RSQ NR1.x, NR1.x; RCP R2.z, NR1.x; $endif # put in world space DP3 R1.x, R2, fragment.texcoord[3]; DP3 R1.y, R2, fragment.texcoord[4]; DP3 R1.z, R2, fragment.texcoord[5]; #MAD result.color, R1, 0.5, 0.5; # warped texcoords ( normalmap * scale ) + fragpos MAD R3, R1, fragment.texcoord[1], fragment.position; ADD R3, $water_offset, R3; # normalize to eye DP3 eye.w, fragment.texcoord[2], fragment.texcoord[2]; RSQ eye.w, eye.w; MUL eye, fragment.texcoord[2], eye.w; #MAD result.color, eye, 0.5, 0.5; # calc reflection vector: i - 2 * dot(i, n) * n DP3 R2, eye, R1; MUL R2, R2, 2; MAD R4, -R1, R2.x, eye; #spec $if ( r_shaderQuality < 1 ) DP3_SAT R0, R4, $sunDirection; TEX spec, R0, $map, 2D; MUL spec, spec, $sunColor; MUL spec, spec, $water_glare; $endif # reflect refract mixing (sorta fresnel) DP3 R1, -eye, R1; ADD R1, R1, 1; POW R1, R1.x, $water_fresnel.x; RCP_SAT mix, R1.x; # lookup textures and interpolate TEX R1, R3, $currentRender, RECT; MUL R1, R1, $water_tint; #modulate with water color TEX R2, R4, $environmentCubeMap, CUBE; LRP R2, $water_desat, 0.5, R2; SUB R3, R2, R1; MAD R3, R3, mix, R1; $if ( r_shaderQuality < 1 ) ADD result.color, R3, spec; $else MOV result.color, R3; $endif ADD result.color.a, spec.r, spec.g; %> } } renderProgram water/simple_cube_alpha { program vertex reference water/simple_cube program fragment arb { <% OPTION ARB_precision_hint_fastest; TEMP R0, R1, R2, R3, R4, eye, mix, spec; # get mask TEMP diffuse; TEX diffuse, fragment.texcoord[0], $diffuseMap, 2D; SUB R1.a, diffuse.a, 0.0002; KIL R1.a; #MOV result.color, R1.a; # get normal from normal map TEX R0, fragment.texcoord[0], $bumpMap, 2D; $if !r_dxnNormalMaps MOV R0.x, R0.a; $endif MAD R2, R0, 2, -1; MUL R2.xy, R2, $water_distortion.z; $if r_normalizeNormalMaps TEMP NR1; MOV R2.z, 0; DP3 NR1.x, R2,R2; ADD NR1.x, 1, -NR1.x; RSQ NR1.x, NR1.x; RCP R2.z, NR1.x; $endif # put in world space DP3 R1.x, R2, fragment.texcoord[3]; DP3 R1.y, R2, fragment.texcoord[4]; DP3 R1.z, R2, fragment.texcoord[5]; # warped texcoords ( normalmap * scale ) + fragpos MAD R3, R1, fragment.texcoord[1], fragment.position; ADD R3, $water_offset, R3; # normalize to eye DP3 eye.w, fragment.texcoord[2], fragment.texcoord[2]; RSQ eye.w, eye.w; MUL eye, fragment.texcoord[2], eye.w; # calc reflection vector: i - 2 * dot(i, n) * n DP3 R2, eye, R1; MUL R2, R2, 2; MAD R4, -R1, R2.x, eye; #spec $if ( r_shaderQuality < 1 ) DP3_SAT R0, R4, $sunDirection; TEX spec, R0, $map, 2D; MUL spec, spec, $sunColor; MUL spec, spec, $water_glare; $endif # reflect refract mixing (sorta fresnel) DP3 R1, -eye, R1; MAX R1, R1, -R1; ADD R1, R1, 1; POW R1, R1.x, $water_fresnel.x; RCP_SAT mix, R1.x; TEMP baseimg; TEX baseimg, fragment.position, $currentRender, RECT; # lookup textures and interpolate TEX R1, R3, $currentRender, RECT; MUL R1, R1, $water_tint; #modulate with water color TEX R2, R4, $environmentCubeMap, CUBE; LRP R2, $water_desat, 0.5, R2; SUB R3, R2, R1; MAD R3, R3, mix, R1; TEMP out; $if ( r_shaderQuality < 1 ) ADD out, R3, spec; $else MOV out, R3; $endif ADD result.color.a, spec.r, spec.g; MUL_SAT diffuse.a, diffuse.a, 3; LRP result.color.rgb, diffuse.a, out, baseimg; %> } } renderProgram water/wake_cube { program vertex reference water/simple_cube program fragment arb { <% OPTION ARB_precision_hint_fastest; TEMP R0, R1, R2, R3, R4, eye, mix, spec, mask; # get normal from normal map TEX R0, fragment.texcoord[0], $bumpMap, 2D; $if !r_dxnNormalMaps MOV R0.x, R0.a; $endif MAD R2, R0, 2, -1; MUL R2.xy, R2, $water_distortion.z; $if r_normalizeNormalMaps MOV R2.z, 0; DP3 R1.x, R2,R2; ADD R1.x, 1, -R1.x; RSQ R1.x, R1.x; RCP R2.z, R1.x; $endif TEX mask, fragment.texcoord[0], $mask, 2D; # put in world space DP3 R1.x, R2, fragment.texcoord[3]; DP3 R1.y, R2, fragment.texcoord[4]; DP3 R1.z, R2, fragment.texcoord[5]; #MAD result.color, R1, 0.5, 0.5; # warped texcoords MUL R3, $water_distortion, $currentRenderTexelSize; MAD R3, R3, R1, fragment.position; # normalize to eye DP3 eye.w, fragment.texcoord[2], fragment.texcoord[2]; RSQ eye.w, eye.w; MUL eye, fragment.texcoord[2], eye.w; #MAD result.color, eye, 0.5, 0.5; # calc reflection vector: i - 2 * dot(i, n) * n DP3 R2, eye, R1; MUL R2, R2, 2; MAD R4, -R1, R2.x, eye; #spec DP3_SAT R0, R4, $sunDirection; TEX spec, R0, $map, 2D; MUL spec, spec, $sunColor; MUL spec, spec, $water_glare; # reflect refract mixing (sorta fresnel) DP3 R1, -eye, R1; ADD R1, R1, 1; POW R1, R1.x, $water_fresnel.x; RCP_SAT mix, R1.x; # lookup textures and interpolate TEX R1, R3, $currentRender, RECT; MUL R1, R1, $water_tint; #modulate with water color TEX R2, R4, $environmentCubeMap, CUBE; SUB R3, R2, R1; MAD R3, R3, mix, R1; ADD result.color, R3, spec; MUL result.color.a, fragment.color.a, mask.r; %> } } renderBinding water_lerp { vector { 1 } } /* A static surface with cubemap reflections, interpolates between two normal maps for the refraction/reflection vector */ renderProgram water/simple_cube_interpolate { earlycullversion water/simple_cube_interpolate_early program vertex reference water/simple_cube program fragment arb { <% OPTION ARB_precision_hint_fastest; TEMP R0, R1, R2, R3, R4, eye, mix, spec; # get normals from normal maps TEX R0, fragment.texcoord[0], $bumpMap, 2D; TEX R1, fragment.texcoord[0], $bumpMap2, 2D; # interpolate LRP R2, $water_lerp, R1, R0; $if !r_dxnNormalMaps MOV R2.x, R2.a; $endif MAD R2, R2, 2, -1; MUL R2.xy, R2, $water_distortion.z; MUL_SAT R0.a, fragment.texcoord[2].w, 0.0001; SUB R1, 0, R2; MAD R2, R2, R0.a, R1; $if r_normalizeNormalMaps TEMP NR1; MOV R2.z, 0; DP3 NR1.x, R2,R2; ADD NR1.x, 1, -NR1.x; RSQ NR1.x, NR1.x; RCP R2.z, NR1.x; $endif # put in world space DP3 R1.x, R2, fragment.texcoord[3]; DP3 R1.y, R2, fragment.texcoord[4]; DP3 R1.z, R2, fragment.texcoord[5]; # warped texcoords $if ( r_shaderQuality < 2 ) MUL R3, $water_distortion, $currentRenderTexelSize; MUL R3, R3, fragment.color.r; MAD R3, R3, R1, fragment.position; $else MOV R3, fragment.position; $endif # normalize to eye $if ( r_shaderQuality < 2 ) DP3 eye.w, fragment.texcoord[2], fragment.texcoord[2]; RSQ eye.w, eye.w; MUL eye, fragment.texcoord[2], eye.w; $else MOV eye, fragment.texcoord[2]; $endif # calc reflection vector: i - 2 * dot(i, n) * n DP3 R2, eye, R1; MUL R2, R2, 2; MAD R4, -R1, R2.x, eye; #spec $if ( r_shaderQuality < 1 ) DP3_SAT R0, R4, $sunDirection; TEX spec, R0, $map, 2D; MUL spec, spec, $sunColor; MUL spec, spec, $water_glare; MUL spec, spec, fragment.color.r; $endif # reflect refract mixing (sorta fresnel) $if ( r_shaderQuality < 2 ) DP3 R1, -eye, R1; ADD R1, R1, 1; POW R1, R1.x, $water_fresnel.x; RCP_SAT mix, R1.x; MUL mix, mix, fragment.color.r; $else MOV mix, 0.125; $endif # lookup textures and interpolate TEX R1, R3, $currentRender, RECT; MUL R1, R1, $water_tint; #modulate with water color TEX R2, R4, $environmentCubeMap, CUBE; SUB R3, R2, R1; MAD R3, R3, mix, R1; TEMP _finalcolor; $if ( r_shaderQuality < 1 ) ADD _finalcolor, R3, spec; $else MOV _finalcolor, R3; $endif ADD result.color.a, spec.r, spec.g; $if ( r_megaDrawMethod != 0 ) LRP result.color.rgb, fragment.color.secondary.x, $fogColor, _finalcolor; $else MOV result.color.rgb, _finalcolor; $endif #MAD result.color.rgb, R4, 0.5, 0.5; #MUL result.color.rgb, fragment.texcoord[2].w, 0.00005; %> } } renderProgram water/simple_cube_interpolate_early { program vertex arb { <% OPTION ARB_position_invariant; TEMP R0, R1, R2, bitangent; XPD bitangent, $normalAttrib, $tangentAttrib; MUL bitangent, bitangent, $tangentAttrib.w; # bumpmap texture coords DP4 result.texcoord[0].x, $texCoordAttrib, $diffuseMatrix_s; DP4 result.texcoord[0].y, $texCoordAttrib, $diffuseMatrix_t; # vector to eye SUB R1, $positionAttrib, $viewOrigin; $if ( r_shaderQuality > 1 ) DP3 R0.x, R1, $transposedModelMatrix_x; DP3 R0.y, R1, $transposedModelMatrix_y; DP3 R0.z, R1, $transposedModelMatrix_z; DP3 R0.w, R0, R0; RSQ R0.w, R0.w; MUL result.texcoord[2].xyz, R0, R0.w; $else DP3 result.texcoord[2].x, R1, $transposedModelMatrix_x; DP3 result.texcoord[2].y, R1, $transposedModelMatrix_y; DP3 result.texcoord[2].z, R1, $transposedModelMatrix_z; $endif # DP3 result.texcoord[2].x, R1, $transposedModelMatrix_x; # DP3 result.texcoord[2].y, R1, $transposedModelMatrix_y; # DP3 result.texcoord[2].z, R1, $transposedModelMatrix_z; DP3 R1.w, R1, R1; RSQ R0.w, R1.w; MUL result.texcoord[2].w, R0.w, R1.w; # tangent->world matrix DP3 result.texcoord[3].x, $tangentAttrib, $transposedModelMatrix_x; DP3 result.texcoord[3].y, bitangent, $transposedModelMatrix_x; DP3 result.texcoord[3].z, $normalAttrib, $transposedModelMatrix_x; DP3 result.texcoord[4].x, $tangentAttrib, $transposedModelMatrix_y; DP3 result.texcoord[4].y, bitangent, $transposedModelMatrix_y; DP3 result.texcoord[4].z, $normalAttrib, $transposedModelMatrix_y; DP3 result.texcoord[5].x, $tangentAttrib, $transposedModelMatrix_z; DP3 result.texcoord[5].y, bitangent, $transposedModelMatrix_z; DP3 result.texcoord[5].z, $normalAttrib, $transposedModelMatrix_z; MOV result.color, $colorAttrib; # this doesn't even change per vertex so don't bother to calculate it per pixel # texture 1 takes the deform magnitude and scales it by the projection distance PARAM vec = { 1, 0, 0, 1 }; MOV R0, vec; DP4 R0.z, $positionAttrib, 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 R1, R1, $water_distortion; MUL result.texcoord[1], R1, $currentRenderTexelSize; $if ( r_megaDrawMethod != 0 ) TEMP _F1, _F2; SUB _F2, $positionAttrib, $viewOrigin; DP3 _F1.x, _F2, _F2; RSQ _F1.y, _F1.x; MUL _F1.x, _F1.y, _F1.x; MAD result.color.secondary, _F1.x, $fogDepths.z, $fogDepths.w; $endif SUB result.texcoord[6], $positionAttrib, $viewOrigin; %> } program fragment arb { <% OPTION ARB_precision_hint_fastest; TEMP R0, R1, R2, R3, R4, eye, mix, spec; MUL R0.x, $foliageHackDistance, $foliageHackDistance; DP3 R1.x, fragment.texcoord[6], fragment.texcoord[6]; SUB R2.x, R1, R0; KIL R2.x; TEMP blend; MUL_SAT blend, R2.x, 0.0001; # get normals from normal maps TEX R0, fragment.texcoord[0], $bumpMap, 2D; TEX R1, fragment.texcoord[0], $bumpMap2, 2D; # interpolate LRP R2, $water_lerp, R1, R0; $if !r_dxnNormalMaps MOV R2.x, R2.a; $endif MAD R2, R2, 2, -1; MUL R2.xy, R2, $water_distortion.z; MUL_SAT R0.a, fragment.texcoord[2].w, 0.000001; SUB R1, 0, R2; MAD R2, R2, R0.a, R1; $if r_normalizeNormalMaps TEMP NR1; MOV R2.z, 0; DP3 NR1.x, R2,R2; ADD NR1.x, 1, -NR1.x; RSQ NR1.x, NR1.x; RCP R2.z, NR1.x; $endif # put in world space DP3 R1.x, R2, fragment.texcoord[3]; DP3 R1.y, R2, fragment.texcoord[4]; DP3 R1.z, R2, fragment.texcoord[5]; # warped texcoords #MUL R4, fragment.texcoord[1].w, $water_distortion; #MAD R3, R1, R4, fragment.texcoord[1]; $if ( r_shaderQuality < 2 ) MUL R3, $water_distortion, $currentRenderTexelSize; MUL R3, R3, fragment.color.r; MAD R3, R3, R1, fragment.position; $else MOV R3, fragment.position; $endif # normalize to eye $if ( r_shaderQuality < 2 ) DP3 eye.w, fragment.texcoord[2], fragment.texcoord[2]; RSQ eye.w, eye.w; MUL eye, fragment.texcoord[2], eye.w; $else MOV eye, fragment.texcoord[2]; $endif # calc reflection vector: i - 2 * dot(i, n) * n DP3 R2, eye, R1; MUL R2, R2, 2; MAD R4, -R1, R2.x, eye; #spec $if ( r_shaderQuality < 1 ) DP3_SAT R0, R4, $sunDirection; TEX spec, R0, $map, 2D; MUL spec, spec, $sunColor; MUL spec, spec, $water_glare; MUL spec, spec, fragment.color.r; $endif # reflect refract mixing (sorta fresnel) $if ( r_shaderQuality < 2 ) DP3 R1, -eye, R1; ADD R1, R1, 1; POW R1, R1.x, $water_fresnel.x; RCP_SAT mix, R1.x; MUL mix, mix, fragment.color.r; $else MOV mix, 0.125; $endif MUL mix, mix, blend.x; MUL spec, spec, blend.x; # lookup textures and interpolate TEX R1, R3, $currentRender, RECT; #MUL R1, R1, $water_tint; #modulate with water color TEX R2, R4, $environmentCubeMap, CUBE; SUB R3, R2, R1; MAD R3, R3, mix, R1; TEMP _finalcolor; $if ( r_shaderQuality < 1 ) ADD _finalcolor, R3, spec; $else MOV _finalcolor, R3; $endif ADD result.color.a, spec.r, spec.g; $if ( r_megaDrawMethod != 0 ) MUL R1.x, fragment.color.secondary.x, blend.x; LRP result.color.rgb, R1.x, $fogColor, _finalcolor; $else MOV result.color.rgb, _finalcolor; $endif #TEX R1, fragment.position, $currentRender, RECT; #MOV result.color, R1; %> } } /* A static surface with cubemap reflections, interpolates between two normal maps for the refraction/reflection vector */ renderProgram water/simple_cube_interpolate_imgseq { program vertex reference water/simple_cube program fragment arb { <% OPTION ARB_precision_hint_fastest; TEMP R0, R1, R2, R3, R4, eye, mix, spec; $if ( r_shaderQuality < 1 ) # get normals from normal maps TEX R0, fragment.texcoord[0], $imgSequenceCur, 2D; TEX R1, fragment.texcoord[0], $imgSequenceNext, 2D; # interpolate LRP R2, $imgSequenceBlend, R1, R0; $if !r_dxnNormalMaps MOV R2.x, R2.a; $endif MAD R2, R2, 2, -1; $else TEX R2, fragment.texcoord[0], $imgSequenceCur, 2D; $if !r_dxnNormalMaps MOV R2.x, R2.a; $endif MAD R2, R2, 2, -1; $endif MUL R2.xy, R2, $water_distortion.z; MUL_SAT R0.a, fragment.texcoord[2].w, 0.0001; SUB R1, 0, R2; MAD R2, R2, R0.a, R1; $if r_normalizeNormalMaps TEMP NR1; MOV R2.z, 0; DP3 NR1.x, R2,R2; ADD NR1.x, 1, -NR1.x; RSQ NR1.x, NR1.x; RCP R2.z, NR1.x; $endif # put in world space DP3 R1.x, R2, fragment.texcoord[3]; DP3 R1.y, R2, fragment.texcoord[4]; DP3 R1.z, R2, fragment.texcoord[5]; # warped texcoords #MUL R4, fragment.texcoord[1].w, $water_distortion; #MAD R3, R1, R4, fragment.texcoord[1]; MUL R3, $water_distortion, $currentRenderTexelSize; MUL R3, R3, fragment.color.r; MAD R3, R3, R1, fragment.position; # normalize to eye DP3 eye.w, fragment.texcoord[2], fragment.texcoord[2]; RSQ eye.w, eye.w; MUL eye, fragment.texcoord[2], eye.w; # calc reflection vector: i - 2 * dot(i, n) * n DP3 R2, eye, R1; MUL R2, R2, 2; MAD R4, -R1, R2.x, eye; $if ( r_shaderQuality < 1 ) DP3_SAT R0, R4, $sunDirection; TEX spec, R0, $map, 2D; MUL spec, spec, $sunColor; MUL spec, spec, $water_glare; MUL spec, spec, fragment.color.r; $endif # reflect refract mixing (sorta fresnel) DP3 R1, -eye, R1; ADD R1, R1, 1; POW R1, R1.x, $water_fresnel.x; RCP_SAT mix, R1.x; MUL mix, mix, fragment.color.r; # lookup textures and interpolate TEX R1, R3, $currentRender, RECT; MUL R1, R1, $water_tint; #modulate with water color TEX R2, R4, $environmentCubeMap, CUBE; SUB R3, R2, R1; MAD R3, R3, mix, R1; $if ( r_shaderQuality < 1 ) ADD result.color, R3, spec; $else MOV result.color, R3; $endif ADD result.color.a, spec.r, spec.g; #MUL result.color.rgb, fragment.texcoord[2].w, 0.00005; %> } } ////////////////////////////////////////////////////////// //// Shoreline stuff ////////////////////////////////////////////////////////// renderProgram water/shoreline_froth { program vertex arb { <% OPTION ARB_position_invariant; TEMP R0, R1, R2, bitangent; XPD bitangent, $normalAttrib, $tangentAttrib; MUL bitangent, bitangent, $tangentAttrib.w; # bumpmap texture coords DP4 result.texcoord[0].x, $texCoordAttrib, $diffuseMatrix_s; DP4 result.texcoord[0].y, $texCoordAttrib, $diffuseMatrix_t; # vector to eye SUB R1, $positionAttrib, $viewOrigin; DP3 result.texcoord[3].x, R1, $transposedModelMatrix_x; DP3 result.texcoord[3].y, R1, $transposedModelMatrix_y; DP3 result.texcoord[3].z, R1, $transposedModelMatrix_z; # tangent->world matrix DP3 result.texcoord[4].x, $tangentAttrib, $transposedModelMatrix_x; DP3 result.texcoord[4].y, bitangent, $transposedModelMatrix_x; DP3 result.texcoord[4].z, $normalAttrib, $transposedModelMatrix_x; DP3 result.texcoord[5].x, $tangentAttrib, $transposedModelMatrix_y; DP3 result.texcoord[5].y, bitangent, $transposedModelMatrix_y; DP3 result.texcoord[5].z, $normalAttrib, $transposedModelMatrix_y; DP3 result.texcoord[6].x, $tangentAttrib, $transposedModelMatrix_z; DP3 result.texcoord[6].y, bitangent, $transposedModelMatrix_z; DP3 result.texcoord[6].z, $normalAttrib, $transposedModelMatrix_z; MAD R0, $colorAttrib, $colorModulate, $colorAdd; MUL result.color, $diffuseColor, R0; %> } program fragment arb { <% OPTION ARB_precision_hint_fastest; TEMP R0, R1, R2, R3, R4, eye, mix, spec; # get diffuse TEX R1, fragment.texcoord[0], $diffuseMap, 2D; # get normal from normal map TEX R0, fragment.texcoord[0], $bumpMap, 2D; $if !r_dxnNormalMaps MOV R0.x, R0.a; $endif MAD R2, R0, 2, -1; $if r_normalizeNormalMaps TEMP NR1; MOV R2.z, 0; DP3 NR1.x, R2,R2; ADD NR1.x, 1, -NR1.x; RSQ NR1.x, NR1.x; RCP R2.z, NR1.x; $endif # put in world space DP3 R0.x, R2, fragment.texcoord[4]; DP3 R0.y, R2, fragment.texcoord[5]; DP3 R0.z, R2, fragment.texcoord[6]; # normalize to eye DP3 eye.w, fragment.texcoord[3], fragment.texcoord[3]; RSQ eye.w, eye.w; MUL eye, fragment.texcoord[3], eye.w; # calc reflection vector: i - 2 * dot(i, n) * n DP3 R2, eye, R0; MUL R2, R2, 2; MAD R4, -R0, R2.x, eye; # specular DP3_SAT R0, R4, $sunDirection; TEX spec, R0, $map, 2D; MUL spec, spec, $sunColor; MUL spec, spec, $water_glare; MUL spec, spec, fragment.color.r; MOV spec.a, 0; ADD result.color, spec, R1; MUL result.color.a, R1, fragment.color.a; #MOV result.color, fragment.color.a; #MAD result.color, R4, 0.5, 0.5; %> } } renderProgram water/shoreline_wetshine { program vertex arb { <% OPTION ARB_position_invariant; TEMP R0, R1, R2, bitangent; XPD bitangent, $normalAttrib, $tangentAttrib; MUL bitangent, bitangent, $tangentAttrib.w; # bumpmap texture coords DP4 result.texcoord[0].x, $texCoordAttrib, $diffuseMatrix_s; DP4 result.texcoord[0].y, $texCoordAttrib, $diffuseMatrix_t; # sand texture coords DP4 result.texcoord[1].x, $texCoordAttrib, $bumpMatrix_s; DP4 result.texcoord[1].y, $texCoordAttrib, $bumpMatrix_t; # vector to eye SUB R1, $positionAttrib, $viewOrigin; DP3 result.texcoord[3].x, R1, $transposedModelMatrix_x; DP3 result.texcoord[3].y, R1, $transposedModelMatrix_y; DP3 result.texcoord[3].z, R1, $transposedModelMatrix_z; # tangent->world matrix DP3 result.texcoord[4].x, $tangentAttrib, $transposedModelMatrix_x; DP3 result.texcoord[4].y, bitangent, $transposedModelMatrix_x; DP3 result.texcoord[4].z, $normalAttrib, $transposedModelMatrix_x; DP3 result.texcoord[5].x, $tangentAttrib, $transposedModelMatrix_y; DP3 result.texcoord[5].y, bitangent, $transposedModelMatrix_y; DP3 result.texcoord[5].z, $normalAttrib, $transposedModelMatrix_y; DP3 result.texcoord[6].x, $tangentAttrib, $transposedModelMatrix_z; DP3 result.texcoord[6].y, bitangent, $transposedModelMatrix_z; DP3 result.texcoord[6].z, $normalAttrib, $transposedModelMatrix_z; MAD R0, $colorAttrib, $colorModulate, $colorAdd; MUL result.color, $diffuseColor, R0; %> } program fragment arb { <% OPTION ARB_precision_hint_fastest; TEMP R0, R1, R2, R3, R4, eye, mix, spec; # get diffuse-mask TEX R1, fragment.texcoord[0], $diffuseMap, 2D; # get normal from normal map TEX R0, fragment.texcoord[1], $bumpMap, 2D; $if !r_dxnNormalMaps MOV R0.x, R0.a; $endif MAD R2, R0, 2, -1; $if r_normalizeNormalMaps TEMP NR1; MOV R2.z, 0; DP3 NR1.x, R2,R2; ADD NR1.x, 1, -NR1.x; RSQ NR1.x, NR1.x; RCP R2.z, NR1.x; $endif # put in world space DP3 R0.x, R2, fragment.texcoord[4]; DP3 R0.y, R2, fragment.texcoord[5]; DP3 R0.z, R2, fragment.texcoord[6]; # normalize to eye DP3 eye.w, fragment.texcoord[3], fragment.texcoord[3]; RSQ eye.w, eye.w; MUL eye, fragment.texcoord[3], eye.w; # calc reflection vector: i - 2 * dot(i, n) * n DP3 R2, eye, R0; MUL R2, R2, 2; MAD R4, -R0, R2.x, eye; # specular DP3_SAT R0, R4, $sunDirection; TEX spec, R0, $map, 2D; MUL spec, spec, $sunColor; MUL spec, spec, $water_glare; MUL spec, spec, R1.x; MUL result.color, spec, fragment.color.r; %> } } renderProgram water/runningwater { program vertex arb { <% OPTION ARB_position_invariant; TEMP R0, R1; DP4 result.texcoord.x, $texCoordAttrib, $diffuseMatrix_s; DP4 result.texcoord.y, $texCoordAttrib, $diffuseMatrix_t; TEMP bitangent; XPD bitangent, $normalAttrib, $tangentAttrib; MUL bitangent, bitangent, $tangentAttrib.w; # vector to eye SUB R1, $positionAttrib, $viewOrigin; DP3 result.texcoord[3].x, R1, $transposedModelMatrix_x; DP3 result.texcoord[3].y, R1, $transposedModelMatrix_y; DP3 result.texcoord[3].z, R1, $transposedModelMatrix_z; # tangent->world matrix DP3 result.texcoord[4].x, $tangentAttrib, $transposedModelMatrix_x; DP3 result.texcoord[4].y, bitangent, $transposedModelMatrix_x; DP3 result.texcoord[4].z, $normalAttrib, $transposedModelMatrix_x; DP3 result.texcoord[5].x, $tangentAttrib, $transposedModelMatrix_y; DP3 result.texcoord[5].y, bitangent, $transposedModelMatrix_y; DP3 result.texcoord[5].z, $normalAttrib, $transposedModelMatrix_y; DP3 result.texcoord[6].x, $tangentAttrib, $transposedModelMatrix_z; DP3 result.texcoord[6].y, bitangent, $transposedModelMatrix_z; DP3 result.texcoord[6].z, $normalAttrib, $transposedModelMatrix_z; MAD R0, $colorAttrib, $colorModulate, $colorAdd; MUL result.color, $diffuseColor, R0; %> } program fragment arb { <% # get diffuse-mask TEMP diffuse, test, R0, R2; TEX diffuse, fragment.texcoord[0], $diffuseMap, 2D; SUB test, diffuse.w, 0.001; KIL test.w; TEX R0, fragment.texcoord[0], $bumpMap, 2D; MOV R0.x, R0.a; MAD R2, R0, 2, -1; $if r_normalizeNormalMaps TEMP NR1; MOV R2.z, 0; DP3 NR1.x, R2,R2; ADD NR1.x, 1, -NR1.x; RSQ NR1.x, NR1.x; RCP R2.z, NR1.x; $endif MAD R0, R2, $water_distortion, fragment.position; TEMP scr; TEX scr, R0, $currentRender, RECT; # put in world space TEMP worldNormal; DP3 worldNormal.x, R2, fragment.texcoord[4]; DP3 worldNormal.y, R2, fragment.texcoord[5]; DP3 worldNormal.z, R2, fragment.texcoord[6]; # normalize to eye TEMP eye; DP3 eye.w, fragment.texcoord[3], fragment.texcoord[3]; RSQ eye.w, eye.w; MUL eye, fragment.texcoord[3], eye.w; TEMP reflection; # calc reflection vector: i - 2 * dot(i, n) * n DP3 R2, eye, worldNormal; MUL R2, R2, 2; MAD reflection, -worldNormal, R2.x, eye; TEMP specdp; DP3_SAT specdp, reflection, $sunDirectionWorld; MUL specdp, specdp, specdp; MUL specdp, specdp, specdp; MUL specdp, specdp, diffuse.a; MUL specdp, specdp, $water_glare; TEMP combined; MAD combined, diffuse, fragment.color, scr; ADD result.color, combined, specdp; %> } } renderProgram water/runningwaterEnv { program vertex reference water/runningwater program fragment arb { <% # get diffuse-mask TEMP diffuse, test, R0, R1, R2, mix; TEX diffuse, fragment.texcoord[0], $diffuseMap, 2D; SUB test, diffuse.w, 0.000001; KIL test.w; TEX R0, fragment.texcoord[0], $bumpMap, 2D; MOV R0.x, R0.a; MAD R2, R0, 2, -1; $if r_normalizeNormalMaps TEMP NR1; MOV R2.z, 0; DP3 NR1.x, R2,R2; ADD NR1.x, 1, -NR1.x; RSQ NR1.x, NR1.x; RCP R2.z, NR1.x; $endif MAD R0, R2, $water_distortion, fragment.position; TEMP scr; TEX scr, R0, $currentRender, RECT; # put in world space TEMP worldNormal; DP3 worldNormal.x, R2, fragment.texcoord[4]; DP3 worldNormal.y, R2, fragment.texcoord[5]; DP3 worldNormal.z, R2, fragment.texcoord[6]; # normalize to eye TEMP eye; DP3 eye.w, fragment.texcoord[3], fragment.texcoord[3]; RSQ eye.w, eye.w; MUL eye, fragment.texcoord[3], eye.w; TEMP reflection; # calc reflection vector: i - 2 * dot(i, n) * n DP3 R2, eye, worldNormal; MUL R2, R2, 2; MAD reflection, -worldNormal, R2.x, eye; # reflect refract mixing (sorta fresnel) DP3 R1, -eye, worldNormal; ADD R1, R1, 1; POW R1, R1.x, $water_fresnel.x; RCP_SAT mix, R1.x; TEMP specdp; DP3_SAT specdp, reflection, $sunDirectionWorld; MUL specdp, specdp, specdp; MUL specdp, specdp, specdp; MUL specdp, specdp, diffuse.a; MUL specdp, specdp, $water_glare; TEMP env; TEX env, reflection, $environmentCubeMap, CUBE; TEMP combined; MUL combined, diffuse, fragment.color; # MUL combined, combined, R0; # MAD combined, v2n, env, combined; ADD combined, combined, scr; ADD result.color, combined, specdp; TEMP invmix; SUB invmix, 1, mix; MUL combined, combined, invmix; MAD result.color, env, mix, combined; MOV result.color.a, diffuse; %> } }