// Copyright (C) 2001 by Housemarque, Inc. All rights reserved. // c0-c3 : transform // c4-c7 : UV projection // c8 : point light data // c9 : light_color, dir_light_flag // c10 : normalized light dir // c11 : [ inv_light_dist, y offset, 0, 1 ] // v0 : vertex pos xvs.1.1 #define porkkana #ifdef porkkana m4x4 oT0, v0, c4 #else mov oT0, v2 #endif // Pointlighting ; LIGHT DISTANCE dp4 r9.z, v0, c10 ; FALLOFF ; scale = (dist-start)/(end-start) = dist/(end - start) - start / (end - start) #define FALLOFF_RESULT r11.x mov r4, c8 ; c8 = 1/(f-n), n/(f-n), log10(2), player <-> light distance mad r10.x, r9.z, r4.x, -r4.y ; scale: distance/(f-n) - n/(f-n) ~= (distance-n)/(n-f) ; falloff = 1.0f - Clamp(scale) min r10.x, c11.w, r10.x ; clamp below : r10.x >= 0 max r10.x, c11.z, r10.x ; clamp above : r10.x <= 1 add FALLOFF_RESULT, c11.w, -r10.x ; 1 - scale == falloff ; ATTENUATION #define ATTENUATION_RESULT r5.x ; factor = log(1+distance) add r5.y, r9.z, c11.w ; 1 + dist logp r7, r5.y ; log2 (1+dist) mul r5.w, r7.z, r4.z ; log (1+dist) == factor ; attenuation = 1 / (1+factor^2) mad r5.y, r5.w, r5.w, c11.w ; 1 + (factor^2) rcc ATTENUATION_RESULT, r5.y ; 1 / (1+factor^2) ; FINAL LIGHTING ; final lighting = attenuation * falloff * color #define TOTAL_ATTENUATION r8 max FALLOFF_RESULT, c9.w, FALLOFF_RESULT max ATTENUATION_RESULT, c9.w, ATTENUATION_RESULT mul TOTAL_ATTENUATION, FALLOFF_RESULT, ATTENUATION_RESULT; mul oD0.xyz, c9.xyz, TOTAL_ATTENUATION ;mov oD0.xyz, c9.xyz #define ANGLE_FACTOR r3.w ; Fade by light angle dp3 r2.w, v1, v1 rcc r2.w, r2.w mul r2, v1, r2.w dp3 ANGLE_FACTOR, -c10, r2 ;mul oD0.w, r3.w, mov oD0.w, ANGLE_FACTOR // Position // r9 <- position + ground offset add r9, v0, c11.zyzz m4x4 oPos, r9, c0