@@ -1082,16 +1082,25 @@ namespace dxvk {
10821082
10831083 uint32_t delta = m_module.opFSub (m_vec3Type, position, vtx3);
10841084 uint32_t d = m_module.opLength (m_floatType, delta);
1085+ if (m_vsKey.Data .Contents .UseLegacyLights && m_vsKey.Data .Contents .IsD3DLight2 ) {
1086+ d = m_module.opFSub (m_floatType, range, d);
1087+ d = m_module.opFDiv (m_floatType, d, range);
1088+ }
10851089 uint32_t hitDir = m_module.opFNegate (m_vec3Type, direction);
10861090 hitDir = m_module.opSelect (m_vec3Type, isDirectional3, hitDir, delta);
10871091 hitDir = m_module.opNormalize (m_vec3Type, hitDir);
10881092
10891093 uint32_t atten = m_module.opFFma (m_floatType, d, atten2, atten1);
10901094 atten = m_module.opFFma (m_floatType, d, atten, atten0);
1091- atten = m_module.opFDiv (m_floatType, m_module.constf32 (1 .0f ), atten);
1095+ if (m_vsKey.Data .Contents .UseLegacyLights )
1096+ atten = m_module.opFDiv (m_floatType, m_module.constf32 (1 .0f ), atten);
10921097 atten = m_module.opNMin (m_floatType, atten, m_module.constf32 (FLT_MAX));
10931098
1094- atten = m_module.opSelect (m_floatType, m_module.opFOrdGreaterThan (bool_t , d, range), m_module.constf32 (0 .0f ), atten);
1099+ if (m_vsKey.Data .Contents .UseLegacyLights && m_vsKey.Data .Contents .IsD3DLight2 )
1100+ atten = m_module.opSelect (m_floatType, m_module.opFOrdLessThan (bool_t , d, m_module.constf32 (0 .0f )), m_module.constf32 (0 .0f ), atten);
1101+ else
1102+ atten = m_module.opSelect (m_floatType, m_module.opFOrdGreaterThan (bool_t , d, range), m_module.constf32 (0 .0f ), atten);
1103+
10951104 atten = m_module.opSelect (m_floatType, isDirectional, m_module.constf32 (1 .0f ), atten);
10961105
10971106 // Spot Lighting
@@ -1130,6 +1139,8 @@ namespace dxvk {
11301139 uint32_t midDot = m_module.opDot (m_floatType, normal, mid);
11311140 midDot = m_module.opFClamp (m_floatType, midDot, m_module.constf32 (0 .0f ), m_module.constf32 (1 .0f ));
11321141 uint32_t doSpec = m_module.opFOrdGreaterThan (bool_t , midDot, m_module.constf32 (0 .0f ));
1142+ if (m_vsKey.Data .Contents .UseLegacyLights )
1143+ doSpec = m_module.opLogicalAnd (bool_t , doSpec, m_module.opFOrdGreaterThan (bool_t , m_vs.constants .materialPower , m_module.constf32 (0.0 )));
11331144 uint32_t specularness = m_module.opPow (m_floatType, midDot, m_vs.constants .materialPower );
11341145 specularness = m_module.opFMul (m_floatType, specularness, atten);
11351146 specularness = m_module.opSelect (m_floatType, doSpec, specularness, m_module.constf32 (0 .0f ));
0 commit comments