diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 88e1a9047..376b34ca8 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -1713,7 +1713,9 @@ namespace Slic3r { break; } } +#if !ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE Transform3d inv_matrix = volume_matrix_to_object.inverse(); +#endif // !ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE // splits volume out of imported geometry TriangleMesh triangle_mesh; @@ -1733,11 +1735,15 @@ namespace Slic3r { for (unsigned int v = 0; v < 3; ++v) { unsigned int tri_id = geometry.triangles[src_start_id + ii + v] * 3; +#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE + facet.vertex[v] = Vec3f(geometry.vertices[tri_id + 0], geometry.vertices[tri_id + 1], geometry.vertices[tri_id + 2]); +#else Vec3f vertex(geometry.vertices[tri_id + 0], geometry.vertices[tri_id + 1], geometry.vertices[tri_id + 2]); facet.vertex[v] = has_transform ? // revert the vertices to the original mesh reference system (inv_matrix * vertex.cast<double>()).cast<float>() : vertex; +#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE } } @@ -1745,9 +1751,15 @@ namespace Slic3r { triangle_mesh.repair(); ModelVolume* volume = object.add_volume(std::move(triangle_mesh)); +#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE + // stores the volume matrix taken from the metadata, if present + if (has_transform) + volume->source.transform = Slic3r::Geometry::Transformation(volume_matrix_to_object); +#else // apply the volume matrix taken from the metadata, if present if (has_transform) volume->set_transformation(Slic3r::Geometry::Transformation(volume_matrix_to_object)); +#endif //ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE volume->calculate_convex_hull(); // apply the remaining volume's metadata @@ -2521,7 +2533,11 @@ namespace Slic3r { // stores volume's local matrix stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << MATRIX_KEY << "\" " << VALUE_ATTR << "=\""; +#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE + Transform3d matrix = volume->get_matrix() * volume->source.transform.get_matrix(); +#else const Transform3d& matrix = volume->get_matrix(); +#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE for (int r = 0; r < 4; ++r) { for (int c = 0; c < 4; ++c) diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index 4b19b8060..847ac6f5c 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -585,24 +585,36 @@ void AMFParserContext::endElement(const char * /* name */) stl_allocate(&stl); bool has_transform = ! m_volume_transform.isApprox(Transform3d::Identity(), 1e-10); +#if !ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE Transform3d inv_matrix = m_volume_transform.inverse(); +#endif // !ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE for (size_t i = 0; i < m_volume_facets.size();) { stl_facet &facet = stl.facet_start[i/3]; for (unsigned int v = 0; v < 3; ++v) { unsigned int tri_id = m_volume_facets[i++] * 3; +#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE + facet.vertex[v] = Vec3f(m_object_vertices[tri_id + 0], m_object_vertices[tri_id + 1], m_object_vertices[tri_id + 2]); +#else Vec3f vertex(m_object_vertices[tri_id + 0], m_object_vertices[tri_id + 1], m_object_vertices[tri_id + 2]); facet.vertex[v] = has_transform ? // revert the vertices to the original mesh reference system (inv_matrix * vertex.cast<double>()).cast<float>() : vertex; +#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE } } stl_get_size(&stl); mesh.repair(); m_volume->set_mesh(std::move(mesh)); - if (has_transform) - m_volume->set_transformation(m_volume_transform); +#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE + // stores the volume matrix taken from the metadata, if present + if (has_transform) + m_volume->source.transform = Slic3r::Geometry::Transformation(m_volume_transform); +#else + if (has_transform) + m_volume->set_transformation(m_volume_transform); +#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE if (m_volume->source.input_file.empty() && (m_volume->type() == ModelVolumeType::MODEL_PART)) { m_volume->source.object_idx = (int)m_model.objects.size() - 1; @@ -1147,8 +1159,12 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) stream << " <metadata type=\"slic3r.modifier\">1</metadata>\n"; stream << " <metadata type=\"slic3r.volume_type\">" << ModelVolume::type_to_string(volume->type()) << "</metadata>\n"; stream << " <metadata type=\"slic3r.matrix\">"; +#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE + const Transform3d& matrix = volume->get_matrix() * volume->source.transform.get_matrix(); +#else const Transform3d& matrix = volume->get_matrix(); - stream << std::setprecision(std::numeric_limits<double>::max_digits10); +#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE + stream << std::setprecision(std::numeric_limits<double>::max_digits10); for (int r = 0; r < 4; ++r) { for (int c = 0; c < 4; ++c) @@ -1248,7 +1264,7 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) pt::write_xml(oss, tree); out = oss.str(); - int del_header_pos = out.find("<custom_gcodes_per_height"); + size_t del_header_pos = out.find("<custom_gcodes_per_height"); if (del_header_pos != std::string::npos) out.erase(out.begin(), out.begin() + del_header_pos); diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index a6ee04600..c5a992e49 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -399,8 +399,13 @@ public: int object_idx{ -1 }; int volume_idx{ -1 }; Vec3d mesh_offset{ Vec3d::Zero() }; +#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE + Geometry::Transformation transform; + template<class Archive> void serialize(Archive& ar) { ar(input_file, object_idx, volume_idx, mesh_offset, transform); } +#else template<class Archive> void serialize(Archive& ar) { ar(input_file, object_idx, volume_idx, mesh_offset); } +#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE }; Source source; diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index d503f0c64..3d1234cbf 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -56,4 +56,7 @@ // Enable closing 3Dconnextion imgui settings dialog by clicking on [X] and [Close] buttons #define ENABLE_3DCONNEXION_DEVICES_CLOSE_SETTING_DIALOG (1 && ENABLE_2_2_0_ALPHA1) +// Enable not applying volume transformation during 3mf and amf loading, but keeping it as a ModelVolume member +#define ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE (1 && ENABLE_2_2_0_ALPHA1) + #endif // _technologies_h_ diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8b452e9af..ef3dae8d6 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3322,7 +3322,11 @@ void Plater::priv::reload_from_disk() new_volume->config.apply(old_volume->config); new_volume->set_type(old_volume->type()); new_volume->set_material_id(old_volume->material_id()); +#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE + new_volume->set_transformation(old_volume->get_transformation() * old_volume->source.transform); +#else new_volume->set_transformation(old_volume->get_transformation()); +#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset)); new_volume->source.input_file = path; std::swap(old_model_object->volumes[old_v.volume_idx], old_model_object->volumes.back());