libNeon
Loading...
Searching...
No Matches
matrix_fx.hpp
Go to the documentation of this file.
1//
2// Created by spak on 10/6/21.
3//
4
5#ifndef NEO_MATRIX_FX_HPP
6#define NEO_MATRIX_FX_HPP
7
8#include <chrono>
9#include <functional>
10#include <mlab/bin_data.hpp>
11#include <mlab/unique_tracker.hpp>
12#include <mutex>
13#include <neo/gradient.hpp>
14#include <neo/strip.hpp>
15
16namespace neo {
17 namespace {
18 using namespace std::chrono_literals;
19 }
20
21 class matrix_fx : public mlab::uniquely_tracked {
22 std::vector<neo::rgb> _matrix = {};
23 std::size_t _width = 0;
24 std::size_t _height = 0;
25 std::chrono::milliseconds _duration_x = 0ms;
26 std::chrono::milliseconds _duration_y = 0ms;
27 float _repeats_x = 1.f;
28 mutable std::recursive_mutex _matrix_mutex = {};
29
30 public:
31 matrix_fx() = default;
32
33 matrix_fx(std::vector<neo::rgb> matrix, std::size_t width, std::chrono::milliseconds duration_x = 1s,
34 std::chrono::milliseconds duration_y = 1s, float repeats_x = 1.f);
35
36 matrix_fx(matrix_fx &&other) noexcept;
37
38 matrix_fx &operator=(matrix_fx &&other) noexcept;
39
40 [[nodiscard]] inline float repeats_x() const;
41
42 [[nodiscard]] inline std::size_t width() const;
43
44 [[nodiscard]] inline std::size_t height() const;
45
46 [[nodiscard]] inline std::chrono::milliseconds duration_x() const;
47
48 [[nodiscard]] inline std::chrono::milliseconds duration_y() const;
49
50 inline void set_repeats_x(float n);
51
52 inline void set_duration_x(std::chrono::milliseconds d);
53
54 inline void set_duration_y(std::chrono::milliseconds d);
55
56 [[nodiscard]] inline std::vector<rgb> get_matrix() const;
57
58 void set_matrix(std::vector<rgb> m, std::size_t w);
59
60 void resample(std::size_t new_width, std::size_t new_height, blending_method method = blend_linear);
61
62 void tile(float overlap_x, float overlap_y);
63
64 [[nodiscard]] rgb sample(float x, float y, blending_method method = blend_linear) const;
65
66 [[nodiscard]] std::vector<rgb>
67 sample(std::size_t n_leds, std::chrono::milliseconds time_since_start, std::vector<rgb> recycle_buffer = {},
68 blending_method method = blend_linear) const;
69
70 [[nodiscard]] std::function<void(std::chrono::milliseconds)> make_steady_timer_callback(
71 transmittable_rgb_strip &strip, rmt_channel_t channel,
72 blending_method method = blend_linear) const;
73
74 std::vector<rgb> render_frame(transmittable_rgb_strip &strip, rmt_channel_t channel,
75 std::chrono::milliseconds elapsed, std::vector<rgb> recycle_buffer = {},
76 blending_method method = blend_linear) const;
77 };
78
80 std::vector<neo::rgb> matrix = {};
81 std::uint8_t width = 0;
82 float repeats_x = 1.f;
83 std::uint32_t duration_x_ms = 0;
84 std::uint32_t duration_y_ms = 5000;
85
86
87 matrix_fx_config() = default;
88
89 void apply(matrix_fx &m_fx, float tile_x = 0.1f, float tile_y = 0.1f) const;
90
91 [[nodiscard]] std::string to_string() const;
92 };
93
94}// namespace neo
95
96namespace mlab {
97 mlab::bin_stream &operator>>(mlab::bin_stream &s, neo::matrix_fx_config &m_fx_cfg);
98}
99
100namespace neo {
101
102 std::chrono::milliseconds matrix_fx::duration_y() const {
103 return _duration_y;
104 }
105
106 std::chrono::milliseconds matrix_fx::duration_x() const {
107 return _duration_x;
108 }
109
110 float matrix_fx::repeats_x() const {
111 return _repeats_x;
112 }
113
114 std::size_t matrix_fx::width() const {
115 std::scoped_lock lock{_matrix_mutex};
116 return _width;
117 }
118
119 std::size_t matrix_fx::height() const {
120 std::scoped_lock lock{_matrix_mutex};
121 return _height;
122 }
123
124 void matrix_fx::set_duration_x(std::chrono::milliseconds d) {
125 _duration_x = d;
126 }
127
128 void matrix_fx::set_duration_y(std::chrono::milliseconds d) {
129 _duration_y = d;
130 }
131
133 _repeats_x = n;
134 }
135
136 std::vector<rgb> matrix_fx::get_matrix() const {
137 std::scoped_lock lock{_matrix_mutex};
138 return _matrix;
139 }
140}// namespace neo
141
142#endif//NEO_MATRIX_FX_HPP
Definition: matrix_fx.hpp:21
std::size_t _width
Definition: matrix_fx.hpp:23
std::size_t _height
Definition: matrix_fx.hpp:24
std::size_t width() const
Definition: matrix_fx.hpp:114
std::vector< neo::rgb > _matrix
Definition: matrix_fx.hpp:22
std::vector< rgb > get_matrix() const
Definition: matrix_fx.hpp:136
std::chrono::milliseconds duration_y() const
Definition: matrix_fx.hpp:102
void resample(std::size_t new_width, std::size_t new_height, blending_method method=blend_linear)
Definition: matrix_fx.cpp:80
std::chrono::milliseconds duration_x() const
Definition: matrix_fx.hpp:106
float _repeats_x
Definition: matrix_fx.hpp:27
rgb sample(float x, float y, blending_method method=blend_linear) const
Definition: matrix_fx.cpp:37
matrix_fx()=default
void set_repeats_x(float n)
Definition: matrix_fx.hpp:132
float repeats_x() const
Definition: matrix_fx.hpp:110
std::chrono::milliseconds _duration_y
Definition: matrix_fx.hpp:26
void set_matrix(std::vector< rgb > m, std::size_t w)
Definition: matrix_fx.cpp:69
void set_duration_y(std::chrono::milliseconds d)
Definition: matrix_fx.hpp:128
std::vector< rgb > render_frame(transmittable_rgb_strip &strip, rmt_channel_t channel, std::chrono::milliseconds elapsed, std::vector< rgb > recycle_buffer={}, blending_method method=blend_linear) const
Definition: matrix_fx.cpp:168
std::function< void(std::chrono::milliseconds)> make_steady_timer_callback(transmittable_rgb_strip &strip, rmt_channel_t channel, blending_method method=blend_linear) const
Definition: matrix_fx.cpp:183
std::size_t height() const
Definition: matrix_fx.hpp:119
std::chrono::milliseconds _duration_x
Definition: matrix_fx.hpp:25
std::recursive_mutex _matrix_mutex
Definition: matrix_fx.hpp:28
matrix_fx & operator=(matrix_fx &&other) noexcept
Definition: matrix_fx.cpp:25
void set_duration_x(std::chrono::milliseconds d)
Definition: matrix_fx.hpp:124
void tile(float overlap_x, float overlap_y)
Definition: matrix_fx.cpp:95
Definition: strip.hpp:39
Definition: strip.hpp:29
Definition: any_fx.cpp:81
mlab::bin_stream & operator>>(mlab::bin_stream &s, neo::any_fx_config &fx_cfg)
Definition: any_fx.cpp:83
Definition: any_fx.cpp:7
rgb(&)(rgb l, rgb r, float t) blending_method
Definition: gradient.hpp:13
rgb blend_linear(rgb l, rgb r, float t)
Definition: gradient.cpp:96
Definition: matrix_fx.hpp:79
void apply(matrix_fx &m_fx, float tile_x=0.1f, float tile_y=0.1f) const
Definition: matrix_fx.cpp:196
std::uint8_t width
Definition: matrix_fx.hpp:81
std::vector< neo::rgb > matrix
Definition: matrix_fx.hpp:80
std::uint32_t duration_x_ms
Definition: matrix_fx.hpp:83
std::uint32_t duration_y_ms
Definition: matrix_fx.hpp:84
float repeats_x
Definition: matrix_fx.hpp:82
matrix_fx_config()=default
std::string to_string() const
Definition: matrix_fx.cpp:153
Definition: color.hpp:47