diff --git a/intern/cycles/kernel/light/spot.h b/intern/cycles/kernel/light/spot.h index 0e6ea5b5669..8dc65168358 100644 --- a/intern/cycles/kernel/light/spot.h +++ b/intern/cycles/kernel/light/spot.h @@ -9,11 +9,13 @@ CCL_NAMESPACE_BEGIN /* Transform vector to spot light's local coordinate system. */ -ccl_device float3 spot_light_to_local(const ccl_global KernelSpotLight *spot, const float3 ray) +ccl_device float3 spot_light_to_local(const ccl_global KernelLight *klight, const float3 ray) { - return safe_normalize(make_float3(dot(ray, spot->scaled_axis_u), - dot(ray, spot->scaled_axis_v), - dot(ray, spot->dir * spot->inv_len_z))); + const Transform itfm = klight->itfm; + float3 transformed_ray = safe_normalize(transform_direction(&itfm, ray)); + transformed_ray.z = -transformed_ray.z; + + return transformed_ray; } /* Compute spot light attenuation of a ray given in local coordinate system. */ @@ -92,7 +94,7 @@ ccl_device_inline bool spot_light_sample(const ccl_global KernelLight *klight, } /* Attenuation. */ - const float3 local_ray = spot_light_to_local(&klight->spot, -ls->D); + const float3 local_ray = spot_light_to_local(klight, -ls->D); if (d_sq > r_sq) { ls->eval_fac *= spot_light_attenuation(&klight->spot, local_ray); } @@ -128,7 +130,7 @@ ccl_device_inline bool spot_light_sample(const ccl_global KernelLight *klight, ls->Ng = -ls->D; /* Attenuation. */ - const float3 local_ray = spot_light_to_local(&klight->spot, -ls->D); + const float3 local_ray = spot_light_to_local(klight, -ls->D); ls->eval_fac *= spot_light_attenuation(&klight->spot, local_ray); if (!in_volume_segment && ls->eval_fac == 0.0f) { return false; @@ -196,7 +198,7 @@ ccl_device_forceinline void spot_light_mnee_sample_update(const ccl_global Kerne } /* Attenuation. */ - const float3 local_ray = spot_light_to_local(&klight->spot, -ls->D); + const float3 local_ray = spot_light_to_local(klight, -ls->D); if (use_attenuation) { ls->eval_fac *= spot_light_attenuation(&klight->spot, local_ray); } @@ -248,7 +250,7 @@ ccl_device_inline bool spot_light_sample_from_intersection( } /* Attenuation. */ - const float3 local_ray = spot_light_to_local(&klight->spot, -ray_D); + const float3 local_ray = spot_light_to_local(klight, -ray_D); if (!klight->spot.is_sphere || d_sq > r_sq) { ls->eval_fac *= spot_light_attenuation(&klight->spot, local_ray); } diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h index 6f581ac2611..c44c571426e 100644 --- a/intern/cycles/kernel/types.h +++ b/intern/cycles/kernel/types.h @@ -1367,14 +1367,11 @@ typedef struct KernelCurveSegment { static_assert_align(KernelCurveSegment, 8); typedef struct KernelSpotLight { - packed_float3 scaled_axis_u; - float radius; - packed_float3 scaled_axis_v; - float eval_fac; packed_float3 dir; + float radius; + float eval_fac; float cos_half_spot_angle; float half_cot_half_spot_angle; - float inv_len_z; float spot_smooth; int is_sphere; } KernelSpotLight; diff --git a/intern/cycles/scene/light.cpp b/intern/cycles/scene/light.cpp index fe72ef704db..0dc5e231162 100644 --- a/intern/cycles/scene/light.cpp +++ b/intern/cycles/scene/light.cpp @@ -1346,22 +1346,12 @@ void LightManager::device_update_lights(Device *device, DeviceScene *dscene, Sce klights[light_index].area.normalize_spread = normalize_spread; } if (light->light_type == LIGHT_SPOT) { - /* Scale axes to accommodate non-uniform scaling. */ - float3 scaled_axis_u = light->get_axisu() / len_squared(light->get_axisu()); - float3 scaled_axis_v = light->get_axisv() / len_squared(light->get_axisv()); - float len_z; - /* Keep direction normalized. */ - float3 dir = safe_normalize_len(light->get_dir(), &len_z); - float cos_half_spot_angle = cosf(light->spot_angle * 0.5f); float spot_smooth = 1.0f / ((1.0f - cos_half_spot_angle) * light->spot_smooth); - klights[light_index].spot.scaled_axis_u = scaled_axis_u; - klights[light_index].spot.scaled_axis_v = scaled_axis_v; - klights[light_index].spot.dir = dir; + klights[light_index].spot.dir = safe_normalize(light->get_dir()); klights[light_index].spot.cos_half_spot_angle = cos_half_spot_angle; klights[light_index].spot.half_cot_half_spot_angle = 0.5f / tanf(light->spot_angle * 0.5f); - klights[light_index].spot.inv_len_z = 1.0f / len_z; klights[light_index].spot.spot_smooth = spot_smooth; }