Unravel Engine C++ Reference
Loading...
Searching...
No Matches
gradient.h
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4#include <vector>
5#include <algorithm>
6#include <cmath>
7#include "color.h"
8
9namespace math
10{
11using namespace glm;
12
13
14template<typename T>
15auto gradient_lerp(const T& start, const T& end, float progress) -> T;
16// {
17// static_assert(false, "gradient_lerp is not implemented for this type");
18// return T();
19// }
20
26
27template<typename T>
29{
30 float progress = 0.0;
32};
33
34template<typename T>
35inline auto operator<(const gradient_point<T>& lhs, const gradient_point<T>& rhs) noexcept -> bool
36{
37 return lhs.progress < rhs.progress;
38}
39
40template<typename T>
41inline auto operator==(const gradient_point<T>& lhs, const gradient_point<T>& rhs) noexcept -> bool
42{
43 return math::epsilonEqual(lhs.progress, rhs.progress, math::epsilon<float>()) &&
44 lhs.element == rhs.element;
45}
46
47template<typename T>
49{
50public:
52 using points_t = std::vector<point_t>;
53
54 auto add_point(const T& element, float progress) -> size_t;
55 void remove_point(int index);
56
57 void set_points(const points_t& points);
58 auto get_points() const noexcept -> const points_t&;
59
60 void set_progress(int index, float progress);
61 auto get_progress(int index) -> float;
62
63 void set_element(int index, const T& element);
64 auto get_element(int index) -> T;
65
66 void reverse();
67
68 auto is_valid() const noexcept -> bool;
69 auto sample(float progress) const -> T;
70
73
74 // LUT functionality
75 void generate_lut(size_t lut_size = 256);
76 void clear_lut();
77 bool has_lut() const noexcept { return !lut_.empty(); }
78
79 auto operator==(const gradient<T>& other) const -> bool;
80private:
81 points_t points_{};
83
84 // LUT cache for O(1) sampling
85 mutable std::vector<T> lut_;
86 mutable size_t lut_size_ = 0;
87 mutable bool lut_dirty_ = true;
88
89 // Internal methods
90 void regenerate_lut_if_needed() const;
91 T sample_from_lut(float progress) const;
92 T sample_original(float progress) const;
93 void mark_lut_dirty() const { lut_dirty_ = true; }
94};
95
96} // namespace math
97
98#include "gradient.hpp"
void set_progress(int index, float progress)
Definition gradient.hpp:62
auto get_points() const noexcept -> const points_t &
Definition gradient.hpp:45
auto get_progress(int index) -> float
Definition gradient.hpp:75
auto is_valid() const noexcept -> bool
Definition gradient.hpp:109
auto operator==(const gradient< T > &other) const -> bool
Definition gradient.hpp:210
void set_element(int index, const T &element)
Definition gradient.hpp:86
auto add_point(const T &element, float progress) -> size_t
Definition gradient.hpp:8
std::vector< point_t > points_t
Definition gradient.h:52
auto get_interpolation_mode() const noexcept -> gradient_interpolation_mode_t
Definition gradient.hpp:204
void generate_lut(size_t lut_size=256)
Definition gradient.hpp:222
bool has_lut() const noexcept
Definition gradient.h:77
void set_interpolation_mode(gradient_interpolation_mode_t mode)
Definition gradient.hpp:197
auto get_element(int index) -> T
Definition gradient.hpp:98
void set_points(const points_t &points)
Definition gradient.hpp:37
void remove_point(int index)
Definition gradient.hpp:24
auto sample(float progress) const -> T
Definition gradient.hpp:115
Definition bbox.cpp:5
auto gradient_lerp(const vec4 &start, const vec4 &end, float progress) -> vec4
Definition gradient.cpp:8
auto operator==(const gradient_point< T > &lhs, const gradient_point< T > &rhs) noexcept -> bool
Definition gradient.h:41
gradient_interpolation_mode_t
Definition gradient.h:22
auto operator<(const gradient_point< T > &lhs, const gradient_point< T > &rhs) noexcept -> bool
Definition gradient.h:35