Skip to content

File xdz_math.h

File List > extra > xdz_math.h

Go to the documentation of this file

#pragma once

#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"
#include "glm/gtc/quaternion.hpp"
#include "glm/gtx/euler_angles.hpp"
#include "glm/gtx/rotate_vector.hpp"

#include "macros.h"
#include "operator.h"

#include <random>

namespace xdzm {
    inline float sin01(float in) {
        return (glm::sin(in) + 1) / 2;
    }

    template<typename _Ele>
    inline _Ele map01_11(_Ele inp) {
        return inp * _Ele(2) - _Ele(1);
    }

    inline float map(float inp, float i_min, float i_max, float o_min, float o_max) {
        float re = (inp - i_min) / (i_max - i_min);
        return re * (o_max - o_min) + o_min;
    }

    template<float i_min, float i_max, float o_min, float o_max>
    inline float map(float inp) {
        float re = (inp - i_min) / (i_max - i_min);
        return re * (o_max - o_min) + o_min;
    }

    inline float rand01() {
        std::mt19937 rng(std::random_device{}());
        return std::uniform_real_distribution<float>{0.f, 1.f}(rng);
    }

    inline float rand11() {
        return map01_11(rand01());
    }

    inline glm::vec2 rand2() {
        return { rand11(), rand11() };
    }

    inline glm::vec3 rand3() {
        return { rand11(), rand11(), rand11() };
    }

    inline glm::vec3 rand3n(float r = 1.0f) {
        return r * glm::normalize(rand3());
    }

    inline glm::vec3 rand3nh(float r = 1.0f) {
        glm::vec3 _rand = rand3();
        _rand.z = _rand.z / 2.0f + 0.5f;
        return r * glm::normalize(_rand);
    }

    inline std::vector<glm::vec3> rand3nv(size_t s) {
        std::vector<glm::vec3> res(s);
        LOOP(s) res[i] = rand3n();
        return res;
    }

    inline std::vector<glm::vec3> rand3nhv(size_t s) {
        std::vector<glm::vec3> res(s);
        LOOP(s) res[i] = rand3nh();
        return res;
    }

    inline std::vector<glm::vec3> rand3hKernel(size_t s) {
        std::vector<glm::vec3> res(s);
        const float r = rand01() * 0.7f + 0.3f;
        LOOP(s) res[i] = r * r * rand3nh();
        return res;
    }

    inline glm::vec4 rand4() {
        return { rand11(), rand11(), rand11(), rand11() };
    }

    inline glm::vec3 ImVec4_vec3(const ImVec4& color, float fac = 1.0f) {

        return fac * glm::vec3(color.x, color.y, color.z);
    }

    inline glm::vec3 ImVec4_vec3_Uni(const ImVec4& color, const float& fac) {

        return glm::vec3(color.x * fac - 0.5f * fac, color.y * fac - 0.5f * fac, color.z * fac - 0.5f * fac);
    }

    inline glm::vec3 stdVec3_vec3(const std::vector<float>& inp) {
        return glm::vec3{ inp[0], inp[1], inp[2] };
    }

    inline std::vector<float> vec3_stdVec3(const glm::vec3& inp) {
        return std::vector<float>{  inp[0], inp[1], inp[2]};
    }

    inline std::vector<float> vec3_stdVec6(const glm::vec3& inp, const glm::vec3& inp2) {

        return std::vector<float>{inp[0], inp[1], inp[2], inp2[0], inp2[1], inp2[2]};
    }

    inline float float_dist(const float& a, const float& b) {
        return glm::sqrt(a * a + b * b);
    }

    inline float dir_float_dist(const float& a, const float& b) {
        return b > a ? -float_dist(a, b) : float_dist(a, b);
    }

    inline glm::vec3 get_id_color(const int id){
        const int R = id % 256;
        const int G = ((id - R) / 256) % 256;
        const int B = (id - R - G * 256) / 256 / 256;

        return glm::vec3(R, G, B);
    }

    inline glm::vec3 get_random_color(const int id) {
        glm::vec3 id_color = get_id_color(id);
        glm::vec3 q = glm::fract(id_color * glm::vec3(0.1031f, 0.11369f, 0.13787f));
        q += glm::dot(q, glm::vec3(q.y, q.z, q.x) + 19.19f);

        return glm::fract(glm::vec3(
            (q.x + q.y) * q.z,
            (q.x + q.z) * q.y,
            (q.y + q.z) * q.x
        ));
    }
}