MXVK Vulkan Framework 0.24.0
C++20 Vulkan rendering framework for practical 2D and 3D application development with SDL3.
Loading...
Searching...
No Matches
rain.hpp
Go to the documentation of this file.
1#ifndef MATRIX_RAIN_H
2#define MATRIX_RAIN_H
3
4#include <chrono>
5#include <functional>
6#include <memory>
7#include <random>
8#include <string>
9#include <vector>
10
11#include <SDL3/SDL.h>
12#include <SDL3_ttf/SDL_ttf.h>
13
14#include "mxvk/mxvk.hpp"
15
16namespace matrix {
17 struct RainConfig {
18 std::string font_path;
19 std::string color;
20 int font_size = 22;
21 std::vector<Uint32> symbols{};
22 int glyph_levels = 7;
27 float fade_base = 0.50f;
28 float fade_exponent = 8.0f;
29 float fade_red_scale = 0.72f;
30 float fade_green_scale = 1.0f;
31 float fade_blue_scale = 0.55f;
32 int head_glow_alpha = 110;
38 float initial_head_margin = 1.5f;
39 float reset_head_margin = 0.8f;
40 float initial_speed_min = 9.0f;
41 float initial_speed_max = 26.0f;
42 float reset_speed_min = 9.0f;
43 float reset_speed_max = 27.0f;
51 float surface_scale = 1.0f;
52 std::function<SDL_Color(int)> level_color{};
53 std::function<SDL_Color()> head_color{};
54 };
55
56 RainConfig make_matrix_rain_config(const std::string &asset_root, bool binary_glyph_mode);
57
58 class Rain {
59 public:
60 Rain(mxvk::VK_Window &window, RainConfig config);
61 explicit Rain(RainConfig config);
62 Rain(mxvk::VK_Window &window, const std::string &asset_root, bool binary_glyph_mode);
63 Rain(const std::string &asset_root, bool binary_glyph_mode);
64 ~Rain();
65
66 Rain(const Rain &) = delete;
67 Rain &operator=(const Rain &) = delete;
68 Rain(Rain &&) = delete;
69 Rain &operator=(Rain &&) = delete;
70
71 void event(SDL_Event &e);
72 void resize(mxvk::VK_Window &window);
73 void resize(int width, int height);
74 void update(float dt);
75 void sync_texture();
76 void render();
77 void render(int width, int height);
78 void set_opacity(float opacity);
79 void reset();
81 void update_and_render(mxvk::VK_Window &window, int render_width, int render_height);
83
84 static SDL_Color matrix_color(int level);
85 static SDL_Color head_color();
86 static std::vector<Uint32> full_symbol_set();
87 static std::vector<Uint32> binary_symbol_set();
88
89 [[nodiscard]] mxvk::VK_Sprite *sprite() const;
90 [[nodiscard]] SDL_Surface *surface() const;
91 [[nodiscard]] const void *pixels() const;
92 [[nodiscard]] int width() const;
93 [[nodiscard]] int height() const;
94 [[nodiscard]] int pitch() const;
95
96 private:
97 enum class SurfaceMode {
98 explicit_default,
99 window_driven,
100 };
101
102 struct SurfaceDeleter {
103 void operator()(SDL_Surface *surface) const;
104 };
105
106 struct TtfDeleter {
107 void operator()(TTF_Font *font) const;
108 };
109
110 using SurfacePtr = std::unique_ptr<SDL_Surface, SurfaceDeleter>;
111 using FontPtr = std::unique_ptr<TTF_Font, TtfDeleter>;
112
113 struct Glyph {
114 Uint32 codepoint = 0;
115 std::vector<SurfacePtr> levels{};
116 };
117
118 struct Stream {
119 float head = 0.0f;
120 float speed = 0.0f;
121 int length = 0;
122 int glyphOffset = 0;
123 int shimmer = 0;
124 };
125
126 void load_glyphs();
127 void rebuild_for_extent(mxvk::VK_Window &window);
128 void randomize_streams();
129 void update_rain(float dt);
130 void reset_stream(Stream &stream);
131 void fade_canvas(float dt);
132 void draw_stream(int column, const Stream &stream);
133 void clear_canvas();
134
135 Rain(RainConfig config, SurfaceMode mode);
136
137 RainConfig config;
138 FontPtr font;
139 SurfacePtr canvas;
140 SurfacePtr background;
141 mxvk::VK_Sprite *rain_sprite = nullptr;
142 std::vector<Glyph> glyphs;
143 std::vector<Stream> streams;
144 std::mt19937 rng;
145 std::chrono::steady_clock::time_point last_frame{};
146 int columns = 0;
147 int rows = 0;
148 int cell_w = 20;
149 int cell_h = 28;
150 int frame_counter = 0;
151 float opacity = 1.0f;
152 bool ttf_acquired = false;
153 };
154} // namespace matrix
155
156#endif
static SDL_Color matrix_color(int level)
Definition rain.cpp:128
int height() const
Definition rain.cpp:343
static std::vector< Uint32 > full_symbol_set()
Definition rain.cpp:142
Rain & operator=(Rain &&)=delete
void render()
Definition rain.cpp:279
void resize(mxvk::VK_Window &window)
Definition rain.cpp:243
static SDL_Color head_color()
Definition rain.cpp:138
Rain(mxvk::VK_Window &window, RainConfig config)
Definition rain.cpp:166
void on_swapchain_recreated(mxvk::VK_Window &window)
Definition rain.cpp:323
void update(float dt)
Definition rain.cpp:264
const void * pixels() const
Definition rain.cpp:335
void event(SDL_Event &e)
Definition rain.cpp:236
void reset()
Definition rain.cpp:298
Rain & operator=(const Rain &)=delete
static std::vector< Uint32 > binary_symbol_set()
Definition rain.cpp:153
void sync_texture()
Definition rain.cpp:272
int width() const
Definition rain.cpp:339
void set_opacity(float opacity)
Definition rain.cpp:294
SDL_Surface * surface() const
Definition rain.cpp:331
void update_and_render(mxvk::VK_Window &window)
Definition rain.cpp:305
Rain(const Rain &)=delete
mxvk::VK_Sprite * sprite() const
Definition rain.cpp:327
Rain(Rain &&)=delete
int pitch() const
Definition rain.cpp:347
Main Vulkan window wrapper for MXVK.
Definition mxvk.hpp:37
RainConfig make_matrix_rain_config(const std::string &asset_root, bool binary_glyph_mode)
Definition rain.cpp:157
float reset_speed_max
Definition rain.hpp:43
float fade_exponent
Definition rain.hpp:28
float fade_red_scale
Definition rain.hpp:29
float initial_head_margin
Definition rain.hpp:38
int near_head_tail_threshold
Definition rain.hpp:35
float surface_scale
Definition rain.hpp:51
float fade_blue_scale
Definition rain.hpp:31
std::function< SDL_Color()> head_color
Definition rain.hpp:53
int initial_length_max
Definition rain.hpp:45
float reset_head_margin
Definition rain.hpp:39
int initial_min_tail_rows
Definition rain.hpp:36
int reset_min_tail_rows
Definition rain.hpp:37
std::string color
Definition rain.hpp:19
float fade_green_scale
Definition rain.hpp:30
float initial_speed_max
Definition rain.hpp:41
float reset_speed_min
Definition rain.hpp:42
float initial_speed_min
Definition rain.hpp:40
std::string font_path
Definition rain.hpp:18
int cell_padding_height
Definition rain.hpp:26
std::vector< Uint32 > symbols
Definition rain.hpp:21
std::function< SDL_Color(int)> level_color
Definition rain.hpp:52
int initial_length_min
Definition rain.hpp:44
int cell_padding_width
Definition rain.hpp:25
int near_head_glow_alpha
Definition rain.hpp:33