material.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /*
  2. * DoRayMe - a quick and dirty Raytracer
  3. * Material implementation
  4. *
  5. * Created by Manoël Trapier
  6. * Copyright (c) 2020 986-Studio.
  7. *
  8. */
  9. #include <tuple.h>
  10. #include <material.h>
  11. #include <colour.h>
  12. Colour Material::lighting(Light light, Tuple point, Tuple eyeVector, Tuple normalVector, bool inShadow)
  13. {
  14. Tuple lightVector = (light.position - point).normalise();
  15. Tuple reflectVector = Tuple(0, 0, 0, 0);
  16. Tuple effectiveColour = this->colour * light.intensity;
  17. Tuple ambientColour = Colour(0, 0, 0);
  18. Tuple diffuseColour = Colour(0, 0, 0);
  19. Tuple specularColour = Colour(0, 0, 0);
  20. Tuple finalColour = Colour(0, 0, 0);
  21. double lightDotNormal, reflectDotEye;
  22. ambientColour = effectiveColour * this->ambient;
  23. if (!inShadow)
  24. {
  25. lightDotNormal = lightVector.dot(normalVector);
  26. if (lightDotNormal < 0)
  27. {
  28. diffuseColour = Colour(0, 0, 0);
  29. specularColour = Colour(0, 0, 0);
  30. }
  31. else
  32. {
  33. diffuseColour = effectiveColour * this->diffuse * lightDotNormal;
  34. reflectVector = -lightVector.reflect(normalVector);
  35. reflectDotEye = reflectVector.dot(eyeVector);
  36. if (reflectDotEye < 0)
  37. {
  38. specularColour = Colour(0, 0, 0);
  39. }
  40. else
  41. {
  42. double factor = pow(reflectDotEye, this->shininess);
  43. specularColour = light.intensity * this->specular * factor;
  44. }
  45. }
  46. }
  47. finalColour = ambientColour + diffuseColour + specularColour;
  48. return Colour(finalColour.x, finalColour.y, finalColour.z);
  49. }