Line data Source code
1 : #include "gui/pedalboard/pedal_widget.h"
2 : #include "audio/effects/amp_simulator.h"
3 : #include "gui/theme/theme.h"
4 :
5 : #include <cstdio>
6 :
7 : namespace Amplitron {
8 :
9 12 : void PedalWidget::render_amp_cabinet(ImDrawList* dl, ImVec2 p0, ImVec2 p1, float pedal_width, float pedal_height, float zoom) {
10 4 : (void)pedal_height;
11 12 : ImU32 cab_body = IM_COL32(30, 22, 16, 255);
12 12 : ImU32 cab_border = IM_COL32(90, 70, 40, 255);
13 12 : ImU32 cab_grille = IM_COL32(18, 14, 10, 255);
14 12 : ImU32 cab_grille_line = IM_COL32(38, 30, 22, 180);
15 :
16 12 : dl->AddRectFilled(p0, p1, cab_body, Theme::ROUNDING_MD * zoom);
17 12 : dl->AddRect(p0, p1, cab_border, Theme::ROUNDING_MD * zoom, 0, 2.5f * zoom);
18 :
19 16 : dl->AddRectFilled(
20 12 : ImVec2(p0.x + 6 * zoom, p0.y + 6 * zoom),
21 12 : ImVec2(p1.x - 6 * zoom, p0.y + 10 * zoom),
22 4 : Theme::ACCENT_GOLD_DIM, 2.0f * zoom);
23 :
24 12 : ImVec2 plate_p0 = ImVec2(p0.x + 8 * zoom, p0.y + 14 * zoom);
25 12 : ImVec2 plate_p1 = ImVec2(p1.x - 8 * zoom, p0.y + 50 * zoom);
26 16 : dl->AddRectFilled(plate_p0, plate_p1,
27 4 : IM_COL32(46, 38, 28, 220), Theme::ROUNDING_SM * zoom);
28 16 : dl->AddRect(plate_p0, plate_p1,
29 4 : IM_COL32(70, 58, 38, 180), Theme::ROUNDING_SM * zoom, 0, 1.0f * zoom);
30 :
31 12 : ImGui::SetCursorScreenPos(ImVec2(p0.x + 12 * zoom, p0.y + 18 * zoom));
32 12 : ImGui::PushStyleColor(ImGuiCol_Text, Theme::Gold());
33 12 : ImGui::Text("AMP");
34 12 : ImGui::PopStyleColor();
35 :
36 12 : int model_idx = static_cast<int>(effect_->params()[0].value);
37 12 : const auto& models = get_amp_models();
38 12 : const char* model_name = "Unknown";
39 16 : if (model_idx >= 0 && model_idx < static_cast<int>(models.size())) {
40 12 : model_name = models[model_idx].name;
41 4 : }
42 12 : ImVec2 mn_size = ImGui::CalcTextSize(model_name);
43 12 : float mn_x = p0.x + (pedal_width - mn_size.x) * 0.5f;
44 12 : ImGui::SetCursorScreenPos(ImVec2(mn_x, p0.y + 33 * zoom));
45 12 : ImGui::PushStyleColor(ImGuiCol_Text, Theme::TextPrimary());
46 12 : ImGui::Text("%s", model_name);
47 12 : ImGui::PopStyleColor();
48 :
49 12 : float led_x = p1.x - 22 * zoom;
50 12 : float led_y = p0.y + 26 * zoom;
51 12 : dl->AddCircleFilled(ImVec2(led_x, led_y), 5 * zoom, Theme::LED_GREEN);
52 12 : dl->AddCircleFilled(ImVec2(led_x, led_y), 8 * zoom, Theme::LED_GREEN_GLOW & 0x30FFFFFF);
53 :
54 12 : float grille_top = p1.y - 100 * zoom;
55 12 : float grille_bottom = p1.y - 12 * zoom;
56 12 : float grille_left = p0.x + 12 * zoom;
57 12 : float grille_right = p1.x - 12 * zoom;
58 :
59 16 : dl->AddRectFilled(
60 16 : ImVec2(grille_left, grille_top),
61 12 : ImVec2(grille_right, grille_bottom),
62 4 : cab_grille, Theme::ROUNDING_SM * zoom);
63 16 : dl->AddRect(
64 16 : ImVec2(grille_left, grille_top),
65 12 : ImVec2(grille_right, grille_bottom),
66 4 : IM_COL32(50, 40, 28, 180), Theme::ROUNDING_SM * zoom, 0, 1.0f * zoom);
67 :
68 204 : for (float gy = grille_top + 6 * zoom; gy < grille_bottom - 4 * zoom; gy += 5.0f * zoom) {
69 256 : dl->AddLine(
70 192 : ImVec2(grille_left + 4 * zoom, gy),
71 256 : ImVec2(grille_right - 4 * zoom, gy),
72 64 : cab_grille_line, 1.0f * zoom);
73 64 : }
74 :
75 16 : dl->AddRectFilled(
76 12 : ImVec2(p0.x + 6 * zoom, p1.y - 10 * zoom),
77 12 : ImVec2(p1.x - 6 * zoom, p1.y - 6 * zoom),
78 4 : Theme::ACCENT_GOLD_DIM, 2.0f * zoom);
79 12 : }
80 :
81 : } // namespace Amplitron
|