|
@@ -10,7 +10,7 @@
|
|
#include <material.h>
|
|
#include <material.h>
|
|
#include <colour.h>
|
|
#include <colour.h>
|
|
|
|
|
|
-Colour Material::lighting(Light light, Tuple point, Tuple eyeVector, Tuple normalVector)
|
|
|
|
|
|
+Colour Material::lighting(Light light, Tuple point, Tuple eyeVector, Tuple normalVector, bool inShadow)
|
|
{
|
|
{
|
|
Tuple lightVector = (light.position - point).normalise();
|
|
Tuple lightVector = (light.position - point).normalise();
|
|
Tuple reflectVector = Tuple(0, 0, 0, 0);
|
|
Tuple reflectVector = Tuple(0, 0, 0, 0);
|
|
@@ -25,31 +25,33 @@ Colour Material::lighting(Light light, Tuple point, Tuple eyeVector, Tuple norma
|
|
|
|
|
|
ambientColour = effectiveColour * this->ambient;
|
|
ambientColour = effectiveColour * this->ambient;
|
|
|
|
|
|
- lightDotNormal = lightVector.dot(normalVector);
|
|
|
|
-
|
|
|
|
- if (lightDotNormal < 0)
|
|
|
|
- {
|
|
|
|
- diffuseColour = Colour(0, 0, 0);
|
|
|
|
- specularColour = Colour(0, 0, 0);
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
|
|
+ if (!inShadow)
|
|
{
|
|
{
|
|
- diffuseColour = effectiveColour * this->diffuse * lightDotNormal;
|
|
|
|
- reflectVector = -lightVector.reflect(normalVector);
|
|
|
|
|
|
+ lightDotNormal = lightVector.dot(normalVector);
|
|
|
|
|
|
- reflectDotEye = reflectVector.dot(eyeVector);
|
|
|
|
-
|
|
|
|
- if (reflectDotEye < 0)
|
|
|
|
|
|
+ if (lightDotNormal < 0)
|
|
{
|
|
{
|
|
|
|
+ diffuseColour = Colour(0, 0, 0);
|
|
specularColour = Colour(0, 0, 0);
|
|
specularColour = Colour(0, 0, 0);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- double factor = pow(reflectDotEye, this->shininess);
|
|
|
|
- specularColour = light.intensity * this->specular * factor;
|
|
|
|
|
|
+ diffuseColour = effectiveColour * this->diffuse * lightDotNormal;
|
|
|
|
+ reflectVector = -lightVector.reflect(normalVector);
|
|
|
|
+
|
|
|
|
+ reflectDotEye = reflectVector.dot(eyeVector);
|
|
|
|
+
|
|
|
|
+ if (reflectDotEye < 0)
|
|
|
|
+ {
|
|
|
|
+ specularColour = Colour(0, 0, 0);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ double factor = pow(reflectDotEye, this->shininess);
|
|
|
|
+ specularColour = light.intensity * this->specular * factor;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
finalColour = ambientColour + diffuseColour + specularColour;
|
|
finalColour = ambientColour + diffuseColour + specularColour;
|
|
|
|
|
|
return Colour(finalColour.x, finalColour.y, finalColour.z);
|
|
return Colour(finalColour.x, finalColour.y, finalColour.z);
|