#pragma once #include #include "./vec.hpp" struct Screen { const int W, H; const choice_t ASPECT_RATIO; constexpr Screen(int W, int H, choice_t ASPECT_RATIO) : W(W), H(H), ASPECT_RATIO(ASPECT_RATIO) {} }; struct Camera { v3 pos; v3 rotation; v3 translation{0,0,0}; choice_t zoom = 0.5; choice_t exposure = -0.6; choice_t dynamic_range = 1; }; struct Material { choice_t specular = 0.1; choice_t roughness = 0.5; choice_t ior = 1.2; choice_t transparency = 0.8; v3 colour; }; struct Renderable { Material specs; Renderable(const Material& specs); virtual int intersect(const v3& eye, const v3& dir, choice_t& hit_dist, v3& hit_loc, v3& hit_normal)=0; /** Like #intersect, but for transmission rays inside the object. #eye must be on the surface of the object. */ virtual int transmit(const v3& eye, const v3& dir, choice_t& hit_dist, v3& hit_loc, v3& hit_normal) { return -1; } }; /** Shoots a ray from #eye in direction #dir, (possibly) hitting the closest object from #objs. Expects #dir to be normalised. The hit object's distance, location, normal and type will be written in the references so-aptly named. If nothing was hit, the contents of those variables is UB. Returns the pointer to the object it hit, or `nullptr' otherwise. Respects the initial value of #hit_dist, et al. Optional parameter #self is a pointer to an object considered 'self' that will be skipped during collision checks. The objects are compared by pointer address. */ Renderable* shoot_ray_into_objects(const v3& eye, const v3& dir, const std::vector& objs, choice_t& hit_dist, v3& hit_loc, v3& hit_normal, int& hit_type, Renderable* self = nullptr); /** Shoots a ray from #eye in (unit) direction #dir into a #scene and returns the colour of that ray. #scene must be #objects u #lights. #depth is how much the ray tracer is allowed to recurse. */ v3 ray_trace(const v3& eye, const v3& dir, const std::vector& scene, const std::vector& objects, const std::vector& lights, int depth, Renderable* skip = nullptr, choice_t* dist_to_hit = nullptr); choice_t ggx_ndf(const v3& dir, const v3& h, const v3& normal, choice_t roughness); choice_t blinn_phong_ndf(const v3& dir, const v3& h, const v3& normal, choice_t roughness); choice_t cook_torrance_gaf(const v3& dir, const v3& h, const v3& normal, const v3& light); choice_t cook_torrance_fresnel(const v3& dir, const v3& h, choice_t ior); v3 cook_torrance(const v3& dir, const v3& normal, const v3& light, choice_t specular, choice_t roughness, choice_t ior, const v3& light_colour, const v3& surface_colour);