void AddEmitSurfaceLights( const Vector &vStart, Vector lightBoxColor[6] ) { fltx4 fractionVisible; FourVectors vStart4, wlOrigin4; vStart4.DuplicateVector ( vStart ); for ( int iLight=0; iLight < *pNumworldlights; iLight++ ) { dworldlight_t *wl = &dworldlights[iLight]; // Should this light even go in the ambient cubes? if ( !( wl->flags & DWL_FLAGS_INAMBIENTCUBE ) ) continue; Assert( wl->type == emit_surface ); // Can this light see the point? wlOrigin4.DuplicateVector ( wl->origin ); TestLine ( vStart4, wlOrigin4, &fractionVisible ); if ( !TestSignSIMD ( CmpGtSIMD ( fractionVisible, Four_Zeros ) ) ) continue; // Add this light's contribution. Vector vDelta = wl->origin - vStart; float flDistanceScale = Engine_WorldLightDistanceFalloff( wl, vDelta ); Vector vDeltaNorm = vDelta; VectorNormalize( vDeltaNorm ); float flAngleScale = Engine_WorldLightAngle( wl, wl->normal, vDeltaNorm, vDeltaNorm ); float ratio = flDistanceScale * flAngleScale * SubFloat ( fractionVisible, 0 ); if ( ratio == 0 ) continue; for ( int i=0; i < 6; i++ ) { float t = DotProduct( g_BoxDirections[i], vDeltaNorm ); if ( t > 0 ) { lightBoxColor[i] += wl->intensity * (t * ratio); } } } }
void AddEmitSurfaceLights( const Vector &vStart, Vector lightBoxColor[6] ) { int iThread = 0; for ( int iLight=0; iLight < *pNumworldlights; iLight++ ) { dworldlight_t *wl = &dworldlights[iLight]; // Should this light even go in the ambient cubes? if ( !( wl->flags & DWL_FLAGS_INAMBIENTCUBE ) ) continue; Assert( wl->type == emit_surface ); // Can this light see the point? if ( TestLine( vStart, wl->origin, 0, iThread ) != CONTENTS_EMPTY ) continue; // Add this light's contribution. Vector vDelta = wl->origin - vStart; float flDistanceScale = Engine_WorldLightDistanceFalloff( wl, vDelta ); Vector vDeltaNorm = vDelta; VectorNormalize( vDeltaNorm ); float flAngleScale = Engine_WorldLightAngle( wl, wl->normal, vDeltaNorm, vDeltaNorm ); float ratio = flDistanceScale * flAngleScale; if ( ratio == 0 ) continue; for ( int i=0; i < 6; i++ ) { float t = DotProduct( g_BoxDirections[i], vDeltaNorm ); if ( t > 0 ) { lightBoxColor[i] += wl->intensity * (t * ratio); } } } }