mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-05-25 23:57:42 +08:00
WIP: Support of SLA suport & pad GLVolumes, couple of fixes.
This commit is contained in:
parent
b59d5d083f
commit
74ba1eaa16
@ -79,7 +79,7 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model,
|
|||||||
|
|
||||||
// Grab the lock for the Print / PrintObject milestones.
|
// Grab the lock for the Print / PrintObject milestones.
|
||||||
tbb::mutex::scoped_lock lock(this->state_mutex());
|
tbb::mutex::scoped_lock lock(this->state_mutex());
|
||||||
if(m_objects.empty() && model.objects.empty())
|
if (m_objects.empty() && model.objects.empty() && m_model.objects.empty())
|
||||||
return APPLY_STATUS_UNCHANGED;
|
return APPLY_STATUS_UNCHANGED;
|
||||||
|
|
||||||
// Temporary: just to have to correct layer height for the rasterization
|
// Temporary: just to have to correct layer height for the rasterization
|
||||||
@ -437,6 +437,32 @@ SLAPrintObject::SLAPrintObject(SLAPrint *print, ModelObject *model_object):
|
|||||||
|
|
||||||
SLAPrintObject::~SLAPrintObject() {}
|
SLAPrintObject::~SLAPrintObject() {}
|
||||||
|
|
||||||
|
bool SLAPrintObject::has_mesh(SLAPrintObjectStep step) const
|
||||||
|
{
|
||||||
|
switch (step) {
|
||||||
|
case slaposSupportTree:
|
||||||
|
// return m_supportdata && m_supportdata->support_tree_ptr && ! m_supportdata->support_tree_ptr->get().merged_mesh().empty();
|
||||||
|
return ! this->support_mesh().empty();
|
||||||
|
case slaposBasePool:
|
||||||
|
// return m_supportdata && m_supportdata->support_tree_ptr && ! m_supportdata->support_tree_ptr->get_pad().empty();
|
||||||
|
return ! this->pad_mesh().empty();
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TriangleMesh SLAPrintObject::get_mesh(SLAPrintObjectStep step) const
|
||||||
|
{
|
||||||
|
switch (step) {
|
||||||
|
case slaposSupportTree:
|
||||||
|
return this->support_mesh();
|
||||||
|
case slaposBasePool:
|
||||||
|
return this->pad_mesh();
|
||||||
|
default:
|
||||||
|
return TriangleMesh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TriangleMesh SLAPrintObject::support_mesh() const
|
TriangleMesh SLAPrintObject::support_mesh() const
|
||||||
{
|
{
|
||||||
TriangleMesh trm;
|
TriangleMesh trm;
|
||||||
|
@ -48,6 +48,9 @@ public:
|
|||||||
};
|
};
|
||||||
const std::vector<Instance>& instances() const { return m_instances; }
|
const std::vector<Instance>& instances() const { return m_instances; }
|
||||||
|
|
||||||
|
bool has_mesh(SLAPrintObjectStep step) const;
|
||||||
|
TriangleMesh get_mesh(SLAPrintObjectStep step) const;
|
||||||
|
|
||||||
// Get a support mesh centered around origin in XY, and with zero rotation around Z applied.
|
// Get a support mesh centered around origin in XY, and with zero rotation around Z applied.
|
||||||
// Support mesh is only valid if this->is_step_done(slaposSupportTree) is true.
|
// Support mesh is only valid if this->is_step_done(slaposSupportTree) is true.
|
||||||
TriangleMesh support_mesh() const;
|
TriangleMesh support_mesh() const;
|
||||||
|
@ -521,6 +521,7 @@ BoundingBoxf3 TriangleMesh::transformed_bounding_box(const Transform3d& t) const
|
|||||||
|
|
||||||
if (stl.stats.shared_vertices > 0)
|
if (stl.stats.shared_vertices > 0)
|
||||||
{
|
{
|
||||||
|
assert(stl.v_shared != nullptr);
|
||||||
stl_vertex* vertex_ptr = stl.v_shared;
|
stl_vertex* vertex_ptr = stl.v_shared;
|
||||||
for (int i = 0; i < stl.stats.shared_vertices; ++i)
|
for (int i = 0; i < stl.stats.shared_vertices; ++i)
|
||||||
{
|
{
|
||||||
|
@ -65,6 +65,7 @@ public:
|
|||||||
void reset_repair_stats();
|
void reset_repair_stats();
|
||||||
bool needed_repair() const;
|
bool needed_repair() const;
|
||||||
size_t facets_count() const { return this->stl.stats.number_of_facets; }
|
size_t facets_count() const { return this->stl.stats.number_of_facets; }
|
||||||
|
bool empty() const { return this->facets_count() == 0; }
|
||||||
|
|
||||||
// Returns true, if there are two and more connected patches in the mesh.
|
// Returns true, if there are two and more connected patches in the mesh.
|
||||||
// Returns false, if one or zero connected patch is in the mesh.
|
// Returns false, if one or zero connected patch is in the mesh.
|
||||||
|
@ -216,6 +216,7 @@ GLVolume::GLVolume(float r, float g, float b, float a)
|
|||||||
#endif // ENABLE_MODELVOLUME_TRANSFORM
|
#endif // ENABLE_MODELVOLUME_TRANSFORM
|
||||||
, 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)
|
||||||
// geometry_id == 0 -> invalid
|
// geometry_id == 0 -> invalid
|
||||||
, geometry_id(std::pair<size_t, size_t>(0, 0))
|
, geometry_id(std::pair<size_t, size_t>(0, 0))
|
||||||
, extruder_id(0)
|
, extruder_id(0)
|
||||||
@ -239,6 +240,12 @@ GLVolume::GLVolume(float r, float g, float b, float a)
|
|||||||
set_render_color(r, g, b, a);
|
set_render_color(r, g, b, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLVolume::~GLVolume()
|
||||||
|
{
|
||||||
|
if (m_convex_hull_owned)
|
||||||
|
delete m_convex_hull;
|
||||||
|
}
|
||||||
|
|
||||||
void GLVolume::set_render_color(float r, float g, float b, float a)
|
void GLVolume::set_render_color(float r, float g, float b, float a)
|
||||||
{
|
{
|
||||||
render_color[0] = r;
|
render_color[0] = r;
|
||||||
@ -365,9 +372,10 @@ void GLVolume::set_mirror(Axis axis, double mirror)
|
|||||||
}
|
}
|
||||||
#endif // !ENABLE_MODELVOLUME_TRANSFORM
|
#endif // !ENABLE_MODELVOLUME_TRANSFORM
|
||||||
|
|
||||||
void GLVolume::set_convex_hull(const TriangleMesh& convex_hull)
|
void GLVolume::set_convex_hull(const TriangleMesh *convex_hull, bool owned)
|
||||||
{
|
{
|
||||||
m_convex_hull = &convex_hull;
|
m_convex_hull = convex_hull;
|
||||||
|
m_convex_hull_owned = owned;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !ENABLE_MODELVOLUME_TRANSFORM
|
#if !ENABLE_MODELVOLUME_TRANSFORM
|
||||||
@ -779,7 +787,8 @@ int GLVolumeCollection::load_object_volume(
|
|||||||
v.composite_id = GLVolume::CompositeID(obj_idx, volume_idx, instance_idx);
|
v.composite_id = GLVolume::CompositeID(obj_idx, volume_idx, instance_idx);
|
||||||
if (model_volume->is_model_part())
|
if (model_volume->is_model_part())
|
||||||
{
|
{
|
||||||
v.set_convex_hull(model_volume->get_convex_hull());
|
// GLVolume will reference a convex hull from model_volume!
|
||||||
|
v.set_convex_hull(&model_volume->get_convex_hull(), false);
|
||||||
if (extruder_id != -1)
|
if (extruder_id != -1)
|
||||||
v.extruder_id = extruder_id;
|
v.extruder_id = extruder_id;
|
||||||
v.layer_height_texture = layer_height_texture;
|
v.layer_height_texture = layer_height_texture;
|
||||||
@ -808,6 +817,8 @@ void GLVolumeCollection::load_object_auxiliary(
|
|||||||
// pairs of <instance_idx, print_instance_idx>
|
// pairs of <instance_idx, print_instance_idx>
|
||||||
const std::vector<std::pair<size_t, size_t>> &instances,
|
const std::vector<std::pair<size_t, size_t>> &instances,
|
||||||
SLAPrintObjectStep milestone,
|
SLAPrintObjectStep milestone,
|
||||||
|
// Timestamp of the last change of the milestone
|
||||||
|
size_t timestamp,
|
||||||
bool use_VBOs)
|
bool use_VBOs)
|
||||||
{
|
{
|
||||||
assert(print_object->is_step_done(milestone));
|
assert(print_object->is_step_done(milestone));
|
||||||
@ -835,7 +846,9 @@ void GLVolumeCollection::load_object_auxiliary(
|
|||||||
v.bounding_box = v.indexed_vertex_array.bounding_box();
|
v.bounding_box = v.indexed_vertex_array.bounding_box();
|
||||||
v.indexed_vertex_array.finalize_geometry(use_VBOs);
|
v.indexed_vertex_array.finalize_geometry(use_VBOs);
|
||||||
v.composite_id = GLVolume::CompositeID(obj_idx, -1, (int)instance_idx.first);
|
v.composite_id = GLVolume::CompositeID(obj_idx, -1, (int)instance_idx.first);
|
||||||
v.set_convex_hull(convex_hull);
|
v.geometry_id = std::pair<size_t, size_t>(timestamp, model_instance.id().id);
|
||||||
|
// Create a copy of the convex hull mesh for each instance. Use a move operator on the last instance.
|
||||||
|
v.set_convex_hull((&instance_idx == &instances.back()) ? new TriangleMesh(std::move(convex_hull)) : new TriangleMesh(convex_hull), true);
|
||||||
v.is_modifier = false;
|
v.is_modifier = false;
|
||||||
v.shader_outside_printer_detection_enabled = true;
|
v.shader_outside_printer_detection_enabled = true;
|
||||||
//FIXME adjust with print_instance?
|
//FIXME adjust with print_instance?
|
||||||
|
@ -256,6 +256,7 @@ public:
|
|||||||
|
|
||||||
GLVolume(float r = 1.f, float g = 1.f, float b = 1.f, float a = 1.f);
|
GLVolume(float r = 1.f, float g = 1.f, float b = 1.f, float a = 1.f);
|
||||||
GLVolume(const float *rgba) : GLVolume(rgba[0], rgba[1], rgba[2], rgba[3]) {}
|
GLVolume(const float *rgba) : GLVolume(rgba[0], rgba[1], rgba[2], rgba[3]) {}
|
||||||
|
~GLVolume();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#if ENABLE_MODELVOLUME_TRANSFORM
|
#if ENABLE_MODELVOLUME_TRANSFORM
|
||||||
@ -280,7 +281,9 @@ private:
|
|||||||
// Whether or not is needed to recalculate the transformed bounding box.
|
// Whether or not is needed to recalculate the transformed bounding box.
|
||||||
mutable bool m_transformed_bounding_box_dirty;
|
mutable bool m_transformed_bounding_box_dirty;
|
||||||
// Pointer to convex hull of the original mesh, if any.
|
// Pointer to convex hull of the original mesh, if any.
|
||||||
|
// This object may or may not own the convex hull instance based on m_convex_hull_owned
|
||||||
const TriangleMesh* m_convex_hull;
|
const TriangleMesh* m_convex_hull;
|
||||||
|
bool m_convex_hull_owned;
|
||||||
// Bounding box of this volume, in unscaled coordinates.
|
// Bounding box of this volume, in unscaled coordinates.
|
||||||
mutable BoundingBoxf3 m_transformed_convex_hull_bounding_box;
|
mutable BoundingBoxf3 m_transformed_convex_hull_bounding_box;
|
||||||
// Whether or not is needed to recalculate the transformed convex hull bounding box.
|
// Whether or not is needed to recalculate the transformed convex hull bounding box.
|
||||||
@ -422,7 +425,7 @@ public:
|
|||||||
void set_offset(const Vec3d& offset);
|
void set_offset(const Vec3d& offset);
|
||||||
#endif // ENABLE_MODELVOLUME_TRANSFORM
|
#endif // ENABLE_MODELVOLUME_TRANSFORM
|
||||||
|
|
||||||
void set_convex_hull(const TriangleMesh& convex_hull);
|
void set_convex_hull(const TriangleMesh *convex_hull, bool owned);
|
||||||
|
|
||||||
int object_idx() const { return this->composite_id.object_id; }
|
int object_idx() const { return this->composite_id.object_id; }
|
||||||
int volume_idx() const { return this->composite_id.volume_id; }
|
int volume_idx() const { return this->composite_id.volume_id; }
|
||||||
@ -525,6 +528,8 @@ public:
|
|||||||
// pairs of <instance_idx, print_instance_idx>
|
// pairs of <instance_idx, print_instance_idx>
|
||||||
const std::vector<std::pair<size_t, size_t>> &instances,
|
const std::vector<std::pair<size_t, size_t>> &instances,
|
||||||
SLAPrintObjectStep milestone,
|
SLAPrintObjectStep milestone,
|
||||||
|
// Timestamp of the last change of the milestone
|
||||||
|
size_t timestamp,
|
||||||
bool use_VBOs);
|
bool use_VBOs);
|
||||||
|
|
||||||
int load_wipe_tower_preview(
|
int load_wipe_tower_preview(
|
||||||
|
@ -1867,7 +1867,10 @@ void GLCanvas3D::Selection::erase()
|
|||||||
for (unsigned int i : m_list)
|
for (unsigned int i : m_list)
|
||||||
{
|
{
|
||||||
const GLVolume* v = (*m_volumes)[i];
|
const GLVolume* v = (*m_volumes)[i];
|
||||||
volumes_idxs.insert(std::make_pair(v->object_idx(), v->volume_idx()));
|
// Only remove volumes associated with ModelVolumes from the object list.
|
||||||
|
// Temporary meshes (SLA supports or pads) are not managed by the object list.
|
||||||
|
if (v->volume_idx() >= 0)
|
||||||
|
volumes_idxs.insert(std::make_pair(v->object_idx(), v->volume_idx()));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<ItemForDelete> items;
|
std::vector<ItemForDelete> items;
|
||||||
@ -3803,9 +3806,15 @@ void GLCanvas3D::reload_scene(bool force)
|
|||||||
SLASupportState state;
|
SLASupportState state;
|
||||||
for (size_t istep = 0; istep < sla_steps.size(); ++ istep) {
|
for (size_t istep = 0; istep < sla_steps.size(); ++ istep) {
|
||||||
state.step[istep] = print_object->step_state_with_timestamp(sla_steps[istep]);
|
state.step[istep] = print_object->step_state_with_timestamp(sla_steps[istep]);
|
||||||
if (state.step[istep].state == PrintStateBase::DONE)
|
if (state.step[istep].state == PrintStateBase::DONE) {
|
||||||
for (const ModelInstance *model_instance : print_object->model_object()->instances)
|
if (! print_object->has_mesh(sla_steps[istep]))
|
||||||
aux_volume_state.emplace_back(state.step[istep].timestamp, model_instance->id());
|
// Consider the DONE step without a valid mesh as invalid for the purpose
|
||||||
|
// of mesh visualization.
|
||||||
|
state.step[istep].state = PrintStateBase::INVALID;
|
||||||
|
else
|
||||||
|
for (const ModelInstance *model_instance : print_object->model_object()->instances)
|
||||||
|
aux_volume_state.emplace_back(state.step[istep].timestamp, model_instance->id());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sla_support_state.emplace_back(state);
|
sla_support_state.emplace_back(state);
|
||||||
}
|
}
|
||||||
@ -3911,7 +3920,7 @@ void GLCanvas3D::reload_scene(bool force)
|
|||||||
const ModelObject *model_object = print_object->model_object();
|
const ModelObject *model_object = print_object->model_object();
|
||||||
// Find an index of the ModelObject
|
// Find an index of the ModelObject
|
||||||
int object_idx;
|
int object_idx;
|
||||||
if (! std::all_of(state.step.begin(), state.step.end(), [](const PrintStateBase::StateWithTimeStamp &state){ return state.state != PrintStateBase::DONE; }))
|
if (std::all_of(state.step.begin(), state.step.end(), [](const PrintStateBase::StateWithTimeStamp &state){ return state.state != PrintStateBase::DONE; }))
|
||||||
continue;
|
continue;
|
||||||
// There may be new SLA volumes added to the scene for this print_object.
|
// There may be new SLA volumes added to the scene for this print_object.
|
||||||
// Find the object index of this print_object in the Model::objects list.
|
// Find the object index of this print_object in the Model::objects list.
|
||||||
@ -3942,7 +3951,7 @@ void GLCanvas3D::reload_scene(bool force)
|
|||||||
}
|
}
|
||||||
for (size_t istep = 0; istep < sla_steps.size(); ++ istep)
|
for (size_t istep = 0; istep < sla_steps.size(); ++ istep)
|
||||||
if (! instances[istep].empty())
|
if (! instances[istep].empty())
|
||||||
m_volumes.load_object_auxiliary(print_object, object_idx, instances[istep], sla_steps[istep], m_use_VBOs && m_initialized);
|
m_volumes.load_object_auxiliary(print_object, object_idx, instances[istep], sla_steps[istep], state.step[istep].timestamp, m_use_VBOs && m_initialized);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1304,7 +1304,10 @@ void ObjectList::update_selections()
|
|||||||
const auto gl_vol = selection.get_volume(idx);
|
const auto gl_vol = selection.get_volume(idx);
|
||||||
if (selection.is_multiple_full_object())
|
if (selection.is_multiple_full_object())
|
||||||
sels.Add(m_objects_model->GetItemById(gl_vol->object_idx()));
|
sels.Add(m_objects_model->GetItemById(gl_vol->object_idx()));
|
||||||
else
|
else if (gl_vol->volume_idx() >= 0)
|
||||||
|
// Only add GLVolumes with non-negative volume_ids. GLVolumes with negative volume ids
|
||||||
|
// are not associated with ModelVolumes, but they are temporarily generated by the backend
|
||||||
|
// (for example, SLA supports or SLA pad).
|
||||||
sels.Add(m_objects_model->GetItemByVolumeId(gl_vol->object_idx(), gl_vol->volume_idx()));
|
sels.Add(m_objects_model->GetItemByVolumeId(gl_vol->object_idx(), gl_vol->volume_idx()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -200,7 +200,7 @@ DECLARE_VARIANT_OBJECT(PrusaDataViewBitmapText)
|
|||||||
// PrusaObjectDataViewModelNode: a node inside PrusaObjectDataViewModel
|
// PrusaObjectDataViewModelNode: a node inside PrusaObjectDataViewModel
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
enum ItemType{
|
enum ItemType {
|
||||||
itUndef = 0,
|
itUndef = 0,
|
||||||
itObject = 1,
|
itObject = 1,
|
||||||
itVolume = 2,
|
itVolume = 2,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user