Midway hittable list inclusion

This commit is contained in:
David 2021-08-21 00:20:51 +02:00
commit 8c1324c074
6 changed files with 141 additions and 2 deletions

View file

@ -1,4 +1,4 @@
raytracer: main.cpp vec3.hpp color.hpp ray.hpp
raytracer: main.cpp vec3.hpp color.hpp ray.hpp hittable.hpp sphere.hpp hittable_list.hpp
@g++ -g -Wall -Wextra -Wpedantic main.cpp -o raytracer
image: raytracer

16
hittable.cpp Normal file
View file

@ -0,0 +1,16 @@
#ifndef HITTABLE_H
#define HITTABLE_H
#include "ray.h"
struct hit_record {
point3 p;
vec3 normal;
double t;
};
struct hittable {
virtual bool hit(const ray& r, double t_min, double t_max, hit_record& rec) const = 0;
};
#endif

25
hittable.hpp Normal file
View file

@ -0,0 +1,25 @@
#ifndef HITTABLE_H
#define HITTABLE_H
#include "ray.hpp"
/* Representation of a hitpoint of a ray against a hittable object */
struct hit_record {
point3 p;
vec3 normal;
double t;
bool front_face;
inline void set_face_normal(const ray& r, const vec3& outward_normal)
{
front_face = dot(r.direction, outward_normal) < 0;
normal = front_face ? outward_normal : -outward_normal;
}
};
/* Virtual class that represents objects who could collide against a ray */
struct hittable {
virtual bool hit(const ray& r, double t_min, double t_max, hit_record& rec) const = 0;
};
#endif

45
hittable_list.hpp Normal file
View file

@ -0,0 +1,45 @@
#ifndef HITTABLE_LIST_H
#define HITTABLE_LIST_H
#include "hittable.hpp"
#include <memory>
#include <vector>
using std::shared_ptr;
using std::make_shared;
struct hittable_list : hittable {
/* Attributes */
std::vector<shared_ptr<hittable>> objects;
/* Constructor */
hittable_list(shared_ptr<hittable> h) { add(h); }
/* Methods */
void clear() { objects.clear(); }
void add (shared_ptr<hittable> h) { objects.push_back(h); }
virtual bool hit(const ray& r, double t_min, double t_max, hit_record& rec) const override;
};
bool hittable_list::hit(const ray& r, double t_min, double t_max, hit_record& rec) const
{
hit_record temp_rec;
bool hit_anything = false;
double closest_so_far = t_max;
for (const auto& object : objects)
{
if (object->hit(r, t_min, closest_so_far, temp_rec))
{
hit_anything = true;
closest_so_far = temp_rec.t;
rec = temp_rec;
}
}
return hit_anything;
}
#endif

53
sphere.hpp Normal file
View file

@ -0,0 +1,53 @@
#ifndef SPHERE_H
#define SPHERE_H
#include "hittable.hpp"
#include "vec3.hpp"
struct sphere : hittable {
/* Attributes */
point3 center;
double radius;
/* Contructor */
sphere(point3 c, double r)
{
center = c;
radius = r;
}
/* Virtual methods declaration */
virtual bool hit(const ray& r, double t_min, double t_max, hit_record& rec) const override;
};
/* Virtual method implementations */
bool sphere::hit(const ray& r, double t_min, double t_max, hit_record& rec) const
{
vec3 oc = r.origin - center;
double a = r.direction.length_squared();
double half_b = dot(oc, r.direction);
double c = oc.length_squared() - radius*radius;
double discriminant = half_b*half_b - a*c;
if (discriminant < 0)
return false;
double sqrtd = sqrt(discriminant);
// Find the nearest root that lies in the acceptable range
double root = (-half_b - sqrtd) / a;
if (root < t_min || t_max < root)
{
root = (-half_b + sqrtd) / a;
if (root < t_min || t_max < root)
return false;
}
rec.t = root;
rec.p = r.at(rec.t);
vec3 outward_normal = (rec.p - center) / radius;
rec.set_face_normal(r, outward_normal);
return true;
}
#endif

View file

@ -21,7 +21,7 @@ struct vec3 {
/* Overriden operators */
// - operator. Not to be confused with substraction
vec3 operator-()
vec3 operator-() const
{
return vec3(-x, -y, -z);
}