From 2c476c118946344a8573d655cff3038b9ae53562 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 18 Apr 2025 21:43:37 -0500 Subject: [PATCH 1/3] Suppress sprintf warning --- src/MarlinSimulator/marlin_arduino_impl/arduino.cpp | 5 +++++ src/MarlinSimulator/visualisation.h | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/MarlinSimulator/marlin_arduino_impl/arduino.cpp b/src/MarlinSimulator/marlin_arduino_impl/arduino.cpp index 54451f7..a082d77 100644 --- a/src/MarlinSimulator/marlin_arduino_impl/arduino.cpp +++ b/src/MarlinSimulator/marlin_arduino_impl/arduino.cpp @@ -81,6 +81,9 @@ uint16_t analogRead(pin_t adc_pin) { return Gpio::get(digitalPinToAnalogIndex(adc_pin)); } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s) { char format_string[20]; snprintf(format_string, 20, "%%%d.%df", __width, __prec); @@ -88,6 +91,8 @@ char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s return __s; } +#pragma GCC diagnostic pop + int32_t random(int32_t max) { return rand() % max; } diff --git a/src/MarlinSimulator/visualisation.h b/src/MarlinSimulator/visualisation.h index 7c2ce09..636d6fb 100644 --- a/src/MarlinSimulator/visualisation.h +++ b/src/MarlinSimulator/visualisation.h @@ -160,7 +160,6 @@ class Visualisation { std::shared_ptr default_program; bool mouse_captured = false; - bool input_state[6] = {}; glm::vec<2, int> mouse_lock_pos; #define BED_NORMAL 0.0, 1.0, 0.0 From db9a9c34fbf07414b7f54de0204ef38498d0a5b6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 14 Sep 2025 15:07:25 -0500 Subject: [PATCH 2/3] 'R' = Reset camera --- src/MarlinSimulator/visualisation.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/MarlinSimulator/visualisation.cpp b/src/MarlinSimulator/visualisation.cpp index 2da7726..675c9ef 100644 --- a/src/MarlinSimulator/visualisation.cpp +++ b/src/MarlinSimulator/visualisation.cpp @@ -30,6 +30,14 @@ Visualisation::~Visualisation() { destroy(); } +static PerspectiveCamera initCamera = { + { 37.0f, 121.0f, 129.0f }, // Position + { -192.0f, -25.0, 0.0f }, // Rotation + { 0.0f, 1.0f, 0.0f }, // Up = Y-Axis + float(100) / float(100), // Aspect Ratio + glm::radians(45.0f), 0.1f, 2000.0f // FOV, Near, Far +}; + void Visualisation::create() { extrusion_program = renderer::ShaderProgram::create("data/shaders/extrusion.vs", "data/shaders/extrusion.fs", "data/shaders/extrusion.gs"); default_program = renderer::ShaderProgram::create("data/shaders/default.vs","data/shaders/default.fs"); @@ -44,7 +52,7 @@ void Visualisation::create() { } } - camera = { {37.0f, 121.0f, 129.0f}, {-192.0f, -25.0, 0.0f}, {0.0f, 1.0f, 0.0f}, float(100) / float(100), glm::radians(45.0f), 0.1f, 2000.0f}; + camera = initCamera; camera.generate(); if (EXTRUDERS > 0) { @@ -335,9 +343,9 @@ void Visualisation::ui_viewport_menu_callback(UiWindow*) { if (ImGui::BeginMenuBar()) { if (ImGui::BeginMenu("Camera")) { if (ImGui::MenuItem("Reset")) { - camera.position = {37.0f, 121.0f, 129.0f}; - camera.rotation = {-192.0f, -25.0, 0.0f}; - camera.up = {0.0f, 1.0f, 0.0f}; + follow_mode = FOLLOW_NONE; + camera = initCamera; + camera.generate(); } // if (ImGui::BeginMenu("Mode")) { // if (ImGui::MenuItem("Fly", nullptr, true, true)) { } @@ -421,6 +429,11 @@ void Visualisation::ui_viewport_callback(UiWindow* window) { } if (viewport.focused) { + if (ImGui::IsKeyDown(ImGuiKey_R)) { + follow_mode = FOLLOW_NONE; + camera = initCamera; + camera.generate(); + } if (ImGui::IsKeyDown(ImGuiKey_W)) { camera.position += camera.speed * camera.direction * delta; } From 740fe4f9a6b74cc52119b21ba56a228e308fffe3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 14 Sep 2025 15:21:12 -0500 Subject: [PATCH 3/3] Alternative camera movement --- src/MarlinSimulator/visualisation.cpp | 31 ++++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/MarlinSimulator/visualisation.cpp b/src/MarlinSimulator/visualisation.cpp index 675c9ef..9044b78 100644 --- a/src/MarlinSimulator/visualisation.cpp +++ b/src/MarlinSimulator/visualisation.cpp @@ -24,6 +24,8 @@ Visualisation::Visualisation(VirtualPrinter& virtual_printer) : virtual_printer( for (int i = 0; i < EXTRUDERS; ++i) { extrusion.push_back({}); } + + SERIAL_ECHOLNPGM("\nCamera Controls:\nW A S D : Pan F G : Follow Z / XY\nE Q : Zoom In / Out F1 : Path (Full)\nI : Invert Pan F2 : Path (Line)\nR : Reset View F4 : Path Clear\n"); } Visualisation::~Visualisation() { @@ -412,6 +414,8 @@ void Visualisation::ui_viewport_menu_callback(UiWindow*) { } void Visualisation::ui_viewport_callback(UiWindow* window) { + static bool invert_pan = false; + std::scoped_lock extrusion_lock(extrusion_mutex); auto now = clock.now(); float delta = std::chrono::duration_cast>(now- last_update).count(); @@ -429,28 +433,39 @@ void Visualisation::ui_viewport_callback(UiWindow* window) { } if (viewport.focused) { + // R = Camera Reset if (ImGui::IsKeyDown(ImGuiKey_R)) { follow_mode = FOLLOW_NONE; camera = initCamera; camera.generate(); } + // W A S D = Camera Pan if (ImGui::IsKeyDown(ImGuiKey_W)) { - camera.position += camera.speed * camera.direction * delta; + const glm::vec3 dist = camera.world_up * camera.speed * delta; + camera.position += invert_pan ? -dist : dist; } if (ImGui::IsKeyDown(ImGuiKey_S)) { - camera.position -= camera.speed * camera.direction * delta; + const glm::vec3 dist = camera.world_up * camera.speed * delta; + camera.position -= invert_pan ? -dist : dist; } if (ImGui::IsKeyDown(ImGuiKey_A)) { - camera.position -= glm::normalize(glm::cross(camera.direction, camera.up)) * camera.speed * delta; + const glm::vec3 dist = glm::normalize(glm::cross(camera.direction, camera.up)) * camera.speed * delta; + camera.position -= invert_pan ? -dist : dist; } if (ImGui::IsKeyDown(ImGuiKey_D)) { - camera.position += glm::normalize(glm::cross(camera.direction, camera.up)) * camera.speed * delta; + const glm::vec3 dist = glm::normalize(glm::cross(camera.direction, camera.up)) * camera.speed * delta; + camera.position += invert_pan ? -dist : dist; } - if (ImGui::IsKeyDown(ImGuiKey_Space)) { - camera.position += camera.world_up * camera.speed * delta; + // I = Invert WASD + if (ImGui::IsKeyPressed(ImGuiKey_I)) { + invert_pan ^= true; } - if (ImGui::IsKeyDown(ImGuiKey_LeftShift)) { - camera.position -= camera.world_up * camera.speed * delta; + // E / Q = Camera Zoom / Unzoom + if (ImGui::IsKeyDown(ImGuiKey_E)) { + camera.position += camera.speed * camera.direction * delta; + } + if (ImGui::IsKeyDown(ImGuiKey_Q)) { + camera.position -= camera.speed * camera.direction * delta; } if (ImGui::IsKeyPressed(ImGuiKey_F)) { follow_mode = follow_mode == FOLLOW_Z ? FOLLOW_NONE : FOLLOW_Z;