24 const ImVec2& window_pos,
25 const ImVec2& window_size,
26 const Color& theme_color) {
34 auto current_theme = theme_manager.GetCurrentTheme();
37 Color bg_tint = {current_theme.background.
red * 1.1f,
38 current_theme.background.green * 1.1f,
39 current_theme.background.blue * 1.1f, 0.3f};
43 draw_list->AddRectFilled(
45 ImVec2(window_pos.x + window_size.x, window_pos.y + window_size.y),
54 if (current_theme.enable_glow_effects) {
55 float corner_size = 60.0f;
56 Color accent_faded = current_theme.accent;
63 draw_list->AddRectFilledMultiColor(
65 ImVec2(window_pos.x + corner_size, window_pos.y + corner_size),
66 corner_color, IM_COL32(0, 0, 0, 0), IM_COL32(0, 0, 0, 0), corner_color);
69 draw_list->AddRectFilledMultiColor(
70 ImVec2(window_pos.x + window_size.x - corner_size,
71 window_pos.y + window_size.y - corner_size),
72 ImVec2(window_pos.x + window_size.x, window_pos.y + window_size.y),
73 IM_COL32(0, 0, 0, 0), corner_color, corner_color, IM_COL32(0, 0, 0, 0));
78 const ImVec2& window_pos,
79 const ImVec2& window_size,
80 const Color& grid_color) {
86 float offset_x = 0.0f;
87 float offset_y = 0.0f;
91 float animation_offset =
93 offset_x = fmodf(animation_offset, grid_size);
94 offset_y = fmodf(animation_offset * 0.7f,
99 ImVec2 center = ImVec2(window_pos.x + window_size.x * 0.5f,
100 window_pos.y + window_size.y * 0.5f);
102 sqrtf(window_size.x * window_size.x + window_size.y * window_size.y) *
106 Color themed_grid_color = grid_color;
110 float breathing_factor =
113 themed_grid_color.
red =
114 std::min(1.0f, themed_grid_color.
red * breathing_factor);
115 themed_grid_color.
green =
116 std::min(1.0f, themed_grid_color.
green * breathing_factor);
117 themed_grid_color.
blue =
118 std::min(1.0f, themed_grid_color.
blue * breathing_factor);
123 for (
float x = window_pos.x - offset_x;
124 x < window_pos.x + window_size.x + grid_size; x += grid_size) {
125 for (
float y = window_pos.y - offset_y;
126 y < window_pos.y + window_size.y + grid_size; y += grid_size) {
127 ImVec2 dot_pos(x, y);
130 float fade_factor = 1.0f;
133 sqrtf((dot_pos.x - center.x) * (dot_pos.x - center.x) +
134 (dot_pos.y - center.y) * (dot_pos.y - center.y));
138 fade_factor * fade_factor;
141 if (fade_factor > 0.01f) {
150 for (
float x = window_pos.x - offset_x;
151 x < window_pos.x + window_size.x + grid_size; x += grid_size) {
152 ImVec2 line_start(x, window_pos.y);
153 ImVec2 line_end(x, window_pos.y + window_size.y);
156 float avg_fade = 0.0f;
158 for (
float y = window_pos.y; y < window_pos.y + window_size.y;
159 y += grid_size * 0.5f) {
160 float distance = sqrtf((x - center.x) * (x - center.x) +
161 (y - center.y) * (y - center.y));
164 avg_fade += fade * fade;
166 avg_fade /= (window_size.y / (grid_size * 0.5f));
171 if (avg_fade > 0.01f) {
173 DrawGridLine(draw_list, line_start, line_end, line_color,
179 for (
float y = window_pos.y - offset_y;
180 y < window_pos.y + window_size.y + grid_size; y += grid_size) {
181 ImVec2 line_start(window_pos.x, y);
182 ImVec2 line_end(window_pos.x + window_size.x, y);
185 float avg_fade = 0.0f;
187 for (
float x = window_pos.x; x < window_pos.x + window_size.x;
188 x += grid_size * 0.5f) {
189 float distance = sqrtf((x - center.x) * (x - center.x) +
190 (y - center.y) * (y - center.y));
193 avg_fade += fade * fade;
195 avg_fade /= (window_size.x / (grid_size * 0.5f));
200 if (avg_fade > 0.01f) {
202 DrawGridLine(draw_list, line_start, line_end, line_color,
210 const ImVec2& center,
212 const Color& inner_color,
213 const Color& outer_color) {
217 const int segments = 32;
220 for (
int ring = 0; ring < rings; ++ring) {
221 float ring_radius = radius * (ring + 1) / rings;
222 float inner_ring_radius = radius * ring / rings;
225 float t =
static_cast<float>(ring) / rings;
226 Color ring_color = {inner_color.
red * (1.0f - t) + outer_color.
red * t,
227 inner_color.
green * (1.0f - t) + outer_color.
green * t,
228 inner_color.
blue * (1.0f - t) + outer_color.
blue * t,
229 inner_color.
alpha * (1.0f - t) + outer_color.
alpha * t};
236 draw_list->AddCircleFilled(center, ring_radius, color, segments);
239 for (
int i = 0; i < segments; ++i) {
240 float angle1 = (2.0f *
M_PI * i) / segments;
241 float angle2 = (2.0f *
M_PI * (i + 1)) / segments;
243 ImVec2 p1_inner = ImVec2(center.x + cosf(angle1) * inner_ring_radius,
244 center.y + sinf(angle1) * inner_ring_radius);
245 ImVec2 p2_inner = ImVec2(center.x + cosf(angle2) * inner_ring_radius,
246 center.y + sinf(angle2) * inner_ring_radius);
247 ImVec2 p1_outer = ImVec2(center.x + cosf(angle1) * ring_radius,
248 center.y + sinf(angle1) * ring_radius);
249 ImVec2 p2_outer = ImVec2(center.x + cosf(angle2) * ring_radius,
250 center.y + sinf(angle2) * ring_radius);
252 draw_list->AddQuadFilled(p1_inner, p2_inner, p2_outer, p1_outer, color);
276 if (ImGui::CollapsingHeader(
"Background Grid Settings")) {
288 ImGui::Text(
"Visual Effects:");
291 if (ImGui::IsItemHovered()) {
292 ImGui::SetTooltip(
"Makes the grid move slowly across the screen");
296 if (ImGui::IsItemHovered()) {
297 ImGui::SetTooltip(
"Grid color pulses with a breathing effect");
307 0.1f, 3.0f,
"%.1fx");
315 0.5f, 3.0f,
"%.1fx");
316 ImGui::SliderFloat(
"Breathing Intensity",
329 ImGui::Text(
"Preview:");
330 ImVec2 preview_size(200, 100);
331 ImVec2 preview_pos = ImGui::GetCursorScreenPos();
333 ImDrawList* preview_draw_list = ImGui::GetWindowDrawList();
335 auto theme_color = theme_manager.GetCurrentTheme().primary;
338 preview_draw_list->AddRectFilled(
340 ImVec2(preview_pos.x + preview_size.x, preview_pos.y + preview_size.y),
341 IM_COL32(30, 30, 30, 255));
348 ImGui::Dummy(preview_size);