From 8c3cbfaeec0f3055aba9bfe4b2bdfab7ff93bf1b Mon Sep 17 00:00:00 2001 From: Keuin Date: Tue, 12 Apr 2022 23:04:25 +0800 Subject: Refactor: move hitlist, object, sphere, viewport into single files. Add bias_ctx for setting sub-pixel sampling bias. --- hitlist.h | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 hitlist.h (limited to 'hitlist.h') diff --git a/hitlist.h b/hitlist.h new file mode 100644 index 0000000..18a8226 --- /dev/null +++ b/hitlist.h @@ -0,0 +1,73 @@ +// +// Created by Keuin on 2022/4/12. +// + +#ifndef RT_HITLIST_H +#define RT_HITLIST_H + +#include "viewport.h" +#include "timer.h" +#include "bitmap.h" +#include "ray.h" +#include "vec.h" +#include "object.h" +#include +#include +#include +#include +#include +#include + + +// A world +class hitlist { + std::vector> objects; + +public: + hitlist() = default; + + hitlist(hitlist &other) = delete; // do not copy the world + + // Add an object to the world. + void add_object(std::shared_ptr &&obj) { + objects.push_back(std::move(obj)); + } + + // Given a ray, compute the color. + pixel8b color(const ray3d &r) const { + // Detect hits + bool hit = false; + double hit_t = std::numeric_limits::infinity(); + std::shared_ptr hit_obj; + // Check the nearest object we hit + for (const auto &obj: objects) { + double t_; + if (obj->hit(r, t_, 0.0) && t_ < hit_t) { + hit = true; + hit_t = t_; + hit_obj = obj; + } + } + if (hit) { + // normal vector on hit point + const auto nv = hit_obj->normal_vector(r.at(hit_t)); +// return obj->color(); + // visualize normal vector at hit point + return pixel8b::from_normalized(nv); + } + + + // Does not hit anything. Get background color (infinity) + const auto u = (r.direction().y + 1.0) * 0.5; + return mix( + pixel8b::from_normalized(1.0, 1.0, 1.0), + pixel8b::from_normalized(0.5, 0.7, 1.0), + 1.0 - u, + u + ); + } + + +}; + +#endif //RT_HITLIST_H -- cgit v1.2.3