From abefb0e698d1af82e830b3e695376d34e36853d1 Mon Sep 17 00:00:00 2001 From: Ocraftyone Date: Tue, 10 Feb 2026 00:08:22 -0500 Subject: [PATCH] Fix thumbnail rendering in CLI (#12129) * Fix thumbnail rendering in CLI * Remove OSMesa context flag * Add stringified error message for glfwInit and glewInit * micro refactor --------- Co-authored-by: SoftFever --- src/OrcaSlicer.cpp | 25 +++++++++++-------------- src/slic3r/GUI/3DScene.cpp | 12 ++++++------ src/slic3r/GUI/Camera.cpp | 6 ++++-- src/slic3r/GUI/GLModel.cpp | 10 ++++++---- src/slic3r/GUI/GLModel.hpp | 6 +++--- src/slic3r/GUI/OpenGLManager.cpp | 2 +- src/slic3r/GUI/PartPlate.cpp | 7 +++++-- 7 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/OrcaSlicer.cpp b/src/OrcaSlicer.cpp index a3ab6450d8..397cd66d38 100644 --- a/src/OrcaSlicer.cpp +++ b/src/OrcaSlicer.cpp @@ -1316,14 +1316,14 @@ int CLI::run(int argc, char **argv) return (argc == 0) ? 0 : 1; #endif // SLIC3R_GUI } + + // Setup logging for CLI + const ConfigOptionInt* opt_loglevel = m_config.opt("debug"); + if (opt_loglevel) { + set_logging_level(opt_loglevel->value); + } else { - const ConfigOptionInt *opt_loglevel = m_config.opt("debug"); - if (opt_loglevel) { - set_logging_level(opt_loglevel->value); - } - else { - set_logging_level(2); - } + set_logging_level(2); } global_begin_time = (long long)Slic3r::Utils::get_current_time_utc(); @@ -6401,8 +6401,9 @@ int CLI::run(int argc, char **argv) glfwSetErrorCallback(glfw_callback); int ret = glfwInit(); if (ret == GLFW_FALSE) { - int code = glfwGetError(NULL); - BOOST_LOG_TRIVIAL(error) << "glfwInit return error, code " <(0, -1)) - model.render(); + model.render(shader); else - model.render(this->tverts_range); + model.render(this->tverts_range, shader); glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); // 2nd. render pass, just a normal render with the depth buffer passed as a texture @@ -576,15 +576,15 @@ void GLVolume::simple_render(GLShaderProgram* shader, ModelObjectPtrs& model_obj } } if (tverts_range == std::make_pair(0, -1)) - m.render(); + m.render(shader); else - m.render(this->tverts_range); + m.render(this->tverts_range, shader); } } else { if (tverts_range == std::make_pair(0, -1)) - model.render(); + model.render(shader); else - model.render(this->tverts_range); + model.render(this->tverts_range, shader); } if (this->is_left_handed()) glFrontFace(GL_CCW); diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index efd9bad0b0..3bde13f91d 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -55,7 +55,10 @@ void Camera::select_next_type() void Camera::auto_type(EType preferred_type) { - if (!wxGetApp().app_config->get_bool("auto_perspective")) return; + if (wxApp::GetInstance() == nullptr || wxGetApp().app_config == nullptr) + return; + if (!wxGetApp().app_config->get_bool("auto_perspective")) + return; if (preferred_type == EType::Perspective) { if (!m_prevent_auto_type) { set_type(preferred_type); @@ -758,4 +761,3 @@ void Camera::update_target() { } } // GUI } // Slic3r - diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index 507768ad64..523db38c25 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -596,12 +596,12 @@ static GLenum get_index_type(const GLModel::Geometry& data) } } -void GLModel::render() +void GLModel::render(GLShaderProgram* shader) { - render(std::make_pair(0, indices_count())); + render(std::make_pair(0, indices_count()), shader); } -void GLModel::render(const std::pair& range) +void GLModel::render(const std::pair& range, GLShaderProgram* shader) { if (m_render_disabled) return; @@ -609,7 +609,9 @@ void GLModel::render(const std::pair& range) if (range.second == range.first) return; - GLShaderProgram* shader = wxGetApp().get_current_shader(); + if (shader == nullptr && wxApp::GetInstance() != nullptr) + shader = wxGetApp().get_current_shader(); + if (shader == nullptr) return; diff --git a/src/slic3r/GUI/GLModel.hpp b/src/slic3r/GUI/GLModel.hpp index 13729f5a9e..d007b31371 100644 --- a/src/slic3r/GUI/GLModel.hpp +++ b/src/slic3r/GUI/GLModel.hpp @@ -13,6 +13,7 @@ namespace Slic3r { class TriangleMesh; class Polygon; +class GLShaderProgram; using Polygons = std::vector>; class BuildVolume; @@ -177,8 +178,8 @@ namespace GUI { const ColorRGBA& get_color() const { return m_render_data.geometry.color; } void reset(); - void render(); - void render(const std::pair& range); + void render(GLShaderProgram* shader = nullptr); + void render(const std::pair& range, GLShaderProgram* shader = nullptr); void render_instanced(unsigned int instances_vbo, unsigned int instances_count); bool is_initialized() const { return vertices_count() > 0 && indices_count() > 0; } @@ -260,4 +261,3 @@ namespace GUI { } // namespace Slic3r #endif // slic3r_GLModel_hpp_ - diff --git a/src/slic3r/GUI/OpenGLManager.cpp b/src/slic3r/GUI/OpenGLManager.cpp index 3bbc8927b6..39860ab9a8 100644 --- a/src/slic3r/GUI/OpenGLManager.cpp +++ b/src/slic3r/GUI/OpenGLManager.cpp @@ -253,7 +253,7 @@ bool OpenGLManager::init_gl(bool popup_error) glewExperimental = true; GLenum result = glewInit(); if (result != GLEW_OK) { - BOOST_LOG_TRIVIAL(error) << "Unable to init glew library"; + BOOST_LOG_TRIVIAL(error) << "Unable to init glew library, Error: " << glewGetErrorString(result); return false; } //BOOST_LOG_TRIVIAL(info) << "glewInit Success."<< std::endl; diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index acb8240523..33efc32507 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -3110,8 +3110,11 @@ bool PartPlate::set_shape(const Pointfs& shape, const Pointfs& exclude_areas, co calc_vertex_for_icons(3, m_lock_icon); calc_vertex_for_icons(4, m_plate_settings_icon); // ORCA also change bed_icon_count number in calc_vertex_for_icons() after adding or removing icons for circular shaped beds that uses vertical alingment for icons - PresetBundle* preset = wxGetApp().preset_bundle; - bool dual_bbl = (preset->is_bbl_vendor() && preset->get_printer_extruder_count() == 2); + bool dual_bbl = false; + if (m_plater) { + PresetBundle* preset = wxGetApp().preset_bundle; + dual_bbl = (preset->is_bbl_vendor() && preset->get_printer_extruder_count() == 2); + } calc_vertex_for_icons(dual_bbl ? 5 : 6, m_plate_filament_map_icon); calc_vertex_for_icons(dual_bbl ? 6 : 5, m_move_front_icon);