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