Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/MarlinSimulator/marlin_arduino_impl/arduino.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,18 @@ 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);
sprintf(__s, format_string, __val);
return __s;
}

#pragma GCC diagnostic pop

int32_t random(int32_t max) {
return rand() % max;
}
Expand Down
52 changes: 40 additions & 12 deletions src/MarlinSimulator/visualisation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,22 @@ 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() {
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");
Expand All @@ -44,7 +54,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) {
Expand Down Expand Up @@ -335,9 +345,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)) { }
Expand Down Expand Up @@ -404,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<std::chrono::duration<float>>(now- last_update).count();
Expand All @@ -421,23 +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;
Expand Down
1 change: 0 additions & 1 deletion src/MarlinSimulator/visualisation.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,6 @@ class Visualisation {
std::shared_ptr<renderer::ShaderProgram> 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
Expand Down