#pragma once #include #include #include #define M_PI 3.14159265358979323846 constexpr float kInfinity = std::numeric_limits::max(); inline float clamp(const float& lo, const float& hi, const float& v) { return std::max(lo, std::min(hi, v)); } inline bool solveQuadratic(const float& a, const float& b, const float& c, float& x0, float& x1) { float discr = b * b - 4 * a * c; if (discr < 0) return false; else if (discr == 0) x0 = x1 = -0.5 * b / a; else { float q = (b > 0) ? -0.5 * (b + sqrt(discr)) : -0.5 * (b - sqrt(discr)); x0 = q / a; x1 = c / q; } if (x0 > x1) std::swap(x0, x1); return true; } enum MaterialType { DIFFUSE_AND_GLOSSY, REFLECTION_AND_REFRACTION, REFLECTION }; inline float get_random_float() { std::random_device dev; std::mt19937 rng(dev()); std::uniform_real_distribution dist(0.f, 1.f); // distribution in range [1, 6] return dist(rng); } inline void UpdateProgress(float progress) { int barWidth = 70; std::cout << "["; int pos = barWidth * progress; for (int i = 0; i < barWidth; ++i) { if (i < pos) std::cout << "="; else if (i == pos) std::cout << ">"; else std::cout << " "; } std::cout << "] " << int(progress * 100.0) << " %\r"; std::cout.flush(); }