////////////////////////////////////////////////////////////////////////// // add a light to 'current' light argb in r11 and light specular in r10 // ////////////////////////////////////////////////////////////////////////// // get unclamped range mag + normalize DirToLight add r0, LIGHT_CONST0, -v0 // DirToLight = LightPos - Vector dp3 r1.x, r0, r0 // DirToLightLenSquared = DirToLight | DirToLight rsq r1.y, r1.x // OneOverDirToLightLen = 1.0f / sqrt(DirToLightLenSquared) mad r9.y, -r1.x, LIGHT_CONST0.w, v0.w // RangeMag = 1.0f - (DirToLightLenSquared * OneOverRangeSquared) mul r0, r0, r1.y // DirToLight *= OneOverDirToLightLen // get unclamped normal mag dp3 r9.x, v1, r0 // NormalMag = Normal | DirToLight // get unclamped spot mag dp3 r1.z, LIGHT_CONST1, r0 // Ang = LightDir | DirToLight add r1.w, r1.z, -v0.w // Ang -= 1.0f mad r8.x, r1.w, LIGHT_CONST1.w, v0.w // SpotMag = Ang * PiOverConeAng + 1.0f // get unclamped specular mag add r1, r0, c4 // Half = DirToLight + CameraLook dp3 r2.x, r1, r1 // HalfLenSquared = Half | Half rsq r2.y, r2.x // OneOverHalfLen = 1.0f / sqrt(HalfLenSquared) dp3 r2.z, v1, r1 // Ang = Normal | Half mul r8.y, r2.z, r2.y // SpecMag = Ang * OneOverHalfLen // clamp mags + raise range and specular mags to their powers lit r7, r9 lit r6, r8 // modulate range and spot mags mul r1.x, r6.y, r7.z // RangeSpotMag = RangeMag * SpotMag // add final diffuse to current mul r1.y, r1.x, r7.y // FinalMag = RangeSpotMag * NormalMag mad r11, r1.y, LIGHT_CONST2, r11 // CurrentLightDiffuse += LightARGB * FinalMag // add final specular to current mul r1.y, r1.x, r6.z // FinalMag = RangeSpotMag * SpecMag mad r10, r1.y, LIGHT_CONST2, r10 // CurrentLightSpecular += LightARGB * FinalMag