Implements SunLight
This commit is contained in:
parent
e5575c03f5
commit
d7d38944ea
3 changed files with 53 additions and 1 deletions
|
@ -21,6 +21,7 @@
|
||||||
#include "common/noise/perlinnoise.h"
|
#include "common/noise/perlinnoise.h"
|
||||||
#include "shader/noiseshader.h"
|
#include "shader/noiseshader.h"
|
||||||
#include "common/noise/cloudnoise.h"
|
#include "common/noise/cloudnoise.h"
|
||||||
|
#include "light/sunlight.h"
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
@ -28,7 +29,7 @@ int main()
|
||||||
scene.setBackgroundColor(Color(0.529f, 0.808f, 0.922f));
|
scene.setBackgroundColor(Color(0.529f, 0.808f, 0.922f));
|
||||||
|
|
||||||
// Add lights
|
// Add lights
|
||||||
auto mainLight = std::make_shared<PointLight>(Vector3d(5.0f, 10.0f, 0.0f), 100.0f);
|
auto mainLight = std::make_shared<SunLight>(Vector3d(1.0f, -1.0f, -1.0f), 10.0f);
|
||||||
scene.add(mainLight);
|
scene.add(mainLight);
|
||||||
scene.add(std::make_shared<AmbientLight>(0.3f));
|
scene.add(std::make_shared<AmbientLight>(0.3f));
|
||||||
|
|
||||||
|
|
31
light/sunlight.cpp
Normal file
31
light/sunlight.cpp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#include "sunlight.h"
|
||||||
|
|
||||||
|
|
||||||
|
SunLight::SunLight(Vector3d const &direction, float intensity, Color const &color) : Light(intensity, color),
|
||||||
|
direction(normalized(direction))
|
||||||
|
{}
|
||||||
|
|
||||||
|
Light::Illumination SunLight::illuminate(Scene const &scene, Ray const &ray) const
|
||||||
|
{
|
||||||
|
Vector3d const target = ray.origin + (ray.length - LGT_EPS) * ray.direction;
|
||||||
|
|
||||||
|
// Illumination object
|
||||||
|
Illumination illum;
|
||||||
|
illum.direction = this->direction;
|
||||||
|
|
||||||
|
// Define a secondary ray from the surface point to the light source.
|
||||||
|
Ray lightRay;
|
||||||
|
lightRay.origin = target;
|
||||||
|
lightRay.direction = -illum.direction;
|
||||||
|
lightRay.length = INFINITY;
|
||||||
|
|
||||||
|
// If the target is not in shadow...
|
||||||
|
if (!scene.findOcclusion(lightRay))
|
||||||
|
{
|
||||||
|
// Look at angleIntensity of light
|
||||||
|
float angleIntensity = dotProduct(-ray.normal,
|
||||||
|
this->direction); // 0 if light is behind surface, 1 if light is in front of surface
|
||||||
|
illum.color = this->color * this->intensity * angleIntensity;
|
||||||
|
}
|
||||||
|
return illum;
|
||||||
|
}
|
20
light/sunlight.h
Normal file
20
light/sunlight.h
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
#ifndef CG1_TRACER_SUNLIGHT_H
|
||||||
|
#define CG1_TRACER_SUNLIGHT_H
|
||||||
|
|
||||||
|
#include "scene/scene.h"
|
||||||
|
#include "light.h"
|
||||||
|
|
||||||
|
class SunLight : public Light
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SunLight(Vector3d const &direction, float intensity, Color const &color = Color(1, 1, 1));
|
||||||
|
|
||||||
|
// Light functions
|
||||||
|
Illumination illuminate(Scene const &scene, Ray const &ray) const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Vector3d direction;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //CG1_TRACER_SUNLIGHT_H
|
Loading…
Reference in a new issue