mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Refactoring of the G-code preview for lower memory allocation
and for separation of concerns: The final G-code preview no more uses ExtrusionPaths structure to hold the G-code path data extracted by parsing the G-code. Instead, the ExtrusionPath class has been trimmed down back to the original size before the G-code preview was introduced, and a new GCodePreviewData::Extrusion::Path class was created to hold the additional path data as the extruder ID, color change ID and fan speed.
This commit is contained in:
		
							parent
							
								
									b425ee50a9
								
							
						
					
					
						commit
						272479826f
					
				
					 7 changed files with 64 additions and 41 deletions
				
			
		|  | @ -1717,13 +1717,18 @@ static void thick_point_to_verts(const Vec3crd& point, | |||
|     point_to_indexed_vertex_array(point, width, height, volume.indexed_vertex_array); | ||||
| } | ||||
| 
 | ||||
| void _3DScene::extrusionentity_to_verts(const Polyline &polyline, float width, float height, float print_z, GLVolume& volume) | ||||
| { | ||||
| 	if (polyline.size() >= 2) { | ||||
| 		size_t num_segments = polyline.size() - 1; | ||||
| 		thick_lines_to_verts(polyline.lines(), std::vector<double>(num_segments, width), std::vector<double>(num_segments, height), false, print_z, volume); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Fill in the qverts and tverts with quads and triangles for the extrusion_path.
 | ||||
| void _3DScene::extrusionentity_to_verts(const ExtrusionPath &extrusion_path, float print_z, GLVolume &volume) | ||||
| { | ||||
|     Lines               lines = extrusion_path.polyline.lines(); | ||||
|     std::vector<double> widths(lines.size(), extrusion_path.width); | ||||
|     std::vector<double> heights(lines.size(), extrusion_path.height); | ||||
|     thick_lines_to_verts(lines, widths, heights, false, print_z, volume); | ||||
| 	extrusionentity_to_verts(extrusion_path.polyline, extrusion_path.width, extrusion_path.height, print_z, volume); | ||||
| } | ||||
| 
 | ||||
| // Fill in the qverts and tverts with quads and triangles for the extrusion_path.
 | ||||
|  |  | |||
|  | @ -656,6 +656,7 @@ public: | |||
| 
 | ||||
|     static void thick_lines_to_verts(const Lines& lines, const std::vector<double>& widths, const std::vector<double>& heights, bool closed, double top_z, GLVolume& volume); | ||||
|     static void thick_lines_to_verts(const Lines3& lines, const std::vector<double>& widths, const std::vector<double>& heights, bool closed, GLVolume& volume); | ||||
| 	static void extrusionentity_to_verts(const Polyline &polyline, float width, float height, float print_z, GLVolume& volume); | ||||
|     static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, GLVolume& volume); | ||||
|     static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, const Point& copy, GLVolume& volume); | ||||
|     static void extrusionentity_to_verts(const ExtrusionLoop& extrusion_loop, float print_z, const Point& copy, GLVolume& volume); | ||||
|  |  | |||
|  | @ -4987,13 +4987,13 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat | |||
|     // helper functions to select data in dependence of the extrusion view type
 | ||||
|     struct Helper | ||||
|     { | ||||
|         static float path_filter(GCodePreviewData::Extrusion::EViewType type, const ExtrusionPath& path) | ||||
|         static float path_filter(GCodePreviewData::Extrusion::EViewType type, const GCodePreviewData::Extrusion::Path& path) | ||||
|         { | ||||
|             switch (type) | ||||
|             { | ||||
|             case GCodePreviewData::Extrusion::FeatureType: | ||||
|             	// The role here is used for coloring.
 | ||||
|                 return (float)path.role(); | ||||
|                 return (float)path.extrusion_role; | ||||
|             case GCodePreviewData::Extrusion::Height: | ||||
|                 return path.height; | ||||
|             case GCodePreviewData::Extrusion::Width: | ||||
|  | @ -5071,15 +5071,15 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat | |||
| 	    { | ||||
| 		    std::vector<size_t> num_paths_per_role(size_t(erCount), 0); | ||||
| 		    for (const GCodePreviewData::Extrusion::Layer &layer : preview_data.extrusion.layers) | ||||
| 		        for (const ExtrusionPath &path : layer.paths) | ||||
| 		        	++ num_paths_per_role[size_t(path.role())]; | ||||
| 		        for (const GCodePreviewData::Extrusion::Path &path : layer.paths) | ||||
| 		        	++ num_paths_per_role[size_t(path.extrusion_role)]; | ||||
|             std::vector<std::vector<float>> roles_values; | ||||
| 			roles_values.assign(size_t(erCount), std::vector<float>()); | ||||
| 		    for (size_t i = 0; i < roles_values.size(); ++ i) | ||||
| 		    	roles_values[i].reserve(num_paths_per_role[i]); | ||||
|             for (const GCodePreviewData::Extrusion::Layer& layer : preview_data.extrusion.layers) | ||||
| 		        for (const ExtrusionPath& path : layer.paths) | ||||
| 		        	roles_values[size_t(path.role())].emplace_back(Helper::path_filter(preview_data.extrusion.view_type, path)); | ||||
| 		        for (const GCodePreviewData::Extrusion::Path &path : layer.paths) | ||||
| 		        	roles_values[size_t(path.extrusion_role)].emplace_back(Helper::path_filter(preview_data.extrusion.view_type, path)); | ||||
|             roles_filters.reserve(size_t(erCount)); | ||||
| 			size_t num_buffers = 0; | ||||
| 		    for (std::vector<float> &values : roles_values) { | ||||
|  | @ -5107,9 +5107,9 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat | |||
| 	    // populates volumes
 | ||||
| 		for (const GCodePreviewData::Extrusion::Layer& layer : preview_data.extrusion.layers) | ||||
| 		{ | ||||
| 			for (const ExtrusionPath& path : layer.paths) | ||||
| 			for (const GCodePreviewData::Extrusion::Path& path : layer.paths) | ||||
| 			{ | ||||
| 				std::vector<std::pair<float, GLVolume*>> &filters = roles_filters[size_t(path.role())]; | ||||
| 				std::vector<std::pair<float, GLVolume*>> &filters = roles_filters[size_t(path.extrusion_role)]; | ||||
| 				auto key = std::make_pair<float, GLVolume*>(Helper::path_filter(preview_data.extrusion.view_type, path), nullptr); | ||||
| 				auto it_filter = std::lower_bound(filters.begin(), filters.end(), key); | ||||
| 				assert(it_filter != filters.end() && key.first == it_filter->first); | ||||
|  | @ -5119,7 +5119,7 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat | |||
| 				vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size()); | ||||
| 				vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size()); | ||||
| 
 | ||||
| 				_3DScene::extrusionentity_to_verts(path, layer.z, vol); | ||||
| 				_3DScene::extrusionentity_to_verts(path.polyline, path.width, path.height, layer.z, vol); | ||||
| 			} | ||||
| 			// Ensure that no volume grows over the limits. If the volume is too large, allocate a new one.
 | ||||
| 		    for (std::vector<std::pair<float, GLVolume*>> &filters : roles_filters) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bubnikv
						bubnikv