From 98485fdcde2639d5edebcb9ef74029462e639f3a Mon Sep 17 00:00:00 2001 From: VailElla <63608800+VailElla@users.noreply.github.com> Date: Thu, 3 Sep 2026 16:40:57 +0800 Subject: [PATCH] perf: move rvalue meshes into model volumes --- src/libslic3r/Model.hpp | 6 ++++++ tests/fff_print/test_model.cpp | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 83440abfac..9d1771f7b0 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -1243,6 +1243,12 @@ class ModelVolume final : public ObjectBase if (mesh.facets_count() > 1) calculate_convex_hull(); } + ModelVolume(ModelObject *object, TriangleMesh &&mesh, ModelVolumeType type = ModelVolumeType::MODEL_PART) : + ModelVolume(object, std::make_shared(std::move(mesh)), type) + { + if (m_mesh->facets_count() > 1) + calculate_convex_hull(); + } ModelVolume(ModelObject *object, const std::shared_ptr &mesh, ModelVolumeType type = ModelVolumeType::MODEL_PART) : m_mesh(mesh), m_type(type), object(object) { assert(this->id().valid()); diff --git a/tests/fff_print/test_model.cpp b/tests/fff_print/test_model.cpp index 23c4a2d9a0..ce648baf51 100644 --- a/tests/fff_print/test_model.cpp +++ b/tests/fff_print/test_model.cpp @@ -7,6 +7,8 @@ #include #include +#include + #include "test_data.hpp" using namespace Slic3r; @@ -59,3 +61,19 @@ SCENARIO("Model construction", "[Model]") { } } } + +TEST_CASE("ModelObject moves rvalue mesh storage into a volume", "[Model]") +{ + Model model; + ModelObject *object = model.add_object(); + TriangleMesh mesh = make_cube(20, 20, 20); + + const Vec3f *vertices = mesh.its.vertices.data(); + const Vec3i *indices = mesh.its.indices.data(); + + const ModelVolume *volume = object->add_volume(std::move(mesh), ModelVolumeType::MODEL_PART, false); + + REQUIRE(volume->mesh().its.vertices.data() == vertices); + REQUIRE(volume->mesh().its.indices.data() == indices); + REQUIRE(!volume->get_convex_hull().empty()); +}