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 <softfeverever@gmail.com>
This commit is contained in:
Ocraftyone
2026-02-10 00:08:22 -05:00
committed by GitHub
parent ed3f0e2898
commit abefb0e698
7 changed files with 36 additions and 32 deletions

View File

@@ -1316,14 +1316,14 @@ int CLI::run(int argc, char **argv)
return (argc == 0) ? 0 : 1; return (argc == 0) ? 0 : 1;
#endif // SLIC3R_GUI #endif // SLIC3R_GUI
} }
// Setup logging for CLI
const ConfigOptionInt* opt_loglevel = m_config.opt<ConfigOptionInt>("debug");
if (opt_loglevel) {
set_logging_level(opt_loglevel->value);
}
else { else {
const ConfigOptionInt *opt_loglevel = m_config.opt<ConfigOptionInt>("debug"); set_logging_level(2);
if (opt_loglevel) {
set_logging_level(opt_loglevel->value);
}
else {
set_logging_level(2);
}
} }
global_begin_time = (long long)Slic3r::Utils::get_current_time_utc(); 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); glfwSetErrorCallback(glfw_callback);
int ret = glfwInit(); int ret = glfwInit();
if (ret == GLFW_FALSE) { if (ret == GLFW_FALSE) {
int code = glfwGetError(NULL); const char* error_msg;
BOOST_LOG_TRIVIAL(error) << "glfwInit return error, code " <<code<< std::endl; int code = glfwGetError(&error_msg);
BOOST_LOG_TRIVIAL(error) << "glfwInit return error, Error code: " << code << ", Error: " << error_msg << std::endl;
} }
else { else {
BOOST_LOG_TRIVIAL(info) << "glfwInit Success."<< std::endl; BOOST_LOG_TRIVIAL(info) << "glfwInit Success."<< std::endl;
@@ -6422,10 +6423,6 @@ int CLI::run(int argc, char **argv)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);
#endif #endif
#ifdef __linux__
glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_OSMESA_CONTEXT_API);
#endif
GLFWwindow* window = glfwCreateWindow(640, 480, "base_window", NULL, NULL); GLFWwindow* window = glfwCreateWindow(640, 480, "base_window", NULL, NULL);
if (window == NULL) if (window == NULL)
{ {
@@ -6437,7 +6434,7 @@ int CLI::run(int argc, char **argv)
//opengl manager related logic //opengl manager related logic
{ {
Slic3r::GUI::OpenGLManager opengl_mgr; GUI::OpenGLManager opengl_mgr;
bool opengl_valid = opengl_mgr.init_gl(false); bool opengl_valid = opengl_mgr.init_gl(false);
if (!opengl_valid) { if (!opengl_valid) {
BOOST_LOG_TRIVIAL(error) << "init opengl failed! skip thumbnail generating" << std::endl; BOOST_LOG_TRIVIAL(error) << "init opengl failed! skip thumbnail generating" << std::endl;

View File

@@ -462,9 +462,9 @@ void GLVolume::render_with_outline(const GUI::Size& cnv_size)
} }
glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glClear(GL_DEPTH_BUFFER_BIT));
if (tverts_range == std::make_pair<size_t, size_t>(0, -1)) if (tverts_range == std::make_pair<size_t, size_t>(0, -1))
model.render(); model.render(shader);
else else
model.render(this->tverts_range); model.render(this->tverts_range, shader);
glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); glsafe(::glBindTexture(GL_TEXTURE_2D, 0));
// 2nd. render pass, just a normal render with the depth buffer passed as a texture // 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<size_t, size_t>(0, -1)) if (tverts_range == std::make_pair<size_t, size_t>(0, -1))
m.render(); m.render(shader);
else else
m.render(this->tverts_range); m.render(this->tverts_range, shader);
} }
} else { } else {
if (tverts_range == std::make_pair<size_t, size_t>(0, -1)) if (tverts_range == std::make_pair<size_t, size_t>(0, -1))
model.render(); model.render(shader);
else else
model.render(this->tverts_range); model.render(this->tverts_range, shader);
} }
if (this->is_left_handed()) if (this->is_left_handed())
glFrontFace(GL_CCW); glFrontFace(GL_CCW);

View File

@@ -55,7 +55,10 @@ void Camera::select_next_type()
void Camera::auto_type(EType preferred_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 (preferred_type == EType::Perspective) {
if (!m_prevent_auto_type) { if (!m_prevent_auto_type) {
set_type(preferred_type); set_type(preferred_type);
@@ -758,4 +761,3 @@ void Camera::update_target() {
} }
} // GUI } // GUI
} // Slic3r } // Slic3r

View File

@@ -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<size_t, size_t>(0, indices_count())); render(std::make_pair<size_t, size_t>(0, indices_count()), shader);
} }
void GLModel::render(const std::pair<size_t, size_t>& range) void GLModel::render(const std::pair<size_t, size_t>& range, GLShaderProgram* shader)
{ {
if (m_render_disabled) if (m_render_disabled)
return; return;
@@ -609,7 +609,9 @@ void GLModel::render(const std::pair<size_t, size_t>& range)
if (range.second == range.first) if (range.second == range.first)
return; return;
GLShaderProgram* shader = wxGetApp().get_current_shader(); if (shader == nullptr && wxApp::GetInstance() != nullptr)
shader = wxGetApp().get_current_shader();
if (shader == nullptr) if (shader == nullptr)
return; return;

View File

@@ -13,6 +13,7 @@ namespace Slic3r {
class TriangleMesh; class TriangleMesh;
class Polygon; class Polygon;
class GLShaderProgram;
using Polygons = std::vector<Polygon, PointsAllocator<Polygon>>; using Polygons = std::vector<Polygon, PointsAllocator<Polygon>>;
class BuildVolume; class BuildVolume;
@@ -177,8 +178,8 @@ namespace GUI {
const ColorRGBA& get_color() const { return m_render_data.geometry.color; } const ColorRGBA& get_color() const { return m_render_data.geometry.color; }
void reset(); void reset();
void render(); void render(GLShaderProgram* shader = nullptr);
void render(const std::pair<size_t, size_t>& range); void render(const std::pair<size_t, size_t>& range, GLShaderProgram* shader = nullptr);
void render_instanced(unsigned int instances_vbo, unsigned int instances_count); void render_instanced(unsigned int instances_vbo, unsigned int instances_count);
bool is_initialized() const { return vertices_count() > 0 && indices_count() > 0; } bool is_initialized() const { return vertices_count() > 0 && indices_count() > 0; }
@@ -260,4 +261,3 @@ namespace GUI {
} // namespace Slic3r } // namespace Slic3r
#endif // slic3r_GLModel_hpp_ #endif // slic3r_GLModel_hpp_

View File

@@ -253,7 +253,7 @@ bool OpenGLManager::init_gl(bool popup_error)
glewExperimental = true; glewExperimental = true;
GLenum result = glewInit(); GLenum result = glewInit();
if (result != GLEW_OK) { 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; return false;
} }
//BOOST_LOG_TRIVIAL(info) << "glewInit Success."<< std::endl; //BOOST_LOG_TRIVIAL(info) << "glewInit Success."<< std::endl;

View File

@@ -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(3, m_lock_icon);
calc_vertex_for_icons(4, m_plate_settings_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 // 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 = false;
bool dual_bbl = (preset->is_bbl_vendor() && preset->get_printer_extruder_count() == 2); 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 ? 5 : 6, m_plate_filament_map_icon);
calc_vertex_for_icons(dual_bbl ? 6 : 5, m_move_front_icon); calc_vertex_for_icons(dual_bbl ? 6 : 5, m_move_front_icon);