25 const ImVec2& window_pos,
26 const ImVec2& window_size,
27 const Color& theme_color) {
35 auto current_theme = theme_manager.GetCurrentTheme();
38 Color bg_tint = {current_theme.background.
red * 1.1f,
39 current_theme.background.green * 1.1f,
40 current_theme.background.blue * 1.1f, 0.3f};
44 draw_list->AddRectFilled(
46 ImVec2(window_pos.x + window_size.x, window_pos.y + window_size.y),
55 if (current_theme.enable_glow_effects) {
56 float corner_size = 60.0f;
57 Color accent_faded = current_theme.accent;
64 draw_list->AddRectFilledMultiColor(
66 ImVec2(window_pos.x + corner_size, window_pos.y + corner_size),
67 corner_color, IM_COL32(0, 0, 0, 0), IM_COL32(0, 0, 0, 0), corner_color);
70 draw_list->AddRectFilledMultiColor(
71 ImVec2(window_pos.x + window_size.x - corner_size,
72 window_pos.y + window_size.y - corner_size),
73 ImVec2(window_pos.x + window_size.x, window_pos.y + window_size.y),
74 IM_COL32(0, 0, 0, 0), corner_color, corner_color, IM_COL32(0, 0, 0, 0));
79 const ImVec2& window_pos,
80 const ImVec2& window_size,
81 const Color& grid_color) {
87 float offset_x = 0.0f;
88 float offset_y = 0.0f;
92 float animation_offset =
94 offset_x = fmodf(animation_offset, grid_size);
95 offset_y = fmodf(animation_offset * 0.7f,
100 ImVec2 center = ImVec2(window_pos.x + window_size.x * 0.5f,
101 window_pos.y + window_size.y * 0.5f);
103 sqrtf(window_size.x * window_size.x + window_size.y * window_size.y) *
107 Color themed_grid_color = grid_color;
111 float breathing_factor =
114 themed_grid_color.
red =
115 std::min(1.0f, themed_grid_color.
red * breathing_factor);
116 themed_grid_color.
green =
117 std::min(1.0f, themed_grid_color.
green * breathing_factor);
118 themed_grid_color.
blue =
119 std::min(1.0f, themed_grid_color.
blue * breathing_factor);
124 for (
float x = window_pos.x - offset_x;
125 x < window_pos.x + window_size.x + grid_size; x += grid_size) {
126 for (
float y = window_pos.y - offset_y;
127 y < window_pos.y + window_size.y + grid_size; y += grid_size) {
128 ImVec2 dot_pos(x, y);
131 float fade_factor = 1.0f;
134 sqrtf((dot_pos.x - center.x) * (dot_pos.x - center.x) +
135 (dot_pos.y - center.y) * (dot_pos.y - center.y));
139 fade_factor * fade_factor;
142 if (fade_factor > 0.01f) {
151 for (
float x = window_pos.x - offset_x;
152 x < window_pos.x + window_size.x + grid_size; x += grid_size) {
153 ImVec2 line_start(x, window_pos.y);
154 ImVec2 line_end(x, window_pos.y + window_size.y);
157 float avg_fade = 0.0f;
159 for (
float y = window_pos.y; y < window_pos.y + window_size.y;
160 y += grid_size * 0.5f) {
161 float distance = sqrtf((x - center.x) * (x - center.x) +
162 (y - center.y) * (y - center.y));
165 avg_fade += fade * fade;
167 avg_fade /= (window_size.y / (grid_size * 0.5f));
172 if (avg_fade > 0.01f) {
174 DrawGridLine(draw_list, line_start, line_end, line_color,
180 for (
float y = window_pos.y - offset_y;
181 y < window_pos.y + window_size.y + grid_size; y += grid_size) {
182 ImVec2 line_start(window_pos.x, y);
183 ImVec2 line_end(window_pos.x + window_size.x, y);
186 float avg_fade = 0.0f;
188 for (
float x = window_pos.x; x < window_pos.x + window_size.x;
189 x += grid_size * 0.5f) {
190 float distance = sqrtf((x - center.x) * (x - center.x) +
191 (y - center.y) * (y - center.y));
194 avg_fade += fade * fade;
196 avg_fade /= (window_size.x / (grid_size * 0.5f));
201 if (avg_fade > 0.01f) {
203 DrawGridLine(draw_list, line_start, line_end, line_color,
211 const ImVec2& center,
213 const Color& inner_color,
214 const Color& outer_color) {
218 const int segments = 32;
221 for (
int ring = 0; ring < rings; ++ring) {
222 float ring_radius = radius * (ring + 1) / rings;
223 float inner_ring_radius = radius * ring / rings;
226 float t =
static_cast<float>(ring) / rings;
227 Color ring_color = {inner_color.
red * (1.0f - t) + outer_color.
red * t,
228 inner_color.
green * (1.0f - t) + outer_color.
green * t,
229 inner_color.
blue * (1.0f - t) + outer_color.
blue * t,
230 inner_color.
alpha * (1.0f - t) + outer_color.
alpha * t};
237 draw_list->AddCircleFilled(center, ring_radius, color, segments);
240 for (
int i = 0; i < segments; ++i) {
241 float angle1 = (2.0f *
M_PI * i) / segments;
242 float angle2 = (2.0f *
M_PI * (i + 1)) / segments;
244 ImVec2 p1_inner = ImVec2(center.x + cosf(angle1) * inner_ring_radius,
245 center.y + sinf(angle1) * inner_ring_radius);
246 ImVec2 p2_inner = ImVec2(center.x + cosf(angle2) * inner_ring_radius,
247 center.y + sinf(angle2) * inner_ring_radius);
248 ImVec2 p1_outer = ImVec2(center.x + cosf(angle1) * ring_radius,
249 center.y + sinf(angle1) * ring_radius);
250 ImVec2 p2_outer = ImVec2(center.x + cosf(angle2) * ring_radius,
251 center.y + sinf(angle2) * ring_radius);
253 draw_list->AddQuadFilled(p1_inner, p2_inner, p2_outer, p1_outer, color);
277 if (ImGui::CollapsingHeader(tr(
"Background Grid Settings"))) {
283 0.5f, 3.0f,
"%.1f px");
287 50.0f, 500.0f,
"%.0f px");
290 ImGui::Text(tr(
"Visual Effects:"));
293 if (ImGui::IsItemHovered()) {
294 ImGui::SetTooltip(tr(
"Makes the grid move slowly across the screen"));
298 if (ImGui::IsItemHovered()) {
299 ImGui::SetTooltip(tr(
"Grid color pulses with a breathing effect"));
303 ImGui::Checkbox(tr(
"Use Dots Instead of Lines"),
310 0.1f, 3.0f,
"%.1fx");
318 0.5f, 3.0f,
"%.1fx");
319 ImGui::SliderFloat(tr(
"Breathing Intensity"),
332 ImGui::Text(tr(
"Preview:"));
333 ImVec2 preview_size(200, 100);
334 ImVec2 preview_pos = ImGui::GetCursorScreenPos();
336 ImDrawList* preview_draw_list = ImGui::GetWindowDrawList();
338 auto theme_color = theme_manager.GetCurrentTheme().primary;
341 preview_draw_list->AddRectFilled(
343 ImVec2(preview_pos.x + preview_size.x, preview_pos.y + preview_size.y),
344 IM_COL32(30, 30, 30, 255));
351 ImGui::Dummy(preview_size);