@@ -291,15 +291,18 @@ void SoftRasterizer::Scene::setProjectionMatrix(float fovy, float zNear,
291291std::vector<SoftRasterizer::light_struct> SoftRasterizer::Scene::loadLights () {
292292 std::vector<SoftRasterizer::light_struct> res (m_lights.size ());
293293 std::transform (m_lights.begin (), m_lights.end (), res.begin (),
294- [](const decltype (m_lights)::value_type &light) {
295- return *light.second ;
294+ [&](const decltype (m_lights)::value_type &light) {
295+ SoftRasterizer::light_struct lightObj = *(light.second );
296+ auto MVP = m_projection * m_view * light.second ->getModelMatrix ();
297+ lightObj.position = Tools::to_vec3 (MVP * glm::vec4 (light.second ->position , 1 .0f ));
298+ return lightObj;
296299 });
297300 return res;
298301}
299302
300303void SoftRasterizer::Scene::initCameraLight () {
301304 m_cameraLight.reset ();
302- m_cameraLight = std::make_shared<light_struct>(m_eye, glm::vec3 (0 .f ));
305+ m_cameraLight = std::make_shared<light_struct>(m_eye, glm::vec3 (0 .f ), /* axis= */ glm::vec3 ( 0 , 1 , 0 ) );
303306
304307 addLight (" sys_camera" , m_cameraLight);
305308}
@@ -435,9 +438,7 @@ glm::vec3 SoftRasterizer::Scene::whittedRayTracing(
435438 [&](const tbb::blocked_range<std::size_t > &range,
436439 glm::vec3 local_sum) -> glm::vec3 {
437440 for (std::size_t i = range.begin (); i < range.end (); ++i) {
438- glm::vec3 lightDir = lights[i].position - hitPoint;
439- float distance = glm::dot (lightDir, lightDir);
440- lightDir = glm::normalize (lightDir);
441+ glm::vec3 lightDir = glm::normalize (lights[i].position - hitPoint);
441442
442443 // Diffuse reflection (Lambertian)
443444 float diff = std::max (0 .f , glm::dot (N, lightDir));
@@ -452,9 +453,16 @@ glm::vec3 SoftRasterizer::Scene::whittedRayTracing(
452453 // Shadow test
453454 Ray shadow_ray (shadowCoord, lightDir);
454455 Intersection shadow_result = traceScene (shadow_ray);
455- bool is_shadow =
456- shadow_result.intersected &&
457- (std::pow (shadow_result.intersect_time , 2 .f ) < distance);
456+ if (!shadow_result.intersected ) {
457+ return glm::vec3{ 0 .f };
458+ }
459+
460+ double distance2Light = glm::length2 (lights[i].position - hitPoint);
461+ double shadowDistance = glm::length2 (shadow_result.coords - shadowCoord);
462+ bool is_shadow = std::abs (shadowDistance - distance2Light) > 1e-2f ;
463+
464+ // spdlog::info("ShadowSquare = {}, distance = {}, delta = {}",
465+ // shadowDistance, distance2Light, shadowDistance - distance2Light);
458466
459467 // Compute light contribution
460468 glm::vec3 ambient =
0 commit comments