$rayLight = new Ray($pntHit, new Vector()); foreach (Light::$list as $lightName => $light) { $rayLight->directionVector = new Vector($light->position, $pntHit); $fLightProjection = $rayLight->directionVector->dotProduct($vctNormal); if ($fLightProjection <= 0){ continue; } $lightDist = $rayLight->directionVector->dotProduct($rayLight->directionVector); //{ if ($lightDist == 0) { continue; } $fTemp = invsqrt($lightDist); $lightRay->directionVector->multiply($fTemp); $fLightProjection = $fTemp * $fLightProjection; //} $inShadow = false; //{ $t = $lightDist; foreach (Sphere::$list as $sphereName => $sphere) { if ($sphere->hitTest($rayLight, $t)) { $inShadow = true; break; } } //} if (!inShadow) { $lambert = $rayLight->directionVector->dotProduct($vctNormal) * $coef; $output = $light->colour->multiply($matCurrentMaterial->colour, true)->multiply($rayLight->directionVector->dotProduct($vctNormal) * $coef, true); $fViewProjection = $rayView->directionVector * $vctNormal; $blinnDir = $rayLight->directionVector - $rayView->directionVector; $fTemp = $blinnDir * $blinnDir; if ($fTemp != 0) { $blinn = invsqrt($fTemp) * max($fLightProjection - $fViewProjection , 0); $blinn = $coef * pow($blinn, $matCurrentMaterial->specularity); $output->add($matCurrentMaterial->specularColour->multiply($light->colour, true)->multiply($blinn, true)); } } } $vctLightDist = new Vector($light->position, $pntNewStart); if ($vctNormal->dotProduct($vctLightDist) <= 0.0) { continue; } $t = sqrt($vctLightDist->dotProduct($vctLightDist)); if ($t <= 0.0 ) { continue; } $rayLight = new Ray($pntNewStart, $vctLightDist->multiply(invsqrt($t), true)); //Compute shadow $inShadow = false; foreach (Sphere::$list as $sphereName => $sphere) { if ($sphere->hitTest($rayLight, $t)) { $inShadow = true; break; } } if (!$inShadow) { // lambert $lambert = $rayLight->directionVector->dotProduct($vctNormal) * $coef; $output->add($light->colour->multiply($matCurrentMaterial->colour, true)->multiply($lambert)); }