mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 12:11:15 -06:00 
			
		
		
		
	Refactoring
This commit is contained in:
		
							parent
							
								
									c135f4a1f8
								
							
						
					
					
						commit
						b8168d421c
					
				
					 6 changed files with 45 additions and 38 deletions
				
			
		|  | @ -1828,7 +1828,7 @@ namespace Slic3r { | |||
|                 stream << "   </" << COMPONENTS_TAG << ">\n"; | ||||
|             } | ||||
| 
 | ||||
|             Transform3d t = instance->world_matrix(); | ||||
|             Transform3d t = instance->get_matrix(); | ||||
|             build_items.emplace_back(instance_id, t); | ||||
| 
 | ||||
|             stream << "  </" << OBJECT_TAG << ">\n"; | ||||
|  |  | |||
|  | @ -727,7 +727,7 @@ void ModelObject::translate_instance(size_t instance_idx, const Vec3d& vector) | |||
|     invalidate_bounding_box(); | ||||
| } | ||||
| 
 | ||||
| void ModelObject::translate(coordf_t x, coordf_t y, coordf_t z) | ||||
| void ModelObject::translate(double x, double y, double z) | ||||
| { | ||||
|     for (ModelVolume *v : this->volumes) | ||||
|     { | ||||
|  | @ -918,7 +918,7 @@ double ModelObject::get_instance_min_z(size_t instance_idx) const | |||
|     double min_z = DBL_MAX; | ||||
| 
 | ||||
|     ModelInstance* inst = instances[instance_idx]; | ||||
|     const Transform3d& m = inst->world_matrix(true); | ||||
|     const Transform3d& m = inst->get_matrix(true); | ||||
| 
 | ||||
|     for (ModelVolume *v : volumes) | ||||
|     { | ||||
|  | @ -945,7 +945,7 @@ unsigned int ModelObject::check_instances_print_volume_state(const BoundingBoxf3 | |||
|         unsigned int inside_outside = 0; | ||||
|         for (const ModelVolume *vol : this->volumes) | ||||
|             if (vol->is_model_part()) { | ||||
|                 BoundingBoxf3 bb = vol->get_convex_hull().transformed_bounding_box(model_instance->world_matrix()); | ||||
|                 BoundingBoxf3 bb = vol->get_convex_hull().transformed_bounding_box(model_instance->get_matrix()); | ||||
|                 if (print_volume.contains(bb)) | ||||
|                     inside_outside |= INSIDE; | ||||
|                 else if (print_volume.intersects(bb)) | ||||
|  | @ -1042,11 +1042,6 @@ const TriangleMesh& ModelVolume::get_convex_hull() const | |||
|     return m_convex_hull; | ||||
| } | ||||
| 
 | ||||
| TriangleMesh& ModelVolume::get_convex_hull() | ||||
| { | ||||
|     return m_convex_hull; | ||||
| } | ||||
| 
 | ||||
| ModelVolume::Type ModelVolume::type_from_string(const std::string &s) | ||||
| { | ||||
|     // Legacy support
 | ||||
|  | @ -1113,6 +1108,17 @@ size_t ModelVolume::split(unsigned int max_extruders) | |||
|     return idx; | ||||
| } | ||||
| 
 | ||||
| void ModelVolume::translate(double x, double y, double z) | ||||
| { | ||||
|     translate(Vec3d(x, y, z)); | ||||
| } | ||||
| 
 | ||||
| void ModelVolume::translate(const Vec3d& displacement) | ||||
| { | ||||
|     mesh.translate((float)displacement(0), (float)displacement(1), (float)displacement(2)); | ||||
|     m_convex_hull.translate((float)displacement(0), (float)displacement(1), (float)displacement(2)); | ||||
| } | ||||
| 
 | ||||
| #if !ENABLE_MODELVOLUME_TRANSFORM | ||||
| void ModelInstance::set_rotation(const Vec3d& rotation) | ||||
| { | ||||
|  | @ -1168,14 +1174,14 @@ void ModelInstance::set_mirror(Axis axis, double mirror) | |||
| 
 | ||||
| void ModelInstance::transform_mesh(TriangleMesh* mesh, bool dont_translate) const | ||||
| { | ||||
|     mesh->transform(world_matrix(dont_translate).cast<float>()); | ||||
|     mesh->transform(get_matrix(dont_translate).cast<float>()); | ||||
| } | ||||
| 
 | ||||
| BoundingBoxf3 ModelInstance::transform_mesh_bounding_box(const TriangleMesh* mesh, bool dont_translate) const | ||||
| { | ||||
|     // Rotate around mesh origin.
 | ||||
|     TriangleMesh copy(*mesh); | ||||
|     copy.transform(world_matrix(true, false, true, true).cast<float>()); | ||||
|     copy.transform(get_matrix(true, false, true, true).cast<float>()); | ||||
|     BoundingBoxf3 bbox = copy.bounding_box(); | ||||
| 
 | ||||
|     if (!empty(bbox)) { | ||||
|  | @ -1212,12 +1218,12 @@ BoundingBoxf3 ModelInstance::transform_mesh_bounding_box(const TriangleMesh* mes | |||
| 
 | ||||
| BoundingBoxf3 ModelInstance::transform_bounding_box(const BoundingBoxf3 &bbox, bool dont_translate) const | ||||
| { | ||||
|     return bbox.transformed(world_matrix(dont_translate)); | ||||
|     return bbox.transformed(get_matrix(dont_translate)); | ||||
| } | ||||
| 
 | ||||
| Vec3d ModelInstance::transform_vector(const Vec3d& v, bool dont_translate) const | ||||
| { | ||||
|     return world_matrix(dont_translate) * v; | ||||
|     return get_matrix(dont_translate) * v; | ||||
| } | ||||
| 
 | ||||
| void ModelInstance::transform_polygon(Polygon* polygon) const | ||||
|  |  | |||
|  | @ -160,7 +160,7 @@ public: | |||
|     void translate_instances(const Vec3d& vector); | ||||
|     void translate_instance(size_t instance_idx, const Vec3d& vector); | ||||
|     void translate(const Vec3d &vector) { this->translate(vector(0), vector(1), vector(2)); } | ||||
|     void translate(coordf_t x, coordf_t y, coordf_t z); | ||||
|     void translate(double x, double y, double z); | ||||
|     void scale(const Vec3d &versor); | ||||
|     void scale(const double s) { this->scale(Vec3d(s, s, s)); } | ||||
|     void rotate(float angle, const Axis &axis); | ||||
|  | @ -210,13 +210,6 @@ class ModelVolume : public ModelBase | |||
| { | ||||
|     friend class ModelObject; | ||||
| 
 | ||||
|     // The convex hull of this model's mesh.
 | ||||
|     TriangleMesh        m_convex_hull; | ||||
| 
 | ||||
| #if ENABLE_MODELVOLUME_TRANSFORM | ||||
|     Geometry::Transformation m_transformation; | ||||
| #endif // ENABLE_MODELVOLUME_TRANSFORM
 | ||||
| 
 | ||||
| public: | ||||
|     std::string         name; | ||||
|     // The triangular model.
 | ||||
|  | @ -253,18 +246,22 @@ public: | |||
|     // Return the number of volumes created from this one.
 | ||||
|     // This is useful to assign different materials to different volumes of an object.
 | ||||
|     size_t              split(unsigned int max_extruders); | ||||
|     void                translate(double x, double y, double z); | ||||
|     void                translate(const Vec3d& displacement); | ||||
| 
 | ||||
|     ModelMaterial*      assign_unique_material(); | ||||
|      | ||||
|     void                calculate_convex_hull(); | ||||
|     const TriangleMesh& get_convex_hull() const; | ||||
|     TriangleMesh&       get_convex_hull(); | ||||
| 
 | ||||
|     // Helpers for loading / storing into AMF / 3MF files.
 | ||||
|     static Type         type_from_string(const std::string &s); | ||||
|     static std::string  type_to_string(const Type t); | ||||
| 
 | ||||
| #if ENABLE_MODELVOLUME_TRANSFORM | ||||
|     const Geometry::Transformation& get_transformation() const { return m_transformation; } | ||||
|     void set_transformation(const Geometry::Transformation& transformation) { m_transformation = transformation; } | ||||
| 
 | ||||
|     const Vec3d& get_offset() const { return m_transformation.get_offset(); } | ||||
|     double get_offset(Axis axis) const { return m_transformation.get_offset(axis); } | ||||
| 
 | ||||
|  | @ -288,6 +285,8 @@ public: | |||
| 
 | ||||
|     void set_mirror(const Vec3d& mirror) { m_transformation.set_mirror(mirror); } | ||||
|     void set_mirror(Axis axis, double mirror) { m_transformation.set_mirror(axis, mirror); } | ||||
| 
 | ||||
|     const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const { return m_transformation.get_matrix(dont_translate, dont_rotate, dont_scale, dont_mirror); } | ||||
| #endif // ENABLE_MODELVOLUME_TRANSFORM
 | ||||
| 
 | ||||
| private: | ||||
|  | @ -296,7 +295,12 @@ private: | |||
|     // Is it an object to be printed, or a modifier volume?
 | ||||
|     Type                    m_type; | ||||
|     t_model_material_id     m_material_id; | ||||
|      | ||||
|     // The convex hull of this model's mesh.
 | ||||
|     TriangleMesh             m_convex_hull; | ||||
| #if ENABLE_MODELVOLUME_TRANSFORM | ||||
|     Geometry::Transformation m_transformation; | ||||
| #endif // ENABLE_MODELVOLUME_TRANSFORM
 | ||||
| 
 | ||||
|     ModelVolume(ModelObject *object, const TriangleMesh &mesh) : mesh(mesh), m_type(MODEL_PART), object(object) | ||||
|     { | ||||
|         if (mesh.stl.stats.number_of_facets > 1) | ||||
|  | @ -419,9 +423,9 @@ public: | |||
|     void transform_polygon(Polygon* polygon) const; | ||||
| 
 | ||||
| #if ENABLE_MODELVOLUME_TRANSFORM | ||||
|     const Transform3d& world_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const { return m_transformation.get_matrix(dont_translate, dont_rotate, dont_scale, dont_mirror); } | ||||
|     const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const { return m_transformation.get_matrix(dont_translate, dont_rotate, dont_scale, dont_mirror); } | ||||
| #else | ||||
|     Transform3d world_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const; | ||||
|     Transform3d get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const; | ||||
| #endif // ENABLE_MODELVOLUME_TRANSFORM
 | ||||
| 
 | ||||
|     bool is_printable() const { return print_volume_state == PVS_Inside; } | ||||
|  |  | |||
|  | @ -411,7 +411,7 @@ void Print::add_model_object(ModelObject* model_object, int idx) | |||
| 
 | ||||
|     // Set the transformation matrix without translation from the first instance.
 | ||||
|     if (! model_object->instances.empty()) | ||||
|         object->set_trafo(model_object->instances.front()->world_matrix(true)); | ||||
|         object->set_trafo(model_object->instances.front()->get_matrix(true)); | ||||
| 
 | ||||
|     size_t volume_id = 0; | ||||
|     for (const ModelVolume *volume : model_object->volumes) { | ||||
|  | @ -686,7 +686,7 @@ static std::vector<PrintInstances> print_objects_from_model_object(const ModelOb | |||
|     trafo.copies.assign(1, Point()); | ||||
|     for (ModelInstance *model_instance : model_object.instances) | ||||
|         if (model_instance->is_printable()) { | ||||
|             trafo.trafo = model_instance->world_matrix(); | ||||
|             trafo.trafo = model_instance->get_matrix(); | ||||
|             // Set the Z axis of the transformation.
 | ||||
| 			trafo.copies.front() = Point::new_scale(trafo.trafo.data()[3], trafo.trafo.data()[7]); | ||||
|             trafo.trafo.data()[3] = 0; | ||||
|  |  | |||
|  | @ -1184,7 +1184,7 @@ void GLGizmoFlatten::on_render(const GLCanvas3D::Selection& selection) const | |||
|         int instance_idx = selection.get_instance_idx(); | ||||
|         if ((instance_idx != -1) && (m_model_object != nullptr)) | ||||
|         { | ||||
|             Transform3d m = m_model_object->instances[instance_idx]->world_matrix(); | ||||
|             Transform3d m = m_model_object->instances[instance_idx]->get_matrix(); | ||||
|             m.pretranslate(dragged_offset); | ||||
|             ::glPushMatrix(); | ||||
|             ::glMultMatrixd(m.data()); | ||||
|  | @ -1214,7 +1214,7 @@ void GLGizmoFlatten::on_render_for_picking(const GLCanvas3D::Selection& selectio | |||
|         if ((instance_idx != -1) && (m_model_object != nullptr)) | ||||
|         { | ||||
|             ::glPushMatrix(); | ||||
|             ::glMultMatrixd(m_model_object->instances[instance_idx]->world_matrix().data()); | ||||
|             ::glMultMatrixd(m_model_object->instances[instance_idx]->get_matrix().data()); | ||||
|             ::glBegin(GL_POLYGON); | ||||
|             for (const Vec3d& vertex : m_planes[i].vertices) | ||||
|             { | ||||
|  | @ -1439,7 +1439,7 @@ bool GLGizmoFlatten::is_plane_update_necessary() const | |||
| Vec3d GLGizmoFlatten::get_flattening_rotation() const | ||||
| { | ||||
|     // calculates the rotations in model space, taking in account the scaling factors
 | ||||
|     Eigen::Matrix<double, 3, 3, Eigen::DontAlign> m = m_model_object->instances.front()->world_matrix(true, true).matrix().block(0, 0, 3, 3).inverse().transpose(); | ||||
|     Eigen::Matrix<double, 3, 3, Eigen::DontAlign> m = m_model_object->instances.front()->get_matrix(true, true).matrix().block(0, 0, 3, 3).inverse().transpose(); | ||||
|     Eigen::Quaterniond q; | ||||
|     Vec3d angles = Geometry::extract_euler_angles(q.setFromTwoVectors(m * m_normal, -Vec3d::UnitZ()).toRotationMatrix()); | ||||
|     m_normal = Vec3d::Zero(); | ||||
|  | @ -1478,7 +1478,7 @@ void GLGizmoSlaSupports::set_model_object_ptr(ModelObject* model_object) | |||
| { | ||||
|     m_starting_center = Vec3d::Zero(); | ||||
|     m_model_object = model_object; | ||||
|     m_model_object_matrix = model_object->instances.front()->world_matrix(); | ||||
|     m_model_object_matrix = model_object->instances.front()->get_matrix(); | ||||
|     if (is_mesh_update_necessary()) | ||||
|         update_mesh(); | ||||
| } | ||||
|  | @ -1560,7 +1560,7 @@ bool GLGizmoSlaSupports::is_mesh_update_necessary() const | |||
|     if (m_state != On || !m_model_object || m_model_object->instances.empty()) | ||||
|         return false; | ||||
| 
 | ||||
|     if ((m_model_object->instances.front()->world_matrix() * m_source_data.matrix.inverse() * Vec3d(1., 1., 1.) - Vec3d(1., 1., 1.)).norm() > 0.001 ) | ||||
|     if ((m_model_object->instances.front()->get_matrix() * m_source_data.matrix.inverse() * Vec3d(1., 1., 1.) - Vec3d(1., 1., 1.)).norm() > 0.001) | ||||
|         return true; | ||||
| 
 | ||||
|     // following should detect direct mesh changes (can be removed after the mesh is made completely immutable):
 | ||||
|  | @ -1588,7 +1588,7 @@ void GLGizmoSlaSupports::update_mesh() | |||
|         F(i, 1) = 3*i+1; | ||||
|         F(i, 2) = 3*i+2; | ||||
|     } | ||||
|     m_source_data.matrix = m_model_object->instances.front()->world_matrix(); | ||||
|     m_source_data.matrix = m_model_object->instances.front()->get_matrix(); | ||||
|     const float* first_vertex = m_model_object->volumes.front()->get_convex_hull().first_vertex(); | ||||
|     m_source_data.mesh_first_point = Vec3d((double)first_vertex[0], (double)first_vertex[1], (double)first_vertex[2]); | ||||
|     // we'll now reload Grabbers (selection might have changed):
 | ||||
|  | @ -1629,7 +1629,7 @@ Vec3f GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos) | |||
|     const Vec3f& b = m_V.row(m_F(fid, 1)); | ||||
|     const Vec3f& c = m_V.row(m_F(fid, 2)); | ||||
|     Vec3f point = bc(0)*a + bc(1)*b + bc(2)*c; | ||||
|     return m_model_object->instances.front()->world_matrix().inverse().cast<float>() * point; | ||||
|     return m_model_object->instances.front()->get_matrix().inverse().cast<float>() * point; | ||||
| } | ||||
| 
 | ||||
| void GLGizmoSlaSupports::clicked_on_object(const Vec2d& mouse_position) | ||||
|  |  | |||
|  | @ -729,10 +729,7 @@ void ObjectList::load_part( ModelObject* model_object, | |||
|                 part_names.Add(new_volume->name); | ||||
| 
 | ||||
|                 if (delta != Vec3d::Zero()) | ||||
|                 { | ||||
|                     new_volume->mesh.translate((float)delta(0), (float)delta(1), (float)delta(2)); | ||||
|                     new_volume->get_convex_hull().translate((float)delta(0), (float)delta(1), (float)delta(2)); | ||||
|                 } | ||||
|                     new_volume->translate(delta); | ||||
| 
 | ||||
|                 // set a default extruder value, since user can't add it manually
 | ||||
|                 new_volume->config.set_key_value("extruder", new ConfigOptionInt(0)); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Enrico Turri
						Enrico Turri