mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-12 01:07:57 -06:00
Time optimization of GLCanvas3D::_travel_paths_by_feedrate()
This commit is contained in:
parent
85d9a16563
commit
66535b41d5
1 changed files with 29 additions and 47 deletions
|
@ -5234,67 +5234,49 @@ bool GLCanvas3D::_travel_paths_by_type(const GCodePreviewData& preview_data)
|
||||||
|
|
||||||
bool GLCanvas3D::_travel_paths_by_feedrate(const GCodePreviewData& preview_data)
|
bool GLCanvas3D::_travel_paths_by_feedrate(const GCodePreviewData& preview_data)
|
||||||
{
|
{
|
||||||
// Helper structure for feedrate
|
|
||||||
struct Feedrate
|
|
||||||
{
|
|
||||||
float value;
|
|
||||||
GLVolume* volume;
|
|
||||||
|
|
||||||
explicit Feedrate(float value)
|
|
||||||
: value(value)
|
|
||||||
, volume(nullptr)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator == (const Feedrate& other) const
|
|
||||||
{
|
|
||||||
return value == other.value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef std::vector<Feedrate> FeedratesList;
|
|
||||||
|
|
||||||
// colors travels by feedrate
|
|
||||||
|
|
||||||
// detects feedrates
|
|
||||||
FeedratesList feedrates;
|
|
||||||
for (const GCodePreviewData::Travel::Polyline& polyline : preview_data.travel.polylines)
|
|
||||||
{
|
|
||||||
if (std::find(feedrates.begin(), feedrates.end(), Feedrate(polyline.feedrate)) == feedrates.end())
|
|
||||||
feedrates.emplace_back(polyline.feedrate);
|
|
||||||
}
|
|
||||||
|
|
||||||
// nothing to render, return
|
// nothing to render, return
|
||||||
if (feedrates.empty())
|
if (preview_data.travel.polylines.empty())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// colors travels by feedrate
|
||||||
|
// detects feedrates
|
||||||
|
std::vector<std::pair<float, GLVolume*>> feedrates;
|
||||||
|
{
|
||||||
|
std::vector<float> values;
|
||||||
|
values.reserve(preview_data.travel.polylines.size());
|
||||||
|
for (const GCodePreviewData::Travel::Polyline& polyline : preview_data.travel.polylines)
|
||||||
|
values.emplace_back(polyline.feedrate);
|
||||||
|
sort_remove_duplicates(values);
|
||||||
|
feedrates.reserve(values.size());
|
||||||
// creates a new volume for each feedrate
|
// creates a new volume for each feedrate
|
||||||
for (Feedrate& feedrate : feedrates)
|
for (float feedrate : values)
|
||||||
feedrate.volume = m_volumes.new_nontoolpath_volume(preview_data.get_feedrate_color(feedrate.value).rgba, VERTEX_BUFFER_RESERVE_SIZE);
|
feedrates.emplace_back(feedrate, m_volumes.new_nontoolpath_volume(preview_data.get_feedrate_color(feedrate).rgba, VERTEX_BUFFER_RESERVE_SIZE));
|
||||||
|
}
|
||||||
|
|
||||||
// populates volumes
|
// populates volumes
|
||||||
|
std::pair<float, GLVolume*> key(0.f, nullptr);
|
||||||
for (const GCodePreviewData::Travel::Polyline& polyline : preview_data.travel.polylines)
|
for (const GCodePreviewData::Travel::Polyline& polyline : preview_data.travel.polylines)
|
||||||
{
|
{
|
||||||
FeedratesList::iterator feedrate = std::find(feedrates.begin(), feedrates.end(), Feedrate(polyline.feedrate));
|
key.first = polyline.feedrate;
|
||||||
if (feedrate != feedrates.end())
|
auto it_feedrate = std::lower_bound(feedrates.begin(), feedrates.end(), key, [](const std::pair<float, GLVolume*> &l, const std::pair<float, GLVolume*> &r) { return l.first < r.first; });
|
||||||
{
|
assert(it_feedrate != feedrates.end() && it_feedrate->first == polyline.feedrate);
|
||||||
GLVolume &vol = *feedrate->volume;
|
|
||||||
|
GLVolume &vol = *it_feedrate->second;
|
||||||
vol.print_zs.push_back(unscale<double>(polyline.polyline.bounding_box().min(2)));
|
vol.print_zs.push_back(unscale<double>(polyline.polyline.bounding_box().min(2)));
|
||||||
vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size());
|
vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size());
|
||||||
vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size());
|
vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size());
|
||||||
|
|
||||||
_3DScene::polyline3_to_verts(polyline.polyline, preview_data.travel.width, preview_data.travel.height, *feedrate->volume);
|
_3DScene::polyline3_to_verts(polyline.polyline, preview_data.travel.width, preview_data.travel.height, vol);
|
||||||
|
|
||||||
// Ensure that no volume grows over the limits. If the volume is too large, allocate a new one.
|
// Ensure that no volume grows over the limits. If the volume is too large, allocate a new one.
|
||||||
if (vol.indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) {
|
if (vol.indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) {
|
||||||
feedrate->volume = m_volumes.new_nontoolpath_volume(vol.color);
|
it_feedrate->second = m_volumes.new_nontoolpath_volume(vol.color);
|
||||||
reserve_new_volume_finalize_old_volume(*feedrate->volume, vol, m_initialized);
|
reserve_new_volume_finalize_old_volume(*it_feedrate->second, vol, m_initialized);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Feedrate &feedrate : feedrates)
|
for (auto &feedrate : feedrates)
|
||||||
feedrate.volume->finalize_geometry(m_initialized);
|
feedrate.second->finalize_geometry(m_initialized);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue