24 const ImVec2& window_size,
const Color& theme_color) {
25 if (!draw_list)
return;
31 auto current_theme = theme_manager.GetCurrentTheme();
35 current_theme.background.
red * 1.1f,
36 current_theme.background.green * 1.1f,
37 current_theme.background.blue * 1.1f,
42 draw_list->AddRectFilled(window_pos,
43 ImVec2(window_pos.x + window_size.x, window_pos.y + window_size.y),
52 if (current_theme.enable_glow_effects) {
53 float corner_size = 60.0f;
54 Color accent_faded = current_theme.accent;
60 draw_list->AddRectFilledMultiColor(
62 ImVec2(window_pos.x + corner_size, window_pos.y + corner_size),
63 corner_color, IM_COL32(0,0,0,0), IM_COL32(0,0,0,0), corner_color);
66 draw_list->AddRectFilledMultiColor(
67 ImVec2(window_pos.x + window_size.x - corner_size, window_pos.y + window_size.y - corner_size),
68 ImVec2(window_pos.x + window_size.x, window_pos.y + window_size.y),
69 IM_COL32(0,0,0,0), corner_color, corner_color, IM_COL32(0,0,0,0));
74 const ImVec2& window_size,
const Color& grid_color) {
79 float offset_x = 0.0f;
80 float offset_y = 0.0f;
85 offset_x = fmodf(animation_offset, grid_size);
86 offset_y = fmodf(animation_offset * 0.7f, grid_size);
90 ImVec2 center = ImVec2(window_pos.x + window_size.x * 0.5f,
91 window_pos.y + window_size.y * 0.5f);
92 float max_distance = sqrtf(window_size.x * window_size.x + window_size.y * window_size.y) * 0.5f;
95 Color themed_grid_color = grid_color;
101 themed_grid_color.
red = std::min(1.0f, themed_grid_color.
red * breathing_factor);
102 themed_grid_color.
green = std::min(1.0f, themed_grid_color.
green * breathing_factor);
103 themed_grid_color.
blue = std::min(1.0f, themed_grid_color.
blue * breathing_factor);
108 for (
float x = window_pos.x - offset_x; x < window_pos.x + window_size.x + grid_size; x += grid_size) {
109 for (
float y = window_pos.y - offset_y; y < window_pos.y + window_size.y + grid_size; y += grid_size) {
110 ImVec2 dot_pos(x, y);
113 float fade_factor = 1.0f;
115 float distance = sqrtf((dot_pos.x - center.x) * (dot_pos.x - center.x) +
116 (dot_pos.y - center.y) * (dot_pos.y - center.y));
118 fade_factor = fade_factor * fade_factor;
121 if (fade_factor > 0.01f) {
130 for (
float x = window_pos.x - offset_x; x < window_pos.x + window_size.x + grid_size; x += grid_size) {
131 ImVec2 line_start(x, window_pos.y);
132 ImVec2 line_end(x, window_pos.y + window_size.y);
135 float avg_fade = 0.0f;
137 for (
float y = window_pos.y; y < window_pos.y + window_size.y; y += grid_size * 0.5f) {
138 float distance = sqrtf((x - center.x) * (x - center.x) + (y - center.y) * (y - center.y));
140 avg_fade += fade * fade;
142 avg_fade /= (window_size.y / (grid_size * 0.5f));
147 if (avg_fade > 0.01f) {
154 for (
float y = window_pos.y - offset_y; y < window_pos.y + window_size.y + grid_size; y += grid_size) {
155 ImVec2 line_start(window_pos.x, y);
156 ImVec2 line_end(window_pos.x + window_size.x, y);
159 float avg_fade = 0.0f;
161 for (
float x = window_pos.x; x < window_pos.x + window_size.x; x += grid_size * 0.5f) {
162 float distance = sqrtf((x - center.x) * (x - center.x) + (y - center.y) * (y - center.y));
164 avg_fade += fade * fade;
166 avg_fade /= (window_size.x / (grid_size * 0.5f));
171 if (avg_fade > 0.01f) {
180 float radius,
const Color& inner_color,
const Color& outer_color) {
181 if (!draw_list)
return;
183 const int segments = 32;
186 for (
int ring = 0; ring < rings; ++ring) {
187 float ring_radius = radius * (ring + 1) / rings;
188 float inner_ring_radius = radius * ring / rings;
191 float t =
static_cast<float>(ring) / rings;
193 inner_color.
red * (1.0f - t) + outer_color.
red * t,
194 inner_color.
green * (1.0f - t) + outer_color.
green * t,
195 inner_color.
blue * (1.0f - t) + outer_color.
blue * t,
196 inner_color.
alpha * (1.0f - t) + outer_color.
alpha * t
203 draw_list->AddCircleFilled(center, ring_radius, color, segments);
206 for (
int i = 0; i < segments; ++i) {
207 float angle1 = (2.0f *
M_PI * i) / segments;
208 float angle2 = (2.0f *
M_PI * (i + 1)) / segments;
210 ImVec2 p1_inner = ImVec2(center.x + cosf(angle1) * inner_ring_radius,
211 center.y + sinf(angle1) * inner_ring_radius);
212 ImVec2 p2_inner = ImVec2(center.x + cosf(angle2) * inner_ring_radius,
213 center.y + sinf(angle2) * inner_ring_radius);
214 ImVec2 p1_outer = ImVec2(center.x + cosf(angle1) * ring_radius,
215 center.y + sinf(angle1) * ring_radius);
216 ImVec2 p2_outer = ImVec2(center.x + cosf(angle2) * ring_radius,
217 center.y + sinf(angle2) * ring_radius);
219 draw_list->AddQuadFilled(p1_inner, p2_inner, p2_outer, p1_outer, color);
242 if (ImGui::CollapsingHeader(
"Background Grid Settings")) {
251 ImGui::Text(
"Visual Effects:");
254 if (ImGui::IsItemHovered()) {
255 ImGui::SetTooltip(
"Makes the grid move slowly across the screen");
259 if (ImGui::IsItemHovered()) {
260 ImGui::SetTooltip(
"Grid color pulses with a breathing effect");
287 ImGui::Text(
"Preview:");
288 ImVec2 preview_size(200, 100);
289 ImVec2 preview_pos = ImGui::GetCursorScreenPos();
291 ImDrawList* preview_draw_list = ImGui::GetWindowDrawList();
293 auto theme_color = theme_manager.GetCurrentTheme().primary;
296 preview_draw_list->AddRectFilled(preview_pos,
297 ImVec2(preview_pos.x + preview_size.x, preview_pos.y + preview_size.y),
298 IM_COL32(30, 30, 30, 255));
304 ImGui::Dummy(preview_size);
344 ImGuiDockNodeFlags flags) {
350 ImGui::DockSpace(dockspace_id, size, flags);
354 ImDrawList* fg_draw_list = ImGui::GetForegroundDrawList();
356 auto current_theme = theme_manager.GetCurrentTheme();
361 const ImGuiViewport* viewport = ImGui::GetMainViewport();
362 ImVec2 grid_pos = viewport->WorkPos;
363 ImVec2 grid_size = viewport->WorkSize;
366 Color subtle_grid_color = current_theme.primary;
368 subtle_grid_color.
alpha = bg_renderer.GetGridSettings().opacity;
370 bg_renderer.RenderGridBackground(fg_draw_list, grid_pos, grid_size, subtle_grid_color);