Files
PhotonMF/sphere.cpp

53 lines
1.4 KiB
C++
Raw Normal View History

#include <iostream>
#include <glm/gtc/constants.hpp>
2016-12-25 21:47:28 -04:00
#include "sphere.hpp"
#include "sampling.hpp"
2016-12-25 21:47:28 -04:00
2017-01-09 12:54:19 -04:00
using namespace glm;
2016-12-26 15:41:29 -04:00
2016-12-26 19:14:21 -04:00
bool Sphere::intersect(Ray & r, float & t) const {
2016-12-26 20:58:51 -04:00
float t1, t2;
2016-12-25 21:47:28 -04:00
float d;
float a = (r.m_direction.x * r.m_direction.x) +
(r.m_direction.y * r.m_direction.y) +
(r.m_direction.z * r.m_direction.z);
float b = (2 * r.m_direction.x * (r.m_origin.x - m_center.x)) +
(2 * r.m_direction.y * (r.m_origin.y - m_center.y)) +
(2 * r.m_direction.z * (r.m_origin.z - m_center.z));
float c = (m_center.x * m_center.x) +
(m_center.y * m_center.y) +
(m_center.z * m_center.z) +
(r.m_origin.x * r.m_origin.x) +
(r.m_origin.y * r.m_origin.y) +
(r.m_origin.z * r.m_origin.z) -
2 * ((m_center.x * r.m_origin.x) + (m_center.y * r.m_origin.y) + (m_center.z * r.m_origin.z)) - (m_radius * m_radius);
d = (b * b) - (4 * a * c);
2016-12-26 15:41:29 -04:00
if (d >= 0.0f) {
2016-12-26 20:58:51 -04:00
t1 = (-b - sqrt(d)) / (2 * a);
t2 = (-b + sqrt(d)) / (2 * a);
t = t1 < t2 ? t1 : t2;
2016-12-26 17:43:57 -04:00
return t >= 0.0f;
2016-12-25 21:47:28 -04:00
2016-12-26 17:43:57 -04:00
} else
return false;
2016-12-25 21:47:28 -04:00
}
2016-12-26 19:14:21 -04:00
vec3 Sphere::normal_at_int(Ray & r, float & t) const {
vec3 i = vec3(r.m_origin + (t * r.m_direction));
return normalize(vec3((i - m_center) / m_radius));
}
vec3 Sphere::sample_at_surface() const {
2017-03-15 10:40:34 -04:00
return sample_sphere(m_center, m_radius);
}
void Sphere::calculate_inv_area() {
m_inv_area = 1.0f / (4.0 * pi<float>() * (m_radius * m_radius));
}