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;
#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 {
const ConfigOptionInt *opt_loglevel = m_config.opt<ConfigOptionInt>("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 " <<code<< std::endl;
const char* error_msg;
int code = glfwGetError(&error_msg);
BOOST_LOG_TRIVIAL(error) << "glfwInit return error, Error code: " << code << ", Error: " << error_msg << std::endl;
}
else {
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);
#endif
#ifdef __linux__
glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_OSMESA_CONTEXT_API);
#endif
GLFWwindow* window = glfwCreateWindow(640, 480, "base_window", NULL, NULL);
if (window == NULL)
{
@@ -6437,7 +6434,7 @@ int CLI::run(int argc, char **argv)
//opengl manager related logic
{
Slic3r::GUI::OpenGLManager opengl_mgr;
GUI::OpenGLManager opengl_mgr;
bool opengl_valid = opengl_mgr.init_gl(false);
if (!opengl_valid) {
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));
if (tverts_range == std::make_pair<size_t, size_t>(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<size_t, size_t>(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<size_t, size_t>(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);

View File

@@ -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

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)
return;
@@ -609,7 +609,9 @@ void GLModel::render(const std::pair<size_t, size_t>& 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;

View File

@@ -13,6 +13,7 @@ namespace Slic3r {
class TriangleMesh;
class Polygon;
class GLShaderProgram;
using Polygons = std::vector<Polygon, PointsAllocator<Polygon>>;
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<size_t, size_t>& range);
void render(GLShaderProgram* shader = nullptr);
void render(const std::pair<size_t, size_t>& 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_

View File

@@ -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;

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(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);