Merge branch 'dev' of https://github.com/prusa3d/PrusaSlicer into et_color_class
This commit is contained in:
commit
48098fbaff
3
deps/Boost/Boost.cmake
vendored
3
deps/Boost/Boost.cmake
vendored
@ -28,6 +28,9 @@ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
|||||||
elseif (MSVC_VERSION LESS 1930)
|
elseif (MSVC_VERSION LESS 1930)
|
||||||
# 1920-1929 = VS 16.0 (v142 toolset)
|
# 1920-1929 = VS 16.0 (v142 toolset)
|
||||||
set(_boost_toolset "msvc-14.2")
|
set(_boost_toolset "msvc-14.2")
|
||||||
|
elseif (MSVC_VERSION LESS 1940)
|
||||||
|
# 1930-1939 = VS 17.0 (v143 toolset)
|
||||||
|
set(_boost_toolset "msvc-14.3")
|
||||||
else ()
|
else ()
|
||||||
message(FATAL_ERROR "Unsupported MSVC version")
|
message(FATAL_ERROR "Unsupported MSVC version")
|
||||||
endif ()
|
endif ()
|
||||||
|
4
deps/deps-windows.cmake
vendored
4
deps/deps-windows.cmake
vendored
@ -15,6 +15,10 @@ elseif (MSVC_VERSION LESS 1930)
|
|||||||
# 1920-1929 = VS 16.0 (v142 toolset)
|
# 1920-1929 = VS 16.0 (v142 toolset)
|
||||||
set(DEP_VS_VER "16")
|
set(DEP_VS_VER "16")
|
||||||
set(DEP_BOOST_TOOLSET "msvc-14.2")
|
set(DEP_BOOST_TOOLSET "msvc-14.2")
|
||||||
|
elseif (MSVC_VERSION LESS 1940)
|
||||||
|
# 1930-1939 = VS 17.0 (v143 toolset)
|
||||||
|
set(DEP_VS_VER "17")
|
||||||
|
set(DEP_BOOST_TOOLSET "msvc-14.3")
|
||||||
else ()
|
else ()
|
||||||
message(FATAL_ERROR "Unsupported MSVC version")
|
message(FATAL_ERROR "Unsupported MSVC version")
|
||||||
endif ()
|
endif ()
|
||||||
|
@ -2753,7 +2753,8 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->label = L("Synchronize with object layers");
|
def->label = L("Synchronize with object layers");
|
||||||
def->category = L("Support material");
|
def->category = L("Support material");
|
||||||
def->tooltip = L("Synchronize support layers with the object print layers. This is useful "
|
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->mode = comExpert;
|
||||||
def->set_default_value(new ConfigOptionBool(false));
|
def->set_default_value(new ConfigOptionBool(false));
|
||||||
|
|
||||||
|
@ -2522,23 +2522,33 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese
|
|||||||
{
|
{
|
||||||
wxString header, caption = _L("Configuration is edited in ConfigWizard");
|
wxString header, caption = _L("Configuration is edited in ConfigWizard");
|
||||||
const auto enabled_vendors = appconfig_new.vendors();
|
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());
|
bool suppress_sla_printer = model_has_multi_part_objects(wxGetApp().model());
|
||||||
PrinterTechnology preferred_pt = ptAny;
|
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);
|
const auto config = enabled_vendors.find(bundle_name);
|
||||||
PrinterTechnology pt = ptAny;
|
PrinterTechnology pt = ptAny;
|
||||||
if (config != enabled_vendors.end()) {
|
if (config != enabled_vendors.end()) {
|
||||||
for (const auto& model : bundle.vendor_profile->models) {
|
for (const auto& model : bundle.vendor_profile->models) {
|
||||||
if (const auto model_it = config->second.find(model.id);
|
if (const auto model_it = config->second.find(model.id);
|
||||||
model_it != config->second.end() && model_it->second.size() > 0) {
|
model_it != config->second.end() && model_it->second.size() > 0) {
|
||||||
if (pt == ptAny)
|
pt = model.technology;
|
||||||
pt = model.technology;
|
const auto config_old = enabled_vendors_old.find(bundle_name);
|
||||||
// if preferred printer model has SLA printer technology it's important to check the model for multypart state
|
if (config_old == enabled_vendors_old.end() || config_old->second.find(model.id) == config_old->second.end()) {
|
||||||
if (pt == ptSLA && suppress_sla_printer)
|
// if preferred printer model has SLA printer technology it's important to check the model for multi-part state
|
||||||
continue;
|
if (pt == ptSLA && suppress_sla_printer)
|
||||||
else
|
continue;
|
||||||
return pt;
|
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_model;
|
||||||
std::string preferred_variant;
|
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) {
|
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);
|
const auto config = enabled_vendors.find(bundle_name);
|
||||||
if (config == enabled_vendors.end())
|
if (config == enabled_vendors.end())
|
||||||
|
@ -2661,7 +2661,7 @@ void GCodeViewer::render_toolpaths()
|
|||||||
// Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415.
|
// Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415.
|
||||||
assert(! path.sizes.empty());
|
assert(! path.sizes.empty());
|
||||||
assert(! path.offsets.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()));
|
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
|
#if ENABLE_GCODE_VIEWER_STATISTICS
|
||||||
++m_statistics.gl_multi_points_calls_count;
|
++m_statistics.gl_multi_points_calls_count;
|
||||||
@ -2685,7 +2685,7 @@ void GCodeViewer::render_toolpaths()
|
|||||||
// Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415.
|
// Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415.
|
||||||
assert(! path.sizes.empty());
|
assert(! path.sizes.empty());
|
||||||
assert(! path.offsets.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()));
|
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
|
#if ENABLE_GCODE_VIEWER_STATISTICS
|
||||||
++m_statistics.gl_multi_lines_calls_count;
|
++m_statistics.gl_multi_lines_calls_count;
|
||||||
@ -2703,7 +2703,7 @@ void GCodeViewer::render_toolpaths()
|
|||||||
// Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415.
|
// Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415.
|
||||||
assert(! path.sizes.empty());
|
assert(! path.sizes.empty());
|
||||||
assert(! path.offsets.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()));
|
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
|
#if ENABLE_GCODE_VIEWER_STATISTICS
|
||||||
++m_statistics.gl_multi_triangles_calls_count;
|
++m_statistics.gl_multi_triangles_calls_count;
|
||||||
|
@ -206,154 +206,104 @@ void GLShaderProgram::stop_using() const
|
|||||||
glsafe(::glUseProgram(0));
|
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)
|
||||||
if (id >= 0) {
|
glsafe(::glUniform1i(id, value));
|
||||||
glsafe(::glUniform1i(id, static_cast<GLint>(value)));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
if (id >= 0) {
|
glsafe(::glUniform1f(id, value));
|
||||||
glsafe(::glUniform1f(id, static_cast<GLfloat>(value)));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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())));
|
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())));
|
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())));
|
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())));
|
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())));
|
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())));
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GLShaderProgram::set_uniform(const char* name, const Transform3f& value) const
|
|
||||||
{
|
|
||||||
int id = get_uniform_location(name);
|
|
||||||
if (id >= 0) {
|
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)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLShaderProgram::set_uniform(int id, const Transform3f& value) const
|
||||||
|
{
|
||||||
|
if (id >= 0)
|
||||||
glsafe(::glUniformMatrix4fv(id, 1, GL_FALSE, static_cast<const GLfloat*>(value.matrix().data())));
|
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())));
|
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())));
|
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
|
int GLShaderProgram::get_attrib_location(const char* name) const
|
||||||
|
@ -44,22 +44,39 @@ public:
|
|||||||
void start_using() const;
|
void start_using() const;
|
||||||
void stop_using() const;
|
void stop_using() const;
|
||||||
|
|
||||||
bool set_uniform(const char* name, int value) const;
|
void set_uniform(const char* name, int value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, bool value) const;
|
void set_uniform(const char* name, bool value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, float value) const;
|
void set_uniform(const char* name, float value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, double value) const;
|
void set_uniform(const char* name, double value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, const std::array<int, 2>& value) const;
|
void set_uniform(const char* name, const std::array<int, 2>& value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, const std::array<int, 3>& value) const;
|
void set_uniform(const char* name, const std::array<int, 3>& value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, const std::array<int, 4>& value) const;
|
void set_uniform(const char* name, const std::array<int, 4>& value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, const std::array<float, 2>& value) const;
|
void set_uniform(const char* name, const std::array<float, 2>& value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, const std::array<float, 3>& value) const;
|
void set_uniform(const char* name, const std::array<float, 3>& value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, const std::array<float, 4>& value) const;
|
void set_uniform(const char* name, const std::array<float, 4>& value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, const float* value, size_t size) const;
|
void set_uniform(const char* name, const float* value, size_t size) const { set_uniform(get_uniform_location(name), value, size); }
|
||||||
bool set_uniform(const char* name, const Transform3f& value) const;
|
void set_uniform(const char* name, const Transform3f& value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, const Transform3d& value) const;
|
void set_uniform(const char* name, const Transform3d& value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, const Matrix3f& value) const;
|
void set_uniform(const char* name, const Matrix3f& value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, const Vec3f& value) const;
|
void set_uniform(const char* name, const Vec3f& value) const { set_uniform(get_uniform_location(name), value); }
|
||||||
bool set_uniform(const char* name, const Vec3d& value) const;
|
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
|
// returns -1 if not found
|
||||||
int get_attrib_location(const char* name) const;
|
int get_attrib_location(const char* name) const;
|
||||||
|
@ -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
|
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
|
// This cannot be done in constructor, OpenGL is not yet
|
||||||
// initialized at that point (on Linux at least).
|
// initialized at that point (on Linux at least).
|
||||||
indexed_triangle_set mesh = its_make_cube(1., 1., 1.);
|
indexed_triangle_set mesh = its_make_cube(1., 1., 1.);
|
||||||
its_translate(mesh, Vec3f(-0.5, -0.5, -0.5));
|
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<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));
|
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_base_color = DEFAULT_BASE_COLOR;
|
||||||
m_drag_color = DEFAULT_DRAG_COLOR;
|
m_drag_color = DEFAULT_DRAG_COLOR;
|
||||||
m_highlight_color = DEFAULT_HIGHLIGHT_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)
|
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;
|
m_hover_id = id;
|
||||||
on_set_hover_id();
|
on_set_hover_id();
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,6 @@ protected:
|
|||||||
void render(float size, const std::array<float, 4>& render_color, bool picking) const;
|
void render(float size, const std::array<float, 4>& render_color, bool picking) const;
|
||||||
|
|
||||||
GLModel cube;
|
GLModel cube;
|
||||||
bool cube_initialized = false;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -105,9 +104,6 @@ protected:
|
|||||||
bool m_first_input_window_render;
|
bool m_first_input_window_render;
|
||||||
mutable std::string m_tooltip;
|
mutable std::string m_tooltip;
|
||||||
CommonGizmosDataPool* m_c;
|
CommonGizmosDataPool* m_c;
|
||||||
GLModel m_cone;
|
|
||||||
GLModel m_cylinder;
|
|
||||||
GLModel m_sphere;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GLGizmoBase(GLCanvas3D& parent,
|
GLGizmoBase(GLCanvas3D& parent,
|
||||||
|
@ -20,7 +20,6 @@ namespace GUI {
|
|||||||
GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
|
GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
|
||||||
: GLGizmoBase(parent, icon_filename, 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()
|
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 Selection& selection = m_parent.get_selection();
|
||||||
const CommonGizmosDataObjects::SelectionInfo* sel_info = m_c->selection_info();
|
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.
|
// Inverse matrix of the instance scaling is applied so that the mark does not scale with the object.
|
||||||
glsafe(::glPushMatrix());
|
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()));
|
glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data()));
|
||||||
|
|
||||||
if (vol->is_left_handed())
|
if (vol->is_left_handed())
|
||||||
@ -166,7 +168,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons
|
|||||||
glsafe(::glPushMatrix());
|
glsafe(::glPushMatrix());
|
||||||
glsafe(::glTranslated(0., 0., -drain_hole.height));
|
glsafe(::glTranslated(0., 0., -drain_hole.height));
|
||||||
glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength));
|
glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength));
|
||||||
m_vbo_cylinder.render();
|
m_cylinder.render();
|
||||||
glsafe(::glPopMatrix());
|
glsafe(::glPopMatrix());
|
||||||
|
|
||||||
if (vol->is_left_handed())
|
if (vol->is_left_handed())
|
||||||
@ -549,9 +551,13 @@ RENDER_AGAIN:
|
|||||||
m_imgui->text(m_desc.at("offset"));
|
m_imgui->text(m_desc.at("offset"));
|
||||||
ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x);
|
ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x);
|
||||||
ImGui::PushItemWidth(window_width - settings_sliders_left);
|
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");
|
m_imgui->slider_float("##offset", &offset, offset_min, offset_max, "%.1f mm");
|
||||||
if (m_imgui->get_last_slider_status().hovered)
|
if (m_imgui->get_last_slider_status().hovered)
|
||||||
m_imgui->tooltip((_utf8(opts[0].second->tooltip)).c_str(), max_tooltip_width);
|
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_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
|
bool slider_edited =m_imgui->get_last_slider_status().edited; // someone is dragging the slider
|
||||||
@ -561,9 +567,13 @@ RENDER_AGAIN:
|
|||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
m_imgui->text(m_desc.at("quality"));
|
m_imgui->text(m_desc.at("quality"));
|
||||||
ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x);
|
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");
|
m_imgui->slider_float("##quality", &quality, quality_min, quality_max, "%.1f");
|
||||||
if (m_imgui->get_last_slider_status().hovered)
|
if (m_imgui->get_last_slider_status().hovered)
|
||||||
m_imgui->tooltip((_utf8(opts[1].second->tooltip)).c_str(), max_tooltip_width);
|
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_clicked |= m_imgui->get_last_slider_status().clicked;
|
||||||
slider_edited |= m_imgui->get_last_slider_status().edited;
|
slider_edited |= m_imgui->get_last_slider_status().edited;
|
||||||
@ -574,9 +584,13 @@ RENDER_AGAIN:
|
|||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
m_imgui->text(m_desc.at("closing_distance"));
|
m_imgui->text(m_desc.at("closing_distance"));
|
||||||
ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x);
|
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");
|
m_imgui->slider_float("##closing_distance", &closing_d, closing_d_min, closing_d_max, "%.1f mm");
|
||||||
if (m_imgui->get_last_slider_status().hovered)
|
if (m_imgui->get_last_slider_status().hovered)
|
||||||
m_imgui->tooltip((_utf8(opts[2].second->tooltip)).c_str(), max_tooltip_width);
|
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_clicked |= m_imgui->get_last_slider_status().clicked;
|
||||||
slider_edited |= m_imgui->get_last_slider_status().edited;
|
slider_edited |= m_imgui->get_last_slider_status().edited;
|
||||||
|
@ -48,7 +48,8 @@ private:
|
|||||||
|
|
||||||
ObjectID m_old_mo_id = -1;
|
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_radius = 2.f; // Size of a new hole.
|
||||||
float m_new_hole_height = 6.f;
|
float m_new_hole_height = 6.f;
|
||||||
mutable std::vector<bool> m_selected; // which holes are currently selected
|
mutable std::vector<bool> m_selected; // which holes are currently selected
|
||||||
|
@ -20,7 +20,6 @@ GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filenam
|
|||||||
, m_starting_box_center(Vec3d::Zero())
|
, m_starting_box_center(Vec3d::Zero())
|
||||||
, m_starting_box_bottom_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
|
std::string GLGizmoMove3D::get_tooltip() const
|
||||||
@ -89,6 +88,9 @@ void GLGizmoMove3D::on_update(const UpdateData& data)
|
|||||||
|
|
||||||
void GLGizmoMove3D::on_render()
|
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();
|
const Selection& selection = m_parent.get_selection();
|
||||||
|
|
||||||
glsafe(::glClear(GL_DEPTH_BUFFER_BIT));
|
glsafe(::glClear(GL_DEPTH_BUFFER_BIT));
|
||||||
@ -205,7 +207,7 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box
|
|||||||
if (shader == nullptr)
|
if (shader == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const_cast<GLModel*>(&m_vbo_cone)->set_color(-1, color);
|
const_cast<GLModel*>(&m_cone)->set_color(-1, color);
|
||||||
if (!picking) {
|
if (!picking) {
|
||||||
shader->start_using();
|
shader->start_using();
|
||||||
shader->set_uniform("emission_factor", 0.1f);
|
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(::glTranslated(0.0, 0.0, 2.0 * size));
|
||||||
glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size));
|
glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size));
|
||||||
m_vbo_cone.render();
|
m_cone.render();
|
||||||
glsafe(::glPopMatrix());
|
glsafe(::glPopMatrix());
|
||||||
|
|
||||||
if (! picking)
|
if (! picking)
|
||||||
|
@ -19,7 +19,7 @@ class GLGizmoMove3D : public GLGizmoBase
|
|||||||
Vec3d m_starting_box_center;
|
Vec3d m_starting_box_center;
|
||||||
Vec3d m_starting_box_bottom_center;
|
Vec3d m_starting_box_bottom_center;
|
||||||
|
|
||||||
GLModel m_vbo_cone;
|
GLModel m_cone;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
|
GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
|
||||||
|
@ -18,13 +18,17 @@
|
|||||||
|
|
||||||
namespace Slic3r::GUI {
|
namespace Slic3r::GUI {
|
||||||
|
|
||||||
|
std::shared_ptr<GLIndexedVertexArray> GLGizmoPainterBase::s_sphere = nullptr;
|
||||||
|
|
||||||
GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
|
GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
|
||||||
: GLGizmoBase(parent, icon_filename, 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)
|
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
|
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 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();
|
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();
|
render_color = this->get_cursor_sphere_right_button_color();
|
||||||
glsafe(::glColor4fv(render_color.data()));
|
glsafe(::glColor4fv(render_color.data()));
|
||||||
|
|
||||||
m_vbo_sphere.render();
|
assert(s_sphere != nullptr);
|
||||||
|
s_sphere->render();
|
||||||
|
|
||||||
if (is_left_handed)
|
if (is_left_handed)
|
||||||
glFrontFace(GL_CCW);
|
glFrontFace(GL_CCW);
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <cereal/types/vector.hpp>
|
#include <cereal/types/vector.hpp>
|
||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
|
||||||
namespace Slic3r::GUI {
|
namespace Slic3r::GUI {
|
||||||
@ -112,7 +113,7 @@ private:
|
|||||||
void on_render_for_picking() override {}
|
void on_render_for_picking() override {}
|
||||||
public:
|
public:
|
||||||
GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
|
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 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);
|
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 Camera& camera,
|
||||||
const std::vector<Transform3d>& trafo_matrices) const;
|
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_internal_stack_active = false;
|
||||||
bool m_schedule_update = false;
|
bool m_schedule_update = false;
|
||||||
|
@ -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)
|
void GLGizmoRotate::set_angle(double angle)
|
||||||
{
|
{
|
||||||
if (std::abs(angle - 2.0 * (double)PI) < EPSILON)
|
if (std::abs(angle - 2.0 * (double)PI) < EPSILON)
|
||||||
@ -130,6 +116,9 @@ void GLGizmoRotate::on_render()
|
|||||||
if (!m_grabbers[0].enabled)
|
if (!m_grabbers[0].enabled)
|
||||||
return;
|
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 Selection& selection = m_parent.get_selection();
|
||||||
const BoundingBoxf3& box = selection.get_bounding_box();
|
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)
|
GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
|
||||||
: GLGizmoBase(parent, icon_filename, 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) {
|
for (unsigned int i = 0; i < 3; ++i) {
|
||||||
m_gizmos[i].set_group_id(i);
|
m_gizmos[i].set_group_id(i);
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#include "GLGizmoBase.hpp"
|
#include "GLGizmoBase.hpp"
|
||||||
#include "../Jobs/RotoptimizeJob.hpp"
|
#include "../Jobs/RotoptimizeJob.hpp"
|
||||||
|
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
@ -40,9 +39,10 @@ private:
|
|||||||
mutable float m_snap_fine_in_radius;
|
mutable float m_snap_fine_in_radius;
|
||||||
mutable float m_snap_fine_out_radius;
|
mutable float m_snap_fine_out_radius;
|
||||||
|
|
||||||
|
GLModel m_cone;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GLGizmoRotate(GLCanvas3D& parent, Axis axis);
|
GLGizmoRotate(GLCanvas3D& parent, Axis axis);
|
||||||
GLGizmoRotate(const GLGizmoRotate& other);
|
|
||||||
virtual ~GLGizmoRotate() = default;
|
virtual ~GLGizmoRotate() = default;
|
||||||
|
|
||||||
double get_angle() const { return m_angle; }
|
double get_angle() const { return m_angle; }
|
||||||
@ -74,7 +74,7 @@ private:
|
|||||||
|
|
||||||
class GLGizmoRotate3D : public GLGizmoBase
|
class GLGizmoRotate3D : public GLGizmoBase
|
||||||
{
|
{
|
||||||
std::vector<GLGizmoRotate> m_gizmos;
|
std::array<GLGizmoRotate, 3> m_gizmos;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
|
GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
|
||||||
|
@ -77,6 +77,13 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S
|
|||||||
|
|
||||||
void GLGizmoSlaSupports::on_render()
|
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();
|
ModelObject* mo = m_c->selection_info()->model_object();
|
||||||
const Selection& selection = m_parent.get_selection();
|
const Selection& selection = m_parent.get_selection();
|
||||||
|
|
||||||
|
@ -91,6 +91,10 @@ private:
|
|||||||
std::vector<sla::SupportPoint> m_normal_cache; // to restore after discarding changes or undo/redo
|
std::vector<sla::SupportPoint> m_normal_cache; // to restore after discarding changes or undo/redo
|
||||||
ObjectID m_old_mo_id;
|
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
|
// 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.
|
// etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect.
|
||||||
std::map<std::string, wxString> m_desc;
|
std::map<std::string, wxString> m_desc;
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include <cstdint> // uint8_t
|
#include <cstdint> // uint8_t
|
||||||
#include <ctype.h> // ::tolower, ::toupper
|
#include <ctype.h> // ::tolower, ::toupper
|
||||||
|
#include <cwctype> // std::towlower, std::towupper
|
||||||
#include <cstring> // memcpy
|
#include <cstring> // memcpy
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
Loading…
Reference in New Issue
Block a user