diff --git a/.gitignore b/.gitignore index db24cfc..c65ce39 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ build/ *.ppm +*.zip diff --git a/src/Light.cc b/src/Light.cc new file mode 100644 index 0000000..dddb575 --- /dev/null +++ b/src/Light.cc @@ -0,0 +1,9 @@ +#include "Light.h" + +void Light::setTransform(const Matrix4f &transform) { + this->transform = transform; +} + +void Light::setGridSize(unsigned int gridSize) { this->gridSize = gridSize; } + +void Light::setUseCenter(bool useCenter) { this->useCenter = useCenter; } diff --git a/src/Light.h b/src/Light.h new file mode 100644 index 0000000..31ec15a --- /dev/null +++ b/src/Light.h @@ -0,0 +1,60 @@ +#ifndef LIGHT_H_ +#define LIGHT_H_ + +#include + +using Eigen::Matrix; +using Eigen::Matrix4f; +using Eigen::Vector3f; + +// Abstract base class for Lights +class Light { +public: + enum class Type { Point, Area }; + + virtual ~Light() = default; + // a pure virtual function for derived class implementation + virtual void illumination() const = 0; + +protected: + Light(Type type, const Vector3f &id, const Vector3f &is) + : type(type), diffuse(id), specular(is) {} + + Type type; + Vector3f diffuse; // mandatory member `id` + Vector3f specular; // mandatory member `is` + Matrix4f transform = Matrix4f::Identity(); // optional member `transform` + unsigned int gridSize = 0; // optional member `n` + bool useCenter = false; // optional member `usecenter` + +public: + // setters for optional members + void setTransform(const Matrix4f &); + void setGridSize(unsigned int); + void setUseCenter(bool); +}; + +class PointLight : public Light { +public: + PointLight(const Vector3f &id, const Vector3f &is, Vector3f ¢er) + : Light(Type::Point, id, is), center(center) {} + + virtual void illumination() const override; + +private: + Vector3f center; +}; + +class AreaLight : public Light { +public: + AreaLight(const Vector3f &id, const Vector3f &is, + const Matrix &corners) + : Light(Type::Area, id, is), corners(corners) {} + + virtual void illumination() const override; + +private: + Matrix corners; // stores `p1`, `p2`, `p3` and `p4` +}; + +#endif // !LIGHT_H_ diff --git a/src/RayTracer.h b/src/RayTracer.h index 8300f13..91dbcb3 100644 --- a/src/RayTracer.h +++ b/src/RayTracer.h @@ -7,12 +7,12 @@ class RayTracer { public: RayTracer(const nlohmann::json &); - void render(); void run(); private: Scene scene; nlohmann::json json; + void render(); }; #endif // !RAY_TRACER_H_