Added member m_sla_shift_z to GLVolume

This commit is contained in:
Enrico Turri 2018-11-22 13:33:20 +01:00
parent 233c1593f1
commit 3b3eab2e84
3 changed files with 20 additions and 6 deletions

View file

@ -216,6 +216,7 @@ GLVolume::GLVolume(float r, float g, float b, float a)
, m_world_matrix_dirty(true) , m_world_matrix_dirty(true)
, m_transformed_bounding_box_dirty(true) , m_transformed_bounding_box_dirty(true)
#endif // ENABLE_MODELVOLUME_TRANSFORM #endif // ENABLE_MODELVOLUME_TRANSFORM
, m_sla_shift_z(0.0)
, m_transformed_convex_hull_bounding_box_dirty(true) , m_transformed_convex_hull_bounding_box_dirty(true)
, m_convex_hull(nullptr) , m_convex_hull(nullptr)
, m_convex_hull_owned(false) , m_convex_hull_owned(false)
@ -380,7 +381,14 @@ void GLVolume::set_convex_hull(const TriangleMesh *convex_hull, bool owned)
m_convex_hull_owned = owned; m_convex_hull_owned = owned;
} }
#if !ENABLE_MODELVOLUME_TRANSFORM #if ENABLE_MODELVOLUME_TRANSFORM
Transform3d GLVolume::world_matrix() const
{
Transform3d m = m_instance_transformation.get_matrix() * m_volume_transformation.get_matrix();
m.translation()(2) += m_sla_shift_z;
return m;
}
#else
const Transform3f& GLVolume::world_matrix() const const Transform3f& GLVolume::world_matrix() const
{ {
if (m_world_matrix_dirty) if (m_world_matrix_dirty)
@ -390,7 +398,7 @@ const Transform3f& GLVolume::world_matrix() const
} }
return m_world_matrix; return m_world_matrix;
} }
#endif // !ENABLE_MODELVOLUME_TRANSFORM #endif // ENABLE_MODELVOLUME_TRANSFORM
const BoundingBoxf3& GLVolume::transformed_bounding_box() const const BoundingBoxf3& GLVolume::transformed_bounding_box() const
{ {

View file

@ -278,6 +278,8 @@ private:
// Whether or not is needed to recalculate the world matrix. // Whether or not is needed to recalculate the world matrix.
mutable bool m_world_matrix_dirty; mutable bool m_world_matrix_dirty;
#endif // ENABLE_MODELVOLUME_TRANSFORM #endif // ENABLE_MODELVOLUME_TRANSFORM
// Shift in z required by sla supports+pad
double m_sla_shift_z;
// Bounding box of this volume, in unscaled coordinates. // Bounding box of this volume, in unscaled coordinates.
mutable BoundingBoxf3 m_transformed_bounding_box; mutable BoundingBoxf3 m_transformed_bounding_box;
// Whether or not is needed to recalculate the transformed bounding box. // Whether or not is needed to recalculate the transformed bounding box.
@ -426,6 +428,9 @@ public:
const Vec3d& get_offset() const; const Vec3d& get_offset() const;
void set_offset(const Vec3d& offset); void set_offset(const Vec3d& offset);
#endif // ENABLE_MODELVOLUME_TRANSFORM #endif // ENABLE_MODELVOLUME_TRANSFORM
double get_sla_shift_z() const { return m_sla_shift_z; }
void set_sla_shift_z(double z) { m_sla_shift_z = z; }
void set_convex_hull(const TriangleMesh *convex_hull, bool owned); void set_convex_hull(const TriangleMesh *convex_hull, bool owned);
@ -434,7 +439,7 @@ public:
int instance_idx() const { return this->composite_id.instance_id; } int instance_idx() const { return this->composite_id.instance_id; }
#if ENABLE_MODELVOLUME_TRANSFORM #if ENABLE_MODELVOLUME_TRANSFORM
Transform3d world_matrix() const { return m_instance_transformation.get_matrix() * m_volume_transformation.get_matrix(); } Transform3d world_matrix() const;
#else #else
const Transform3f& world_matrix() const; const Transform3f& world_matrix() const;
#endif // ENABLE_MODELVOLUME_TRANSFORM #endif // ENABLE_MODELVOLUME_TRANSFORM

View file

@ -3937,6 +3937,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
delete volume; delete volume;
} else { } else {
// This GLVolume will be reused. // This GLVolume will be reused.
volume->set_sla_shift_z(0.0);
map_glvolume_old_to_new[volume_id] = glvolumes_new.size(); map_glvolume_old_to_new[volume_id] = glvolumes_new.size();
mvs->volume_idx = glvolumes_new.size(); mvs->volume_idx = glvolumes_new.size();
glvolumes_new.emplace_back(volume); glvolumes_new.emplace_back(volume);
@ -4045,7 +4046,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
instances[istep].emplace_back(std::pair<size_t, size_t>(instance_idx, print_instance_idx)); instances[istep].emplace_back(std::pair<size_t, size_t>(instance_idx, print_instance_idx));
else else
// Recycling an old GLVolume. Update the Object/Instance indices into the current Model. // Recycling an old GLVolume. Update the Object/Instance indices into the current Model.
m_volumes.volumes[it->volume_idx]->composite_id = GLVolume::CompositeID(object_idx, -1, instance_idx); m_volumes.volumes[it->volume_idx]->composite_id = GLVolume::CompositeID(object_idx, m_volumes.volumes[it->volume_idx]->volume_idx(), instance_idx);
} }
} }
@ -4060,11 +4061,11 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
{ {
// If any volume has been added // If any volume has been added
// Shift-up all volumes of the object so that it has the right elevation with respect to the print bed // Shift-up all volumes of the object so that it has the right elevation with respect to the print bed
Vec3d shift_z(0.0, 0.0, print_object->get_elevation()); double shift_z = print_object->get_elevation();
for (GLVolume* volume : m_volumes.volumes) for (GLVolume* volume : m_volumes.volumes)
{ {
if (volume->object_idx() == object_idx) if (volume->object_idx() == object_idx)
volume->set_instance_offset(volume->get_instance_offset() + shift_z); volume->set_sla_shift_z(shift_z);
} }
} }
} }