material.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. #include <shape.h>
  13. Colour Material::lighting(Light light, Tuple point, Tuple eyeVector, Tuple normalVector, Shape *hitObject, bool inShadow)
  14. {
  15. Colour pointColor = this->colour;
  16. if (this->pattern != nullptr)
  17. {
  18. pointColor = this->pattern->patternAtObject(hitObject, point);
  19. }
  20. Tuple lightVector = (light.position - point).normalise();
  21. Tuple reflectVector = Tuple(0, 0, 0, 0);
  22. Tuple effectiveColour = pointColor * light.intensity;
  23. Tuple ambientColour = Colour(0, 0, 0);
  24. Tuple diffuseColour = Colour(0, 0, 0);
  25. Tuple specularColour = Colour(0, 0, 0);
  26. Tuple finalColour = Colour(0, 0, 0);
  27. double lightDotNormal, reflectDotEye;
  28. ambientColour = effectiveColour * this->ambient;
  29. if (!inShadow)
  30. {
  31. lightDotNormal = lightVector.dot(normalVector);
  32. if (lightDotNormal < 0)
  33. {
  34. diffuseColour = Colour(0, 0, 0);
  35. specularColour = Colour(0, 0, 0);
  36. }
  37. else
  38. {
  39. diffuseColour = effectiveColour * this->diffuse * lightDotNormal;
  40. reflectVector = -lightVector.reflect(normalVector);
  41. reflectDotEye = reflectVector.dot(eyeVector);
  42. if (reflectDotEye < 0)
  43. {
  44. specularColour = Colour(0, 0, 0);
  45. }
  46. else
  47. {
  48. double factor = pow(reflectDotEye, this->shininess);
  49. specularColour = light.intensity * this->specular * factor;
  50. }
  51. }
  52. }
  53. finalColour = ambientColour + diffuseColour + specularColour;
  54. return Colour(finalColour.x, finalColour.y, finalColour.z);
  55. }