Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorenricoturri1966 <enricoturri@seznam.cz>2021-12-17 13:50:33 +0300
committerenricoturri1966 <enricoturri@seznam.cz>2021-12-17 13:50:33 +0300
commita593577a28a38c2d771ec83309e21bd8e49c7fed (patch)
tree35caac9db22fe033734facf899d96d794f466256 /src
parent296041da38273fbf0053d6e338bf5a2bb51d030d (diff)
parenta16c89b5a80f27750777b65fb9ace28bccfdd51b (diff)
Merge branch 'dev' of https://github.com/prusa3d/PrusaSlicer into et_fix_7464et_fix_7464
Diffstat (limited to 'src')
-rw-r--r--src/libslic3r/CMakeLists.txt10
-rw-r--r--src/libslic3r/GCode/AvoidCrossingPerimeters.cpp4
-rw-r--r--src/libslic3r/PrintConfig.cpp3
-rw-r--r--src/slic3r/CMakeLists.txt6
-rw-r--r--src/slic3r/GUI/ConfigManipulation.cpp7
-rw-r--r--src/slic3r/GUI/ConfigWizard.cpp25
-rw-r--r--src/slic3r/GUI/GCodeViewer.cpp20
-rw-r--r--src/slic3r/GUI/GLShader.cpp134
-rw-r--r--src/slic3r/GUI/GLShader.hpp49
-rw-r--r--src/slic3r/GUI/GUI_App.cpp24
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoBase.cpp9
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoBase.hpp4
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp22
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp3
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoMove.cpp8
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoMove.hpp2
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp19
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp5
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp22
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp6
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp7
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp4
-rw-r--r--src/slic3r/GUI/Tab.cpp9
-rw-r--r--src/slic3r/GUI/fts_fuzzy_match.h1
24 files changed, 209 insertions, 194 deletions
diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt
index deaa0b924..97d1d5ce5 100644
--- a/src/libslic3r/CMakeLists.txt
+++ b/src/libslic3r/CMakeLists.txt
@@ -14,7 +14,7 @@ if (TARGET OpenVDB::openvdb)
set(OpenVDBUtils_SOURCES OpenVDBUtils.cpp OpenVDBUtils.hpp)
endif()
-add_library(libslic3r STATIC
+set(SLIC3R_SOURCES
pchheader.cpp
pchheader.hpp
BoundingBox.cpp
@@ -291,6 +291,14 @@ add_library(libslic3r STATIC
SLA/ReprojectPointsOnMesh.hpp
)
+add_library(libslic3r STATIC ${SLIC3R_SOURCES})
+
+foreach(_source IN ITEMS ${SLIC3R_SOURCES})
+ get_filename_component(_source_path "${_source}" PATH)
+ string(REPLACE "/" "\\" _group_path "${_source_path}")
+ source_group("${_group_path}" FILES "${_source}")
+endforeach()
+
if (SLIC3R_STATIC)
set(CGAL_Boost_USE_STATIC_LIBS ON CACHE BOOL "" FORCE)
endif ()
diff --git a/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp b/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp
index d29f7216a..48b9515f7 100644
--- a/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp
+++ b/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp
@@ -765,8 +765,8 @@ static void precompute_polygon_distances(const Polygon &polygon, std::vector<flo
{
polygon_distances_out.assign(polygon.size() + 1, 0.f);
for (size_t point_idx = 1; point_idx < polygon.size(); ++point_idx)
- polygon_distances_out[point_idx] = polygon_distances_out[point_idx - 1] + (polygon[point_idx].cast<float>() - polygon[point_idx - 1].cast<float>()).norm();
- polygon_distances_out.back() = polygon_distances_out[polygon.size() - 1] + (polygon.points.back().cast<float>() - polygon.points.front().cast<float>()).norm();
+ polygon_distances_out[point_idx] = polygon_distances_out[point_idx - 1] + float((polygon[point_idx] - polygon[point_idx - 1]).cast<double>().norm());
+ polygon_distances_out.back() = polygon_distances_out[polygon.size() - 1] + float((polygon.points.back() - polygon.points.front()).cast<double>().norm());
}
static void precompute_expolygon_distances(const ExPolygon &ex_polygon, std::vector<std::vector<float>> &expolygon_distances_out)
diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp
index 77a76ab8e..612c9c096 100644
--- a/src/libslic3r/PrintConfig.cpp
+++ b/src/libslic3r/PrintConfig.cpp
@@ -2753,7 +2753,8 @@ void PrintConfigDef::init_fff_params()
def->label = L("Synchronize with object layers");
def->category = L("Support material");
def->tooltip = L("Synchronize support layers with the object print layers. This is useful "
- "with multi-material printers, where the extruder switch is expensive.");
+ "with multi-material printers, where the extruder switch is expensive. "
+ "This option is only available when top contact Z distance is set to zero.");
def->mode = comExpert;
def->set_default_value(new ConfigOptionBool(false));
diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt
index 34cc98051..211a2c2e7 100644
--- a/src/slic3r/CMakeLists.txt
+++ b/src/slic3r/CMakeLists.txt
@@ -258,6 +258,12 @@ endif ()
add_library(libslic3r_gui STATIC ${SLIC3R_GUI_SOURCES})
+foreach(_source IN ITEMS ${SLIC3R_GUI_SOURCES})
+ get_filename_component(_source_path "${_source}" PATH)
+ string(REPLACE "/" "\\" _group_path "${_source_path}")
+ source_group("${_group_path}" FILES "${_source}")
+endforeach()
+
encoding_check(libslic3r_gui)
target_link_libraries(libslic3r_gui libslic3r avrdude cereal imgui GLEW::GLEW OpenGL::GL hidapi libcurl ${wxWidgets_LIBRARIES})
diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp
index fe108b1a6..8defc4554 100644
--- a/src/slic3r/GUI/ConfigManipulation.cpp
+++ b/src/slic3r/GUI/ConfigManipulation.cpp
@@ -155,7 +155,8 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
apply(config, &new_conf);
}
- if (config->opt_bool("support_material")) {
+ // Check "support_material" and "overhangs" relations only on global settings level
+ if (is_global_config && config->opt_bool("support_material")) {
// Ask only once.
if (!m_support_material_overhangs_queried) {
m_support_material_overhangs_queried = true;
@@ -164,10 +165,10 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
"- Detect bridging perimeters"));
if (is_global_config)
msg_text += "\n\n" + _(L("Shall I adjust those settings for supports?"));
- MessageDialog dialog(m_msg_dlg_parent, msg_text, _L("Support Generator"), wxICON_WARNING | (is_global_config ? wxYES | wxNO : wxOK));
+ MessageDialog dialog(m_msg_dlg_parent, msg_text, _L("Support Generator"), wxICON_WARNING | wxYES | wxNO);
DynamicPrintConfig new_conf = *config;
auto answer = dialog.ShowModal();
- if (!is_global_config || answer == wxID_YES) {
+ if (answer == wxID_YES) {
// Enable "detect bridging perimeters".
new_conf.set_key_value("overhangs", new ConfigOptionBool(true));
}
diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp
index 04d95952a..842c690de 100644
--- a/src/slic3r/GUI/ConfigWizard.cpp
+++ b/src/slic3r/GUI/ConfigWizard.cpp
@@ -2522,23 +2522,33 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese
{
wxString header, caption = _L("Configuration is edited in ConfigWizard");
const auto enabled_vendors = appconfig_new.vendors();
+ const auto enabled_vendors_old = app_config->vendors();
bool suppress_sla_printer = model_has_multi_part_objects(wxGetApp().model());
PrinterTechnology preferred_pt = ptAny;
- auto get_preferred_printer_technology = [enabled_vendors, suppress_sla_printer](const std::string& bundle_name, const Bundle& bundle) {
+ auto get_preferred_printer_technology = [enabled_vendors, enabled_vendors_old, suppress_sla_printer](const std::string& bundle_name, const Bundle& bundle) {
const auto config = enabled_vendors.find(bundle_name);
PrinterTechnology pt = ptAny;
if (config != enabled_vendors.end()) {
for (const auto& model : bundle.vendor_profile->models) {
if (const auto model_it = config->second.find(model.id);
model_it != config->second.end() && model_it->second.size() > 0) {
- if (pt == ptAny)
- pt = model.technology;
- // if preferred printer model has SLA printer technology it's important to check the model for multypart state
- if (pt == ptSLA && suppress_sla_printer)
- continue;
- else
+ pt = model.technology;
+ const auto config_old = enabled_vendors_old.find(bundle_name);
+ if (config_old == enabled_vendors_old.end() || config_old->second.find(model.id) == config_old->second.end()) {
+ // if preferred printer model has SLA printer technology it's important to check the model for multi-part state
+ if (pt == ptSLA && suppress_sla_printer)
+ continue;
return pt;
+ }
+
+ if (const auto model_it_old = config_old->second.find(model.id);
+ model_it_old == config_old->second.end() || model_it_old->second != model_it->second) {
+ // if preferred printer model has SLA printer technology it's important to check the model for multi-part state
+ if (pt == ptSLA && suppress_sla_printer)
+ continue;
+ return pt;
+ }
}
}
}
@@ -2645,7 +2655,6 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese
std::string preferred_model;
std::string preferred_variant;
- const auto enabled_vendors_old = app_config->vendors();
auto get_preferred_printer_model = [enabled_vendors, enabled_vendors_old, preferred_pt](const std::string& bundle_name, const Bundle& bundle, std::string& variant) {
const auto config = enabled_vendors.find(bundle_name);
if (config == enabled_vendors.end())
diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp
index 5f61c84cc..42dd0954b 100644
--- a/src/slic3r/GUI/GCodeViewer.cpp
+++ b/src/slic3r/GUI/GCodeViewer.cpp
@@ -608,7 +608,7 @@ void GCodeViewer::init()
}
case EMoveType::Travel: {
buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line;
- buffer.vertices.format = VBuffer::EFormat::PositionNormal1;
+ buffer.vertices.format = VBuffer::EFormat::PositionNormal3;
buffer.shader = "toolpaths_lines";
break;
}
@@ -1140,15 +1140,19 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result)
// format data into the buffers to be rendered as lines
auto add_vertices_as_line = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, VertexBuffer& vertices) {
// x component of the normal to the current segment (the normal is parallel to the XY plane)
- const float normal_x = (curr.position - prev.position).normalized().y();
+ const Vec3f dir = (curr.position - prev.position).normalized();
+ Vec3f normal(dir.y(), -dir.x(), 0.0);
+ normal.normalize();
- auto add_vertex = [&vertices, normal_x](const GCodeProcessorResult::MoveVertex& vertex) {
+ auto add_vertex = [&vertices, &normal](const GCodeProcessorResult::MoveVertex& vertex) {
// add position
vertices.push_back(vertex.position.x());
vertices.push_back(vertex.position.y());
vertices.push_back(vertex.position.z());
- // add normal x component
- vertices.push_back(normal_x);
+ // add normal
+ vertices.push_back(normal.x());
+ vertices.push_back(normal.y());
+ vertices.push_back(normal.z());
};
// add previous vertex
@@ -2657,7 +2661,7 @@ void GCodeViewer::render_toolpaths()
// Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415.
assert(! path.sizes.empty());
assert(! path.offsets.empty());
- glsafe(::glUniform4fv(uniform_color, 1, static_cast<const GLfloat*>(path.color.data())));
+ shader.set_uniform(uniform_color, path.color);
glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size()));
#if ENABLE_GCODE_VIEWER_STATISTICS
++m_statistics.gl_multi_points_calls_count;
@@ -2681,7 +2685,7 @@ void GCodeViewer::render_toolpaths()
// Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415.
assert(! path.sizes.empty());
assert(! path.offsets.empty());
- glsafe(::glUniform4fv(uniform_color, 1, static_cast<const GLfloat*>(path.color.data())));
+ shader.set_uniform(uniform_color, path.color);
glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size()));
#if ENABLE_GCODE_VIEWER_STATISTICS
++m_statistics.gl_multi_lines_calls_count;
@@ -2699,7 +2703,7 @@ void GCodeViewer::render_toolpaths()
// Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415.
assert(! path.sizes.empty());
assert(! path.offsets.empty());
- glsafe(::glUniform4fv(uniform_color, 1, static_cast<const GLfloat*>(path.color.data())));
+ shader.set_uniform(uniform_color, path.color);
glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size()));
#if ENABLE_GCODE_VIEWER_STATISTICS
++m_statistics.gl_multi_triangles_calls_count;
diff --git a/src/slic3r/GUI/GLShader.cpp b/src/slic3r/GUI/GLShader.cpp
index 9c1e93652..4c36efdd9 100644
--- a/src/slic3r/GUI/GLShader.cpp
+++ b/src/slic3r/GUI/GLShader.cpp
@@ -206,154 +206,104 @@ void GLShaderProgram::stop_using() const
glsafe(::glUseProgram(0));
}
-bool GLShaderProgram::set_uniform(const char* name, int value) const
+void GLShaderProgram::set_uniform(int id, int value) const
{
- int id = get_uniform_location(name);
- if (id >= 0) {
- glsafe(::glUniform1i(id, static_cast<GLint>(value)));
- return true;
- }
- return false;
+ if (id >= 0)
+ glsafe(::glUniform1i(id, value));
}
-bool GLShaderProgram::set_uniform(const char* name, bool value) const
+void GLShaderProgram::set_uniform(int id, bool value) const
{
- return set_uniform(name, value ? 1 : 0);
+ set_uniform(id, value ? 1 : 0);
}
-bool GLShaderProgram::set_uniform(const char* name, float value) const
+void GLShaderProgram::set_uniform(int id, float value) const
{
- int id = get_uniform_location(name);
- if (id >= 0) {
- glsafe(::glUniform1f(id, static_cast<GLfloat>(value)));
- return true;
- }
- return false;
+ if (id >= 0)
+ glsafe(::glUniform1f(id, value));
}
-bool GLShaderProgram::set_uniform(const char* name, double value) const
+void GLShaderProgram::set_uniform(int id, double value) const
{
- return set_uniform(name, static_cast<float>(value));
+ set_uniform(id, static_cast<float>(value));
}
-bool GLShaderProgram::set_uniform(const char* name, const std::array<int, 2>& value) const
+void GLShaderProgram::set_uniform(int id, const std::array<int, 2>& value) const
{
- int id = get_uniform_location(name);
- if (id >= 0) {
+ if (id >= 0)
glsafe(::glUniform2iv(id, 1, static_cast<const GLint*>(value.data())));
- return true;
- }
- return false;
}
-bool GLShaderProgram::set_uniform(const char* name, const std::array<int, 3>& value) const
+void GLShaderProgram::set_uniform(int id, const std::array<int, 3>& value) const
{
- int id = get_uniform_location(name);
- if (id >= 0) {
+ if (id >= 0)
glsafe(::glUniform3iv(id, 1, static_cast<const GLint*>(value.data())));
- return true;
- }
- return false;
}
-bool GLShaderProgram::set_uniform(const char* name, const std::array<int, 4>& value) const
+void GLShaderProgram::set_uniform(int id, const std::array<int, 4>& value) const
{
- int id = get_uniform_location(name);
- if (id >= 0) {
+ if (id >= 0)
glsafe(::glUniform4iv(id, 1, static_cast<const GLint*>(value.data())));
- return true;
- }
- return false;
}
-bool GLShaderProgram::set_uniform(const char* name, const std::array<float, 2>& value) const
+void GLShaderProgram::set_uniform(int id, const std::array<float, 2>& value) const
{
- int id = get_uniform_location(name);
- if (id >= 0) {
+ if (id >= 0)
glsafe(::glUniform2fv(id, 1, static_cast<const GLfloat*>(value.data())));
- return true;
- }
- return false;
}
-bool GLShaderProgram::set_uniform(const char* name, const std::array<float, 3>& value) const
+void GLShaderProgram::set_uniform(int id, const std::array<float, 3>& value) const
{
- int id = get_uniform_location(name);
- if (id >= 0) {
+ if (id >= 0)
glsafe(::glUniform3fv(id, 1, static_cast<const GLfloat*>(value.data())));
- return true;
- }
- return false;
}
-bool GLShaderProgram::set_uniform(const char* name, const std::array<float, 4>& value) const
+void GLShaderProgram::set_uniform(int id, const std::array<float, 4>& value) const
{
- int id = get_uniform_location(name);
- if (id >= 0) {
+ if (id >= 0)
glsafe(::glUniform4fv(id, 1, static_cast<const GLfloat*>(value.data())));
- return true;
- }
- return false;
}
-bool GLShaderProgram::set_uniform(const char* name, const float* value, size_t size) const
+void GLShaderProgram::set_uniform(int id, const float* value, size_t size) const
{
- if (size == 1)
- return set_uniform(name, value[0]);
- else if (size < 5) {
- int id = get_uniform_location(name);
- if (id >= 0) {
- if (size == 2)
- glsafe(::glUniform2fv(id, 1, static_cast<const GLfloat*>(value)));
- else if (size == 3)
- glsafe(::glUniform3fv(id, 1, static_cast<const GLfloat*>(value)));
- else
- glsafe(::glUniform4fv(id, 1, static_cast<const GLfloat*>(value)));
-
- return true;
- }
+ if (id >= 0) {
+ if (size == 1)
+ set_uniform(id, value[0]);
+ else if (size == 2)
+ glsafe(::glUniform2fv(id, 1, static_cast<const GLfloat*>(value)));
+ else if (size == 3)
+ glsafe(::glUniform3fv(id, 1, static_cast<const GLfloat*>(value)));
+ else if (size == 4)
+ glsafe(::glUniform4fv(id, 1, static_cast<const GLfloat*>(value)));
}
- return false;
}
-bool GLShaderProgram::set_uniform(const char* name, const Transform3f& value) const
+void GLShaderProgram::set_uniform(int id, const Transform3f& value) const
{
- int id = get_uniform_location(name);
- if (id >= 0) {
+ if (id >= 0)
glsafe(::glUniformMatrix4fv(id, 1, GL_FALSE, static_cast<const GLfloat*>(value.matrix().data())));
- return true;
- }
- return false;
}
-bool GLShaderProgram::set_uniform(const char* name, const Transform3d& value) const
+void GLShaderProgram::set_uniform(int id, const Transform3d& value) const
{
- return set_uniform(name, value.cast<float>());
+ set_uniform(id, value.cast<float>());
}
-bool GLShaderProgram::set_uniform(const char* name, const Matrix3f& value) const
+void GLShaderProgram::set_uniform(int id, const Matrix3f& value) const
{
- int id = get_uniform_location(name);
- if (id >= 0) {
+ if (id >= 0)
glsafe(::glUniformMatrix3fv(id, 1, GL_FALSE, static_cast<const GLfloat*>(value.data())));
- return true;
- }
- return false;
}
-bool GLShaderProgram::set_uniform(const char* name, const Vec3f& value) const
+void GLShaderProgram::set_uniform(int id, const Vec3f& value) const
{
- int id = get_uniform_location(name);
- if (id >= 0) {
+ if (id >= 0)
glsafe(::glUniform3fv(id, 1, static_cast<const GLfloat*>(value.data())));
- return true;
- }
- return false;
}
-bool GLShaderProgram::set_uniform(const char* name, const Vec3d& value) const
+void GLShaderProgram::set_uniform(int id, const Vec3d& value) const
{
- return set_uniform(name, static_cast<Vec3f>(value.cast<float>()));
+ set_uniform(id, static_cast<Vec3f>(value.cast<float>()));
}
int GLShaderProgram::get_attrib_location(const char* name) const
diff --git a/src/slic3r/GUI/GLShader.hpp b/src/slic3r/GUI/GLShader.hpp
index d7b92000d..46e46b4f0 100644
--- a/src/slic3r/GUI/GLShader.hpp
+++ b/src/slic3r/GUI/GLShader.hpp
@@ -44,22 +44,39 @@ public:
void start_using() const;
void stop_using() const;
- bool set_uniform(const char* name, int value) const;
- bool set_uniform(const char* name, bool value) const;
- bool set_uniform(const char* name, float value) const;
- bool set_uniform(const char* name, double value) const;
- bool set_uniform(const char* name, const std::array<int, 2>& value) const;
- bool set_uniform(const char* name, const std::array<int, 3>& value) const;
- bool set_uniform(const char* name, const std::array<int, 4>& value) const;
- bool set_uniform(const char* name, const std::array<float, 2>& value) const;
- bool set_uniform(const char* name, const std::array<float, 3>& value) const;
- bool set_uniform(const char* name, const std::array<float, 4>& value) const;
- bool set_uniform(const char* name, const float* value, size_t size) const;
- bool set_uniform(const char* name, const Transform3f& value) const;
- bool set_uniform(const char* name, const Transform3d& value) const;
- bool set_uniform(const char* name, const Matrix3f& value) const;
- bool set_uniform(const char* name, const Vec3f& value) const;
- bool set_uniform(const char* name, const Vec3d& value) const;
+ void set_uniform(const char* name, int value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, bool value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, float value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, double value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, const std::array<int, 2>& value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, const std::array<int, 3>& value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, const std::array<int, 4>& value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, const std::array<float, 2>& value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, const std::array<float, 3>& value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, const std::array<float, 4>& value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, const float* value, size_t size) const { set_uniform(get_uniform_location(name), value, size); }
+ void set_uniform(const char* name, const Transform3f& value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, const Transform3d& value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, const Matrix3f& value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, const Vec3f& value) const { set_uniform(get_uniform_location(name), value); }
+ void set_uniform(const char* name, const Vec3d& value) const { set_uniform(get_uniform_location(name), value); }
+
+ void set_uniform(int id, int value) const;
+ void set_uniform(int id, bool value) const;
+ void set_uniform(int id, float value) const;
+ void set_uniform(int id, double value) const;
+ void set_uniform(int id, const std::array<int, 2>& value) const;
+ void set_uniform(int id, const std::array<int, 3>& value) const;
+ void set_uniform(int id, const std::array<int, 4>& value) const;
+ void set_uniform(int id, const std::array<float, 2>& value) const;
+ void set_uniform(int id, const std::array<float, 3>& value) const;
+ void set_uniform(int id, const std::array<float, 4>& value) const;
+ void set_uniform(int id, const float* value, size_t size) const;
+ void set_uniform(int id, const Transform3f& value) const;
+ void set_uniform(int id, const Transform3d& value) const;
+ void set_uniform(int id, const Matrix3f& value) const;
+ void set_uniform(int id, const Vec3f& value) const;
+ void set_uniform(int id, const Vec3d& value) const;
// returns -1 if not found
int get_attrib_location(const char* name) const;
diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp
index fe4f15999..e4078c9c1 100644
--- a/src/slic3r/GUI/GUI_App.cpp
+++ b/src/slic3r/GUI/GUI_App.cpp
@@ -949,9 +949,6 @@ bool GUI_App::check_older_app_config(Semver current_version, bool backup)
BOOST_LOG_TRIVIAL(info) << "last app config file used: " << m_older_data_dir_path;
// ask about using older data folder
- // See GH issue #7469.
- wxInitAllImageHandlers();
-
InfoDialog msg(nullptr
, format_wxstr(_L("You are opening %1% version %2%."), SLIC3R_APP_NAME, SLIC3R_VERSION)
, backup ?
@@ -1043,6 +1040,9 @@ bool GUI_App::OnInit()
bool GUI_App::on_init_inner()
{
+ // Set initialization of image handlers before any UI actions - See GH issue #7469
+ wxInitAllImageHandlers();
+
#if defined(_WIN32) && ! defined(_WIN64)
// Win32 32bit build.
if (wxPlatformInfo::Get().GetArchName().substr(0, 2) == "64") {
@@ -1106,6 +1106,14 @@ bool GUI_App::on_init_inner()
}
}
+ // Set language and color mode before check_older_app_config() call
+
+ // If load_language() fails, the application closes.
+ load_language(wxString(), true);
+#ifdef _MSW_DARK_MODE
+ NppDarkMode::InitDarkMode(app_config->get("dark_color_mode") == "1", app_config->get("sys_menu_enabled") == "1");
+#endif
+
if (m_last_config_version) {
if (*m_last_config_version < *Semver::parse(SLIC3R_VERSION))
check_older_app_config(*m_last_config_version, true);
@@ -1116,14 +1124,6 @@ bool GUI_App::on_init_inner()
app_config->set("version", SLIC3R_VERSION);
app_config->save();
- // If load_language() fails, the application closes.
- load_language(wxString(), true);
-
- wxInitAllImageHandlers();
-
-#ifdef _MSW_DARK_MODE
- NppDarkMode::InitDarkMode(app_config->get("dark_color_mode") == "1", app_config->get("sys_menu_enabled") == "1");
-#endif
SplashScreen* scrn = nullptr;
if (app_config->get("show_splash_screen") == "1") {
// make a bitmap with dark grey banner on the left side
@@ -1147,8 +1147,6 @@ bool GUI_App::on_init_inner()
scrn->SetText(_L("Loading configuration")+ dots);
}
-
-
preset_bundle = new PresetBundle();
// just checking for existence of Slic3r::data_dir is not enough : it may be an empty directory
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp
index 393be1a4e..97ab7094c 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp
@@ -50,13 +50,12 @@ float GLGizmoBase::Grabber::get_dragging_half_size(float size) const
void GLGizmoBase::Grabber::render(float size, const std::array<float, 4>& render_color, bool picking) const
{
- if (! cube_initialized) {
+ if (!cube.is_initialized()) {
// This cannot be done in constructor, OpenGL is not yet
// initialized at that point (on Linux at least).
indexed_triangle_set mesh = its_make_cube(1., 1., 1.);
its_translate(mesh, Vec3f(-0.5, -0.5, -0.5));
const_cast<GLModel&>(cube).init_from(mesh, BoundingBoxf3{ { -0.5, -0.5, -0.5 }, { 0.5, 0.5, 0.5 } });
- const_cast<bool&>(cube_initialized) = true;
}
float fullsize = 2 * (dragging ? get_dragging_half_size(size) : get_half_size(size));
@@ -90,15 +89,11 @@ GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, u
m_base_color = DEFAULT_BASE_COLOR;
m_drag_color = DEFAULT_DRAG_COLOR;
m_highlight_color = DEFAULT_HIGHLIGHT_COLOR;
- m_cone.init_from(its_make_cone(1., 1., 2 * PI / 24));
- m_sphere.init_from(its_make_sphere(1., (2 * M_PI) / 24.));
- m_cylinder.init_from(its_make_cylinder(1., 1., 2 * PI / 24.));
}
void GLGizmoBase::set_hover_id(int id)
{
- if (m_grabbers.empty() || (id < (int)m_grabbers.size()))
- {
+ if (m_grabbers.empty() || id < (int)m_grabbers.size()) {
m_hover_id = id;
on_set_hover_id();
}
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp
index 66ca4fca2..1e2cd93fb 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp
@@ -66,7 +66,6 @@ protected:
void render(float size, const std::array<float, 4>& render_color, bool picking) const;
GLModel cube;
- bool cube_initialized = false;
};
public:
@@ -105,9 +104,6 @@ protected:
bool m_first_input_window_render;
mutable std::string m_tooltip;
CommonGizmosDataPool* m_c;
- GLModel m_cone;
- GLModel m_cylinder;
- GLModel m_sphere;
public:
GLGizmoBase(GLCanvas3D& parent,
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
index 691a86706..a001d5a81 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
@@ -20,7 +20,6 @@ namespace GUI {
GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
: GLGizmoBase(parent, icon_filename, sprite_id)
{
- m_vbo_cylinder.init_from(its_make_cylinder(1., 1.));
}
@@ -63,6 +62,9 @@ void GLGizmoHollow::set_sla_support_data(ModelObject*, const Selection&)
void GLGizmoHollow::on_render()
{
+ if (!m_cylinder.is_initialized())
+ m_cylinder.init_from(its_make_cylinder(1.0, 1.0));
+
const Selection& selection = m_parent.get_selection();
const CommonGizmosDataObjects::SelectionInfo* sel_info = m_c->selection_info();
@@ -148,11 +150,11 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons
}
}
- const_cast<GLModel*>(&m_vbo_cylinder)->set_color(-1, render_color);
+ const_cast<GLModel*>(&m_cylinder)->set_color(-1, render_color);
// Inverse matrix of the instance scaling is applied so that the mark does not scale with the object.
glsafe(::glPushMatrix());
- glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2)));
+ glsafe(::glTranslatef(drain_hole.pos.x(), drain_hole.pos.y(), drain_hole.pos.z()));
glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data()));
if (vol->is_left_handed())
@@ -166,7 +168,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons
glsafe(::glPushMatrix());
glsafe(::glTranslated(0., 0., -drain_hole.height));
glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength));
- m_vbo_cylinder.render();
+ m_cylinder.render();
glsafe(::glPopMatrix());
if (vol->is_left_handed())
@@ -549,9 +551,13 @@ RENDER_AGAIN:
m_imgui->text(m_desc.at("offset"));
ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x);
ImGui::PushItemWidth(window_width - settings_sliders_left);
+#if ENABLE_ENHANCED_IMGUI_SLIDER_FLOAT
+ m_imgui->slider_float("##offset", &offset, offset_min, offset_max, "%.1f mm", 1.0f, true, _L(opts[0].second->tooltip));
+#else
m_imgui->slider_float("##offset", &offset, offset_min, offset_max, "%.1f mm");
if (m_imgui->get_last_slider_status().hovered)
m_imgui->tooltip((_utf8(opts[0].second->tooltip)).c_str(), max_tooltip_width);
+#endif // ENABLE_ENHANCED_IMGUI_SLIDER_FLOAT
bool slider_clicked = m_imgui->get_last_slider_status().clicked; // someone clicked the slider
bool slider_edited =m_imgui->get_last_slider_status().edited; // someone is dragging the slider
@@ -561,9 +567,13 @@ RENDER_AGAIN:
ImGui::AlignTextToFramePadding();
m_imgui->text(m_desc.at("quality"));
ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x);
+#if ENABLE_ENHANCED_IMGUI_SLIDER_FLOAT
+ m_imgui->slider_float("##quality", &quality, quality_min, quality_max, "%.1f", 1.0f, true, _L(opts[1].second->tooltip));
+#else
m_imgui->slider_float("##quality", &quality, quality_min, quality_max, "%.1f");
if (m_imgui->get_last_slider_status().hovered)
m_imgui->tooltip((_utf8(opts[1].second->tooltip)).c_str(), max_tooltip_width);
+#endif // ENABLE_ENHANCED_IMGUI_SLIDER_FLOAT
slider_clicked |= m_imgui->get_last_slider_status().clicked;
slider_edited |= m_imgui->get_last_slider_status().edited;
@@ -574,9 +584,13 @@ RENDER_AGAIN:
ImGui::AlignTextToFramePadding();
m_imgui->text(m_desc.at("closing_distance"));
ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x);
+#if ENABLE_ENHANCED_IMGUI_SLIDER_FLOAT
+ m_imgui->slider_float("##closing_distance", &closing_d, closing_d_min, closing_d_max, "%.1f mm", 1.0f, true, _L(opts[2].second->tooltip));
+#else
m_imgui->slider_float("##closing_distance", &closing_d, closing_d_min, closing_d_max, "%.1f mm");
if (m_imgui->get_last_slider_status().hovered)
m_imgui->tooltip((_utf8(opts[2].second->tooltip)).c_str(), max_tooltip_width);
+#endif // ENABLE_ENHANCED_IMGUI_SLIDER_FLOAT
slider_clicked |= m_imgui->get_last_slider_status().clicked;
slider_edited |= m_imgui->get_last_slider_status().edited;
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp
index 2cf08de2a..bc144c297 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp
@@ -48,7 +48,8 @@ private:
ObjectID m_old_mo_id = -1;
- GLModel m_vbo_cylinder;
+ GLModel m_cylinder;
+
float m_new_hole_radius = 2.f; // Size of a new hole.
float m_new_hole_height = 6.f;
mutable std::vector<bool> m_selected; // which holes are currently selected
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp
index e73a85647..d16f0ff2d 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp
@@ -20,7 +20,6 @@ GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filenam
, m_starting_box_center(Vec3d::Zero())
, m_starting_box_bottom_center(Vec3d::Zero())
{
- m_vbo_cone.init_from(its_make_cone(1., 1., 2*PI/36));
}
std::string GLGizmoMove3D::get_tooltip() const
@@ -89,6 +88,9 @@ void GLGizmoMove3D::on_update(const UpdateData& data)
void GLGizmoMove3D::on_render()
{
+ if (!m_cone.is_initialized())
+ m_cone.init_from(its_make_cone(1.0, 1.0, double(PI) / 18.0));
+
const Selection& selection = m_parent.get_selection();
glsafe(::glClear(GL_DEPTH_BUFFER_BIT));
@@ -205,7 +207,7 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box
if (shader == nullptr)
return;
- const_cast<GLModel*>(&m_vbo_cone)->set_color(-1, color);
+ const_cast<GLModel*>(&m_cone)->set_color(-1, color);
if (!picking) {
shader->start_using();
shader->set_uniform("emission_factor", 0.1f);
@@ -220,7 +222,7 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box
glsafe(::glTranslated(0.0, 0.0, 2.0 * size));
glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size));
- m_vbo_cone.render();
+ m_cone.render();
glsafe(::glPopMatrix());
if (! picking)
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp
index baa2df739..2d331bfb5 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp
@@ -19,7 +19,7 @@ class GLGizmoMove3D : public GLGizmoBase
Vec3d m_starting_box_center;
Vec3d m_starting_box_bottom_center;
- GLModel m_vbo_cone;
+ GLModel m_cone;
public:
GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp
index 5bcc888ed..fa59d7646 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp
@@ -18,13 +18,17 @@
namespace Slic3r::GUI {
+ std::shared_ptr<GLIndexedVertexArray> GLGizmoPainterBase::s_sphere = nullptr;
GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
: GLGizmoBase(parent, icon_filename, sprite_id)
{
- // Make sphere and save it into a vertex buffer.
- m_vbo_sphere.load_its_flat_shading(its_make_sphere(1., (2*M_PI)/24.));
- m_vbo_sphere.finalize_geometry(true);
+}
+
+GLGizmoPainterBase::~GLGizmoPainterBase()
+{
+ if (s_sphere != nullptr && s_sphere->has_VBOs())
+ s_sphere->release_geometry();
}
void GLGizmoPainterBase::set_painter_gizmo_data(const Selection& selection)
@@ -184,6 +188,12 @@ void GLGizmoPainterBase::render_cursor_circle() const
void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const
{
+ if (s_sphere == nullptr) {
+ s_sphere = std::make_shared<GLIndexedVertexArray>();
+ s_sphere->load_its_flat_shading(its_make_sphere(1.0, double(PI) / 12.0));
+ s_sphere->finalize_geometry(true);
+ }
+
const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_matrix(true, true, false, true).inverse();
const bool is_left_handed = Geometry::Transformation(trafo).is_left_handed();
@@ -204,7 +214,8 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const
render_color = this->get_cursor_sphere_right_button_color();
glsafe(::glColor4fv(render_color.data()));
- m_vbo_sphere.render();
+ assert(s_sphere != nullptr);
+ s_sphere->render();
if (is_left_handed)
glFrontFace(GL_CCW);
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp
index 97ac8e4e9..ea6760a17 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp
@@ -12,6 +12,7 @@
#include <cereal/types/vector.hpp>
#include <GL/glew.h>
+#include <memory>
namespace Slic3r::GUI {
@@ -112,7 +113,7 @@ private:
void on_render_for_picking() override {}
public:
GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
- ~GLGizmoPainterBase() override = default;
+ virtual ~GLGizmoPainterBase() override;
virtual void set_painter_gizmo_data(const Selection& selection);
virtual bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down);
@@ -202,7 +203,7 @@ private:
const Camera& camera,
const std::vector<Transform3d>& trafo_matrices) const;
- GLIndexedVertexArray m_vbo_sphere;
+ static std::shared_ptr<GLIndexedVertexArray> s_sphere;
bool m_internal_stack_active = false;
bool m_schedule_update = false;
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp
index 61fe6e709..a234a19ff 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp
@@ -39,20 +39,6 @@ GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis)
{
}
-GLGizmoRotate::GLGizmoRotate(const GLGizmoRotate& other)
- : GLGizmoBase(other.m_parent, other.m_icon_filename, other.m_sprite_id)
- , m_axis(other.m_axis)
- , m_angle(other.m_angle)
- , m_center(other.m_center)
- , m_radius(other.m_radius)
- , m_snap_coarse_in_radius(other.m_snap_coarse_in_radius)
- , m_snap_coarse_out_radius(other.m_snap_coarse_out_radius)
- , m_snap_fine_in_radius(other.m_snap_fine_in_radius)
- , m_snap_fine_out_radius(other.m_snap_fine_out_radius)
-{
-}
-
-
void GLGizmoRotate::set_angle(double angle)
{
if (std::abs(angle - 2.0 * (double)PI) < EPSILON)
@@ -130,6 +116,9 @@ void GLGizmoRotate::on_render()
if (!m_grabbers[0].enabled)
return;
+ if (!m_cone.is_initialized())
+ m_cone.init_from(its_make_cone(1.0, 1.0, double(PI) / 12.0));
+
const Selection& selection = m_parent.get_selection();
const BoundingBoxf3& box = selection.get_bounding_box();
@@ -433,11 +422,8 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, cons
GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
: GLGizmoBase(parent, icon_filename, sprite_id)
+ , m_gizmos({ GLGizmoRotate(parent, GLGizmoRotate::X), GLGizmoRotate(parent, GLGizmoRotate::Y), GLGizmoRotate(parent, GLGizmoRotate::Z) })
{
- m_gizmos.emplace_back(parent, GLGizmoRotate::X);
- m_gizmos.emplace_back(parent, GLGizmoRotate::Y);
- m_gizmos.emplace_back(parent, GLGizmoRotate::Z);
-
for (unsigned int i = 0; i < 3; ++i) {
m_gizmos[i].set_group_id(i);
}
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp
index 3245c4dbe..af1ecf548 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp
@@ -4,7 +4,6 @@
#include "GLGizmoBase.hpp"
#include "../Jobs/RotoptimizeJob.hpp"
-
namespace Slic3r {
namespace GUI {
@@ -40,9 +39,10 @@ private:
mutable float m_snap_fine_in_radius;
mutable float m_snap_fine_out_radius;
+ GLModel m_cone;
+
public:
GLGizmoRotate(GLCanvas3D& parent, Axis axis);
- GLGizmoRotate(const GLGizmoRotate& other);
virtual ~GLGizmoRotate() = default;
double get_angle() const { return m_angle; }
@@ -74,7 +74,7 @@ private:
class GLGizmoRotate3D : public GLGizmoBase
{
- std::vector<GLGizmoRotate> m_gizmos;
+ std::array<GLGizmoRotate, 3> m_gizmos;
public:
GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
index 29e1fd2f3..51551281a 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
@@ -77,6 +77,13 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S
void GLGizmoSlaSupports::on_render()
{
+ if (!m_cone.is_initialized())
+ m_cone.init_from(its_make_cone(1.0, 1.0, double(PI) / 12.0));
+ if (!m_sphere.is_initialized())
+ m_sphere.init_from(its_make_sphere(1.0, double(PI) / 12.0));
+ if (!m_cylinder.is_initialized())
+ m_cylinder.init_from(its_make_cylinder(1.0, 1.0, double(PI) / 12.0));
+
ModelObject* mo = m_c->selection_info()->model_object();
const Selection& selection = m_parent.get_selection();
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp
index 35e6a7308..92d085f37 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp
@@ -91,6 +91,10 @@ private:
std::vector<sla::SupportPoint> m_normal_cache; // to restore after discarding changes or undo/redo
ObjectID m_old_mo_id;
+ GLModel m_cone;
+ GLModel m_cylinder;
+ GLModel m_sphere;
+
// This map holds all translated description texts, so they can be easily referenced during layout calculations
// etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect.
std::map<std::string, wxString> m_desc;
diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp
index f5fb4f82c..417ab60fa 100644
--- a/src/slic3r/GUI/Tab.cpp
+++ b/src/slic3r/GUI/Tab.cpp
@@ -1769,11 +1769,14 @@ void TabPrint::update()
// Note: This workaround works till "support_material" and "overhangs" is exclusive sets of mutually no-exclusive parameters.
// But it should be corrected when we will have more such sets.
// Disable check of the compatibility of the "support_material" and "overhangs" options for saved user profile
- if (!m_config_manipulation.is_initialized_support_material_overhangs_queried()) {
+ // or for profile which was loaded from 3mf
+// if (!m_config_manipulation.is_initialized_support_material_overhangs_queried())
+ if (bool support_material_overhangs_queried = m_config->opt_bool("support_material") && !m_config->opt_bool("overhangs"))
+ {
const Preset& selected_preset = m_preset_bundle->prints.get_selected_preset();
bool is_user_and_saved_preset = !selected_preset.is_system && !selected_preset.is_dirty;
- bool support_material_overhangs_queried = m_config->opt_bool("support_material") && !m_config->opt_bool("overhangs");
- m_config_manipulation.initialize_support_material_overhangs_queried(is_user_and_saved_preset && support_material_overhangs_queried);
+ bool is_saved_in_3mf_preset = selected_preset.is_dirty && !wxGetApp().plater()->is_presets_dirty();
+ m_config_manipulation.initialize_support_material_overhangs_queried((is_user_and_saved_preset || is_saved_in_3mf_preset) && support_material_overhangs_queried);
}
m_config_manipulation.update_print_fff_config(m_config, true);
diff --git a/src/slic3r/GUI/fts_fuzzy_match.h b/src/slic3r/GUI/fts_fuzzy_match.h
index 379fd9c74..29dd34835 100644
--- a/src/slic3r/GUI/fts_fuzzy_match.h
+++ b/src/slic3r/GUI/fts_fuzzy_match.h
@@ -33,6 +33,7 @@
#include <cstdint> // uint8_t
#include <ctype.h> // ::tolower, ::toupper
+#include <cwctype> // std::towlower, std::towupper
#include <cstring> // memcpy
#include <cstdio>