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
diff options
context:
space:
mode:
Diffstat (limited to 'src/libslic3r/Model.cpp')
-rw-r--r--src/libslic3r/Model.cpp71
1 files changed, 65 insertions, 6 deletions
diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp
index 3376cc888..1f8083aca 100644
--- a/src/libslic3r/Model.cpp
+++ b/src/libslic3r/Model.cpp
@@ -945,7 +945,11 @@ const BoundingBoxf3& ModelObject::raw_bounding_box() const
if (this->instances.empty())
throw Slic3r::InvalidArgument("Can't call raw_bounding_box() with no instances");
+#if ENABLE_WORLD_COORDINATE
+ const Transform3d inst_matrix = this->instances.front()->get_transformation().get_matrix_no_offset();
+#else
const Transform3d& inst_matrix = this->instances.front()->get_transformation().get_matrix(true);
+#endif // ENABLE_WORLD_COORDINATE
for (const ModelVolume *v : this->volumes)
if (v->is_model_part())
m_raw_bounding_box.merge(v->mesh().transformed_bounding_box(inst_matrix * v->get_matrix()));
@@ -957,9 +961,15 @@ const BoundingBoxf3& ModelObject::raw_bounding_box() const
BoundingBoxf3 ModelObject::instance_bounding_box(size_t instance_idx, bool dont_translate) const
{
BoundingBoxf3 bb;
+#if ENABLE_WORLD_COORDINATE
+ const Transform3d inst_matrix = dont_translate ?
+ this->instances[instance_idx]->get_transformation().get_matrix_no_offset() :
+ this->instances[instance_idx]->get_transformation().get_matrix();
+
+#else
const Transform3d& inst_matrix = this->instances[instance_idx]->get_transformation().get_matrix(dont_translate);
- for (ModelVolume *v : this->volumes)
- {
+#endif // ENABLE_WORLD_COORDINATE
+ for (ModelVolume *v : this->volumes) {
if (v->is_model_part())
bb.merge(v->mesh().transformed_bounding_box(inst_matrix * v->get_matrix()));
}
@@ -1368,9 +1378,12 @@ void ModelObject::split(ModelObjectPtrs* new_objects)
new_object->add_instance(*model_instance);
ModelVolume* new_vol = new_object->add_volume(*volume, std::move(mesh));
- for (ModelInstance* model_instance : new_object->instances)
- {
+ for (ModelInstance* model_instance : new_object->instances) {
+#if ENABLE_WORLD_COORDINATE
+ Vec3d shift = model_instance->get_transformation().get_matrix_no_offset() * new_vol->get_offset();
+#else
Vec3d shift = model_instance->get_transformation().get_matrix(true) * new_vol->get_offset();
+#endif // ENABLE_WORLD_COORDINATE
model_instance->set_offset(model_instance->get_offset() + shift);
}
@@ -1412,9 +1425,11 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx)
assert(instance_idx < this->instances.size());
const Geometry::Transformation reference_trafo = this->instances[instance_idx]->get_transformation();
+#if !ENABLE_WORLD_COORDINATE
if (Geometry::is_rotation_ninety_degrees(reference_trafo.get_rotation()))
// nothing to do, scaling in the world coordinate space is possible in the representation of Geometry::Transformation.
return;
+#endif // !ENABLE_WORLD_COORDINATE
bool left_handed = reference_trafo.is_left_handed();
bool has_mirrorring = ! reference_trafo.get_mirror().isApprox(Vec3d(1., 1., 1.));
@@ -1432,8 +1447,18 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx)
// Adjust the meshes.
// Transformation to be applied to the meshes.
+#if ENABLE_WORLD_COORDINATE
+ Geometry::Transformation reference_trafo_mod = reference_trafo;
+ reference_trafo_mod.reset_offset();
+ if (uniform_scaling)
+ reference_trafo_mod.reset_scaling_factor();
+ if (!has_mirrorring)
+ reference_trafo_mod.reset_mirror();
+ Eigen::Matrix3d mesh_trafo_3x3 = reference_trafo_mod.get_matrix().matrix().block<3, 3>(0, 0);
+#else
Eigen::Matrix3d mesh_trafo_3x3 = reference_trafo.get_matrix(true, false, uniform_scaling, ! has_mirrorring).matrix().block<3, 3>(0, 0);
- Transform3d volume_offset_correction = this->instances[instance_idx]->get_transformation().get_matrix().inverse() * reference_trafo.get_matrix();
+#endif // ENABLE_WORLD_COORDINATE
+ Transform3d volume_offset_correction = this->instances[instance_idx]->get_transformation().get_matrix().inverse() * reference_trafo.get_matrix();
for (ModelVolume *model_volume : this->volumes) {
const Geometry::Transformation volume_trafo = model_volume->get_transformation();
bool volume_left_handed = volume_trafo.is_left_handed();
@@ -1442,7 +1467,17 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx)
std::abs(volume_trafo.get_scaling_factor().x() - volume_trafo.get_scaling_factor().z()) < EPSILON;
double volume_new_scaling_factor = volume_uniform_scaling ? volume_trafo.get_scaling_factor().x() : 1.;
// Transform the mesh.
- Matrix3d volume_trafo_3x3 = volume_trafo.get_matrix(true, false, volume_uniform_scaling, !volume_has_mirrorring).matrix().block<3, 3>(0, 0);
+#if ENABLE_WORLD_COORDINATE
+ Geometry::Transformation volume_trafo_mod = volume_trafo;
+ volume_trafo_mod.reset_offset();
+ if (volume_uniform_scaling)
+ volume_trafo_mod.reset_scaling_factor();
+ if (!volume_has_mirrorring)
+ volume_trafo_mod.reset_mirror();
+ Eigen::Matrix3d volume_trafo_3x3 = volume_trafo_mod.get_matrix().matrix().block<3, 3>(0, 0);
+#else
+ Matrix3d volume_trafo_3x3 = volume_trafo.get_matrix(true, false, volume_uniform_scaling, !volume_has_mirrorring).matrix().block<3, 3>(0, 0);
+#endif // ENABLE_WORLD_COORDINATE
// Following method creates a new shared_ptr<TriangleMesh>
model_volume->transform_this_mesh(mesh_trafo_3x3 * volume_trafo_3x3, left_handed != volume_left_handed);
// Reset the rotation, scaling and mirroring.
@@ -1489,7 +1524,11 @@ double ModelObject::get_instance_min_z(size_t instance_idx) const
double min_z = DBL_MAX;
const ModelInstance* inst = instances[instance_idx];
+#if ENABLE_WORLD_COORDINATE
+ const Transform3d mi = inst->get_matrix_no_offset();
+#else
const Transform3d& mi = inst->get_matrix(true);
+#endif // ENABLE_WORLD_COORDINATE
for (const ModelVolume* v : volumes) {
if (!v->is_model_part())
@@ -1510,7 +1549,11 @@ double ModelObject::get_instance_max_z(size_t instance_idx) const
double max_z = -DBL_MAX;
const ModelInstance* inst = instances[instance_idx];
+#if ENABLE_WORLD_COORDINATE
+ const Transform3d mi = inst->get_matrix_no_offset();
+#else
const Transform3d& mi = inst->get_matrix(true);
+#endif // ENABLE_WORLD_COORDINATE
for (const ModelVolume* v : volumes) {
if (!v->is_model_part())
@@ -1936,14 +1979,22 @@ void ModelVolume::convert_from_meters()
void ModelInstance::transform_mesh(TriangleMesh* mesh, bool dont_translate) const
{
+#if ENABLE_WORLD_COORDINATE
+ mesh->transform(dont_translate ? get_matrix_no_offset() : get_matrix());
+#else
mesh->transform(get_matrix(dont_translate));
+#endif // ENABLE_WORLD_COORDINATE
}
BoundingBoxf3 ModelInstance::transform_mesh_bounding_box(const TriangleMesh& mesh, bool dont_translate) const
{
// Rotate around mesh origin.
TriangleMesh copy(mesh);
+#if ENABLE_WORLD_COORDINATE
+ copy.transform(get_transformation().get_rotation_matrix());
+#else
copy.transform(get_matrix(true, false, true, true));
+#endif // ENABLE_WORLD_COORDINATE
BoundingBoxf3 bbox = copy.bounding_box();
if (!empty(bbox)) {
@@ -1968,12 +2019,20 @@ BoundingBoxf3 ModelInstance::transform_mesh_bounding_box(const TriangleMesh& mes
BoundingBoxf3 ModelInstance::transform_bounding_box(const BoundingBoxf3 &bbox, bool dont_translate) const
{
+#if ENABLE_WORLD_COORDINATE
+ return bbox.transformed(dont_translate ? get_matrix_no_offset() : get_matrix());
+#else
return bbox.transformed(get_matrix(dont_translate));
+#endif // ENABLE_WORLD_COORDINATE
}
Vec3d ModelInstance::transform_vector(const Vec3d& v, bool dont_translate) const
{
+#if ENABLE_WORLD_COORDINATE
+ return dont_translate ? get_matrix_no_offset() * v : get_matrix() * v;
+#else
return get_matrix(dont_translate) * v;
+#endif // ENABLE_WORLD_COORDINATE
}
void ModelInstance::transform_polygon(Polygon* polygon) const