-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdielectric.cpp
More file actions
25 lines (18 loc) · 923 Bytes
/
dielectric.cpp
File metadata and controls
25 lines (18 loc) · 923 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "dielectric.h"
#include "utility.h"
bool Dielectric::scatter(const Ray& r_in, const HitRecord& rec, QVector3D& colorAttenuation, Ray& scattered) const
{
colorAttenuation = QVector3D(1.0, 1.0, 1.0);
double refractionRatio = rec.frontFace() ? (1.0/_refractionIndex) : _refractionIndex;
QVector3D unitDirection = Utility::unitVector(r_in.direction());
double cosTheta = fmin(Utility::dot(-unitDirection, rec.normal()), 1.0);
double sinTheta = sqrt(1.0 - cosTheta*cosTheta);
bool cannotRefract = refractionRatio * sinTheta > 1.0;
QVector3D direction;
if (cannotRefract || Utility::reflectance(cosTheta, refractionRatio) > Utility::randomDouble())
direction = Utility::reflect(unitDirection, rec.normal());
else
direction = Utility::refract(unitDirection, rec.normal(), refractionRatio);
scattered = Ray(rec.pointsInRange(), direction);
return true;
}