From 696ade15ca22b746d52386caba01937f179b079e Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 13 May 2019 18:58:56 +0200 Subject: [PATCH 01/22] New way of starting arrange and rotation optimization. To prevent segfaults when exiting while processing is running. --- src/libslic3r/SLA/SLARotfinder.cpp | 4 +- src/slic3r/GUI/MainFrame.cpp | 6 +- src/slic3r/GUI/MainFrame.hpp | 4 +- src/slic3r/GUI/Plater.cpp | 279 +++++++++++++++++---------- src/slic3r/GUI/Plater.hpp | 1 + src/slic3r/GUI/ProgressStatusBar.cpp | 5 + src/slic3r/GUI/ProgressStatusBar.hpp | 1 + 7 files changed, 191 insertions(+), 109 deletions(-) diff --git a/src/libslic3r/SLA/SLARotfinder.cpp b/src/libslic3r/SLA/SLARotfinder.cpp index 1a91041b78..2e64059d68 100644 --- a/src/libslic3r/SLA/SLARotfinder.cpp +++ b/src/libslic3r/SLA/SLARotfinder.cpp @@ -44,7 +44,7 @@ std::array find_best_rotation(const ModelObject& modelobj, // call the status callback in each iteration but the actual value may be // the same for subsequent iterations (status goes from 0 to 100 but // iterations can be many more) - auto objfunc = [&emesh, &status, &statuscb, max_tries] + auto objfunc = [&emesh, &status, &statuscb, &stopcond, max_tries] (double rx, double ry, double rz) { EigenMesh3D& m = emesh; @@ -91,7 +91,7 @@ std::array find_best_rotation(const ModelObject& modelobj, } // report status - statuscb( unsigned(++status * 100.0/max_tries) ); + if(!stopcond()) statuscb( unsigned(++status * 100.0/max_tries) ); return score; }; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 128aba16d0..7e897f9a04 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -54,7 +54,7 @@ DPIFrame(NULL, wxID_ANY, wxString(SLIC3R_BUILD_ID) + " " + _(L("based on Slic3r" #endif // _WIN32 // initialize status bar - m_statusbar = new ProgressStatusBar(this); + m_statusbar.reset(new ProgressStatusBar(this)); m_statusbar->embed(this); m_statusbar->set_status_text(_(L("Version")) + " " + SLIC3R_VERSION + @@ -107,6 +107,8 @@ DPIFrame(NULL, wxID_ANY, wxString(SLIC3R_BUILD_ID) + " " + _(L("based on Slic3r" // Also the application closes much faster without these unnecessary screen refreshes. // In addition, there were some crashes due to the Paint events sent to already destructed windows. this->Show(false); + + if(m_plater) m_plater->stop_jobs(); // Save the slic3r.ini.Usually the ini file is saved from "on idle" callback, // but in rare cases it may not have been called yet. @@ -136,6 +138,8 @@ DPIFrame(NULL, wxID_ANY, wxString(SLIC3R_BUILD_ID) + " " + _(L("based on Slic3r" update_ui_from_settings(); // FIXME (?) } +MainFrame::~MainFrame() {} + void MainFrame::init_tabpanel() { diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index f3d5826814..321fbe61b1 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -86,7 +86,7 @@ protected: public: MainFrame(); - ~MainFrame() {} + ~MainFrame(); Plater* plater() { return m_plater; } @@ -121,7 +121,7 @@ public: Plater* m_plater { nullptr }; wxNotebook* m_tabpanel { nullptr }; wxProgressDialog* m_progress_dialog { nullptr }; - ProgressStatusBar* m_statusbar { nullptr }; + std::unique_ptr m_statusbar; }; } // GUI diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index fd29bcfa80..f485c4016a 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -5,6 +5,8 @@ #include #include #include +#include + #include #include #include @@ -1219,8 +1221,107 @@ struct Plater::priv wxString project_filename; BackgroundSlicingProcess background_process; - bool arranging; - bool rotoptimizing; + + class Job: public wxEvtHandler { + int m_range = 100; + std::future m_ftr; + priv *m_plater = nullptr; + std::atomic m_running {false}, m_canceled {false}; + + void run() { + m_running.store(true); process(); m_running.store(false); + + // ensure to call the last status to finalize the job + update_status(status_range(), ""); + } + + protected: + + // status range for a particular job + virtual int status_range() const { return 100; } + + void update_status(int st, const wxString& msg = "") { + auto evt = new wxThreadEvent(); evt->SetInt(st); evt->SetString(msg); + wxQueueEvent(this, evt); + } + + priv& plater() { return *m_plater; } + bool was_canceled() const { return m_canceled.load(); } + + public: + + Job(priv *_plater): m_plater(_plater) { + Bind(wxEVT_THREAD, [this](const wxThreadEvent& evt){ + auto msg = evt.GetString(); + if(! msg.empty()) plater().statusbar()->set_status_text(msg); + + if(! m_range) return; + + plater().statusbar()->set_progress(evt.GetInt()); + if(evt.GetInt() == status_range()) { + + // set back the original range and cancel callback + plater().statusbar()->set_range(m_range); + plater().statusbar()->set_cancel_callback(); + wxEndBusyCursor(); + + // Do a full refresh of scene tree, including regenerating + // all the GLVolumes. FIXME The update function shall just + // reload the modified matrices. + if(! was_canceled()) plater().update(true); + + // dont do finalization again for the same process + m_range = 0; + } + }); + } + + virtual void process() = 0; + + void start() { // only if not running + if(! m_running.load()) { + m_range = plater().statusbar()->get_range(); + m_canceled.store(false); + plater().statusbar()->set_range(status_range()); + plater().statusbar()->set_cancel_callback( [this](){ + m_canceled.store(true); + }); + wxBeginBusyCursor(); + m_ftr = std::async(std::launch::async, &Job::run, this); + } + } + + bool join(int timeout_ms = 0) { + if(!m_ftr.valid()) return true; + + if(timeout_ms <= 0) + m_ftr.wait(); + else if(m_ftr.wait_for(std::chrono::milliseconds(timeout_ms)) == + std::future_status::timeout) + return false; + + return true; + } + + bool is_running() const { return m_running.load(); } + void cancel() { m_canceled.store(true); } + }; + + class ArrangeJob: public Job { + int count = 0; + public: + using Job::Job; + int status_range() const override { return count; } + void set_count(int c) { count = c; } + void process() override; + } arrange_job {this}; + + class RotoptimizeJob: public Job { + public: + using Job::Job; + void process() override; + } rotoptimize_job {this}; + bool delayed_scene_refresh; std::string delayed_error_message; @@ -1389,8 +1490,6 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) { this->q->SetFont(Slic3r::GUI::wxGetApp().normal_font()); - arranging = false; - rotoptimizing = false; background_process.set_fff_print(&fff_print); background_process.set_sla_print(&sla_print); background_process.set_gcode_preview_data(&gcode_preview_data); @@ -1564,7 +1663,7 @@ void Plater::priv::update_ui_from_settings() ProgressStatusBar* Plater::priv::statusbar() { - return main_frame->m_statusbar; + return main_frame->m_statusbar.get(); } std::string Plater::priv::get_config(const std::string &key) const @@ -2089,46 +2188,37 @@ void Plater::priv::mirror(Axis axis) void Plater::priv::arrange() { - if (arranging) { return; } - arranging = true; - Slic3r::ScopeGuard arranging_guard([this]() { arranging = false; }); + if(!arrange_job.is_running()) { + int count = 0; + for(auto obj : model.objects) count += int(obj->instances.size()); + arrange_job.set_count(count); + arrange_job.start(); + } +} - wxBusyCursor wait; +// This method will find an optimal orientation for the currently selected item +// Very similar in nature to the arrange method above... +void Plater::priv::sla_optimize_rotation() { + + rotoptimize_job.start(); +} - this->background_process.stop(); - - unsigned count = 0; - for(auto obj : model.objects) count += obj->instances.size(); - - auto prev_range = statusbar()->get_range(); - statusbar()->set_range(count); - - auto statusfn = [this, count] (unsigned st, const std::string& msg) { - /* // In case we would run the arrange asynchronously - wxCommandEvent event(EVT_PROGRESS_BAR); - event.SetInt(st); - event.SetString(msg); - wxQueueEvent(this->q, event.Clone()); */ - statusbar()->set_progress(count - st); - statusbar()->set_status_text(_(msg)); - - // ok, this is dangerous, but we are protected by the flag - // 'arranging' and the arrange button is also disabled. - // This call is needed for the cancel button to work. - wxYieldIfNeeded(); - }; - - statusbar()->set_cancel_callback([this, statusfn](){ - arranging = false; - statusfn(0, L("Arranging canceled")); - }); +void Plater::priv::ArrangeJob::process() { + + // TODO: we should decide whether to allow arrange when the search is + // running we should probably disable explicit slicing and background + // processing static const std::string arrangestr = L("Arranging"); + + auto& config = plater().config; + auto& view3D = plater().view3D; + auto& model = plater().model; // FIXME: I don't know how to obtain the minimum distance, it depends // on printer technology. I guess the following should work but it crashes. double dist = 6; //PrintConfig::min_object_distance(config); - if(printer_technology == ptFFF) { + if(plater().printer_technology == ptFFF) { dist = PrintConfig::min_object_distance(config); } @@ -2141,7 +2231,7 @@ void Plater::priv::arrange() Polyline bed; bed.points.reserve(bedpoints.size()); for(auto& v : bedpoints) bed.append(Point::new_scale(v(0), v(1))); - statusfn(0, arrangestr); + update_status(0, arrangestr); arr::WipeTowerInfo wti = view3D->get_canvas3d()->get_wipe_tower_info(); @@ -2157,67 +2247,34 @@ void Plater::priv::arrange() bed, hint, false, // create many piles not just one pile - [statusfn](unsigned st) { statusfn(st, arrangestr); }, - [this] () { return !arranging; }); + [this](unsigned st) { if(st > 0) update_status(count - int(st), arrangestr); }, + [this] () { return was_canceled(); }); } catch(std::exception& /*e*/) { - GUI::show_error(this->q, L("Could not arrange model objects! " - "Some geometries may be invalid.")); + GUI::show_error(plater().q, L("Could not arrange model objects! " + "Some geometries may be invalid.")); } + + update_status(count, was_canceled() ? L("Arranging canceled.") : L("Arranging done.")); // it remains to move the wipe tower: - view3D->get_canvas3d()->arrange_wipe_tower(wti); - - statusfn(0, L("Arranging done.")); - statusbar()->set_range(prev_range); - statusbar()->set_cancel_callback(); // remove cancel button - - // Do a full refresh of scene tree, including regenerating all the GLVolumes. - //FIXME The update function shall just reload the modified matrices. - update(true); + view3D->get_canvas3d()->arrange_wipe_tower(wti); } -// This method will find an optimal orientation for the currently selected item -// Very similar in nature to the arrange method above... -void Plater::priv::sla_optimize_rotation() { +void Plater::priv::RotoptimizeJob::process() +{ - // TODO: we should decide whether to allow arrange when the search is - // running we should probably disable explicit slicing and background - // processing - - if (rotoptimizing) { return; } - rotoptimizing = true; - Slic3r::ScopeGuard rotoptimizing_guard([this]() { rotoptimizing = false; }); - - int obj_idx = get_selected_object_idx(); + int obj_idx = plater().get_selected_object_idx(); if (obj_idx < 0) { return; } - ModelObject * o = model.objects[size_t(obj_idx)]; - - background_process.stop(); - - auto prev_range = statusbar()->get_range(); - statusbar()->set_range(100); - - auto stfn = [this] (unsigned st, const std::string& msg) { - statusbar()->set_progress(int(st)); - statusbar()->set_status_text(msg); - - // could be problematic, but we need the cancel button. - wxYieldIfNeeded(); - }; - - statusbar()->set_cancel_callback([this, stfn](){ - rotoptimizing = false; - stfn(0, L("Orientation search canceled")); - }); - + ModelObject * o = plater().model.objects[size_t(obj_idx)]; + auto r = sla::find_best_rotation( *o, .005f, - [stfn](unsigned s) { stfn(s, L("Searching for optimal orientation")); }, - [this](){ return !rotoptimizing; } + [this](unsigned s) { if(s < 100) update_status(int(s), L("Searching for optimal orientation")); }, + [this](){ return was_canceled(); } ); - const auto *bed_shape_opt = config->opt("bed_shape"); + const auto *bed_shape_opt = plater().config->opt("bed_shape"); assert(bed_shape_opt); auto& bedpoints = bed_shape_opt->values; @@ -2227,7 +2284,7 @@ void Plater::priv::sla_optimize_rotation() { double mindist = 6.0; // FIXME double offs = mindist / 2.0 - EPSILON; - if(rotoptimizing) // wasn't canceled + if(! was_canceled()) // wasn't canceled for(ModelInstance * oi : o->instances) { oi->set_rotation({r[X], r[Y], r[Z]}); @@ -2267,19 +2324,18 @@ void Plater::priv::sla_optimize_rotation() { Vec3d rt = oi->get_rotation(); rt(Z) += r; oi->set_rotation(rt); + + arr::WipeTowerInfo wti; // useless in SLA context + arr::find_new_position(plater().model, o->instances, + coord_t(mindist/SCALING_FACTOR), bed, wti); + + // Correct the z offset of the object which was corrupted be the rotation + o->ensure_on_bed(); + + update_status(100, L("Orientation found.")); + } else { + update_status(100, L("Orientation search canceled.")); } - - arr::WipeTowerInfo wti; // useless in SLA context - arr::find_new_position(model, o->instances, coord_t(mindist/SCALING_FACTOR), bed, wti); - - // Correct the z offset of the object which was corrupted be the rotation - o->ensure_on_bed(); - - stfn(0, L("Orientation found.")); - statusbar()->set_range(prev_range); - statusbar()->set_cancel_callback(); - - update(true); } void Plater::priv::split_object() @@ -2455,7 +2511,7 @@ unsigned int Plater::priv::update_background_process(bool force_validation) // Restart background processing thread based on a bitmask of UpdateBackgroundProcessReturnState. bool Plater::priv::restart_background_process(unsigned int state) { - if (arranging || rotoptimizing) { + if (arrange_job.is_running() || rotoptimize_job.is_running()) { // Avoid a race condition return false; } @@ -2686,7 +2742,7 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt) void Plater::priv::on_slicing_update(SlicingStatusEvent &evt) { if (evt.status.percent >= -1) { - if (arranging || rotoptimizing) { + if (arrange_job.is_running() || rotoptimize_job.is_running()) { // Avoid a race condition return; } @@ -3140,7 +3196,7 @@ bool Plater::priv::can_fix_through_netfabb() const bool Plater::priv::can_increase_instances() const { - if (arranging || rotoptimizing) { + if (arrange_job.is_running() || rotoptimize_job.is_running()) { return false; } @@ -3150,7 +3206,7 @@ bool Plater::priv::can_increase_instances() const bool Plater::priv::can_decrease_instances() const { - if (arranging || rotoptimizing) { + if (arrange_job.is_running() || rotoptimize_job.is_running()) { return false; } @@ -3170,7 +3226,7 @@ bool Plater::priv::can_split_to_volumes() const bool Plater::priv::can_arrange() const { - return !model.objects.empty() && !arranging; + return !model.objects.empty() && !arrange_job.is_running(); } bool Plater::priv::can_layers_editing() const @@ -3292,6 +3348,21 @@ void Plater::load_files(const std::vector& input_files, bool load_m void Plater::update() { p->update(); } +void Plater::stop_jobs() +{ + static const int ABORT_WAIT_MAX_MS = 10000; + bool aborted = false; + + p->rotoptimize_job.cancel(); + aborted = p->rotoptimize_job.join(ABORT_WAIT_MAX_MS); + + p->arrange_job.cancel(); + aborted &= p->arrange_job.join(ABORT_WAIT_MAX_MS); + + if(!aborted) + BOOST_LOG_TRIVIAL(error) << "Could not abort an optimization job!"; +} + void Plater::update_ui_from_settings() { p->update_ui_from_settings(); } void Plater::select_view(const std::string& direction) { p->select_view(direction); } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 3e70036864..8c62b742f4 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -143,6 +143,7 @@ public: void load_files(const std::vector& input_files, bool load_model = true, bool load_config = true); void update(); + void stop_jobs(); void select_view(const std::string& direction); void select_view_3D(const std::string& name); diff --git a/src/slic3r/GUI/ProgressStatusBar.cpp b/src/slic3r/GUI/ProgressStatusBar.cpp index b48c5732b5..f848e663d2 100644 --- a/src/slic3r/GUI/ProgressStatusBar.cpp +++ b/src/slic3r/GUI/ProgressStatusBar.cpp @@ -168,6 +168,11 @@ void ProgressStatusBar::set_status_text(const char *txt) this->set_status_text(wxString::FromUTF8(txt)); } +wxString ProgressStatusBar::get_status_text() const +{ + return self->GetStatusText(); +} + void ProgressStatusBar::show_cancel_button() { if(m_cancelbutton) m_cancelbutton->Show(); diff --git a/src/slic3r/GUI/ProgressStatusBar.hpp b/src/slic3r/GUI/ProgressStatusBar.hpp index 225b0331ef..fa21ba47c6 100644 --- a/src/slic3r/GUI/ProgressStatusBar.hpp +++ b/src/slic3r/GUI/ProgressStatusBar.hpp @@ -51,6 +51,7 @@ public: void set_status_text(const wxString& txt); void set_status_text(const std::string& txt); void set_status_text(const char *txt); + wxString get_status_text() const; // Temporary methods to satisfy Perl side void show_cancel_button(); From 170789a78715ba27303c38ac93687f1d3878f525 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 14 May 2019 10:34:11 +0200 Subject: [PATCH 02/22] Some comments and avoid race condition with background process. --- src/slic3r/GUI/Plater.cpp | 45 +++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f485c4016a..f82174ea9b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1222,11 +1222,22 @@ struct Plater::priv BackgroundSlicingProcess background_process; + // A class to handle UI jobs like arranging and optimizing rotation. + // These are not instant jobs, the user has to be informed about their + // state in the status progress indicator. On the other hand they are + // separated from the background slicing process. Ideally, these jobs should + // run when the background process is not running. + // + // TODO: A mechanism would be useful for blocking the plater interactions: + // objects would be frozen for the user. In case of arrange, an animation + // could be shown, or with the optimize orientations, partial results + // could be displayed. class Job: public wxEvtHandler { int m_range = 100; std::future m_ftr; priv *m_plater = nullptr; std::atomic m_running {false}, m_canceled {false}; + bool m_stop_slicing = false; void run() { m_running.store(true); process(); m_running.store(false); @@ -1240,6 +1251,7 @@ struct Plater::priv // status range for a particular job virtual int status_range() const { return 100; } + // status update, to be used from the work thread (process() method) void update_status(int st, const wxString& msg = "") { auto evt = new wxThreadEvent(); evt->SetInt(st); evt->SetString(msg); wxQueueEvent(this, evt); @@ -1250,7 +1262,9 @@ struct Plater::priv public: - Job(priv *_plater): m_plater(_plater) { + Job(priv *_plater, bool stop_slicing = false): + m_plater(_plater), m_stop_slicing(stop_slicing) + { Bind(wxEVT_THREAD, [this](const wxThreadEvent& evt){ auto msg = evt.GetString(); if(! msg.empty()) plater().statusbar()->set_status_text(msg); @@ -1278,19 +1292,39 @@ struct Plater::priv virtual void process() = 0; - void start() { // only if not running + void start() { // Start the job. No effect if the job is already running if(! m_running.load()) { + + if(m_stop_slicing) plater().background_process.stop(); + + // Save the current status indicatior range and push the new one m_range = plater().statusbar()->get_range(); - m_canceled.store(false); plater().statusbar()->set_range(status_range()); + + // init cancellation flag and set the cancel callback + m_canceled.store(false); plater().statusbar()->set_cancel_callback( [this](){ m_canceled.store(true); }); + + // Changing cursor to busy wxBeginBusyCursor(); - m_ftr = std::async(std::launch::async, &Job::run, this); + + try { // Execute the job + m_ftr = std::async(std::launch::async, &Job::run, this); + } catch(std::exception& ) { + update_status(status_range(), + _(L("ERROR: not enough resources to execute a new job."))); + } + + // The state changes will be undone when the process hits the + // last status value, in the status update handler (see ctor) } } + // To wait for the running job and join the threads. False is returned + // if the timeout has been reached and the job is still running. Call + // cancel() before this fn if you want to explicitly end the job. bool join(int timeout_ms = 0) { if(!m_ftr.valid()) return true; @@ -3676,6 +3710,9 @@ void Plater::export_3mf(const boost::filesystem::path& output_path) void Plater::reslice() { + // Stop arrange and (or) optimize rotation tasks. + this->stop_jobs(); + //FIXME Don't reslice if export of G-code or sending to OctoPrint is running. // bitmask of UpdateBackgroundProcessReturnState unsigned int state = this->p->update_background_process(true); From baab5e49f1a95f48f4bafcdd9060b0c6f896cb00 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 18 May 2019 16:56:46 +0200 Subject: [PATCH 03/22] Mirroring parameters prepared for UI. Actual mirroring disabled, it will be refactored to maintain clarity of code. --- src/libslic3r/PrintConfig.cpp | 12 ++++++ src/libslic3r/PrintConfig.hpp | 4 ++ src/libslic3r/PrintExport.hpp | 22 ++++++++++ src/libslic3r/Rasterizer/Rasterizer.hpp | 7 +++- src/libslic3r/SLAPrint.cpp | 54 +++++++++++++------------ 5 files changed, 71 insertions(+), 28 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 87ea263012..bd29916af3 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2258,6 +2258,18 @@ void PrintConfigDef::init_sla_params() def->min = 100; def->set_default_value(new ConfigOptionInt(1440)); + def = this->add("display_mirror_x", coBool); + def->full_label = L("Display mirroring in X axis"); + def->label = L("Mirror X"); + def->tooltip = L("Enable mirroring of output images in the X axis"); + def->set_default_value(new ConfigOptionBool(false)); + + def = this->add("display_mirror_y", coBool); + def->full_label = L("Display mirroring in Y axis"); + def->label = L("Mirror Y"); + def->tooltip = L("Enable mirroring of output images in the Y axis"); + def->set_default_value(new ConfigOptionBool(true)); + def = this->add("display_orientation", coEnum); def->label = L("Display orientation"); def->tooltip = L("Set the actual LCD display orientation inside the SLA printer." diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 1da22b377f..248b89e321 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1083,6 +1083,8 @@ public: ConfigOptionInt display_pixels_x; ConfigOptionInt display_pixels_y; ConfigOptionEnum display_orientation; + ConfigOptionBool display_mirror_x; + ConfigOptionBool display_mirror_y; ConfigOptionFloats relative_correction; ConfigOptionFloat absolute_correction; ConfigOptionFloat gamma_correction; @@ -1099,6 +1101,8 @@ protected: OPT_PTR(display_height); OPT_PTR(display_pixels_x); OPT_PTR(display_pixels_y); + OPT_PTR(display_mirror_x); + OPT_PTR(display_mirror_y); OPT_PTR(display_orientation); OPT_PTR(relative_correction); OPT_PTR(absolute_correction); diff --git a/src/libslic3r/PrintExport.hpp b/src/libslic3r/PrintExport.hpp index f6537ed324..c7d462b4f3 100644 --- a/src/libslic3r/PrintExport.hpp +++ b/src/libslic3r/PrintExport.hpp @@ -210,6 +210,28 @@ public: { } + inline FilePrinter(const SLAPrinterConfig& cfg, const SLAMaterialConfig& mcfg, double layer_height) + { + double w = cfg.display_width.getFloat(); + double h = cfg.display_height.getFloat(); + auto pw = unsigned(cfg.display_pixels_x.getInt()); + auto ph = unsigned(cfg.display_pixels_y.getInt()); + + m_res = Raster::Resolution(pw, ph); + m_pxdim = Raster::PixelDim(w/pw, h/ph); + m_exp_time_s = mcfg.exposure_time.getFloat(); + m_exp_time_first_s = mcfg.initial_exposure_time.getFloat(); + m_layer_height = layer_height; + + auto ro = cfg.display_orientation.getInt(); + + // Here is the trick with the orientation. + m_o = ro == RO_LANDSCAPE? Raster::Origin::BOTTOM_LEFT : + Raster::Origin::TOP_LEFT; + + m_gamma = cfg.gamma_correction.getFloat(); + } + FilePrinter(const FilePrinter& ) = delete; FilePrinter(FilePrinter&& m): m_layers_rst(std::move(m.m_layers_rst)), diff --git a/src/libslic3r/Rasterizer/Rasterizer.hpp b/src/libslic3r/Rasterizer/Rasterizer.hpp index 3fffe1a365..d338a5e3b8 100644 --- a/src/libslic3r/Rasterizer/Rasterizer.hpp +++ b/src/libslic3r/Rasterizer/Rasterizer.hpp @@ -75,7 +75,10 @@ public: struct Resolution { unsigned width_px; unsigned height_px; - inline Resolution(unsigned w, unsigned h): width_px(w), height_px(h) {} + + inline Resolution(unsigned w = 0, unsigned h = 0): + width_px(w), height_px(h) {} + inline unsigned pixels() const /*noexcept*/ { return width_px * height_px; } @@ -85,7 +88,7 @@ public: struct PixelDim { double w_mm; double h_mm; - inline PixelDim(double px_width_mm, double px_height_mm ): + inline PixelDim(double px_width_mm = 0.0, double px_height_mm = 0.0): w_mm(px_width_mm), h_mm(px_height_mm) {} }; diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 457be23ba5..6d2318bea2 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1008,7 +1008,7 @@ void SLAPrint::process() namespace sl = libnest2d::shapelike; // For algorithms // If the raster has vertical orientation, we will flip the coordinates - bool flpXY = m_printer_config.display_orientation.getInt() == SLADisplayOrientation::sladoPortrait; +// bool flpXY = m_printer_config.display_orientation.getInt() == SLADisplayOrientation::sladoPortrait; // Set up custom union and diff functions for clipper polygons auto polyunion = [] (const ClipperPolygons& subjects) @@ -1066,9 +1066,9 @@ void SLAPrint::process() // get polygons for all instances in the object auto get_all_polygons = - [flpXY](const ExPolygons& input_polygons, - const std::vector& instances, - bool is_lefthanded) + [](const ExPolygons& input_polygons, + const std::vector& instances, + bool is_lefthanded) { ClipperPolygons polygons; polygons.reserve(input_polygons.size() * instances.size()); @@ -1082,7 +1082,7 @@ void SLAPrint::process() // We need to reverse if flpXY OR is_lefthanded is true but // not if both are true which is a logical inequality (XOR) - bool needreverse = flpXY != is_lefthanded; + bool needreverse = /*flpXY !=*/ is_lefthanded; // should be a move poly.Contour.reserve(polygon.contour.size() + 1); @@ -1117,10 +1117,10 @@ void SLAPrint::process() sl::translate(poly, ClipperPoint{instances[i].shift(X), instances[i].shift(Y)}); - if (flpXY) { - for(auto& p : poly.Contour) std::swap(p.X, p.Y); - for(auto& h : poly.Holes) for(auto& p : h) std::swap(p.X, p.Y); - } +// if (flpXY) { +// for(auto& p : poly.Contour) std::swap(p.X, p.Y); +// for(auto& h : poly.Holes) for(auto& p : h) std::swap(p.X, p.Y); +// } polygons.emplace_back(std::move(poly)); } @@ -1289,27 +1289,29 @@ void SLAPrint::process() { // create a raster printer for the current print parameters // I don't know any better - auto& ocfg = m_objects.front()->m_config; - auto& matcfg = m_material_config; - auto& printcfg = m_printer_config; +// auto& ocfg = m_objects.front()->m_config; +// auto& matcfg = m_material_config; +// auto& printcfg = m_printer_config; - double w = printcfg.display_width.getFloat(); - double h = printcfg.display_height.getFloat(); - auto pw = unsigned(printcfg.display_pixels_x.getInt()); - auto ph = unsigned(printcfg.display_pixels_y.getInt()); - double lh = ocfg.layer_height.getFloat(); - double exp_t = matcfg.exposure_time.getFloat(); - double iexp_t = matcfg.initial_exposure_time.getFloat(); +// double w = printcfg.display_width.getFloat(); +// double h = printcfg.display_height.getFloat(); +// auto pw = unsigned(printcfg.display_pixels_x.getInt()); +// auto ph = unsigned(printcfg.display_pixels_y.getInt()); +// double lh = ocfg.layer_height.getFloat(); +// double exp_t = matcfg.exposure_time.getFloat(); +// double iexp_t = matcfg.initial_exposure_time.getFloat(); - double gamma = m_printer_config.gamma_correction.getFloat(); +// double gamma = m_printer_config.gamma_correction.getFloat(); - if(flpXY) { std::swap(w, h); std::swap(pw, ph); } +// if(flpXY) { std::swap(w, h); std::swap(pw, ph); } - m_printer.reset( - new SLAPrinter(w, h, pw, ph, lh, exp_t, iexp_t, - flpXY? SLAPrinter::RO_PORTRAIT : - SLAPrinter::RO_LANDSCAPE, - gamma)); +// m_printer.reset( +// new SLAPrinter(w, h, pw, ph, lh, exp_t, iexp_t, +// flpXY? SLAPrinter::RO_PORTRAIT : +// SLAPrinter::RO_LANDSCAPE, +// gamma)); + + m_printer.reset(new SLAPrinter(m_printer_config, m_material_config, m_default_object_config.layer_height.getFloat())); } // Allocate space for all the layers From bb73b59aa672632eab7e6f87514cb94688c5fb02 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Sat, 18 May 2019 22:45:24 +0200 Subject: [PATCH 04/22] Mirroring refactored. --- src/libslic3r/CMakeLists.txt | 7 +- src/libslic3r/PrintConfig.cpp | 4 +- src/libslic3r/PrintExport.hpp | 349 ------------------ src/libslic3r/Rasterizer/bicubic.h | 186 ---------- .../Rasterizer.cpp => SLA/SLARaster.cpp} | 99 +++-- .../Rasterizer.hpp => SLA/SLARaster.hpp} | 64 ++-- src/libslic3r/SLA/SLARasterWriter.cpp | 136 +++++++ src/libslic3r/SLA/SLARasterWriter.hpp | 139 +++++++ src/libslic3r/SLAPrint.cpp | 34 +- src/libslic3r/SLAPrint.hpp | 42 +-- 10 files changed, 380 insertions(+), 680 deletions(-) delete mode 100644 src/libslic3r/PrintExport.hpp delete mode 100644 src/libslic3r/Rasterizer/bicubic.h rename src/libslic3r/{Rasterizer/Rasterizer.cpp => SLA/SLARaster.cpp} (77%) rename src/libslic3r/{Rasterizer/Rasterizer.hpp => SLA/SLARaster.hpp} (68%) create mode 100644 src/libslic3r/SLA/SLARasterWriter.cpp create mode 100644 src/libslic3r/SLA/SLARasterWriter.hpp diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index ce93d95fab..3c32a22ed2 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -130,13 +130,10 @@ add_library(libslic3r STATIC Print.hpp PrintBase.cpp PrintBase.hpp - PrintExport.hpp PrintConfig.cpp PrintConfig.hpp PrintObject.cpp PrintRegion.cpp - Rasterizer/Rasterizer.hpp - Rasterizer/Rasterizer.cpp SLAPrint.cpp SLAPrint.hpp SLA/SLAAutoSupports.hpp @@ -173,6 +170,10 @@ add_library(libslic3r STATIC SLA/SLARotfinder.cpp SLA/SLABoostAdapter.hpp SLA/SLASpatIndex.hpp + SLA/SLARaster.hpp + SLA/SLARaster.cpp + SLA/SLARasterWriter.hpp + SLA/SLARasterWriter.cpp ) if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index bd29916af3..d000c2c2c5 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2262,13 +2262,13 @@ void PrintConfigDef::init_sla_params() def->full_label = L("Display mirroring in X axis"); def->label = L("Mirror X"); def->tooltip = L("Enable mirroring of output images in the X axis"); - def->set_default_value(new ConfigOptionBool(false)); + def->set_default_value(new ConfigOptionBool(true)); def = this->add("display_mirror_y", coBool); def->full_label = L("Display mirroring in Y axis"); def->label = L("Mirror Y"); def->tooltip = L("Enable mirroring of output images in the Y axis"); - def->set_default_value(new ConfigOptionBool(true)); + def->set_default_value(new ConfigOptionBool(false)); def = this->add("display_orientation", coEnum); def->label = L("Display orientation"); diff --git a/src/libslic3r/PrintExport.hpp b/src/libslic3r/PrintExport.hpp deleted file mode 100644 index c7d462b4f3..0000000000 --- a/src/libslic3r/PrintExport.hpp +++ /dev/null @@ -1,349 +0,0 @@ -#ifndef PRINTEXPORT_HPP -#define PRINTEXPORT_HPP - -// For png export of the sliced model -#include -#include -#include - -#include -#include - -#include "Rasterizer/Rasterizer.hpp" -//#include -//#include //#include "tbb/mutex.h" - -namespace Slic3r { - -// Used for addressing parameters of FilePrinter::set_statistics() -enum ePrintStatistics -{ - psUsedMaterial = 0, - psNumFade, - psNumSlow, - psNumFast, - - psCnt -}; - -enum class FilePrinterFormat { - SLA_PNGZIP, - SVG -}; - -/* - * Interface for a file printer of the slices. Implementation can be an SVG - * or PNG printer or any other format. - * - * The format argument specifies the output format of the printer and it enables - * different implementations of this class template for each supported format. - * - */ -template -class FilePrinter { -public: - - // Draw a polygon which is a polygon inside a slice on the specified layer. - void draw_polygon(const ExPolygon& p, unsigned lyr); - void draw_polygon(const ClipperLib::Polygon& p, unsigned lyr); - - // Tell the printer how many layers should it consider. - void layers(unsigned layernum); - - // Get the number of layers in the print. - unsigned layers() const; - - /* Switch to a particular layer. If there where less layers then the - * specified layer number than an appropriate number of layers will be - * allocated in the printer. - */ - void begin_layer(unsigned layer); - - // Allocate a new layer on top of the last and switch to it. - void begin_layer(); - - /* - * Finish the selected layer. It means that no drawing is allowed on that - * layer anymore. This fact can be used to prepare the file system output - * data like png comprimation and so on. - */ - void finish_layer(unsigned layer); - - // Finish the top layer. - void finish_layer(); - - // Save all the layers into the file (or dir) specified in the path argument - // An optional project name can be added to be used for the layer file names - void save(const std::string& path, const std::string& projectname = ""); - - // Save only the selected layer to the file specified in path argument. - void save_layer(unsigned lyr, const std::string& path); -}; - -// Provokes static_assert in the right way. -template struct VeryFalse { static const bool value = false; }; - -// This can be explicitly implemented in the gui layer or the default Zipper -// API in libslic3r with minz. -template class LayerWriter { -public: - - LayerWriter(const std::string& /*zipfile_path*/) - { - static_assert(VeryFalse::value, - "No layer writer implementation provided!"); - } - - // Should create a new file within the zip with the given filename. It - // should also finish any previous entry. - void next_entry(const std::string& /*fname*/) {} - - // Should create a new file within the archive and write the provided data. - void binary_entry(const std::string& /*fname*/, - const std::uint8_t* buf, size_t len); - - // Test whether the object can still be used for writing. - bool is_ok() { return false; } - - // Write some data (text) into the current file (entry) within the archive. - template LayerWriter& operator<<(T&& /*arg*/) { - return *this; - } - - // Flush the current entry into the archive. - void finalize() {} -}; - -// Implementation for PNG raster output -// Be aware that if a large number of layers are allocated, it can very well -// exhaust the available memory especially on 32 bit platform. -template<> class FilePrinter -{ - struct Layer { - Raster raster; - RawBytes rawbytes; - - Layer() {} - - Layer(const Layer&) = delete; - Layer(Layer&& m): - raster(std::move(m.raster)) {} - }; - - // We will save the compressed PNG data into stringstreams which can be done - // in parallel. Later we can write every layer to the disk sequentially. - std::vector m_layers_rst; - Raster::Resolution m_res; - Raster::PixelDim m_pxdim; - double m_exp_time_s = .0, m_exp_time_first_s = .0; - double m_layer_height = .0; - Raster::Origin m_o = Raster::Origin::TOP_LEFT; - double m_gamma; - - double m_used_material = 0.0; - int m_cnt_fade_layers = 0; - int m_cnt_slow_layers = 0; - int m_cnt_fast_layers = 0; - - std::string createIniContent(const std::string& projectname) { - using std::string; - using std::to_string; - - auto expt_str = to_string(m_exp_time_s); - auto expt_first_str = to_string(m_exp_time_first_s); - auto layerh_str = to_string(m_layer_height); - - const std::string cnt_fade_layers = to_string(m_cnt_fade_layers); - const std::string cnt_slow_layers = to_string(m_cnt_slow_layers); - const std::string cnt_fast_layers = to_string(m_cnt_fast_layers); - const std::string used_material = to_string(m_used_material); - - return string( - "action = print\n" - "jobDir = ") + projectname + "\n" + - "expTime = " + expt_str + "\n" - "expTimeFirst = " + expt_first_str + "\n" - "numFade = " + cnt_fade_layers + "\n" - "layerHeight = " + layerh_str + "\n" - "usedMaterial = " + used_material + "\n" - "numSlow = " + cnt_slow_layers + "\n" - "numFast = " + cnt_fast_layers + "\n"; - } - -public: - - enum RasterOrientation { - RO_LANDSCAPE, - RO_PORTRAIT - }; - - // We will play with the raster's coordinate origin parameter. When the - // printer should print in landscape mode it should have the Y axis flipped - // because the layers should be displayed upside down. PNG has its - // coordinate origin in the top-left corner so normally the Raster objects - // should be instantiated with the TOP_LEFT flag. However, in landscape mode - // we do want the pictures to be upside down so we will make BOTTOM_LEFT - // type rasters and the PNG format will do the flipping automatically. - - // In case of portrait images, we have to rotate the image by a 90 degrees - // and flip the y axis. To get the correct upside-down orientation of the - // slice images, we can flip the x and y coordinates of the input polygons - // and do the Y flipping of the image. This will generate the correct - // orientation in portrait mode. - - inline FilePrinter(double width_mm, double height_mm, - unsigned width_px, unsigned height_px, - double layer_height, - double exp_time, double exp_time_first, - RasterOrientation ro = RO_PORTRAIT, - double gamma = 1.0): - m_res(width_px, height_px), - m_pxdim(width_mm/width_px, height_mm/height_px), - m_exp_time_s(exp_time), - m_exp_time_first_s(exp_time_first), - m_layer_height(layer_height), - - // Here is the trick with the orientation. - m_o(ro == RO_LANDSCAPE? Raster::Origin::BOTTOM_LEFT : - Raster::Origin::TOP_LEFT ), - m_gamma(gamma) - { - } - - inline FilePrinter(const SLAPrinterConfig& cfg, const SLAMaterialConfig& mcfg, double layer_height) - { - double w = cfg.display_width.getFloat(); - double h = cfg.display_height.getFloat(); - auto pw = unsigned(cfg.display_pixels_x.getInt()); - auto ph = unsigned(cfg.display_pixels_y.getInt()); - - m_res = Raster::Resolution(pw, ph); - m_pxdim = Raster::PixelDim(w/pw, h/ph); - m_exp_time_s = mcfg.exposure_time.getFloat(); - m_exp_time_first_s = mcfg.initial_exposure_time.getFloat(); - m_layer_height = layer_height; - - auto ro = cfg.display_orientation.getInt(); - - // Here is the trick with the orientation. - m_o = ro == RO_LANDSCAPE? Raster::Origin::BOTTOM_LEFT : - Raster::Origin::TOP_LEFT; - - m_gamma = cfg.gamma_correction.getFloat(); - } - - FilePrinter(const FilePrinter& ) = delete; - FilePrinter(FilePrinter&& m): - m_layers_rst(std::move(m.m_layers_rst)), - m_res(m.m_res), - m_pxdim(m.m_pxdim) {} - - inline void layers(unsigned cnt) { if(cnt > 0) m_layers_rst.resize(cnt); } - inline unsigned layers() const { return unsigned(m_layers_rst.size()); } - - inline void draw_polygon(const ExPolygon& p, unsigned lyr) { - assert(lyr < m_layers_rst.size()); - m_layers_rst[lyr].raster.draw(p); - } - - inline void draw_polygon(const ClipperLib::Polygon& p, unsigned lyr) { - assert(lyr < m_layers_rst.size()); - m_layers_rst[lyr].raster.draw(p); - } - - inline void begin_layer(unsigned lyr) { - if(m_layers_rst.size() <= lyr) m_layers_rst.resize(lyr+1); - m_layers_rst[lyr].raster.reset(m_res, m_pxdim, m_o, m_gamma); - } - - inline void begin_layer() { - m_layers_rst.emplace_back(); - m_layers_rst.front().raster.reset(m_res, m_pxdim, m_o, m_gamma); - } - - inline void finish_layer(unsigned lyr_id) { - assert(lyr_id < m_layers_rst.size()); - m_layers_rst[lyr_id].rawbytes = - m_layers_rst[lyr_id].raster.save(Raster::Compression::PNG); - m_layers_rst[lyr_id].raster.reset(); - } - - inline void finish_layer() { - if(!m_layers_rst.empty()) { - m_layers_rst.back().rawbytes = - m_layers_rst.back().raster.save(Raster::Compression::PNG); - m_layers_rst.back().raster.reset(); - } - } - - template - inline void save(const std::string& fpath, const std::string& prjname = "") - { - try { - LayerWriter writer(fpath); - if(!writer.is_ok()) return; - - std::string project = prjname.empty()? - boost::filesystem::path(fpath).stem().string() : prjname; - - writer.next_entry("config.ini"); - if(!writer.is_ok()) return; - - writer << createIniContent(project); - - for(unsigned i = 0; i < m_layers_rst.size() && writer.is_ok(); i++) - { - if(m_layers_rst[i].rawbytes.size() > 0) { - char lyrnum[6]; - std::sprintf(lyrnum, "%.5d", i); - auto zfilename = project + lyrnum + ".png"; - if(!writer.is_ok()) break; - - writer.binary_entry(zfilename, - m_layers_rst[i].rawbytes.data(), - m_layers_rst[i].rawbytes.size()); - } - } - - writer.finalize(); - } catch(std::exception& e) { - BOOST_LOG_TRIVIAL(error) << e.what(); - // Rethrow the exception - throw; - } - } - - void save_layer(unsigned lyr, const std::string& path) { - unsigned i = lyr; - assert(i < m_layers_rst.size()); - - char lyrnum[6]; - std::sprintf(lyrnum, "%.5d", lyr); - std::string loc = path + "layer" + lyrnum + ".png"; - - std::fstream out(loc, std::fstream::out | std::fstream::binary); - if(out.good()) { - m_layers_rst[i].raster.save(out, Raster::Compression::PNG); - } else { - BOOST_LOG_TRIVIAL(error) << "Can't create file for layer"; - } - - out.close(); - m_layers_rst[i].raster.reset(); - } - - void set_statistics(const std::vector statistics) - { - if (statistics.size() != psCnt) - return; - - m_used_material = statistics[psUsedMaterial]; - m_cnt_fade_layers = int(statistics[psNumFade]); - m_cnt_slow_layers = int(statistics[psNumSlow]); - m_cnt_fast_layers = int(statistics[psNumFast]); - } -}; - -} - -#endif // PRINTEXPORT_HPP diff --git a/src/libslic3r/Rasterizer/bicubic.h b/src/libslic3r/Rasterizer/bicubic.h deleted file mode 100644 index 870d00dbd6..0000000000 --- a/src/libslic3r/Rasterizer/bicubic.h +++ /dev/null @@ -1,186 +0,0 @@ -#ifndef BICUBIC_HPP -#define BICUBIC_HPP - -#include -#include -#include - -#include - -namespace Slic3r { - -namespace BicubicInternal { - // Linear kernel, to be able to test cubic methods with hat kernels. - template - struct LinearKernel - { - typedef T FloatType; - - static T a00() { return T(0.); } - static T a01() { return T(0.); } - static T a02() { return T(0.); } - static T a03() { return T(0.); } - static T a10() { return T(1.); } - static T a11() { return T(-1.); } - static T a12() { return T(0.); } - static T a13() { return T(0.); } - static T a20() { return T(0.); } - static T a21() { return T(1.); } - static T a22() { return T(0.); } - static T a23() { return T(0.); } - static T a30() { return T(0.); } - static T a31() { return T(0.); } - static T a32() { return T(0.); } - static T a33() { return T(0.); } - }; - - // Interpolation kernel aka Catmul-Rom aka Keyes kernel. - template - struct CubicCatmulRomKernel - { - typedef T FloatType; - - static T a00() { return 0; } - static T a01() { return (T)-0.5; } - static T a02() { return (T) 1.; } - static T a03() { return (T)-0.5; } - static T a10() { return (T) 1.; } - static T a11() { return 0; } - static T a12() { return (T)-5./2.; } - static T a13() { return (T) 3./2.; } - static T a20() { return 0; } - static T a21() { return (T) 0.5; } - static T a22() { return (T) 2.; } - static T a23() { return (T)-3./2.; } - static T a30() { return 0; } - static T a31() { return 0; } - static T a32() { return (T)-0.5; } - static T a33() { return (T) 0.5; } - }; - - // B-spline kernel - template - struct CubicBSplineKernel - { - typedef T FloatType; - - static T a00() { return (T) 1./6.; } - static T a01() { return (T) -3./6.; } - static T a02() { return (T) 3./6.; } - static T a03() { return (T) -1./6.; } - static T a10() { return (T) 4./6.; } - static T a11() { return 0; } - static T a12() { return (T) -6./6.; } - static T a13() { return (T) 3./6.; } - static T a20() { return (T) 1./6.; } - static T a21() { return (T) 3./6.; } - static T a22() { return (T) 3./6.; } - static T a23() { return (T)- 3./6.; } - static T a30() { return 0; } - static T a31() { return 0; } - static T a32() { return 0; } - static T a33() { return (T) 1./6.; } - }; - - template - inline T clamp(T a, T lower, T upper) - { - return (a < lower) ? lower : - (a > upper) ? upper : a; - } -} - -template -struct CubicKernel -{ - typedef typename KERNEL KernelInternal; - typedef typename KERNEL::FloatType FloatType; - - static FloatType kernel(FloatType x) - { - x = fabs(x); - if (x >= (FloatType)2.) - return 0.0f; - if (x <= (FloatType)1.) { - FloatType x2 = x * x; - FloatType x3 = x2 * x; - return KERNEL::a10() + KERNEL::a11() * x + KERNEL::a12() * x2 + KERNEL::a13() * x3; - } - assert(x > (FloatType)1. && x < (FloatType)2.); - x -= (FloatType)1.; - FloatType x2 = x * x; - FloatType x3 = x2 * x; - return KERNEL::a00() + KERNEL::a01() * x + KERNEL::a02() * x2 + KERNEL::a03() * x3; - } - - static FloatType interpolate(FloatType f0, FloatType f1, FloatType f2, FloatType f3, FloatType x) - { - const FloatType x2 = x*x; - const FloatType x3 = x*x*x; - return f0*(KERNEL::a00() + KERNEL::a01() * x + KERNEL::a02() * x2 + KERNEL::a03() * x3) + - f1*(KERNEL::a10() + KERNEL::a11() * x + KERNEL::a12() * x2 + KERNEL::a13() * x3) + - f2*(KERNEL::a20() + KERNEL::a21() * x + KERNEL::a22() * x2 + KERNEL::a23() * x3) + - f3*(KERNEL::a30() + KERNEL::a31() * x + KERNEL::a32() * x2 + KERNEL::a33() * x3); - } -}; - -// Linear splines -typedef CubicKernel> LinearKernelf; -typedef CubicKernel> LinearKerneld; -// Catmul-Rom splines -typedef CubicKernel> CubicCatmulRomKernelf; -typedef CubicKernel> CubicCatmulRomKerneld; -typedef CubicKernel> CubicInterpolationKernelf; -typedef CubicKernel> CubicInterpolationKerneld; -// Cubic B-splines -typedef CubicKernel> CubicBSplineKernelf; -typedef CubicKernel> CubicBSplineKerneld; - -template -static float cubic_interpolate(const Eigen::ArrayBase &F, const typename KERNEL::FloatType pt, const typename KERNEL::FloatType dx) -{ - typedef typename KERNEL::FloatType T; - const int w = int(F.size()); - const int ix = (int)floor(pt); - const T s = pt - (T)ix; - - if (ix > 1 && ix + 2 < w) { - // Inside the fully interpolated region. - return KERNEL::interpolate(F[ix - 1], F[ix], F[ix + 1], F[ix + 2], s); - } - // Transition region. Extend with a constant function. - auto f = [&F, w](x) { return F[BicubicInternal::clamp(x, 0, w - 1)]; } - return KERNEL::interpolate(f(ix - 1), f(ix), f(ix + 1), f(ix + 2), s); -} - -template -static float bicubic_interpolate(const Eigen::MatrixBase &F, const Eigen::Matrix &pt, const typename KERNEL::FloatType dx) -{ - typedef typename KERNEL::FloatType T; - const int w = F.cols(); - const int h = F.rows(); - const int ix = (int)floor(pt[0]); - const int iy = (int)floor(pt[1]); - const T s = pt[0] - (T)ix; - const T t = pt[1] - (T)iy; - - if (ix > 1 && ix + 2 < w && iy > 1 && iy + 2 < h) { - // Inside the fully interpolated region. - return KERNEL::interpolate( - KERNEL::interpolate(F(ix-1,iy-1),F(ix ,iy-1),F(ix+1,iy-1),F(ix+2,iy-1),s), - KERNEL::interpolate(F(ix-1,iy ),F(ix ,iy ),F(ix+1,iy ),F(ix+2,iy ),s), - KERNEL::interpolate(F(ix-1,iy+1),F(ix ,iy+1),F(ix+1,iy+1),F(ix+2,iy+1),s), - KERNEL::interpolate(F(ix-1,iy+2),F(ix ,iy+2),F(ix+1,iy+2),F(ix+2,iy+2),s),t); - } - // Transition region. Extend with a constant function. - auto f = [&f, w, h](int x, int y) { return F(BicubicInternal::clamp(x,0,w-1),BicubicInternal::clamp(y,0,h-1)); } - return KERNEL::interpolate( - KERNEL::interpolate(f(ix-1,iy-1),f(ix ,iy-1),f(ix+1,iy-1),f(ix+2,iy-1),s), - KERNEL::interpolate(f(ix-1,iy ),f(ix ,iy ),f(ix+1,iy ),f(ix+2,iy ),s), - KERNEL::interpolate(f(ix-1,iy+1),f(ix ,iy+1),f(ix+1,iy+1),f(ix+2,iy+1),s), - KERNEL::interpolate(f(ix-1,iy+2),f(ix ,iy+2),f(ix+1,iy+2),f(ix+2,iy+2),s),t); -} - -} // namespace Slic3r - -#endif /* BICUBIC_HPP */ diff --git a/src/libslic3r/Rasterizer/Rasterizer.cpp b/src/libslic3r/SLA/SLARaster.cpp similarity index 77% rename from src/libslic3r/Rasterizer/Rasterizer.cpp rename to src/libslic3r/SLA/SLARaster.cpp index 6384a241f3..fba1f46f33 100644 --- a/src/libslic3r/Rasterizer/Rasterizer.cpp +++ b/src/libslic3r/SLA/SLARaster.cpp @@ -1,5 +1,8 @@ -#include "Rasterizer.hpp" -#include +#ifndef SLARASTER_CPP +#define SLARASTER_CPP + +#include "SLARaster.hpp" +#include "libslic3r/ExPolygon.hpp" #include // For rasterizing @@ -19,11 +22,13 @@ namespace Slic3r { -const Polygon& contour(const ExPolygon& p) { return p.contour; } -const ClipperLib::Path& contour(const ClipperLib::Polygon& p) { return p.Contour; } +inline const Polygon& contour(const ExPolygon& p) { return p.contour; } +inline const ClipperLib::Path& contour(const ClipperLib::Polygon& p) { return p.Contour; } -const Polygons& holes(const ExPolygon& p) { return p.holes; } -const ClipperLib::Paths& holes(const ClipperLib::Polygon& p) { return p.Holes; } +inline const Polygons& holes(const ExPolygon& p) { return p.holes; } +inline const ClipperLib::Paths& holes(const ClipperLib::Polygon& p) { return p.Holes; } + +namespace sla { class Raster::Impl { public: @@ -39,7 +44,7 @@ public: static const TPixel ColorWhite; static const TPixel ColorBlack; - using Origin = Raster::Origin; + using Format = Raster::Format; private: Raster::Resolution m_resolution; @@ -52,16 +57,20 @@ private: TRendererAA m_renderer; std::function m_gammafn; - Origin m_o; + std::array m_mirror; inline void flipy(agg::path_storage& path) const { path.flip_y(0, m_resolution.height_px); } + + inline void flipx(agg::path_storage& path) const { + path.flip_x(0, m_resolution.width_px); + } public: inline Impl(const Raster::Resolution& res, const Raster::PixelDim &pd, - Origin o, double gamma = 1.0): + const std::array& mirror, double gamma = 1.0): m_resolution(res), // m_pxdim(pd), m_pxdim_scaled(SCALING_FACTOR / pd.w_mm, SCALING_FACTOR / pd.h_mm), @@ -72,7 +81,7 @@ public: m_pixfmt(m_rbuf), m_raw_renderer(m_pixfmt), m_renderer(m_raw_renderer), - m_o(o) + m_mirror(mirror) { m_renderer.color(ColorWhite); @@ -81,6 +90,18 @@ public: clear(); } + + inline Impl(const Raster::Resolution& res, + const Raster::PixelDim &pd, + Format fmt, + double gamma = 1.0): + Impl(res, pd, {false, false}, gamma) + { + switch (fmt) { + case Format::PNG: m_mirror = {false, true}; break; + case Format::RAW: m_mirror = {false, false}; break; + } + } template void draw(const P &poly) { agg::rasterizer_scanline_aa<> ras; @@ -89,14 +110,16 @@ public: ras.gamma(m_gammafn); auto&& path = to_path(contour(poly)); - - if(m_o == Origin::TOP_LEFT) flipy(path); + + if(m_mirror[X]) flipx(path); + if(m_mirror[Y]) flipy(path); ras.add_path(path); for(auto& h : holes(poly)) { auto&& holepath = to_path(h); - if(m_o == Origin::TOP_LEFT) flipy(holepath); + if(m_mirror[X]) flipx(holepath); + if(m_mirror[Y]) flipy(holepath); ras.add_path(holepath); } @@ -110,9 +133,7 @@ public: inline TBuffer& buffer() { return m_buf; } inline const Raster::Resolution resolution() { return m_resolution; } - - inline Origin origin() const /*noexcept*/ { return m_o; } - + private: inline double getPx(const Point& p) { return p(0) * m_pxdim_scaled.w_mm; @@ -154,30 +175,23 @@ private: const Raster::Impl::TPixel Raster::Impl::ColorWhite = Raster::Impl::TPixel(255); const Raster::Impl::TPixel Raster::Impl::ColorBlack = Raster::Impl::TPixel(0); -Raster::Raster(const Resolution &r, const PixelDim &pd, Origin o, double g): - m_impl(new Impl(r, pd, o, g)) {} +Raster::Raster() = default; +Raster::~Raster() = default; +Raster::Raster(Raster &&m) = default; +Raster& Raster::operator=(Raster&&) = default; -Raster::Raster() {} - -Raster::~Raster() {} - -Raster::Raster(Raster &&m): - m_impl(std::move(m.m_impl)) {} - -void Raster::reset(const Raster::Resolution &r, const Raster::PixelDim &pd, - double g) +void Raster::reset(const Raster::Resolution &r, const Raster::PixelDim &pd, + Format fmt, double gamma) { - // Free up the unnecessary memory and make sure it stays clear after - // an exception - auto o = m_impl? m_impl->origin() : Origin::TOP_LEFT; - reset(r, pd, o, g); + m_impl.reset(); + m_impl.reset(new Impl(r, pd, fmt, gamma)); } void Raster::reset(const Raster::Resolution &r, const Raster::PixelDim &pd, - Raster::Origin o, double gamma) + const std::array& mirror, double gamma) { m_impl.reset(); - m_impl.reset(new Impl(r, pd, o, gamma)); + m_impl.reset(new Impl(r, pd, mirror, gamma)); } void Raster::reset() @@ -208,13 +222,13 @@ void Raster::draw(const ClipperLib::Polygon &poly) m_impl->draw(poly); } -void Raster::save(std::ostream& stream, Compression comp) +void Raster::save(std::ostream& stream, Format fmt) { assert(m_impl); if(!stream.good()) return; - switch(comp) { - case Compression::PNG: { + switch(fmt) { + case Format::PNG: { auto& b = m_impl->buffer(); size_t out_len = 0; void * rawdata = tdefl_write_image_to_png_file_in_memory( @@ -231,7 +245,7 @@ void Raster::save(std::ostream& stream, Compression comp) break; } - case Compression::RAW: { + case Format::RAW: { stream << "P5 " << m_impl->resolution().width_px << " " << m_impl->resolution().height_px << " " @@ -244,14 +258,14 @@ void Raster::save(std::ostream& stream, Compression comp) } } -RawBytes Raster::save(Raster::Compression comp) +RawBytes Raster::save(Format fmt) { assert(m_impl); std::vector data; size_t s = 0; - switch(comp) { - case Compression::PNG: { + switch(fmt) { + case Format::PNG: { void *rawdata = tdefl_write_image_to_png_file_in_memory( m_impl->buffer().data(), int(resolution().width_px), @@ -265,7 +279,7 @@ RawBytes Raster::save(Raster::Compression comp) MZ_FREE(rawdata); break; } - case Compression::RAW: { + case Format::RAW: { auto header = std::string("P5 ") + std::to_string(m_impl->resolution().width_px) + " " + std::to_string(m_impl->resolution().height_px) + " " + "255 "; @@ -287,3 +301,6 @@ RawBytes Raster::save(Raster::Compression comp) } } +} + +#endif // SLARASTER_CPP diff --git a/src/libslic3r/Rasterizer/Rasterizer.hpp b/src/libslic3r/SLA/SLARaster.hpp similarity index 68% rename from src/libslic3r/Rasterizer/Rasterizer.hpp rename to src/libslic3r/SLA/SLARaster.hpp index d338a5e3b8..03fb06d6c8 100644 --- a/src/libslic3r/Rasterizer/Rasterizer.hpp +++ b/src/libslic3r/SLA/SLARaster.hpp @@ -1,5 +1,5 @@ -#ifndef RASTERIZER_HPP -#define RASTERIZER_HPP +#ifndef SLARASTER_HPP +#define SLARASTER_HPP #include #include @@ -8,10 +8,12 @@ namespace ClipperLib { struct Polygon; } -namespace Slic3r { +namespace Slic3r { class ExPolygon; +namespace sla { + // Raw byte buffer paired with its size. Suitable for compressed PNG data. class RawBytes { @@ -23,19 +25,24 @@ public: size_t size() const { return m_buffer.size(); } const uint8_t * data() { return m_buffer.data(); } + + RawBytes(const RawBytes&) = delete; + RawBytes(RawBytes&&) = default; + RawBytes& operator=(const RawBytes&) = delete; + RawBytes& operator=(RawBytes&&) = default; // ///////////////////////////////////////////////////////////////////////// // FIXME: the following is needed for MSVC2013 compatibility // ///////////////////////////////////////////////////////////////////////// - RawBytes(const RawBytes&) = delete; - RawBytes(RawBytes&& mv) : m_buffer(std::move(mv.m_buffer)) {} +// RawBytes(const RawBytes&) = delete; +// RawBytes(RawBytes&& mv) : m_buffer(std::move(mv.m_buffer)) {} - RawBytes& operator=(const RawBytes&) = delete; - RawBytes& operator=(RawBytes&& mv) { - m_buffer = std::move(mv.m_buffer); - return *this; - } +// RawBytes& operator=(const RawBytes&) = delete; +// RawBytes& operator=(RawBytes&& mv) { +// m_buffer = std::move(mv.m_buffer); +// return *this; +// } // ///////////////////////////////////////////////////////////////////////// }; @@ -54,23 +61,11 @@ class Raster { public: /// Supported compression types - enum class Compression { + enum class Format { RAW, //!> Uncompressed pixel data PNG //!> PNG compression }; - /// The Rasterizer expects the input polygons to have their coordinate - /// system origin in the bottom left corner. If the raster is then - /// configured with the TOP_LEFT origin parameter (in the constructor) than - /// it will flip the Y axis in output to maintain the correct orientation. - /// This is the default case with PNG images. They have the origin in the - /// top left corner. Without the flipping, the image would be upside down - /// with the scaled (clipper) coordinate system of the input polygons. - enum class Origin { - TOP_LEFT, - BOTTOM_LEFT - }; - /// Type that represents a resolution in pixels. struct Resolution { unsigned width_px; @@ -93,19 +88,21 @@ public: }; /// Constructor taking the resolution and the pixel dimension. - Raster(const Resolution& r, const PixelDim& pd, - Origin o = Origin::BOTTOM_LEFT, double gamma = 1.0); + template Raster(Args...args) { + reset(std::forward(args)...); + } Raster(); Raster(const Raster& cpy) = delete; Raster& operator=(const Raster& cpy) = delete; Raster(Raster&& m); + Raster& operator=(Raster&&); ~Raster(); /// Reallocated everything for the given resolution and pixel dimension. - void reset(const Resolution& r, const PixelDim& pd, double gamma = 1.0); - void reset(const Resolution& r, const PixelDim& pd, Origin o, double gamma); - + void reset(const Resolution&, const PixelDim&, const std::array& mirror, double gamma = 1.0); + void reset(const Resolution& r, const PixelDim& pd, Format o, double gamma = 1.0); + /** * Release the allocated resources. Drawing in this state ends in * unspecified behavior. @@ -123,10 +120,13 @@ public: void draw(const ClipperLib::Polygon& poly); /// Save the raster on the specified stream. - void save(std::ostream& stream, Compression comp = Compression::RAW); + void save(std::ostream& stream, Format = Format::PNG); - RawBytes save(Compression comp = Compression::RAW); + /// Save into a continuous byte stream which is returned. + RawBytes save(Format fmt = Format::PNG); }; -} -#endif // RASTERIZER_HPP +} // sla +} // Slic3r + +#endif // SLARASTER_HPP diff --git a/src/libslic3r/SLA/SLARasterWriter.cpp b/src/libslic3r/SLA/SLARasterWriter.cpp new file mode 100644 index 0000000000..b2fe0c72c3 --- /dev/null +++ b/src/libslic3r/SLA/SLARasterWriter.cpp @@ -0,0 +1,136 @@ +#include "SLARasterWriter.hpp" +#include "libslic3r/Zipper.hpp" +#include "ExPolygon.hpp" +#include + +#include +#include + +namespace Slic3r { namespace sla { + +std::string SLARasterWriter::createIniContent(const std::string& projectname) const +{ + auto expt_str = std::to_string(m_exp_time_s); + auto expt_first_str = std::to_string(m_exp_time_first_s); + auto layerh_str = std::to_string(m_layer_height); + + const std::string cnt_fade_layers = std::to_string(m_cnt_fade_layers); + const std::string cnt_slow_layers = std::to_string(m_cnt_slow_layers); + const std::string cnt_fast_layers = std::to_string(m_cnt_fast_layers); + const std::string used_material = std::to_string(m_used_material); + + return std::string( + "action = print\n" + "jobDir = ") + projectname + "\n" + + "expTime = " + expt_str + "\n" + "expTimeFirst = " + expt_first_str + "\n" + "numFade = " + cnt_fade_layers + "\n" + "layerHeight = " + layerh_str + "\n" + "usedMaterial = " + used_material + "\n" + "numSlow = " + cnt_slow_layers + "\n" + "numFast = " + cnt_fast_layers + "\n"; +} + +void SLARasterWriter::flpXY(ClipperLib::Polygon &poly) +{ + for(auto& p : poly.Contour) std::swap(p.X, p.Y); + std::reverse(poly.Contour.begin(), poly.Contour.end()); + + for(auto& h : poly.Holes) { + for(auto& p : h) std::swap(p.X, p.Y); + std::reverse(h.begin(), h.end()); + } +} + +void SLARasterWriter::flpXY(ExPolygon &poly) +{ + for(auto& p : poly.contour.points) p = {p.y(), p.x()}; + std::reverse(poly.contour.points.begin(), poly.contour.points.end()); + + for(auto& h : poly.holes) { + for(auto& p : h.points) p = {p.y(), p.x()}; + std::reverse(h.points.begin(), h.points.end()); + } +} + +SLARasterWriter::SLARasterWriter(const SLAPrinterConfig &cfg, + const SLAMaterialConfig &mcfg, + double layer_height) +{ + double w = cfg.display_width.getFloat(); + double h = cfg.display_height.getFloat(); + auto pw = unsigned(cfg.display_pixels_x.getInt()); + auto ph = unsigned(cfg.display_pixels_y.getInt()); + + m_mirror[X] = cfg.display_mirror_x.getBool(); + + // PNG raster will implicitly do an Y mirror + m_mirror[Y] = ! cfg.display_mirror_y.getBool(); + + auto ro = cfg.display_orientation.getInt(); + + if(ro == roPortrait) { + std::swap(w, h); + std::swap(pw, ph); + m_o = roPortrait; + + // XY flipping implicitly does an X mirror + m_mirror[X] = ! m_mirror[X]; + } else m_o = roLandscape; + + m_res = Raster::Resolution(pw, ph); + m_pxdim = Raster::PixelDim(w/pw, h/ph); + m_exp_time_s = mcfg.exposure_time.getFloat(); + m_exp_time_first_s = mcfg.initial_exposure_time.getFloat(); + m_layer_height = layer_height; + + m_gamma = cfg.gamma_correction.getFloat(); +} + +void SLARasterWriter::save(const std::string &fpath, const std::string &prjname) +{ + try { + Zipper zipper(fpath); // zipper with no compression + + std::string project = prjname.empty()? + boost::filesystem::path(fpath).stem().string() : prjname; + + zipper.add_entry("config.ini"); + + zipper << createIniContent(project); + + for(unsigned i = 0; i < m_layers_rst.size(); i++) + { + if(m_layers_rst[i].rawbytes.size() > 0) { + char lyrnum[6]; + std::sprintf(lyrnum, "%.5d", i); + auto zfilename = project + lyrnum + ".png"; + + // Add binary entry to the zipper + zipper.add_entry(zfilename, + m_layers_rst[i].rawbytes.data(), + m_layers_rst[i].rawbytes.size()); + } + } + + zipper.finalize(); + } catch(std::exception& e) { + BOOST_LOG_TRIVIAL(error) << e.what(); + // Rethrow the exception + throw; + } +} + +void SLARasterWriter::set_statistics(const std::vector statistics) +{ + if (statistics.size() != psCnt) + return; + + m_used_material = statistics[psUsedMaterial]; + m_cnt_fade_layers = int(statistics[psNumFade]); + m_cnt_slow_layers = int(statistics[psNumSlow]); + m_cnt_fast_layers = int(statistics[psNumFast]); +} + +} // namespace sla +} // namespace Slic3r diff --git a/src/libslic3r/SLA/SLARasterWriter.hpp b/src/libslic3r/SLA/SLARasterWriter.hpp new file mode 100644 index 0000000000..9fc23840ea --- /dev/null +++ b/src/libslic3r/SLA/SLARasterWriter.hpp @@ -0,0 +1,139 @@ +#ifndef SLARASTERWRITER_HPP +#define SLARASTERWRITER_HPP + +// For png export of the sliced model +#include +#include +#include + +#include "libslic3r/PrintConfig.hpp" + +#include "SLARaster.hpp" + +namespace Slic3r { namespace sla { + +// Implementation for PNG raster output +// Be aware that if a large number of layers are allocated, it can very well +// exhaust the available memory especially on 32 bit platform. +// This class is designed to be used in parallel mode. Layers have an ID and +// each layer can be written and compressed independently (in parallel). +// At the end when all layers where written, the save method can be used to +// write out the result into a zipped archive. +class SLARasterWriter +{ +public: + enum RasterOrientation { + roLandscape, + roPortrait + }; + + // Used for addressing parameters of set_statistics() + enum ePrintStatistics + { + psUsedMaterial = 0, + psNumFade, + psNumSlow, + psNumFast, + + psCnt + }; + +private: + + // A struct to bind the raster image data and its compressed bytes together. + struct Layer { + Raster raster; + RawBytes rawbytes; + + Layer() = default; + Layer(const Layer&) = delete; // The image is big, do not copy by accident + Layer& operator=(const Layer&) = delete; + + Layer(Layer&& m) = default; + Layer& operator=(Layer&&) = default; + }; + + // We will save the compressed PNG data into RawBytes type buffers in + // parallel. Later we can write every layer to the disk sequentially. + std::vector m_layers_rst; + Raster::Resolution m_res; + Raster::PixelDim m_pxdim; + double m_exp_time_s = .0, m_exp_time_first_s = .0; + double m_layer_height = .0; + RasterOrientation m_o = roPortrait; + std::array m_mirror; + + double m_gamma; + + double m_used_material = 0.0; + int m_cnt_fade_layers = 0; + int m_cnt_slow_layers = 0; + int m_cnt_fast_layers = 0; + + std::string createIniContent(const std::string& projectname) const; + + static void flpXY(ClipperLib::Polygon& poly); + static void flpXY(ExPolygon& poly); + +public: + + SLARasterWriter(const SLAPrinterConfig& cfg, + const SLAMaterialConfig& mcfg, + double layer_height); + + SLARasterWriter(const SLARasterWriter& ) = delete; + SLARasterWriter& operator=(const SLARasterWriter&) = delete; + SLARasterWriter(SLARasterWriter&& m) = default; + SLARasterWriter& operator=(SLARasterWriter&&) = default; +// SLARasterWriter(SLARasterWriter&& m) = default; +// SLARasterWriter(SLARasterWriter&& m): +// m_layers_rst(std::move(m.m_layers_rst)), +// m_res(m.m_res), +// m_pxdim(m.m_pxdim) {} + + inline void layers(unsigned cnt) { if(cnt > 0) m_layers_rst.resize(cnt); } + inline unsigned layers() const { return unsigned(m_layers_rst.size()); } + + template void draw_polygon(const Poly& p, unsigned lyr) { + assert(lyr < m_layers_rst.size()); + if(m_o == roPortrait) { + Poly poly(p); flpXY(poly); + m_layers_rst[lyr].raster.draw(poly); + } + else m_layers_rst[lyr].raster.draw(p); + } + + inline void begin_layer(unsigned lyr) { + if(m_layers_rst.size() <= lyr) m_layers_rst.resize(lyr+1); + m_layers_rst[lyr].raster.reset(m_res, m_pxdim, m_mirror, m_gamma); + } + + inline void begin_layer() { + m_layers_rst.emplace_back(); + m_layers_rst.front().raster.reset(m_res, m_pxdim, m_mirror, m_gamma); + } + + inline void finish_layer(unsigned lyr_id) { + assert(lyr_id < m_layers_rst.size()); + m_layers_rst[lyr_id].rawbytes = + m_layers_rst[lyr_id].raster.save(Raster::Format::PNG); + m_layers_rst[lyr_id].raster.reset(); + } + + inline void finish_layer() { + if(!m_layers_rst.empty()) { + m_layers_rst.back().rawbytes = + m_layers_rst.back().raster.save(Raster::Format::PNG); + m_layers_rst.back().raster.reset(); + } + } + + void save(const std::string& fpath, const std::string& prjname = ""); + + void set_statistics(const std::vector statistics); +}; + +} // namespace sla +} // namespace Slic3r + +#endif // SLARASTERWRITER_HPP diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 6d2318bea2..fba9748225 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1281,37 +1281,11 @@ void SLAPrint::process() auto rasterize = [this, max_objstatus]() { if(canceled()) return; - // collect all the keys - - // If the raster has vertical orientation, we will flip the coordinates - bool flpXY = m_printer_config.display_orientation.getInt() == - SLADisplayOrientation::sladoPortrait; - { // create a raster printer for the current print parameters - // I don't know any better -// auto& ocfg = m_objects.front()->m_config; -// auto& matcfg = m_material_config; -// auto& printcfg = m_printer_config; - -// double w = printcfg.display_width.getFloat(); -// double h = printcfg.display_height.getFloat(); -// auto pw = unsigned(printcfg.display_pixels_x.getInt()); -// auto ph = unsigned(printcfg.display_pixels_y.getInt()); -// double lh = ocfg.layer_height.getFloat(); -// double exp_t = matcfg.exposure_time.getFloat(); -// double iexp_t = matcfg.initial_exposure_time.getFloat(); - -// double gamma = m_printer_config.gamma_correction.getFloat(); - -// if(flpXY) { std::swap(w, h); std::swap(pw, ph); } - -// m_printer.reset( -// new SLAPrinter(w, h, pw, ph, lh, exp_t, iexp_t, -// flpXY? SLAPrinter::RO_PORTRAIT : -// SLAPrinter::RO_LANDSCAPE, -// gamma)); - - m_printer.reset(new SLAPrinter(m_printer_config, m_material_config, m_default_object_config.layer_height.getFloat())); + double layerh = m_default_object_config.layer_height.getFloat(); + m_printer.reset(new SLAPrinter(m_printer_config, + m_material_config, + layerh)); } // Allocate space for all the layers diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index dea468e7a0..1ad40ef154 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -3,11 +3,11 @@ #include #include "PrintBase.hpp" -#include "PrintExport.hpp" +//#include "PrintExport.hpp" +#include "SLA/SLARasterWriter.hpp" #include "Point.hpp" #include "MTUtils.hpp" #include -#include "Zipper.hpp" namespace Slic3r { @@ -322,37 +322,6 @@ struct SLAPrintStatistics } }; -// The implementation of creating zipped archives with wxWidgets -template<> class LayerWriter { - Zipper m_zip; -public: - - LayerWriter(const std::string& zipfile_path): m_zip(zipfile_path) {} - - void next_entry(const std::string& fname) { m_zip.add_entry(fname); } - - void binary_entry(const std::string& fname, - const std::uint8_t* buf, - size_t l) - { - m_zip.add_entry(fname, buf, l); - } - - template inline LayerWriter& operator<<(T&& arg) { - m_zip << std::forward(arg); return *this; - } - - bool is_ok() const { - return true; // m_zip blows up if something goes wrong... - } - - // After finalize, no writing to the archive will have an effect. The only - // valid operation is to dispose the object calling the destructor which - // should close the file. This method can throw and signal potential errors - // when flushing the archive. This is why its present. - void finalize() { m_zip.finalize(); } -}; - /** * @brief This class is the high level FSM for the SLA printing process. * @@ -385,11 +354,10 @@ public: // Returns true if the last step was finished with success. bool finished() const override { return this->is_step_done(slaposSliceSupports) && this->Inherited::is_step_done(slapsRasterize); } - template inline void export_raster(const std::string& fpath, - const std::string& projectname = "") + const std::string& projectname = "") { - if(m_printer) m_printer->save(fpath, projectname); + if(m_printer) m_printer->save(fpath, projectname); } const PrintObjects& objects() const { return m_objects; } @@ -450,7 +418,7 @@ public: const std::vector& print_layers() const { return m_printer_input; } private: - using SLAPrinter = FilePrinter; + using SLAPrinter = sla::SLARasterWriter; using SLAPrinterPtr = std::unique_ptr; // Implement same logic as in SLAPrintObject From 38d54d779a1b5ca2d7bd992ec5920d6963f94420 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Sat, 18 May 2019 23:21:59 +0200 Subject: [PATCH 05/22] Mirror checkboxes added to the UI. Everything seems to work fine. --- src/libslic3r/PrintConfig.cpp | 14 ++++++++------ src/libslic3r/SLA/SLARaster.cpp | 14 ++++++++++++++ src/libslic3r/SLA/SLARaster.hpp | 23 +++++++++++++++++++---- src/libslic3r/SLAPrint.cpp | 2 ++ src/slic3r/GUI/Preset.cpp | 1 + src/slic3r/GUI/Tab.cpp | 4 ++++ 6 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index d000c2c2c5..89e21934a1 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2259,15 +2259,17 @@ void PrintConfigDef::init_sla_params() def->set_default_value(new ConfigOptionInt(1440)); def = this->add("display_mirror_x", coBool); - def->full_label = L("Display mirroring in X axis"); - def->label = L("Mirror X"); - def->tooltip = L("Enable mirroring of output images in the X axis"); + def->full_label = L("Display horizontal mirroring"); + def->label = L("Mirror horizontally"); + def->tooltip = L("Enable horizontal mirroring of output images"); + def->mode = comExpert; def->set_default_value(new ConfigOptionBool(true)); def = this->add("display_mirror_y", coBool); - def->full_label = L("Display mirroring in Y axis"); - def->label = L("Mirror Y"); - def->tooltip = L("Enable mirroring of output images in the Y axis"); + def->full_label = L("Display vertical mirroring"); + def->label = L("Mirror vertically"); + def->tooltip = L("Enable vertical mirroring of output images"); + def->mode = comExpert; def->set_default_value(new ConfigOptionBool(false)); def = this->add("display_orientation", coEnum); diff --git a/src/libslic3r/SLA/SLARaster.cpp b/src/libslic3r/SLA/SLARaster.cpp index fba1f46f33..f1b1c8c42b 100644 --- a/src/libslic3r/SLA/SLARaster.cpp +++ b/src/libslic3r/SLA/SLARaster.cpp @@ -58,6 +58,7 @@ private: std::function m_gammafn; std::array m_mirror; + Format m_fmt = Format::PNG; inline void flipy(agg::path_storage& path) const { path.flip_y(0, m_resolution.height_px); @@ -101,6 +102,7 @@ public: case Format::PNG: m_mirror = {false, true}; break; case Format::RAW: m_mirror = {false, false}; break; } + m_fmt = fmt; } template void draw(const P &poly) { @@ -131,6 +133,8 @@ public: } inline TBuffer& buffer() { return m_buf; } + + inline Format format() const { return m_fmt; } inline const Raster::Resolution resolution() { return m_resolution; } @@ -258,6 +262,11 @@ void Raster::save(std::ostream& stream, Format fmt) } } +void Raster::save(std::ostream &stream) +{ + save(stream, m_impl->format()); +} + RawBytes Raster::save(Format fmt) { assert(m_impl); @@ -300,6 +309,11 @@ RawBytes Raster::save(Format fmt) return {std::move(data)}; } +RawBytes Raster::save() +{ + return save(m_impl->format()); +} + } } diff --git a/src/libslic3r/SLA/SLARaster.hpp b/src/libslic3r/SLA/SLARaster.hpp index 03fb06d6c8..5051498c58 100644 --- a/src/libslic3r/SLA/SLARaster.hpp +++ b/src/libslic3r/SLA/SLARaster.hpp @@ -100,8 +100,17 @@ public: ~Raster(); /// Reallocated everything for the given resolution and pixel dimension. - void reset(const Resolution&, const PixelDim&, const std::array& mirror, double gamma = 1.0); - void reset(const Resolution& r, const PixelDim& pd, Format o, double gamma = 1.0); + /// The third parameter is either the X, Y mirroring or a supported format + /// for which the correct mirroring will be configured. + void reset(const Resolution&, + const PixelDim&, + const std::array& mirror, + double gamma = 1.0); + + void reset(const Resolution& r, + const PixelDim& pd, + Format o, + double gamma = 1.0); /** * Release the allocated resources. Drawing in this state ends in @@ -119,11 +128,17 @@ public: void draw(const ExPolygon& poly); void draw(const ClipperLib::Polygon& poly); + // Saving the raster: + // It is possible to override the format given in the constructor but + // be aware that the mirroring will not be modified. + /// Save the raster on the specified stream. - void save(std::ostream& stream, Format = Format::PNG); + void save(std::ostream& stream, Format); + void save(std::ostream& stream); /// Save into a continuous byte stream which is returned. - RawBytes save(Format fmt = Format::PNG); + RawBytes save(Format fmt); + RawBytes save(); }; } // sla diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index fba9748225..13df2fa792 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1461,6 +1461,8 @@ bool SLAPrint::invalidate_state_by_config_options(const std::vector& Preset::sla_printer_options() "printer_technology", "bed_shape", "max_print_height", "display_width", "display_height", "display_pixels_x", "display_pixels_y", + "display_mirror_x", "display_mirror_y", "display_orientation", "fast_tilt_time", "slow_tilt_time", "area_fill", "relative_correction", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index b6bdb7a4bb..8fa34e37aa 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2056,6 +2056,10 @@ void TabPrinter::build_sla() line.append_option(optgroup->get_option("display_pixels_y")); optgroup->append_line(line); optgroup->append_single_option_line("display_orientation"); + + // FIXME: This should be on one line in the UI + optgroup->append_single_option_line("display_mirror_x"); + optgroup->append_single_option_line("display_mirror_y"); optgroup = page->new_optgroup(_(L("Tilt"))); line = { _(L("Tilt time")), "" }; From 4e2ef09a506409697cc5f1f9340e2bf04343ede7 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 20 May 2019 11:19:43 +0200 Subject: [PATCH 06/22] Fixing build on Win and OSX --- src/libslic3r/SLA/SLARaster.cpp | 15 +++++++-- src/libslic3r/SLA/SLARaster.hpp | 23 ++++++++------ src/libslic3r/SLA/SLARasterWriter.cpp | 4 +-- src/libslic3r/SLA/SLARasterWriter.hpp | 46 +++++++++++++++++++++------ src/libslic3r/SLAPrint.cpp | 2 +- 5 files changed, 65 insertions(+), 25 deletions(-) diff --git a/src/libslic3r/SLA/SLARaster.cpp b/src/libslic3r/SLA/SLARaster.cpp index f1b1c8c42b..20891c3d4c 100644 --- a/src/libslic3r/SLA/SLARaster.cpp +++ b/src/libslic3r/SLA/SLARaster.cpp @@ -1,6 +1,8 @@ #ifndef SLARASTER_CPP #define SLARASTER_CPP +#include + #include "SLARaster.hpp" #include "libslic3r/ExPolygon.hpp" #include @@ -179,10 +181,17 @@ private: const Raster::Impl::TPixel Raster::Impl::ColorWhite = Raster::Impl::TPixel(255); const Raster::Impl::TPixel Raster::Impl::ColorBlack = Raster::Impl::TPixel(0); -Raster::Raster() = default; +template<> Raster::Raster() { reset(); }; Raster::~Raster() = default; -Raster::Raster(Raster &&m) = default; -Raster& Raster::operator=(Raster&&) = default; + +// Raster::Raster(Raster &&m) = default; +// Raster& Raster::operator=(Raster&&) = default; + +// FIXME: remove after migrating to higher version of windows compiler +Raster::Raster(Raster &&m): m_impl(std::move(m.m_impl)) {} +Raster& Raster::operator=(Raster &&m) { + m_impl = std::move(m.m_impl); return *this; +} void Raster::reset(const Raster::Resolution &r, const Raster::PixelDim &pd, Format fmt, double gamma) diff --git a/src/libslic3r/SLA/SLARaster.hpp b/src/libslic3r/SLA/SLARaster.hpp index 5051498c58..d3bd52d92c 100644 --- a/src/libslic3r/SLA/SLARaster.hpp +++ b/src/libslic3r/SLA/SLARaster.hpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include namespace ClipperLib { struct Polygon; } @@ -27,22 +29,20 @@ public: const uint8_t * data() { return m_buffer.data(); } RawBytes(const RawBytes&) = delete; - RawBytes(RawBytes&&) = default; RawBytes& operator=(const RawBytes&) = delete; - RawBytes& operator=(RawBytes&&) = default; // ///////////////////////////////////////////////////////////////////////// // FIXME: the following is needed for MSVC2013 compatibility // ///////////////////////////////////////////////////////////////////////// -// RawBytes(const RawBytes&) = delete; -// RawBytes(RawBytes&& mv) : m_buffer(std::move(mv.m_buffer)) {} + // RawBytes(RawBytes&&) = default; + // RawBytes& operator=(RawBytes&&) = default; -// RawBytes& operator=(const RawBytes&) = delete; -// RawBytes& operator=(RawBytes&& mv) { -// m_buffer = std::move(mv.m_buffer); -// return *this; -// } + RawBytes(RawBytes&& mv) : m_buffer(std::move(mv.m_buffer)) {} + RawBytes& operator=(RawBytes&& mv) { + m_buffer = std::move(mv.m_buffer); + return *this; + } // ///////////////////////////////////////////////////////////////////////// }; @@ -92,7 +92,6 @@ public: reset(std::forward(args)...); } - Raster(); Raster(const Raster& cpy) = delete; Raster& operator=(const Raster& cpy) = delete; Raster(Raster&& m); @@ -141,6 +140,10 @@ public: RawBytes save(); }; +// This prevents the duplicate default constructor warning on MSVC2013 +template<> Raster::Raster(); + + } // sla } // Slic3r diff --git a/src/libslic3r/SLA/SLARasterWriter.cpp b/src/libslic3r/SLA/SLARasterWriter.cpp index b2fe0c72c3..f7c3925ac7 100644 --- a/src/libslic3r/SLA/SLARasterWriter.cpp +++ b/src/libslic3r/SLA/SLARasterWriter.cpp @@ -44,11 +44,11 @@ void SLARasterWriter::flpXY(ClipperLib::Polygon &poly) void SLARasterWriter::flpXY(ExPolygon &poly) { - for(auto& p : poly.contour.points) p = {p.y(), p.x()}; + for(auto& p : poly.contour.points) p = Point(p.y(), p.x()); std::reverse(poly.contour.points.begin(), poly.contour.points.end()); for(auto& h : poly.holes) { - for(auto& p : h.points) p = {p.y(), p.x()}; + for(auto& p : h.points) p = Point(p.y(), p.x()); std::reverse(h.points.begin(), h.points.end()); } } diff --git a/src/libslic3r/SLA/SLARasterWriter.hpp b/src/libslic3r/SLA/SLARasterWriter.hpp index 9fc23840ea..7133d2ddec 100644 --- a/src/libslic3r/SLA/SLARasterWriter.hpp +++ b/src/libslic3r/SLA/SLARasterWriter.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "libslic3r/PrintConfig.hpp" @@ -49,8 +50,18 @@ private: Layer(const Layer&) = delete; // The image is big, do not copy by accident Layer& operator=(const Layer&) = delete; - Layer(Layer&& m) = default; - Layer& operator=(Layer&&) = default; + // ///////////////////////////////////////////////////////////////////// + // FIXME: the following is needed for MSVC2013 compatibility + // ///////////////////////////////////////////////////////////////////// + + // Layer(Layer&& m) = default; + // Layer& operator=(Layer&&) = default; + Layer(Layer &&m): + raster(std::move(m.raster)), rawbytes(std::move(m.rawbytes)) {} + Layer& operator=(Layer &&m) { + raster = std::move(m.raster); rawbytes = std::move(m.rawbytes); + return *this; + } }; // We will save the compressed PNG data into RawBytes type buffers in @@ -83,13 +94,30 @@ public: SLARasterWriter(const SLARasterWriter& ) = delete; SLARasterWriter& operator=(const SLARasterWriter&) = delete; - SLARasterWriter(SLARasterWriter&& m) = default; - SLARasterWriter& operator=(SLARasterWriter&&) = default; -// SLARasterWriter(SLARasterWriter&& m) = default; -// SLARasterWriter(SLARasterWriter&& m): -// m_layers_rst(std::move(m.m_layers_rst)), -// m_res(m.m_res), -// m_pxdim(m.m_pxdim) {} + + // ///////////////////////////////////////////////////////////////////////// + // FIXME: the following is needed for MSVC2013 compatibility + // ///////////////////////////////////////////////////////////////////////// + + // SLARasterWriter(SLARasterWriter&& m) = default; + // SLARasterWriter& operator=(SLARasterWriter&&) = default; + SLARasterWriter(SLARasterWriter&& m): + m_layers_rst(std::move(m.m_layers_rst)), + m_res(m.m_res), + m_pxdim(m.m_pxdim), + m_exp_time_s(m.m_exp_time_s), + m_exp_time_first_s(m.m_exp_time_first_s), + m_layer_height(m.m_layer_height), + m_o(m.m_o), + m_mirror(std::move(m.m_mirror)), + m_gamma(m.m_gamma), + m_used_material(m.m_used_material), + m_cnt_fade_layers(m.m_cnt_fade_layers), + m_cnt_slow_layers(m.m_cnt_slow_layers), + m_cnt_fast_layers(m.m_cnt_fast_layers) + {} + + // ///////////////////////////////////////////////////////////////////////// inline void layers(unsigned cnt) { if(cnt > 0) m_layers_rst.resize(cnt); } inline unsigned layers() const { return unsigned(m_layers_rst.size()); } diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 13df2fa792..d07eba2b87 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -742,7 +742,7 @@ void SLAPrint::process() // We apply the printer correction offset here. if(clpr_offs != 0) po.m_model_slices[id] = - offset_ex(po.m_model_slices[id], clpr_offs); + offset_ex(po.m_model_slices[id], float(clpr_offs)); mit->set_model_slice_idx(po, id); ++mit; } From 12797f2aa8a3d663b2c07a98d2194603140daade Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 5 Jun 2019 15:50:27 +0200 Subject: [PATCH 07/22] Re-adding missing file --- src/libslic3r/SLA/bicubic.h | 186 ++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 src/libslic3r/SLA/bicubic.h diff --git a/src/libslic3r/SLA/bicubic.h b/src/libslic3r/SLA/bicubic.h new file mode 100644 index 0000000000..870d00dbd6 --- /dev/null +++ b/src/libslic3r/SLA/bicubic.h @@ -0,0 +1,186 @@ +#ifndef BICUBIC_HPP +#define BICUBIC_HPP + +#include +#include +#include + +#include + +namespace Slic3r { + +namespace BicubicInternal { + // Linear kernel, to be able to test cubic methods with hat kernels. + template + struct LinearKernel + { + typedef T FloatType; + + static T a00() { return T(0.); } + static T a01() { return T(0.); } + static T a02() { return T(0.); } + static T a03() { return T(0.); } + static T a10() { return T(1.); } + static T a11() { return T(-1.); } + static T a12() { return T(0.); } + static T a13() { return T(0.); } + static T a20() { return T(0.); } + static T a21() { return T(1.); } + static T a22() { return T(0.); } + static T a23() { return T(0.); } + static T a30() { return T(0.); } + static T a31() { return T(0.); } + static T a32() { return T(0.); } + static T a33() { return T(0.); } + }; + + // Interpolation kernel aka Catmul-Rom aka Keyes kernel. + template + struct CubicCatmulRomKernel + { + typedef T FloatType; + + static T a00() { return 0; } + static T a01() { return (T)-0.5; } + static T a02() { return (T) 1.; } + static T a03() { return (T)-0.5; } + static T a10() { return (T) 1.; } + static T a11() { return 0; } + static T a12() { return (T)-5./2.; } + static T a13() { return (T) 3./2.; } + static T a20() { return 0; } + static T a21() { return (T) 0.5; } + static T a22() { return (T) 2.; } + static T a23() { return (T)-3./2.; } + static T a30() { return 0; } + static T a31() { return 0; } + static T a32() { return (T)-0.5; } + static T a33() { return (T) 0.5; } + }; + + // B-spline kernel + template + struct CubicBSplineKernel + { + typedef T FloatType; + + static T a00() { return (T) 1./6.; } + static T a01() { return (T) -3./6.; } + static T a02() { return (T) 3./6.; } + static T a03() { return (T) -1./6.; } + static T a10() { return (T) 4./6.; } + static T a11() { return 0; } + static T a12() { return (T) -6./6.; } + static T a13() { return (T) 3./6.; } + static T a20() { return (T) 1./6.; } + static T a21() { return (T) 3./6.; } + static T a22() { return (T) 3./6.; } + static T a23() { return (T)- 3./6.; } + static T a30() { return 0; } + static T a31() { return 0; } + static T a32() { return 0; } + static T a33() { return (T) 1./6.; } + }; + + template + inline T clamp(T a, T lower, T upper) + { + return (a < lower) ? lower : + (a > upper) ? upper : a; + } +} + +template +struct CubicKernel +{ + typedef typename KERNEL KernelInternal; + typedef typename KERNEL::FloatType FloatType; + + static FloatType kernel(FloatType x) + { + x = fabs(x); + if (x >= (FloatType)2.) + return 0.0f; + if (x <= (FloatType)1.) { + FloatType x2 = x * x; + FloatType x3 = x2 * x; + return KERNEL::a10() + KERNEL::a11() * x + KERNEL::a12() * x2 + KERNEL::a13() * x3; + } + assert(x > (FloatType)1. && x < (FloatType)2.); + x -= (FloatType)1.; + FloatType x2 = x * x; + FloatType x3 = x2 * x; + return KERNEL::a00() + KERNEL::a01() * x + KERNEL::a02() * x2 + KERNEL::a03() * x3; + } + + static FloatType interpolate(FloatType f0, FloatType f1, FloatType f2, FloatType f3, FloatType x) + { + const FloatType x2 = x*x; + const FloatType x3 = x*x*x; + return f0*(KERNEL::a00() + KERNEL::a01() * x + KERNEL::a02() * x2 + KERNEL::a03() * x3) + + f1*(KERNEL::a10() + KERNEL::a11() * x + KERNEL::a12() * x2 + KERNEL::a13() * x3) + + f2*(KERNEL::a20() + KERNEL::a21() * x + KERNEL::a22() * x2 + KERNEL::a23() * x3) + + f3*(KERNEL::a30() + KERNEL::a31() * x + KERNEL::a32() * x2 + KERNEL::a33() * x3); + } +}; + +// Linear splines +typedef CubicKernel> LinearKernelf; +typedef CubicKernel> LinearKerneld; +// Catmul-Rom splines +typedef CubicKernel> CubicCatmulRomKernelf; +typedef CubicKernel> CubicCatmulRomKerneld; +typedef CubicKernel> CubicInterpolationKernelf; +typedef CubicKernel> CubicInterpolationKerneld; +// Cubic B-splines +typedef CubicKernel> CubicBSplineKernelf; +typedef CubicKernel> CubicBSplineKerneld; + +template +static float cubic_interpolate(const Eigen::ArrayBase &F, const typename KERNEL::FloatType pt, const typename KERNEL::FloatType dx) +{ + typedef typename KERNEL::FloatType T; + const int w = int(F.size()); + const int ix = (int)floor(pt); + const T s = pt - (T)ix; + + if (ix > 1 && ix + 2 < w) { + // Inside the fully interpolated region. + return KERNEL::interpolate(F[ix - 1], F[ix], F[ix + 1], F[ix + 2], s); + } + // Transition region. Extend with a constant function. + auto f = [&F, w](x) { return F[BicubicInternal::clamp(x, 0, w - 1)]; } + return KERNEL::interpolate(f(ix - 1), f(ix), f(ix + 1), f(ix + 2), s); +} + +template +static float bicubic_interpolate(const Eigen::MatrixBase &F, const Eigen::Matrix &pt, const typename KERNEL::FloatType dx) +{ + typedef typename KERNEL::FloatType T; + const int w = F.cols(); + const int h = F.rows(); + const int ix = (int)floor(pt[0]); + const int iy = (int)floor(pt[1]); + const T s = pt[0] - (T)ix; + const T t = pt[1] - (T)iy; + + if (ix > 1 && ix + 2 < w && iy > 1 && iy + 2 < h) { + // Inside the fully interpolated region. + return KERNEL::interpolate( + KERNEL::interpolate(F(ix-1,iy-1),F(ix ,iy-1),F(ix+1,iy-1),F(ix+2,iy-1),s), + KERNEL::interpolate(F(ix-1,iy ),F(ix ,iy ),F(ix+1,iy ),F(ix+2,iy ),s), + KERNEL::interpolate(F(ix-1,iy+1),F(ix ,iy+1),F(ix+1,iy+1),F(ix+2,iy+1),s), + KERNEL::interpolate(F(ix-1,iy+2),F(ix ,iy+2),F(ix+1,iy+2),F(ix+2,iy+2),s),t); + } + // Transition region. Extend with a constant function. + auto f = [&f, w, h](int x, int y) { return F(BicubicInternal::clamp(x,0,w-1),BicubicInternal::clamp(y,0,h-1)); } + return KERNEL::interpolate( + KERNEL::interpolate(f(ix-1,iy-1),f(ix ,iy-1),f(ix+1,iy-1),f(ix+2,iy-1),s), + KERNEL::interpolate(f(ix-1,iy ),f(ix ,iy ),f(ix+1,iy ),f(ix+2,iy ),s), + KERNEL::interpolate(f(ix-1,iy+1),f(ix ,iy+1),f(ix+1,iy+1),f(ix+2,iy+1),s), + KERNEL::interpolate(f(ix-1,iy+2),f(ix ,iy+2),f(ix+1,iy+2),f(ix+2,iy+2),s),t); +} + +} // namespace Slic3r + +#endif /* BICUBIC_HPP */ From d4fe7b5a962b0aff416e8b8929535034fe9ba69b Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 6 Jun 2019 14:27:07 +0200 Subject: [PATCH 08/22] Adding rotating calipers algorithm for minimum are bounding box rotation. Cleanup, fix build on windows and add test for rotcalipers. Try to fix compilation on windows With updates from libnest2d Another build fix. Clean up and add comments. adding rotcalipers test and some cleanup Trying to fix on OSX Fix rotcalipers array indexing Get rid of boost convex hull. Adding helper function 'remove_collinear_points' Importing new libnest2d upgrades. Disable using __int128 in NFP on OSX --- src/libnest2d/CMakeLists.txt | 16 +- src/libnest2d/include/libnest2d.h | 125 ++--- .../libnest2d/backends/clipper/CMakeLists.txt | 13 +- .../backends/clipper/clipper_polygon.hpp | 8 +- .../libnest2d/backends/clipper/geometries.hpp | 117 +--- src/libnest2d/include/libnest2d/common.hpp | 28 + .../include/libnest2d/geometry_traits.hpp | 408 ++++++++++---- .../include/libnest2d/geometry_traits_nfp.hpp | 527 +++--------------- src/libnest2d/include/libnest2d/libnest2d.hpp | 15 +- src/libnest2d/include/libnest2d/optimizer.hpp | 4 +- .../libnest2d/optimizers/nlopt/CMakeLists.txt | 6 +- .../optimizers/optimlib/CMakeLists.txt | 5 - .../libnest2d/placers/bottomleftplacer.hpp | 8 +- .../include/libnest2d/placers/nfpplacer.hpp | 13 +- .../include/libnest2d/utils/boost_alg.hpp | 37 +- .../include/libnest2d/utils/rotcalipers.hpp | 268 +++++++++ src/libnest2d/src/libnest2d.cpp | 23 + src/libnest2d/tests/CMakeLists.txt | 9 +- src/libnest2d/tests/test.cpp | 205 ++++++- src/libslic3r/CMakeLists.txt | 2 + src/libslic3r/Int128.hpp | 6 + src/libslic3r/MinAreaBoundingBox.cpp | 142 +++++ src/libslic3r/MinAreaBoundingBox.hpp | 59 ++ src/libslic3r/ModelArrange.cpp | 31 +- src/slic3r/GUI/Plater.cpp | 53 +- 25 files changed, 1272 insertions(+), 856 deletions(-) delete mode 100644 src/libnest2d/include/libnest2d/optimizers/optimlib/CMakeLists.txt create mode 100644 src/libnest2d/include/libnest2d/utils/rotcalipers.hpp create mode 100644 src/libnest2d/src/libnest2d.cpp create mode 100644 src/libslic3r/MinAreaBoundingBox.cpp create mode 100644 src/libslic3r/MinAreaBoundingBox.hpp diff --git a/src/libnest2d/CMakeLists.txt b/src/libnest2d/CMakeLists.txt index 2508c984a7..d50c78b171 100644 --- a/src/libnest2d/CMakeLists.txt +++ b/src/libnest2d/CMakeLists.txt @@ -48,6 +48,9 @@ set(LIBNEST2D_SRCFILES ${SRC_DIR}/libnest2d/optimizer.hpp ${SRC_DIR}/libnest2d/utils/metaloop.hpp ${SRC_DIR}/libnest2d/utils/rotfinder.hpp + ${SRC_DIR}/libnest2d/utils/rotcalipers.hpp + ${SRC_DIR}/libnest2d/utils/bigint.hpp + ${SRC_DIR}/libnest2d/utils/rational.hpp ${SRC_DIR}/libnest2d/placers/placer_boilerplate.hpp ${SRC_DIR}/libnest2d/placers/bottomleftplacer.hpp ${SRC_DIR}/libnest2d/placers/nfpplacer.hpp @@ -70,12 +73,10 @@ if(TBB_FOUND) # The Intel TBB library will use the std::exception_ptr feature of C++11. target_compile_definitions(libnest2d INTERFACE -DTBB_USE_CAPTURED_EXCEPTION=0) - target_link_libraries(libnest2d INTERFACE tbb) - # The following breaks compilation on Visual Studio in Debug mode. - #find_package(Threads REQUIRED) - #target_link_libraries(libnest2d INTERFACE ${TBB_LIBRARIES} ${CMAKE_DL_LIBS} - # Threads::Threads - # ) + find_package(Threads REQUIRED) + target_link_libraries(libnest2d INTERFACE ${TBB_LIBRARIES} ${CMAKE_DL_LIBS} + Threads::Threads + ) else() find_package(OpenMP QUIET) @@ -92,10 +93,11 @@ endif() add_subdirectory(${SRC_DIR}/libnest2d/backends/${LIBNEST2D_GEOMETRIES}) target_link_libraries(libnest2d INTERFACE ${LIBNEST2D_GEOMETRIES}Backend) + add_subdirectory(${SRC_DIR}/libnest2d/optimizers/${LIBNEST2D_OPTIMIZER}) target_link_libraries(libnest2d INTERFACE ${LIBNEST2D_OPTIMIZER}Optimizer) -#target_sources(libnest2d INTERFACE ${LIBNEST2D_SRCFILES}) +# target_sources(libnest2d INTERFACE ${LIBNEST2D_SRCFILES}) target_include_directories(libnest2d INTERFACE ${SRC_DIR}) if(NOT LIBNEST2D_HEADER_ONLY) diff --git a/src/libnest2d/include/libnest2d.h b/src/libnest2d/include/libnest2d.h index 4ad7524219..a6eb36a4b0 100644 --- a/src/libnest2d/include/libnest2d.h +++ b/src/libnest2d/include/libnest2d.h @@ -47,6 +47,17 @@ using NfpPlacer = _NfpPlacer; // This supports only box shaped bins using BottomLeftPlacer = placers::_BottomLeftPlacer; +#ifdef LIBNEST2D_STATIC + +extern template class Nester; +extern template class Nester; +extern template PackGroup Nester::execute( + std::vector::iterator, std::vector::iterator); +extern template PackGroup Nester::execute( + std::vector::iterator, std::vector::iterator); + +#endif + template::iterator> @@ -60,19 +71,6 @@ PackGroup nest(Iterator from, Iterator to, return nester.execute(from, to); } -template> -PackGroup nest(Container&& cont, - const typename Placer::BinType& bin, - Coord dist = 0, - const typename Placer::Config& pconf = {}, - const typename Selector::Config& sconf = {}) -{ - return nest(cont.begin(), cont.end(), - bin, dist, pconf, sconf); -} - template::iterator> @@ -90,6 +88,42 @@ PackGroup nest(Iterator from, Iterator to, return nester.execute(from, to); } +#ifdef LIBNEST2D_STATIC + +extern template class Nester; +extern template class Nester; + +extern template PackGroup nest(std::vector::iterator from, + std::vector::iterator to, + const Box& bin, + Coord dist = 0, + const NfpPlacer::Config& pconf, + const FirstFitSelection::Config& sconf); + +extern template PackGroup nest(std::vector::iterator from, + std::vector::iterator to, + const Box& bin, + ProgressFunction prg, + StopCondition scond, + Coord dist = 0, + const NfpPlacer::Config& pconf, + const FirstFitSelection::Config& sconf); + +#endif + +template> +PackGroup nest(Container&& cont, + const typename Placer::BinType& bin, + Coord dist = 0, + const typename Placer::Config& pconf = {}, + const typename Selector::Config& sconf = {}) +{ + return nest(cont.begin(), cont.end(), + bin, dist, pconf, sconf); +} + template> @@ -105,71 +139,6 @@ PackGroup nest(Container&& cont, bin, prg, scond, dist, pconf, sconf); } -#ifdef LIBNEST2D_STATIC -extern template -PackGroup nest&>( - std::vector& cont, - const Box& bin, - Coord dist, - const NfpPlacer::Config& pcfg, - const FirstFitSelection::Config& scfg -); - -extern template -PackGroup nest&>( - std::vector& cont, - const Box& bin, - ProgressFunction prg, - StopCondition scond, - Coord dist, - const NfpPlacer::Config& pcfg, - const FirstFitSelection::Config& scfg -); - -extern template -PackGroup nest>( - std::vector&& cont, - const Box& bin, - Coord dist, - const NfpPlacer::Config& pcfg, - const FirstFitSelection::Config& scfg -); - -extern template -PackGroup nest>( - std::vector&& cont, - const Box& bin, - ProgressFunction prg, - StopCondition scond, - Coord dist, - const NfpPlacer::Config& pcfg, - const FirstFitSelection::Config& scfg -); - -extern template -PackGroup nest::iterator>( - std::vector::iterator from, - std::vector::iterator to, - const Box& bin, - Coord dist, - const NfpPlacer::Config& pcfg, - const FirstFitSelection::Config& scfg -); - -extern template -PackGroup nest::iterator>( - std::vector::iterator from, - std::vector::iterator to, - const Box& bin, - ProgressFunction prg, - StopCondition scond, - Coord dist, - const NfpPlacer::Config& pcfg, - const FirstFitSelection::Config& scfg -); - -#endif - } #endif // LIBNEST2D_H diff --git a/src/libnest2d/include/libnest2d/backends/clipper/CMakeLists.txt b/src/libnest2d/include/libnest2d/backends/clipper/CMakeLists.txt index e20cbc70da..e207ecde4f 100644 --- a/src/libnest2d/include/libnest2d/backends/clipper/CMakeLists.txt +++ b/src/libnest2d/include/libnest2d/backends/clipper/CMakeLists.txt @@ -33,19 +33,18 @@ if(NOT TARGET clipper) # If there is a clipper target in the parent project we a # ${clipper_library_BINARY_DIR} # ) - add_library(ClipperBackend STATIC + add_library(clipperBackend STATIC ${clipper_library_SOURCE_DIR}/clipper.cpp ${clipper_library_SOURCE_DIR}/clipper.hpp) - target_include_directories(ClipperBackend INTERFACE - ${clipper_library_SOURCE_DIR}) + target_include_directories(clipperBackend INTERFACE ${clipper_library_SOURCE_DIR}) else() message(FATAL_ERROR "Can't find clipper library and no SVN client found to download. You can download the clipper sources and define a clipper target in your project, that will work for libnest2d.") endif() else() - add_library(ClipperBackend INTERFACE) - target_link_libraries(ClipperBackend INTERFACE Clipper::Clipper) + add_library(clipperBackend INTERFACE) + target_link_libraries(clipperBackend INTERFACE Clipper::Clipper) endif() else() # set(CLIPPER_INCLUDE_DIRS "" PARENT_SCOPE) @@ -69,6 +68,6 @@ target_include_directories(clipperBackend SYSTEM INTERFACE ${Boost_INCLUDE_DIRS} target_compile_definitions(clipperBackend INTERFACE LIBNEST2D_BACKEND_CLIPPER) -# And finally plug the ClipperBackend into libnest2d -#target_link_libraries(libnest2d INTERFACE ClipperBackend) +# And finally plug the clipperBackend into libnest2d +# target_link_libraries(libnest2d INTERFACE clipperBackend) diff --git a/src/libnest2d/include/libnest2d/backends/clipper/clipper_polygon.hpp b/src/libnest2d/include/libnest2d/backends/clipper/clipper_polygon.hpp index e9fbfbd18a..6511fbb72a 100644 --- a/src/libnest2d/include/libnest2d/backends/clipper/clipper_polygon.hpp +++ b/src/libnest2d/include/libnest2d/backends/clipper/clipper_polygon.hpp @@ -12,13 +12,13 @@ struct Polygon { inline Polygon() = default; inline explicit Polygon(const Path& cont): Contour(cont) {} - inline explicit Polygon(const Paths& holes): - Holes(holes) {} +// inline explicit Polygon(const Paths& holes): +// Holes(holes) {} inline Polygon(const Path& cont, const Paths& holes): Contour(cont), Holes(holes) {} inline explicit Polygon(Path&& cont): Contour(std::move(cont)) {} - inline explicit Polygon(Paths&& holes): Holes(std::move(holes)) {} +// inline explicit Polygon(Paths&& holes): Holes(std::move(holes)) {} inline Polygon(Path&& cont, Paths&& holes): Contour(std::move(cont)), Holes(std::move(holes)) {} }; @@ -42,7 +42,7 @@ inline IntPoint& operator -=(IntPoint& p, const IntPoint& pa ) { return p; } -inline IntPoint operator -(IntPoint& p ) { +inline IntPoint operator -(const IntPoint& p ) { IntPoint ret = p; ret.X = -ret.X; ret.Y = -ret.Y; diff --git a/src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp b/src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp index 232668f610..e9fad405b6 100644 --- a/src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp +++ b/src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp @@ -20,43 +20,23 @@ using PathImpl = ClipperLib::Path; using HoleStore = ClipperLib::Paths; using PolygonImpl = ClipperLib::Polygon; -// Type of coordinate units used by Clipper -template<> struct CoordType { - using Type = ClipperLib::cInt; -}; - -// Type of point used by Clipper -template<> struct PointType { - using Type = PointImpl; -}; - -template<> struct PointType { - using Type = PointImpl; -}; - -template<> struct PointType { - using Type = PointImpl; -}; - -template<> struct CountourType { - using Type = PathImpl; -}; - template<> struct ShapeTag { using Type = PolygonTag; }; -template<> struct ShapeTag { using Type = PathTag; }; -template<> struct ShapeTag { using Type = PointTag; }; +template<> struct ShapeTag { using Type = PathTag; }; +template<> struct ShapeTag { using Type = PointTag; }; -template<> struct ShapeTag> { - using Type = MultiPolygonTag; -}; +// Type of coordinate units used by Clipper. Enough to specialize for point, +// the rest of the types will work (Path, Polygon) +template<> struct CoordType { using Type = ClipperLib::cInt; }; -template<> struct PointType> { - using Type = PointImpl; -}; +// Enough to specialize for path, it will work for multishape and Polygon +template<> struct PointType { using Type = PointImpl; }; -template<> struct HolesContainer { - using Type = ClipperLib::Paths; -}; +// This is crucial. CountourType refers to itself by default, so we don't have +// to secialize for clipper Path. ContourType::Type is PathImpl. +template<> struct ContourType { using Type = PathImpl; }; + +// The holes are contained in Clipper::Paths +template<> struct HolesContainer { using Type = ClipperLib::Paths; }; namespace pointlike { @@ -86,39 +66,11 @@ template<> inline TCoord& y(PointImpl& p) } +// Using the libnest2d default area implementation #define DISABLE_BOOST_AREA -namespace _smartarea { - -template -inline double area(const PolygonImpl& /*sh*/) { - return std::nan(""); -} - -template<> -inline double area(const PolygonImpl& sh) { - return std::accumulate(sh.Holes.begin(), sh.Holes.end(), - ClipperLib::Area(sh.Contour), - [](double a, const ClipperLib::Path& pt){ - return a + ClipperLib::Area(pt); - }); -} - -template<> -inline double area(const PolygonImpl& sh) { - return -area(sh); -} - -} - namespace shapelike { -// Tell libnest2d how to make string out of a ClipperPolygon object -template<> inline double area(const PolygonImpl& sh, const PolygonTag&) -{ - return _smartarea::area::Value>(sh); -} - template<> inline void offset(PolygonImpl& sh, TCoord distance) { #define DISABLE_BOOST_OFFSET @@ -200,43 +152,16 @@ inline PolygonImpl create(const PathImpl& path, const HoleStore& holes) { PolygonImpl p; p.Contour = path; - - // Expecting that the coordinate system Y axis is positive in upwards - // direction - if(ClipperLib::Orientation(p.Contour)) { - // Not clockwise then reverse the b*tch - ClipperLib::ReversePath(p.Contour); - } - p.Holes = holes; - for(auto& h : p.Holes) { - if(!ClipperLib::Orientation(h)) { - ClipperLib::ReversePath(h); - } - } - + return p; } template<> inline PolygonImpl create( PathImpl&& path, HoleStore&& holes) { PolygonImpl p; p.Contour.swap(path); - - // Expecting that the coordinate system Y axis is positive in upwards - // direction - if(ClipperLib::Orientation(p.Contour)) { - // Not clockwise then reverse the b*tch - ClipperLib::ReversePath(p.Contour); - } - p.Holes.swap(holes); - - for(auto& h : p.Holes) { - if(!ClipperLib::Orientation(h)) { - ClipperLib::ReversePath(h); - } - } - + return p; } @@ -314,13 +239,13 @@ inline void rotate(PolygonImpl& sh, const Radians& rads) } // namespace shapelike #define DISABLE_BOOST_NFP_MERGE -inline std::vector clipper_execute( +inline TMultiShape clipper_execute( ClipperLib::Clipper& clipper, ClipperLib::ClipType clipType, ClipperLib::PolyFillType subjFillType = ClipperLib::pftEvenOdd, ClipperLib::PolyFillType clipFillType = ClipperLib::pftEvenOdd) { - shapelike::Shapes retv; + TMultiShape retv; ClipperLib::PolyTree result; clipper.Execute(clipType, result, subjFillType, clipFillType); @@ -370,8 +295,8 @@ inline std::vector clipper_execute( namespace nfp { -template<> inline std::vector -merge(const std::vector& shapes) +template<> inline TMultiShape +merge(const TMultiShape& shapes) { ClipperLib::Clipper clipper(ClipperLib::ioReverseSolution); @@ -394,6 +319,8 @@ merge(const std::vector& shapes) } +#define DISABLE_BOOST_CONVEX_HULL + //#define DISABLE_BOOST_SERIALIZE //#define DISABLE_BOOST_UNSERIALIZE diff --git a/src/libnest2d/include/libnest2d/common.hpp b/src/libnest2d/include/libnest2d/common.hpp index 6867f76f3e..66e095ae27 100644 --- a/src/libnest2d/include/libnest2d/common.hpp +++ b/src/libnest2d/include/libnest2d/common.hpp @@ -9,6 +9,7 @@ #include #include #include +#include #if defined(_MSC_VER) && _MSC_VER <= 1800 || __cplusplus < 201103L #define BP2D_NOEXCEPT @@ -197,6 +198,33 @@ public: } }; +struct ScalarTag {}; +struct BigIntTag {}; +struct RationalTag {}; + +template struct _NumTag { + using Type = + enable_if_t::value, ScalarTag>; +}; + +template using NumTag = typename _NumTag>::Type; + +/// A local version for abs that is garanteed to work with libnest2d types +template inline T abs(const T& v, ScalarTag) +{ + return std::abs(v); +} + +template inline T abs(const T& v) { return abs(v, NumTag()); } + +template inline T2 cast(const T1& v, ScalarTag, ScalarTag) +{ + return static_cast(v); +} + +template inline T2 cast(const T1& v) { + return cast(v, NumTag(), NumTag()); +} } #endif // LIBNEST2D_CONFIG_HPP diff --git a/src/libnest2d/include/libnest2d/geometry_traits.hpp b/src/libnest2d/include/libnest2d/geometry_traits.hpp index 917f5280d1..6c55d0e3f2 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits.hpp @@ -7,45 +7,125 @@ #include #include #include -#include #include #include +#include -#include "common.hpp" +#include namespace libnest2d { +// Meta tags for different geometry concepts. +struct PointTag {}; +struct PolygonTag {}; +struct PathTag {}; +struct MultiPolygonTag {}; +struct BoxTag {}; +struct CircleTag {}; + +/// Meta-function to derive the tag of a shape type. +template struct ShapeTag { using Type = typename Shape::Tag; }; + +/// Tag will be used instead of `typename ShapeTag::Type` +template using Tag = typename ShapeTag>::Type; + +/// Meta function to derive the contour type for a polygon which could be itself +template struct ContourType { using Type = RawShape; }; + +/// TContour instead of `typename ContourType::type` +template +using TContour = typename ContourType>::Type; + +/// Getting the type of point structure used by a shape. +template struct PointType { + using Type = typename PointType>::Type; +}; + +/// TPoint as shorthand for `typename PointType::Type`. +template +using TPoint = typename PointType>::Type; + /// Getting the coordinate data type for a geometry class. -template struct CoordType { using Type = long; }; +template struct CoordType { + using Type = typename CoordType>::Type; +}; /// TCoord as shorthand for typename `CoordType::Type`. template using TCoord = typename CoordType>::Type; -/// Getting the type of point structure used by a shape. -template struct PointType { using Type = typename Sh::PointType; }; +/// Getting the computation type for a certain geometry type. +/// It is the coordinate type by default but it is advised that a type with +/// larger precision and (or) range is specified. +template::value> struct ComputeType {}; -/// TPoint as shorthand for `typename PointType::Type`. -template -using TPoint = typename PointType>::Type; +/// A compute type is introduced to hold the results of computations on +/// coordinates and points. It should be larger in range than the coordinate +/// type or the range of coordinates should be limited to not loose precision. +template struct ComputeType { + using Type = typename ComputeType>::Type; +}; +/// libnest2d will choose a default compute type for various coordinate types +/// if the backend has not specified anything. +template struct DoublePrecision { using Type = T; }; +template<> struct DoublePrecision { using Type = int16_t; }; +template<> struct DoublePrecision { using Type = int32_t; }; +template<> struct DoublePrecision { using Type = int64_t; }; +template<> struct DoublePrecision { using Type = double; }; +template<> struct DoublePrecision { using Type = long double; }; +template struct ComputeType { + using Type = typename DoublePrecision::Type; +}; -template struct CountourType { using Type = RawShape; }; - -template -using TContour = typename CountourType>::Type; - +/// TCompute shorthand for `typename ComputeType::Type` +template using TCompute = typename ComputeType>::Type; +/// A meta function to derive a container type for holes in a polygon template struct HolesContainer { using Type = std::vector>; }; +/// Shorthand for `typename HolesContainer::Type` template using THolesContainer = typename HolesContainer>::Type; +/* + * TContour, TPoint, TCoord and TCompute should be usable for any type for which + * it makes sense. For example, the point type could be derived from the contour, + * the polygon and (or) the multishape as well. The coordinate type also and + * including the point type. TCoord, TCoord, TCoord are + * all valid types and derives the coordinate type of template argument Polygon, + * Path and Point. This is also true for TCompute, but it can also take the + * coordinate type as argument. + */ -template -struct LastPointIsFirst { static const bool Value = true; }; +/* + * A Multi shape concept is also introduced. A multi shape is something that + * can contain the result of an operation where the input is one polygon and + * the result could be many polygons or path -> paths. The MultiShape should be + * a container type. If the backend does not specialize the MultiShape template, + * a default multi shape container will be used. + */ + +/// The default multi shape container. +template struct DefaultMultiShape: public std::vector { + using Tag = MultiPolygonTag; + template DefaultMultiShape(Args&&...args): + std::vector(std::forward(args)...) {} +}; + +/// The MultiShape Type trait which gets the container type for a geometry type. +template struct MultiShape { using Type = DefaultMultiShape; }; + +/// use TMultiShape instead of `typename MultiShape::Type` +template +using TMultiShape = typename MultiShape>::Type; + +// A specialization of ContourType to work with the default multishape type +template struct ContourType> { + using Type = typename ContourType::Type; +}; enum class Orientation { CLOCKWISE, @@ -59,6 +139,11 @@ struct OrientationType { static const Orientation Value = Orientation::CLOCKWISE; }; +template inline /*constexpr*/ bool is_clockwise() { + return OrientationType>::Value == Orientation::CLOCKWISE; +} + + /** * \brief A point pair base class for other point pairs (segment, box, ...). * \tparam RawPoint The actual point type to use. @@ -69,21 +154,6 @@ struct PointPair { RawPoint p2; }; -struct PointTag {}; -struct PolygonTag {}; -struct PathTag {}; -struct MultiPolygonTag {}; -struct BoxTag {}; -struct CircleTag {}; - -/// Meta-functions to derive the tags -template struct ShapeTag { using Type = typename Shape::Tag; }; -template using Tag = typename ShapeTag>::Type; - -template struct MultiShape { using Type = std::vector; }; -template -using TMultiShape =typename MultiShape>::Type; - /** * \brief An abstraction of a box; */ @@ -114,11 +184,16 @@ public: inline RawPoint center() const BP2D_NOEXCEPT; - inline double area() const BP2D_NOEXCEPT { - return double(width()*height()); + template> + inline Unit area() const BP2D_NOEXCEPT { + return Unit(width())*height(); } }; +template struct PointType<_Box> { + using Type = typename _Box::PointType; +}; + template class _Circle { RawPoint center_; @@ -129,7 +204,6 @@ public: using PointType = RawPoint; _Circle() = default; - _Circle(const RawPoint& center, double r): center_(center), radius_(r) {} inline const RawPoint& center() const BP2D_NOEXCEPT { return center_; } @@ -137,12 +211,16 @@ public: inline double radius() const BP2D_NOEXCEPT { return radius_; } inline void radius(double r) { radius_ = r; } - + inline double area() const BP2D_NOEXCEPT { - return 2.0*Pi*radius_*radius_; + return Pi_2 * radius_ * radius_; } }; +template struct PointType<_Circle> { + using Type = typename _Circle::PointType; +}; + /** * \brief An abstraction of a directed line segment with two points. */ @@ -185,7 +263,12 @@ public: inline Radians angleToXaxis() const; /// The length of the segment in the measure of the coordinate system. - inline double length(); + template> inline Unit sqlength() const; + +}; + +template struct PointType<_Segment> { + using Type = typename _Circle::PointType; }; // This struct serves almost as a namespace. The only difference is that is can @@ -216,33 +299,56 @@ inline TCoord& y(RawPoint& p) return p.y(); } -template -inline double distance(const RawPoint& /*p1*/, const RawPoint& /*p2*/) +template> +inline Unit squaredDistance(const RawPoint& p1, const RawPoint& p2) { - static_assert(always_false::value, - "PointLike::distance(point, point) unimplemented!"); - return 0; + auto x1 = Unit(x(p1)), y1 = Unit(y(p1)), x2 = Unit(x(p2)), y2 = Unit(y(p2)); + Unit a = (x2 - x1), b = (y2 - y1); + return a * a + b * b; } template -inline double distance(const RawPoint& /*p1*/, - const _Segment& /*s*/) +inline double distance(const RawPoint& p1, const RawPoint& p2) { - static_assert(always_false::value, - "PointLike::distance(point, segment) unimplemented!"); - return 0; + return std::sqrt(squaredDistance(p1, p2)); } -template -inline std::pair, bool> horizontalDistance( +// create perpendicular vector +template inline Pt perp(const Pt& p) +{ + return Pt(y(p), -x(p)); +} + +template> +inline Unit dotperp(const Pt& a, const Pt& b) +{ + return Unit(x(a)) * Unit(y(b)) - Unit(y(a)) * Unit(x(b)); +} + +// dot product +template> +inline Unit dot(const Pt& a, const Pt& b) +{ + return Unit(x(a)) * x(b) + Unit(y(a)) * y(b); +} + +// squared vector magnitude +template> +inline Unit magnsq(const Pt& p) +{ + return Unit(x(p)) * x(p) + Unit(y(p)) * y(p); +} + +template> +inline std::pair horizontalDistance( const RawPoint& p, const _Segment& s) { - using Unit = TCoord; - auto x = pointlike::x(p), y = pointlike::y(p); - auto x1 = pointlike::x(s.first()), y1 = pointlike::y(s.first()); - auto x2 = pointlike::x(s.second()), y2 = pointlike::y(s.second()); + namespace pl = pointlike; + auto x = Unit(pl::x(p)), y = Unit(pl::y(p)); + auto x1 = Unit(pl::x(s.first())), y1 = Unit(pl::y(s.first())); + auto x2 = Unit(pl::x(s.second())), y2 = Unit(pl::y(s.second())); - TCoord ret; + Unit ret; if( (y < y1 && y < y2) || (y > y1 && y > y2) ) return {0, false}; @@ -250,8 +356,7 @@ inline std::pair, bool> horizontalDistance( ret = std::min( x-x1, x -x2); else if( (y == y1 && y == y2) && (x < x1 && x < x2)) ret = -std::min(x1 - x, x2 - x); - else if(std::abs(y - y1) <= std::numeric_limits::epsilon() && - std::abs(y - y2) <= std::numeric_limits::epsilon()) + else if(y == y1 && y == y2) ret = 0; else ret = x - x1 + (x1 - x2)*(y1 - y)/(y1 - y2); @@ -259,16 +364,16 @@ inline std::pair, bool> horizontalDistance( return {ret, true}; } -template -inline std::pair, bool> verticalDistance( +template> +inline std::pair verticalDistance( const RawPoint& p, const _Segment& s) { - using Unit = TCoord; - auto x = pointlike::x(p), y = pointlike::y(p); - auto x1 = pointlike::x(s.first()), y1 = pointlike::y(s.first()); - auto x2 = pointlike::x(s.second()), y2 = pointlike::y(s.second()); + namespace pl = pointlike; + auto x = Unit(pl::x(p)), y = Unit(pl::y(p)); + auto x1 = Unit(pl::x(s.first())), y1 = Unit(pl::y(s.first())); + auto x2 = Unit(pl::x(s.second())), y2 = Unit(pl::y(s.second())); - TCoord ret; + Unit ret; if( (x < x1 && x < x2) || (x > x1 && x > x2) ) return {0, false}; @@ -276,8 +381,7 @@ inline std::pair, bool> verticalDistance( ret = std::min( y-y1, y -y2); else if( (x == x1 && x == x2) && (y < y1 && y < y2)) ret = -std::min(y1 - y, y2 - y); - else if(std::abs(x - x1) <= std::numeric_limits::epsilon() && - std::abs(x - x2) <= std::numeric_limits::epsilon()) + else if(x == x1 && x == x2) ret = 0; else ret = y - y1 + (y1 - y2)*(x1 - x)/(x1 - x2); @@ -333,9 +437,10 @@ inline Radians _Segment::angleToXaxis() const } template -inline double _Segment::length() +template +inline Unit _Segment::sqlength() const { - return pointlike::distance(first(), second()); + return pointlike::squaredDistance(first(), second()); } template @@ -346,8 +451,8 @@ inline RawPoint _Box::center() const BP2D_NOEXCEPT { using Coord = TCoord; RawPoint ret = { // No rounding here, we dont know if these are int coords - static_cast( (getX(minc) + getX(maxc))/2.0 ), - static_cast( (getY(minc) + getY(maxc))/2.0 ) + Coord( (getX(minc) + getX(maxc)) / Coord(2) ), + Coord( (getY(minc) + getY(maxc)) / Coord(2) ) }; return ret; @@ -362,9 +467,6 @@ enum class Formats { // used in friend declarations and can be aliased at class scope. namespace shapelike { -template -using Shapes = TMultiShape; - template inline RawShape create(const TContour& contour, const THolesContainer& holes) @@ -449,7 +551,7 @@ inline void reserve(RawPath& p, size_t vertex_capacity, const PathTag&) template inline void addVertex(RawShape& sh, const PathTag&, Args...args) { - return sh.emplace_back(std::forward(args)...); + sh.emplace_back(std::forward(args)...); } template @@ -504,13 +606,8 @@ inline void unserialize(RawShape& /*sh*/, const std::string& /*str*/) "shapelike::unserialize() unimplemented!"); } -template -inline double area(const RawShape& /*sh*/, const PolygonTag&) -{ - static_assert(always_false::value, - "shapelike::area() unimplemented!"); - return 0; -} +template +inline Unit area(const Cntr& poly, const PathTag& ); template inline bool intersects(const RawShape& /*sh*/, const RawShape& /*sh*/) @@ -556,14 +653,14 @@ inline bool touches( const TPoint& /*point*/, template inline _Box> boundingBox(const RawShape& /*sh*/, - const PolygonTag&) + const PathTag&) { static_assert(always_false::value, "shapelike::boundingBox(shape) unimplemented!"); } template -inline _Box> +inline _Box> boundingBox(const RawShapes& /*sh*/, const MultiPolygonTag&) { static_assert(always_false::value, @@ -571,21 +668,10 @@ boundingBox(const RawShapes& /*sh*/, const MultiPolygonTag&) } template -inline RawShape convexHull(const RawShape& /*sh*/, const PolygonTag&) -{ - static_assert(always_false::value, - "shapelike::convexHull(shape) unimplemented!"); - return RawShape(); -} +inline RawShape convexHull(const RawShape& sh, const PathTag&); -template -inline typename RawShapes::value_type -convexHull(const RawShapes& /*sh*/, const MultiPolygonTag&) -{ - static_assert(always_false::value, - "shapelike::convexHull(shapes) unimplemented!"); - return typename RawShapes::value_type(); -} +template +inline S convexHull(const RawShapes& sh, const MultiPolygonTag&); template inline void rotate(RawShape& /*sh*/, const Radians& /*rads*/) @@ -745,13 +831,19 @@ inline void reserve(T& sh, size_t vertex_capacity) { template inline void addVertex(RawShape& sh, const PolygonTag&, Args...args) { - return addVertex(contour(sh), PathTag(), std::forward(args)...); + addVertex(contour(sh), PathTag(), std::forward(args)...); } template // Tag dispatcher inline void addVertex(RawShape& sh, Args...args) { - return addVertex(sh, Tag(), std::forward(args)...); + addVertex(sh, Tag(), std::forward(args)...); +} + +template +inline _Box> boundingBox(const RawShape& poly, const PolygonTag&) +{ + return boundingBox(contour(poly), PathTag()); } template @@ -786,7 +878,7 @@ inline _Box> boundingBox(const S& sh) template inline double area(const Box& box, const BoxTag& ) { - return box.area(); + return box.template area(); } template @@ -795,6 +887,35 @@ inline double area(const Circle& circ, const CircleTag& ) return circ.area(); } +template +inline Unit area(const Cntr& poly, const PathTag& ) +{ + namespace sl = shapelike; + if (sl::cend(poly) - sl::cbegin(poly) < 3) return 0.0; + + Unit a = 0; + for (auto i = sl::cbegin(poly), j = std::prev(sl::cend(poly)); + i < sl::cend(poly); ++i) + { + auto xj = Unit(getX(*j)), yj = Unit(getY(*j)); + auto xi = Unit(getX(*i)), yi = Unit(getY(*i)); + a += (xj + xi) * (yj - yi); + j = i; + } + a /= 2; + return is_clockwise() ? a : -a; +} + +template inline double area(const S& poly, const PolygonTag& ) +{ + auto hls = holes(poly); + return std::accumulate(hls.begin(), hls.end(), + area(contour(poly), PathTag()), + [](double a, const TContour &h){ + return a + area(h, PathTag()); + }); +} + template // Dispatching function inline double area(const RawShape& sh) { @@ -811,6 +932,12 @@ inline double area(const RawShapes& shapes, const MultiPolygonTag&) }); } +template +inline RawShape convexHull(const RawShape& sh, const PolygonTag&) +{ + return create(convexHull(contour(sh), PathTag())); +} + template inline auto convexHull(const RawShape& sh) -> decltype(convexHull(sh, Tag())) // TODO: C++14 could deduce @@ -818,11 +945,91 @@ inline auto convexHull(const RawShape& sh) return convexHull(sh, Tag()); } +template +inline RawShape convexHull(const RawShape& sh, const PathTag&) +{ + using Unit = TCompute; + using Point = TPoint; + namespace sl = shapelike; + + size_t edges = sl::cend(sh) - sl::cbegin(sh); + if(edges <= 3) return {}; + + bool closed = false; + std::vector U, L; + U.reserve(1 + edges / 2); L.reserve(1 + edges / 2); + + std::vector pts; pts.reserve(edges); + std::copy(sl::cbegin(sh), sl::cend(sh), std::back_inserter(pts)); + + auto fpt = pts.front(), lpt = pts.back(); + if(getX(fpt) == getX(lpt) && getY(fpt) == getY(lpt)) { + closed = true; pts.pop_back(); + } + + std::sort(pts.begin(), pts.end(), + [](const Point& v1, const Point& v2) + { + Unit x1 = getX(v1), x2 = getX(v2), y1 = getY(v1), y2 = getY(v2); + return x1 == x2 ? y1 < y2 : x1 < x2; + }); + + auto dir = [](const Point& p, const Point& q, const Point& r) { + return (Unit(getY(q)) - getY(p)) * (Unit(getX(r)) - getX(p)) - + (Unit(getX(q)) - getX(p)) * (Unit(getY(r)) - getY(p)); + }; + + auto ik = pts.begin(); + + while(ik != pts.end()) { + + while(U.size() > 1 && dir(U[U.size() - 2], U.back(), *ik) <= 0) + U.pop_back(); + while(L.size() > 1 && dir(L[L.size() - 2], L.back(), *ik) >= 0) + L.pop_back(); + + U.emplace_back(*ik); + L.emplace_back(*ik); + + ++ik; + } + + RawShape ret; reserve(ret, U.size() + L.size()); + if(is_clockwise()) { + for(auto it = U.begin(); it != std::prev(U.end()); ++it) + addVertex(ret, *it); + for(auto it = L.rbegin(); it != std::prev(L.rend()); ++it) + addVertex(ret, *it); + if(closed) addVertex(ret, *std::prev(L.rend())); + } else { + for(auto it = L.begin(); it != std::prev(L.end()); ++it) + addVertex(ret, *it); + for(auto it = U.rbegin(); it != std::prev(U.rend()); ++it) + addVertex(ret, *it); + if(closed) addVertex(ret, *std::prev(U.rend())); + } + + return ret; +} + +template +inline S convexHull(const RawShapes& sh, const MultiPolygonTag&) +{ + namespace sl = shapelike; + S cntr; + for(auto& poly : sh) + for(auto it = sl::cbegin(poly); it != sl::cend(poly); ++it) + addVertex(cntr, *it); + + return convexHull(cntr, Tag()); +} + template inline bool isInside(const TP& point, const TC& circ, const PointTag&, const CircleTag&) { - return pointlike::distance(point, circ.center()) < circ.radius(); + auto r = circ.radius(); + return pointlike::squaredDistance(point, circ.center()) < r * r; } template @@ -972,6 +1179,9 @@ template inline bool isConvex(const RawShape& sh) // dispatch using Segment = _Segment; \ using Polygons = TMultiShape +namespace sl = shapelike; +namespace pl = pointlike; + } #endif // GEOMETRY_TRAITS_HPP diff --git a/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp b/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp index cb0580ef4f..4a2c69bca2 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp @@ -1,26 +1,22 @@ #ifndef GEOMETRIES_NOFITPOLYGON_HPP #define GEOMETRIES_NOFITPOLYGON_HPP -#include "geometry_traits.hpp" #include #include #include #include +#include + namespace libnest2d { namespace __nfp { // Do not specialize this... -template +template> inline bool _vsort(const TPoint& v1, const TPoint& v2) { - using Coord = TCoord>; - Coord &&x1 = getX(v1), &&x2 = getX(v2), &&y1 = getY(v1), &&y2 = getY(v2); - auto diff = y1 - y2; - if(std::abs(diff) <= std::numeric_limits::epsilon()) - return x1 < x2; - - return diff < 0; + Unit x1 = getX(v1), x2 = getX(v2), y1 = getY(v1), y2 = getY(v2); + return y1 == y2 ? x1 < x2 : y1 < y2; } template> @@ -202,7 +198,7 @@ inline TPoint referenceVertex(const RawShape& sh) * convex as well in this case. * */ -template +template inline NfpResult nfpConvexOnly(const RawShape& sh, const RawShape& other) { @@ -238,12 +234,62 @@ inline NfpResult nfpConvexOnly(const RawShape& sh, ++first; ++next; } } - - // Sort the edges by angle to X axis. - std::sort(edgelist.begin(), edgelist.end(), - [](const Edge& e1, const Edge& e2) + + std::sort(edgelist.begin(), edgelist.end(), + [](const Edge& e1, const Edge& e2) { - return e1.angleToXaxis() > e2.angleToXaxis(); + Vertex ax(1, 0); // Unit vector for the X axis + + // get cectors from the edges + Vertex p1 = e1.second() - e1.first(); + Vertex p2 = e2.second() - e2.first(); + + // Quadrant mapping array. The quadrant of a vector can be determined + // from the dot product of the vector and its perpendicular pair + // with the unit vector X axis. The products will carry the values + // lcos = dot(p, ax) = l * cos(phi) and + // lsin = -dotperp(p, ax) = l * sin(phi) where + // l is the length of vector p. From the signs of these values we can + // construct an index which has the sign of lcos as MSB and the + // sign of lsin as LSB. This index can be used to retrieve the actual + // quadrant where vector p resides using the following map: + // (+ is 0, - is 1) + // cos | sin | decimal | quadrant + // + | + | 0 | 0 + // + | - | 1 | 3 + // - | + | 2 | 1 + // - | - | 3 | 2 + std::array quadrants {0, 3, 1, 2 }; + + std::array q {0, 0}; // Quadrant indices for p1 and p2 + + using TDots = std::array, 2>; + TDots lcos { pl::dot(p1, ax), pl::dot(p2, ax) }; + TDots lsin { -pl::dotperp(p1, ax), -pl::dotperp(p2, ax) }; + + // Construct the quadrant indices for p1 and p2 + for(size_t i = 0; i < 2; ++i) + if(lcos[i] == 0) q[i] = lsin[i] > 0 ? 1 : 3; + else if(lsin[i] == 0) q[i] = lcos[i] > 0 ? 0 : 2; + else q[i] = quadrants[((lcos[i] < 0) << 1) + (lsin[i] < 0)]; + + if(q[0] == q[1]) { // only bother if p1 and p2 are in the same quadrant + auto lsq1 = pl::magnsq(p1); // squared magnitudes, avoid sqrt + auto lsq2 = pl::magnsq(p2); // squared magnitudes, avoid sqrt + + // We will actually compare l^2 * cos^2(phi) which saturates the + // cos function. But with the quadrant info we can get the sign back + int sign = q[0] == 1 || q[0] == 2 ? -1 : 1; + + // If Ratio is an actual rational type, there is no precision loss + auto pcos1 = Ratio(lcos[0]) / lsq1 * sign * lcos[0]; + auto pcos2 = Ratio(lcos[1]) / lsq2 * sign * lcos[1]; + + return q[0] < 2 ? pcos1 < pcos2 : pcos1 > pcos2; + } + + // If in different quadrants, compare the quadrant indices only. + return q[0] > q[1]; }); __nfp::buildPolygon(edgelist, rsh, top_nfp); @@ -253,456 +299,9 @@ inline NfpResult nfpConvexOnly(const RawShape& sh, template NfpResult nfpSimpleSimple(const RawShape& cstationary, - const RawShape& cother) + const RawShape& cother) { - - // Algorithms are from the original algorithm proposed in paper: - // https://eprints.soton.ac.uk/36850/1/CORMSIS-05-05.pdf - - // ///////////////////////////////////////////////////////////////////////// - // Algorithm 1: Obtaining the minkowski sum - // ///////////////////////////////////////////////////////////////////////// - - // I guess this is not a full minkowski sum of the two input polygons by - // definition. This yields a subset that is compatible with the next 2 - // algorithms. - - using Result = NfpResult; - using Vertex = TPoint; - using Coord = TCoord; - using Edge = _Segment; - namespace sl = shapelike; - using std::signbit; - using std::sort; - using std::vector; - using std::ref; - using std::reference_wrapper; - - // TODO The original algorithms expects the stationary polygon in - // counter clockwise and the orbiter in clockwise order. - // So for preventing any further complication, I will make the input - // the way it should be, than make my way around the orientations. - - // Reverse the stationary contour to counter clockwise - auto stcont = sl::contour(cstationary); - { - std::reverse(sl::begin(stcont), sl::end(stcont)); - stcont.pop_back(); - auto it = std::min_element(sl::begin(stcont), sl::end(stcont), - [](const Vertex& v1, const Vertex& v2) { - return getY(v1) < getY(v2); - }); - std::rotate(sl::begin(stcont), it, sl::end(stcont)); - sl::addVertex(stcont, sl::front(stcont)); - } - RawShape stationary; - sl::contour(stationary) = stcont; - - // Reverse the orbiter contour to counter clockwise - auto orbcont = sl::contour(cother); - { - std::reverse(orbcont.begin(), orbcont.end()); - - // Step 1: Make the orbiter reverse oriented - - orbcont.pop_back(); - auto it = std::min_element(orbcont.begin(), orbcont.end(), - [](const Vertex& v1, const Vertex& v2) { - return getY(v1) < getY(v2); - }); - - std::rotate(orbcont.begin(), it, orbcont.end()); - orbcont.emplace_back(orbcont.front()); - - for(auto &v : orbcont) v = -v; - - } - - // Copy the orbiter (contour only), we will have to work on it - RawShape orbiter; - sl::contour(orbiter) = orbcont; - - // An edge with additional data for marking it - struct MarkedEdge { - Edge e; Radians turn_angle = 0; bool is_turning_point = false; - MarkedEdge() = default; - MarkedEdge(const Edge& ed, Radians ta, bool tp): - e(ed), turn_angle(ta), is_turning_point(tp) {} - - // debug - std::string label; - }; - - // Container for marked edges - using EdgeList = vector; - - EdgeList A, B; - - // This is how an edge list is created from the polygons - auto fillEdgeList = [](EdgeList& L, const RawShape& ppoly, int dir) { - auto& poly = sl::contour(ppoly); - - L.reserve(sl::contourVertexCount(poly)); - - if(dir > 0) { - auto it = poly.begin(); - auto nextit = std::next(it); - - double turn_angle = 0; - bool is_turn_point = false; - - while(nextit != poly.end()) { - L.emplace_back(Edge(*it, *nextit), turn_angle, is_turn_point); - it++; nextit++; - } - } else { - auto it = sl::rbegin(poly); - auto nextit = std::next(it); - - double turn_angle = 0; - bool is_turn_point = false; - - while(nextit != sl::rend(poly)) { - L.emplace_back(Edge(*it, *nextit), turn_angle, is_turn_point); - it++; nextit++; - } - } - - auto getTurnAngle = [](const Edge& e1, const Edge& e2) { - auto phi = e1.angleToXaxis(); - auto phi_prev = e2.angleToXaxis(); - auto turn_angle = phi-phi_prev; - if(turn_angle > Pi) turn_angle -= TwoPi; - if(turn_angle < -Pi) turn_angle += TwoPi; - return turn_angle; - }; - - auto eit = L.begin(); - auto enext = std::next(eit); - - eit->turn_angle = getTurnAngle(L.front().e, L.back().e); - - while(enext != L.end()) { - enext->turn_angle = getTurnAngle( enext->e, eit->e); - eit->is_turning_point = - signbit(enext->turn_angle) != signbit(eit->turn_angle); - ++eit; ++enext; - } - - L.back().is_turning_point = signbit(L.back().turn_angle) != - signbit(L.front().turn_angle); - - }; - - // Step 2: Fill the edgelists - fillEdgeList(A, stationary, 1); - fillEdgeList(B, orbiter, 1); - - int i = 1; - for(MarkedEdge& me : A) { - std::cout << "a" << i << ":\n\t" - << getX(me.e.first()) << " " << getY(me.e.first()) << "\n\t" - << getX(me.e.second()) << " " << getY(me.e.second()) << "\n\t" - << "Turning point: " << (me.is_turning_point ? "yes" : "no") - << std::endl; - - me.label = "a"; me.label += std::to_string(i); - i++; - } - - i = 1; - for(MarkedEdge& me : B) { - std::cout << "b" << i << ":\n\t" - << getX(me.e.first()) << " " << getY(me.e.first()) << "\n\t" - << getX(me.e.second()) << " " << getY(me.e.second()) << "\n\t" - << "Turning point: " << (me.is_turning_point ? "yes" : "no") - << std::endl; - me.label = "b"; me.label += std::to_string(i); - i++; - } - - // A reference to a marked edge that also knows its container - struct MarkedEdgeRef { - reference_wrapper eref; - reference_wrapper> container; - Coord dir = 1; // Direction modifier - - inline Radians angleX() const { return eref.get().e.angleToXaxis(); } - inline const Edge& edge() const { return eref.get().e; } - inline Edge& edge() { return eref.get().e; } - inline bool isTurningPoint() const { - return eref.get().is_turning_point; - } - inline bool isFrom(const vector& cont ) { - return &(container.get()) == &cont; - } - inline bool eq(const MarkedEdgeRef& mr) { - return &(eref.get()) == &(mr.eref.get()); - } - - MarkedEdgeRef(reference_wrapper er, - reference_wrapper> ec): - eref(er), container(ec), dir(1) {} - - MarkedEdgeRef(reference_wrapper er, - reference_wrapper> ec, - Coord d): - eref(er), container(ec), dir(d) {} - }; - - using EdgeRefList = vector; - - // Comparing two marked edges - auto sortfn = [](const MarkedEdgeRef& e1, const MarkedEdgeRef& e2) { - return e1.angleX() < e2.angleX(); - }; - - EdgeRefList Aref, Bref; // We create containers for the references - Aref.reserve(A.size()); Bref.reserve(B.size()); - - // Fill reference container for the stationary polygon - std::for_each(A.begin(), A.end(), [&Aref](MarkedEdge& me) { - Aref.emplace_back( ref(me), ref(Aref) ); - }); - - // Fill reference container for the orbiting polygon - std::for_each(B.begin(), B.end(), [&Bref](MarkedEdge& me) { - Bref.emplace_back( ref(me), ref(Bref) ); - }); - - auto mink = [sortfn] // the Mink(Q, R, direction) sub-procedure - (const EdgeRefList& Q, const EdgeRefList& R, bool positive) - { - - // Step 1 "merge sort_list(Q) and sort_list(R) to form merge_list(Q,R)" - // Sort the containers of edge references and merge them. - // Q could be sorted only once and be reused here but we would still - // need to merge it with sorted(R). - - EdgeRefList merged; - EdgeRefList S, seq; - merged.reserve(Q.size() + R.size()); - - merged.insert(merged.end(), R.begin(), R.end()); - std::stable_sort(merged.begin(), merged.end(), sortfn); - merged.insert(merged.end(), Q.begin(), Q.end()); - std::stable_sort(merged.begin(), merged.end(), sortfn); - - // Step 2 "set i = 1, k = 1, direction = 1, s1 = q1" - // we don't use i, instead, q is an iterator into Q. k would be an index - // into the merged sequence but we use "it" as an iterator for that - - // here we obtain references for the containers for later comparisons - const auto& Rcont = R.begin()->container.get(); - const auto& Qcont = Q.begin()->container.get(); - - // Set the initial direction - Coord dir = 1; - - // roughly i = 1 (so q = Q.begin()) and s1 = q1 so S[0] = q; - if(positive) { - auto q = Q.begin(); - S.emplace_back(*q); - - // Roughly step 3 - - std::cout << "merged size: " << merged.size() << std::endl; - auto mit = merged.begin(); - for(bool finish = false; !finish && q != Q.end();) { - ++q; // "Set i = i + 1" - - while(!finish && mit != merged.end()) { - if(mit->isFrom(Rcont)) { - auto s = *mit; - s.dir = dir; - S.emplace_back(s); - } - - if(mit->eq(*q)) { - S.emplace_back(*q); - if(mit->isTurningPoint()) dir = -dir; - if(q == Q.begin()) finish = true; - break; - } - - mit += dir; - // __nfp::advance(mit, merged, dir > 0); - } - } - } else { - auto q = Q.rbegin(); - S.emplace_back(*q); - - // Roughly step 3 - - std::cout << "merged size: " << merged.size() << std::endl; - auto mit = merged.begin(); - for(bool finish = false; !finish && q != Q.rend();) { - ++q; // "Set i = i + 1" - - while(!finish && mit != merged.end()) { - if(mit->isFrom(Rcont)) { - auto s = *mit; - s.dir = dir; - S.emplace_back(s); - } - - if(mit->eq(*q)) { - S.emplace_back(*q); - S.back().dir = -1; - if(mit->isTurningPoint()) dir = -dir; - if(q == Q.rbegin()) finish = true; - break; - } - - mit += dir; - // __nfp::advance(mit, merged, dir > 0); - } - } - } - - - // Step 4: - - // "Let starting edge r1 be in position si in sequence" - // whaaat? I guess this means the following: - auto it = S.begin(); - while(!it->eq(*R.begin())) ++it; - - // "Set j = 1, next = 2, direction = 1, seq1 = si" - // we don't use j, seq is expanded dynamically. - dir = 1; - auto next = std::next(R.begin()); seq.emplace_back(*it); - - // Step 5: - // "If all si edges have been allocated to seqj" should mean that - // we loop until seq has equal size with S - auto send = it; //it == S.begin() ? it : std::prev(it); - while(it != S.end()) { - ++it; if(it == S.end()) it = S.begin(); - if(it == send) break; - - if(it->isFrom(Qcont)) { - seq.emplace_back(*it); // "If si is from Q, j = j + 1, seqj = si" - - // "If si is a turning point in Q, - // direction = - direction, next = next + direction" - if(it->isTurningPoint()) { - dir = -dir; - next += dir; -// __nfp::advance(next, R, dir > 0); - } - } - - if(it->eq(*next) /*&& dir == next->dir*/) { // "If si = direction.rnext" - // "j = j + 1, seqj = si, next = next + direction" - seq.emplace_back(*it); - next += dir; -// __nfp::advance(next, R, dir > 0); - } - } - - return seq; - }; - - std::vector seqlist; - seqlist.reserve(Bref.size()); - - EdgeRefList Bslope = Bref; // copy Bref, we will make a slope diagram - - // make the slope diagram of B - std::sort(Bslope.begin(), Bslope.end(), sortfn); - - auto slopeit = Bslope.begin(); // search for the first turning point - while(!slopeit->isTurningPoint() && slopeit != Bslope.end()) slopeit++; - - if(slopeit == Bslope.end()) { - // no turning point means convex polygon. - seqlist.emplace_back(mink(Aref, Bref, true)); - } else { - int dir = 1; - - auto firstturn = Bref.begin(); - while(!firstturn->eq(*slopeit)) ++firstturn; - - assert(firstturn != Bref.end()); - - EdgeRefList bgroup; bgroup.reserve(Bref.size()); - bgroup.emplace_back(*slopeit); - - auto b_it = std::next(firstturn); - while(b_it != firstturn) { - if(b_it == Bref.end()) b_it = Bref.begin(); - - while(!slopeit->eq(*b_it)) { - __nfp::advance(slopeit, Bslope, dir > 0); - } - - if(!slopeit->isTurningPoint()) { - bgroup.emplace_back(*slopeit); - } else { - if(!bgroup.empty()) { - if(dir > 0) bgroup.emplace_back(*slopeit); - for(auto& me : bgroup) { - std::cout << me.eref.get().label << ", "; - } - std::cout << std::endl; - seqlist.emplace_back(mink(Aref, bgroup, dir == 1 ? true : false)); - bgroup.clear(); - if(dir < 0) bgroup.emplace_back(*slopeit); - } else { - bgroup.emplace_back(*slopeit); - } - - dir *= -1; - } - ++b_it; - } - } - -// while(it != Bref.end()) // This is step 3 and step 4 in one loop -// if(it->isTurningPoint()) { -// R = {R.last, it++}; -// auto seq = mink(Q, R, orientation); - -// // TODO step 6 (should be 5 shouldn't it?): linking edges from A -// // I don't get this step - -// seqlist.insert(seqlist.end(), seq.begin(), seq.end()); -// orientation = !orientation; -// } else ++it; - -// if(seqlist.empty()) seqlist = mink(Q, {Bref.begin(), Bref.end()}, true); - - // ///////////////////////////////////////////////////////////////////////// - // Algorithm 2: breaking Minkowski sums into track line trips - // ///////////////////////////////////////////////////////////////////////// - - - // ///////////////////////////////////////////////////////////////////////// - // Algorithm 3: finding the boundary of the NFP from track line trips - // ///////////////////////////////////////////////////////////////////////// - - - for(auto& seq : seqlist) { - std::cout << "seqlist size: " << seq.size() << std::endl; - for(auto& s : seq) { - std::cout << (s.dir > 0 ? "" : "-") << s.eref.get().label << ", "; - } - std::cout << std::endl; - } - - auto& seq = seqlist.front(); - RawShape rsh; - Vertex top_nfp; - std::vector edgelist; edgelist.reserve(seq.size()); - for(auto& s : seq) { - edgelist.emplace_back(s.eref.get().e); - } - - __nfp::buildPolygon(edgelist, rsh, top_nfp); - - return Result(rsh, top_nfp); + return {}; } // Specializable NFP implementation class. Specialize it if you have a faster diff --git a/src/libnest2d/include/libnest2d/libnest2d.hpp b/src/libnest2d/include/libnest2d/libnest2d.hpp index c7b252e5d5..5d74aa3d9d 100644 --- a/src/libnest2d/include/libnest2d/libnest2d.hpp +++ b/src/libnest2d/include/libnest2d/libnest2d.hpp @@ -8,13 +8,10 @@ #include #include -#include "geometry_traits.hpp" +#include namespace libnest2d { -namespace sl = shapelike; -namespace pl = pointlike; - /** * \brief An item to be placed on a bin. * @@ -422,13 +419,9 @@ private: static inline bool vsort(const Vertex& v1, const Vertex& v2) { - Coord &&x1 = getX(v1), &&x2 = getX(v2); - Coord &&y1 = getY(v1), &&y2 = getY(v2); - auto diff = y1 - y2; - if(std::abs(diff) <= std::numeric_limits::epsilon()) - return x1 < x2; - - return diff < 0; + TCompute x1 = getX(v1), x2 = getX(v2); + TCompute y1 = getY(v1), y2 = getY(v2); + return y1 == y2 ? x1 < x2 : y1 < y2; } }; diff --git a/src/libnest2d/include/libnest2d/optimizer.hpp b/src/libnest2d/include/libnest2d/optimizer.hpp index 962a47392f..e4c149f228 100644 --- a/src/libnest2d/include/libnest2d/optimizer.hpp +++ b/src/libnest2d/include/libnest2d/optimizer.hpp @@ -4,7 +4,8 @@ #include #include #include -#include "common.hpp" + +#include namespace libnest2d { namespace opt { @@ -60,6 +61,7 @@ enum class Method { L_SIMPLEX, L_SUBPLEX, G_GENETIC, + G_PARTICLE_SWARM //... }; diff --git a/src/libnest2d/include/libnest2d/optimizers/nlopt/CMakeLists.txt b/src/libnest2d/include/libnest2d/optimizers/nlopt/CMakeLists.txt index 4e16d4fc58..6f51718d8b 100644 --- a/src/libnest2d/include/libnest2d/optimizers/nlopt/CMakeLists.txt +++ b/src/libnest2d/include/libnest2d/optimizers/nlopt/CMakeLists.txt @@ -48,7 +48,7 @@ else() target_link_libraries(nloptOptimizer INTERFACE Nlopt::Nlopt) endif() -#target_sources( NloptOptimizer INTERFACE +#target_sources( nloptOptimizer INTERFACE #${CMAKE_CURRENT_SOURCE_DIR}/simplex.hpp #${CMAKE_CURRENT_SOURCE_DIR}/subplex.hpp #${CMAKE_CURRENT_SOURCE_DIR}/genetic.hpp @@ -57,5 +57,5 @@ endif() target_compile_definitions(nloptOptimizer INTERFACE LIBNEST2D_OPTIMIZER_NLOPT) -# And finally plug the NloptOptimizer into libnest2d -#target_link_libraries(libnest2d INTERFACE NloptOptimizer) +# And finally plug the nloptOptimizer into libnest2d +#target_link_libraries(libnest2d INTERFACE nloptOptimizer) diff --git a/src/libnest2d/include/libnest2d/optimizers/optimlib/CMakeLists.txt b/src/libnest2d/include/libnest2d/optimizers/optimlib/CMakeLists.txt deleted file mode 100644 index efbbd9cfb2..0000000000 --- a/src/libnest2d/include/libnest2d/optimizers/optimlib/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -find_package(Armadillo REQUIRED) - -add_library(OptimlibOptimizer INTERFACE) -target_include_directories(OptimlibOptimizer INTERFACE ${ARMADILLO_INCLUDE_DIRS}) -target_link_libraries(OptimlibOptimizer INTERFACE ${ARMADILLO_LIBRARIES}) \ No newline at end of file diff --git a/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp b/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp index 7f10be7d73..28aaad5ce1 100644 --- a/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp +++ b/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp @@ -7,15 +7,15 @@ namespace libnest2d { namespace placers { -template struct Epsilon {}; +template struct DefaultEpsilon {}; template -struct Epsilon::value, T> > { +struct DefaultEpsilon::value, T> > { static const T Value = 1; }; template -struct Epsilon::value, T> > { +struct DefaultEpsilon::value, T> > { static const T Value = 1e-3; }; @@ -24,7 +24,7 @@ struct BLConfig { DECLARE_MAIN_TYPES(RawShape); Coord min_obj_distance = 0; - Coord epsilon = Epsilon::Value; + Coord epsilon = DefaultEpsilon::Value; bool allow_rotations = false; }; diff --git a/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp b/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp index 91affe9786..c1f15fe61f 100644 --- a/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp +++ b/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp @@ -103,14 +103,14 @@ Key hash(const _Item& item) { while(deg > N) { ms++; deg -= N; } ls += int(deg); ret.push_back(char(ms)); ret.push_back(char(ls)); - circ += seg.length(); + circ += std::sqrt(seg.template sqlength()); } it = ctr.begin(); nx = std::next(it); while(nx != ctr.end()) { Segment seg(*it++, *nx++); - auto l = int(M * seg.length() / circ); + auto l = int(M * std::sqrt(seg.template sqlength()) / circ); int ms = 'A', ls = 'A'; while(l > N) { ms++; l -= N; } ls += l; @@ -249,6 +249,11 @@ template class EdgeCache { std::vector holes_; double accuracy_ = 1.0; + + static double length(const Edge &e) + { + return std::sqrt(e.template sqlength()); + } void createCache(const RawShape& sh) { { // For the contour @@ -260,7 +265,7 @@ template class EdgeCache { while(next != endit) { contour_.emap.emplace_back(*(first++), *(next++)); - contour_.full_distance += contour_.emap.back().length(); + contour_.full_distance += length(contour_.emap.back()); contour_.distances.emplace_back(contour_.full_distance); } } @@ -275,7 +280,7 @@ template class EdgeCache { while(next != endit) { hc.emap.emplace_back(*(first++), *(next++)); - hc.full_distance += hc.emap.back().length(); + hc.full_distance += length(hc.emap.back()); hc.distances.emplace_back(hc.full_distance); } diff --git a/src/libnest2d/include/libnest2d/utils/boost_alg.hpp b/src/libnest2d/include/libnest2d/utils/boost_alg.hpp index baf1c6a105..16dee513b2 100644 --- a/src/libnest2d/include/libnest2d/utils/boost_alg.hpp +++ b/src/libnest2d/include/libnest2d/utils/boost_alg.hpp @@ -311,19 +311,19 @@ struct range_value { namespace libnest2d { // Now the algorithms that boost can provide... -namespace pointlike { -template<> -inline double distance(const PointImpl& p1, const PointImpl& p2 ) -{ - return boost::geometry::distance(p1, p2); -} +//namespace pointlike { +//template<> +//inline double distance(const PointImpl& p1, const PointImpl& p2 ) +//{ +// return boost::geometry::distance(p1, p2); +//} -template<> -inline double distance(const PointImpl& p, const bp2d::Segment& seg ) -{ - return boost::geometry::distance(p, seg); -} -} +//template<> +//inline double distance(const PointImpl& p, const bp2d::Segment& seg ) +//{ +// return boost::geometry::distance(p, seg); +//} +//} namespace shapelike { // Tell libnest2d how to make string out of a ClipperPolygon object @@ -382,16 +382,9 @@ inline bool touches( const PointImpl& point, const PolygonImpl& shape) } #ifndef DISABLE_BOOST_BOUNDING_BOX -template<> -inline bp2d::Box boundingBox(const PolygonImpl& sh, const PolygonTag&) -{ - bp2d::Box b; - boost::geometry::envelope(sh, b); - return b; -} template<> -inline bp2d::Box boundingBox(const PathImpl& sh, const PolygonTag&) +inline bp2d::Box boundingBox(const PathImpl& sh, const PathTag&) { bp2d::Box b; boost::geometry::envelope(sh, b); @@ -410,9 +403,9 @@ inline bp2d::Box boundingBox(const bp2d::Shapes& shapes, #ifndef DISABLE_BOOST_CONVEX_HULL template<> -inline PolygonImpl convexHull(const PolygonImpl& sh, const PolygonTag&) +inline PathImpl convexHull(const PathImpl& sh, const PathTag&) { - PolygonImpl ret; + PathImpl ret; boost::geometry::convex_hull(sh, ret); return ret; } diff --git a/src/libnest2d/include/libnest2d/utils/rotcalipers.hpp b/src/libnest2d/include/libnest2d/utils/rotcalipers.hpp new file mode 100644 index 0000000000..76f91ba0cf --- /dev/null +++ b/src/libnest2d/include/libnest2d/utils/rotcalipers.hpp @@ -0,0 +1,268 @@ +#ifndef ROTCALIPERS_HPP +#define ROTCALIPERS_HPP + +#include +#include +#include +#include + +#include + +namespace libnest2d { + +template> class RotatedBox { + Pt axis_; + Unit bottom_ = Unit(0), right_ = Unit(0); +public: + + RotatedBox() = default; + RotatedBox(const Pt& axis, Unit b, Unit r): + axis_(axis), bottom_(b), right_(r) {} + + inline long double area() const { + long double asq = pl::magnsq(axis_); + return cast(bottom_) * cast(right_) / asq; + } + + inline long double width() const { + return abs(bottom_) / std::sqrt(pl::magnsq(axis_)); + } + + inline long double height() const { + return abs(right_) / std::sqrt(pl::magnsq(axis_)); + } + + inline Unit bottom_extent() const { return bottom_; } + inline Unit right_extent() const { return right_; } + inline const Pt& axis() const { return axis_; } + + inline Radians angleToX() const { + double ret = std::atan2(getY(axis_), getX(axis_)); + auto s = std::signbit(ret); + if(s) ret += Pi_2; + return -ret; + } +}; + +template , class Unit = TCompute> +Poly removeCollinearPoints(const Poly& sh, Unit eps = Unit(0)) +{ + Poly ret; sl::reserve(ret, sl::contourVertexCount(sh)); + + Pt eprev = *sl::cbegin(sh) - *std::prev(sl::cend(sh)); + + auto it = sl::cbegin(sh); + auto itx = std::next(it); + if(itx != sl::cend(sh)) while (it != sl::cend(sh)) + { + Pt enext = *itx - *it; + + auto dp = pl::dotperp(eprev, enext); + if(abs(dp) > eps) sl::addVertex(ret, *it); + + eprev = enext; + if (++itx == sl::cend(sh)) itx = sl::cbegin(sh); + ++it; + } + + return ret; +} + +// The area of the bounding rectangle with the axis dir and support vertices +template, class R = TCompute> +inline R rectarea(const Pt& w, // the axis + const Pt& vb, const Pt& vr, + const Pt& vt, const Pt& vl) +{ + Unit a = pl::dot(w, vr - vl); + Unit b = pl::dot(-pl::perp(w), vt - vb); + R m = R(a) / pl::magnsq(w); + m = m * b; + return m; +}; + +template, + class R = TCompute, + class It = typename std::vector::const_iterator> +inline R rectarea(const Pt& w, const std::array& rect) +{ + return rectarea(w, *rect[0], *rect[1], *rect[2], *rect[3]); +} + +// This function is only applicable to counter-clockwise oriented convex +// polygons where only two points can be collinear witch each other. +template , + class Ratio = TCompute> +RotatedBox, Unit> minAreaBoundingBox(const RawShape& sh) +{ + using Point = TPoint; + using Iterator = typename TContour::const_iterator; + using pointlike::dot; using pointlike::magnsq; using pointlike::perp; + + // Get the first and the last vertex iterator + auto first = sl::cbegin(sh); + auto last = std::prev(sl::cend(sh)); + + // Check conditions and return undefined box if input is not sane. + if(last == first) return {}; + if(getX(*first) == getX(*last) && getY(*first) == getY(*last)) --last; + if(last - first < 2) return {}; + + RawShape shcpy; // empty at this point + { + Point p = *first, q = *std::next(first), r = *last; + + // Determine orientation from first 3 vertex (should be consistent) + Unit d = (Unit(getY(q)) - getY(p)) * (Unit(getX(r)) - getX(p)) - + (Unit(getX(q)) - getX(p)) * (Unit(getY(r)) - getY(p)); + + if(d > 0) { + // The polygon is clockwise. A flip is needed (for now) + sl::reserve(shcpy, last - first); + auto it = last; while(it != first) sl::addVertex(shcpy, *it--); + sl::addVertex(shcpy, *first); + first = sl::cbegin(shcpy); last = std::prev(sl::cend(shcpy)); + } + } + + // Cyclic iterator increment + auto inc = [&first, &last](Iterator& it) { + if(it == last) it = first; else ++it; + }; + + // Cyclic previous iterator + auto prev = [&first, &last](Iterator it) { + return it == first ? last : std::prev(it); + }; + + // Cyclic next iterator + auto next = [&first, &last](Iterator it) { + return it == last ? first : std::next(it); + }; + + // Establish initial (axis aligned) rectangle support verices by determining + // polygon extremes: + + auto it = first; + Iterator minX = it, maxX = it, minY = it, maxY = it; + + do { // Linear walk through the vertices and save the extreme positions + + Point v = *it, d = v - *minX; + if(getX(d) < 0 || (getX(d) == 0 && getY(d) < 0)) minX = it; + + d = v - *maxX; + if(getX(d) > 0 || (getX(d) == 0 && getY(d) > 0)) maxX = it; + + d = v - *minY; + if(getY(d) < 0 || (getY(d) == 0 && getX(d) > 0)) minY = it; + + d = v - *maxY; + if(getY(d) > 0 || (getY(d) == 0 && getX(d) < 0)) maxY = it; + + } while(++it != std::next(last)); + + // Update the vertices defining the bounding rectangle. The rectangle with + // the smallest rotation is selected and the supporting vertices are + // returned in the 'rect' argument. + auto update = [&next, &inc] + (const Point& w, std::array& rect) + { + Iterator B = rect[0], Bn = next(B); + Iterator R = rect[1], Rn = next(R); + Iterator T = rect[2], Tn = next(T); + Iterator L = rect[3], Ln = next(L); + + Point b = *Bn - *B, r = *Rn - *R, t = *Tn - *T, l = *Ln - *L; + Point pw = perp(w); + using Pt = Point; + + Unit dotwpb = dot( w, b), dotwpr = dot(-pw, r); + Unit dotwpt = dot(-w, t), dotwpl = dot( pw, l); + Unit dw = magnsq(w); + + std::array angles; + angles[0] = (Ratio(dotwpb) / magnsq(b)) * dotwpb; + angles[1] = (Ratio(dotwpr) / magnsq(r)) * dotwpr; + angles[2] = (Ratio(dotwpt) / magnsq(t)) * dotwpt; + angles[3] = (Ratio(dotwpl) / magnsq(l)) * dotwpl; + + using AngleIndex = std::pair; + std::vector A; A.reserve(4); + + for (size_t i = 3, j = 0; j < 4; i = j++) { + if(rect[i] != rect[j] && angles[i] < dw) { + auto iv = std::make_pair(angles[i], i); + auto it = std::lower_bound(A.begin(), A.end(), iv, + [](const AngleIndex& ai, + const AngleIndex& aj) + { + return ai.first > aj.first; + }); + + A.insert(it, iv); + } + } + + // The polygon is supposed to be a rectangle. + if(A.empty()) return false; + + auto amin = A.front().first; + auto imin = A.front().second; + for(auto& a : A) if(a.first == amin) inc(rect[a.second]); + + std::rotate(rect.begin(), rect.begin() + imin, rect.end()); + + return true; + }; + + Point w(1, 0); + Point w_min = w; + Ratio minarea((Unit(getX(*maxX)) - getX(*minX)) * + (Unit(getY(*maxY)) - getY(*minY))); + + std::array rect = {minY, maxX, maxY, minX}; + std::array minrect = rect; + + // An edge might be examined twice in which case the algorithm terminates. + size_t c = 0, count = last - first + 1; + std::vector edgemask(count, false); + + while(c++ < count) + { + // Update the support vertices, if cannot be updated, break the cycle. + if(! update(w, rect)) break; + + size_t eidx = size_t(rect[0] - first); + + if(edgemask[eidx]) break; + edgemask[eidx] = true; + + // get the unnormalized direction vector + w = *rect[0] - *prev(rect[0]); + + // get the area of the rotated rectangle + Ratio rarea = rectarea(w, rect); + + // Update min area and the direction of the min bounding box; + if(rarea <= minarea) { w_min = w; minarea = rarea; minrect = rect; } + } + + Unit a = dot(w_min, *minrect[1] - *minrect[3]); + Unit b = dot(-perp(w_min), *minrect[2] - *minrect[0]); + RotatedBox bb(w_min, a, b); + + return bb; +} + +template Radians minAreaBoundingBoxRotation(const RawShape& sh) +{ + return minAreaBoundingBox(sh).angleToX(); +} + + +} + +#endif // ROTCALIPERS_HPP diff --git a/src/libnest2d/src/libnest2d.cpp b/src/libnest2d/src/libnest2d.cpp new file mode 100644 index 0000000000..0214587874 --- /dev/null +++ b/src/libnest2d/src/libnest2d.cpp @@ -0,0 +1,23 @@ +#include + +namespace libnest2d { + +template class Nester; +template class Nester; + +template PackGroup nest(std::vector::iterator from, + std::vector::iterator to, + const Box& bin, + Coord dist = 0, + const NfpPlacer::Config& pconf, + const FirstFitSelection::Config& sconf); + +template PackGroup nest(std::vector::iterator from, + std::vector::iterator to, + const Box& bin, + ProgressFunction prg, + StopCondition scond, + Coord dist = 0, + const NfpPlacer::Config& pconf, + const FirstFitSelection::Config& sconf); +} diff --git a/src/libnest2d/tests/CMakeLists.txt b/src/libnest2d/tests/CMakeLists.txt index fc3cd309dd..1b7d8e3ae6 100644 --- a/src/libnest2d/tests/CMakeLists.txt +++ b/src/libnest2d/tests/CMakeLists.txt @@ -49,7 +49,12 @@ add_executable(tests_clipper_nlopt target_link_libraries(tests_clipper_nlopt libnest2d ${GTEST_LIBS_TO_LINK} ) -target_include_directories(tests_clipper_nlopt PRIVATE BEFORE - ${GTEST_INCLUDE_DIRS}) +target_include_directories(tests_clipper_nlopt PRIVATE BEFORE ${GTEST_INCLUDE_DIRS}) + +if(NOT LIBNEST2D_HEADER_ONLY) + target_link_libraries(tests_clipper_nlopt ${LIBNAME}) +else() + target_link_libraries(tests_clipper_nlopt libnest2d) +endif() add_test(libnest2d_tests tests_clipper_nlopt) diff --git a/src/libnest2d/tests/test.cpp b/src/libnest2d/tests/test.cpp index 3b0eae1618..5741e87b4f 100644 --- a/src/libnest2d/tests/test.cpp +++ b/src/libnest2d/tests/test.cpp @@ -3,11 +3,43 @@ #include #include "printer_parts.h" -#include +//#include #include "../tools/svgtools.hpp" +#include + +#include "boost/multiprecision/integer.hpp" +#include "boost/rational.hpp" + +//#include "../tools/Int128.hpp" + +//#include "gte/Mathematics/GteMinimumAreaBox2.h" + //#include "../tools/libnfpglue.hpp" //#include "../tools/nfp_svgnest_glue.hpp" +namespace libnest2d { +#if !defined(_MSC_VER) && defined(__SIZEOF_INT128__) && !defined(__APPLE__) +using LargeInt = __int128; +#else +using LargeInt = boost::multiprecision::int128_t; +template<> struct _NumTag { using Type = ScalarTag; }; +#endif +template struct _NumTag> { using Type = RationalTag; }; + +namespace nfp { + +template +struct NfpImpl +{ + NfpResult operator()(const S &sh, const S &other) + { + return nfpConvexOnly>(sh, other); + } +}; + +} +} + std::vector& prusaParts() { static std::vector ret; @@ -31,8 +63,8 @@ TEST(BasicFunctionality, Angles) ASSERT_DOUBLE_EQ(rad, Pi); ASSERT_DOUBLE_EQ(deg, 180); ASSERT_DOUBLE_EQ(deg2, 180); - ASSERT_DOUBLE_EQ(rad, (Radians) deg); - ASSERT_DOUBLE_EQ( (Degrees) rad, deg); + ASSERT_DOUBLE_EQ(rad, Radians(deg)); + ASSERT_DOUBLE_EQ( Degrees(rad), deg); ASSERT_TRUE(rad == deg); @@ -151,12 +183,12 @@ TEST(GeometryAlgorithms, Distance) { Segment seg(p1, p3); - ASSERT_DOUBLE_EQ(pointlike::distance(p2, seg), 7.0710678118654755); +// ASSERT_DOUBLE_EQ(pointlike::distance(p2, seg), 7.0710678118654755); auto result = pointlike::horizontalDistance(p2, seg); - auto check = [](Coord val, Coord expected) { - if(std::is_floating_point::value) + auto check = [](TCompute val, TCompute expected) { + if(std::is_floating_point>::value) ASSERT_DOUBLE_EQ(static_cast(val), static_cast(expected)); else @@ -415,7 +447,7 @@ TEST(GeometryAlgorithms, ArrangeRectanglesLoose) namespace { using namespace libnest2d; -template +template void exportSVG(std::vector>& result, const Bin& bin, int idx = 0) { @@ -500,6 +532,41 @@ TEST(GeometryAlgorithms, BottomLeftStressTest) { } } +TEST(GeometryAlgorithms, convexHull) { + using namespace libnest2d; + + ClipperLib::Path poly = PRINTER_PART_POLYGONS[0]; + + auto chull = sl::convexHull(poly); + + ASSERT_EQ(chull.size(), poly.size()); +} + + +TEST(GeometryAlgorithms, NestTest) { + std::vector input = prusaParts(); + + PackGroup result = libnest2d::nest(input, + Box(250000000, 210000000), + [](unsigned cnt) { + std::cout + << "parts left: " << cnt + << std::endl; + }); + + ASSERT_LE(result.size(), 2); + + int partsum = std::accumulate(result.begin(), + result.end(), + 0, + [](int s, + const decltype(result)::value_type &bin) { + return s += bin.size(); + }); + + ASSERT_EQ(input.size(), partsum); +} + namespace { struct ItemPair { @@ -713,7 +780,7 @@ void testNfp(const std::vector& testdata) { auto& exportfun = exportSVG; - auto onetest = [&](Item& orbiter, Item& stationary, unsigned testidx){ + auto onetest = [&](Item& orbiter, Item& stationary, unsigned /*testidx*/){ testcase++; orbiter.translate({210*SCALE, 0}); @@ -820,7 +887,7 @@ TEST(GeometryAlgorithms, mergePileWithPolygon) { rect2.translate({10, 0}); rect3.translate({25, 0}); - shapelike::Shapes pile; + TMultiShape pile; pile.push_back(rect1.transformedShape()); pile.push_back(rect2.transformedShape()); @@ -833,6 +900,126 @@ TEST(GeometryAlgorithms, mergePileWithPolygon) { ASSERT_EQ(shapelike::area(result.front()), ref.area()); } +namespace { + +long double refMinAreaBox(const PolygonImpl& p) { + + auto it = sl::cbegin(p), itx = std::next(it); + + long double min_area = std::numeric_limits::max(); + + + auto update_min = [&min_area, &it, &itx, &p]() { + Segment s(*it, *itx); + + PolygonImpl rotated = p; + sl::rotate(rotated, -s.angleToXaxis()); + auto bb = sl::boundingBox(rotated); + auto area = cast(sl::area(bb)); + if(min_area > area) min_area = area; + }; + + while(itx != sl::cend(p)) { + update_min(); + ++it; ++itx; + } + + it = std::prev(sl::cend(p)); itx = sl::cbegin(p); + update_min(); + + return min_area; +} + +template struct BoostGCD { + T operator()(const T &a, const T &b) { return boost::gcd(a, b); } +}; + +using Unit = int64_t; +using Ratio = boost::rational;// Rational; + +//double gteMinAreaBox(const PolygonImpl& p) { + +// using GteCoord = ClipperLib::cInt; +// using GtePoint = gte::Vector2; + +// gte::MinimumAreaBox2 mb; + +// std::vector points; +// points.reserve(p.Contour.size()); + +// for(auto& pt : p.Contour) points.emplace_back(GtePoint{GteCoord(pt.X), GteCoord(pt.Y)}); + +// mb(int(points.size()), points.data(), 0, nullptr, true); + +// auto min_area = double(mb.GetArea()); + +// return min_area; +//} + +} + +TEST(RotatingCalipers, MinAreaBBCClk) { +// PolygonImpl poly({{-50, 30}, {-50, -50}, {50, -50}, {50, 50}, {-40, 50}}); + +// PolygonImpl poly({{-50, 0}, {50, 0}, {0, 100}}); + + auto u = [](ClipperLib::cInt n) { return n*1000000; }; + PolygonImpl poly({ {u(0), u(0)}, {u(4), u(1)}, {u(2), u(4)}}); + + + long double arearef = refMinAreaBox(poly); + long double area = minAreaBoundingBox(poly).area(); +// double gtearea = gteMinAreaBox(poly); + + ASSERT_LE(std::abs(area - arearef), 500e6 ); +// ASSERT_LE(std::abs(gtearea - arearef), 500 ); +// ASSERT_DOUBLE_EQ(gtearea, arearef); +} + +TEST(RotatingCalipers, AllPrusaMinBB) { + size_t idx = 0; + long double err_epsilon = 500e6l; + + for(ClipperLib::Path rinput : PRINTER_PART_POLYGONS) { +// ClipperLib::Path rinput = PRINTER_PART_POLYGONS[idx]; +// rinput.pop_back(); +// std::reverse(rinput.begin(), rinput.end()); + +// PolygonImpl poly(removeCollinearPoints(rinput, 1000000)); + PolygonImpl poly(rinput); + + long double arearef = refMinAreaBox(poly); + auto bb = minAreaBoundingBox(rinput); + long double area = cast(bb.area()); +// double area = gteMinAreaBox(poly); + + bool succ = std::abs(arearef - area) < err_epsilon; + std::cout << idx++ << " " << (succ? "ok" : "failed") << " ref: " + << arearef << " actual: " << area << std::endl; + + ASSERT_TRUE(succ); + } + + for(ClipperLib::Path rinput : STEGOSAUR_POLYGONS) { + rinput.pop_back(); + std::reverse(rinput.begin(), rinput.end()); + + PolygonImpl poly(removeCollinearPoints(rinput, 1000000)); + + + long double arearef = refMinAreaBox(poly); + auto bb = minAreaBoundingBox(poly); + long double area = cast(bb.area()); +// double area = gteMinAreaBox(poly); + + bool succ = std::abs(arearef - area) < err_epsilon; + std::cout << idx++ << " " << (succ? "ok" : "failed") << " ref: " + << arearef << " actual: " << area << std::endl; + + ASSERT_TRUE(succ); + } +} + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 833b1ae629..e06a5f52ab 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -163,6 +163,8 @@ add_library(libslic3r STATIC MTUtils.hpp Zipper.hpp Zipper.cpp + MinAreaBoundingBox.hpp + MinAreaBoundingBox.cpp miniz_extension.hpp miniz_extension.cpp SLA/SLABoilerPlate.hpp diff --git a/src/libslic3r/Int128.hpp b/src/libslic3r/Int128.hpp index 56dc5f461d..8dc9e012dd 100644 --- a/src/libslic3r/Int128.hpp +++ b/src/libslic3r/Int128.hpp @@ -37,6 +37,8 @@ * * *******************************************************************************/ +#ifndef SLIC3R_INT128_HPP +#define SLIC3R_INT128_HPP // #define SLIC3R_DEBUG // Make assert active if SLIC3R_DEBUG @@ -48,6 +50,8 @@ #endif #include +#include +#include #if ! defined(_MSC_VER) && defined(__SIZEOF_INT128__) #define HAS_INTRINSIC_128_TYPE @@ -293,3 +297,5 @@ public: return sign_determinant_2x2(p1, q1, p2, q2) * invert; } }; + +#endif // SLIC3R_INT128_HPP diff --git a/src/libslic3r/MinAreaBoundingBox.cpp b/src/libslic3r/MinAreaBoundingBox.cpp new file mode 100644 index 0000000000..6fc1b3327a --- /dev/null +++ b/src/libslic3r/MinAreaBoundingBox.cpp @@ -0,0 +1,142 @@ +#include "MinAreaBoundingBox.hpp" + +#include +#include + +#include + +#if !defined(HAS_INTRINSIC_128_TYPE) || defined(__APPLE__) +#include +#endif + +#include +#include + +namespace libnest2d { + +template<> struct PointType { using Type = Slic3r::Point; }; +template<> struct CoordType { using Type = coord_t; }; +template<> struct ShapeTag { using Type = PolygonTag; }; +template<> struct ShapeTag { using Type = PolygonTag; }; +template<> struct ShapeTag { using Type = PathTag; }; +template<> struct ShapeTag { using Type = PointTag; }; +template<> struct ContourType { using Type = Slic3r::Points; }; +template<> struct ContourType { using Type = Slic3r::Points; }; + +namespace pointlike { + +template<> inline coord_t x(const Slic3r::Point& p) { return p.x(); } +template<> inline coord_t y(const Slic3r::Point& p) { return p.y(); } +template<> inline coord_t& x(Slic3r::Point& p) { return p.x(); } +template<> inline coord_t& y(Slic3r::Point& p) { return p.y(); } + +} // pointlike + +namespace shapelike { +template<> inline Slic3r::Points& contour(Slic3r::ExPolygon& sh) { return sh.contour.points; } +template<> inline const Slic3r::Points& contour(const Slic3r::ExPolygon& sh) { return sh.contour.points; } +template<> inline Slic3r::Points& contour(Slic3r::Polygon& sh) { return sh.points; } +template<> inline const Slic3r::Points& contour(const Slic3r::Polygon& sh) { return sh.points; } + +template<> Slic3r::Points::iterator begin(Slic3r::Points& pts, const PathTag&) { return pts.begin();} +template<> Slic3r::Points::const_iterator cbegin(const Slic3r::Points& pts, const PathTag&) { return pts.begin(); } +template<> Slic3r::Points::iterator end(Slic3r::Points& pts, const PathTag&) { return pts.end();} +template<> Slic3r::Points::const_iterator cend(const Slic3r::Points& pts, const PathTag&) { return pts.cend(); } + +template<> inline Slic3r::ExPolygon create(Slic3r::Points&& contour) +{ + Slic3r::ExPolygon expoly; expoly.contour.points.swap(contour); + return expoly; +} + +template<> inline Slic3r::Polygon create(Slic3r::Points&& contour) +{ + Slic3r::Polygon poly; poly.points.swap(contour); + return poly; +} + +} // shapelike +} // libnest2d + +namespace Slic3r { + +// Used as compute type. +using Unit = int64_t; + +#if !defined(HAS_INTRINSIC_128_TYPE) || defined(__APPLE__) +using Rational = boost::rational; +#else +using Rational = boost::rational<__int128>; +#endif + +MinAreaBoundigBox::MinAreaBoundigBox(const Polygon &p, PolygonLevel pc) +{ + const Polygon& chull = pc == pcConvex ? p : libnest2d::sl::convexHull(p); + + libnest2d::RotatedBox box = + libnest2d::minAreaBoundingBox(chull); + + m_right = box.right_extent(); + m_bottom = box.bottom_extent(); + m_axis = box.axis(); +} + +MinAreaBoundigBox::MinAreaBoundigBox(const ExPolygon &p, PolygonLevel pc) +{ + const ExPolygon& chull = pc == pcConvex ? p : libnest2d::sl::convexHull(p); + + libnest2d::RotatedBox box = + libnest2d::minAreaBoundingBox(chull); + + m_right = box.right_extent(); + m_bottom = box.bottom_extent(); + m_axis = box.axis(); +} + +MinAreaBoundigBox::MinAreaBoundigBox(const Points &pts, PolygonLevel pc) +{ + const Points& chull = pc == pcConvex ? pts : libnest2d::sl::convexHull(pts); + + libnest2d::RotatedBox box = + libnest2d::minAreaBoundingBox(chull); + + m_right = box.right_extent(); + m_bottom = box.bottom_extent(); + m_axis = box.axis(); +} + +double MinAreaBoundigBox::angle_to_X() const +{ + double ret = std::atan2(m_axis.y(), m_axis.x()); + auto s = std::signbit(ret); + if(s) ret += 2 * PI; + return -ret; +} + +long double MinAreaBoundigBox::width() const +{ + return std::abs(m_bottom) / std::sqrt(libnest2d::pl::magnsq(m_axis)); +} + +long double MinAreaBoundigBox::height() const +{ + return std::abs(m_right) / std::sqrt(libnest2d::pl::magnsq(m_axis)); +} + +long double MinAreaBoundigBox::area() const +{ + long double asq = libnest2d::pl::magnsq(m_axis); + return m_bottom * m_right / asq; +} + +void remove_collinear_points(Polygon &p) +{ + p = libnest2d::removeCollinearPoints(p, Unit(0)); +} + +void remove_collinear_points(ExPolygon &p) +{ + p = libnest2d::removeCollinearPoints(p, Unit(0)); +} + +} diff --git a/src/libslic3r/MinAreaBoundingBox.hpp b/src/libslic3r/MinAreaBoundingBox.hpp new file mode 100644 index 0000000000..30d0e9799d --- /dev/null +++ b/src/libslic3r/MinAreaBoundingBox.hpp @@ -0,0 +1,59 @@ +#ifndef MINAREABOUNDINGBOX_HPP +#define MINAREABOUNDINGBOX_HPP + +#include "libslic3r/Point.hpp" + +namespace Slic3r { + +class Polygon; +class ExPolygon; + +void remove_collinear_points(Polygon& p); +void remove_collinear_points(ExPolygon& p); + +/// A class that holds a rotated bounding box. If instantiated with a polygon +/// type it will hold the minimum area bounding box for the given polygon. +/// If the input polygon is convex, the complexity is linear to the number of +/// points. Otherwise a convex hull of O(n*log(n)) has to be performed. +class MinAreaBoundigBox { + Point m_axis; + long double m_bottom = 0.0l, m_right = 0.0l; +public: + + // Polygons can be convex or simple (convex or concave with possible holes) + enum PolygonLevel { + pcConvex, pcSimple + }; + + // Constructors with various types of geometry data used in Slic3r. + // If the convexity is known apriory, pcConvex can be used to skip + // convex hull calculation. It is very important that the input polygons + // do NOT have any collinear points (except for the first and the last + // vertex being the same -- meaning a closed polygon for boost) + // To make sure this constraint is satisfied, you can call + // remove_collinear_points on the input polygon before handing over here) + explicit MinAreaBoundigBox(const Polygon&, PolygonLevel = pcSimple); + explicit MinAreaBoundigBox(const ExPolygon&, PolygonLevel = pcSimple); + explicit MinAreaBoundigBox(const Points&, PolygonLevel = pcSimple); + + // Returns the angle in radians needed for the box to be aligned with the + // X axis. Rotate the polygon by this angle and it will be aligned. + double angle_to_X() const; + + // The box width + long double width() const; + + // The box height + long double height() const; + + // The box area + long double area() const; + + // The axis of the rotated box. If the angle_to_X is not sufficiently + // precise, use this unnormalized direction vector. + const Point& axis() const { return m_axis; } +}; + +} + +#endif // MINAREABOUNDINGBOX_HPP diff --git a/src/libslic3r/ModelArrange.cpp b/src/libslic3r/ModelArrange.cpp index b088a1f176..b323285ccb 100644 --- a/src/libslic3r/ModelArrange.cpp +++ b/src/libslic3r/ModelArrange.cpp @@ -9,6 +9,31 @@ #include #include +#include +#include + +namespace libnest2d { +#if !defined(_MSC_VER) && defined(__SIZEOF_INT128__) && !defined(__APPLE__) +using LargeInt = __int128; +#else +using LargeInt = boost::multiprecision::int128_t; +template<> struct _NumTag { using Type = ScalarTag; }; +#endif +template struct _NumTag> { using Type = RationalTag; }; + +namespace nfp { + +template +struct NfpImpl +{ + NfpResult operator()(const S &sh, const S &other) + { + return nfpConvexOnly>(sh, other); + } +}; + +} +} namespace Slic3r { @@ -130,7 +155,7 @@ Box boundingBox(const Box& pilebb, const Box& ibb ) { // at the same time, it has to provide reasonable results. std::tuple objfunc(const PointImpl& bincenter, - const shapelike::Shapes& merged_pile, + const TMultiShape& merged_pile, const Box& pilebb, const ItemGroup& items, const Item &item, @@ -301,7 +326,7 @@ protected: using Packer = Nester; using PConfig = typename Packer::PlacementConfig; using Distance = TCoord; - using Pile = sl::Shapes; + using Pile = TMultiShape; Packer m_pck; PConfig m_pconf; // Placement configuration @@ -589,7 +614,7 @@ ShapeData2D projectModelFromTop(const Slic3r::Model &model, const WipeTowerInfo& // Invalid geometries would throw exceptions when arranging if(item.vertexCount() > 3) { - item.rotation(float(Geometry::rotation_diff_z(rotation0, objinst->get_rotation()))), + item.rotation(Geometry::rotation_diff_z(rotation0, objinst->get_rotation())); item.translation({ ClipperLib::cInt(objinst->get_offset(X)/SCALING_FACTOR), ClipperLib::cInt(objinst->get_offset(Y)/SCALING_FACTOR) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 44f77b3f78..193abba060 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -37,7 +37,12 @@ #include "libslic3r/SLA/SLARotfinder.hpp" #include "libslic3r/Utils.hpp" -#include "libnest2d/optimizers/nlopt/genetic.hpp" +//#include "libslic3r/ClipperUtils.hpp" + +// #include "libnest2d/optimizers/nlopt/genetic.hpp" +// #include "libnest2d/backends/clipper/geometries.hpp" +// #include "libnest2d/utils/rotcalipers.hpp" +#include "libslic3r/MinAreaBoundingBox.hpp" #include "GUI.hpp" #include "GUI_App.hpp" @@ -2261,46 +2266,18 @@ void Plater::priv::sla_optimize_rotation() { for(auto& v : bedpoints) bed.append(Point::new_scale(v(0), v(1))); double mindist = 6.0; // FIXME - double offs = mindist / 2.0 - EPSILON; - + if(rotoptimizing) // wasn't canceled for(ModelInstance * oi : o->instances) { oi->set_rotation({r[X], r[Y], r[Z]}); - - auto trchull = o->convex_hull_2d(oi->get_transformation().get_matrix()); - - namespace opt = libnest2d::opt; - opt::StopCriteria stopcr; - stopcr.relative_score_difference = 0.01; - stopcr.max_iterations = 10000; - stopcr.stop_score = 0.0; - opt::GeneticOptimizer solver(stopcr); - Polygon pbed(bed); - - auto bin = pbed.bounding_box(); - double binw = bin.size()(X) * SCALING_FACTOR - offs; - double binh = bin.size()(Y) * SCALING_FACTOR - offs; - - auto result = solver.optimize_min([&trchull, binw, binh](double rot){ - auto chull = trchull; - chull.rotate(rot); - - auto bb = chull.bounding_box(); - double bbw = bb.size()(X) * SCALING_FACTOR; - double bbh = bb.size()(Y) * SCALING_FACTOR; - - auto wdiff = bbw - binw; - auto hdiff = bbh - binh; - double diff = 0; - if(wdiff < 0 && hdiff < 0) diff = wdiff + hdiff; - if(wdiff > 0) diff += wdiff; - if(hdiff > 0) diff += hdiff; - - return diff; - }, opt::initvals(0.0), opt::bound(-PI/2, PI/2)); - - double r = std::get<0>(result.optimum); - + + Polygon trchull = o->convex_hull_2d(oi->get_transformation().get_matrix()); + MinAreaBoundigBox rotbb(trchull, MinAreaBoundigBox::pcConvex); + double r = rotbb.angle_to_X(); + + // The box should be landscape + if(rotbb.width() < rotbb.height()) r += PI / 2; + Vec3d rt = oi->get_rotation(); rt(Z) += r; oi->set_rotation(rt); } From d809b4894a910ebcefcd89d8776697a7c38c86f4 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 6 Jun 2019 12:21:38 +0200 Subject: [PATCH 09/22] Small addition to qhull dep handling. --- src/qhull/CMakeLists.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/qhull/CMakeLists.txt b/src/qhull/CMakeLists.txt index 262214a5c4..734bb82950 100644 --- a/src/qhull/CMakeLists.txt +++ b/src/qhull/CMakeLists.txt @@ -10,7 +10,7 @@ # see bug report: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=925540 -# find_package(Qhull 7.2 QUIET) +find_package(Qhull 7.2 QUIET) add_library(qhull INTERFACE) @@ -139,9 +139,7 @@ endif(UNIX) ################################################## # LIBDIR is defined in the main xs CMake file: -target_include_directories(${qhull_STATIC} PRIVATE ${LIBDIR}/qhull/src) - +target_include_directories(${qhull_STATIC} BEFORE PUBLIC ${LIBDIR}/qhull/src) target_link_libraries(qhull INTERFACE ${qhull_STATIC}) -target_include_directories(qhull INTERFACE ${LIBDIR}/qhull/src) endif() From 917702f252126f909c1d5d556a307042c0a6c07c Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 18 Jun 2019 11:40:26 +0200 Subject: [PATCH 10/22] Fixed DoubleSlider manipulation from Preview scene --- src/slic3r/GUI/GLCanvas3D.cpp | 27 +++++++++++++++++---------- src/slic3r/GUI/GLCanvas3D.hpp | 1 + src/slic3r/GUI/GUI_Preview.cpp | 6 ++++++ src/slic3r/GUI/GUI_Preview.hpp | 1 + src/slic3r/GUI/Plater.cpp | 1 + src/slic3r/GUI/wxExtensions.cpp | 13 +++++++++++-- src/slic3r/GUI/wxExtensions.hpp | 1 + 7 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index ca05f1695d..d7b62cbf7b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -17,6 +17,7 @@ #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/PresetBundle.hpp" #include "slic3r/GUI/Tab.hpp" +#include "slic3r/GUI/GUI_Preview.hpp" #include "GUI_App.hpp" #include "GUI_ObjectList.hpp" #include "GUI_ObjectManipulation.hpp" @@ -1209,6 +1210,7 @@ wxDEFINE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_RESETGIZMOS, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, wxKeyEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar) : m_canvas(canvas) @@ -2387,8 +2389,18 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) case '4': { select_view("rear"); break; } case '5': { select_view("left"); break; } case '6': { select_view("right"); break; } - case '+': { post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, +1)); break; } - case '-': { post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, -1)); break; } + case '+': { + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt)); + else + post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, +1)); + break; } + case '-': { + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt)); + else + post_event(Event(EVT_GLCANVAS_INCREASE_INSTANCES, -1)); + break; } case '?': { post_event(SimpleEvent(EVT_GLCANVAS_QUESTION_MARK)); break; } case 'A': case 'a': { post_event(SimpleEvent(EVT_GLCANVAS_ARRANGE)); break; } @@ -2472,15 +2484,10 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) else if (keyCode == WXK_LEFT || keyCode == WXK_RIGHT || keyCode == WXK_UP || - keyCode == WXK_DOWN || - keyCode == '+' || - keyCode == WXK_NUMPAD_ADD || - keyCode == '-' || - keyCode == 390 || - keyCode == WXK_DELETE || - keyCode == WXK_BACK ) + keyCode == WXK_DOWN ) { - post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, evt)); + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, evt)); } } } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 96bb56bd93..fc7dddd464 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -125,6 +125,7 @@ wxDECLARE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_RESETGIZMOS, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, wxKeyEvent); +wxDECLARE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); class GLCanvas3D { diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index ec7308382a..2f5e10962e 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -420,6 +420,12 @@ void Preview::move_double_slider(wxKeyEvent& evt) m_slider->OnKeyDown(evt); } +void Preview::edit_double_slider(wxKeyEvent& evt) +{ + if (m_slider) + m_slider->OnChar(evt); +} + void Preview::bind_event_handlers() { this->Bind(wxEVT_SIZE, &Preview::on_size, this); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index ed4555f5cc..93038b0e56 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -123,6 +123,7 @@ public: void msw_rescale(); void move_double_slider(wxKeyEvent& evt); + void edit_double_slider(wxKeyEvent& evt); private: bool init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 557b123777..da638fa9f9 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1518,6 +1518,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [this](SimpleEvent&) { set_bed_shape(config->option("bed_shape")->values); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_TAB, [this](SimpleEvent&) { select_next_view_3D(); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, [this](wxKeyEvent& evt) { preview->move_double_slider(evt); }); + preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_EDIT_COLOR_CHANGE, [this](wxKeyEvent& evt) { preview->edit_double_slider(evt); }); q->Bind(EVT_SLICING_COMPLETED, &priv::on_slicing_completed, this); q->Bind(EVT_PROCESS_COMPLETED, &priv::on_process_completed, this); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 06cf9b7d58..fc34497606 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -2366,9 +2366,9 @@ void DoubleSlider::OnWheel(wxMouseEvent& event) void DoubleSlider::OnKeyDown(wxKeyEvent &event) { const int key = event.GetKeyCode(); - if (key == '+' || key == WXK_NUMPAD_ADD) + if (key == WXK_NUMPAD_ADD) action_tick(taAdd); - else if (key == '-' || key == 390 || key == WXK_DELETE || key == WXK_BACK) + else if (key == 390 || key == WXK_DELETE || key == WXK_BACK) action_tick(taDel); else if (is_horizontal()) { @@ -2398,6 +2398,15 @@ void DoubleSlider::OnKeyUp(wxKeyEvent &event) event.Skip(); } +void DoubleSlider::OnChar(wxKeyEvent& event) +{ + const int key = event.GetKeyCode(); + if (key == '+') + action_tick(taAdd); + else if (key == '-') + action_tick(taDel); +} + void DoubleSlider::OnRightDown(wxMouseEvent& event) { this->CaptureMouse(); diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 78fb7be55b..c496c28a0c 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -727,6 +727,7 @@ public: void OnWheel(wxMouseEvent& event); void OnKeyDown(wxKeyEvent &event); void OnKeyUp(wxKeyEvent &event); + void OnChar(wxKeyEvent &event); void OnRightDown(wxMouseEvent& event); void OnRightUp(wxMouseEvent& event); From b001eca21f21b00af1fcc68e0a54570e1510bc07 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 18 Jun 2019 14:45:10 +0200 Subject: [PATCH 11/22] #2528 - New project command automatically switches to 3D editor view --- src/slic3r/GUI/Plater.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 297cc9f2c7..942b77725a 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3322,6 +3322,7 @@ SLAPrint& Plater::sla_print() { return p->sla_print; } void Plater::new_project() { + p->select_view_3D("3D"); wxPostEvent(p->view3D->get_wxglcanvas(), SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); } From 468516aa315d16d384b5927d130b4bc16aa4a8ae Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 18 Jun 2019 16:24:30 +0200 Subject: [PATCH 12/22] Apply fixes for the ui jobs. - Localization - Mutual exclusion (ExclusiveJobGroup), only one UI job can run at a time, and background processing is stopped - m_range not used for finalization anymore - stop_jobs called before Window is closed --- src/libslic3r/MTUtils.hpp | 9 + src/slic3r/GUI/MainFrame.cpp | 4 +- src/slic3r/GUI/Plater.cpp | 344 ++++++++++++++++++++++------------- 3 files changed, 224 insertions(+), 133 deletions(-) diff --git a/src/libslic3r/MTUtils.hpp b/src/libslic3r/MTUtils.hpp index 7e91ace328..0afe3563f9 100644 --- a/src/libslic3r/MTUtils.hpp +++ b/src/libslic3r/MTUtils.hpp @@ -5,6 +5,7 @@ #include // for std::lock_guard #include // for std::function #include // for std::forward +#include namespace Slic3r { @@ -182,6 +183,14 @@ public: inline bool empty() const { return size() == 0; } }; +template bool all_of(const C &container) { + return std::all_of(container.begin(), + container.end(), + [](const typename C::value_type &v) { + return static_cast(v); + }); +} + } #endif // MTUTILS_HPP diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 2dfc1b747c..667dcd899d 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -103,14 +103,14 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S event.Veto(); return; } + + if(m_plater) m_plater->stop_jobs(); // Weird things happen as the Paint messages are floating around the windows being destructed. // Avoid the Paint messages by hiding the main window. // Also the application closes much faster without these unnecessary screen refreshes. // In addition, there were some crashes due to the Paint events sent to already destructed windows. this->Show(false); - - if(m_plater) m_plater->stop_jobs(); // Save the slic3r.ini.Usually the ini file is saved from "on idle" callback, // but in rare cases it may not have been called yet. diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 643cb0c1b3..42b864ef2d 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1270,7 +1270,7 @@ struct Plater::priv std::future m_ftr; priv *m_plater = nullptr; std::atomic m_running {false}, m_canceled {false}; - bool m_stop_slicing = false; + bool m_finalized = false; void run() { m_running.store(true); process(); m_running.store(false); @@ -1293,16 +1293,27 @@ struct Plater::priv priv& plater() { return *m_plater; } bool was_canceled() const { return m_canceled.load(); } + // Launched just before start(), a job can use it to prepare internals + virtual void prepare() {} + + // Launched when the job is finished. It refreshes the 3dscene by def. + virtual void finalize() { + // Do a full refresh of scene tree, including regenerating + // all the GLVolumes. FIXME The update function shall just + // reload the modified matrices. + if(! was_canceled()) + plater().update(true); + } + public: - Job(priv *_plater, bool stop_slicing = false): - m_plater(_plater), m_stop_slicing(stop_slicing) + Job(priv *_plater): m_plater(_plater) { Bind(wxEVT_THREAD, [this](const wxThreadEvent& evt){ auto msg = evt.GetString(); if(! msg.empty()) plater().statusbar()->set_status_text(msg); - if(! m_range) return; + if(m_finalized) return; plater().statusbar()->set_progress(evt.GetInt()); if(evt.GetInt() == status_range()) { @@ -1312,23 +1323,25 @@ struct Plater::priv plater().statusbar()->set_cancel_callback(); wxEndBusyCursor(); - // Do a full refresh of scene tree, including regenerating - // all the GLVolumes. FIXME The update function shall just - // reload the modified matrices. - if(! was_canceled()) plater().update(true); + finalize(); // dont do finalization again for the same process - m_range = 0; + m_finalized = true; } }); } + Job(const Job&) = delete; + Job(Job&&) = default; + Job& operator=(const Job&) = delete; + Job& operator=(Job&&) = default; + virtual void process() = 0; - void start() { // Start the job. No effect if the job is already running + void start() { // Start the job. No effect if the job is already running if(! m_running.load()) { - if(m_stop_slicing) plater().background_process.stop(); + prepare(); // Save the current status indicatior range and push the new one m_range = plater().statusbar()->get_range(); @@ -1340,6 +1353,8 @@ struct Plater::priv m_canceled.store(true); }); + m_finalized = false; + // Changing cursor to busy wxBeginBusyCursor(); @@ -1358,7 +1373,7 @@ struct Plater::priv // To wait for the running job and join the threads. False is returned // if the timeout has been reached and the job is still running. Call // cancel() before this fn if you want to explicitly end the job. - bool join(int timeout_ms = 0) { + bool join(int timeout_ms = 0) const { if(!m_ftr.valid()) return true; if(timeout_ms <= 0) @@ -1374,21 +1389,85 @@ struct Plater::priv void cancel() { m_canceled.store(true); } }; - class ArrangeJob: public Job { - int count = 0; - public: - using Job::Job; - int status_range() const override { return count; } - void set_count(int c) { count = c; } - void process() override; - } arrange_job {this}; + enum class Jobs : size_t { + Arrange, + Rotoptimize + }; - class RotoptimizeJob: public Job { + // Jobs defined inside the group class will be managed so that only one can + // run at a time. Also, the background process will be stopped if a job is + // started. + class ExclusiveJobGroup { + + static const int ABORT_WAIT_MAX_MS = 10000; + + priv * m_plater; + + class ArrangeJob : public Job + { + int count = 0; + + protected: + void prepare() override + { + count = 0; + for (auto obj : plater().model.objects) + count += int(obj->instances.size()); + } + + public: + using Job::Job; + int status_range() const override { return count; } + void set_count(int c) { count = c; } + void process() override; + } arrange_job{m_plater}; + + class RotoptimizeJob : public Job + { + public: + using Job::Job; + void process() override; + } rotoptimize_job{m_plater}; + + std::vector> m_jobs{arrange_job, + rotoptimize_job}; + public: - using Job::Job; - void process() override; - } rotoptimize_job {this}; - + + ExclusiveJobGroup(priv *_plater): m_plater(_plater) {} + + void start(Jobs jid) { + m_plater->background_process.stop(); + stop_all(); + m_jobs[size_t(jid)].get().start(); + } + + void cancel_all() { for (Job& j : m_jobs) j.cancel(); } + + void join_all(int wait_ms = 0) + { + std::vector aborted(m_jobs.size(), false); + + for (size_t jid = 0; jid < m_jobs.size(); ++jid) + aborted[jid] = m_jobs[jid].get().join(wait_ms); + + if (!all_of(aborted)) + BOOST_LOG_TRIVIAL(error) << "Could not abort a job!"; + } + + void stop_all() { cancel_all(); join_all(ABORT_WAIT_MAX_MS); } + + const Job& get(Jobs jobid) const { return m_jobs[size_t(jobid)]; } + + bool is_any_running() const + { + return std::any_of(m_jobs.begin(), + m_jobs.end(), + [](const Job &j) { return j.is_running(); }); + } + + } m_ui_jobs{this}; + bool delayed_scene_refresh; std::string delayed_error_message; @@ -2274,48 +2353,43 @@ void Plater::priv::mirror(Axis axis) void Plater::priv::arrange() { - if(!arrange_job.is_running()) { - int count = 0; - for(auto obj : model.objects) count += int(obj->instances.size()); - arrange_job.set_count(count); - arrange_job.start(); - } + m_ui_jobs.start(Jobs::Arrange); } // This method will find an optimal orientation for the currently selected item // Very similar in nature to the arrange method above... void Plater::priv::sla_optimize_rotation() { - - rotoptimize_job.start(); + m_ui_jobs.start(Jobs::Rotoptimize); } -void Plater::priv::ArrangeJob::process() { - +void Plater::priv::ExclusiveJobGroup::ArrangeJob::process() { // TODO: we should decide whether to allow arrange when the search is // running we should probably disable explicit slicing and background // processing - static const std::string arrangestr = L("Arranging"); - - auto& config = plater().config; - auto& view3D = plater().view3D; - auto& model = plater().model; + static const auto arrangestr = _(L("Arranging")); + + auto &config = plater().config; + auto &view3D = plater().view3D; + auto &model = plater().model; // FIXME: I don't know how to obtain the minimum distance, it depends // on printer technology. I guess the following should work but it crashes. - double dist = 6; //PrintConfig::min_object_distance(config); - if(plater().printer_technology == ptFFF) { + double dist = 6; // PrintConfig::min_object_distance(config); + if (plater().printer_technology == ptFFF) { dist = PrintConfig::min_object_distance(config); } - auto min_obj_distance = coord_t(dist/SCALING_FACTOR); + auto min_obj_distance = coord_t(dist / SCALING_FACTOR); - const auto *bed_shape_opt = config->opt("bed_shape"); + const auto *bed_shape_opt = config->opt( + "bed_shape"); assert(bed_shape_opt); - auto& bedpoints = bed_shape_opt->values; - Polyline bed; bed.points.reserve(bedpoints.size()); - for(auto& v : bedpoints) bed.append(Point::new_scale(v(0), v(1))); + auto & bedpoints = bed_shape_opt->values; + Polyline bed; + bed.points.reserve(bedpoints.size()); + for (auto &v : bedpoints) bed.append(Point::new_scale(v(0), v(1))); update_status(0, arrangestr); @@ -2333,94 +2407,115 @@ void Plater::priv::ArrangeJob::process() { bed, hint, false, // create many piles not just one pile - [this](unsigned st) { if(st > 0) update_status(count - int(st), arrangestr); }, - [this] () { return was_canceled(); }); - } catch(std::exception& /*e*/) { - GUI::show_error(plater().q, L("Could not arrange model objects! " - "Some geometries may be invalid.")); + [this](unsigned st) { + if (st > 0) + update_status(count - int(st), arrangestr); + }, + [this]() { return was_canceled(); }); + } catch (std::exception & /*e*/) { + GUI::show_error(plater().q, + L("Could not arrange model objects! " + "Some geometries may be invalid.")); } - - update_status(count, was_canceled() ? L("Arranging canceled.") : L("Arranging done.")); + + update_status(count, + was_canceled() ? _(L("Arranging canceled.")) + : _(L("Arranging done."))); // it remains to move the wipe tower: - view3D->get_canvas3d()->arrange_wipe_tower(wti); + view3D->get_canvas3d()->arrange_wipe_tower(wti); } -void Plater::priv::RotoptimizeJob::process() +void Plater::priv::ExclusiveJobGroup::RotoptimizeJob::process() { - int obj_idx = plater().get_selected_object_idx(); if (obj_idx < 0) { return; } - ModelObject * o = plater().model.objects[size_t(obj_idx)]; - - auto r = sla::find_best_rotation( - *o, .005f, - [this](unsigned s) { if(s < 100) update_status(int(s), L("Searching for optimal orientation")); }, - [this](){ return was_canceled(); } - ); + ModelObject *o = plater().model.objects[size_t(obj_idx)]; - const auto *bed_shape_opt = plater().config->opt("bed_shape"); + auto r = sla::find_best_rotation( + *o, + .005f, + [this](unsigned s) { + if (s < 100) + update_status(int(s), + _(L("Searching for optimal orientation"))); + }, + [this]() { return was_canceled(); }); + + const auto *bed_shape_opt = plater().config->opt( + "bed_shape"); assert(bed_shape_opt); - auto& bedpoints = bed_shape_opt->values; - Polyline bed; bed.points.reserve(bedpoints.size()); - for(auto& v : bedpoints) bed.append(Point::new_scale(v(0), v(1))); + auto & bedpoints = bed_shape_opt->values; + Polyline bed; + bed.points.reserve(bedpoints.size()); + for (auto &v : bedpoints) bed.append(Point::new_scale(v(0), v(1))); double mindist = 6.0; // FIXME - double offs = mindist / 2.0 - EPSILON; + double offs = mindist / 2.0 - EPSILON; - if(! was_canceled()) // wasn't canceled - for(ModelInstance * oi : o->instances) { - oi->set_rotation({r[X], r[Y], r[Z]}); + if (!was_canceled()) // wasn't canceled + for (ModelInstance *oi : o->instances) { + oi->set_rotation({r[X], r[Y], r[Z]}); - auto trchull = o->convex_hull_2d(oi->get_transformation().get_matrix()); + auto trchull = o->convex_hull_2d( + oi->get_transformation().get_matrix()); - namespace opt = libnest2d::opt; - opt::StopCriteria stopcr; - stopcr.relative_score_difference = 0.01; - stopcr.max_iterations = 10000; - stopcr.stop_score = 0.0; - opt::GeneticOptimizer solver(stopcr); - Polygon pbed(bed); + namespace opt = libnest2d::opt; + opt::StopCriteria stopcr; + stopcr.relative_score_difference = 0.01; + stopcr.max_iterations = 10000; + stopcr.stop_score = 0.0; + opt::GeneticOptimizer solver(stopcr); + Polygon pbed(bed); - auto bin = pbed.bounding_box(); - double binw = bin.size()(X) * SCALING_FACTOR - offs; - double binh = bin.size()(Y) * SCALING_FACTOR - offs; + auto bin = pbed.bounding_box(); + double binw = bin.size()(X) * SCALING_FACTOR - offs; + double binh = bin.size()(Y) * SCALING_FACTOR - offs; - auto result = solver.optimize_min([&trchull, binw, binh](double rot){ - auto chull = trchull; - chull.rotate(rot); + auto result = solver.optimize_min( + [&trchull, binw, binh](double rot) { + auto chull = trchull; + chull.rotate(rot); - auto bb = chull.bounding_box(); - double bbw = bb.size()(X) * SCALING_FACTOR; - double bbh = bb.size()(Y) * SCALING_FACTOR; + auto bb = chull.bounding_box(); + double bbw = bb.size()(X) * SCALING_FACTOR; + double bbh = bb.size()(Y) * SCALING_FACTOR; - auto wdiff = bbw - binw; - auto hdiff = bbh - binh; - double diff = 0; - if(wdiff < 0 && hdiff < 0) diff = wdiff + hdiff; - if(wdiff > 0) diff += wdiff; - if(hdiff > 0) diff += hdiff; + auto wdiff = bbw - binw; + auto hdiff = bbh - binh; + double diff = 0; + if (wdiff < 0 && hdiff < 0) diff = wdiff + hdiff; + if (wdiff > 0) diff += wdiff; + if (hdiff > 0) diff += hdiff; - return diff; - }, opt::initvals(0.0), opt::bound(-PI/2, PI/2)); + return diff; + }, + opt::initvals(0.0), + opt::bound(-PI / 2, PI / 2)); - double r = std::get<0>(result.optimum); + double r = std::get<0>(result.optimum); - Vec3d rt = oi->get_rotation(); rt(Z) += r; - oi->set_rotation(rt); + Vec3d rt = oi->get_rotation(); + rt(Z) += r; + oi->set_rotation(rt); - arr::WipeTowerInfo wti; // useless in SLA context - arr::find_new_position(plater().model, o->instances, - coord_t(mindist/SCALING_FACTOR), bed, wti); - - // Correct the z offset of the object which was corrupted be the rotation - o->ensure_on_bed(); - - update_status(100, L("Orientation found.")); - } else { - update_status(100, L("Orientation search canceled.")); + arr::WipeTowerInfo wti; // useless in SLA context + arr::find_new_position(plater().model, + o->instances, + coord_t(mindist / SCALING_FACTOR), + bed, + wti); + + // Correct the z offset of the object which was corrupted be + // the rotation + o->ensure_on_bed(); + + update_status(100, _(L("Orientation found."))); + } + else { + update_status(100, _(L("Orientation search canceled."))); } } @@ -2602,7 +2697,7 @@ unsigned int Plater::priv::update_background_process(bool force_validation) // Restart background processing thread based on a bitmask of UpdateBackgroundProcessReturnState. bool Plater::priv::restart_background_process(unsigned int state) { - if (arrange_job.is_running() || rotoptimize_job.is_running()) { + if (m_ui_jobs.is_any_running()) { // Avoid a race condition return false; } @@ -2833,7 +2928,7 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt) void Plater::priv::on_slicing_update(SlicingStatusEvent &evt) { if (evt.status.percent >= -1) { - if (arrange_job.is_running() || rotoptimize_job.is_running()) { + if (m_ui_jobs.is_any_running()) { // Avoid a race condition return; } @@ -3314,7 +3409,7 @@ bool Plater::priv::can_fix_through_netfabb() const bool Plater::priv::can_increase_instances() const { - if (arrange_job.is_running() || rotoptimize_job.is_running()) { + if (m_ui_jobs.is_any_running()) { return false; } @@ -3324,7 +3419,7 @@ bool Plater::priv::can_increase_instances() const bool Plater::priv::can_decrease_instances() const { - if (arrange_job.is_running() || rotoptimize_job.is_running()) { + if (m_ui_jobs.is_any_running()) { return false; } @@ -3344,7 +3439,7 @@ bool Plater::priv::can_split_to_volumes() const bool Plater::priv::can_arrange() const { - return !model.objects.empty() && !arrange_job.is_running(); + return !model.objects.empty() && !m_ui_jobs.is_any_running(); } bool Plater::priv::can_layers_editing() const @@ -3471,20 +3566,7 @@ void Plater::load_files(const std::vector& input_files, bool load_m void Plater::update() { p->update(); } -void Plater::stop_jobs() -{ - static const int ABORT_WAIT_MAX_MS = 10000; - bool aborted = false; - - p->rotoptimize_job.cancel(); - aborted = p->rotoptimize_job.join(ABORT_WAIT_MAX_MS); - - p->arrange_job.cancel(); - aborted &= p->arrange_job.join(ABORT_WAIT_MAX_MS); - - if(!aborted) - BOOST_LOG_TRIVIAL(error) << "Could not abort an optimization job!"; -} +void Plater::stop_jobs() { p->m_ui_jobs.stop_all(); } void Plater::update_ui_from_settings() { p->update_ui_from_settings(); } @@ -3792,7 +3874,7 @@ void Plater::export_3mf(const boost::filesystem::path& output_path) if (!path.Lower().EndsWith(".3mf")) return; - DynamicPrintConfig cfg = wxGetApp().preset_bundle->full_config_secure(); + DynamicPrintConfig cfg = wxGetApp().preset_bundle->full_config_secure(); const std::string path_u8 = into_u8(path); wxBusyCursor wait; if (Slic3r::store_3mf(path_u8.c_str(), &p->model, export_config ? &cfg : nullptr)) { @@ -3846,7 +3928,7 @@ void Plater::reslice_SLA_supports(const ModelObject &object) if (state & priv::UPDATE_BACKGROUND_PROCESS_REFRESH_SCENE) this->p->view3D->reload_scene(false); - if (this->p->background_process.empty() || (state & priv::UPDATE_BACKGROUND_PROCESS_INVALID)) + if (this->p->background_process.empty() || (state & priv::UPDATE_BACKGROUND_PROCESS_INVALID)) // Nothing to do on empty input or invalid configuration. return; From 78610de4730cc85baea984c91d00e776b94d7574 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 19 Jun 2019 10:18:51 +0200 Subject: [PATCH 13/22] Fix build on vs2013 Fix 2 for vs2013 --- src/slic3r/GUI/Plater.cpp | 45 +++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index e729a2ff7b..0a8499f709 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1332,10 +1332,22 @@ struct Plater::priv }); } + // TODO: use this when we all migrated to VS2019 + // Job(const Job&) = delete; + // Job(Job&&) = default; + // Job& operator=(const Job&) = delete; + // Job& operator=(Job&&) = default; Job(const Job&) = delete; - Job(Job&&) = default; Job& operator=(const Job&) = delete; - Job& operator=(Job&&) = default; + Job(Job &&o) : + m_range(o.m_range), + m_ftr(std::move(o.m_ftr)), + m_plater(o.m_plater), + m_finalized(o.m_finalized) + { + m_running.store(o.m_running.load()); + m_canceled.store(o.m_canceled.load()); + } virtual void process() = 0; @@ -1417,26 +1429,37 @@ struct Plater::priv } public: - using Job::Job; + //using Job::Job; + ArrangeJob(priv * pltr): Job(pltr) {} int status_range() const override { return count; } void set_count(int c) { count = c; } void process() override; - } arrange_job{m_plater}; + } arrange_job/*{m_plater}*/; class RotoptimizeJob : public Job { public: - using Job::Job; + //using Job::Job; + RotoptimizeJob(priv * pltr): Job(pltr) {} void process() override; - } rotoptimize_job{m_plater}; + } rotoptimize_job/*{m_plater}*/; - std::vector> m_jobs{arrange_job, - rotoptimize_job}; + // To create a new job, just define a new subclass of Job, implement + // the process and the optional prepare() and finalize() methods + // Register the instance of the class in the m_jobs container + // if it cannot run concurrently with other jobs in this group + + std::vector> m_jobs/*{arrange_job, + rotoptimize_job}*/; public: - - ExclusiveJobGroup(priv *_plater): m_plater(_plater) {} - + ExclusiveJobGroup(priv *_plater) + : m_plater(_plater) + , arrange_job(m_plater) + , rotoptimize_job(m_plater) + , m_jobs({arrange_job, rotoptimize_job}) + {} + void start(Jobs jid) { m_plater->background_process.stop(); stop_all(); From b0b54ed0e6fa02a97cc8409b0b5a5c44e8dc3f8f Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 19 Jun 2019 11:05:34 +0200 Subject: [PATCH 14/22] Fixed flickering of 3D view when moving objects on NVIDIA graphic cards --- src/slic3r/GUI/Plater.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 0a8499f709..8e5ba2d3fa 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1770,7 +1770,8 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) void Plater::priv::update(bool force_full_scene_refresh) { - wxWindowUpdateLocker freeze_guard(q); + // the following line, when enabled, causes flickering on NVIDIA graphics cards +// wxWindowUpdateLocker freeze_guard(q); if (get_config("autocenter") == "1") { // auto *bed_shape_opt = config->opt("bed_shape"); // const auto bed_shape = Slic3r::Polygon::new_scale(bed_shape_opt->values); From 670a5632263114efeb18b0e7f8a43a8daa3ac301 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 19 Jun 2019 12:04:11 +0200 Subject: [PATCH 15/22] Fix for issue #2536 --- src/libslic3r/ModelArrange.cpp | 50 ++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/src/libslic3r/ModelArrange.cpp b/src/libslic3r/ModelArrange.cpp index b323285ccb..fc03d0a439 100644 --- a/src/libslic3r/ModelArrange.cpp +++ b/src/libslic3r/ModelArrange.cpp @@ -318,7 +318,7 @@ class AutoArranger {}; // management and spatial index structures for acceleration. template class _ArrBase { -protected: +public: // Useful type shortcuts... using Placer = TPacker; @@ -327,6 +327,8 @@ protected: using PConfig = typename Packer::PlacementConfig; using Distance = TCoord; using Pile = TMultiShape; + +protected: Packer m_pck; PConfig m_pconf; // Placement configuration @@ -564,7 +566,10 @@ public: // 2D shape from top view. using ShapeData2D = std::vector>; -ShapeData2D projectModelFromTop(const Slic3r::Model &model, const WipeTowerInfo& wti) { +ShapeData2D projectModelFromTop(const Slic3r::Model &model, + const WipeTowerInfo &wti, + double tolerance) +{ ShapeData2D ret; // Count all the items on the bin (all the object's instances) @@ -586,21 +591,32 @@ ShapeData2D projectModelFromTop(const Slic3r::Model &model, const WipeTowerInfo& // Object instances should carry the same scaling and // x, y rotation that is why we use the first instance. { - ModelInstance *finst = objptr->instances.front(); - Vec3d rotation = finst->get_rotation(); - rotation.z() = 0.; - Transform3d trafo_instance = Geometry::assemble_transform(Vec3d::Zero(), rotation, finst->get_scaling_factor(), finst->get_mirror()); + ModelInstance *finst = objptr->instances.front(); + Vec3d rotation = finst->get_rotation(); + rotation.z() = 0.; + Transform3d trafo_instance = Geometry::assemble_transform( + Vec3d::Zero(), + rotation, + finst->get_scaling_factor(), + finst->get_mirror()); Polygon p = objptr->convex_hull_2d(trafo_instance); - assert(! p.points.empty()); - - // this may happen for malformed models, see: https://github.com/prusa3d/PrusaSlicer/issues/2209 - if (p.points.empty()) - continue; + + assert(!p.points.empty()); + // this may happen for malformed models, see: + // https://github.com/prusa3d/PrusaSlicer/issues/2209 + if (p.points.empty()) continue; + + if(tolerance > EPSILON) { + Polygons pp { p }; + pp = p.simplify(double(scaled(tolerance))); + if (!pp.empty()) p = pp.front(); + } + p.reverse(); assert(!p.is_counter_clockwise()); - p.append(p.first_point()); clpath = Slic3rMultiPoint_to_ClipperPath(p); + auto firstp = clpath.front(); clpath.emplace_back(firstp); } Vec3d rotation0 = objptr->instances.front()->get_rotation(); @@ -780,9 +796,9 @@ bool arrange(Model &model, // The model with the geometries std::function stopcondition) { bool ret = true; - + // Get the 2D projected shapes with their 3D model instance pointers - auto shapemap = arr::projectModelFromTop(model, wti); + auto shapemap = arr::projectModelFromTop(model, wti, 0.1); // Copy the references for the shapes only as the arranger expects a // sequence of objects convertible to Item or ClipperPolygon @@ -807,7 +823,7 @@ bool arrange(Model &model, // The model with the geometries static_cast(bbb.min(0)), static_cast(bbb.min(1)) }, - { + { static_cast(bbb.max(0)), static_cast(bbb.max(1)) }); @@ -881,9 +897,9 @@ void find_new_position(const Model &model, coord_t min_obj_distance, const Polyline &bed, WipeTowerInfo& wti) -{ +{ // Get the 2D projected shapes with their 3D model instance pointers - auto shapemap = arr::projectModelFromTop(model, wti); + auto shapemap = arr::projectModelFromTop(model, wti, 0.1); // Copy the references for the shapes only as the arranger expects a // sequence of objects convertible to Item or ClipperPolygon From 89e39e38955b03500e4e08388200168cb1f5bb0c Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 19 Jun 2019 13:19:11 +0200 Subject: [PATCH 16/22] Eliminate magic constant --- src/libslic3r/ModelArrange.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/ModelArrange.cpp b/src/libslic3r/ModelArrange.cpp index fc03d0a439..a440c3999d 100644 --- a/src/libslic3r/ModelArrange.cpp +++ b/src/libslic3r/ModelArrange.cpp @@ -782,6 +782,8 @@ BedShapeHint bedShape(const Polyline &bed) { return ret; } +static const SLIC3R_CONSTEXPR double SIMPLIFY_TOLERANCE_MM = 0.1; + // The final client function to arrange the Model. A progress indicator and // a stop predicate can be also be passed to control the process. bool arrange(Model &model, // The model with the geometries @@ -798,7 +800,7 @@ bool arrange(Model &model, // The model with the geometries bool ret = true; // Get the 2D projected shapes with their 3D model instance pointers - auto shapemap = arr::projectModelFromTop(model, wti, 0.1); + auto shapemap = arr::projectModelFromTop(model, wti, SIMPLIFY_TOLERANCE_MM); // Copy the references for the shapes only as the arranger expects a // sequence of objects convertible to Item or ClipperPolygon @@ -899,7 +901,7 @@ void find_new_position(const Model &model, WipeTowerInfo& wti) { // Get the 2D projected shapes with their 3D model instance pointers - auto shapemap = arr::projectModelFromTop(model, wti, 0.1); + auto shapemap = arr::projectModelFromTop(model, wti, SIMPLIFY_TOLERANCE_MM); // Copy the references for the shapes only as the arranger expects a // sequence of objects convertible to Item or ClipperPolygon From 2ae2672ee92db219ad9210ddd5288f2bd5a62fbc Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 19 Jun 2019 14:52:55 +0200 Subject: [PATCH 17/22] Building igl statically and moving to the dep scripts Fixing dep build script on Windows and removing some warnings. Use bundled igl by default. Not building with the dependency scripts if not explicitly stated. This way, it will stay in Fix the libigl patch to include C source files in header only mode. --- CMakeLists.txt | 6 +- deps/CMakeLists.txt | 2 + deps/deps-unix-common.cmake | 30 ++++++- deps/deps-windows.cmake | 45 ++++++++++ deps/igl-fixes.patch | 87 +++++++++++++++++++ src/CMakeLists.txt | 1 + src/libigl/CMakeLists.txt | 14 +++ src/{ => libigl}/igl/AABB.cpp | 0 src/{ => libigl}/igl/AABB.h | 0 src/{ => libigl}/igl/ARAPEnergyType.h | 0 src/{ => libigl}/igl/AtA_cached.cpp | 0 src/{ => libigl}/igl/AtA_cached.h | 0 src/{ => libigl}/igl/C_STR.h | 0 src/{ => libigl}/igl/Camera.h | 0 src/{ => libigl}/igl/EPS.cpp | 0 src/{ => libigl}/igl/EPS.h | 0 src/{ => libigl}/igl/HalfEdgeIterator.cpp | 0 src/{ => libigl}/igl/HalfEdgeIterator.h | 0 src/{ => libigl}/igl/Hit.h | 0 src/{ => libigl}/igl/IO | 0 src/{ => libigl}/igl/IndexComparison.h | 0 src/{ => libigl}/igl/LinSpaced.h | 0 src/{ => libigl}/igl/MeshBooleanType.h | 0 src/{ => libigl}/igl/NormalType.h | 0 src/{ => libigl}/igl/ONE.h | 0 src/{ => libigl}/igl/PI.h | 0 src/{ => libigl}/igl/REDRUM.h | 0 src/{ => libigl}/igl/STR.h | 0 ...osition_Givens_QR_Factorization_Kernel.hpp | 0 ...ecomposition_Jacobi_Conjugation_Kernel.hpp | 0 ...alue_Decomposition_Kernel_Declarations.hpp | 0 ...r_Value_Decomposition_Main_Kernel_Body.hpp | 0 .../Singular_Value_Decomposition_Preamble.hpp | 0 src/{ => libigl}/igl/SolverStatus.h | 0 src/{ => libigl}/igl/SortableRow.h | 0 src/{ => libigl}/igl/Timer.h | 0 src/{ => libigl}/igl/Viewport.h | 0 src/{ => libigl}/igl/WindingNumberAABB.h | 0 src/{ => libigl}/igl/WindingNumberMethod.h | 0 src/{ => libigl}/igl/WindingNumberTree.h | 0 src/{ => libigl}/igl/ZERO.h | 0 src/{ => libigl}/igl/active_set.cpp | 0 src/{ => libigl}/igl/active_set.h | 0 src/{ => libigl}/igl/adjacency_list.cpp | 0 src/{ => libigl}/igl/adjacency_list.h | 0 src/{ => libigl}/igl/adjacency_matrix.cpp | 0 src/{ => libigl}/igl/adjacency_matrix.h | 0 src/{ => libigl}/igl/all.cpp | 0 src/{ => libigl}/igl/all.h | 0 src/{ => libigl}/igl/all_edges.cpp | 0 src/{ => libigl}/igl/all_edges.h | 0 src/{ => libigl}/igl/all_pairs_distances.cpp | 0 src/{ => libigl}/igl/all_pairs_distances.h | 0 src/{ => libigl}/igl/ambient_occlusion.cpp | 0 src/{ => libigl}/igl/ambient_occlusion.h | 0 src/{ => libigl}/igl/angular_distance.cpp | 0 src/{ => libigl}/igl/angular_distance.h | 0 .../igl/anttweakbar/ReAntTweakBar.cpp | 0 .../igl/anttweakbar/ReAntTweakBar.h | 0 .../cocoa_key_to_anttweakbar_key.cpp | 0 .../cocoa_key_to_anttweakbar_key.h | 0 src/{ => libigl}/igl/any.cpp | 0 src/{ => libigl}/igl/any.h | 0 src/{ => libigl}/igl/any_of.cpp | 0 src/{ => libigl}/igl/any_of.h | 0 src/{ => libigl}/igl/arap.cpp | 0 src/{ => libigl}/igl/arap.h | 0 src/{ => libigl}/igl/arap_dof.cpp | 0 src/{ => libigl}/igl/arap_dof.h | 0 src/{ => libigl}/igl/arap_linear_block.cpp | 0 src/{ => libigl}/igl/arap_linear_block.h | 0 src/{ => libigl}/igl/arap_rhs.cpp | 0 src/{ => libigl}/igl/arap_rhs.h | 0 src/{ => libigl}/igl/average_onto_faces.cpp | 0 src/{ => libigl}/igl/average_onto_faces.h | 0 .../igl/average_onto_vertices.cpp | 0 src/{ => libigl}/igl/average_onto_vertices.h | 0 src/{ => libigl}/igl/avg_edge_length.cpp | 0 src/{ => libigl}/igl/avg_edge_length.h | 0 src/{ => libigl}/igl/axis_angle_to_quat.cpp | 0 src/{ => libigl}/igl/axis_angle_to_quat.h | 0 src/{ => libigl}/igl/barycenter.cpp | 0 src/{ => libigl}/igl/barycenter.h | 0 .../igl/barycentric_coordinates.cpp | 0 .../igl/barycentric_coordinates.h | 0 .../igl/barycentric_to_global.cpp | 0 src/{ => libigl}/igl/barycentric_to_global.h | 0 src/{ => libigl}/igl/basename.cpp | 0 src/{ => libigl}/igl/basename.h | 0 src/{ => libigl}/igl/bbw.cpp | 0 src/{ => libigl}/igl/bbw.h | 0 src/{ => libigl}/igl/bfs.cpp | 0 src/{ => libigl}/igl/bfs.h | 0 src/{ => libigl}/igl/bfs_orient.cpp | 0 src/{ => libigl}/igl/bfs_orient.h | 0 .../igl/biharmonic_coordinates.cpp | 0 src/{ => libigl}/igl/biharmonic_coordinates.h | 0 .../bijective_composite_harmonic_mapping.cpp | 0 .../bijective_composite_harmonic_mapping.h | 0 src/{ => libigl}/igl/bone_parents.cpp | 0 src/{ => libigl}/igl/bone_parents.h | 0 src/{ => libigl}/igl/boundary_conditions.cpp | 0 src/{ => libigl}/igl/boundary_conditions.h | 0 src/{ => libigl}/igl/boundary_facets.cpp | 0 src/{ => libigl}/igl/boundary_facets.h | 0 src/{ => libigl}/igl/boundary_loop.cpp | 0 src/{ => libigl}/igl/boundary_loop.h | 0 src/{ => libigl}/igl/bounding_box.cpp | 0 src/{ => libigl}/igl/bounding_box.h | 0 .../igl/bounding_box_diagonal.cpp | 0 src/{ => libigl}/igl/bounding_box_diagonal.h | 0 .../igl/canonical_quaternions.cpp | 0 src/{ => libigl}/igl/canonical_quaternions.h | 0 src/{ => libigl}/igl/cat.cpp | 0 src/{ => libigl}/igl/cat.h | 0 src/{ => libigl}/igl/ceil.cpp | 0 src/{ => libigl}/igl/ceil.h | 0 src/{ => libigl}/igl/centroid.cpp | 0 src/{ => libigl}/igl/centroid.h | 0 src/{ => libigl}/igl/circulation.cpp | 0 src/{ => libigl}/igl/circulation.h | 0 src/{ => libigl}/igl/circumradius.cpp | 0 src/{ => libigl}/igl/circumradius.h | 0 src/{ => libigl}/igl/collapse_edge.cpp | 0 src/{ => libigl}/igl/collapse_edge.h | 0 .../igl/collapse_small_triangles.cpp | 0 .../igl/collapse_small_triangles.h | 0 src/{ => libigl}/igl/colon.cpp | 0 src/{ => libigl}/igl/colon.h | 0 src/{ => libigl}/igl/colormap.cpp | 0 src/{ => libigl}/igl/colormap.h | 0 src/{ => libigl}/igl/column_to_quats.cpp | 0 src/{ => libigl}/igl/column_to_quats.h | 0 src/{ => libigl}/igl/columnize.cpp | 0 src/{ => libigl}/igl/columnize.h | 0 src/{ => libigl}/igl/comb_cross_field.cpp | 0 src/{ => libigl}/igl/comb_cross_field.h | 0 src/{ => libigl}/igl/comb_frame_field.cpp | 0 src/{ => libigl}/igl/comb_frame_field.h | 0 src/{ => libigl}/igl/comb_line_field.cpp | 0 src/{ => libigl}/igl/comb_line_field.h | 0 src/{ => libigl}/igl/combine.cpp | 0 src/{ => libigl}/igl/combine.h | 0 src/{ => libigl}/igl/components.cpp | 0 src/{ => libigl}/igl/components.h | 0 .../igl/compute_frame_field_bisectors.cpp | 0 .../igl/compute_frame_field_bisectors.h | 0 .../igl/connect_boundary_to_infinity.cpp | 0 .../igl/connect_boundary_to_infinity.h | 0 src/{ => libigl}/igl/copyleft/README.md | 0 .../cgal/BinaryWindingNumberOperations.h | 0 .../igl/copyleft/cgal/CGAL_includes.hpp | 0 src/{ => libigl}/igl/copyleft/cgal/CSGTree.h | 0 .../cgal/RemeshSelfIntersectionsParam.h | 0 .../igl/copyleft/cgal/SelfIntersectMesh.h | 0 src/{ => libigl}/igl/copyleft/cgal/assign.cpp | 0 src/{ => libigl}/igl/copyleft/cgal/assign.h | 0 .../igl/copyleft/cgal/assign_scalar.cpp | 0 .../igl/copyleft/cgal/assign_scalar.h | 0 .../igl/copyleft/cgal/barycenter.cpp | 0 .../igl/copyleft/cgal/cell_adjacency.cpp | 0 .../igl/copyleft/cgal/cell_adjacency.h | 0 .../igl/copyleft/cgal/closest_facet.cpp | 0 .../igl/copyleft/cgal/closest_facet.h | 0 .../igl/copyleft/cgal/complex_to_mesh.cpp | 0 .../igl/copyleft/cgal/complex_to_mesh.h | 0 .../cgal/component_inside_component.cpp | 0 .../cgal/component_inside_component.h | 0 .../igl/copyleft/cgal/convex_hull.cpp | 0 .../igl/copyleft/cgal/convex_hull.h | 0 .../copyleft/cgal/delaunay_triangulation.cpp | 0 .../copyleft/cgal/delaunay_triangulation.h | 0 .../igl/copyleft/cgal/extract_cells.cpp | 0 .../igl/copyleft/cgal/extract_cells.h | 0 .../igl/copyleft/cgal/extract_feature.cpp | 0 .../igl/copyleft/cgal/extract_feature.h | 0 .../igl/copyleft/cgal/fast_winding_number.cpp | 0 .../igl/copyleft/cgal/fast_winding_number.h | 0 .../igl/copyleft/cgal/half_space_box.cpp | 0 .../igl/copyleft/cgal/half_space_box.h | 0 .../igl/copyleft/cgal/hausdorff.cpp | 0 .../igl/copyleft/cgal/hausdorff.h | 0 .../igl/copyleft/cgal/incircle.cpp | 0 src/{ => libigl}/igl/copyleft/cgal/incircle.h | 0 .../igl/copyleft/cgal/insert_into_cdt.cpp | 0 .../igl/copyleft/cgal/insert_into_cdt.h | 0 .../igl/copyleft/cgal/insphere.cpp | 0 src/{ => libigl}/igl/copyleft/cgal/insphere.h | 0 .../igl/copyleft/cgal/intersect_other.cpp | 0 .../igl/copyleft/cgal/intersect_other.h | 0 .../cgal/intersect_with_half_space.cpp | 0 .../copyleft/cgal/intersect_with_half_space.h | 0 .../cgal/lexicographic_triangulation.cpp | 0 .../cgal/lexicographic_triangulation.h | 0 .../igl/copyleft/cgal/list_to_matrix.cpp | 0 .../igl/copyleft/cgal/mesh_boolean.cpp | 0 .../igl/copyleft/cgal/mesh_boolean.h | 0 .../cgal/mesh_boolean_type_to_funcs.cpp | 0 .../cgal/mesh_boolean_type_to_funcs.h | 0 .../cgal/mesh_to_cgal_triangle_list.cpp | 0 .../cgal/mesh_to_cgal_triangle_list.h | 0 .../igl/copyleft/cgal/mesh_to_polyhedron.cpp | 0 .../igl/copyleft/cgal/mesh_to_polyhedron.h | 0 .../igl/copyleft/cgal/minkowski_sum.cpp | 0 .../igl/copyleft/cgal/minkowski_sum.h | 0 .../cgal/order_facets_around_edge.cpp | 0 .../copyleft/cgal/order_facets_around_edge.h | 0 .../cgal/order_facets_around_edges.cpp | 0 .../copyleft/cgal/order_facets_around_edges.h | 0 .../igl/copyleft/cgal/orient2D.cpp | 0 src/{ => libigl}/igl/copyleft/cgal/orient2D.h | 0 .../igl/copyleft/cgal/orient3D.cpp | 0 src/{ => libigl}/igl/copyleft/cgal/orient3D.h | 0 .../igl/copyleft/cgal/outer_element.cpp | 0 .../igl/copyleft/cgal/outer_element.h | 0 .../igl/copyleft/cgal/outer_facet.cpp | 0 .../igl/copyleft/cgal/outer_facet.h | 0 .../igl/copyleft/cgal/outer_hull.cpp | 0 .../igl/copyleft/cgal/outer_hull.h | 0 .../copyleft/cgal/peel_outer_hull_layers.cpp | 0 .../copyleft/cgal/peel_outer_hull_layers.h | 0 .../cgal/peel_winding_number_layers.cpp | 0 .../cgal/peel_winding_number_layers.h | 0 .../piecewise_constant_winding_number.cpp | 0 .../cgal/piecewise_constant_winding_number.h | 0 .../igl/copyleft/cgal/point_areas.cpp | 0 .../igl/copyleft/cgal/point_areas.h | 0 .../cgal/point_mesh_squared_distance.cpp | 0 .../cgal/point_mesh_squared_distance.h | 0 .../cgal/point_segment_squared_distance.cpp | 0 .../cgal/point_segment_squared_distance.h | 0 .../point_solid_signed_squared_distance.cpp | 0 .../point_solid_signed_squared_distance.h | 0 .../cgal/point_triangle_squared_distance.cpp | 0 .../cgal/point_triangle_squared_distance.h | 0 .../copyleft/cgal/points_inside_component.cpp | 0 .../copyleft/cgal/points_inside_component.h | 0 .../igl/copyleft/cgal/polyhedron_to_mesh.cpp | 0 .../igl/copyleft/cgal/polyhedron_to_mesh.h | 0 .../igl/copyleft/cgal/projected_cdt.cpp | 0 .../igl/copyleft/cgal/projected_cdt.h | 0 .../igl/copyleft/cgal/projected_delaunay.cpp | 0 .../igl/copyleft/cgal/projected_delaunay.h | 0 .../cgal/propagate_winding_numbers.cpp | 0 .../copyleft/cgal/propagate_winding_numbers.h | 0 .../igl/copyleft/cgal/read_triangle_mesh.cpp | 0 .../igl/copyleft/cgal/read_triangle_mesh.h | 0 .../cgal/relabel_small_immersed_cells.cpp | 0 .../cgal/relabel_small_immersed_cells.h | 0 .../copyleft/cgal/remesh_intersections.cpp | 0 .../igl/copyleft/cgal/remesh_intersections.h | 0 .../cgal/remesh_self_intersections.cpp | 0 .../copyleft/cgal/remesh_self_intersections.h | 0 .../igl/copyleft/cgal/remove_unreferenced.cpp | 0 .../copyleft/cgal/resolve_intersections.cpp | 0 .../igl/copyleft/cgal/resolve_intersections.h | 0 .../igl/copyleft/cgal/row_to_point.cpp | 0 .../igl/copyleft/cgal/row_to_point.h | 0 .../cgal/segment_segment_squared_distance.cpp | 0 .../cgal/segment_segment_squared_distance.h | 0 .../cgal/signed_distance_isosurface.cpp | 0 .../cgal/signed_distance_isosurface.h | 0 src/{ => libigl}/igl/copyleft/cgal/slice.cpp | 0 .../igl/copyleft/cgal/slice_mask.cpp | 0 .../igl/copyleft/cgal/snap_rounding.cpp | 0 .../igl/copyleft/cgal/snap_rounding.h | 0 .../cgal/string_to_mesh_boolean_type.cpp | 0 .../cgal/string_to_mesh_boolean_type.h | 0 .../igl/copyleft/cgal/subdivide_segments.cpp | 0 .../igl/copyleft/cgal/subdivide_segments.h | 0 .../igl/copyleft/cgal/submesh_aabb_tree.cpp | 0 .../igl/copyleft/cgal/submesh_aabb_tree.h | 0 .../triangle_triangle_squared_distance.cpp | 0 .../cgal/triangle_triangle_squared_distance.h | 0 .../igl/copyleft/cgal/trim_with_solid.cpp | 0 .../igl/copyleft/cgal/trim_with_solid.h | 0 src/{ => libigl}/igl/copyleft/cgal/unique.cpp | 0 .../igl/copyleft/cgal/unique_rows.cpp | 0 .../igl/copyleft/cgal/wire_mesh.cpp | 0 .../igl/copyleft/cgal/wire_mesh.h | 0 .../igl/copyleft/comiso/frame_field.cpp | 0 .../igl/copyleft/comiso/frame_field.h | 0 src/{ => libigl}/igl/copyleft/comiso/miq.cpp | 0 src/{ => libigl}/igl/copyleft/comiso/miq.h | 0 .../igl/copyleft/comiso/nrosy.cpp | 0 src/{ => libigl}/igl/copyleft/comiso/nrosy.h | 0 .../igl/copyleft/cork/from_cork_mesh.cpp | 0 .../igl/copyleft/cork/from_cork_mesh.h | 0 .../igl/copyleft/cork/mesh_boolean.cpp | 0 .../igl/copyleft/cork/mesh_boolean.h | 0 .../igl/copyleft/cork/to_cork_mesh.cpp | 0 .../igl/copyleft/cork/to_cork_mesh.h | 0 .../igl/copyleft/marching_cubes.cpp | 0 .../igl/copyleft/marching_cubes.h | 0 .../igl/copyleft/marching_cubes_tables.h | 0 .../igl/copyleft/offset_surface.cpp | 0 .../igl/copyleft/offset_surface.h | 0 .../igl/copyleft/opengl2/render_to_tga.cpp | 0 .../igl/copyleft/opengl2/render_to_tga.h | 0 .../igl/copyleft/opengl2/texture_from_tga.cpp | 0 .../igl/copyleft/opengl2/texture_from_tga.h | 0 src/{ => libigl}/igl/copyleft/opengl2/tga.cpp | 0 src/{ => libigl}/igl/copyleft/opengl2/tga.h | 0 .../igl/copyleft/progressive_hulls.cpp | 0 .../igl/copyleft/progressive_hulls.h | 0 .../progressive_hulls_cost_and_placement.cpp | 0 .../progressive_hulls_cost_and_placement.h | 0 src/{ => libigl}/igl/copyleft/quadprog.cpp | 0 src/{ => libigl}/igl/copyleft/quadprog.h | 0 .../igl/copyleft/swept_volume.cpp | 0 src/{ => libigl}/igl/copyleft/swept_volume.h | 0 src/{ => libigl}/igl/copyleft/tetgen/README | 0 src/{ => libigl}/igl/copyleft/tetgen/cdt.cpp | 0 src/{ => libigl}/igl/copyleft/tetgen/cdt.h | 0 .../igl/copyleft/tetgen/mesh_to_tetgenio.cpp | 0 .../igl/copyleft/tetgen/mesh_to_tetgenio.h | 0 .../copyleft/tetgen/mesh_with_skeleton.cpp | 0 .../igl/copyleft/tetgen/mesh_with_skeleton.h | 0 .../copyleft/tetgen/read_into_tetgenio.cpp | 0 .../igl/copyleft/tetgen/read_into_tetgenio.h | 0 .../copyleft/tetgen/tetgenio_to_tetmesh.cpp | 0 .../igl/copyleft/tetgen/tetgenio_to_tetmesh.h | 0 .../igl/copyleft/tetgen/tetrahedralize.cpp | 0 .../igl/copyleft/tetgen/tetrahedralize.h | 0 src/{ => libigl}/igl/cotmatrix.cpp | 0 src/{ => libigl}/igl/cotmatrix.h | 0 src/{ => libigl}/igl/cotmatrix_entries.cpp | 0 src/{ => libigl}/igl/cotmatrix_entries.h | 0 src/{ => libigl}/igl/count.cpp | 0 src/{ => libigl}/igl/count.h | 0 .../igl/covariance_scatter_matrix.cpp | 0 .../igl/covariance_scatter_matrix.h | 0 src/{ => libigl}/igl/cross.cpp | 0 src/{ => libigl}/igl/cross.h | 0 .../igl/cross_field_missmatch.cpp | 0 src/{ => libigl}/igl/cross_field_missmatch.h | 0 .../igl/crouzeix_raviart_cotmatrix.cpp | 0 .../igl/crouzeix_raviart_cotmatrix.h | 0 .../igl/crouzeix_raviart_massmatrix.cpp | 0 .../igl/crouzeix_raviart_massmatrix.h | 0 src/{ => libigl}/igl/cumsum.cpp | 0 src/{ => libigl}/igl/cumsum.h | 0 src/{ => libigl}/igl/cut_mesh.cpp | 0 src/{ => libigl}/igl/cut_mesh.h | 0 .../igl/cut_mesh_from_singularities.cpp | 0 .../igl/cut_mesh_from_singularities.h | 0 src/{ => libigl}/igl/cylinder.cpp | 0 src/{ => libigl}/igl/cylinder.h | 0 src/{ => libigl}/igl/dated_copy.cpp | 0 src/{ => libigl}/igl/dated_copy.h | 0 src/{ => libigl}/igl/decimate.cpp | 0 src/{ => libigl}/igl/decimate.h | 0 src/{ => libigl}/igl/deform_skeleton.cpp | 0 src/{ => libigl}/igl/deform_skeleton.h | 0 .../igl/delaunay_triangulation.cpp | 0 src/{ => libigl}/igl/delaunay_triangulation.h | 0 src/{ => libigl}/igl/deprecated.h | 0 src/{ => libigl}/igl/dfs.cpp | 0 src/{ => libigl}/igl/dfs.h | 0 src/{ => libigl}/igl/diag.cpp | 0 src/{ => libigl}/igl/diag.h | 0 src/{ => libigl}/igl/dihedral_angles.cpp | 0 src/{ => libigl}/igl/dihedral_angles.h | 0 src/{ => libigl}/igl/dijkstra.cpp | 0 src/{ => libigl}/igl/dijkstra.h | 0 .../igl/directed_edge_orientations.cpp | 0 .../igl/directed_edge_orientations.h | 0 .../igl/directed_edge_parents.cpp | 0 src/{ => libigl}/igl/directed_edge_parents.h | 0 src/{ => libigl}/igl/dirname.cpp | 0 src/{ => libigl}/igl/dirname.h | 0 src/{ => libigl}/igl/dot.cpp | 0 src/{ => libigl}/igl/dot.h | 0 src/{ => libigl}/igl/dot_row.cpp | 0 src/{ => libigl}/igl/dot_row.h | 0 src/{ => libigl}/igl/doublearea.cpp | 0 src/{ => libigl}/igl/doublearea.h | 0 src/{ => libigl}/igl/dqs.cpp | 0 src/{ => libigl}/igl/dqs.h | 0 src/{ => libigl}/igl/ears.cpp | 0 src/{ => libigl}/igl/ears.h | 0 .../igl/edge_collapse_is_valid.cpp | 0 src/{ => libigl}/igl/edge_collapse_is_valid.h | 0 src/{ => libigl}/igl/edge_flaps.cpp | 0 src/{ => libigl}/igl/edge_flaps.h | 0 src/{ => libigl}/igl/edge_lengths.cpp | 0 src/{ => libigl}/igl/edge_lengths.h | 0 src/{ => libigl}/igl/edge_topology.cpp | 0 src/{ => libigl}/igl/edge_topology.h | 0 src/{ => libigl}/igl/edges.cpp | 0 src/{ => libigl}/igl/edges.h | 0 src/{ => libigl}/igl/edges_to_path.cpp | 0 src/{ => libigl}/igl/edges_to_path.h | 0 src/{ => libigl}/igl/eigs.cpp | 0 src/{ => libigl}/igl/eigs.h | 0 .../igl/embree/EmbreeIntersector.h | 0 .../igl/embree/Embree_convenience.h | 0 .../igl/embree/ambient_occlusion.cpp | 0 .../igl/embree/ambient_occlusion.h | 0 src/{ => libigl}/igl/embree/bone_heat.cpp | 0 src/{ => libigl}/igl/embree/bone_heat.h | 0 src/{ => libigl}/igl/embree/bone_visible.cpp | 0 src/{ => libigl}/igl/embree/bone_visible.h | 0 src/{ => libigl}/igl/embree/embree2/rtcore.h | 0 .../igl/embree/embree2/rtcore.isph | 0 .../igl/embree/embree2/rtcore_geometry.h | 0 .../igl/embree/embree2/rtcore_geometry.isph | 0 .../igl/embree/embree2/rtcore_geometry_user.h | 0 .../embree/embree2/rtcore_geometry_user.isph | 0 .../igl/embree/embree2/rtcore_ray.h | 0 .../igl/embree/embree2/rtcore_ray.isph | 0 .../igl/embree/embree2/rtcore_scene.h | 0 .../igl/embree/embree2/rtcore_scene.isph | 0 .../igl/embree/line_mesh_intersection.cpp | 0 .../igl/embree/line_mesh_intersection.h | 0 .../igl/embree/reorient_facets_raycast.cpp | 0 .../igl/embree/reorient_facets_raycast.h | 0 .../igl/embree/shape_diameter_function.cpp | 0 .../igl/embree/shape_diameter_function.h | 0 .../igl/embree/unproject_in_mesh.cpp | 0 .../igl/embree/unproject_in_mesh.h | 0 .../igl/embree/unproject_onto_mesh.cpp | 0 .../igl/embree/unproject_onto_mesh.h | 0 src/{ => libigl}/igl/euler_characteristic.cpp | 0 src/{ => libigl}/igl/euler_characteristic.h | 0 src/{ => libigl}/igl/exact_geodesic.cpp | 0 src/{ => libigl}/igl/exact_geodesic.h | 0 src/{ => libigl}/igl/example_fun.cpp | 0 src/{ => libigl}/igl/example_fun.h | 0 src/{ => libigl}/igl/exterior_edges.cpp | 0 src/{ => libigl}/igl/exterior_edges.h | 0 .../igl/extract_manifold_patches.cpp | 0 .../igl/extract_manifold_patches.h | 0 .../igl/extract_non_manifold_edge_curves.cpp | 0 .../igl/extract_non_manifold_edge_curves.h | 0 src/{ => libigl}/igl/face_areas.cpp | 0 src/{ => libigl}/igl/face_areas.h | 0 src/{ => libigl}/igl/face_occurrences.cpp | 0 src/{ => libigl}/igl/face_occurrences.h | 0 src/{ => libigl}/igl/faces_first.cpp | 0 src/{ => libigl}/igl/faces_first.h | 0 src/{ => libigl}/igl/facet_components.cpp | 0 src/{ => libigl}/igl/facet_components.h | 0 .../igl/false_barycentric_subdivision.cpp | 0 .../igl/false_barycentric_subdivision.h | 0 src/{ => libigl}/igl/fast_winding_number.cpp | 0 src/{ => libigl}/igl/fast_winding_number.h | 0 .../igl/file_contents_as_string.cpp | 0 .../igl/file_contents_as_string.h | 0 src/{ => libigl}/igl/file_dialog_open.cpp | 0 src/{ => libigl}/igl/file_dialog_open.h | 0 src/{ => libigl}/igl/file_dialog_save.cpp | 0 src/{ => libigl}/igl/file_dialog_save.h | 0 src/{ => libigl}/igl/file_exists.cpp | 0 src/{ => libigl}/igl/file_exists.h | 0 src/{ => libigl}/igl/find.cpp | 0 src/{ => libigl}/igl/find.h | 0 .../igl/find_cross_field_singularities.cpp | 0 .../igl/find_cross_field_singularities.h | 0 src/{ => libigl}/igl/find_zero.cpp | 0 src/{ => libigl}/igl/find_zero.h | 0 src/{ => libigl}/igl/fit_plane.cpp | 0 src/{ => libigl}/igl/fit_plane.h | 0 src/{ => libigl}/igl/fit_rotations.cpp | 0 src/{ => libigl}/igl/fit_rotations.h | 0 .../igl/flip_avoiding_line_search.cpp | 0 .../igl/flip_avoiding_line_search.h | 0 src/{ => libigl}/igl/flip_edge.cpp | 0 src/{ => libigl}/igl/flip_edge.h | 0 src/{ => libigl}/igl/flipped_triangles.cpp | 0 src/{ => libigl}/igl/flipped_triangles.h | 0 src/{ => libigl}/igl/flood_fill.cpp | 0 src/{ => libigl}/igl/flood_fill.h | 0 src/{ => libigl}/igl/floor.cpp | 0 src/{ => libigl}/igl/floor.h | 0 src/{ => libigl}/igl/for_each.h | 0 src/{ => libigl}/igl/forward_kinematics.cpp | 0 src/{ => libigl}/igl/forward_kinematics.h | 0 src/{ => libigl}/igl/frame_field_deformer.cpp | 0 src/{ => libigl}/igl/frame_field_deformer.h | 0 src/{ => libigl}/igl/frame_to_cross_field.cpp | 0 src/{ => libigl}/igl/frame_to_cross_field.h | 0 src/{ => libigl}/igl/frustum.cpp | 0 src/{ => libigl}/igl/frustum.h | 0 src/{ => libigl}/igl/gaussian_curvature.cpp | 0 src/{ => libigl}/igl/gaussian_curvature.h | 0 src/{ => libigl}/igl/get_seconds.cpp | 0 src/{ => libigl}/igl/get_seconds.h | 0 src/{ => libigl}/igl/get_seconds_hires.cpp | 0 src/{ => libigl}/igl/get_seconds_hires.h | 0 src/{ => libigl}/igl/grad.cpp | 0 src/{ => libigl}/igl/grad.h | 0 src/{ => libigl}/igl/grid.cpp | 0 src/{ => libigl}/igl/grid.h | 0 src/{ => libigl}/igl/grid_search.cpp | 0 src/{ => libigl}/igl/grid_search.h | 0 src/{ => libigl}/igl/group_sum_matrix.cpp | 0 src/{ => libigl}/igl/group_sum_matrix.h | 0 src/{ => libigl}/igl/guess_extension.cpp | 0 src/{ => libigl}/igl/guess_extension.h | 0 src/{ => libigl}/igl/harmonic.cpp | 0 src/{ => libigl}/igl/harmonic.h | 0 src/{ => libigl}/igl/harwell_boeing.cpp | 0 src/{ => libigl}/igl/harwell_boeing.h | 0 src/{ => libigl}/igl/hausdorff.cpp | 0 src/{ => libigl}/igl/hausdorff.h | 0 src/{ => libigl}/igl/hessian.cpp | 0 src/{ => libigl}/igl/hessian.h | 0 src/{ => libigl}/igl/hessian_energy.cpp | 0 src/{ => libigl}/igl/hessian_energy.h | 0 src/{ => libigl}/igl/histc.cpp | 0 src/{ => libigl}/igl/histc.h | 0 src/{ => libigl}/igl/hsv_to_rgb.cpp | 0 src/{ => libigl}/igl/hsv_to_rgb.h | 0 src/{ => libigl}/igl/igl_inline.h | 0 src/{ => libigl}/igl/in_element.cpp | 0 src/{ => libigl}/igl/in_element.h | 0 .../igl/infinite_cost_stopping_condition.cpp | 0 .../igl/infinite_cost_stopping_condition.h | 0 src/{ => libigl}/igl/inradius.cpp | 0 src/{ => libigl}/igl/inradius.h | 0 src/{ => libigl}/igl/internal_angles.cpp | 0 src/{ => libigl}/igl/internal_angles.h | 0 src/{ => libigl}/igl/intersect.cpp | 0 src/{ => libigl}/igl/intersect.h | 0 src/{ => libigl}/igl/invert_diag.cpp | 0 src/{ => libigl}/igl/invert_diag.h | 0 src/{ => libigl}/igl/is_border_vertex.cpp | 0 src/{ => libigl}/igl/is_border_vertex.h | 0 src/{ => libigl}/igl/is_boundary_edge.cpp | 0 src/{ => libigl}/igl/is_boundary_edge.h | 0 src/{ => libigl}/igl/is_dir.cpp | 0 src/{ => libigl}/igl/is_dir.h | 0 src/{ => libigl}/igl/is_edge_manifold.cpp | 0 src/{ => libigl}/igl/is_edge_manifold.h | 0 src/{ => libigl}/igl/is_file.cpp | 0 src/{ => libigl}/igl/is_file.h | 0 src/{ => libigl}/igl/is_irregular_vertex.cpp | 0 src/{ => libigl}/igl/is_irregular_vertex.h | 0 src/{ => libigl}/igl/is_planar.cpp | 0 src/{ => libigl}/igl/is_planar.h | 0 src/{ => libigl}/igl/is_readable.cpp | 0 src/{ => libigl}/igl/is_readable.h | 0 src/{ => libigl}/igl/is_sparse.cpp | 0 src/{ => libigl}/igl/is_sparse.h | 0 src/{ => libigl}/igl/is_stl.cpp | 0 src/{ => libigl}/igl/is_stl.h | 0 src/{ => libigl}/igl/is_symmetric.cpp | 0 src/{ => libigl}/igl/is_symmetric.h | 0 src/{ => libigl}/igl/is_vertex_manifold.cpp | 0 src/{ => libigl}/igl/is_vertex_manifold.h | 0 src/{ => libigl}/igl/is_writable.cpp | 0 src/{ => libigl}/igl/is_writable.h | 0 src/{ => libigl}/igl/isdiag.cpp | 0 src/{ => libigl}/igl/isdiag.h | 0 src/{ => libigl}/igl/ismember.cpp | 0 src/{ => libigl}/igl/ismember.h | 0 src/{ => libigl}/igl/isolines.cpp | 0 src/{ => libigl}/igl/isolines.h | 0 src/{ => libigl}/igl/jet.cpp | 0 src/{ => libigl}/igl/jet.h | 0 src/{ => libigl}/igl/knn.cpp | 0 src/{ => libigl}/igl/knn.h | 0 src/{ => libigl}/igl/launch_medit.cpp | 0 src/{ => libigl}/igl/launch_medit.h | 0 src/{ => libigl}/igl/lbs_matrix.cpp | 0 src/{ => libigl}/igl/lbs_matrix.h | 0 .../igl/lexicographic_triangulation.cpp | 0 .../igl/lexicographic_triangulation.h | 0 src/{ => libigl}/igl/lim/lim.cpp | 0 src/{ => libigl}/igl/lim/lim.h | 0 src/{ => libigl}/igl/limit_faces.cpp | 0 src/{ => libigl}/igl/limit_faces.h | 0 src/{ => libigl}/igl/line_field_missmatch.cpp | 0 src/{ => libigl}/igl/line_field_missmatch.h | 0 src/{ => libigl}/igl/line_search.cpp | 0 src/{ => libigl}/igl/line_search.h | 0 .../igl/line_segment_in_rectangle.cpp | 0 .../igl/line_segment_in_rectangle.h | 0 src/{ => libigl}/igl/linprog.cpp | 0 src/{ => libigl}/igl/linprog.h | 0 src/{ => libigl}/igl/list_to_matrix.cpp | 0 src/{ => libigl}/igl/list_to_matrix.h | 0 src/{ => libigl}/igl/local_basis.cpp | 0 src/{ => libigl}/igl/local_basis.h | 0 src/{ => libigl}/igl/look_at.cpp | 0 src/{ => libigl}/igl/look_at.h | 0 src/{ => libigl}/igl/loop.cpp | 0 src/{ => libigl}/igl/loop.h | 0 src/{ => libigl}/igl/lscm.cpp | 0 src/{ => libigl}/igl/lscm.h | 0 .../igl/map_vertices_to_circle.cpp | 0 src/{ => libigl}/igl/map_vertices_to_circle.h | 0 src/{ => libigl}/igl/massmatrix.cpp | 0 src/{ => libigl}/igl/massmatrix.h | 0 src/{ => libigl}/igl/mat_max.cpp | 0 src/{ => libigl}/igl/mat_max.h | 0 src/{ => libigl}/igl/mat_min.cpp | 0 src/{ => libigl}/igl/mat_min.h | 0 src/{ => libigl}/igl/mat_to_quat.cpp | 0 src/{ => libigl}/igl/mat_to_quat.h | 0 src/{ => libigl}/igl/material_colors.h | 0 src/{ => libigl}/igl/matlab/MatlabWorkspace.h | 0 src/{ => libigl}/igl/matlab/MexStream.h | 0 .../igl/matlab/matlabinterface.cpp | 0 src/{ => libigl}/igl/matlab/matlabinterface.h | 0 src/{ => libigl}/igl/matlab/mexErrMsgTxt.cpp | 0 src/{ => libigl}/igl/matlab/mexErrMsgTxt.h | 0 src/{ => libigl}/igl/matlab/parse_rhs.cpp | 0 src/{ => libigl}/igl/matlab/parse_rhs.h | 0 src/{ => libigl}/igl/matlab/prepare_lhs.cpp | 0 src/{ => libigl}/igl/matlab/prepare_lhs.h | 0 src/{ => libigl}/igl/matlab/requires_arg.cpp | 0 src/{ => libigl}/igl/matlab/requires_arg.h | 0 src/{ => libigl}/igl/matlab/validate_arg.cpp | 0 src/{ => libigl}/igl/matlab/validate_arg.h | 0 src/{ => libigl}/igl/matlab_format.cpp | 0 src/{ => libigl}/igl/matlab_format.h | 0 src/{ => libigl}/igl/matrix_to_list.cpp | 0 src/{ => libigl}/igl/matrix_to_list.h | 0 src/{ => libigl}/igl/max.cpp | 0 src/{ => libigl}/igl/max.h | 0 .../igl/max_faces_stopping_condition.cpp | 0 .../igl/max_faces_stopping_condition.h | 0 src/{ => libigl}/igl/max_size.cpp | 0 src/{ => libigl}/igl/max_size.h | 0 src/{ => libigl}/igl/median.cpp | 0 src/{ => libigl}/igl/median.h | 0 src/{ => libigl}/igl/min.cpp | 0 src/{ => libigl}/igl/min.h | 0 src/{ => libigl}/igl/min_quad_dense.cpp | 0 src/{ => libigl}/igl/min_quad_dense.h | 0 src/{ => libigl}/igl/min_quad_with_fixed.cpp | 0 src/{ => libigl}/igl/min_quad_with_fixed.h | 0 src/{ => libigl}/igl/min_size.cpp | 0 src/{ => libigl}/igl/min_size.h | 0 src/{ => libigl}/igl/mod.cpp | 0 src/{ => libigl}/igl/mod.h | 0 src/{ => libigl}/igl/mode.cpp | 0 src/{ => libigl}/igl/mode.h | 0 src/{ => libigl}/igl/mosek/bbw.cpp | 0 src/{ => libigl}/igl/mosek/bbw.h | 0 src/{ => libigl}/igl/mosek/mosek_guarded.cpp | 0 src/{ => libigl}/igl/mosek/mosek_guarded.h | 0 src/{ => libigl}/igl/mosek/mosek_linprog.cpp | 0 src/{ => libigl}/igl/mosek/mosek_linprog.h | 0 src/{ => libigl}/igl/mosek/mosek_quadprog.cpp | 0 src/{ => libigl}/igl/mosek/mosek_quadprog.h | 0 src/{ => libigl}/igl/mvc.cpp | 0 src/{ => libigl}/igl/mvc.h | 0 src/{ => libigl}/igl/nchoosek.cpp | 0 src/{ => libigl}/igl/nchoosek.h | 0 src/{ => libigl}/igl/next_filename.cpp | 0 src/{ => libigl}/igl/next_filename.h | 0 src/{ => libigl}/igl/normal_derivative.cpp | 0 src/{ => libigl}/igl/normal_derivative.h | 0 src/{ => libigl}/igl/normalize_quat.cpp | 0 src/{ => libigl}/igl/normalize_quat.h | 0 .../igl/normalize_row_lengths.cpp | 0 src/{ => libigl}/igl/normalize_row_lengths.h | 0 src/{ => libigl}/igl/normalize_row_sums.cpp | 0 src/{ => libigl}/igl/normalize_row_sums.h | 0 src/{ => libigl}/igl/null.cpp | 0 src/{ => libigl}/igl/null.h | 0 src/{ => libigl}/igl/octree.cpp | 0 src/{ => libigl}/igl/octree.h | 0 src/{ => libigl}/igl/on_boundary.cpp | 0 src/{ => libigl}/igl/on_boundary.h | 0 src/{ => libigl}/igl/opengl/MeshGL.cpp | 0 src/{ => libigl}/igl/opengl/MeshGL.h | 0 src/{ => libigl}/igl/opengl/ViewerCore.cpp | 0 src/{ => libigl}/igl/opengl/ViewerCore.h | 0 src/{ => libigl}/igl/opengl/ViewerData.cpp | 0 src/{ => libigl}/igl/opengl/ViewerData.h | 0 .../igl/opengl/bind_vertex_attrib_array.cpp | 0 .../igl/opengl/bind_vertex_attrib_array.h | 0 .../igl/opengl/create_index_vbo.cpp | 0 .../igl/opengl/create_index_vbo.h | 0 .../igl/opengl/create_mesh_vbo.cpp | 0 src/{ => libigl}/igl/opengl/create_mesh_vbo.h | 0 .../igl/opengl/create_shader_program.cpp | 0 .../igl/opengl/create_shader_program.h | 0 .../igl/opengl/create_vector_vbo.cpp | 0 .../igl/opengl/create_vector_vbo.h | 0 .../igl/opengl/destroy_shader_program.cpp | 0 .../igl/opengl/destroy_shader_program.h | 0 src/{ => libigl}/igl/opengl/gl.h | 0 src/{ => libigl}/igl/opengl/gl_type_size.cpp | 0 src/{ => libigl}/igl/opengl/gl_type_size.h | 0 src/{ => libigl}/igl/opengl/glfw/Viewer.cpp | 0 src/{ => libigl}/igl/opengl/glfw/Viewer.h | 0 .../igl/opengl/glfw/ViewerPlugin.h | 0 .../igl/opengl/glfw/background_window.cpp | 0 .../igl/opengl/glfw/background_window.h | 0 .../igl/opengl/glfw/imgui/ImGuiHelpers.h | 0 .../igl/opengl/glfw/imgui/ImGuiMenu.cpp | 0 .../igl/opengl/glfw/imgui/ImGuiMenu.h | 0 .../igl/opengl/glfw/map_texture.cpp | 0 .../igl/opengl/glfw/map_texture.h | 0 .../igl/opengl/init_render_to_texture.cpp | 0 .../igl/opengl/init_render_to_texture.h | 0 src/{ => libigl}/igl/opengl/load_shader.cpp | 0 src/{ => libigl}/igl/opengl/load_shader.h | 0 .../igl/opengl/print_program_info_log.cpp | 0 .../igl/opengl/print_program_info_log.h | 0 .../igl/opengl/print_shader_info_log.cpp | 0 .../igl/opengl/print_shader_info_log.h | 0 .../igl/opengl/report_gl_error.cpp | 0 src/{ => libigl}/igl/opengl/report_gl_error.h | 0 .../igl/opengl/uniform_type_to_string.cpp | 0 .../igl/opengl/uniform_type_to_string.h | 0 src/{ => libigl}/igl/opengl/vertex_array.cpp | 0 src/{ => libigl}/igl/opengl/vertex_array.h | 0 .../igl/opengl2/MouseController.h | 0 src/{ => libigl}/igl/opengl2/RotateWidget.h | 0 .../igl/opengl2/TranslateWidget.h | 0 .../igl/opengl2/draw_beach_ball.cpp | 0 .../igl/opengl2/draw_beach_ball.h | 0 src/{ => libigl}/igl/opengl2/draw_floor.cpp | 0 src/{ => libigl}/igl/opengl2/draw_floor.h | 0 src/{ => libigl}/igl/opengl2/draw_mesh.cpp | 0 src/{ => libigl}/igl/opengl2/draw_mesh.h | 0 src/{ => libigl}/igl/opengl2/draw_point.cpp | 0 src/{ => libigl}/igl/opengl2/draw_point.h | 0 .../igl/opengl2/draw_rectangular_marquee.cpp | 0 .../igl/opengl2/draw_rectangular_marquee.h | 0 .../igl/opengl2/draw_skeleton_3d.cpp | 0 .../igl/opengl2/draw_skeleton_3d.h | 0 .../opengl2/draw_skeleton_vector_graphics.cpp | 0 .../opengl2/draw_skeleton_vector_graphics.h | 0 src/{ => libigl}/igl/opengl2/flare_textures.h | 0 src/{ => libigl}/igl/opengl2/gl.h | 0 src/{ => libigl}/igl/opengl2/glext.h | 0 src/{ => libigl}/igl/opengl2/glu.h | 0 src/{ => libigl}/igl/opengl2/lens_flare.cpp | 0 src/{ => libigl}/igl/opengl2/lens_flare.h | 0 .../igl/opengl2/model_proj_viewport.cpp | 0 .../igl/opengl2/model_proj_viewport.h | 0 src/{ => libigl}/igl/opengl2/print_gl_get.cpp | 0 src/{ => libigl}/igl/opengl2/print_gl_get.h | 0 src/{ => libigl}/igl/opengl2/project.cpp | 0 src/{ => libigl}/igl/opengl2/project.h | 0 src/{ => libigl}/igl/opengl2/right_axis.cpp | 0 src/{ => libigl}/igl/opengl2/right_axis.h | 0 src/{ => libigl}/igl/opengl2/shine_textures.h | 0 .../igl/opengl2/sort_triangles.cpp | 0 src/{ => libigl}/igl/opengl2/sort_triangles.h | 0 src/{ => libigl}/igl/opengl2/unproject.cpp | 0 src/{ => libigl}/igl/opengl2/unproject.h | 0 .../igl/opengl2/unproject_to_zero_plane.cpp | 0 .../igl/opengl2/unproject_to_zero_plane.h | 0 src/{ => libigl}/igl/opengl2/up_axis.cpp | 0 src/{ => libigl}/igl/opengl2/up_axis.h | 0 src/{ => libigl}/igl/opengl2/view_axis.cpp | 0 src/{ => libigl}/igl/opengl2/view_axis.h | 0 src/{ => libigl}/igl/orient_outward.cpp | 0 src/{ => libigl}/igl/orient_outward.h | 0 src/{ => libigl}/igl/orientable_patches.cpp | 0 src/{ => libigl}/igl/orientable_patches.h | 0 src/{ => libigl}/igl/oriented_facets.cpp | 0 src/{ => libigl}/igl/oriented_facets.h | 0 src/{ => libigl}/igl/orth.cpp | 0 src/{ => libigl}/igl/orth.h | 0 src/{ => libigl}/igl/ortho.cpp | 0 src/{ => libigl}/igl/ortho.h | 0 src/{ => libigl}/igl/outer_element.cpp | 0 src/{ => libigl}/igl/outer_element.h | 0 src/{ => libigl}/igl/parallel_for.h | 0 .../igl/parallel_transport_angles.cpp | 0 .../igl/parallel_transport_angles.h | 0 src/{ => libigl}/igl/partition.cpp | 0 src/{ => libigl}/igl/partition.h | 0 src/{ => libigl}/igl/parula.cpp | 0 src/{ => libigl}/igl/parula.h | 0 src/{ => libigl}/igl/path_to_executable.cpp | 0 src/{ => libigl}/igl/path_to_executable.h | 0 src/{ => libigl}/igl/pathinfo.cpp | 0 src/{ => libigl}/igl/pathinfo.h | 0 src/{ => libigl}/igl/per_corner_normals.cpp | 0 src/{ => libigl}/igl/per_corner_normals.h | 0 src/{ => libigl}/igl/per_edge_normals.cpp | 0 src/{ => libigl}/igl/per_edge_normals.h | 0 src/{ => libigl}/igl/per_face_normals.cpp | 0 src/{ => libigl}/igl/per_face_normals.h | 0 .../igl/per_vertex_attribute_smoothing.cpp | 0 .../igl/per_vertex_attribute_smoothing.h | 0 src/{ => libigl}/igl/per_vertex_normals.cpp | 0 src/{ => libigl}/igl/per_vertex_normals.h | 0 .../per_vertex_point_to_plane_quadrics.cpp | 0 .../igl/per_vertex_point_to_plane_quadrics.h | 0 .../igl/piecewise_constant_winding_number.cpp | 0 .../igl/piecewise_constant_winding_number.h | 0 src/{ => libigl}/igl/pinv.cpp | 0 src/{ => libigl}/igl/pinv.h | 0 src/{ => libigl}/igl/planarize_quad_mesh.cpp | 0 src/{ => libigl}/igl/planarize_quad_mesh.h | 0 src/{ => libigl}/igl/ply.h | 0 src/{ => libigl}/igl/png/readPNG.cpp | 0 src/{ => libigl}/igl/png/readPNG.h | 0 src/{ => libigl}/igl/png/render_to_png.cpp | 0 src/{ => libigl}/igl/png/render_to_png.h | 0 .../igl/png/render_to_png_async.cpp | 0 .../igl/png/render_to_png_async.h | 0 .../igl/png/texture_from_file.cpp | 0 src/{ => libigl}/igl/png/texture_from_file.h | 0 src/{ => libigl}/igl/png/texture_from_png.cpp | 0 src/{ => libigl}/igl/png/texture_from_png.h | 0 src/{ => libigl}/igl/png/writePNG.cpp | 0 src/{ => libigl}/igl/png/writePNG.h | 0 src/{ => libigl}/igl/point_in_circle.cpp | 0 src/{ => libigl}/igl/point_in_circle.h | 0 src/{ => libigl}/igl/point_in_poly.cpp | 0 src/{ => libigl}/igl/point_in_poly.h | 0 .../igl/point_mesh_squared_distance.cpp | 0 .../igl/point_mesh_squared_distance.h | 0 .../igl/point_simplex_squared_distance.cpp | 0 .../igl/point_simplex_squared_distance.h | 0 src/{ => libigl}/igl/polar_dec.cpp | 0 src/{ => libigl}/igl/polar_dec.h | 0 src/{ => libigl}/igl/polar_svd.cpp | 0 src/{ => libigl}/igl/polar_svd.h | 0 src/{ => libigl}/igl/polar_svd3x3.cpp | 0 src/{ => libigl}/igl/polar_svd3x3.h | 0 .../igl/polygon_mesh_to_triangle_mesh.cpp | 0 .../igl/polygon_mesh_to_triangle_mesh.h | 0 src/{ => libigl}/igl/principal_curvature.cpp | 0 src/{ => libigl}/igl/principal_curvature.h | 0 src/{ => libigl}/igl/print_ijv.cpp | 0 src/{ => libigl}/igl/print_ijv.h | 0 src/{ => libigl}/igl/print_vector.cpp | 0 src/{ => libigl}/igl/print_vector.h | 0 src/{ => libigl}/igl/procrustes.cpp | 0 src/{ => libigl}/igl/procrustes.h | 0 src/{ => libigl}/igl/project.cpp | 0 src/{ => libigl}/igl/project.h | 0 .../igl/project_isometrically_to_plane.cpp | 0 .../igl/project_isometrically_to_plane.h | 0 src/{ => libigl}/igl/project_to_line.cpp | 0 src/{ => libigl}/igl/project_to_line.h | 0 .../igl/project_to_line_segment.cpp | 0 .../igl/project_to_line_segment.h | 0 src/{ => libigl}/igl/pseudonormal_test.cpp | 0 src/{ => libigl}/igl/pseudonormal_test.h | 0 src/{ => libigl}/igl/pso.cpp | 0 src/{ => libigl}/igl/pso.h | 0 src/{ => libigl}/igl/qslim.cpp | 0 src/{ => libigl}/igl/qslim.h | 0 .../qslim_optimal_collapse_edge_callbacks.cpp | 0 .../qslim_optimal_collapse_edge_callbacks.h | 0 src/{ => libigl}/igl/quad_planarity.cpp | 0 src/{ => libigl}/igl/quad_planarity.h | 0 .../igl/quadric_binary_plus_operator.cpp | 0 .../igl/quadric_binary_plus_operator.h | 0 src/{ => libigl}/igl/quat_conjugate.cpp | 0 src/{ => libigl}/igl/quat_conjugate.h | 0 src/{ => libigl}/igl/quat_mult.cpp | 0 src/{ => libigl}/igl/quat_mult.h | 0 src/{ => libigl}/igl/quat_to_axis_angle.cpp | 0 src/{ => libigl}/igl/quat_to_axis_angle.h | 0 src/{ => libigl}/igl/quat_to_mat.cpp | 0 src/{ => libigl}/igl/quat_to_mat.h | 0 src/{ => libigl}/igl/quats_to_column.cpp | 0 src/{ => libigl}/igl/quats_to_column.h | 0 .../igl/ramer_douglas_peucker.cpp | 0 src/{ => libigl}/igl/ramer_douglas_peucker.h | 0 src/{ => libigl}/igl/random_dir.cpp | 0 src/{ => libigl}/igl/random_dir.h | 0 .../igl/random_points_on_mesh.cpp | 0 src/{ => libigl}/igl/random_points_on_mesh.h | 0 src/{ => libigl}/igl/random_quaternion.cpp | 0 src/{ => libigl}/igl/random_quaternion.h | 0 src/{ => libigl}/igl/random_search.cpp | 0 src/{ => libigl}/igl/random_search.h | 0 src/{ => libigl}/igl/randperm.cpp | 0 src/{ => libigl}/igl/randperm.h | 0 src/{ => libigl}/igl/ray_box_intersect.cpp | 0 src/{ => libigl}/igl/ray_box_intersect.h | 0 src/{ => libigl}/igl/ray_mesh_intersect.cpp | 0 src/{ => libigl}/igl/ray_mesh_intersect.h | 0 src/{ => libigl}/igl/ray_sphere_intersect.cpp | 0 src/{ => libigl}/igl/ray_sphere_intersect.h | 0 src/{ => libigl}/igl/raytri.c | 0 src/{ => libigl}/igl/readBF.cpp | 0 src/{ => libigl}/igl/readBF.h | 0 src/{ => libigl}/igl/readCSV.cpp | 0 src/{ => libigl}/igl/readCSV.h | 0 src/{ => libigl}/igl/readDMAT.cpp | 0 src/{ => libigl}/igl/readDMAT.h | 0 src/{ => libigl}/igl/readMESH.cpp | 0 src/{ => libigl}/igl/readMESH.h | 0 src/{ => libigl}/igl/readMSH.cpp | 0 src/{ => libigl}/igl/readMSH.h | 0 src/{ => libigl}/igl/readNODE.cpp | 0 src/{ => libigl}/igl/readNODE.h | 0 src/{ => libigl}/igl/readOBJ.cpp | 0 src/{ => libigl}/igl/readOBJ.h | 0 src/{ => libigl}/igl/readOFF.cpp | 0 src/{ => libigl}/igl/readOFF.h | 0 src/{ => libigl}/igl/readPLY.cpp | 0 src/{ => libigl}/igl/readPLY.h | 0 src/{ => libigl}/igl/readSTL.cpp | 0 src/{ => libigl}/igl/readSTL.h | 0 src/{ => libigl}/igl/readTGF.cpp | 0 src/{ => libigl}/igl/readTGF.h | 0 src/{ => libigl}/igl/readWRL.cpp | 0 src/{ => libigl}/igl/readWRL.h | 0 src/{ => libigl}/igl/read_triangle_mesh.cpp | 0 src/{ => libigl}/igl/read_triangle_mesh.h | 0 src/{ => libigl}/igl/redux.h | 0 src/{ => libigl}/igl/remesh_along_isoline.cpp | 0 src/{ => libigl}/igl/remesh_along_isoline.h | 0 .../igl/remove_duplicate_vertices.cpp | 0 .../igl/remove_duplicate_vertices.h | 0 src/{ => libigl}/igl/remove_duplicates.cpp | 0 src/{ => libigl}/igl/remove_duplicates.h | 0 src/{ => libigl}/igl/remove_unreferenced.cpp | 0 src/{ => libigl}/igl/remove_unreferenced.h | 0 src/{ => libigl}/igl/reorder.cpp | 0 src/{ => libigl}/igl/reorder.h | 0 src/{ => libigl}/igl/repdiag.cpp | 0 src/{ => libigl}/igl/repdiag.h | 0 src/{ => libigl}/igl/repmat.cpp | 0 src/{ => libigl}/igl/repmat.h | 0 .../igl/resolve_duplicated_faces.cpp | 0 .../igl/resolve_duplicated_faces.h | 0 src/{ => libigl}/igl/rgb_to_hsv.cpp | 0 src/{ => libigl}/igl/rgb_to_hsv.h | 0 src/{ => libigl}/igl/rotate_by_quat.cpp | 0 src/{ => libigl}/igl/rotate_by_quat.h | 0 src/{ => libigl}/igl/rotate_vectors.cpp | 0 src/{ => libigl}/igl/rotate_vectors.h | 0 .../igl/rotation_matrix_from_directions.cpp | 0 .../igl/rotation_matrix_from_directions.h | 0 src/{ => libigl}/igl/round.cpp | 0 src/{ => libigl}/igl/round.h | 0 src/{ => libigl}/igl/rows_to_matrix.cpp | 0 src/{ => libigl}/igl/rows_to_matrix.h | 0 src/{ => libigl}/igl/sample_edges.cpp | 0 src/{ => libigl}/igl/sample_edges.h | 0 src/{ => libigl}/igl/seam_edges.cpp | 0 src/{ => libigl}/igl/seam_edges.h | 0 .../igl/segment_segment_intersect.cpp | 0 .../igl/segment_segment_intersect.h | 0 src/{ => libigl}/igl/serialize.h | 0 src/{ => libigl}/igl/setdiff.cpp | 0 src/{ => libigl}/igl/setdiff.h | 0 src/{ => libigl}/igl/setunion.cpp | 0 src/{ => libigl}/igl/setunion.h | 0 src/{ => libigl}/igl/setxor.cpp | 0 src/{ => libigl}/igl/setxor.h | 0 .../igl/shape_diameter_function.cpp | 0 .../igl/shape_diameter_function.h | 0 src/{ => libigl}/igl/shapeup.cpp | 0 src/{ => libigl}/igl/shapeup.h | 0 .../igl/shortest_edge_and_midpoint.cpp | 0 .../igl/shortest_edge_and_midpoint.h | 0 src/{ => libigl}/igl/signed_angle.cpp | 0 src/{ => libigl}/igl/signed_angle.h | 0 src/{ => libigl}/igl/signed_distance.cpp | 0 src/{ => libigl}/igl/signed_distance.h | 0 src/{ => libigl}/igl/simplify_polyhedron.cpp | 0 src/{ => libigl}/igl/simplify_polyhedron.h | 0 src/{ => libigl}/igl/slice.cpp | 0 src/{ => libigl}/igl/slice.h | 0 src/{ => libigl}/igl/slice_cached.cpp | 0 src/{ => libigl}/igl/slice_cached.h | 0 src/{ => libigl}/igl/slice_into.cpp | 0 src/{ => libigl}/igl/slice_into.h | 0 src/{ => libigl}/igl/slice_mask.cpp | 0 src/{ => libigl}/igl/slice_mask.h | 0 src/{ => libigl}/igl/slice_tets.cpp | 0 src/{ => libigl}/igl/slice_tets.h | 0 src/{ => libigl}/igl/slim.cpp | 0 src/{ => libigl}/igl/slim.h | 0 src/{ => libigl}/igl/snap_points.cpp | 0 src/{ => libigl}/igl/snap_points.h | 0 .../igl/snap_to_canonical_view_quat.cpp | 0 .../igl/snap_to_canonical_view_quat.h | 0 src/{ => libigl}/igl/snap_to_fixed_up.cpp | 0 src/{ => libigl}/igl/snap_to_fixed_up.h | 0 src/{ => libigl}/igl/solid_angle.cpp | 0 src/{ => libigl}/igl/solid_angle.h | 0 src/{ => libigl}/igl/sort.cpp | 0 src/{ => libigl}/igl/sort.h | 0 src/{ => libigl}/igl/sort_angles.cpp | 0 src/{ => libigl}/igl/sort_angles.h | 0 src/{ => libigl}/igl/sort_triangles.cpp | 0 src/{ => libigl}/igl/sort_triangles.h | 0 src/{ => libigl}/igl/sort_vectors_ccw.cpp | 0 src/{ => libigl}/igl/sort_vectors_ccw.h | 0 src/{ => libigl}/igl/sortrows.cpp | 0 src/{ => libigl}/igl/sortrows.h | 0 src/{ => libigl}/igl/sparse.cpp | 0 src/{ => libigl}/igl/sparse.h | 0 src/{ => libigl}/igl/sparse_cached.cpp | 0 src/{ => libigl}/igl/sparse_cached.h | 0 src/{ => libigl}/igl/speye.cpp | 0 src/{ => libigl}/igl/speye.h | 0 src/{ => libigl}/igl/squared_edge_lengths.cpp | 0 src/{ => libigl}/igl/squared_edge_lengths.h | 0 src/{ => libigl}/igl/stdin_to_temp.cpp | 0 src/{ => libigl}/igl/stdin_to_temp.h | 0 src/{ => libigl}/igl/straighten_seams.cpp | 0 src/{ => libigl}/igl/straighten_seams.h | 0 src/{ => libigl}/igl/sum.cpp | 0 src/{ => libigl}/igl/sum.h | 0 src/{ => libigl}/igl/svd3x3.cpp | 0 src/{ => libigl}/igl/svd3x3.h | 0 src/{ => libigl}/igl/svd3x3_avx.cpp | 0 src/{ => libigl}/igl/svd3x3_avx.h | 0 src/{ => libigl}/igl/svd3x3_sse.cpp | 0 src/{ => libigl}/igl/svd3x3_sse.h | 0 .../igl/swept_volume_bounding_box.cpp | 0 .../igl/swept_volume_bounding_box.h | 0 .../igl/swept_volume_signed_distance.cpp | 0 .../igl/swept_volume_signed_distance.h | 0 src/{ => libigl}/igl/trackball.cpp | 0 src/{ => libigl}/igl/trackball.h | 0 src/{ => libigl}/igl/transpose_blocks.cpp | 0 src/{ => libigl}/igl/transpose_blocks.h | 0 src/{ => libigl}/igl/triangle/cdt.cpp | 0 src/{ => libigl}/igl/triangle/cdt.h | 0 src/{ => libigl}/igl/triangle/triangulate.cpp | 0 src/{ => libigl}/igl/triangle/triangulate.h | 0 src/{ => libigl}/igl/triangle_fan.cpp | 0 src/{ => libigl}/igl/triangle_fan.h | 0 .../igl/triangle_triangle_adjacency.cpp | 0 .../igl/triangle_triangle_adjacency.h | 0 src/{ => libigl}/igl/triangles_from_strip.cpp | 0 src/{ => libigl}/igl/triangles_from_strip.h | 0 .../igl/two_axis_valuator_fixed_up.cpp | 0 .../igl/two_axis_valuator_fixed_up.h | 0 .../igl/uniformly_sample_two_manifold.cpp | 0 .../igl/uniformly_sample_two_manifold.h | 0 src/{ => libigl}/igl/unique.cpp | 0 src/{ => libigl}/igl/unique.h | 0 src/{ => libigl}/igl/unique_edge_map.cpp | 0 src/{ => libigl}/igl/unique_edge_map.h | 0 src/{ => libigl}/igl/unique_rows.cpp | 0 src/{ => libigl}/igl/unique_rows.h | 0 src/{ => libigl}/igl/unique_simplices.cpp | 0 src/{ => libigl}/igl/unique_simplices.h | 0 src/{ => libigl}/igl/unproject.cpp | 0 src/{ => libigl}/igl/unproject.h | 0 src/{ => libigl}/igl/unproject_in_mesh.cpp | 0 src/{ => libigl}/igl/unproject_in_mesh.h | 0 src/{ => libigl}/igl/unproject_onto_mesh.cpp | 0 src/{ => libigl}/igl/unproject_onto_mesh.h | 0 src/{ => libigl}/igl/unproject_ray.cpp | 0 src/{ => libigl}/igl/unproject_ray.h | 0 src/{ => libigl}/igl/unzip_corners.cpp | 0 src/{ => libigl}/igl/unzip_corners.h | 0 src/{ => libigl}/igl/upsample.cpp | 0 src/{ => libigl}/igl/upsample.h | 0 src/{ => libigl}/igl/vector_area_matrix.cpp | 0 src/{ => libigl}/igl/vector_area_matrix.h | 0 src/{ => libigl}/igl/verbose.h | 0 .../igl/vertex_triangle_adjacency.cpp | 0 .../igl/vertex_triangle_adjacency.h | 0 src/{ => libigl}/igl/volume.cpp | 0 src/{ => libigl}/igl/volume.h | 0 src/{ => libigl}/igl/voxel_grid.cpp | 0 src/{ => libigl}/igl/voxel_grid.h | 0 src/{ => libigl}/igl/winding_number.cpp | 0 src/{ => libigl}/igl/winding_number.h | 0 src/{ => libigl}/igl/writeBF.cpp | 0 src/{ => libigl}/igl/writeBF.h | 0 src/{ => libigl}/igl/writeDMAT.cpp | 0 src/{ => libigl}/igl/writeDMAT.h | 0 src/{ => libigl}/igl/writeMESH.cpp | 0 src/{ => libigl}/igl/writeMESH.h | 0 src/{ => libigl}/igl/writeOBJ.cpp | 0 src/{ => libigl}/igl/writeOBJ.h | 0 src/{ => libigl}/igl/writeOFF.cpp | 0 src/{ => libigl}/igl/writeOFF.h | 0 src/{ => libigl}/igl/writePLY.cpp | 0 src/{ => libigl}/igl/writePLY.h | 0 src/{ => libigl}/igl/writeSTL.cpp | 0 src/{ => libigl}/igl/writeSTL.h | 0 src/{ => libigl}/igl/writeTGF.cpp | 0 src/{ => libigl}/igl/writeTGF.h | 0 src/{ => libigl}/igl/writeWRL.cpp | 0 src/{ => libigl}/igl/writeWRL.h | 0 src/{ => libigl}/igl/write_triangle_mesh.cpp | 0 src/{ => libigl}/igl/write_triangle_mesh.h | 0 .../igl/xml/ReAntTweakBarXMLSerialization.h | 0 src/{ => libigl}/igl/xml/XMLSerializable.h | 0 .../igl/xml/serialization_test.skip | 0 src/{ => libigl}/igl/xml/serialize_xml.cpp | 0 src/{ => libigl}/igl/xml/serialize_xml.h | 0 src/{ => libigl}/igl/xml/writeDAE.cpp | 0 src/{ => libigl}/igl/xml/writeDAE.h | 0 .../igl/xml/write_triangle_mesh.cpp | 0 .../igl/xml/write_triangle_mesh.h | 0 src/libslic3r/CMakeLists.txt | 1 + 1095 files changed, 181 insertions(+), 5 deletions(-) create mode 100644 deps/igl-fixes.patch create mode 100644 src/libigl/CMakeLists.txt rename src/{ => libigl}/igl/AABB.cpp (100%) rename src/{ => libigl}/igl/AABB.h (100%) rename src/{ => libigl}/igl/ARAPEnergyType.h (100%) rename src/{ => libigl}/igl/AtA_cached.cpp (100%) rename src/{ => libigl}/igl/AtA_cached.h (100%) rename src/{ => libigl}/igl/C_STR.h (100%) rename src/{ => libigl}/igl/Camera.h (100%) rename src/{ => libigl}/igl/EPS.cpp (100%) rename src/{ => libigl}/igl/EPS.h (100%) rename src/{ => libigl}/igl/HalfEdgeIterator.cpp (100%) rename src/{ => libigl}/igl/HalfEdgeIterator.h (100%) rename src/{ => libigl}/igl/Hit.h (100%) rename src/{ => libigl}/igl/IO (100%) rename src/{ => libigl}/igl/IndexComparison.h (100%) rename src/{ => libigl}/igl/LinSpaced.h (100%) rename src/{ => libigl}/igl/MeshBooleanType.h (100%) rename src/{ => libigl}/igl/NormalType.h (100%) rename src/{ => libigl}/igl/ONE.h (100%) rename src/{ => libigl}/igl/PI.h (100%) rename src/{ => libigl}/igl/REDRUM.h (100%) rename src/{ => libigl}/igl/STR.h (100%) rename src/{ => libigl}/igl/Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp (100%) rename src/{ => libigl}/igl/Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp (100%) rename src/{ => libigl}/igl/Singular_Value_Decomposition_Kernel_Declarations.hpp (100%) rename src/{ => libigl}/igl/Singular_Value_Decomposition_Main_Kernel_Body.hpp (100%) rename src/{ => libigl}/igl/Singular_Value_Decomposition_Preamble.hpp (100%) rename src/{ => libigl}/igl/SolverStatus.h (100%) rename src/{ => libigl}/igl/SortableRow.h (100%) rename src/{ => libigl}/igl/Timer.h (100%) rename src/{ => libigl}/igl/Viewport.h (100%) rename src/{ => libigl}/igl/WindingNumberAABB.h (100%) rename src/{ => libigl}/igl/WindingNumberMethod.h (100%) rename src/{ => libigl}/igl/WindingNumberTree.h (100%) rename src/{ => libigl}/igl/ZERO.h (100%) rename src/{ => libigl}/igl/active_set.cpp (100%) rename src/{ => libigl}/igl/active_set.h (100%) rename src/{ => libigl}/igl/adjacency_list.cpp (100%) rename src/{ => libigl}/igl/adjacency_list.h (100%) rename src/{ => libigl}/igl/adjacency_matrix.cpp (100%) rename src/{ => libigl}/igl/adjacency_matrix.h (100%) rename src/{ => libigl}/igl/all.cpp (100%) rename src/{ => libigl}/igl/all.h (100%) rename src/{ => libigl}/igl/all_edges.cpp (100%) rename src/{ => libigl}/igl/all_edges.h (100%) rename src/{ => libigl}/igl/all_pairs_distances.cpp (100%) rename src/{ => libigl}/igl/all_pairs_distances.h (100%) rename src/{ => libigl}/igl/ambient_occlusion.cpp (100%) rename src/{ => libigl}/igl/ambient_occlusion.h (100%) rename src/{ => libigl}/igl/angular_distance.cpp (100%) rename src/{ => libigl}/igl/angular_distance.h (100%) rename src/{ => libigl}/igl/anttweakbar/ReAntTweakBar.cpp (100%) rename src/{ => libigl}/igl/anttweakbar/ReAntTweakBar.h (100%) rename src/{ => libigl}/igl/anttweakbar/cocoa_key_to_anttweakbar_key.cpp (100%) rename src/{ => libigl}/igl/anttweakbar/cocoa_key_to_anttweakbar_key.h (100%) rename src/{ => libigl}/igl/any.cpp (100%) rename src/{ => libigl}/igl/any.h (100%) rename src/{ => libigl}/igl/any_of.cpp (100%) rename src/{ => libigl}/igl/any_of.h (100%) rename src/{ => libigl}/igl/arap.cpp (100%) rename src/{ => libigl}/igl/arap.h (100%) rename src/{ => libigl}/igl/arap_dof.cpp (100%) rename src/{ => libigl}/igl/arap_dof.h (100%) rename src/{ => libigl}/igl/arap_linear_block.cpp (100%) rename src/{ => libigl}/igl/arap_linear_block.h (100%) rename src/{ => libigl}/igl/arap_rhs.cpp (100%) rename src/{ => libigl}/igl/arap_rhs.h (100%) rename src/{ => libigl}/igl/average_onto_faces.cpp (100%) rename src/{ => libigl}/igl/average_onto_faces.h (100%) rename src/{ => libigl}/igl/average_onto_vertices.cpp (100%) rename src/{ => libigl}/igl/average_onto_vertices.h (100%) rename src/{ => libigl}/igl/avg_edge_length.cpp (100%) rename src/{ => libigl}/igl/avg_edge_length.h (100%) rename src/{ => libigl}/igl/axis_angle_to_quat.cpp (100%) rename src/{ => libigl}/igl/axis_angle_to_quat.h (100%) rename src/{ => libigl}/igl/barycenter.cpp (100%) rename src/{ => libigl}/igl/barycenter.h (100%) rename src/{ => libigl}/igl/barycentric_coordinates.cpp (100%) rename src/{ => libigl}/igl/barycentric_coordinates.h (100%) rename src/{ => libigl}/igl/barycentric_to_global.cpp (100%) rename src/{ => libigl}/igl/barycentric_to_global.h (100%) rename src/{ => libigl}/igl/basename.cpp (100%) rename src/{ => libigl}/igl/basename.h (100%) rename src/{ => libigl}/igl/bbw.cpp (100%) rename src/{ => libigl}/igl/bbw.h (100%) rename src/{ => libigl}/igl/bfs.cpp (100%) rename src/{ => libigl}/igl/bfs.h (100%) rename src/{ => libigl}/igl/bfs_orient.cpp (100%) rename src/{ => libigl}/igl/bfs_orient.h (100%) rename src/{ => libigl}/igl/biharmonic_coordinates.cpp (100%) rename src/{ => libigl}/igl/biharmonic_coordinates.h (100%) rename src/{ => libigl}/igl/bijective_composite_harmonic_mapping.cpp (100%) rename src/{ => libigl}/igl/bijective_composite_harmonic_mapping.h (100%) rename src/{ => libigl}/igl/bone_parents.cpp (100%) rename src/{ => libigl}/igl/bone_parents.h (100%) rename src/{ => libigl}/igl/boundary_conditions.cpp (100%) rename src/{ => libigl}/igl/boundary_conditions.h (100%) rename src/{ => libigl}/igl/boundary_facets.cpp (100%) rename src/{ => libigl}/igl/boundary_facets.h (100%) rename src/{ => libigl}/igl/boundary_loop.cpp (100%) rename src/{ => libigl}/igl/boundary_loop.h (100%) rename src/{ => libigl}/igl/bounding_box.cpp (100%) rename src/{ => libigl}/igl/bounding_box.h (100%) rename src/{ => libigl}/igl/bounding_box_diagonal.cpp (100%) rename src/{ => libigl}/igl/bounding_box_diagonal.h (100%) rename src/{ => libigl}/igl/canonical_quaternions.cpp (100%) rename src/{ => libigl}/igl/canonical_quaternions.h (100%) rename src/{ => libigl}/igl/cat.cpp (100%) rename src/{ => libigl}/igl/cat.h (100%) rename src/{ => libigl}/igl/ceil.cpp (100%) rename src/{ => libigl}/igl/ceil.h (100%) rename src/{ => libigl}/igl/centroid.cpp (100%) rename src/{ => libigl}/igl/centroid.h (100%) rename src/{ => libigl}/igl/circulation.cpp (100%) rename src/{ => libigl}/igl/circulation.h (100%) rename src/{ => libigl}/igl/circumradius.cpp (100%) rename src/{ => libigl}/igl/circumradius.h (100%) rename src/{ => libigl}/igl/collapse_edge.cpp (100%) rename src/{ => libigl}/igl/collapse_edge.h (100%) rename src/{ => libigl}/igl/collapse_small_triangles.cpp (100%) rename src/{ => libigl}/igl/collapse_small_triangles.h (100%) rename src/{ => libigl}/igl/colon.cpp (100%) rename src/{ => libigl}/igl/colon.h (100%) rename src/{ => libigl}/igl/colormap.cpp (100%) rename src/{ => libigl}/igl/colormap.h (100%) rename src/{ => libigl}/igl/column_to_quats.cpp (100%) rename src/{ => libigl}/igl/column_to_quats.h (100%) rename src/{ => libigl}/igl/columnize.cpp (100%) rename src/{ => libigl}/igl/columnize.h (100%) rename src/{ => libigl}/igl/comb_cross_field.cpp (100%) rename src/{ => libigl}/igl/comb_cross_field.h (100%) rename src/{ => libigl}/igl/comb_frame_field.cpp (100%) rename src/{ => libigl}/igl/comb_frame_field.h (100%) rename src/{ => libigl}/igl/comb_line_field.cpp (100%) rename src/{ => libigl}/igl/comb_line_field.h (100%) rename src/{ => libigl}/igl/combine.cpp (100%) rename src/{ => libigl}/igl/combine.h (100%) rename src/{ => libigl}/igl/components.cpp (100%) rename src/{ => libigl}/igl/components.h (100%) rename src/{ => libigl}/igl/compute_frame_field_bisectors.cpp (100%) rename src/{ => libigl}/igl/compute_frame_field_bisectors.h (100%) rename src/{ => libigl}/igl/connect_boundary_to_infinity.cpp (100%) rename src/{ => libigl}/igl/connect_boundary_to_infinity.h (100%) rename src/{ => libigl}/igl/copyleft/README.md (100%) rename src/{ => libigl}/igl/copyleft/cgal/BinaryWindingNumberOperations.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/CGAL_includes.hpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/CSGTree.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/RemeshSelfIntersectionsParam.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/SelfIntersectMesh.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/assign.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/assign.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/assign_scalar.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/assign_scalar.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/barycenter.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/cell_adjacency.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/cell_adjacency.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/closest_facet.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/closest_facet.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/complex_to_mesh.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/complex_to_mesh.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/component_inside_component.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/component_inside_component.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/convex_hull.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/convex_hull.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/delaunay_triangulation.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/delaunay_triangulation.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/extract_cells.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/extract_cells.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/extract_feature.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/extract_feature.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/fast_winding_number.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/fast_winding_number.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/half_space_box.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/half_space_box.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/hausdorff.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/hausdorff.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/incircle.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/incircle.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/insert_into_cdt.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/insert_into_cdt.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/insphere.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/insphere.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/intersect_other.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/intersect_other.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/intersect_with_half_space.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/intersect_with_half_space.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/lexicographic_triangulation.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/lexicographic_triangulation.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/list_to_matrix.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/mesh_boolean.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/mesh_boolean.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/mesh_boolean_type_to_funcs.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/mesh_boolean_type_to_funcs.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/mesh_to_cgal_triangle_list.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/mesh_to_cgal_triangle_list.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/mesh_to_polyhedron.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/mesh_to_polyhedron.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/minkowski_sum.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/minkowski_sum.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/order_facets_around_edge.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/order_facets_around_edge.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/order_facets_around_edges.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/order_facets_around_edges.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/orient2D.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/orient2D.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/orient3D.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/orient3D.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/outer_element.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/outer_element.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/outer_facet.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/outer_facet.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/outer_hull.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/outer_hull.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/peel_outer_hull_layers.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/peel_outer_hull_layers.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/peel_winding_number_layers.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/peel_winding_number_layers.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/piecewise_constant_winding_number.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/piecewise_constant_winding_number.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/point_areas.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/point_areas.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/point_mesh_squared_distance.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/point_mesh_squared_distance.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/point_segment_squared_distance.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/point_segment_squared_distance.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/point_solid_signed_squared_distance.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/point_solid_signed_squared_distance.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/point_triangle_squared_distance.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/point_triangle_squared_distance.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/points_inside_component.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/points_inside_component.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/polyhedron_to_mesh.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/polyhedron_to_mesh.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/projected_cdt.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/projected_cdt.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/projected_delaunay.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/projected_delaunay.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/propagate_winding_numbers.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/propagate_winding_numbers.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/read_triangle_mesh.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/read_triangle_mesh.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/relabel_small_immersed_cells.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/relabel_small_immersed_cells.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/remesh_intersections.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/remesh_intersections.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/remesh_self_intersections.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/remesh_self_intersections.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/remove_unreferenced.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/resolve_intersections.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/resolve_intersections.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/row_to_point.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/row_to_point.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/segment_segment_squared_distance.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/segment_segment_squared_distance.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/signed_distance_isosurface.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/signed_distance_isosurface.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/slice.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/slice_mask.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/snap_rounding.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/snap_rounding.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/string_to_mesh_boolean_type.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/string_to_mesh_boolean_type.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/subdivide_segments.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/subdivide_segments.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/submesh_aabb_tree.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/submesh_aabb_tree.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/triangle_triangle_squared_distance.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/triangle_triangle_squared_distance.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/trim_with_solid.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/trim_with_solid.h (100%) rename src/{ => libigl}/igl/copyleft/cgal/unique.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/unique_rows.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/wire_mesh.cpp (100%) rename src/{ => libigl}/igl/copyleft/cgal/wire_mesh.h (100%) rename src/{ => libigl}/igl/copyleft/comiso/frame_field.cpp (100%) rename src/{ => libigl}/igl/copyleft/comiso/frame_field.h (100%) rename src/{ => libigl}/igl/copyleft/comiso/miq.cpp (100%) rename src/{ => libigl}/igl/copyleft/comiso/miq.h (100%) rename src/{ => libigl}/igl/copyleft/comiso/nrosy.cpp (100%) rename src/{ => libigl}/igl/copyleft/comiso/nrosy.h (100%) rename src/{ => libigl}/igl/copyleft/cork/from_cork_mesh.cpp (100%) rename src/{ => libigl}/igl/copyleft/cork/from_cork_mesh.h (100%) rename src/{ => libigl}/igl/copyleft/cork/mesh_boolean.cpp (100%) rename src/{ => libigl}/igl/copyleft/cork/mesh_boolean.h (100%) rename src/{ => libigl}/igl/copyleft/cork/to_cork_mesh.cpp (100%) rename src/{ => libigl}/igl/copyleft/cork/to_cork_mesh.h (100%) rename src/{ => libigl}/igl/copyleft/marching_cubes.cpp (100%) rename src/{ => libigl}/igl/copyleft/marching_cubes.h (100%) rename src/{ => libigl}/igl/copyleft/marching_cubes_tables.h (100%) rename src/{ => libigl}/igl/copyleft/offset_surface.cpp (100%) rename src/{ => libigl}/igl/copyleft/offset_surface.h (100%) rename src/{ => libigl}/igl/copyleft/opengl2/render_to_tga.cpp (100%) rename src/{ => libigl}/igl/copyleft/opengl2/render_to_tga.h (100%) rename src/{ => libigl}/igl/copyleft/opengl2/texture_from_tga.cpp (100%) rename src/{ => libigl}/igl/copyleft/opengl2/texture_from_tga.h (100%) rename src/{ => libigl}/igl/copyleft/opengl2/tga.cpp (100%) rename src/{ => libigl}/igl/copyleft/opengl2/tga.h (100%) rename src/{ => libigl}/igl/copyleft/progressive_hulls.cpp (100%) rename src/{ => libigl}/igl/copyleft/progressive_hulls.h (100%) rename src/{ => libigl}/igl/copyleft/progressive_hulls_cost_and_placement.cpp (100%) rename src/{ => libigl}/igl/copyleft/progressive_hulls_cost_and_placement.h (100%) rename src/{ => libigl}/igl/copyleft/quadprog.cpp (100%) rename src/{ => libigl}/igl/copyleft/quadprog.h (100%) rename src/{ => libigl}/igl/copyleft/swept_volume.cpp (100%) rename src/{ => libigl}/igl/copyleft/swept_volume.h (100%) rename src/{ => libigl}/igl/copyleft/tetgen/README (100%) rename src/{ => libigl}/igl/copyleft/tetgen/cdt.cpp (100%) rename src/{ => libigl}/igl/copyleft/tetgen/cdt.h (100%) rename src/{ => libigl}/igl/copyleft/tetgen/mesh_to_tetgenio.cpp (100%) rename src/{ => libigl}/igl/copyleft/tetgen/mesh_to_tetgenio.h (100%) rename src/{ => libigl}/igl/copyleft/tetgen/mesh_with_skeleton.cpp (100%) rename src/{ => libigl}/igl/copyleft/tetgen/mesh_with_skeleton.h (100%) rename src/{ => libigl}/igl/copyleft/tetgen/read_into_tetgenio.cpp (100%) rename src/{ => libigl}/igl/copyleft/tetgen/read_into_tetgenio.h (100%) rename src/{ => libigl}/igl/copyleft/tetgen/tetgenio_to_tetmesh.cpp (100%) rename src/{ => libigl}/igl/copyleft/tetgen/tetgenio_to_tetmesh.h (100%) rename src/{ => libigl}/igl/copyleft/tetgen/tetrahedralize.cpp (100%) rename src/{ => libigl}/igl/copyleft/tetgen/tetrahedralize.h (100%) rename src/{ => libigl}/igl/cotmatrix.cpp (100%) rename src/{ => libigl}/igl/cotmatrix.h (100%) rename src/{ => libigl}/igl/cotmatrix_entries.cpp (100%) rename src/{ => libigl}/igl/cotmatrix_entries.h (100%) rename src/{ => libigl}/igl/count.cpp (100%) rename src/{ => libigl}/igl/count.h (100%) rename src/{ => libigl}/igl/covariance_scatter_matrix.cpp (100%) rename src/{ => libigl}/igl/covariance_scatter_matrix.h (100%) rename src/{ => libigl}/igl/cross.cpp (100%) rename src/{ => libigl}/igl/cross.h (100%) rename src/{ => libigl}/igl/cross_field_missmatch.cpp (100%) rename src/{ => libigl}/igl/cross_field_missmatch.h (100%) rename src/{ => libigl}/igl/crouzeix_raviart_cotmatrix.cpp (100%) rename src/{ => libigl}/igl/crouzeix_raviart_cotmatrix.h (100%) rename src/{ => libigl}/igl/crouzeix_raviart_massmatrix.cpp (100%) rename src/{ => libigl}/igl/crouzeix_raviart_massmatrix.h (100%) rename src/{ => libigl}/igl/cumsum.cpp (100%) rename src/{ => libigl}/igl/cumsum.h (100%) rename src/{ => libigl}/igl/cut_mesh.cpp (100%) rename src/{ => libigl}/igl/cut_mesh.h (100%) rename src/{ => libigl}/igl/cut_mesh_from_singularities.cpp (100%) rename src/{ => libigl}/igl/cut_mesh_from_singularities.h (100%) rename src/{ => libigl}/igl/cylinder.cpp (100%) rename src/{ => libigl}/igl/cylinder.h (100%) rename src/{ => libigl}/igl/dated_copy.cpp (100%) rename src/{ => libigl}/igl/dated_copy.h (100%) rename src/{ => libigl}/igl/decimate.cpp (100%) rename src/{ => libigl}/igl/decimate.h (100%) rename src/{ => libigl}/igl/deform_skeleton.cpp (100%) rename src/{ => libigl}/igl/deform_skeleton.h (100%) rename src/{ => libigl}/igl/delaunay_triangulation.cpp (100%) rename src/{ => libigl}/igl/delaunay_triangulation.h (100%) rename src/{ => libigl}/igl/deprecated.h (100%) rename src/{ => libigl}/igl/dfs.cpp (100%) rename src/{ => libigl}/igl/dfs.h (100%) rename src/{ => libigl}/igl/diag.cpp (100%) rename src/{ => libigl}/igl/diag.h (100%) rename src/{ => libigl}/igl/dihedral_angles.cpp (100%) rename src/{ => libigl}/igl/dihedral_angles.h (100%) rename src/{ => libigl}/igl/dijkstra.cpp (100%) rename src/{ => libigl}/igl/dijkstra.h (100%) rename src/{ => libigl}/igl/directed_edge_orientations.cpp (100%) rename src/{ => libigl}/igl/directed_edge_orientations.h (100%) rename src/{ => libigl}/igl/directed_edge_parents.cpp (100%) rename src/{ => libigl}/igl/directed_edge_parents.h (100%) rename src/{ => libigl}/igl/dirname.cpp (100%) rename src/{ => libigl}/igl/dirname.h (100%) rename src/{ => libigl}/igl/dot.cpp (100%) rename src/{ => libigl}/igl/dot.h (100%) rename src/{ => libigl}/igl/dot_row.cpp (100%) rename src/{ => libigl}/igl/dot_row.h (100%) rename src/{ => libigl}/igl/doublearea.cpp (100%) rename src/{ => libigl}/igl/doublearea.h (100%) rename src/{ => libigl}/igl/dqs.cpp (100%) rename src/{ => libigl}/igl/dqs.h (100%) rename src/{ => libigl}/igl/ears.cpp (100%) rename src/{ => libigl}/igl/ears.h (100%) rename src/{ => libigl}/igl/edge_collapse_is_valid.cpp (100%) rename src/{ => libigl}/igl/edge_collapse_is_valid.h (100%) rename src/{ => libigl}/igl/edge_flaps.cpp (100%) rename src/{ => libigl}/igl/edge_flaps.h (100%) rename src/{ => libigl}/igl/edge_lengths.cpp (100%) rename src/{ => libigl}/igl/edge_lengths.h (100%) rename src/{ => libigl}/igl/edge_topology.cpp (100%) rename src/{ => libigl}/igl/edge_topology.h (100%) rename src/{ => libigl}/igl/edges.cpp (100%) rename src/{ => libigl}/igl/edges.h (100%) rename src/{ => libigl}/igl/edges_to_path.cpp (100%) rename src/{ => libigl}/igl/edges_to_path.h (100%) rename src/{ => libigl}/igl/eigs.cpp (100%) rename src/{ => libigl}/igl/eigs.h (100%) rename src/{ => libigl}/igl/embree/EmbreeIntersector.h (100%) rename src/{ => libigl}/igl/embree/Embree_convenience.h (100%) rename src/{ => libigl}/igl/embree/ambient_occlusion.cpp (100%) rename src/{ => libigl}/igl/embree/ambient_occlusion.h (100%) rename src/{ => libigl}/igl/embree/bone_heat.cpp (100%) rename src/{ => libigl}/igl/embree/bone_heat.h (100%) rename src/{ => libigl}/igl/embree/bone_visible.cpp (100%) rename src/{ => libigl}/igl/embree/bone_visible.h (100%) rename src/{ => libigl}/igl/embree/embree2/rtcore.h (100%) rename src/{ => libigl}/igl/embree/embree2/rtcore.isph (100%) rename src/{ => libigl}/igl/embree/embree2/rtcore_geometry.h (100%) rename src/{ => libigl}/igl/embree/embree2/rtcore_geometry.isph (100%) rename src/{ => libigl}/igl/embree/embree2/rtcore_geometry_user.h (100%) rename src/{ => libigl}/igl/embree/embree2/rtcore_geometry_user.isph (100%) rename src/{ => libigl}/igl/embree/embree2/rtcore_ray.h (100%) rename src/{ => libigl}/igl/embree/embree2/rtcore_ray.isph (100%) rename src/{ => libigl}/igl/embree/embree2/rtcore_scene.h (100%) rename src/{ => libigl}/igl/embree/embree2/rtcore_scene.isph (100%) rename src/{ => libigl}/igl/embree/line_mesh_intersection.cpp (100%) rename src/{ => libigl}/igl/embree/line_mesh_intersection.h (100%) rename src/{ => libigl}/igl/embree/reorient_facets_raycast.cpp (100%) rename src/{ => libigl}/igl/embree/reorient_facets_raycast.h (100%) rename src/{ => libigl}/igl/embree/shape_diameter_function.cpp (100%) rename src/{ => libigl}/igl/embree/shape_diameter_function.h (100%) rename src/{ => libigl}/igl/embree/unproject_in_mesh.cpp (100%) rename src/{ => libigl}/igl/embree/unproject_in_mesh.h (100%) rename src/{ => libigl}/igl/embree/unproject_onto_mesh.cpp (100%) rename src/{ => libigl}/igl/embree/unproject_onto_mesh.h (100%) rename src/{ => libigl}/igl/euler_characteristic.cpp (100%) rename src/{ => libigl}/igl/euler_characteristic.h (100%) rename src/{ => libigl}/igl/exact_geodesic.cpp (100%) rename src/{ => libigl}/igl/exact_geodesic.h (100%) rename src/{ => libigl}/igl/example_fun.cpp (100%) rename src/{ => libigl}/igl/example_fun.h (100%) rename src/{ => libigl}/igl/exterior_edges.cpp (100%) rename src/{ => libigl}/igl/exterior_edges.h (100%) rename src/{ => libigl}/igl/extract_manifold_patches.cpp (100%) rename src/{ => libigl}/igl/extract_manifold_patches.h (100%) rename src/{ => libigl}/igl/extract_non_manifold_edge_curves.cpp (100%) rename src/{ => libigl}/igl/extract_non_manifold_edge_curves.h (100%) rename src/{ => libigl}/igl/face_areas.cpp (100%) rename src/{ => libigl}/igl/face_areas.h (100%) rename src/{ => libigl}/igl/face_occurrences.cpp (100%) rename src/{ => libigl}/igl/face_occurrences.h (100%) rename src/{ => libigl}/igl/faces_first.cpp (100%) rename src/{ => libigl}/igl/faces_first.h (100%) rename src/{ => libigl}/igl/facet_components.cpp (100%) rename src/{ => libigl}/igl/facet_components.h (100%) rename src/{ => libigl}/igl/false_barycentric_subdivision.cpp (100%) rename src/{ => libigl}/igl/false_barycentric_subdivision.h (100%) rename src/{ => libigl}/igl/fast_winding_number.cpp (100%) rename src/{ => libigl}/igl/fast_winding_number.h (100%) rename src/{ => libigl}/igl/file_contents_as_string.cpp (100%) rename src/{ => libigl}/igl/file_contents_as_string.h (100%) rename src/{ => libigl}/igl/file_dialog_open.cpp (100%) rename src/{ => libigl}/igl/file_dialog_open.h (100%) rename src/{ => libigl}/igl/file_dialog_save.cpp (100%) rename src/{ => libigl}/igl/file_dialog_save.h (100%) rename src/{ => libigl}/igl/file_exists.cpp (100%) rename src/{ => libigl}/igl/file_exists.h (100%) rename src/{ => libigl}/igl/find.cpp (100%) rename src/{ => libigl}/igl/find.h (100%) rename src/{ => libigl}/igl/find_cross_field_singularities.cpp (100%) rename src/{ => libigl}/igl/find_cross_field_singularities.h (100%) rename src/{ => libigl}/igl/find_zero.cpp (100%) rename src/{ => libigl}/igl/find_zero.h (100%) rename src/{ => libigl}/igl/fit_plane.cpp (100%) rename src/{ => libigl}/igl/fit_plane.h (100%) rename src/{ => libigl}/igl/fit_rotations.cpp (100%) rename src/{ => libigl}/igl/fit_rotations.h (100%) rename src/{ => libigl}/igl/flip_avoiding_line_search.cpp (100%) rename src/{ => libigl}/igl/flip_avoiding_line_search.h (100%) rename src/{ => libigl}/igl/flip_edge.cpp (100%) rename src/{ => libigl}/igl/flip_edge.h (100%) rename src/{ => libigl}/igl/flipped_triangles.cpp (100%) rename src/{ => libigl}/igl/flipped_triangles.h (100%) rename src/{ => libigl}/igl/flood_fill.cpp (100%) rename src/{ => libigl}/igl/flood_fill.h (100%) rename src/{ => libigl}/igl/floor.cpp (100%) rename src/{ => libigl}/igl/floor.h (100%) rename src/{ => libigl}/igl/for_each.h (100%) rename src/{ => libigl}/igl/forward_kinematics.cpp (100%) rename src/{ => libigl}/igl/forward_kinematics.h (100%) rename src/{ => libigl}/igl/frame_field_deformer.cpp (100%) rename src/{ => libigl}/igl/frame_field_deformer.h (100%) rename src/{ => libigl}/igl/frame_to_cross_field.cpp (100%) rename src/{ => libigl}/igl/frame_to_cross_field.h (100%) rename src/{ => libigl}/igl/frustum.cpp (100%) rename src/{ => libigl}/igl/frustum.h (100%) rename src/{ => libigl}/igl/gaussian_curvature.cpp (100%) rename src/{ => libigl}/igl/gaussian_curvature.h (100%) rename src/{ => libigl}/igl/get_seconds.cpp (100%) rename src/{ => libigl}/igl/get_seconds.h (100%) rename src/{ => libigl}/igl/get_seconds_hires.cpp (100%) rename src/{ => libigl}/igl/get_seconds_hires.h (100%) rename src/{ => libigl}/igl/grad.cpp (100%) rename src/{ => libigl}/igl/grad.h (100%) rename src/{ => libigl}/igl/grid.cpp (100%) rename src/{ => libigl}/igl/grid.h (100%) rename src/{ => libigl}/igl/grid_search.cpp (100%) rename src/{ => libigl}/igl/grid_search.h (100%) rename src/{ => libigl}/igl/group_sum_matrix.cpp (100%) rename src/{ => libigl}/igl/group_sum_matrix.h (100%) rename src/{ => libigl}/igl/guess_extension.cpp (100%) rename src/{ => libigl}/igl/guess_extension.h (100%) rename src/{ => libigl}/igl/harmonic.cpp (100%) rename src/{ => libigl}/igl/harmonic.h (100%) rename src/{ => libigl}/igl/harwell_boeing.cpp (100%) rename src/{ => libigl}/igl/harwell_boeing.h (100%) rename src/{ => libigl}/igl/hausdorff.cpp (100%) rename src/{ => libigl}/igl/hausdorff.h (100%) rename src/{ => libigl}/igl/hessian.cpp (100%) rename src/{ => libigl}/igl/hessian.h (100%) rename src/{ => libigl}/igl/hessian_energy.cpp (100%) rename src/{ => libigl}/igl/hessian_energy.h (100%) rename src/{ => libigl}/igl/histc.cpp (100%) rename src/{ => libigl}/igl/histc.h (100%) rename src/{ => libigl}/igl/hsv_to_rgb.cpp (100%) rename src/{ => libigl}/igl/hsv_to_rgb.h (100%) rename src/{ => libigl}/igl/igl_inline.h (100%) rename src/{ => libigl}/igl/in_element.cpp (100%) rename src/{ => libigl}/igl/in_element.h (100%) rename src/{ => libigl}/igl/infinite_cost_stopping_condition.cpp (100%) rename src/{ => libigl}/igl/infinite_cost_stopping_condition.h (100%) rename src/{ => libigl}/igl/inradius.cpp (100%) rename src/{ => libigl}/igl/inradius.h (100%) rename src/{ => libigl}/igl/internal_angles.cpp (100%) rename src/{ => libigl}/igl/internal_angles.h (100%) rename src/{ => libigl}/igl/intersect.cpp (100%) rename src/{ => libigl}/igl/intersect.h (100%) rename src/{ => libigl}/igl/invert_diag.cpp (100%) rename src/{ => libigl}/igl/invert_diag.h (100%) rename src/{ => libigl}/igl/is_border_vertex.cpp (100%) rename src/{ => libigl}/igl/is_border_vertex.h (100%) rename src/{ => libigl}/igl/is_boundary_edge.cpp (100%) rename src/{ => libigl}/igl/is_boundary_edge.h (100%) rename src/{ => libigl}/igl/is_dir.cpp (100%) rename src/{ => libigl}/igl/is_dir.h (100%) rename src/{ => libigl}/igl/is_edge_manifold.cpp (100%) rename src/{ => libigl}/igl/is_edge_manifold.h (100%) rename src/{ => libigl}/igl/is_file.cpp (100%) rename src/{ => libigl}/igl/is_file.h (100%) rename src/{ => libigl}/igl/is_irregular_vertex.cpp (100%) rename src/{ => libigl}/igl/is_irregular_vertex.h (100%) rename src/{ => libigl}/igl/is_planar.cpp (100%) rename src/{ => libigl}/igl/is_planar.h (100%) rename src/{ => libigl}/igl/is_readable.cpp (100%) rename src/{ => libigl}/igl/is_readable.h (100%) rename src/{ => libigl}/igl/is_sparse.cpp (100%) rename src/{ => libigl}/igl/is_sparse.h (100%) rename src/{ => libigl}/igl/is_stl.cpp (100%) rename src/{ => libigl}/igl/is_stl.h (100%) rename src/{ => libigl}/igl/is_symmetric.cpp (100%) rename src/{ => libigl}/igl/is_symmetric.h (100%) rename src/{ => libigl}/igl/is_vertex_manifold.cpp (100%) rename src/{ => libigl}/igl/is_vertex_manifold.h (100%) rename src/{ => libigl}/igl/is_writable.cpp (100%) rename src/{ => libigl}/igl/is_writable.h (100%) rename src/{ => libigl}/igl/isdiag.cpp (100%) rename src/{ => libigl}/igl/isdiag.h (100%) rename src/{ => libigl}/igl/ismember.cpp (100%) rename src/{ => libigl}/igl/ismember.h (100%) rename src/{ => libigl}/igl/isolines.cpp (100%) rename src/{ => libigl}/igl/isolines.h (100%) rename src/{ => libigl}/igl/jet.cpp (100%) rename src/{ => libigl}/igl/jet.h (100%) rename src/{ => libigl}/igl/knn.cpp (100%) rename src/{ => libigl}/igl/knn.h (100%) rename src/{ => libigl}/igl/launch_medit.cpp (100%) rename src/{ => libigl}/igl/launch_medit.h (100%) rename src/{ => libigl}/igl/lbs_matrix.cpp (100%) rename src/{ => libigl}/igl/lbs_matrix.h (100%) rename src/{ => libigl}/igl/lexicographic_triangulation.cpp (100%) rename src/{ => libigl}/igl/lexicographic_triangulation.h (100%) rename src/{ => libigl}/igl/lim/lim.cpp (100%) rename src/{ => libigl}/igl/lim/lim.h (100%) rename src/{ => libigl}/igl/limit_faces.cpp (100%) rename src/{ => libigl}/igl/limit_faces.h (100%) rename src/{ => libigl}/igl/line_field_missmatch.cpp (100%) rename src/{ => libigl}/igl/line_field_missmatch.h (100%) rename src/{ => libigl}/igl/line_search.cpp (100%) rename src/{ => libigl}/igl/line_search.h (100%) rename src/{ => libigl}/igl/line_segment_in_rectangle.cpp (100%) rename src/{ => libigl}/igl/line_segment_in_rectangle.h (100%) rename src/{ => libigl}/igl/linprog.cpp (100%) rename src/{ => libigl}/igl/linprog.h (100%) rename src/{ => libigl}/igl/list_to_matrix.cpp (100%) rename src/{ => libigl}/igl/list_to_matrix.h (100%) rename src/{ => libigl}/igl/local_basis.cpp (100%) rename src/{ => libigl}/igl/local_basis.h (100%) rename src/{ => libigl}/igl/look_at.cpp (100%) rename src/{ => libigl}/igl/look_at.h (100%) rename src/{ => libigl}/igl/loop.cpp (100%) rename src/{ => libigl}/igl/loop.h (100%) rename src/{ => libigl}/igl/lscm.cpp (100%) rename src/{ => libigl}/igl/lscm.h (100%) rename src/{ => libigl}/igl/map_vertices_to_circle.cpp (100%) rename src/{ => libigl}/igl/map_vertices_to_circle.h (100%) rename src/{ => libigl}/igl/massmatrix.cpp (100%) rename src/{ => libigl}/igl/massmatrix.h (100%) rename src/{ => libigl}/igl/mat_max.cpp (100%) rename src/{ => libigl}/igl/mat_max.h (100%) rename src/{ => libigl}/igl/mat_min.cpp (100%) rename src/{ => libigl}/igl/mat_min.h (100%) rename src/{ => libigl}/igl/mat_to_quat.cpp (100%) rename src/{ => libigl}/igl/mat_to_quat.h (100%) rename src/{ => libigl}/igl/material_colors.h (100%) rename src/{ => libigl}/igl/matlab/MatlabWorkspace.h (100%) rename src/{ => libigl}/igl/matlab/MexStream.h (100%) rename src/{ => libigl}/igl/matlab/matlabinterface.cpp (100%) rename src/{ => libigl}/igl/matlab/matlabinterface.h (100%) rename src/{ => libigl}/igl/matlab/mexErrMsgTxt.cpp (100%) rename src/{ => libigl}/igl/matlab/mexErrMsgTxt.h (100%) rename src/{ => libigl}/igl/matlab/parse_rhs.cpp (100%) rename src/{ => libigl}/igl/matlab/parse_rhs.h (100%) rename src/{ => libigl}/igl/matlab/prepare_lhs.cpp (100%) rename src/{ => libigl}/igl/matlab/prepare_lhs.h (100%) rename src/{ => libigl}/igl/matlab/requires_arg.cpp (100%) rename src/{ => libigl}/igl/matlab/requires_arg.h (100%) rename src/{ => libigl}/igl/matlab/validate_arg.cpp (100%) rename src/{ => libigl}/igl/matlab/validate_arg.h (100%) rename src/{ => libigl}/igl/matlab_format.cpp (100%) rename src/{ => libigl}/igl/matlab_format.h (100%) rename src/{ => libigl}/igl/matrix_to_list.cpp (100%) rename src/{ => libigl}/igl/matrix_to_list.h (100%) rename src/{ => libigl}/igl/max.cpp (100%) rename src/{ => libigl}/igl/max.h (100%) rename src/{ => libigl}/igl/max_faces_stopping_condition.cpp (100%) rename src/{ => libigl}/igl/max_faces_stopping_condition.h (100%) rename src/{ => libigl}/igl/max_size.cpp (100%) rename src/{ => libigl}/igl/max_size.h (100%) rename src/{ => libigl}/igl/median.cpp (100%) rename src/{ => libigl}/igl/median.h (100%) rename src/{ => libigl}/igl/min.cpp (100%) rename src/{ => libigl}/igl/min.h (100%) rename src/{ => libigl}/igl/min_quad_dense.cpp (100%) rename src/{ => libigl}/igl/min_quad_dense.h (100%) rename src/{ => libigl}/igl/min_quad_with_fixed.cpp (100%) rename src/{ => libigl}/igl/min_quad_with_fixed.h (100%) rename src/{ => libigl}/igl/min_size.cpp (100%) rename src/{ => libigl}/igl/min_size.h (100%) rename src/{ => libigl}/igl/mod.cpp (100%) rename src/{ => libigl}/igl/mod.h (100%) rename src/{ => libigl}/igl/mode.cpp (100%) rename src/{ => libigl}/igl/mode.h (100%) rename src/{ => libigl}/igl/mosek/bbw.cpp (100%) rename src/{ => libigl}/igl/mosek/bbw.h (100%) rename src/{ => libigl}/igl/mosek/mosek_guarded.cpp (100%) rename src/{ => libigl}/igl/mosek/mosek_guarded.h (100%) rename src/{ => libigl}/igl/mosek/mosek_linprog.cpp (100%) rename src/{ => libigl}/igl/mosek/mosek_linprog.h (100%) rename src/{ => libigl}/igl/mosek/mosek_quadprog.cpp (100%) rename src/{ => libigl}/igl/mosek/mosek_quadprog.h (100%) rename src/{ => libigl}/igl/mvc.cpp (100%) rename src/{ => libigl}/igl/mvc.h (100%) rename src/{ => libigl}/igl/nchoosek.cpp (100%) rename src/{ => libigl}/igl/nchoosek.h (100%) rename src/{ => libigl}/igl/next_filename.cpp (100%) rename src/{ => libigl}/igl/next_filename.h (100%) rename src/{ => libigl}/igl/normal_derivative.cpp (100%) rename src/{ => libigl}/igl/normal_derivative.h (100%) rename src/{ => libigl}/igl/normalize_quat.cpp (100%) rename src/{ => libigl}/igl/normalize_quat.h (100%) rename src/{ => libigl}/igl/normalize_row_lengths.cpp (100%) rename src/{ => libigl}/igl/normalize_row_lengths.h (100%) rename src/{ => libigl}/igl/normalize_row_sums.cpp (100%) rename src/{ => libigl}/igl/normalize_row_sums.h (100%) rename src/{ => libigl}/igl/null.cpp (100%) rename src/{ => libigl}/igl/null.h (100%) rename src/{ => libigl}/igl/octree.cpp (100%) rename src/{ => libigl}/igl/octree.h (100%) rename src/{ => libigl}/igl/on_boundary.cpp (100%) rename src/{ => libigl}/igl/on_boundary.h (100%) rename src/{ => libigl}/igl/opengl/MeshGL.cpp (100%) rename src/{ => libigl}/igl/opengl/MeshGL.h (100%) rename src/{ => libigl}/igl/opengl/ViewerCore.cpp (100%) rename src/{ => libigl}/igl/opengl/ViewerCore.h (100%) rename src/{ => libigl}/igl/opengl/ViewerData.cpp (100%) rename src/{ => libigl}/igl/opengl/ViewerData.h (100%) rename src/{ => libigl}/igl/opengl/bind_vertex_attrib_array.cpp (100%) rename src/{ => libigl}/igl/opengl/bind_vertex_attrib_array.h (100%) rename src/{ => libigl}/igl/opengl/create_index_vbo.cpp (100%) rename src/{ => libigl}/igl/opengl/create_index_vbo.h (100%) rename src/{ => libigl}/igl/opengl/create_mesh_vbo.cpp (100%) rename src/{ => libigl}/igl/opengl/create_mesh_vbo.h (100%) rename src/{ => libigl}/igl/opengl/create_shader_program.cpp (100%) rename src/{ => libigl}/igl/opengl/create_shader_program.h (100%) rename src/{ => libigl}/igl/opengl/create_vector_vbo.cpp (100%) rename src/{ => libigl}/igl/opengl/create_vector_vbo.h (100%) rename src/{ => libigl}/igl/opengl/destroy_shader_program.cpp (100%) rename src/{ => libigl}/igl/opengl/destroy_shader_program.h (100%) rename src/{ => libigl}/igl/opengl/gl.h (100%) rename src/{ => libigl}/igl/opengl/gl_type_size.cpp (100%) rename src/{ => libigl}/igl/opengl/gl_type_size.h (100%) rename src/{ => libigl}/igl/opengl/glfw/Viewer.cpp (100%) rename src/{ => libigl}/igl/opengl/glfw/Viewer.h (100%) rename src/{ => libigl}/igl/opengl/glfw/ViewerPlugin.h (100%) rename src/{ => libigl}/igl/opengl/glfw/background_window.cpp (100%) rename src/{ => libigl}/igl/opengl/glfw/background_window.h (100%) rename src/{ => libigl}/igl/opengl/glfw/imgui/ImGuiHelpers.h (100%) rename src/{ => libigl}/igl/opengl/glfw/imgui/ImGuiMenu.cpp (100%) rename src/{ => libigl}/igl/opengl/glfw/imgui/ImGuiMenu.h (100%) rename src/{ => libigl}/igl/opengl/glfw/map_texture.cpp (100%) rename src/{ => libigl}/igl/opengl/glfw/map_texture.h (100%) rename src/{ => libigl}/igl/opengl/init_render_to_texture.cpp (100%) rename src/{ => libigl}/igl/opengl/init_render_to_texture.h (100%) rename src/{ => libigl}/igl/opengl/load_shader.cpp (100%) rename src/{ => libigl}/igl/opengl/load_shader.h (100%) rename src/{ => libigl}/igl/opengl/print_program_info_log.cpp (100%) rename src/{ => libigl}/igl/opengl/print_program_info_log.h (100%) rename src/{ => libigl}/igl/opengl/print_shader_info_log.cpp (100%) rename src/{ => libigl}/igl/opengl/print_shader_info_log.h (100%) rename src/{ => libigl}/igl/opengl/report_gl_error.cpp (100%) rename src/{ => libigl}/igl/opengl/report_gl_error.h (100%) rename src/{ => libigl}/igl/opengl/uniform_type_to_string.cpp (100%) rename src/{ => libigl}/igl/opengl/uniform_type_to_string.h (100%) rename src/{ => libigl}/igl/opengl/vertex_array.cpp (100%) rename src/{ => libigl}/igl/opengl/vertex_array.h (100%) rename src/{ => libigl}/igl/opengl2/MouseController.h (100%) rename src/{ => libigl}/igl/opengl2/RotateWidget.h (100%) rename src/{ => libigl}/igl/opengl2/TranslateWidget.h (100%) rename src/{ => libigl}/igl/opengl2/draw_beach_ball.cpp (100%) rename src/{ => libigl}/igl/opengl2/draw_beach_ball.h (100%) rename src/{ => libigl}/igl/opengl2/draw_floor.cpp (100%) rename src/{ => libigl}/igl/opengl2/draw_floor.h (100%) rename src/{ => libigl}/igl/opengl2/draw_mesh.cpp (100%) rename src/{ => libigl}/igl/opengl2/draw_mesh.h (100%) rename src/{ => libigl}/igl/opengl2/draw_point.cpp (100%) rename src/{ => libigl}/igl/opengl2/draw_point.h (100%) rename src/{ => libigl}/igl/opengl2/draw_rectangular_marquee.cpp (100%) rename src/{ => libigl}/igl/opengl2/draw_rectangular_marquee.h (100%) rename src/{ => libigl}/igl/opengl2/draw_skeleton_3d.cpp (100%) rename src/{ => libigl}/igl/opengl2/draw_skeleton_3d.h (100%) rename src/{ => libigl}/igl/opengl2/draw_skeleton_vector_graphics.cpp (100%) rename src/{ => libigl}/igl/opengl2/draw_skeleton_vector_graphics.h (100%) rename src/{ => libigl}/igl/opengl2/flare_textures.h (100%) rename src/{ => libigl}/igl/opengl2/gl.h (100%) rename src/{ => libigl}/igl/opengl2/glext.h (100%) rename src/{ => libigl}/igl/opengl2/glu.h (100%) rename src/{ => libigl}/igl/opengl2/lens_flare.cpp (100%) rename src/{ => libigl}/igl/opengl2/lens_flare.h (100%) rename src/{ => libigl}/igl/opengl2/model_proj_viewport.cpp (100%) rename src/{ => libigl}/igl/opengl2/model_proj_viewport.h (100%) rename src/{ => libigl}/igl/opengl2/print_gl_get.cpp (100%) rename src/{ => libigl}/igl/opengl2/print_gl_get.h (100%) rename src/{ => libigl}/igl/opengl2/project.cpp (100%) rename src/{ => libigl}/igl/opengl2/project.h (100%) rename src/{ => libigl}/igl/opengl2/right_axis.cpp (100%) rename src/{ => libigl}/igl/opengl2/right_axis.h (100%) rename src/{ => libigl}/igl/opengl2/shine_textures.h (100%) rename src/{ => libigl}/igl/opengl2/sort_triangles.cpp (100%) rename src/{ => libigl}/igl/opengl2/sort_triangles.h (100%) rename src/{ => libigl}/igl/opengl2/unproject.cpp (100%) rename src/{ => libigl}/igl/opengl2/unproject.h (100%) rename src/{ => libigl}/igl/opengl2/unproject_to_zero_plane.cpp (100%) rename src/{ => libigl}/igl/opengl2/unproject_to_zero_plane.h (100%) rename src/{ => libigl}/igl/opengl2/up_axis.cpp (100%) rename src/{ => libigl}/igl/opengl2/up_axis.h (100%) rename src/{ => libigl}/igl/opengl2/view_axis.cpp (100%) rename src/{ => libigl}/igl/opengl2/view_axis.h (100%) rename src/{ => libigl}/igl/orient_outward.cpp (100%) rename src/{ => libigl}/igl/orient_outward.h (100%) rename src/{ => libigl}/igl/orientable_patches.cpp (100%) rename src/{ => libigl}/igl/orientable_patches.h (100%) rename src/{ => libigl}/igl/oriented_facets.cpp (100%) rename src/{ => libigl}/igl/oriented_facets.h (100%) rename src/{ => libigl}/igl/orth.cpp (100%) rename src/{ => libigl}/igl/orth.h (100%) rename src/{ => libigl}/igl/ortho.cpp (100%) rename src/{ => libigl}/igl/ortho.h (100%) rename src/{ => libigl}/igl/outer_element.cpp (100%) rename src/{ => libigl}/igl/outer_element.h (100%) rename src/{ => libigl}/igl/parallel_for.h (100%) rename src/{ => libigl}/igl/parallel_transport_angles.cpp (100%) rename src/{ => libigl}/igl/parallel_transport_angles.h (100%) rename src/{ => libigl}/igl/partition.cpp (100%) rename src/{ => libigl}/igl/partition.h (100%) rename src/{ => libigl}/igl/parula.cpp (100%) rename src/{ => libigl}/igl/parula.h (100%) rename src/{ => libigl}/igl/path_to_executable.cpp (100%) rename src/{ => libigl}/igl/path_to_executable.h (100%) rename src/{ => libigl}/igl/pathinfo.cpp (100%) rename src/{ => libigl}/igl/pathinfo.h (100%) rename src/{ => libigl}/igl/per_corner_normals.cpp (100%) rename src/{ => libigl}/igl/per_corner_normals.h (100%) rename src/{ => libigl}/igl/per_edge_normals.cpp (100%) rename src/{ => libigl}/igl/per_edge_normals.h (100%) rename src/{ => libigl}/igl/per_face_normals.cpp (100%) rename src/{ => libigl}/igl/per_face_normals.h (100%) rename src/{ => libigl}/igl/per_vertex_attribute_smoothing.cpp (100%) rename src/{ => libigl}/igl/per_vertex_attribute_smoothing.h (100%) rename src/{ => libigl}/igl/per_vertex_normals.cpp (100%) rename src/{ => libigl}/igl/per_vertex_normals.h (100%) rename src/{ => libigl}/igl/per_vertex_point_to_plane_quadrics.cpp (100%) rename src/{ => libigl}/igl/per_vertex_point_to_plane_quadrics.h (100%) rename src/{ => libigl}/igl/piecewise_constant_winding_number.cpp (100%) rename src/{ => libigl}/igl/piecewise_constant_winding_number.h (100%) rename src/{ => libigl}/igl/pinv.cpp (100%) rename src/{ => libigl}/igl/pinv.h (100%) rename src/{ => libigl}/igl/planarize_quad_mesh.cpp (100%) rename src/{ => libigl}/igl/planarize_quad_mesh.h (100%) rename src/{ => libigl}/igl/ply.h (100%) rename src/{ => libigl}/igl/png/readPNG.cpp (100%) rename src/{ => libigl}/igl/png/readPNG.h (100%) rename src/{ => libigl}/igl/png/render_to_png.cpp (100%) rename src/{ => libigl}/igl/png/render_to_png.h (100%) rename src/{ => libigl}/igl/png/render_to_png_async.cpp (100%) rename src/{ => libigl}/igl/png/render_to_png_async.h (100%) rename src/{ => libigl}/igl/png/texture_from_file.cpp (100%) rename src/{ => libigl}/igl/png/texture_from_file.h (100%) rename src/{ => libigl}/igl/png/texture_from_png.cpp (100%) rename src/{ => libigl}/igl/png/texture_from_png.h (100%) rename src/{ => libigl}/igl/png/writePNG.cpp (100%) rename src/{ => libigl}/igl/png/writePNG.h (100%) rename src/{ => libigl}/igl/point_in_circle.cpp (100%) rename src/{ => libigl}/igl/point_in_circle.h (100%) rename src/{ => libigl}/igl/point_in_poly.cpp (100%) rename src/{ => libigl}/igl/point_in_poly.h (100%) rename src/{ => libigl}/igl/point_mesh_squared_distance.cpp (100%) rename src/{ => libigl}/igl/point_mesh_squared_distance.h (100%) rename src/{ => libigl}/igl/point_simplex_squared_distance.cpp (100%) rename src/{ => libigl}/igl/point_simplex_squared_distance.h (100%) rename src/{ => libigl}/igl/polar_dec.cpp (100%) rename src/{ => libigl}/igl/polar_dec.h (100%) rename src/{ => libigl}/igl/polar_svd.cpp (100%) rename src/{ => libigl}/igl/polar_svd.h (100%) rename src/{ => libigl}/igl/polar_svd3x3.cpp (100%) rename src/{ => libigl}/igl/polar_svd3x3.h (100%) rename src/{ => libigl}/igl/polygon_mesh_to_triangle_mesh.cpp (100%) rename src/{ => libigl}/igl/polygon_mesh_to_triangle_mesh.h (100%) rename src/{ => libigl}/igl/principal_curvature.cpp (100%) rename src/{ => libigl}/igl/principal_curvature.h (100%) rename src/{ => libigl}/igl/print_ijv.cpp (100%) rename src/{ => libigl}/igl/print_ijv.h (100%) rename src/{ => libigl}/igl/print_vector.cpp (100%) rename src/{ => libigl}/igl/print_vector.h (100%) rename src/{ => libigl}/igl/procrustes.cpp (100%) rename src/{ => libigl}/igl/procrustes.h (100%) rename src/{ => libigl}/igl/project.cpp (100%) rename src/{ => libigl}/igl/project.h (100%) rename src/{ => libigl}/igl/project_isometrically_to_plane.cpp (100%) rename src/{ => libigl}/igl/project_isometrically_to_plane.h (100%) rename src/{ => libigl}/igl/project_to_line.cpp (100%) rename src/{ => libigl}/igl/project_to_line.h (100%) rename src/{ => libigl}/igl/project_to_line_segment.cpp (100%) rename src/{ => libigl}/igl/project_to_line_segment.h (100%) rename src/{ => libigl}/igl/pseudonormal_test.cpp (100%) rename src/{ => libigl}/igl/pseudonormal_test.h (100%) rename src/{ => libigl}/igl/pso.cpp (100%) rename src/{ => libigl}/igl/pso.h (100%) rename src/{ => libigl}/igl/qslim.cpp (100%) rename src/{ => libigl}/igl/qslim.h (100%) rename src/{ => libigl}/igl/qslim_optimal_collapse_edge_callbacks.cpp (100%) rename src/{ => libigl}/igl/qslim_optimal_collapse_edge_callbacks.h (100%) rename src/{ => libigl}/igl/quad_planarity.cpp (100%) rename src/{ => libigl}/igl/quad_planarity.h (100%) rename src/{ => libigl}/igl/quadric_binary_plus_operator.cpp (100%) rename src/{ => libigl}/igl/quadric_binary_plus_operator.h (100%) rename src/{ => libigl}/igl/quat_conjugate.cpp (100%) rename src/{ => libigl}/igl/quat_conjugate.h (100%) rename src/{ => libigl}/igl/quat_mult.cpp (100%) rename src/{ => libigl}/igl/quat_mult.h (100%) rename src/{ => libigl}/igl/quat_to_axis_angle.cpp (100%) rename src/{ => libigl}/igl/quat_to_axis_angle.h (100%) rename src/{ => libigl}/igl/quat_to_mat.cpp (100%) rename src/{ => libigl}/igl/quat_to_mat.h (100%) rename src/{ => libigl}/igl/quats_to_column.cpp (100%) rename src/{ => libigl}/igl/quats_to_column.h (100%) rename src/{ => libigl}/igl/ramer_douglas_peucker.cpp (100%) rename src/{ => libigl}/igl/ramer_douglas_peucker.h (100%) rename src/{ => libigl}/igl/random_dir.cpp (100%) rename src/{ => libigl}/igl/random_dir.h (100%) rename src/{ => libigl}/igl/random_points_on_mesh.cpp (100%) rename src/{ => libigl}/igl/random_points_on_mesh.h (100%) rename src/{ => libigl}/igl/random_quaternion.cpp (100%) rename src/{ => libigl}/igl/random_quaternion.h (100%) rename src/{ => libigl}/igl/random_search.cpp (100%) rename src/{ => libigl}/igl/random_search.h (100%) rename src/{ => libigl}/igl/randperm.cpp (100%) rename src/{ => libigl}/igl/randperm.h (100%) rename src/{ => libigl}/igl/ray_box_intersect.cpp (100%) rename src/{ => libigl}/igl/ray_box_intersect.h (100%) rename src/{ => libigl}/igl/ray_mesh_intersect.cpp (100%) rename src/{ => libigl}/igl/ray_mesh_intersect.h (100%) rename src/{ => libigl}/igl/ray_sphere_intersect.cpp (100%) rename src/{ => libigl}/igl/ray_sphere_intersect.h (100%) rename src/{ => libigl}/igl/raytri.c (100%) rename src/{ => libigl}/igl/readBF.cpp (100%) rename src/{ => libigl}/igl/readBF.h (100%) rename src/{ => libigl}/igl/readCSV.cpp (100%) rename src/{ => libigl}/igl/readCSV.h (100%) rename src/{ => libigl}/igl/readDMAT.cpp (100%) rename src/{ => libigl}/igl/readDMAT.h (100%) rename src/{ => libigl}/igl/readMESH.cpp (100%) rename src/{ => libigl}/igl/readMESH.h (100%) rename src/{ => libigl}/igl/readMSH.cpp (100%) rename src/{ => libigl}/igl/readMSH.h (100%) rename src/{ => libigl}/igl/readNODE.cpp (100%) rename src/{ => libigl}/igl/readNODE.h (100%) rename src/{ => libigl}/igl/readOBJ.cpp (100%) rename src/{ => libigl}/igl/readOBJ.h (100%) rename src/{ => libigl}/igl/readOFF.cpp (100%) rename src/{ => libigl}/igl/readOFF.h (100%) rename src/{ => libigl}/igl/readPLY.cpp (100%) rename src/{ => libigl}/igl/readPLY.h (100%) rename src/{ => libigl}/igl/readSTL.cpp (100%) rename src/{ => libigl}/igl/readSTL.h (100%) rename src/{ => libigl}/igl/readTGF.cpp (100%) rename src/{ => libigl}/igl/readTGF.h (100%) rename src/{ => libigl}/igl/readWRL.cpp (100%) rename src/{ => libigl}/igl/readWRL.h (100%) rename src/{ => libigl}/igl/read_triangle_mesh.cpp (100%) rename src/{ => libigl}/igl/read_triangle_mesh.h (100%) rename src/{ => libigl}/igl/redux.h (100%) rename src/{ => libigl}/igl/remesh_along_isoline.cpp (100%) rename src/{ => libigl}/igl/remesh_along_isoline.h (100%) rename src/{ => libigl}/igl/remove_duplicate_vertices.cpp (100%) rename src/{ => libigl}/igl/remove_duplicate_vertices.h (100%) rename src/{ => libigl}/igl/remove_duplicates.cpp (100%) rename src/{ => libigl}/igl/remove_duplicates.h (100%) rename src/{ => libigl}/igl/remove_unreferenced.cpp (100%) rename src/{ => libigl}/igl/remove_unreferenced.h (100%) rename src/{ => libigl}/igl/reorder.cpp (100%) rename src/{ => libigl}/igl/reorder.h (100%) rename src/{ => libigl}/igl/repdiag.cpp (100%) rename src/{ => libigl}/igl/repdiag.h (100%) rename src/{ => libigl}/igl/repmat.cpp (100%) rename src/{ => libigl}/igl/repmat.h (100%) rename src/{ => libigl}/igl/resolve_duplicated_faces.cpp (100%) rename src/{ => libigl}/igl/resolve_duplicated_faces.h (100%) rename src/{ => libigl}/igl/rgb_to_hsv.cpp (100%) rename src/{ => libigl}/igl/rgb_to_hsv.h (100%) rename src/{ => libigl}/igl/rotate_by_quat.cpp (100%) rename src/{ => libigl}/igl/rotate_by_quat.h (100%) rename src/{ => libigl}/igl/rotate_vectors.cpp (100%) rename src/{ => libigl}/igl/rotate_vectors.h (100%) rename src/{ => libigl}/igl/rotation_matrix_from_directions.cpp (100%) rename src/{ => libigl}/igl/rotation_matrix_from_directions.h (100%) rename src/{ => libigl}/igl/round.cpp (100%) rename src/{ => libigl}/igl/round.h (100%) rename src/{ => libigl}/igl/rows_to_matrix.cpp (100%) rename src/{ => libigl}/igl/rows_to_matrix.h (100%) rename src/{ => libigl}/igl/sample_edges.cpp (100%) rename src/{ => libigl}/igl/sample_edges.h (100%) rename src/{ => libigl}/igl/seam_edges.cpp (100%) rename src/{ => libigl}/igl/seam_edges.h (100%) rename src/{ => libigl}/igl/segment_segment_intersect.cpp (100%) rename src/{ => libigl}/igl/segment_segment_intersect.h (100%) rename src/{ => libigl}/igl/serialize.h (100%) rename src/{ => libigl}/igl/setdiff.cpp (100%) rename src/{ => libigl}/igl/setdiff.h (100%) rename src/{ => libigl}/igl/setunion.cpp (100%) rename src/{ => libigl}/igl/setunion.h (100%) rename src/{ => libigl}/igl/setxor.cpp (100%) rename src/{ => libigl}/igl/setxor.h (100%) rename src/{ => libigl}/igl/shape_diameter_function.cpp (100%) rename src/{ => libigl}/igl/shape_diameter_function.h (100%) rename src/{ => libigl}/igl/shapeup.cpp (100%) rename src/{ => libigl}/igl/shapeup.h (100%) rename src/{ => libigl}/igl/shortest_edge_and_midpoint.cpp (100%) rename src/{ => libigl}/igl/shortest_edge_and_midpoint.h (100%) rename src/{ => libigl}/igl/signed_angle.cpp (100%) rename src/{ => libigl}/igl/signed_angle.h (100%) rename src/{ => libigl}/igl/signed_distance.cpp (100%) rename src/{ => libigl}/igl/signed_distance.h (100%) rename src/{ => libigl}/igl/simplify_polyhedron.cpp (100%) rename src/{ => libigl}/igl/simplify_polyhedron.h (100%) rename src/{ => libigl}/igl/slice.cpp (100%) rename src/{ => libigl}/igl/slice.h (100%) rename src/{ => libigl}/igl/slice_cached.cpp (100%) rename src/{ => libigl}/igl/slice_cached.h (100%) rename src/{ => libigl}/igl/slice_into.cpp (100%) rename src/{ => libigl}/igl/slice_into.h (100%) rename src/{ => libigl}/igl/slice_mask.cpp (100%) rename src/{ => libigl}/igl/slice_mask.h (100%) rename src/{ => libigl}/igl/slice_tets.cpp (100%) rename src/{ => libigl}/igl/slice_tets.h (100%) rename src/{ => libigl}/igl/slim.cpp (100%) rename src/{ => libigl}/igl/slim.h (100%) rename src/{ => libigl}/igl/snap_points.cpp (100%) rename src/{ => libigl}/igl/snap_points.h (100%) rename src/{ => libigl}/igl/snap_to_canonical_view_quat.cpp (100%) rename src/{ => libigl}/igl/snap_to_canonical_view_quat.h (100%) rename src/{ => libigl}/igl/snap_to_fixed_up.cpp (100%) rename src/{ => libigl}/igl/snap_to_fixed_up.h (100%) rename src/{ => libigl}/igl/solid_angle.cpp (100%) rename src/{ => libigl}/igl/solid_angle.h (100%) rename src/{ => libigl}/igl/sort.cpp (100%) rename src/{ => libigl}/igl/sort.h (100%) rename src/{ => libigl}/igl/sort_angles.cpp (100%) rename src/{ => libigl}/igl/sort_angles.h (100%) rename src/{ => libigl}/igl/sort_triangles.cpp (100%) rename src/{ => libigl}/igl/sort_triangles.h (100%) rename src/{ => libigl}/igl/sort_vectors_ccw.cpp (100%) rename src/{ => libigl}/igl/sort_vectors_ccw.h (100%) rename src/{ => libigl}/igl/sortrows.cpp (100%) rename src/{ => libigl}/igl/sortrows.h (100%) rename src/{ => libigl}/igl/sparse.cpp (100%) rename src/{ => libigl}/igl/sparse.h (100%) rename src/{ => libigl}/igl/sparse_cached.cpp (100%) rename src/{ => libigl}/igl/sparse_cached.h (100%) rename src/{ => libigl}/igl/speye.cpp (100%) rename src/{ => libigl}/igl/speye.h (100%) rename src/{ => libigl}/igl/squared_edge_lengths.cpp (100%) rename src/{ => libigl}/igl/squared_edge_lengths.h (100%) rename src/{ => libigl}/igl/stdin_to_temp.cpp (100%) rename src/{ => libigl}/igl/stdin_to_temp.h (100%) rename src/{ => libigl}/igl/straighten_seams.cpp (100%) rename src/{ => libigl}/igl/straighten_seams.h (100%) rename src/{ => libigl}/igl/sum.cpp (100%) rename src/{ => libigl}/igl/sum.h (100%) rename src/{ => libigl}/igl/svd3x3.cpp (100%) rename src/{ => libigl}/igl/svd3x3.h (100%) rename src/{ => libigl}/igl/svd3x3_avx.cpp (100%) rename src/{ => libigl}/igl/svd3x3_avx.h (100%) rename src/{ => libigl}/igl/svd3x3_sse.cpp (100%) rename src/{ => libigl}/igl/svd3x3_sse.h (100%) rename src/{ => libigl}/igl/swept_volume_bounding_box.cpp (100%) rename src/{ => libigl}/igl/swept_volume_bounding_box.h (100%) rename src/{ => libigl}/igl/swept_volume_signed_distance.cpp (100%) rename src/{ => libigl}/igl/swept_volume_signed_distance.h (100%) rename src/{ => libigl}/igl/trackball.cpp (100%) rename src/{ => libigl}/igl/trackball.h (100%) rename src/{ => libigl}/igl/transpose_blocks.cpp (100%) rename src/{ => libigl}/igl/transpose_blocks.h (100%) rename src/{ => libigl}/igl/triangle/cdt.cpp (100%) rename src/{ => libigl}/igl/triangle/cdt.h (100%) rename src/{ => libigl}/igl/triangle/triangulate.cpp (100%) rename src/{ => libigl}/igl/triangle/triangulate.h (100%) rename src/{ => libigl}/igl/triangle_fan.cpp (100%) rename src/{ => libigl}/igl/triangle_fan.h (100%) rename src/{ => libigl}/igl/triangle_triangle_adjacency.cpp (100%) rename src/{ => libigl}/igl/triangle_triangle_adjacency.h (100%) rename src/{ => libigl}/igl/triangles_from_strip.cpp (100%) rename src/{ => libigl}/igl/triangles_from_strip.h (100%) rename src/{ => libigl}/igl/two_axis_valuator_fixed_up.cpp (100%) rename src/{ => libigl}/igl/two_axis_valuator_fixed_up.h (100%) rename src/{ => libigl}/igl/uniformly_sample_two_manifold.cpp (100%) rename src/{ => libigl}/igl/uniformly_sample_two_manifold.h (100%) rename src/{ => libigl}/igl/unique.cpp (100%) rename src/{ => libigl}/igl/unique.h (100%) rename src/{ => libigl}/igl/unique_edge_map.cpp (100%) rename src/{ => libigl}/igl/unique_edge_map.h (100%) rename src/{ => libigl}/igl/unique_rows.cpp (100%) rename src/{ => libigl}/igl/unique_rows.h (100%) rename src/{ => libigl}/igl/unique_simplices.cpp (100%) rename src/{ => libigl}/igl/unique_simplices.h (100%) rename src/{ => libigl}/igl/unproject.cpp (100%) rename src/{ => libigl}/igl/unproject.h (100%) rename src/{ => libigl}/igl/unproject_in_mesh.cpp (100%) rename src/{ => libigl}/igl/unproject_in_mesh.h (100%) rename src/{ => libigl}/igl/unproject_onto_mesh.cpp (100%) rename src/{ => libigl}/igl/unproject_onto_mesh.h (100%) rename src/{ => libigl}/igl/unproject_ray.cpp (100%) rename src/{ => libigl}/igl/unproject_ray.h (100%) rename src/{ => libigl}/igl/unzip_corners.cpp (100%) rename src/{ => libigl}/igl/unzip_corners.h (100%) rename src/{ => libigl}/igl/upsample.cpp (100%) rename src/{ => libigl}/igl/upsample.h (100%) rename src/{ => libigl}/igl/vector_area_matrix.cpp (100%) rename src/{ => libigl}/igl/vector_area_matrix.h (100%) rename src/{ => libigl}/igl/verbose.h (100%) rename src/{ => libigl}/igl/vertex_triangle_adjacency.cpp (100%) rename src/{ => libigl}/igl/vertex_triangle_adjacency.h (100%) rename src/{ => libigl}/igl/volume.cpp (100%) rename src/{ => libigl}/igl/volume.h (100%) rename src/{ => libigl}/igl/voxel_grid.cpp (100%) rename src/{ => libigl}/igl/voxel_grid.h (100%) rename src/{ => libigl}/igl/winding_number.cpp (100%) rename src/{ => libigl}/igl/winding_number.h (100%) rename src/{ => libigl}/igl/writeBF.cpp (100%) rename src/{ => libigl}/igl/writeBF.h (100%) rename src/{ => libigl}/igl/writeDMAT.cpp (100%) rename src/{ => libigl}/igl/writeDMAT.h (100%) rename src/{ => libigl}/igl/writeMESH.cpp (100%) rename src/{ => libigl}/igl/writeMESH.h (100%) rename src/{ => libigl}/igl/writeOBJ.cpp (100%) rename src/{ => libigl}/igl/writeOBJ.h (100%) rename src/{ => libigl}/igl/writeOFF.cpp (100%) rename src/{ => libigl}/igl/writeOFF.h (100%) rename src/{ => libigl}/igl/writePLY.cpp (100%) rename src/{ => libigl}/igl/writePLY.h (100%) rename src/{ => libigl}/igl/writeSTL.cpp (100%) rename src/{ => libigl}/igl/writeSTL.h (100%) rename src/{ => libigl}/igl/writeTGF.cpp (100%) rename src/{ => libigl}/igl/writeTGF.h (100%) rename src/{ => libigl}/igl/writeWRL.cpp (100%) rename src/{ => libigl}/igl/writeWRL.h (100%) rename src/{ => libigl}/igl/write_triangle_mesh.cpp (100%) rename src/{ => libigl}/igl/write_triangle_mesh.h (100%) rename src/{ => libigl}/igl/xml/ReAntTweakBarXMLSerialization.h (100%) rename src/{ => libigl}/igl/xml/XMLSerializable.h (100%) rename src/{ => libigl}/igl/xml/serialization_test.skip (100%) rename src/{ => libigl}/igl/xml/serialize_xml.cpp (100%) rename src/{ => libigl}/igl/xml/serialize_xml.h (100%) rename src/{ => libigl}/igl/xml/writeDAE.cpp (100%) rename src/{ => libigl}/igl/xml/writeDAE.h (100%) rename src/{ => libigl}/igl/xml/write_triangle_mesh.cpp (100%) rename src/{ => libigl}/igl/xml/write_triangle_mesh.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index b2fc12c480..ba264c8c36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,8 +89,6 @@ enable_testing () # Enable C++11 language standard. set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_C_STANDARD 11) -set(CMAKE_C_STANDARD_REQUIRED ON) if(NOT WIN32) # Add DEBUG flags to debug builds. @@ -172,7 +170,7 @@ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STRE add_compile_options(-Werror=return-type) #removes LOTS of extraneous Eigen warnings - add_compile_options(-Wno-ignored-attributes) + # add_compile_options(-Wno-ignored-attributes) # Tamas: Eigen include dirs are marked as SYSTEM if (SLIC3R_ASAN) add_compile_options(-fsanitize=address -fno-omit-frame-pointer) @@ -314,7 +312,7 @@ if (NOT Eigen3_FOUND) set(Eigen3_FOUND 1) set(EIGEN3_INCLUDE_DIR ${LIBDIR}/eigen/) endif () -include_directories(${EIGEN3_INCLUDE_DIR}) +include_directories(BEFORE SYSTEM ${EIGEN3_INCLUDE_DIR}) # Find expat or use bundled version # Always use the system libexpat on Linux. diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index ca4e63fbc1..c98941b5af 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -35,6 +35,7 @@ set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination direct option(DEP_DEBUG "Build debug variants (only applicable on Windows)" ON) option(DEP_WX_STABLE "Build against wxWidgets stable 3.0 as opposed to default 3.1 (Linux only)" OFF) +option(DEP_BUILD_IGL_STATIC "Build IGL as a static library. Might cause link errors." OFF) message(STATUS "PrusaSlicer deps DESTDIR: ${DESTDIR}") message(STATUS "PrusaSlicer deps debug build: ${DEP_DEBUG}") @@ -99,6 +100,7 @@ else() dep_gtest dep_nlopt dep_qhull + dep_libigl ) endif() diff --git a/deps/deps-unix-common.cmake b/deps/deps-unix-common.cmake index d6a92efcb3..c44a6ec205 100644 --- a/deps/deps-unix-common.cmake +++ b/deps/deps-unix-common.cmake @@ -32,7 +32,6 @@ ExternalProject_Add(dep_nlopt -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local ${DEP_CMAKE_OPTS} ) - find_package(Git REQUIRED) ExternalProject_Add(dep_qhull @@ -45,3 +44,32 @@ ExternalProject_Add(dep_qhull ${DEP_CMAKE_OPTS} PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/qhull-mods.patch ) + +ExternalProject_Add(dep_libigl + EXCLUDE_FROM_ALL 1 + URL "https://github.com/libigl/libigl/archive/v2.0.0.tar.gz" + URL_HASH SHA256=42518e6b106c7209c73435fd260ed5d34edeb254852495b4c95dce2d95401328 + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local + -DLIBIGL_BUILD_PYTHON=OFF + -DLIBIGL_BUILD_TESTS=OFF + -DLIBIGL_BUILD_TUTORIALS=OFF + -DLIBIGL_USE_STATIC_LIBRARY=${DEP_BUILD_IGL_STATIC} + -DLIBIGL_WITHOUT_COPYLEFT=OFF + -DLIBIGL_WITH_CGAL=OFF + -DLIBIGL_WITH_COMISO=OFF + -DLIBIGL_WITH_CORK=OFF + -DLIBIGL_WITH_EMBREE=OFF + -DLIBIGL_WITH_MATLAB=OFF + -DLIBIGL_WITH_MOSEK=OFF + -DLIBIGL_WITH_OPENGL=OFF + -DLIBIGL_WITH_OPENGL_GLFW=OFF + -DLIBIGL_WITH_OPENGL_GLFW_IMGUI=OFF + -DLIBIGL_WITH_PNG=OFF + -DLIBIGL_WITH_PYTHON=OFF + -DLIBIGL_WITH_TETGEN=OFF + -DLIBIGL_WITH_TRIANGLE=OFF + -DLIBIGL_WITH_XML=OFF + PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/igl-fixes.patch +) + diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index 041160f407..d7daf84253 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -252,6 +252,51 @@ else () set(DEP_WXWIDGETS_LIBDIR "vc_x64_lib") endif () +find_package(Git REQUIRED) + +ExternalProject_Add(dep_libigl + EXCLUDE_FROM_ALL 1 + URL "https://github.com/libigl/libigl/archive/v2.0.0.tar.gz" + URL_HASH SHA256=42518e6b106c7209c73435fd260ed5d34edeb254852495b4c95dce2d95401328 + CMAKE_GENERATOR "${DEP_MSVC_GEN}" + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local + -DLIBIGL_BUILD_PYTHON=OFF + -DLIBIGL_BUILD_TESTS=OFF + -DLIBIGL_BUILD_TUTORIALS=OFF + -DLIBIGL_USE_STATIC_LIBRARY=${DEP_BUILD_IGL_STATIC} + -DLIBIGL_WITHOUT_COPYLEFT=OFF + -DLIBIGL_WITH_CGAL=OFF + -DLIBIGL_WITH_COMISO=OFF + -DLIBIGL_WITH_CORK=OFF + -DLIBIGL_WITH_EMBREE=OFF + -DLIBIGL_WITH_MATLAB=OFF + -DLIBIGL_WITH_MOSEK=OFF + -DLIBIGL_WITH_OPENGL=OFF + -DLIBIGL_WITH_OPENGL_GLFW=OFF + -DLIBIGL_WITH_OPENGL_GLFW_IMGUI=OFF + -DLIBIGL_WITH_PNG=OFF + -DLIBIGL_WITH_PYTHON=OFF + -DLIBIGL_WITH_TETGEN=OFF + -DLIBIGL_WITH_TRIANGLE=OFF + -DLIBIGL_WITH_XML=OFF + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DCMAKE_DEBUG_POSTFIX=d + PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/igl-fixes.patch + BUILD_COMMAND msbuild /m /P:Configuration=Release INSTALL.vcxproj + INSTALL_COMMAND "" +) + +if (${DEP_DEBUG}) + ExternalProject_Get_Property(dep_libigl BINARY_DIR) + ExternalProject_Add_Step(dep_libigl build_debug + DEPENDEES build + DEPENDERS install + COMMAND msbuild /m /P:Configuration=Debug INSTALL.vcxproj + WORKING_DIRECTORY "${BINARY_DIR}" + ) +endif () + ExternalProject_Add(dep_wxwidgets EXCLUDE_FROM_ALL 1 GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets" diff --git a/deps/igl-fixes.patch b/deps/igl-fixes.patch new file mode 100644 index 0000000000..2b50e200b9 --- /dev/null +++ b/deps/igl-fixes.patch @@ -0,0 +1,87 @@ +diff --git a/cmake/libigl-config.cmake.in b/cmake/libigl-config.cmake.in +index 317c745c..f9808e1e 100644 +--- a/cmake/libigl-config.cmake.in ++++ b/cmake/libigl-config.cmake.in +@@ -2,28 +2,28 @@ + + include(${CMAKE_CURRENT_LIST_DIR}/libigl-export.cmake) + +-if (TARGET igl::core) +- if (NOT TARGET Eigen3::Eigen) +- find_package(Eigen3 QUIET) +- if (NOT Eigen3_FOUND) +- # try with PkgCOnfig +- find_package(PkgConfig REQUIRED) +- pkg_check_modules(Eigen3 QUIET IMPORTED_TARGET eigen3) +- endif() +- +- if (NOT Eigen3_FOUND) +- message(FATAL_ERROR "Could not find required dependency Eigen3") +- set(libigl_core_FOUND FALSE) +- else() +- target_link_libraries(igl::core INTERFACE PkgConfig::Eigen3) +- set(libigl_core_FOUND TRUE) +- endif() +- else() +- target_link_libraries(igl::core INTERFACE Eigen3::Eigen) +- set(libigl_core_FOUND TRUE) +- endif() +- +-endif() ++# if (TARGET igl::core) ++# if (NOT TARGET Eigen3::Eigen) ++# find_package(Eigen3 QUIET) ++# if (NOT Eigen3_FOUND) ++# # try with PkgCOnfig ++# find_package(PkgConfig REQUIRED) ++# pkg_check_modules(Eigen3 QUIET IMPORTED_TARGET eigen3) ++# endif() ++# ++# if (NOT Eigen3_FOUND) ++# message(FATAL_ERROR "Could not find required dependency Eigen3") ++# set(libigl_core_FOUND FALSE) ++# else() ++# target_link_libraries(igl::core INTERFACE PkgConfig::Eigen3) ++# set(libigl_core_FOUND TRUE) ++# endif() ++# else() ++# target_link_libraries(igl::core INTERFACE Eigen3::Eigen) ++# set(libigl_core_FOUND TRUE) ++# endif() ++# ++# endif() + + check_required_components(libigl) + +diff --git a/cmake/libigl.cmake b/cmake/libigl.cmake +index 4b11007a..47e6c395 100644 +--- a/cmake/libigl.cmake ++++ b/cmake/libigl.cmake +@@ -445,6 +445,7 @@ function(install_dir_files dir_name) + if(NOT LIBIGL_USE_STATIC_LIBRARY) + file(GLOB public_sources + ${CMAKE_CURRENT_SOURCE_DIR}/include/igl${subpath}/*.cpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/include/igl${subpath}/*.c + ) + endif() + list(APPEND files_to_install ${public_sources}) +diff --git a/include/igl/AABB.cpp b/include/igl/AABB.cpp +index 09537335..31594314 100644 +--- a/include/igl/AABB.cpp ++++ b/include/igl/AABB.cpp +@@ -1072,4 +1072,5 @@ template void igl::AABB, 3>::init, 2>::init >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&); + template double igl::AABB, 3>::squared_distance >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix const&, double, int&, Eigen::PlainObjectBase >&) const; + template bool igl::AABB, 3>::intersect_ray >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix const&, Eigen::Matrix const&, igl::Hit&) const; ++template bool igl::AABB, 3>::intersect_ray >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix const&, Eigen::Matrix const&, std::vector&) const; + #endif +diff --git a/include/igl/ray_mesh_intersect.cpp b/include/igl/ray_mesh_intersect.cpp +index 9a70a22b..dda1654b 100644 +--- a/include/igl/ray_mesh_intersect.cpp ++++ b/include/igl/ray_mesh_intersect.cpp +@@ -83,4 +83,5 @@ IGL_INLINE bool igl::ray_mesh_intersect( + template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, std::vector >&); + template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, igl::Hit&); + template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Block const, 1, -1, false> >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase const, 1, -1, false> > const&, igl::Hit&); ++template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Block const, 1, -1, false> >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase const, 1, -1, false> > const&, std::vector >&); + #endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7240634668..61faa05710 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,6 +12,7 @@ add_subdirectory(poly2tri) add_subdirectory(qhull) add_subdirectory(Shiny) add_subdirectory(semver) +add_subdirectory(libigl) # Adding libnest2d project for bin packing... set(LIBNEST2D_UNITTESTS ON CACHE BOOL "Force generating unittests for libnest2d") diff --git a/src/libigl/CMakeLists.txt b/src/libigl/CMakeLists.txt new file mode 100644 index 0000000000..0852fad729 --- /dev/null +++ b/src/libigl/CMakeLists.txt @@ -0,0 +1,14 @@ +project(libigl) +cmake_minimum_required(VERSION 3.0) + +add_library(libigl INTERFACE) + +find_package(libigl QUIET) + +if(libigl_FOUND) + message(STATUS "IGL found, using system version...") + target_link_libraries(libigl INTERFACE igl::core) +else() + message(STATUS "IGL NOT found, using bundled version...") + target_include_directories(libigl INTERFACE SYSTEM ${LIBDIR}/libigl) +endif() diff --git a/src/igl/AABB.cpp b/src/libigl/igl/AABB.cpp similarity index 100% rename from src/igl/AABB.cpp rename to src/libigl/igl/AABB.cpp diff --git a/src/igl/AABB.h b/src/libigl/igl/AABB.h similarity index 100% rename from src/igl/AABB.h rename to src/libigl/igl/AABB.h diff --git a/src/igl/ARAPEnergyType.h b/src/libigl/igl/ARAPEnergyType.h similarity index 100% rename from src/igl/ARAPEnergyType.h rename to src/libigl/igl/ARAPEnergyType.h diff --git a/src/igl/AtA_cached.cpp b/src/libigl/igl/AtA_cached.cpp similarity index 100% rename from src/igl/AtA_cached.cpp rename to src/libigl/igl/AtA_cached.cpp diff --git a/src/igl/AtA_cached.h b/src/libigl/igl/AtA_cached.h similarity index 100% rename from src/igl/AtA_cached.h rename to src/libigl/igl/AtA_cached.h diff --git a/src/igl/C_STR.h b/src/libigl/igl/C_STR.h similarity index 100% rename from src/igl/C_STR.h rename to src/libigl/igl/C_STR.h diff --git a/src/igl/Camera.h b/src/libigl/igl/Camera.h similarity index 100% rename from src/igl/Camera.h rename to src/libigl/igl/Camera.h diff --git a/src/igl/EPS.cpp b/src/libigl/igl/EPS.cpp similarity index 100% rename from src/igl/EPS.cpp rename to src/libigl/igl/EPS.cpp diff --git a/src/igl/EPS.h b/src/libigl/igl/EPS.h similarity index 100% rename from src/igl/EPS.h rename to src/libigl/igl/EPS.h diff --git a/src/igl/HalfEdgeIterator.cpp b/src/libigl/igl/HalfEdgeIterator.cpp similarity index 100% rename from src/igl/HalfEdgeIterator.cpp rename to src/libigl/igl/HalfEdgeIterator.cpp diff --git a/src/igl/HalfEdgeIterator.h b/src/libigl/igl/HalfEdgeIterator.h similarity index 100% rename from src/igl/HalfEdgeIterator.h rename to src/libigl/igl/HalfEdgeIterator.h diff --git a/src/igl/Hit.h b/src/libigl/igl/Hit.h similarity index 100% rename from src/igl/Hit.h rename to src/libigl/igl/Hit.h diff --git a/src/igl/IO b/src/libigl/igl/IO similarity index 100% rename from src/igl/IO rename to src/libigl/igl/IO diff --git a/src/igl/IndexComparison.h b/src/libigl/igl/IndexComparison.h similarity index 100% rename from src/igl/IndexComparison.h rename to src/libigl/igl/IndexComparison.h diff --git a/src/igl/LinSpaced.h b/src/libigl/igl/LinSpaced.h similarity index 100% rename from src/igl/LinSpaced.h rename to src/libigl/igl/LinSpaced.h diff --git a/src/igl/MeshBooleanType.h b/src/libigl/igl/MeshBooleanType.h similarity index 100% rename from src/igl/MeshBooleanType.h rename to src/libigl/igl/MeshBooleanType.h diff --git a/src/igl/NormalType.h b/src/libigl/igl/NormalType.h similarity index 100% rename from src/igl/NormalType.h rename to src/libigl/igl/NormalType.h diff --git a/src/igl/ONE.h b/src/libigl/igl/ONE.h similarity index 100% rename from src/igl/ONE.h rename to src/libigl/igl/ONE.h diff --git a/src/igl/PI.h b/src/libigl/igl/PI.h similarity index 100% rename from src/igl/PI.h rename to src/libigl/igl/PI.h diff --git a/src/igl/REDRUM.h b/src/libigl/igl/REDRUM.h similarity index 100% rename from src/igl/REDRUM.h rename to src/libigl/igl/REDRUM.h diff --git a/src/igl/STR.h b/src/libigl/igl/STR.h similarity index 100% rename from src/igl/STR.h rename to src/libigl/igl/STR.h diff --git a/src/igl/Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp b/src/libigl/igl/Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp similarity index 100% rename from src/igl/Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp rename to src/libigl/igl/Singular_Value_Decomposition_Givens_QR_Factorization_Kernel.hpp diff --git a/src/igl/Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp b/src/libigl/igl/Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp similarity index 100% rename from src/igl/Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp rename to src/libigl/igl/Singular_Value_Decomposition_Jacobi_Conjugation_Kernel.hpp diff --git a/src/igl/Singular_Value_Decomposition_Kernel_Declarations.hpp b/src/libigl/igl/Singular_Value_Decomposition_Kernel_Declarations.hpp similarity index 100% rename from src/igl/Singular_Value_Decomposition_Kernel_Declarations.hpp rename to src/libigl/igl/Singular_Value_Decomposition_Kernel_Declarations.hpp diff --git a/src/igl/Singular_Value_Decomposition_Main_Kernel_Body.hpp b/src/libigl/igl/Singular_Value_Decomposition_Main_Kernel_Body.hpp similarity index 100% rename from src/igl/Singular_Value_Decomposition_Main_Kernel_Body.hpp rename to src/libigl/igl/Singular_Value_Decomposition_Main_Kernel_Body.hpp diff --git a/src/igl/Singular_Value_Decomposition_Preamble.hpp b/src/libigl/igl/Singular_Value_Decomposition_Preamble.hpp similarity index 100% rename from src/igl/Singular_Value_Decomposition_Preamble.hpp rename to src/libigl/igl/Singular_Value_Decomposition_Preamble.hpp diff --git a/src/igl/SolverStatus.h b/src/libigl/igl/SolverStatus.h similarity index 100% rename from src/igl/SolverStatus.h rename to src/libigl/igl/SolverStatus.h diff --git a/src/igl/SortableRow.h b/src/libigl/igl/SortableRow.h similarity index 100% rename from src/igl/SortableRow.h rename to src/libigl/igl/SortableRow.h diff --git a/src/igl/Timer.h b/src/libigl/igl/Timer.h similarity index 100% rename from src/igl/Timer.h rename to src/libigl/igl/Timer.h diff --git a/src/igl/Viewport.h b/src/libigl/igl/Viewport.h similarity index 100% rename from src/igl/Viewport.h rename to src/libigl/igl/Viewport.h diff --git a/src/igl/WindingNumberAABB.h b/src/libigl/igl/WindingNumberAABB.h similarity index 100% rename from src/igl/WindingNumberAABB.h rename to src/libigl/igl/WindingNumberAABB.h diff --git a/src/igl/WindingNumberMethod.h b/src/libigl/igl/WindingNumberMethod.h similarity index 100% rename from src/igl/WindingNumberMethod.h rename to src/libigl/igl/WindingNumberMethod.h diff --git a/src/igl/WindingNumberTree.h b/src/libigl/igl/WindingNumberTree.h similarity index 100% rename from src/igl/WindingNumberTree.h rename to src/libigl/igl/WindingNumberTree.h diff --git a/src/igl/ZERO.h b/src/libigl/igl/ZERO.h similarity index 100% rename from src/igl/ZERO.h rename to src/libigl/igl/ZERO.h diff --git a/src/igl/active_set.cpp b/src/libigl/igl/active_set.cpp similarity index 100% rename from src/igl/active_set.cpp rename to src/libigl/igl/active_set.cpp diff --git a/src/igl/active_set.h b/src/libigl/igl/active_set.h similarity index 100% rename from src/igl/active_set.h rename to src/libigl/igl/active_set.h diff --git a/src/igl/adjacency_list.cpp b/src/libigl/igl/adjacency_list.cpp similarity index 100% rename from src/igl/adjacency_list.cpp rename to src/libigl/igl/adjacency_list.cpp diff --git a/src/igl/adjacency_list.h b/src/libigl/igl/adjacency_list.h similarity index 100% rename from src/igl/adjacency_list.h rename to src/libigl/igl/adjacency_list.h diff --git a/src/igl/adjacency_matrix.cpp b/src/libigl/igl/adjacency_matrix.cpp similarity index 100% rename from src/igl/adjacency_matrix.cpp rename to src/libigl/igl/adjacency_matrix.cpp diff --git a/src/igl/adjacency_matrix.h b/src/libigl/igl/adjacency_matrix.h similarity index 100% rename from src/igl/adjacency_matrix.h rename to src/libigl/igl/adjacency_matrix.h diff --git a/src/igl/all.cpp b/src/libigl/igl/all.cpp similarity index 100% rename from src/igl/all.cpp rename to src/libigl/igl/all.cpp diff --git a/src/igl/all.h b/src/libigl/igl/all.h similarity index 100% rename from src/igl/all.h rename to src/libigl/igl/all.h diff --git a/src/igl/all_edges.cpp b/src/libigl/igl/all_edges.cpp similarity index 100% rename from src/igl/all_edges.cpp rename to src/libigl/igl/all_edges.cpp diff --git a/src/igl/all_edges.h b/src/libigl/igl/all_edges.h similarity index 100% rename from src/igl/all_edges.h rename to src/libigl/igl/all_edges.h diff --git a/src/igl/all_pairs_distances.cpp b/src/libigl/igl/all_pairs_distances.cpp similarity index 100% rename from src/igl/all_pairs_distances.cpp rename to src/libigl/igl/all_pairs_distances.cpp diff --git a/src/igl/all_pairs_distances.h b/src/libigl/igl/all_pairs_distances.h similarity index 100% rename from src/igl/all_pairs_distances.h rename to src/libigl/igl/all_pairs_distances.h diff --git a/src/igl/ambient_occlusion.cpp b/src/libigl/igl/ambient_occlusion.cpp similarity index 100% rename from src/igl/ambient_occlusion.cpp rename to src/libigl/igl/ambient_occlusion.cpp diff --git a/src/igl/ambient_occlusion.h b/src/libigl/igl/ambient_occlusion.h similarity index 100% rename from src/igl/ambient_occlusion.h rename to src/libigl/igl/ambient_occlusion.h diff --git a/src/igl/angular_distance.cpp b/src/libigl/igl/angular_distance.cpp similarity index 100% rename from src/igl/angular_distance.cpp rename to src/libigl/igl/angular_distance.cpp diff --git a/src/igl/angular_distance.h b/src/libigl/igl/angular_distance.h similarity index 100% rename from src/igl/angular_distance.h rename to src/libigl/igl/angular_distance.h diff --git a/src/igl/anttweakbar/ReAntTweakBar.cpp b/src/libigl/igl/anttweakbar/ReAntTweakBar.cpp similarity index 100% rename from src/igl/anttweakbar/ReAntTweakBar.cpp rename to src/libigl/igl/anttweakbar/ReAntTweakBar.cpp diff --git a/src/igl/anttweakbar/ReAntTweakBar.h b/src/libigl/igl/anttweakbar/ReAntTweakBar.h similarity index 100% rename from src/igl/anttweakbar/ReAntTweakBar.h rename to src/libigl/igl/anttweakbar/ReAntTweakBar.h diff --git a/src/igl/anttweakbar/cocoa_key_to_anttweakbar_key.cpp b/src/libigl/igl/anttweakbar/cocoa_key_to_anttweakbar_key.cpp similarity index 100% rename from src/igl/anttweakbar/cocoa_key_to_anttweakbar_key.cpp rename to src/libigl/igl/anttweakbar/cocoa_key_to_anttweakbar_key.cpp diff --git a/src/igl/anttweakbar/cocoa_key_to_anttweakbar_key.h b/src/libigl/igl/anttweakbar/cocoa_key_to_anttweakbar_key.h similarity index 100% rename from src/igl/anttweakbar/cocoa_key_to_anttweakbar_key.h rename to src/libigl/igl/anttweakbar/cocoa_key_to_anttweakbar_key.h diff --git a/src/igl/any.cpp b/src/libigl/igl/any.cpp similarity index 100% rename from src/igl/any.cpp rename to src/libigl/igl/any.cpp diff --git a/src/igl/any.h b/src/libigl/igl/any.h similarity index 100% rename from src/igl/any.h rename to src/libigl/igl/any.h diff --git a/src/igl/any_of.cpp b/src/libigl/igl/any_of.cpp similarity index 100% rename from src/igl/any_of.cpp rename to src/libigl/igl/any_of.cpp diff --git a/src/igl/any_of.h b/src/libigl/igl/any_of.h similarity index 100% rename from src/igl/any_of.h rename to src/libigl/igl/any_of.h diff --git a/src/igl/arap.cpp b/src/libigl/igl/arap.cpp similarity index 100% rename from src/igl/arap.cpp rename to src/libigl/igl/arap.cpp diff --git a/src/igl/arap.h b/src/libigl/igl/arap.h similarity index 100% rename from src/igl/arap.h rename to src/libigl/igl/arap.h diff --git a/src/igl/arap_dof.cpp b/src/libigl/igl/arap_dof.cpp similarity index 100% rename from src/igl/arap_dof.cpp rename to src/libigl/igl/arap_dof.cpp diff --git a/src/igl/arap_dof.h b/src/libigl/igl/arap_dof.h similarity index 100% rename from src/igl/arap_dof.h rename to src/libigl/igl/arap_dof.h diff --git a/src/igl/arap_linear_block.cpp b/src/libigl/igl/arap_linear_block.cpp similarity index 100% rename from src/igl/arap_linear_block.cpp rename to src/libigl/igl/arap_linear_block.cpp diff --git a/src/igl/arap_linear_block.h b/src/libigl/igl/arap_linear_block.h similarity index 100% rename from src/igl/arap_linear_block.h rename to src/libigl/igl/arap_linear_block.h diff --git a/src/igl/arap_rhs.cpp b/src/libigl/igl/arap_rhs.cpp similarity index 100% rename from src/igl/arap_rhs.cpp rename to src/libigl/igl/arap_rhs.cpp diff --git a/src/igl/arap_rhs.h b/src/libigl/igl/arap_rhs.h similarity index 100% rename from src/igl/arap_rhs.h rename to src/libigl/igl/arap_rhs.h diff --git a/src/igl/average_onto_faces.cpp b/src/libigl/igl/average_onto_faces.cpp similarity index 100% rename from src/igl/average_onto_faces.cpp rename to src/libigl/igl/average_onto_faces.cpp diff --git a/src/igl/average_onto_faces.h b/src/libigl/igl/average_onto_faces.h similarity index 100% rename from src/igl/average_onto_faces.h rename to src/libigl/igl/average_onto_faces.h diff --git a/src/igl/average_onto_vertices.cpp b/src/libigl/igl/average_onto_vertices.cpp similarity index 100% rename from src/igl/average_onto_vertices.cpp rename to src/libigl/igl/average_onto_vertices.cpp diff --git a/src/igl/average_onto_vertices.h b/src/libigl/igl/average_onto_vertices.h similarity index 100% rename from src/igl/average_onto_vertices.h rename to src/libigl/igl/average_onto_vertices.h diff --git a/src/igl/avg_edge_length.cpp b/src/libigl/igl/avg_edge_length.cpp similarity index 100% rename from src/igl/avg_edge_length.cpp rename to src/libigl/igl/avg_edge_length.cpp diff --git a/src/igl/avg_edge_length.h b/src/libigl/igl/avg_edge_length.h similarity index 100% rename from src/igl/avg_edge_length.h rename to src/libigl/igl/avg_edge_length.h diff --git a/src/igl/axis_angle_to_quat.cpp b/src/libigl/igl/axis_angle_to_quat.cpp similarity index 100% rename from src/igl/axis_angle_to_quat.cpp rename to src/libigl/igl/axis_angle_to_quat.cpp diff --git a/src/igl/axis_angle_to_quat.h b/src/libigl/igl/axis_angle_to_quat.h similarity index 100% rename from src/igl/axis_angle_to_quat.h rename to src/libigl/igl/axis_angle_to_quat.h diff --git a/src/igl/barycenter.cpp b/src/libigl/igl/barycenter.cpp similarity index 100% rename from src/igl/barycenter.cpp rename to src/libigl/igl/barycenter.cpp diff --git a/src/igl/barycenter.h b/src/libigl/igl/barycenter.h similarity index 100% rename from src/igl/barycenter.h rename to src/libigl/igl/barycenter.h diff --git a/src/igl/barycentric_coordinates.cpp b/src/libigl/igl/barycentric_coordinates.cpp similarity index 100% rename from src/igl/barycentric_coordinates.cpp rename to src/libigl/igl/barycentric_coordinates.cpp diff --git a/src/igl/barycentric_coordinates.h b/src/libigl/igl/barycentric_coordinates.h similarity index 100% rename from src/igl/barycentric_coordinates.h rename to src/libigl/igl/barycentric_coordinates.h diff --git a/src/igl/barycentric_to_global.cpp b/src/libigl/igl/barycentric_to_global.cpp similarity index 100% rename from src/igl/barycentric_to_global.cpp rename to src/libigl/igl/barycentric_to_global.cpp diff --git a/src/igl/barycentric_to_global.h b/src/libigl/igl/barycentric_to_global.h similarity index 100% rename from src/igl/barycentric_to_global.h rename to src/libigl/igl/barycentric_to_global.h diff --git a/src/igl/basename.cpp b/src/libigl/igl/basename.cpp similarity index 100% rename from src/igl/basename.cpp rename to src/libigl/igl/basename.cpp diff --git a/src/igl/basename.h b/src/libigl/igl/basename.h similarity index 100% rename from src/igl/basename.h rename to src/libigl/igl/basename.h diff --git a/src/igl/bbw.cpp b/src/libigl/igl/bbw.cpp similarity index 100% rename from src/igl/bbw.cpp rename to src/libigl/igl/bbw.cpp diff --git a/src/igl/bbw.h b/src/libigl/igl/bbw.h similarity index 100% rename from src/igl/bbw.h rename to src/libigl/igl/bbw.h diff --git a/src/igl/bfs.cpp b/src/libigl/igl/bfs.cpp similarity index 100% rename from src/igl/bfs.cpp rename to src/libigl/igl/bfs.cpp diff --git a/src/igl/bfs.h b/src/libigl/igl/bfs.h similarity index 100% rename from src/igl/bfs.h rename to src/libigl/igl/bfs.h diff --git a/src/igl/bfs_orient.cpp b/src/libigl/igl/bfs_orient.cpp similarity index 100% rename from src/igl/bfs_orient.cpp rename to src/libigl/igl/bfs_orient.cpp diff --git a/src/igl/bfs_orient.h b/src/libigl/igl/bfs_orient.h similarity index 100% rename from src/igl/bfs_orient.h rename to src/libigl/igl/bfs_orient.h diff --git a/src/igl/biharmonic_coordinates.cpp b/src/libigl/igl/biharmonic_coordinates.cpp similarity index 100% rename from src/igl/biharmonic_coordinates.cpp rename to src/libigl/igl/biharmonic_coordinates.cpp diff --git a/src/igl/biharmonic_coordinates.h b/src/libigl/igl/biharmonic_coordinates.h similarity index 100% rename from src/igl/biharmonic_coordinates.h rename to src/libigl/igl/biharmonic_coordinates.h diff --git a/src/igl/bijective_composite_harmonic_mapping.cpp b/src/libigl/igl/bijective_composite_harmonic_mapping.cpp similarity index 100% rename from src/igl/bijective_composite_harmonic_mapping.cpp rename to src/libigl/igl/bijective_composite_harmonic_mapping.cpp diff --git a/src/igl/bijective_composite_harmonic_mapping.h b/src/libigl/igl/bijective_composite_harmonic_mapping.h similarity index 100% rename from src/igl/bijective_composite_harmonic_mapping.h rename to src/libigl/igl/bijective_composite_harmonic_mapping.h diff --git a/src/igl/bone_parents.cpp b/src/libigl/igl/bone_parents.cpp similarity index 100% rename from src/igl/bone_parents.cpp rename to src/libigl/igl/bone_parents.cpp diff --git a/src/igl/bone_parents.h b/src/libigl/igl/bone_parents.h similarity index 100% rename from src/igl/bone_parents.h rename to src/libigl/igl/bone_parents.h diff --git a/src/igl/boundary_conditions.cpp b/src/libigl/igl/boundary_conditions.cpp similarity index 100% rename from src/igl/boundary_conditions.cpp rename to src/libigl/igl/boundary_conditions.cpp diff --git a/src/igl/boundary_conditions.h b/src/libigl/igl/boundary_conditions.h similarity index 100% rename from src/igl/boundary_conditions.h rename to src/libigl/igl/boundary_conditions.h diff --git a/src/igl/boundary_facets.cpp b/src/libigl/igl/boundary_facets.cpp similarity index 100% rename from src/igl/boundary_facets.cpp rename to src/libigl/igl/boundary_facets.cpp diff --git a/src/igl/boundary_facets.h b/src/libigl/igl/boundary_facets.h similarity index 100% rename from src/igl/boundary_facets.h rename to src/libigl/igl/boundary_facets.h diff --git a/src/igl/boundary_loop.cpp b/src/libigl/igl/boundary_loop.cpp similarity index 100% rename from src/igl/boundary_loop.cpp rename to src/libigl/igl/boundary_loop.cpp diff --git a/src/igl/boundary_loop.h b/src/libigl/igl/boundary_loop.h similarity index 100% rename from src/igl/boundary_loop.h rename to src/libigl/igl/boundary_loop.h diff --git a/src/igl/bounding_box.cpp b/src/libigl/igl/bounding_box.cpp similarity index 100% rename from src/igl/bounding_box.cpp rename to src/libigl/igl/bounding_box.cpp diff --git a/src/igl/bounding_box.h b/src/libigl/igl/bounding_box.h similarity index 100% rename from src/igl/bounding_box.h rename to src/libigl/igl/bounding_box.h diff --git a/src/igl/bounding_box_diagonal.cpp b/src/libigl/igl/bounding_box_diagonal.cpp similarity index 100% rename from src/igl/bounding_box_diagonal.cpp rename to src/libigl/igl/bounding_box_diagonal.cpp diff --git a/src/igl/bounding_box_diagonal.h b/src/libigl/igl/bounding_box_diagonal.h similarity index 100% rename from src/igl/bounding_box_diagonal.h rename to src/libigl/igl/bounding_box_diagonal.h diff --git a/src/igl/canonical_quaternions.cpp b/src/libigl/igl/canonical_quaternions.cpp similarity index 100% rename from src/igl/canonical_quaternions.cpp rename to src/libigl/igl/canonical_quaternions.cpp diff --git a/src/igl/canonical_quaternions.h b/src/libigl/igl/canonical_quaternions.h similarity index 100% rename from src/igl/canonical_quaternions.h rename to src/libigl/igl/canonical_quaternions.h diff --git a/src/igl/cat.cpp b/src/libigl/igl/cat.cpp similarity index 100% rename from src/igl/cat.cpp rename to src/libigl/igl/cat.cpp diff --git a/src/igl/cat.h b/src/libigl/igl/cat.h similarity index 100% rename from src/igl/cat.h rename to src/libigl/igl/cat.h diff --git a/src/igl/ceil.cpp b/src/libigl/igl/ceil.cpp similarity index 100% rename from src/igl/ceil.cpp rename to src/libigl/igl/ceil.cpp diff --git a/src/igl/ceil.h b/src/libigl/igl/ceil.h similarity index 100% rename from src/igl/ceil.h rename to src/libigl/igl/ceil.h diff --git a/src/igl/centroid.cpp b/src/libigl/igl/centroid.cpp similarity index 100% rename from src/igl/centroid.cpp rename to src/libigl/igl/centroid.cpp diff --git a/src/igl/centroid.h b/src/libigl/igl/centroid.h similarity index 100% rename from src/igl/centroid.h rename to src/libigl/igl/centroid.h diff --git a/src/igl/circulation.cpp b/src/libigl/igl/circulation.cpp similarity index 100% rename from src/igl/circulation.cpp rename to src/libigl/igl/circulation.cpp diff --git a/src/igl/circulation.h b/src/libigl/igl/circulation.h similarity index 100% rename from src/igl/circulation.h rename to src/libigl/igl/circulation.h diff --git a/src/igl/circumradius.cpp b/src/libigl/igl/circumradius.cpp similarity index 100% rename from src/igl/circumradius.cpp rename to src/libigl/igl/circumradius.cpp diff --git a/src/igl/circumradius.h b/src/libigl/igl/circumradius.h similarity index 100% rename from src/igl/circumradius.h rename to src/libigl/igl/circumradius.h diff --git a/src/igl/collapse_edge.cpp b/src/libigl/igl/collapse_edge.cpp similarity index 100% rename from src/igl/collapse_edge.cpp rename to src/libigl/igl/collapse_edge.cpp diff --git a/src/igl/collapse_edge.h b/src/libigl/igl/collapse_edge.h similarity index 100% rename from src/igl/collapse_edge.h rename to src/libigl/igl/collapse_edge.h diff --git a/src/igl/collapse_small_triangles.cpp b/src/libigl/igl/collapse_small_triangles.cpp similarity index 100% rename from src/igl/collapse_small_triangles.cpp rename to src/libigl/igl/collapse_small_triangles.cpp diff --git a/src/igl/collapse_small_triangles.h b/src/libigl/igl/collapse_small_triangles.h similarity index 100% rename from src/igl/collapse_small_triangles.h rename to src/libigl/igl/collapse_small_triangles.h diff --git a/src/igl/colon.cpp b/src/libigl/igl/colon.cpp similarity index 100% rename from src/igl/colon.cpp rename to src/libigl/igl/colon.cpp diff --git a/src/igl/colon.h b/src/libigl/igl/colon.h similarity index 100% rename from src/igl/colon.h rename to src/libigl/igl/colon.h diff --git a/src/igl/colormap.cpp b/src/libigl/igl/colormap.cpp similarity index 100% rename from src/igl/colormap.cpp rename to src/libigl/igl/colormap.cpp diff --git a/src/igl/colormap.h b/src/libigl/igl/colormap.h similarity index 100% rename from src/igl/colormap.h rename to src/libigl/igl/colormap.h diff --git a/src/igl/column_to_quats.cpp b/src/libigl/igl/column_to_quats.cpp similarity index 100% rename from src/igl/column_to_quats.cpp rename to src/libigl/igl/column_to_quats.cpp diff --git a/src/igl/column_to_quats.h b/src/libigl/igl/column_to_quats.h similarity index 100% rename from src/igl/column_to_quats.h rename to src/libigl/igl/column_to_quats.h diff --git a/src/igl/columnize.cpp b/src/libigl/igl/columnize.cpp similarity index 100% rename from src/igl/columnize.cpp rename to src/libigl/igl/columnize.cpp diff --git a/src/igl/columnize.h b/src/libigl/igl/columnize.h similarity index 100% rename from src/igl/columnize.h rename to src/libigl/igl/columnize.h diff --git a/src/igl/comb_cross_field.cpp b/src/libigl/igl/comb_cross_field.cpp similarity index 100% rename from src/igl/comb_cross_field.cpp rename to src/libigl/igl/comb_cross_field.cpp diff --git a/src/igl/comb_cross_field.h b/src/libigl/igl/comb_cross_field.h similarity index 100% rename from src/igl/comb_cross_field.h rename to src/libigl/igl/comb_cross_field.h diff --git a/src/igl/comb_frame_field.cpp b/src/libigl/igl/comb_frame_field.cpp similarity index 100% rename from src/igl/comb_frame_field.cpp rename to src/libigl/igl/comb_frame_field.cpp diff --git a/src/igl/comb_frame_field.h b/src/libigl/igl/comb_frame_field.h similarity index 100% rename from src/igl/comb_frame_field.h rename to src/libigl/igl/comb_frame_field.h diff --git a/src/igl/comb_line_field.cpp b/src/libigl/igl/comb_line_field.cpp similarity index 100% rename from src/igl/comb_line_field.cpp rename to src/libigl/igl/comb_line_field.cpp diff --git a/src/igl/comb_line_field.h b/src/libigl/igl/comb_line_field.h similarity index 100% rename from src/igl/comb_line_field.h rename to src/libigl/igl/comb_line_field.h diff --git a/src/igl/combine.cpp b/src/libigl/igl/combine.cpp similarity index 100% rename from src/igl/combine.cpp rename to src/libigl/igl/combine.cpp diff --git a/src/igl/combine.h b/src/libigl/igl/combine.h similarity index 100% rename from src/igl/combine.h rename to src/libigl/igl/combine.h diff --git a/src/igl/components.cpp b/src/libigl/igl/components.cpp similarity index 100% rename from src/igl/components.cpp rename to src/libigl/igl/components.cpp diff --git a/src/igl/components.h b/src/libigl/igl/components.h similarity index 100% rename from src/igl/components.h rename to src/libigl/igl/components.h diff --git a/src/igl/compute_frame_field_bisectors.cpp b/src/libigl/igl/compute_frame_field_bisectors.cpp similarity index 100% rename from src/igl/compute_frame_field_bisectors.cpp rename to src/libigl/igl/compute_frame_field_bisectors.cpp diff --git a/src/igl/compute_frame_field_bisectors.h b/src/libigl/igl/compute_frame_field_bisectors.h similarity index 100% rename from src/igl/compute_frame_field_bisectors.h rename to src/libigl/igl/compute_frame_field_bisectors.h diff --git a/src/igl/connect_boundary_to_infinity.cpp b/src/libigl/igl/connect_boundary_to_infinity.cpp similarity index 100% rename from src/igl/connect_boundary_to_infinity.cpp rename to src/libigl/igl/connect_boundary_to_infinity.cpp diff --git a/src/igl/connect_boundary_to_infinity.h b/src/libigl/igl/connect_boundary_to_infinity.h similarity index 100% rename from src/igl/connect_boundary_to_infinity.h rename to src/libigl/igl/connect_boundary_to_infinity.h diff --git a/src/igl/copyleft/README.md b/src/libigl/igl/copyleft/README.md similarity index 100% rename from src/igl/copyleft/README.md rename to src/libigl/igl/copyleft/README.md diff --git a/src/igl/copyleft/cgal/BinaryWindingNumberOperations.h b/src/libigl/igl/copyleft/cgal/BinaryWindingNumberOperations.h similarity index 100% rename from src/igl/copyleft/cgal/BinaryWindingNumberOperations.h rename to src/libigl/igl/copyleft/cgal/BinaryWindingNumberOperations.h diff --git a/src/igl/copyleft/cgal/CGAL_includes.hpp b/src/libigl/igl/copyleft/cgal/CGAL_includes.hpp similarity index 100% rename from src/igl/copyleft/cgal/CGAL_includes.hpp rename to src/libigl/igl/copyleft/cgal/CGAL_includes.hpp diff --git a/src/igl/copyleft/cgal/CSGTree.h b/src/libigl/igl/copyleft/cgal/CSGTree.h similarity index 100% rename from src/igl/copyleft/cgal/CSGTree.h rename to src/libigl/igl/copyleft/cgal/CSGTree.h diff --git a/src/igl/copyleft/cgal/RemeshSelfIntersectionsParam.h b/src/libigl/igl/copyleft/cgal/RemeshSelfIntersectionsParam.h similarity index 100% rename from src/igl/copyleft/cgal/RemeshSelfIntersectionsParam.h rename to src/libigl/igl/copyleft/cgal/RemeshSelfIntersectionsParam.h diff --git a/src/igl/copyleft/cgal/SelfIntersectMesh.h b/src/libigl/igl/copyleft/cgal/SelfIntersectMesh.h similarity index 100% rename from src/igl/copyleft/cgal/SelfIntersectMesh.h rename to src/libigl/igl/copyleft/cgal/SelfIntersectMesh.h diff --git a/src/igl/copyleft/cgal/assign.cpp b/src/libigl/igl/copyleft/cgal/assign.cpp similarity index 100% rename from src/igl/copyleft/cgal/assign.cpp rename to src/libigl/igl/copyleft/cgal/assign.cpp diff --git a/src/igl/copyleft/cgal/assign.h b/src/libigl/igl/copyleft/cgal/assign.h similarity index 100% rename from src/igl/copyleft/cgal/assign.h rename to src/libigl/igl/copyleft/cgal/assign.h diff --git a/src/igl/copyleft/cgal/assign_scalar.cpp b/src/libigl/igl/copyleft/cgal/assign_scalar.cpp similarity index 100% rename from src/igl/copyleft/cgal/assign_scalar.cpp rename to src/libigl/igl/copyleft/cgal/assign_scalar.cpp diff --git a/src/igl/copyleft/cgal/assign_scalar.h b/src/libigl/igl/copyleft/cgal/assign_scalar.h similarity index 100% rename from src/igl/copyleft/cgal/assign_scalar.h rename to src/libigl/igl/copyleft/cgal/assign_scalar.h diff --git a/src/igl/copyleft/cgal/barycenter.cpp b/src/libigl/igl/copyleft/cgal/barycenter.cpp similarity index 100% rename from src/igl/copyleft/cgal/barycenter.cpp rename to src/libigl/igl/copyleft/cgal/barycenter.cpp diff --git a/src/igl/copyleft/cgal/cell_adjacency.cpp b/src/libigl/igl/copyleft/cgal/cell_adjacency.cpp similarity index 100% rename from src/igl/copyleft/cgal/cell_adjacency.cpp rename to src/libigl/igl/copyleft/cgal/cell_adjacency.cpp diff --git a/src/igl/copyleft/cgal/cell_adjacency.h b/src/libigl/igl/copyleft/cgal/cell_adjacency.h similarity index 100% rename from src/igl/copyleft/cgal/cell_adjacency.h rename to src/libigl/igl/copyleft/cgal/cell_adjacency.h diff --git a/src/igl/copyleft/cgal/closest_facet.cpp b/src/libigl/igl/copyleft/cgal/closest_facet.cpp similarity index 100% rename from src/igl/copyleft/cgal/closest_facet.cpp rename to src/libigl/igl/copyleft/cgal/closest_facet.cpp diff --git a/src/igl/copyleft/cgal/closest_facet.h b/src/libigl/igl/copyleft/cgal/closest_facet.h similarity index 100% rename from src/igl/copyleft/cgal/closest_facet.h rename to src/libigl/igl/copyleft/cgal/closest_facet.h diff --git a/src/igl/copyleft/cgal/complex_to_mesh.cpp b/src/libigl/igl/copyleft/cgal/complex_to_mesh.cpp similarity index 100% rename from src/igl/copyleft/cgal/complex_to_mesh.cpp rename to src/libigl/igl/copyleft/cgal/complex_to_mesh.cpp diff --git a/src/igl/copyleft/cgal/complex_to_mesh.h b/src/libigl/igl/copyleft/cgal/complex_to_mesh.h similarity index 100% rename from src/igl/copyleft/cgal/complex_to_mesh.h rename to src/libigl/igl/copyleft/cgal/complex_to_mesh.h diff --git a/src/igl/copyleft/cgal/component_inside_component.cpp b/src/libigl/igl/copyleft/cgal/component_inside_component.cpp similarity index 100% rename from src/igl/copyleft/cgal/component_inside_component.cpp rename to src/libigl/igl/copyleft/cgal/component_inside_component.cpp diff --git a/src/igl/copyleft/cgal/component_inside_component.h b/src/libigl/igl/copyleft/cgal/component_inside_component.h similarity index 100% rename from src/igl/copyleft/cgal/component_inside_component.h rename to src/libigl/igl/copyleft/cgal/component_inside_component.h diff --git a/src/igl/copyleft/cgal/convex_hull.cpp b/src/libigl/igl/copyleft/cgal/convex_hull.cpp similarity index 100% rename from src/igl/copyleft/cgal/convex_hull.cpp rename to src/libigl/igl/copyleft/cgal/convex_hull.cpp diff --git a/src/igl/copyleft/cgal/convex_hull.h b/src/libigl/igl/copyleft/cgal/convex_hull.h similarity index 100% rename from src/igl/copyleft/cgal/convex_hull.h rename to src/libigl/igl/copyleft/cgal/convex_hull.h diff --git a/src/igl/copyleft/cgal/delaunay_triangulation.cpp b/src/libigl/igl/copyleft/cgal/delaunay_triangulation.cpp similarity index 100% rename from src/igl/copyleft/cgal/delaunay_triangulation.cpp rename to src/libigl/igl/copyleft/cgal/delaunay_triangulation.cpp diff --git a/src/igl/copyleft/cgal/delaunay_triangulation.h b/src/libigl/igl/copyleft/cgal/delaunay_triangulation.h similarity index 100% rename from src/igl/copyleft/cgal/delaunay_triangulation.h rename to src/libigl/igl/copyleft/cgal/delaunay_triangulation.h diff --git a/src/igl/copyleft/cgal/extract_cells.cpp b/src/libigl/igl/copyleft/cgal/extract_cells.cpp similarity index 100% rename from src/igl/copyleft/cgal/extract_cells.cpp rename to src/libigl/igl/copyleft/cgal/extract_cells.cpp diff --git a/src/igl/copyleft/cgal/extract_cells.h b/src/libigl/igl/copyleft/cgal/extract_cells.h similarity index 100% rename from src/igl/copyleft/cgal/extract_cells.h rename to src/libigl/igl/copyleft/cgal/extract_cells.h diff --git a/src/igl/copyleft/cgal/extract_feature.cpp b/src/libigl/igl/copyleft/cgal/extract_feature.cpp similarity index 100% rename from src/igl/copyleft/cgal/extract_feature.cpp rename to src/libigl/igl/copyleft/cgal/extract_feature.cpp diff --git a/src/igl/copyleft/cgal/extract_feature.h b/src/libigl/igl/copyleft/cgal/extract_feature.h similarity index 100% rename from src/igl/copyleft/cgal/extract_feature.h rename to src/libigl/igl/copyleft/cgal/extract_feature.h diff --git a/src/igl/copyleft/cgal/fast_winding_number.cpp b/src/libigl/igl/copyleft/cgal/fast_winding_number.cpp similarity index 100% rename from src/igl/copyleft/cgal/fast_winding_number.cpp rename to src/libigl/igl/copyleft/cgal/fast_winding_number.cpp diff --git a/src/igl/copyleft/cgal/fast_winding_number.h b/src/libigl/igl/copyleft/cgal/fast_winding_number.h similarity index 100% rename from src/igl/copyleft/cgal/fast_winding_number.h rename to src/libigl/igl/copyleft/cgal/fast_winding_number.h diff --git a/src/igl/copyleft/cgal/half_space_box.cpp b/src/libigl/igl/copyleft/cgal/half_space_box.cpp similarity index 100% rename from src/igl/copyleft/cgal/half_space_box.cpp rename to src/libigl/igl/copyleft/cgal/half_space_box.cpp diff --git a/src/igl/copyleft/cgal/half_space_box.h b/src/libigl/igl/copyleft/cgal/half_space_box.h similarity index 100% rename from src/igl/copyleft/cgal/half_space_box.h rename to src/libigl/igl/copyleft/cgal/half_space_box.h diff --git a/src/igl/copyleft/cgal/hausdorff.cpp b/src/libigl/igl/copyleft/cgal/hausdorff.cpp similarity index 100% rename from src/igl/copyleft/cgal/hausdorff.cpp rename to src/libigl/igl/copyleft/cgal/hausdorff.cpp diff --git a/src/igl/copyleft/cgal/hausdorff.h b/src/libigl/igl/copyleft/cgal/hausdorff.h similarity index 100% rename from src/igl/copyleft/cgal/hausdorff.h rename to src/libigl/igl/copyleft/cgal/hausdorff.h diff --git a/src/igl/copyleft/cgal/incircle.cpp b/src/libigl/igl/copyleft/cgal/incircle.cpp similarity index 100% rename from src/igl/copyleft/cgal/incircle.cpp rename to src/libigl/igl/copyleft/cgal/incircle.cpp diff --git a/src/igl/copyleft/cgal/incircle.h b/src/libigl/igl/copyleft/cgal/incircle.h similarity index 100% rename from src/igl/copyleft/cgal/incircle.h rename to src/libigl/igl/copyleft/cgal/incircle.h diff --git a/src/igl/copyleft/cgal/insert_into_cdt.cpp b/src/libigl/igl/copyleft/cgal/insert_into_cdt.cpp similarity index 100% rename from src/igl/copyleft/cgal/insert_into_cdt.cpp rename to src/libigl/igl/copyleft/cgal/insert_into_cdt.cpp diff --git a/src/igl/copyleft/cgal/insert_into_cdt.h b/src/libigl/igl/copyleft/cgal/insert_into_cdt.h similarity index 100% rename from src/igl/copyleft/cgal/insert_into_cdt.h rename to src/libigl/igl/copyleft/cgal/insert_into_cdt.h diff --git a/src/igl/copyleft/cgal/insphere.cpp b/src/libigl/igl/copyleft/cgal/insphere.cpp similarity index 100% rename from src/igl/copyleft/cgal/insphere.cpp rename to src/libigl/igl/copyleft/cgal/insphere.cpp diff --git a/src/igl/copyleft/cgal/insphere.h b/src/libigl/igl/copyleft/cgal/insphere.h similarity index 100% rename from src/igl/copyleft/cgal/insphere.h rename to src/libigl/igl/copyleft/cgal/insphere.h diff --git a/src/igl/copyleft/cgal/intersect_other.cpp b/src/libigl/igl/copyleft/cgal/intersect_other.cpp similarity index 100% rename from src/igl/copyleft/cgal/intersect_other.cpp rename to src/libigl/igl/copyleft/cgal/intersect_other.cpp diff --git a/src/igl/copyleft/cgal/intersect_other.h b/src/libigl/igl/copyleft/cgal/intersect_other.h similarity index 100% rename from src/igl/copyleft/cgal/intersect_other.h rename to src/libigl/igl/copyleft/cgal/intersect_other.h diff --git a/src/igl/copyleft/cgal/intersect_with_half_space.cpp b/src/libigl/igl/copyleft/cgal/intersect_with_half_space.cpp similarity index 100% rename from src/igl/copyleft/cgal/intersect_with_half_space.cpp rename to src/libigl/igl/copyleft/cgal/intersect_with_half_space.cpp diff --git a/src/igl/copyleft/cgal/intersect_with_half_space.h b/src/libigl/igl/copyleft/cgal/intersect_with_half_space.h similarity index 100% rename from src/igl/copyleft/cgal/intersect_with_half_space.h rename to src/libigl/igl/copyleft/cgal/intersect_with_half_space.h diff --git a/src/igl/copyleft/cgal/lexicographic_triangulation.cpp b/src/libigl/igl/copyleft/cgal/lexicographic_triangulation.cpp similarity index 100% rename from src/igl/copyleft/cgal/lexicographic_triangulation.cpp rename to src/libigl/igl/copyleft/cgal/lexicographic_triangulation.cpp diff --git a/src/igl/copyleft/cgal/lexicographic_triangulation.h b/src/libigl/igl/copyleft/cgal/lexicographic_triangulation.h similarity index 100% rename from src/igl/copyleft/cgal/lexicographic_triangulation.h rename to src/libigl/igl/copyleft/cgal/lexicographic_triangulation.h diff --git a/src/igl/copyleft/cgal/list_to_matrix.cpp b/src/libigl/igl/copyleft/cgal/list_to_matrix.cpp similarity index 100% rename from src/igl/copyleft/cgal/list_to_matrix.cpp rename to src/libigl/igl/copyleft/cgal/list_to_matrix.cpp diff --git a/src/igl/copyleft/cgal/mesh_boolean.cpp b/src/libigl/igl/copyleft/cgal/mesh_boolean.cpp similarity index 100% rename from src/igl/copyleft/cgal/mesh_boolean.cpp rename to src/libigl/igl/copyleft/cgal/mesh_boolean.cpp diff --git a/src/igl/copyleft/cgal/mesh_boolean.h b/src/libigl/igl/copyleft/cgal/mesh_boolean.h similarity index 100% rename from src/igl/copyleft/cgal/mesh_boolean.h rename to src/libigl/igl/copyleft/cgal/mesh_boolean.h diff --git a/src/igl/copyleft/cgal/mesh_boolean_type_to_funcs.cpp b/src/libigl/igl/copyleft/cgal/mesh_boolean_type_to_funcs.cpp similarity index 100% rename from src/igl/copyleft/cgal/mesh_boolean_type_to_funcs.cpp rename to src/libigl/igl/copyleft/cgal/mesh_boolean_type_to_funcs.cpp diff --git a/src/igl/copyleft/cgal/mesh_boolean_type_to_funcs.h b/src/libigl/igl/copyleft/cgal/mesh_boolean_type_to_funcs.h similarity index 100% rename from src/igl/copyleft/cgal/mesh_boolean_type_to_funcs.h rename to src/libigl/igl/copyleft/cgal/mesh_boolean_type_to_funcs.h diff --git a/src/igl/copyleft/cgal/mesh_to_cgal_triangle_list.cpp b/src/libigl/igl/copyleft/cgal/mesh_to_cgal_triangle_list.cpp similarity index 100% rename from src/igl/copyleft/cgal/mesh_to_cgal_triangle_list.cpp rename to src/libigl/igl/copyleft/cgal/mesh_to_cgal_triangle_list.cpp diff --git a/src/igl/copyleft/cgal/mesh_to_cgal_triangle_list.h b/src/libigl/igl/copyleft/cgal/mesh_to_cgal_triangle_list.h similarity index 100% rename from src/igl/copyleft/cgal/mesh_to_cgal_triangle_list.h rename to src/libigl/igl/copyleft/cgal/mesh_to_cgal_triangle_list.h diff --git a/src/igl/copyleft/cgal/mesh_to_polyhedron.cpp b/src/libigl/igl/copyleft/cgal/mesh_to_polyhedron.cpp similarity index 100% rename from src/igl/copyleft/cgal/mesh_to_polyhedron.cpp rename to src/libigl/igl/copyleft/cgal/mesh_to_polyhedron.cpp diff --git a/src/igl/copyleft/cgal/mesh_to_polyhedron.h b/src/libigl/igl/copyleft/cgal/mesh_to_polyhedron.h similarity index 100% rename from src/igl/copyleft/cgal/mesh_to_polyhedron.h rename to src/libigl/igl/copyleft/cgal/mesh_to_polyhedron.h diff --git a/src/igl/copyleft/cgal/minkowski_sum.cpp b/src/libigl/igl/copyleft/cgal/minkowski_sum.cpp similarity index 100% rename from src/igl/copyleft/cgal/minkowski_sum.cpp rename to src/libigl/igl/copyleft/cgal/minkowski_sum.cpp diff --git a/src/igl/copyleft/cgal/minkowski_sum.h b/src/libigl/igl/copyleft/cgal/minkowski_sum.h similarity index 100% rename from src/igl/copyleft/cgal/minkowski_sum.h rename to src/libigl/igl/copyleft/cgal/minkowski_sum.h diff --git a/src/igl/copyleft/cgal/order_facets_around_edge.cpp b/src/libigl/igl/copyleft/cgal/order_facets_around_edge.cpp similarity index 100% rename from src/igl/copyleft/cgal/order_facets_around_edge.cpp rename to src/libigl/igl/copyleft/cgal/order_facets_around_edge.cpp diff --git a/src/igl/copyleft/cgal/order_facets_around_edge.h b/src/libigl/igl/copyleft/cgal/order_facets_around_edge.h similarity index 100% rename from src/igl/copyleft/cgal/order_facets_around_edge.h rename to src/libigl/igl/copyleft/cgal/order_facets_around_edge.h diff --git a/src/igl/copyleft/cgal/order_facets_around_edges.cpp b/src/libigl/igl/copyleft/cgal/order_facets_around_edges.cpp similarity index 100% rename from src/igl/copyleft/cgal/order_facets_around_edges.cpp rename to src/libigl/igl/copyleft/cgal/order_facets_around_edges.cpp diff --git a/src/igl/copyleft/cgal/order_facets_around_edges.h b/src/libigl/igl/copyleft/cgal/order_facets_around_edges.h similarity index 100% rename from src/igl/copyleft/cgal/order_facets_around_edges.h rename to src/libigl/igl/copyleft/cgal/order_facets_around_edges.h diff --git a/src/igl/copyleft/cgal/orient2D.cpp b/src/libigl/igl/copyleft/cgal/orient2D.cpp similarity index 100% rename from src/igl/copyleft/cgal/orient2D.cpp rename to src/libigl/igl/copyleft/cgal/orient2D.cpp diff --git a/src/igl/copyleft/cgal/orient2D.h b/src/libigl/igl/copyleft/cgal/orient2D.h similarity index 100% rename from src/igl/copyleft/cgal/orient2D.h rename to src/libigl/igl/copyleft/cgal/orient2D.h diff --git a/src/igl/copyleft/cgal/orient3D.cpp b/src/libigl/igl/copyleft/cgal/orient3D.cpp similarity index 100% rename from src/igl/copyleft/cgal/orient3D.cpp rename to src/libigl/igl/copyleft/cgal/orient3D.cpp diff --git a/src/igl/copyleft/cgal/orient3D.h b/src/libigl/igl/copyleft/cgal/orient3D.h similarity index 100% rename from src/igl/copyleft/cgal/orient3D.h rename to src/libigl/igl/copyleft/cgal/orient3D.h diff --git a/src/igl/copyleft/cgal/outer_element.cpp b/src/libigl/igl/copyleft/cgal/outer_element.cpp similarity index 100% rename from src/igl/copyleft/cgal/outer_element.cpp rename to src/libigl/igl/copyleft/cgal/outer_element.cpp diff --git a/src/igl/copyleft/cgal/outer_element.h b/src/libigl/igl/copyleft/cgal/outer_element.h similarity index 100% rename from src/igl/copyleft/cgal/outer_element.h rename to src/libigl/igl/copyleft/cgal/outer_element.h diff --git a/src/igl/copyleft/cgal/outer_facet.cpp b/src/libigl/igl/copyleft/cgal/outer_facet.cpp similarity index 100% rename from src/igl/copyleft/cgal/outer_facet.cpp rename to src/libigl/igl/copyleft/cgal/outer_facet.cpp diff --git a/src/igl/copyleft/cgal/outer_facet.h b/src/libigl/igl/copyleft/cgal/outer_facet.h similarity index 100% rename from src/igl/copyleft/cgal/outer_facet.h rename to src/libigl/igl/copyleft/cgal/outer_facet.h diff --git a/src/igl/copyleft/cgal/outer_hull.cpp b/src/libigl/igl/copyleft/cgal/outer_hull.cpp similarity index 100% rename from src/igl/copyleft/cgal/outer_hull.cpp rename to src/libigl/igl/copyleft/cgal/outer_hull.cpp diff --git a/src/igl/copyleft/cgal/outer_hull.h b/src/libigl/igl/copyleft/cgal/outer_hull.h similarity index 100% rename from src/igl/copyleft/cgal/outer_hull.h rename to src/libigl/igl/copyleft/cgal/outer_hull.h diff --git a/src/igl/copyleft/cgal/peel_outer_hull_layers.cpp b/src/libigl/igl/copyleft/cgal/peel_outer_hull_layers.cpp similarity index 100% rename from src/igl/copyleft/cgal/peel_outer_hull_layers.cpp rename to src/libigl/igl/copyleft/cgal/peel_outer_hull_layers.cpp diff --git a/src/igl/copyleft/cgal/peel_outer_hull_layers.h b/src/libigl/igl/copyleft/cgal/peel_outer_hull_layers.h similarity index 100% rename from src/igl/copyleft/cgal/peel_outer_hull_layers.h rename to src/libigl/igl/copyleft/cgal/peel_outer_hull_layers.h diff --git a/src/igl/copyleft/cgal/peel_winding_number_layers.cpp b/src/libigl/igl/copyleft/cgal/peel_winding_number_layers.cpp similarity index 100% rename from src/igl/copyleft/cgal/peel_winding_number_layers.cpp rename to src/libigl/igl/copyleft/cgal/peel_winding_number_layers.cpp diff --git a/src/igl/copyleft/cgal/peel_winding_number_layers.h b/src/libigl/igl/copyleft/cgal/peel_winding_number_layers.h similarity index 100% rename from src/igl/copyleft/cgal/peel_winding_number_layers.h rename to src/libigl/igl/copyleft/cgal/peel_winding_number_layers.h diff --git a/src/igl/copyleft/cgal/piecewise_constant_winding_number.cpp b/src/libigl/igl/copyleft/cgal/piecewise_constant_winding_number.cpp similarity index 100% rename from src/igl/copyleft/cgal/piecewise_constant_winding_number.cpp rename to src/libigl/igl/copyleft/cgal/piecewise_constant_winding_number.cpp diff --git a/src/igl/copyleft/cgal/piecewise_constant_winding_number.h b/src/libigl/igl/copyleft/cgal/piecewise_constant_winding_number.h similarity index 100% rename from src/igl/copyleft/cgal/piecewise_constant_winding_number.h rename to src/libigl/igl/copyleft/cgal/piecewise_constant_winding_number.h diff --git a/src/igl/copyleft/cgal/point_areas.cpp b/src/libigl/igl/copyleft/cgal/point_areas.cpp similarity index 100% rename from src/igl/copyleft/cgal/point_areas.cpp rename to src/libigl/igl/copyleft/cgal/point_areas.cpp diff --git a/src/igl/copyleft/cgal/point_areas.h b/src/libigl/igl/copyleft/cgal/point_areas.h similarity index 100% rename from src/igl/copyleft/cgal/point_areas.h rename to src/libigl/igl/copyleft/cgal/point_areas.h diff --git a/src/igl/copyleft/cgal/point_mesh_squared_distance.cpp b/src/libigl/igl/copyleft/cgal/point_mesh_squared_distance.cpp similarity index 100% rename from src/igl/copyleft/cgal/point_mesh_squared_distance.cpp rename to src/libigl/igl/copyleft/cgal/point_mesh_squared_distance.cpp diff --git a/src/igl/copyleft/cgal/point_mesh_squared_distance.h b/src/libigl/igl/copyleft/cgal/point_mesh_squared_distance.h similarity index 100% rename from src/igl/copyleft/cgal/point_mesh_squared_distance.h rename to src/libigl/igl/copyleft/cgal/point_mesh_squared_distance.h diff --git a/src/igl/copyleft/cgal/point_segment_squared_distance.cpp b/src/libigl/igl/copyleft/cgal/point_segment_squared_distance.cpp similarity index 100% rename from src/igl/copyleft/cgal/point_segment_squared_distance.cpp rename to src/libigl/igl/copyleft/cgal/point_segment_squared_distance.cpp diff --git a/src/igl/copyleft/cgal/point_segment_squared_distance.h b/src/libigl/igl/copyleft/cgal/point_segment_squared_distance.h similarity index 100% rename from src/igl/copyleft/cgal/point_segment_squared_distance.h rename to src/libigl/igl/copyleft/cgal/point_segment_squared_distance.h diff --git a/src/igl/copyleft/cgal/point_solid_signed_squared_distance.cpp b/src/libigl/igl/copyleft/cgal/point_solid_signed_squared_distance.cpp similarity index 100% rename from src/igl/copyleft/cgal/point_solid_signed_squared_distance.cpp rename to src/libigl/igl/copyleft/cgal/point_solid_signed_squared_distance.cpp diff --git a/src/igl/copyleft/cgal/point_solid_signed_squared_distance.h b/src/libigl/igl/copyleft/cgal/point_solid_signed_squared_distance.h similarity index 100% rename from src/igl/copyleft/cgal/point_solid_signed_squared_distance.h rename to src/libigl/igl/copyleft/cgal/point_solid_signed_squared_distance.h diff --git a/src/igl/copyleft/cgal/point_triangle_squared_distance.cpp b/src/libigl/igl/copyleft/cgal/point_triangle_squared_distance.cpp similarity index 100% rename from src/igl/copyleft/cgal/point_triangle_squared_distance.cpp rename to src/libigl/igl/copyleft/cgal/point_triangle_squared_distance.cpp diff --git a/src/igl/copyleft/cgal/point_triangle_squared_distance.h b/src/libigl/igl/copyleft/cgal/point_triangle_squared_distance.h similarity index 100% rename from src/igl/copyleft/cgal/point_triangle_squared_distance.h rename to src/libigl/igl/copyleft/cgal/point_triangle_squared_distance.h diff --git a/src/igl/copyleft/cgal/points_inside_component.cpp b/src/libigl/igl/copyleft/cgal/points_inside_component.cpp similarity index 100% rename from src/igl/copyleft/cgal/points_inside_component.cpp rename to src/libigl/igl/copyleft/cgal/points_inside_component.cpp diff --git a/src/igl/copyleft/cgal/points_inside_component.h b/src/libigl/igl/copyleft/cgal/points_inside_component.h similarity index 100% rename from src/igl/copyleft/cgal/points_inside_component.h rename to src/libigl/igl/copyleft/cgal/points_inside_component.h diff --git a/src/igl/copyleft/cgal/polyhedron_to_mesh.cpp b/src/libigl/igl/copyleft/cgal/polyhedron_to_mesh.cpp similarity index 100% rename from src/igl/copyleft/cgal/polyhedron_to_mesh.cpp rename to src/libigl/igl/copyleft/cgal/polyhedron_to_mesh.cpp diff --git a/src/igl/copyleft/cgal/polyhedron_to_mesh.h b/src/libigl/igl/copyleft/cgal/polyhedron_to_mesh.h similarity index 100% rename from src/igl/copyleft/cgal/polyhedron_to_mesh.h rename to src/libigl/igl/copyleft/cgal/polyhedron_to_mesh.h diff --git a/src/igl/copyleft/cgal/projected_cdt.cpp b/src/libigl/igl/copyleft/cgal/projected_cdt.cpp similarity index 100% rename from src/igl/copyleft/cgal/projected_cdt.cpp rename to src/libigl/igl/copyleft/cgal/projected_cdt.cpp diff --git a/src/igl/copyleft/cgal/projected_cdt.h b/src/libigl/igl/copyleft/cgal/projected_cdt.h similarity index 100% rename from src/igl/copyleft/cgal/projected_cdt.h rename to src/libigl/igl/copyleft/cgal/projected_cdt.h diff --git a/src/igl/copyleft/cgal/projected_delaunay.cpp b/src/libigl/igl/copyleft/cgal/projected_delaunay.cpp similarity index 100% rename from src/igl/copyleft/cgal/projected_delaunay.cpp rename to src/libigl/igl/copyleft/cgal/projected_delaunay.cpp diff --git a/src/igl/copyleft/cgal/projected_delaunay.h b/src/libigl/igl/copyleft/cgal/projected_delaunay.h similarity index 100% rename from src/igl/copyleft/cgal/projected_delaunay.h rename to src/libigl/igl/copyleft/cgal/projected_delaunay.h diff --git a/src/igl/copyleft/cgal/propagate_winding_numbers.cpp b/src/libigl/igl/copyleft/cgal/propagate_winding_numbers.cpp similarity index 100% rename from src/igl/copyleft/cgal/propagate_winding_numbers.cpp rename to src/libigl/igl/copyleft/cgal/propagate_winding_numbers.cpp diff --git a/src/igl/copyleft/cgal/propagate_winding_numbers.h b/src/libigl/igl/copyleft/cgal/propagate_winding_numbers.h similarity index 100% rename from src/igl/copyleft/cgal/propagate_winding_numbers.h rename to src/libigl/igl/copyleft/cgal/propagate_winding_numbers.h diff --git a/src/igl/copyleft/cgal/read_triangle_mesh.cpp b/src/libigl/igl/copyleft/cgal/read_triangle_mesh.cpp similarity index 100% rename from src/igl/copyleft/cgal/read_triangle_mesh.cpp rename to src/libigl/igl/copyleft/cgal/read_triangle_mesh.cpp diff --git a/src/igl/copyleft/cgal/read_triangle_mesh.h b/src/libigl/igl/copyleft/cgal/read_triangle_mesh.h similarity index 100% rename from src/igl/copyleft/cgal/read_triangle_mesh.h rename to src/libigl/igl/copyleft/cgal/read_triangle_mesh.h diff --git a/src/igl/copyleft/cgal/relabel_small_immersed_cells.cpp b/src/libigl/igl/copyleft/cgal/relabel_small_immersed_cells.cpp similarity index 100% rename from src/igl/copyleft/cgal/relabel_small_immersed_cells.cpp rename to src/libigl/igl/copyleft/cgal/relabel_small_immersed_cells.cpp diff --git a/src/igl/copyleft/cgal/relabel_small_immersed_cells.h b/src/libigl/igl/copyleft/cgal/relabel_small_immersed_cells.h similarity index 100% rename from src/igl/copyleft/cgal/relabel_small_immersed_cells.h rename to src/libigl/igl/copyleft/cgal/relabel_small_immersed_cells.h diff --git a/src/igl/copyleft/cgal/remesh_intersections.cpp b/src/libigl/igl/copyleft/cgal/remesh_intersections.cpp similarity index 100% rename from src/igl/copyleft/cgal/remesh_intersections.cpp rename to src/libigl/igl/copyleft/cgal/remesh_intersections.cpp diff --git a/src/igl/copyleft/cgal/remesh_intersections.h b/src/libigl/igl/copyleft/cgal/remesh_intersections.h similarity index 100% rename from src/igl/copyleft/cgal/remesh_intersections.h rename to src/libigl/igl/copyleft/cgal/remesh_intersections.h diff --git a/src/igl/copyleft/cgal/remesh_self_intersections.cpp b/src/libigl/igl/copyleft/cgal/remesh_self_intersections.cpp similarity index 100% rename from src/igl/copyleft/cgal/remesh_self_intersections.cpp rename to src/libigl/igl/copyleft/cgal/remesh_self_intersections.cpp diff --git a/src/igl/copyleft/cgal/remesh_self_intersections.h b/src/libigl/igl/copyleft/cgal/remesh_self_intersections.h similarity index 100% rename from src/igl/copyleft/cgal/remesh_self_intersections.h rename to src/libigl/igl/copyleft/cgal/remesh_self_intersections.h diff --git a/src/igl/copyleft/cgal/remove_unreferenced.cpp b/src/libigl/igl/copyleft/cgal/remove_unreferenced.cpp similarity index 100% rename from src/igl/copyleft/cgal/remove_unreferenced.cpp rename to src/libigl/igl/copyleft/cgal/remove_unreferenced.cpp diff --git a/src/igl/copyleft/cgal/resolve_intersections.cpp b/src/libigl/igl/copyleft/cgal/resolve_intersections.cpp similarity index 100% rename from src/igl/copyleft/cgal/resolve_intersections.cpp rename to src/libigl/igl/copyleft/cgal/resolve_intersections.cpp diff --git a/src/igl/copyleft/cgal/resolve_intersections.h b/src/libigl/igl/copyleft/cgal/resolve_intersections.h similarity index 100% rename from src/igl/copyleft/cgal/resolve_intersections.h rename to src/libigl/igl/copyleft/cgal/resolve_intersections.h diff --git a/src/igl/copyleft/cgal/row_to_point.cpp b/src/libigl/igl/copyleft/cgal/row_to_point.cpp similarity index 100% rename from src/igl/copyleft/cgal/row_to_point.cpp rename to src/libigl/igl/copyleft/cgal/row_to_point.cpp diff --git a/src/igl/copyleft/cgal/row_to_point.h b/src/libigl/igl/copyleft/cgal/row_to_point.h similarity index 100% rename from src/igl/copyleft/cgal/row_to_point.h rename to src/libigl/igl/copyleft/cgal/row_to_point.h diff --git a/src/igl/copyleft/cgal/segment_segment_squared_distance.cpp b/src/libigl/igl/copyleft/cgal/segment_segment_squared_distance.cpp similarity index 100% rename from src/igl/copyleft/cgal/segment_segment_squared_distance.cpp rename to src/libigl/igl/copyleft/cgal/segment_segment_squared_distance.cpp diff --git a/src/igl/copyleft/cgal/segment_segment_squared_distance.h b/src/libigl/igl/copyleft/cgal/segment_segment_squared_distance.h similarity index 100% rename from src/igl/copyleft/cgal/segment_segment_squared_distance.h rename to src/libigl/igl/copyleft/cgal/segment_segment_squared_distance.h diff --git a/src/igl/copyleft/cgal/signed_distance_isosurface.cpp b/src/libigl/igl/copyleft/cgal/signed_distance_isosurface.cpp similarity index 100% rename from src/igl/copyleft/cgal/signed_distance_isosurface.cpp rename to src/libigl/igl/copyleft/cgal/signed_distance_isosurface.cpp diff --git a/src/igl/copyleft/cgal/signed_distance_isosurface.h b/src/libigl/igl/copyleft/cgal/signed_distance_isosurface.h similarity index 100% rename from src/igl/copyleft/cgal/signed_distance_isosurface.h rename to src/libigl/igl/copyleft/cgal/signed_distance_isosurface.h diff --git a/src/igl/copyleft/cgal/slice.cpp b/src/libigl/igl/copyleft/cgal/slice.cpp similarity index 100% rename from src/igl/copyleft/cgal/slice.cpp rename to src/libigl/igl/copyleft/cgal/slice.cpp diff --git a/src/igl/copyleft/cgal/slice_mask.cpp b/src/libigl/igl/copyleft/cgal/slice_mask.cpp similarity index 100% rename from src/igl/copyleft/cgal/slice_mask.cpp rename to src/libigl/igl/copyleft/cgal/slice_mask.cpp diff --git a/src/igl/copyleft/cgal/snap_rounding.cpp b/src/libigl/igl/copyleft/cgal/snap_rounding.cpp similarity index 100% rename from src/igl/copyleft/cgal/snap_rounding.cpp rename to src/libigl/igl/copyleft/cgal/snap_rounding.cpp diff --git a/src/igl/copyleft/cgal/snap_rounding.h b/src/libigl/igl/copyleft/cgal/snap_rounding.h similarity index 100% rename from src/igl/copyleft/cgal/snap_rounding.h rename to src/libigl/igl/copyleft/cgal/snap_rounding.h diff --git a/src/igl/copyleft/cgal/string_to_mesh_boolean_type.cpp b/src/libigl/igl/copyleft/cgal/string_to_mesh_boolean_type.cpp similarity index 100% rename from src/igl/copyleft/cgal/string_to_mesh_boolean_type.cpp rename to src/libigl/igl/copyleft/cgal/string_to_mesh_boolean_type.cpp diff --git a/src/igl/copyleft/cgal/string_to_mesh_boolean_type.h b/src/libigl/igl/copyleft/cgal/string_to_mesh_boolean_type.h similarity index 100% rename from src/igl/copyleft/cgal/string_to_mesh_boolean_type.h rename to src/libigl/igl/copyleft/cgal/string_to_mesh_boolean_type.h diff --git a/src/igl/copyleft/cgal/subdivide_segments.cpp b/src/libigl/igl/copyleft/cgal/subdivide_segments.cpp similarity index 100% rename from src/igl/copyleft/cgal/subdivide_segments.cpp rename to src/libigl/igl/copyleft/cgal/subdivide_segments.cpp diff --git a/src/igl/copyleft/cgal/subdivide_segments.h b/src/libigl/igl/copyleft/cgal/subdivide_segments.h similarity index 100% rename from src/igl/copyleft/cgal/subdivide_segments.h rename to src/libigl/igl/copyleft/cgal/subdivide_segments.h diff --git a/src/igl/copyleft/cgal/submesh_aabb_tree.cpp b/src/libigl/igl/copyleft/cgal/submesh_aabb_tree.cpp similarity index 100% rename from src/igl/copyleft/cgal/submesh_aabb_tree.cpp rename to src/libigl/igl/copyleft/cgal/submesh_aabb_tree.cpp diff --git a/src/igl/copyleft/cgal/submesh_aabb_tree.h b/src/libigl/igl/copyleft/cgal/submesh_aabb_tree.h similarity index 100% rename from src/igl/copyleft/cgal/submesh_aabb_tree.h rename to src/libigl/igl/copyleft/cgal/submesh_aabb_tree.h diff --git a/src/igl/copyleft/cgal/triangle_triangle_squared_distance.cpp b/src/libigl/igl/copyleft/cgal/triangle_triangle_squared_distance.cpp similarity index 100% rename from src/igl/copyleft/cgal/triangle_triangle_squared_distance.cpp rename to src/libigl/igl/copyleft/cgal/triangle_triangle_squared_distance.cpp diff --git a/src/igl/copyleft/cgal/triangle_triangle_squared_distance.h b/src/libigl/igl/copyleft/cgal/triangle_triangle_squared_distance.h similarity index 100% rename from src/igl/copyleft/cgal/triangle_triangle_squared_distance.h rename to src/libigl/igl/copyleft/cgal/triangle_triangle_squared_distance.h diff --git a/src/igl/copyleft/cgal/trim_with_solid.cpp b/src/libigl/igl/copyleft/cgal/trim_with_solid.cpp similarity index 100% rename from src/igl/copyleft/cgal/trim_with_solid.cpp rename to src/libigl/igl/copyleft/cgal/trim_with_solid.cpp diff --git a/src/igl/copyleft/cgal/trim_with_solid.h b/src/libigl/igl/copyleft/cgal/trim_with_solid.h similarity index 100% rename from src/igl/copyleft/cgal/trim_with_solid.h rename to src/libigl/igl/copyleft/cgal/trim_with_solid.h diff --git a/src/igl/copyleft/cgal/unique.cpp b/src/libigl/igl/copyleft/cgal/unique.cpp similarity index 100% rename from src/igl/copyleft/cgal/unique.cpp rename to src/libigl/igl/copyleft/cgal/unique.cpp diff --git a/src/igl/copyleft/cgal/unique_rows.cpp b/src/libigl/igl/copyleft/cgal/unique_rows.cpp similarity index 100% rename from src/igl/copyleft/cgal/unique_rows.cpp rename to src/libigl/igl/copyleft/cgal/unique_rows.cpp diff --git a/src/igl/copyleft/cgal/wire_mesh.cpp b/src/libigl/igl/copyleft/cgal/wire_mesh.cpp similarity index 100% rename from src/igl/copyleft/cgal/wire_mesh.cpp rename to src/libigl/igl/copyleft/cgal/wire_mesh.cpp diff --git a/src/igl/copyleft/cgal/wire_mesh.h b/src/libigl/igl/copyleft/cgal/wire_mesh.h similarity index 100% rename from src/igl/copyleft/cgal/wire_mesh.h rename to src/libigl/igl/copyleft/cgal/wire_mesh.h diff --git a/src/igl/copyleft/comiso/frame_field.cpp b/src/libigl/igl/copyleft/comiso/frame_field.cpp similarity index 100% rename from src/igl/copyleft/comiso/frame_field.cpp rename to src/libigl/igl/copyleft/comiso/frame_field.cpp diff --git a/src/igl/copyleft/comiso/frame_field.h b/src/libigl/igl/copyleft/comiso/frame_field.h similarity index 100% rename from src/igl/copyleft/comiso/frame_field.h rename to src/libigl/igl/copyleft/comiso/frame_field.h diff --git a/src/igl/copyleft/comiso/miq.cpp b/src/libigl/igl/copyleft/comiso/miq.cpp similarity index 100% rename from src/igl/copyleft/comiso/miq.cpp rename to src/libigl/igl/copyleft/comiso/miq.cpp diff --git a/src/igl/copyleft/comiso/miq.h b/src/libigl/igl/copyleft/comiso/miq.h similarity index 100% rename from src/igl/copyleft/comiso/miq.h rename to src/libigl/igl/copyleft/comiso/miq.h diff --git a/src/igl/copyleft/comiso/nrosy.cpp b/src/libigl/igl/copyleft/comiso/nrosy.cpp similarity index 100% rename from src/igl/copyleft/comiso/nrosy.cpp rename to src/libigl/igl/copyleft/comiso/nrosy.cpp diff --git a/src/igl/copyleft/comiso/nrosy.h b/src/libigl/igl/copyleft/comiso/nrosy.h similarity index 100% rename from src/igl/copyleft/comiso/nrosy.h rename to src/libigl/igl/copyleft/comiso/nrosy.h diff --git a/src/igl/copyleft/cork/from_cork_mesh.cpp b/src/libigl/igl/copyleft/cork/from_cork_mesh.cpp similarity index 100% rename from src/igl/copyleft/cork/from_cork_mesh.cpp rename to src/libigl/igl/copyleft/cork/from_cork_mesh.cpp diff --git a/src/igl/copyleft/cork/from_cork_mesh.h b/src/libigl/igl/copyleft/cork/from_cork_mesh.h similarity index 100% rename from src/igl/copyleft/cork/from_cork_mesh.h rename to src/libigl/igl/copyleft/cork/from_cork_mesh.h diff --git a/src/igl/copyleft/cork/mesh_boolean.cpp b/src/libigl/igl/copyleft/cork/mesh_boolean.cpp similarity index 100% rename from src/igl/copyleft/cork/mesh_boolean.cpp rename to src/libigl/igl/copyleft/cork/mesh_boolean.cpp diff --git a/src/igl/copyleft/cork/mesh_boolean.h b/src/libigl/igl/copyleft/cork/mesh_boolean.h similarity index 100% rename from src/igl/copyleft/cork/mesh_boolean.h rename to src/libigl/igl/copyleft/cork/mesh_boolean.h diff --git a/src/igl/copyleft/cork/to_cork_mesh.cpp b/src/libigl/igl/copyleft/cork/to_cork_mesh.cpp similarity index 100% rename from src/igl/copyleft/cork/to_cork_mesh.cpp rename to src/libigl/igl/copyleft/cork/to_cork_mesh.cpp diff --git a/src/igl/copyleft/cork/to_cork_mesh.h b/src/libigl/igl/copyleft/cork/to_cork_mesh.h similarity index 100% rename from src/igl/copyleft/cork/to_cork_mesh.h rename to src/libigl/igl/copyleft/cork/to_cork_mesh.h diff --git a/src/igl/copyleft/marching_cubes.cpp b/src/libigl/igl/copyleft/marching_cubes.cpp similarity index 100% rename from src/igl/copyleft/marching_cubes.cpp rename to src/libigl/igl/copyleft/marching_cubes.cpp diff --git a/src/igl/copyleft/marching_cubes.h b/src/libigl/igl/copyleft/marching_cubes.h similarity index 100% rename from src/igl/copyleft/marching_cubes.h rename to src/libigl/igl/copyleft/marching_cubes.h diff --git a/src/igl/copyleft/marching_cubes_tables.h b/src/libigl/igl/copyleft/marching_cubes_tables.h similarity index 100% rename from src/igl/copyleft/marching_cubes_tables.h rename to src/libigl/igl/copyleft/marching_cubes_tables.h diff --git a/src/igl/copyleft/offset_surface.cpp b/src/libigl/igl/copyleft/offset_surface.cpp similarity index 100% rename from src/igl/copyleft/offset_surface.cpp rename to src/libigl/igl/copyleft/offset_surface.cpp diff --git a/src/igl/copyleft/offset_surface.h b/src/libigl/igl/copyleft/offset_surface.h similarity index 100% rename from src/igl/copyleft/offset_surface.h rename to src/libigl/igl/copyleft/offset_surface.h diff --git a/src/igl/copyleft/opengl2/render_to_tga.cpp b/src/libigl/igl/copyleft/opengl2/render_to_tga.cpp similarity index 100% rename from src/igl/copyleft/opengl2/render_to_tga.cpp rename to src/libigl/igl/copyleft/opengl2/render_to_tga.cpp diff --git a/src/igl/copyleft/opengl2/render_to_tga.h b/src/libigl/igl/copyleft/opengl2/render_to_tga.h similarity index 100% rename from src/igl/copyleft/opengl2/render_to_tga.h rename to src/libigl/igl/copyleft/opengl2/render_to_tga.h diff --git a/src/igl/copyleft/opengl2/texture_from_tga.cpp b/src/libigl/igl/copyleft/opengl2/texture_from_tga.cpp similarity index 100% rename from src/igl/copyleft/opengl2/texture_from_tga.cpp rename to src/libigl/igl/copyleft/opengl2/texture_from_tga.cpp diff --git a/src/igl/copyleft/opengl2/texture_from_tga.h b/src/libigl/igl/copyleft/opengl2/texture_from_tga.h similarity index 100% rename from src/igl/copyleft/opengl2/texture_from_tga.h rename to src/libigl/igl/copyleft/opengl2/texture_from_tga.h diff --git a/src/igl/copyleft/opengl2/tga.cpp b/src/libigl/igl/copyleft/opengl2/tga.cpp similarity index 100% rename from src/igl/copyleft/opengl2/tga.cpp rename to src/libigl/igl/copyleft/opengl2/tga.cpp diff --git a/src/igl/copyleft/opengl2/tga.h b/src/libigl/igl/copyleft/opengl2/tga.h similarity index 100% rename from src/igl/copyleft/opengl2/tga.h rename to src/libigl/igl/copyleft/opengl2/tga.h diff --git a/src/igl/copyleft/progressive_hulls.cpp b/src/libigl/igl/copyleft/progressive_hulls.cpp similarity index 100% rename from src/igl/copyleft/progressive_hulls.cpp rename to src/libigl/igl/copyleft/progressive_hulls.cpp diff --git a/src/igl/copyleft/progressive_hulls.h b/src/libigl/igl/copyleft/progressive_hulls.h similarity index 100% rename from src/igl/copyleft/progressive_hulls.h rename to src/libigl/igl/copyleft/progressive_hulls.h diff --git a/src/igl/copyleft/progressive_hulls_cost_and_placement.cpp b/src/libigl/igl/copyleft/progressive_hulls_cost_and_placement.cpp similarity index 100% rename from src/igl/copyleft/progressive_hulls_cost_and_placement.cpp rename to src/libigl/igl/copyleft/progressive_hulls_cost_and_placement.cpp diff --git a/src/igl/copyleft/progressive_hulls_cost_and_placement.h b/src/libigl/igl/copyleft/progressive_hulls_cost_and_placement.h similarity index 100% rename from src/igl/copyleft/progressive_hulls_cost_and_placement.h rename to src/libigl/igl/copyleft/progressive_hulls_cost_and_placement.h diff --git a/src/igl/copyleft/quadprog.cpp b/src/libigl/igl/copyleft/quadprog.cpp similarity index 100% rename from src/igl/copyleft/quadprog.cpp rename to src/libigl/igl/copyleft/quadprog.cpp diff --git a/src/igl/copyleft/quadprog.h b/src/libigl/igl/copyleft/quadprog.h similarity index 100% rename from src/igl/copyleft/quadprog.h rename to src/libigl/igl/copyleft/quadprog.h diff --git a/src/igl/copyleft/swept_volume.cpp b/src/libigl/igl/copyleft/swept_volume.cpp similarity index 100% rename from src/igl/copyleft/swept_volume.cpp rename to src/libigl/igl/copyleft/swept_volume.cpp diff --git a/src/igl/copyleft/swept_volume.h b/src/libigl/igl/copyleft/swept_volume.h similarity index 100% rename from src/igl/copyleft/swept_volume.h rename to src/libigl/igl/copyleft/swept_volume.h diff --git a/src/igl/copyleft/tetgen/README b/src/libigl/igl/copyleft/tetgen/README similarity index 100% rename from src/igl/copyleft/tetgen/README rename to src/libigl/igl/copyleft/tetgen/README diff --git a/src/igl/copyleft/tetgen/cdt.cpp b/src/libigl/igl/copyleft/tetgen/cdt.cpp similarity index 100% rename from src/igl/copyleft/tetgen/cdt.cpp rename to src/libigl/igl/copyleft/tetgen/cdt.cpp diff --git a/src/igl/copyleft/tetgen/cdt.h b/src/libigl/igl/copyleft/tetgen/cdt.h similarity index 100% rename from src/igl/copyleft/tetgen/cdt.h rename to src/libigl/igl/copyleft/tetgen/cdt.h diff --git a/src/igl/copyleft/tetgen/mesh_to_tetgenio.cpp b/src/libigl/igl/copyleft/tetgen/mesh_to_tetgenio.cpp similarity index 100% rename from src/igl/copyleft/tetgen/mesh_to_tetgenio.cpp rename to src/libigl/igl/copyleft/tetgen/mesh_to_tetgenio.cpp diff --git a/src/igl/copyleft/tetgen/mesh_to_tetgenio.h b/src/libigl/igl/copyleft/tetgen/mesh_to_tetgenio.h similarity index 100% rename from src/igl/copyleft/tetgen/mesh_to_tetgenio.h rename to src/libigl/igl/copyleft/tetgen/mesh_to_tetgenio.h diff --git a/src/igl/copyleft/tetgen/mesh_with_skeleton.cpp b/src/libigl/igl/copyleft/tetgen/mesh_with_skeleton.cpp similarity index 100% rename from src/igl/copyleft/tetgen/mesh_with_skeleton.cpp rename to src/libigl/igl/copyleft/tetgen/mesh_with_skeleton.cpp diff --git a/src/igl/copyleft/tetgen/mesh_with_skeleton.h b/src/libigl/igl/copyleft/tetgen/mesh_with_skeleton.h similarity index 100% rename from src/igl/copyleft/tetgen/mesh_with_skeleton.h rename to src/libigl/igl/copyleft/tetgen/mesh_with_skeleton.h diff --git a/src/igl/copyleft/tetgen/read_into_tetgenio.cpp b/src/libigl/igl/copyleft/tetgen/read_into_tetgenio.cpp similarity index 100% rename from src/igl/copyleft/tetgen/read_into_tetgenio.cpp rename to src/libigl/igl/copyleft/tetgen/read_into_tetgenio.cpp diff --git a/src/igl/copyleft/tetgen/read_into_tetgenio.h b/src/libigl/igl/copyleft/tetgen/read_into_tetgenio.h similarity index 100% rename from src/igl/copyleft/tetgen/read_into_tetgenio.h rename to src/libigl/igl/copyleft/tetgen/read_into_tetgenio.h diff --git a/src/igl/copyleft/tetgen/tetgenio_to_tetmesh.cpp b/src/libigl/igl/copyleft/tetgen/tetgenio_to_tetmesh.cpp similarity index 100% rename from src/igl/copyleft/tetgen/tetgenio_to_tetmesh.cpp rename to src/libigl/igl/copyleft/tetgen/tetgenio_to_tetmesh.cpp diff --git a/src/igl/copyleft/tetgen/tetgenio_to_tetmesh.h b/src/libigl/igl/copyleft/tetgen/tetgenio_to_tetmesh.h similarity index 100% rename from src/igl/copyleft/tetgen/tetgenio_to_tetmesh.h rename to src/libigl/igl/copyleft/tetgen/tetgenio_to_tetmesh.h diff --git a/src/igl/copyleft/tetgen/tetrahedralize.cpp b/src/libigl/igl/copyleft/tetgen/tetrahedralize.cpp similarity index 100% rename from src/igl/copyleft/tetgen/tetrahedralize.cpp rename to src/libigl/igl/copyleft/tetgen/tetrahedralize.cpp diff --git a/src/igl/copyleft/tetgen/tetrahedralize.h b/src/libigl/igl/copyleft/tetgen/tetrahedralize.h similarity index 100% rename from src/igl/copyleft/tetgen/tetrahedralize.h rename to src/libigl/igl/copyleft/tetgen/tetrahedralize.h diff --git a/src/igl/cotmatrix.cpp b/src/libigl/igl/cotmatrix.cpp similarity index 100% rename from src/igl/cotmatrix.cpp rename to src/libigl/igl/cotmatrix.cpp diff --git a/src/igl/cotmatrix.h b/src/libigl/igl/cotmatrix.h similarity index 100% rename from src/igl/cotmatrix.h rename to src/libigl/igl/cotmatrix.h diff --git a/src/igl/cotmatrix_entries.cpp b/src/libigl/igl/cotmatrix_entries.cpp similarity index 100% rename from src/igl/cotmatrix_entries.cpp rename to src/libigl/igl/cotmatrix_entries.cpp diff --git a/src/igl/cotmatrix_entries.h b/src/libigl/igl/cotmatrix_entries.h similarity index 100% rename from src/igl/cotmatrix_entries.h rename to src/libigl/igl/cotmatrix_entries.h diff --git a/src/igl/count.cpp b/src/libigl/igl/count.cpp similarity index 100% rename from src/igl/count.cpp rename to src/libigl/igl/count.cpp diff --git a/src/igl/count.h b/src/libigl/igl/count.h similarity index 100% rename from src/igl/count.h rename to src/libigl/igl/count.h diff --git a/src/igl/covariance_scatter_matrix.cpp b/src/libigl/igl/covariance_scatter_matrix.cpp similarity index 100% rename from src/igl/covariance_scatter_matrix.cpp rename to src/libigl/igl/covariance_scatter_matrix.cpp diff --git a/src/igl/covariance_scatter_matrix.h b/src/libigl/igl/covariance_scatter_matrix.h similarity index 100% rename from src/igl/covariance_scatter_matrix.h rename to src/libigl/igl/covariance_scatter_matrix.h diff --git a/src/igl/cross.cpp b/src/libigl/igl/cross.cpp similarity index 100% rename from src/igl/cross.cpp rename to src/libigl/igl/cross.cpp diff --git a/src/igl/cross.h b/src/libigl/igl/cross.h similarity index 100% rename from src/igl/cross.h rename to src/libigl/igl/cross.h diff --git a/src/igl/cross_field_missmatch.cpp b/src/libigl/igl/cross_field_missmatch.cpp similarity index 100% rename from src/igl/cross_field_missmatch.cpp rename to src/libigl/igl/cross_field_missmatch.cpp diff --git a/src/igl/cross_field_missmatch.h b/src/libigl/igl/cross_field_missmatch.h similarity index 100% rename from src/igl/cross_field_missmatch.h rename to src/libigl/igl/cross_field_missmatch.h diff --git a/src/igl/crouzeix_raviart_cotmatrix.cpp b/src/libigl/igl/crouzeix_raviart_cotmatrix.cpp similarity index 100% rename from src/igl/crouzeix_raviart_cotmatrix.cpp rename to src/libigl/igl/crouzeix_raviart_cotmatrix.cpp diff --git a/src/igl/crouzeix_raviart_cotmatrix.h b/src/libigl/igl/crouzeix_raviart_cotmatrix.h similarity index 100% rename from src/igl/crouzeix_raviart_cotmatrix.h rename to src/libigl/igl/crouzeix_raviart_cotmatrix.h diff --git a/src/igl/crouzeix_raviart_massmatrix.cpp b/src/libigl/igl/crouzeix_raviart_massmatrix.cpp similarity index 100% rename from src/igl/crouzeix_raviart_massmatrix.cpp rename to src/libigl/igl/crouzeix_raviart_massmatrix.cpp diff --git a/src/igl/crouzeix_raviart_massmatrix.h b/src/libigl/igl/crouzeix_raviart_massmatrix.h similarity index 100% rename from src/igl/crouzeix_raviart_massmatrix.h rename to src/libigl/igl/crouzeix_raviart_massmatrix.h diff --git a/src/igl/cumsum.cpp b/src/libigl/igl/cumsum.cpp similarity index 100% rename from src/igl/cumsum.cpp rename to src/libigl/igl/cumsum.cpp diff --git a/src/igl/cumsum.h b/src/libigl/igl/cumsum.h similarity index 100% rename from src/igl/cumsum.h rename to src/libigl/igl/cumsum.h diff --git a/src/igl/cut_mesh.cpp b/src/libigl/igl/cut_mesh.cpp similarity index 100% rename from src/igl/cut_mesh.cpp rename to src/libigl/igl/cut_mesh.cpp diff --git a/src/igl/cut_mesh.h b/src/libigl/igl/cut_mesh.h similarity index 100% rename from src/igl/cut_mesh.h rename to src/libigl/igl/cut_mesh.h diff --git a/src/igl/cut_mesh_from_singularities.cpp b/src/libigl/igl/cut_mesh_from_singularities.cpp similarity index 100% rename from src/igl/cut_mesh_from_singularities.cpp rename to src/libigl/igl/cut_mesh_from_singularities.cpp diff --git a/src/igl/cut_mesh_from_singularities.h b/src/libigl/igl/cut_mesh_from_singularities.h similarity index 100% rename from src/igl/cut_mesh_from_singularities.h rename to src/libigl/igl/cut_mesh_from_singularities.h diff --git a/src/igl/cylinder.cpp b/src/libigl/igl/cylinder.cpp similarity index 100% rename from src/igl/cylinder.cpp rename to src/libigl/igl/cylinder.cpp diff --git a/src/igl/cylinder.h b/src/libigl/igl/cylinder.h similarity index 100% rename from src/igl/cylinder.h rename to src/libigl/igl/cylinder.h diff --git a/src/igl/dated_copy.cpp b/src/libigl/igl/dated_copy.cpp similarity index 100% rename from src/igl/dated_copy.cpp rename to src/libigl/igl/dated_copy.cpp diff --git a/src/igl/dated_copy.h b/src/libigl/igl/dated_copy.h similarity index 100% rename from src/igl/dated_copy.h rename to src/libigl/igl/dated_copy.h diff --git a/src/igl/decimate.cpp b/src/libigl/igl/decimate.cpp similarity index 100% rename from src/igl/decimate.cpp rename to src/libigl/igl/decimate.cpp diff --git a/src/igl/decimate.h b/src/libigl/igl/decimate.h similarity index 100% rename from src/igl/decimate.h rename to src/libigl/igl/decimate.h diff --git a/src/igl/deform_skeleton.cpp b/src/libigl/igl/deform_skeleton.cpp similarity index 100% rename from src/igl/deform_skeleton.cpp rename to src/libigl/igl/deform_skeleton.cpp diff --git a/src/igl/deform_skeleton.h b/src/libigl/igl/deform_skeleton.h similarity index 100% rename from src/igl/deform_skeleton.h rename to src/libigl/igl/deform_skeleton.h diff --git a/src/igl/delaunay_triangulation.cpp b/src/libigl/igl/delaunay_triangulation.cpp similarity index 100% rename from src/igl/delaunay_triangulation.cpp rename to src/libigl/igl/delaunay_triangulation.cpp diff --git a/src/igl/delaunay_triangulation.h b/src/libigl/igl/delaunay_triangulation.h similarity index 100% rename from src/igl/delaunay_triangulation.h rename to src/libigl/igl/delaunay_triangulation.h diff --git a/src/igl/deprecated.h b/src/libigl/igl/deprecated.h similarity index 100% rename from src/igl/deprecated.h rename to src/libigl/igl/deprecated.h diff --git a/src/igl/dfs.cpp b/src/libigl/igl/dfs.cpp similarity index 100% rename from src/igl/dfs.cpp rename to src/libigl/igl/dfs.cpp diff --git a/src/igl/dfs.h b/src/libigl/igl/dfs.h similarity index 100% rename from src/igl/dfs.h rename to src/libigl/igl/dfs.h diff --git a/src/igl/diag.cpp b/src/libigl/igl/diag.cpp similarity index 100% rename from src/igl/diag.cpp rename to src/libigl/igl/diag.cpp diff --git a/src/igl/diag.h b/src/libigl/igl/diag.h similarity index 100% rename from src/igl/diag.h rename to src/libigl/igl/diag.h diff --git a/src/igl/dihedral_angles.cpp b/src/libigl/igl/dihedral_angles.cpp similarity index 100% rename from src/igl/dihedral_angles.cpp rename to src/libigl/igl/dihedral_angles.cpp diff --git a/src/igl/dihedral_angles.h b/src/libigl/igl/dihedral_angles.h similarity index 100% rename from src/igl/dihedral_angles.h rename to src/libigl/igl/dihedral_angles.h diff --git a/src/igl/dijkstra.cpp b/src/libigl/igl/dijkstra.cpp similarity index 100% rename from src/igl/dijkstra.cpp rename to src/libigl/igl/dijkstra.cpp diff --git a/src/igl/dijkstra.h b/src/libigl/igl/dijkstra.h similarity index 100% rename from src/igl/dijkstra.h rename to src/libigl/igl/dijkstra.h diff --git a/src/igl/directed_edge_orientations.cpp b/src/libigl/igl/directed_edge_orientations.cpp similarity index 100% rename from src/igl/directed_edge_orientations.cpp rename to src/libigl/igl/directed_edge_orientations.cpp diff --git a/src/igl/directed_edge_orientations.h b/src/libigl/igl/directed_edge_orientations.h similarity index 100% rename from src/igl/directed_edge_orientations.h rename to src/libigl/igl/directed_edge_orientations.h diff --git a/src/igl/directed_edge_parents.cpp b/src/libigl/igl/directed_edge_parents.cpp similarity index 100% rename from src/igl/directed_edge_parents.cpp rename to src/libigl/igl/directed_edge_parents.cpp diff --git a/src/igl/directed_edge_parents.h b/src/libigl/igl/directed_edge_parents.h similarity index 100% rename from src/igl/directed_edge_parents.h rename to src/libigl/igl/directed_edge_parents.h diff --git a/src/igl/dirname.cpp b/src/libigl/igl/dirname.cpp similarity index 100% rename from src/igl/dirname.cpp rename to src/libigl/igl/dirname.cpp diff --git a/src/igl/dirname.h b/src/libigl/igl/dirname.h similarity index 100% rename from src/igl/dirname.h rename to src/libigl/igl/dirname.h diff --git a/src/igl/dot.cpp b/src/libigl/igl/dot.cpp similarity index 100% rename from src/igl/dot.cpp rename to src/libigl/igl/dot.cpp diff --git a/src/igl/dot.h b/src/libigl/igl/dot.h similarity index 100% rename from src/igl/dot.h rename to src/libigl/igl/dot.h diff --git a/src/igl/dot_row.cpp b/src/libigl/igl/dot_row.cpp similarity index 100% rename from src/igl/dot_row.cpp rename to src/libigl/igl/dot_row.cpp diff --git a/src/igl/dot_row.h b/src/libigl/igl/dot_row.h similarity index 100% rename from src/igl/dot_row.h rename to src/libigl/igl/dot_row.h diff --git a/src/igl/doublearea.cpp b/src/libigl/igl/doublearea.cpp similarity index 100% rename from src/igl/doublearea.cpp rename to src/libigl/igl/doublearea.cpp diff --git a/src/igl/doublearea.h b/src/libigl/igl/doublearea.h similarity index 100% rename from src/igl/doublearea.h rename to src/libigl/igl/doublearea.h diff --git a/src/igl/dqs.cpp b/src/libigl/igl/dqs.cpp similarity index 100% rename from src/igl/dqs.cpp rename to src/libigl/igl/dqs.cpp diff --git a/src/igl/dqs.h b/src/libigl/igl/dqs.h similarity index 100% rename from src/igl/dqs.h rename to src/libigl/igl/dqs.h diff --git a/src/igl/ears.cpp b/src/libigl/igl/ears.cpp similarity index 100% rename from src/igl/ears.cpp rename to src/libigl/igl/ears.cpp diff --git a/src/igl/ears.h b/src/libigl/igl/ears.h similarity index 100% rename from src/igl/ears.h rename to src/libigl/igl/ears.h diff --git a/src/igl/edge_collapse_is_valid.cpp b/src/libigl/igl/edge_collapse_is_valid.cpp similarity index 100% rename from src/igl/edge_collapse_is_valid.cpp rename to src/libigl/igl/edge_collapse_is_valid.cpp diff --git a/src/igl/edge_collapse_is_valid.h b/src/libigl/igl/edge_collapse_is_valid.h similarity index 100% rename from src/igl/edge_collapse_is_valid.h rename to src/libigl/igl/edge_collapse_is_valid.h diff --git a/src/igl/edge_flaps.cpp b/src/libigl/igl/edge_flaps.cpp similarity index 100% rename from src/igl/edge_flaps.cpp rename to src/libigl/igl/edge_flaps.cpp diff --git a/src/igl/edge_flaps.h b/src/libigl/igl/edge_flaps.h similarity index 100% rename from src/igl/edge_flaps.h rename to src/libigl/igl/edge_flaps.h diff --git a/src/igl/edge_lengths.cpp b/src/libigl/igl/edge_lengths.cpp similarity index 100% rename from src/igl/edge_lengths.cpp rename to src/libigl/igl/edge_lengths.cpp diff --git a/src/igl/edge_lengths.h b/src/libigl/igl/edge_lengths.h similarity index 100% rename from src/igl/edge_lengths.h rename to src/libigl/igl/edge_lengths.h diff --git a/src/igl/edge_topology.cpp b/src/libigl/igl/edge_topology.cpp similarity index 100% rename from src/igl/edge_topology.cpp rename to src/libigl/igl/edge_topology.cpp diff --git a/src/igl/edge_topology.h b/src/libigl/igl/edge_topology.h similarity index 100% rename from src/igl/edge_topology.h rename to src/libigl/igl/edge_topology.h diff --git a/src/igl/edges.cpp b/src/libigl/igl/edges.cpp similarity index 100% rename from src/igl/edges.cpp rename to src/libigl/igl/edges.cpp diff --git a/src/igl/edges.h b/src/libigl/igl/edges.h similarity index 100% rename from src/igl/edges.h rename to src/libigl/igl/edges.h diff --git a/src/igl/edges_to_path.cpp b/src/libigl/igl/edges_to_path.cpp similarity index 100% rename from src/igl/edges_to_path.cpp rename to src/libigl/igl/edges_to_path.cpp diff --git a/src/igl/edges_to_path.h b/src/libigl/igl/edges_to_path.h similarity index 100% rename from src/igl/edges_to_path.h rename to src/libigl/igl/edges_to_path.h diff --git a/src/igl/eigs.cpp b/src/libigl/igl/eigs.cpp similarity index 100% rename from src/igl/eigs.cpp rename to src/libigl/igl/eigs.cpp diff --git a/src/igl/eigs.h b/src/libigl/igl/eigs.h similarity index 100% rename from src/igl/eigs.h rename to src/libigl/igl/eigs.h diff --git a/src/igl/embree/EmbreeIntersector.h b/src/libigl/igl/embree/EmbreeIntersector.h similarity index 100% rename from src/igl/embree/EmbreeIntersector.h rename to src/libigl/igl/embree/EmbreeIntersector.h diff --git a/src/igl/embree/Embree_convenience.h b/src/libigl/igl/embree/Embree_convenience.h similarity index 100% rename from src/igl/embree/Embree_convenience.h rename to src/libigl/igl/embree/Embree_convenience.h diff --git a/src/igl/embree/ambient_occlusion.cpp b/src/libigl/igl/embree/ambient_occlusion.cpp similarity index 100% rename from src/igl/embree/ambient_occlusion.cpp rename to src/libigl/igl/embree/ambient_occlusion.cpp diff --git a/src/igl/embree/ambient_occlusion.h b/src/libigl/igl/embree/ambient_occlusion.h similarity index 100% rename from src/igl/embree/ambient_occlusion.h rename to src/libigl/igl/embree/ambient_occlusion.h diff --git a/src/igl/embree/bone_heat.cpp b/src/libigl/igl/embree/bone_heat.cpp similarity index 100% rename from src/igl/embree/bone_heat.cpp rename to src/libigl/igl/embree/bone_heat.cpp diff --git a/src/igl/embree/bone_heat.h b/src/libigl/igl/embree/bone_heat.h similarity index 100% rename from src/igl/embree/bone_heat.h rename to src/libigl/igl/embree/bone_heat.h diff --git a/src/igl/embree/bone_visible.cpp b/src/libigl/igl/embree/bone_visible.cpp similarity index 100% rename from src/igl/embree/bone_visible.cpp rename to src/libigl/igl/embree/bone_visible.cpp diff --git a/src/igl/embree/bone_visible.h b/src/libigl/igl/embree/bone_visible.h similarity index 100% rename from src/igl/embree/bone_visible.h rename to src/libigl/igl/embree/bone_visible.h diff --git a/src/igl/embree/embree2/rtcore.h b/src/libigl/igl/embree/embree2/rtcore.h similarity index 100% rename from src/igl/embree/embree2/rtcore.h rename to src/libigl/igl/embree/embree2/rtcore.h diff --git a/src/igl/embree/embree2/rtcore.isph b/src/libigl/igl/embree/embree2/rtcore.isph similarity index 100% rename from src/igl/embree/embree2/rtcore.isph rename to src/libigl/igl/embree/embree2/rtcore.isph diff --git a/src/igl/embree/embree2/rtcore_geometry.h b/src/libigl/igl/embree/embree2/rtcore_geometry.h similarity index 100% rename from src/igl/embree/embree2/rtcore_geometry.h rename to src/libigl/igl/embree/embree2/rtcore_geometry.h diff --git a/src/igl/embree/embree2/rtcore_geometry.isph b/src/libigl/igl/embree/embree2/rtcore_geometry.isph similarity index 100% rename from src/igl/embree/embree2/rtcore_geometry.isph rename to src/libigl/igl/embree/embree2/rtcore_geometry.isph diff --git a/src/igl/embree/embree2/rtcore_geometry_user.h b/src/libigl/igl/embree/embree2/rtcore_geometry_user.h similarity index 100% rename from src/igl/embree/embree2/rtcore_geometry_user.h rename to src/libigl/igl/embree/embree2/rtcore_geometry_user.h diff --git a/src/igl/embree/embree2/rtcore_geometry_user.isph b/src/libigl/igl/embree/embree2/rtcore_geometry_user.isph similarity index 100% rename from src/igl/embree/embree2/rtcore_geometry_user.isph rename to src/libigl/igl/embree/embree2/rtcore_geometry_user.isph diff --git a/src/igl/embree/embree2/rtcore_ray.h b/src/libigl/igl/embree/embree2/rtcore_ray.h similarity index 100% rename from src/igl/embree/embree2/rtcore_ray.h rename to src/libigl/igl/embree/embree2/rtcore_ray.h diff --git a/src/igl/embree/embree2/rtcore_ray.isph b/src/libigl/igl/embree/embree2/rtcore_ray.isph similarity index 100% rename from src/igl/embree/embree2/rtcore_ray.isph rename to src/libigl/igl/embree/embree2/rtcore_ray.isph diff --git a/src/igl/embree/embree2/rtcore_scene.h b/src/libigl/igl/embree/embree2/rtcore_scene.h similarity index 100% rename from src/igl/embree/embree2/rtcore_scene.h rename to src/libigl/igl/embree/embree2/rtcore_scene.h diff --git a/src/igl/embree/embree2/rtcore_scene.isph b/src/libigl/igl/embree/embree2/rtcore_scene.isph similarity index 100% rename from src/igl/embree/embree2/rtcore_scene.isph rename to src/libigl/igl/embree/embree2/rtcore_scene.isph diff --git a/src/igl/embree/line_mesh_intersection.cpp b/src/libigl/igl/embree/line_mesh_intersection.cpp similarity index 100% rename from src/igl/embree/line_mesh_intersection.cpp rename to src/libigl/igl/embree/line_mesh_intersection.cpp diff --git a/src/igl/embree/line_mesh_intersection.h b/src/libigl/igl/embree/line_mesh_intersection.h similarity index 100% rename from src/igl/embree/line_mesh_intersection.h rename to src/libigl/igl/embree/line_mesh_intersection.h diff --git a/src/igl/embree/reorient_facets_raycast.cpp b/src/libigl/igl/embree/reorient_facets_raycast.cpp similarity index 100% rename from src/igl/embree/reorient_facets_raycast.cpp rename to src/libigl/igl/embree/reorient_facets_raycast.cpp diff --git a/src/igl/embree/reorient_facets_raycast.h b/src/libigl/igl/embree/reorient_facets_raycast.h similarity index 100% rename from src/igl/embree/reorient_facets_raycast.h rename to src/libigl/igl/embree/reorient_facets_raycast.h diff --git a/src/igl/embree/shape_diameter_function.cpp b/src/libigl/igl/embree/shape_diameter_function.cpp similarity index 100% rename from src/igl/embree/shape_diameter_function.cpp rename to src/libigl/igl/embree/shape_diameter_function.cpp diff --git a/src/igl/embree/shape_diameter_function.h b/src/libigl/igl/embree/shape_diameter_function.h similarity index 100% rename from src/igl/embree/shape_diameter_function.h rename to src/libigl/igl/embree/shape_diameter_function.h diff --git a/src/igl/embree/unproject_in_mesh.cpp b/src/libigl/igl/embree/unproject_in_mesh.cpp similarity index 100% rename from src/igl/embree/unproject_in_mesh.cpp rename to src/libigl/igl/embree/unproject_in_mesh.cpp diff --git a/src/igl/embree/unproject_in_mesh.h b/src/libigl/igl/embree/unproject_in_mesh.h similarity index 100% rename from src/igl/embree/unproject_in_mesh.h rename to src/libigl/igl/embree/unproject_in_mesh.h diff --git a/src/igl/embree/unproject_onto_mesh.cpp b/src/libigl/igl/embree/unproject_onto_mesh.cpp similarity index 100% rename from src/igl/embree/unproject_onto_mesh.cpp rename to src/libigl/igl/embree/unproject_onto_mesh.cpp diff --git a/src/igl/embree/unproject_onto_mesh.h b/src/libigl/igl/embree/unproject_onto_mesh.h similarity index 100% rename from src/igl/embree/unproject_onto_mesh.h rename to src/libigl/igl/embree/unproject_onto_mesh.h diff --git a/src/igl/euler_characteristic.cpp b/src/libigl/igl/euler_characteristic.cpp similarity index 100% rename from src/igl/euler_characteristic.cpp rename to src/libigl/igl/euler_characteristic.cpp diff --git a/src/igl/euler_characteristic.h b/src/libigl/igl/euler_characteristic.h similarity index 100% rename from src/igl/euler_characteristic.h rename to src/libigl/igl/euler_characteristic.h diff --git a/src/igl/exact_geodesic.cpp b/src/libigl/igl/exact_geodesic.cpp similarity index 100% rename from src/igl/exact_geodesic.cpp rename to src/libigl/igl/exact_geodesic.cpp diff --git a/src/igl/exact_geodesic.h b/src/libigl/igl/exact_geodesic.h similarity index 100% rename from src/igl/exact_geodesic.h rename to src/libigl/igl/exact_geodesic.h diff --git a/src/igl/example_fun.cpp b/src/libigl/igl/example_fun.cpp similarity index 100% rename from src/igl/example_fun.cpp rename to src/libigl/igl/example_fun.cpp diff --git a/src/igl/example_fun.h b/src/libigl/igl/example_fun.h similarity index 100% rename from src/igl/example_fun.h rename to src/libigl/igl/example_fun.h diff --git a/src/igl/exterior_edges.cpp b/src/libigl/igl/exterior_edges.cpp similarity index 100% rename from src/igl/exterior_edges.cpp rename to src/libigl/igl/exterior_edges.cpp diff --git a/src/igl/exterior_edges.h b/src/libigl/igl/exterior_edges.h similarity index 100% rename from src/igl/exterior_edges.h rename to src/libigl/igl/exterior_edges.h diff --git a/src/igl/extract_manifold_patches.cpp b/src/libigl/igl/extract_manifold_patches.cpp similarity index 100% rename from src/igl/extract_manifold_patches.cpp rename to src/libigl/igl/extract_manifold_patches.cpp diff --git a/src/igl/extract_manifold_patches.h b/src/libigl/igl/extract_manifold_patches.h similarity index 100% rename from src/igl/extract_manifold_patches.h rename to src/libigl/igl/extract_manifold_patches.h diff --git a/src/igl/extract_non_manifold_edge_curves.cpp b/src/libigl/igl/extract_non_manifold_edge_curves.cpp similarity index 100% rename from src/igl/extract_non_manifold_edge_curves.cpp rename to src/libigl/igl/extract_non_manifold_edge_curves.cpp diff --git a/src/igl/extract_non_manifold_edge_curves.h b/src/libigl/igl/extract_non_manifold_edge_curves.h similarity index 100% rename from src/igl/extract_non_manifold_edge_curves.h rename to src/libigl/igl/extract_non_manifold_edge_curves.h diff --git a/src/igl/face_areas.cpp b/src/libigl/igl/face_areas.cpp similarity index 100% rename from src/igl/face_areas.cpp rename to src/libigl/igl/face_areas.cpp diff --git a/src/igl/face_areas.h b/src/libigl/igl/face_areas.h similarity index 100% rename from src/igl/face_areas.h rename to src/libigl/igl/face_areas.h diff --git a/src/igl/face_occurrences.cpp b/src/libigl/igl/face_occurrences.cpp similarity index 100% rename from src/igl/face_occurrences.cpp rename to src/libigl/igl/face_occurrences.cpp diff --git a/src/igl/face_occurrences.h b/src/libigl/igl/face_occurrences.h similarity index 100% rename from src/igl/face_occurrences.h rename to src/libigl/igl/face_occurrences.h diff --git a/src/igl/faces_first.cpp b/src/libigl/igl/faces_first.cpp similarity index 100% rename from src/igl/faces_first.cpp rename to src/libigl/igl/faces_first.cpp diff --git a/src/igl/faces_first.h b/src/libigl/igl/faces_first.h similarity index 100% rename from src/igl/faces_first.h rename to src/libigl/igl/faces_first.h diff --git a/src/igl/facet_components.cpp b/src/libigl/igl/facet_components.cpp similarity index 100% rename from src/igl/facet_components.cpp rename to src/libigl/igl/facet_components.cpp diff --git a/src/igl/facet_components.h b/src/libigl/igl/facet_components.h similarity index 100% rename from src/igl/facet_components.h rename to src/libigl/igl/facet_components.h diff --git a/src/igl/false_barycentric_subdivision.cpp b/src/libigl/igl/false_barycentric_subdivision.cpp similarity index 100% rename from src/igl/false_barycentric_subdivision.cpp rename to src/libigl/igl/false_barycentric_subdivision.cpp diff --git a/src/igl/false_barycentric_subdivision.h b/src/libigl/igl/false_barycentric_subdivision.h similarity index 100% rename from src/igl/false_barycentric_subdivision.h rename to src/libigl/igl/false_barycentric_subdivision.h diff --git a/src/igl/fast_winding_number.cpp b/src/libigl/igl/fast_winding_number.cpp similarity index 100% rename from src/igl/fast_winding_number.cpp rename to src/libigl/igl/fast_winding_number.cpp diff --git a/src/igl/fast_winding_number.h b/src/libigl/igl/fast_winding_number.h similarity index 100% rename from src/igl/fast_winding_number.h rename to src/libigl/igl/fast_winding_number.h diff --git a/src/igl/file_contents_as_string.cpp b/src/libigl/igl/file_contents_as_string.cpp similarity index 100% rename from src/igl/file_contents_as_string.cpp rename to src/libigl/igl/file_contents_as_string.cpp diff --git a/src/igl/file_contents_as_string.h b/src/libigl/igl/file_contents_as_string.h similarity index 100% rename from src/igl/file_contents_as_string.h rename to src/libigl/igl/file_contents_as_string.h diff --git a/src/igl/file_dialog_open.cpp b/src/libigl/igl/file_dialog_open.cpp similarity index 100% rename from src/igl/file_dialog_open.cpp rename to src/libigl/igl/file_dialog_open.cpp diff --git a/src/igl/file_dialog_open.h b/src/libigl/igl/file_dialog_open.h similarity index 100% rename from src/igl/file_dialog_open.h rename to src/libigl/igl/file_dialog_open.h diff --git a/src/igl/file_dialog_save.cpp b/src/libigl/igl/file_dialog_save.cpp similarity index 100% rename from src/igl/file_dialog_save.cpp rename to src/libigl/igl/file_dialog_save.cpp diff --git a/src/igl/file_dialog_save.h b/src/libigl/igl/file_dialog_save.h similarity index 100% rename from src/igl/file_dialog_save.h rename to src/libigl/igl/file_dialog_save.h diff --git a/src/igl/file_exists.cpp b/src/libigl/igl/file_exists.cpp similarity index 100% rename from src/igl/file_exists.cpp rename to src/libigl/igl/file_exists.cpp diff --git a/src/igl/file_exists.h b/src/libigl/igl/file_exists.h similarity index 100% rename from src/igl/file_exists.h rename to src/libigl/igl/file_exists.h diff --git a/src/igl/find.cpp b/src/libigl/igl/find.cpp similarity index 100% rename from src/igl/find.cpp rename to src/libigl/igl/find.cpp diff --git a/src/igl/find.h b/src/libigl/igl/find.h similarity index 100% rename from src/igl/find.h rename to src/libigl/igl/find.h diff --git a/src/igl/find_cross_field_singularities.cpp b/src/libigl/igl/find_cross_field_singularities.cpp similarity index 100% rename from src/igl/find_cross_field_singularities.cpp rename to src/libigl/igl/find_cross_field_singularities.cpp diff --git a/src/igl/find_cross_field_singularities.h b/src/libigl/igl/find_cross_field_singularities.h similarity index 100% rename from src/igl/find_cross_field_singularities.h rename to src/libigl/igl/find_cross_field_singularities.h diff --git a/src/igl/find_zero.cpp b/src/libigl/igl/find_zero.cpp similarity index 100% rename from src/igl/find_zero.cpp rename to src/libigl/igl/find_zero.cpp diff --git a/src/igl/find_zero.h b/src/libigl/igl/find_zero.h similarity index 100% rename from src/igl/find_zero.h rename to src/libigl/igl/find_zero.h diff --git a/src/igl/fit_plane.cpp b/src/libigl/igl/fit_plane.cpp similarity index 100% rename from src/igl/fit_plane.cpp rename to src/libigl/igl/fit_plane.cpp diff --git a/src/igl/fit_plane.h b/src/libigl/igl/fit_plane.h similarity index 100% rename from src/igl/fit_plane.h rename to src/libigl/igl/fit_plane.h diff --git a/src/igl/fit_rotations.cpp b/src/libigl/igl/fit_rotations.cpp similarity index 100% rename from src/igl/fit_rotations.cpp rename to src/libigl/igl/fit_rotations.cpp diff --git a/src/igl/fit_rotations.h b/src/libigl/igl/fit_rotations.h similarity index 100% rename from src/igl/fit_rotations.h rename to src/libigl/igl/fit_rotations.h diff --git a/src/igl/flip_avoiding_line_search.cpp b/src/libigl/igl/flip_avoiding_line_search.cpp similarity index 100% rename from src/igl/flip_avoiding_line_search.cpp rename to src/libigl/igl/flip_avoiding_line_search.cpp diff --git a/src/igl/flip_avoiding_line_search.h b/src/libigl/igl/flip_avoiding_line_search.h similarity index 100% rename from src/igl/flip_avoiding_line_search.h rename to src/libigl/igl/flip_avoiding_line_search.h diff --git a/src/igl/flip_edge.cpp b/src/libigl/igl/flip_edge.cpp similarity index 100% rename from src/igl/flip_edge.cpp rename to src/libigl/igl/flip_edge.cpp diff --git a/src/igl/flip_edge.h b/src/libigl/igl/flip_edge.h similarity index 100% rename from src/igl/flip_edge.h rename to src/libigl/igl/flip_edge.h diff --git a/src/igl/flipped_triangles.cpp b/src/libigl/igl/flipped_triangles.cpp similarity index 100% rename from src/igl/flipped_triangles.cpp rename to src/libigl/igl/flipped_triangles.cpp diff --git a/src/igl/flipped_triangles.h b/src/libigl/igl/flipped_triangles.h similarity index 100% rename from src/igl/flipped_triangles.h rename to src/libigl/igl/flipped_triangles.h diff --git a/src/igl/flood_fill.cpp b/src/libigl/igl/flood_fill.cpp similarity index 100% rename from src/igl/flood_fill.cpp rename to src/libigl/igl/flood_fill.cpp diff --git a/src/igl/flood_fill.h b/src/libigl/igl/flood_fill.h similarity index 100% rename from src/igl/flood_fill.h rename to src/libigl/igl/flood_fill.h diff --git a/src/igl/floor.cpp b/src/libigl/igl/floor.cpp similarity index 100% rename from src/igl/floor.cpp rename to src/libigl/igl/floor.cpp diff --git a/src/igl/floor.h b/src/libigl/igl/floor.h similarity index 100% rename from src/igl/floor.h rename to src/libigl/igl/floor.h diff --git a/src/igl/for_each.h b/src/libigl/igl/for_each.h similarity index 100% rename from src/igl/for_each.h rename to src/libigl/igl/for_each.h diff --git a/src/igl/forward_kinematics.cpp b/src/libigl/igl/forward_kinematics.cpp similarity index 100% rename from src/igl/forward_kinematics.cpp rename to src/libigl/igl/forward_kinematics.cpp diff --git a/src/igl/forward_kinematics.h b/src/libigl/igl/forward_kinematics.h similarity index 100% rename from src/igl/forward_kinematics.h rename to src/libigl/igl/forward_kinematics.h diff --git a/src/igl/frame_field_deformer.cpp b/src/libigl/igl/frame_field_deformer.cpp similarity index 100% rename from src/igl/frame_field_deformer.cpp rename to src/libigl/igl/frame_field_deformer.cpp diff --git a/src/igl/frame_field_deformer.h b/src/libigl/igl/frame_field_deformer.h similarity index 100% rename from src/igl/frame_field_deformer.h rename to src/libigl/igl/frame_field_deformer.h diff --git a/src/igl/frame_to_cross_field.cpp b/src/libigl/igl/frame_to_cross_field.cpp similarity index 100% rename from src/igl/frame_to_cross_field.cpp rename to src/libigl/igl/frame_to_cross_field.cpp diff --git a/src/igl/frame_to_cross_field.h b/src/libigl/igl/frame_to_cross_field.h similarity index 100% rename from src/igl/frame_to_cross_field.h rename to src/libigl/igl/frame_to_cross_field.h diff --git a/src/igl/frustum.cpp b/src/libigl/igl/frustum.cpp similarity index 100% rename from src/igl/frustum.cpp rename to src/libigl/igl/frustum.cpp diff --git a/src/igl/frustum.h b/src/libigl/igl/frustum.h similarity index 100% rename from src/igl/frustum.h rename to src/libigl/igl/frustum.h diff --git a/src/igl/gaussian_curvature.cpp b/src/libigl/igl/gaussian_curvature.cpp similarity index 100% rename from src/igl/gaussian_curvature.cpp rename to src/libigl/igl/gaussian_curvature.cpp diff --git a/src/igl/gaussian_curvature.h b/src/libigl/igl/gaussian_curvature.h similarity index 100% rename from src/igl/gaussian_curvature.h rename to src/libigl/igl/gaussian_curvature.h diff --git a/src/igl/get_seconds.cpp b/src/libigl/igl/get_seconds.cpp similarity index 100% rename from src/igl/get_seconds.cpp rename to src/libigl/igl/get_seconds.cpp diff --git a/src/igl/get_seconds.h b/src/libigl/igl/get_seconds.h similarity index 100% rename from src/igl/get_seconds.h rename to src/libigl/igl/get_seconds.h diff --git a/src/igl/get_seconds_hires.cpp b/src/libigl/igl/get_seconds_hires.cpp similarity index 100% rename from src/igl/get_seconds_hires.cpp rename to src/libigl/igl/get_seconds_hires.cpp diff --git a/src/igl/get_seconds_hires.h b/src/libigl/igl/get_seconds_hires.h similarity index 100% rename from src/igl/get_seconds_hires.h rename to src/libigl/igl/get_seconds_hires.h diff --git a/src/igl/grad.cpp b/src/libigl/igl/grad.cpp similarity index 100% rename from src/igl/grad.cpp rename to src/libigl/igl/grad.cpp diff --git a/src/igl/grad.h b/src/libigl/igl/grad.h similarity index 100% rename from src/igl/grad.h rename to src/libigl/igl/grad.h diff --git a/src/igl/grid.cpp b/src/libigl/igl/grid.cpp similarity index 100% rename from src/igl/grid.cpp rename to src/libigl/igl/grid.cpp diff --git a/src/igl/grid.h b/src/libigl/igl/grid.h similarity index 100% rename from src/igl/grid.h rename to src/libigl/igl/grid.h diff --git a/src/igl/grid_search.cpp b/src/libigl/igl/grid_search.cpp similarity index 100% rename from src/igl/grid_search.cpp rename to src/libigl/igl/grid_search.cpp diff --git a/src/igl/grid_search.h b/src/libigl/igl/grid_search.h similarity index 100% rename from src/igl/grid_search.h rename to src/libigl/igl/grid_search.h diff --git a/src/igl/group_sum_matrix.cpp b/src/libigl/igl/group_sum_matrix.cpp similarity index 100% rename from src/igl/group_sum_matrix.cpp rename to src/libigl/igl/group_sum_matrix.cpp diff --git a/src/igl/group_sum_matrix.h b/src/libigl/igl/group_sum_matrix.h similarity index 100% rename from src/igl/group_sum_matrix.h rename to src/libigl/igl/group_sum_matrix.h diff --git a/src/igl/guess_extension.cpp b/src/libigl/igl/guess_extension.cpp similarity index 100% rename from src/igl/guess_extension.cpp rename to src/libigl/igl/guess_extension.cpp diff --git a/src/igl/guess_extension.h b/src/libigl/igl/guess_extension.h similarity index 100% rename from src/igl/guess_extension.h rename to src/libigl/igl/guess_extension.h diff --git a/src/igl/harmonic.cpp b/src/libigl/igl/harmonic.cpp similarity index 100% rename from src/igl/harmonic.cpp rename to src/libigl/igl/harmonic.cpp diff --git a/src/igl/harmonic.h b/src/libigl/igl/harmonic.h similarity index 100% rename from src/igl/harmonic.h rename to src/libigl/igl/harmonic.h diff --git a/src/igl/harwell_boeing.cpp b/src/libigl/igl/harwell_boeing.cpp similarity index 100% rename from src/igl/harwell_boeing.cpp rename to src/libigl/igl/harwell_boeing.cpp diff --git a/src/igl/harwell_boeing.h b/src/libigl/igl/harwell_boeing.h similarity index 100% rename from src/igl/harwell_boeing.h rename to src/libigl/igl/harwell_boeing.h diff --git a/src/igl/hausdorff.cpp b/src/libigl/igl/hausdorff.cpp similarity index 100% rename from src/igl/hausdorff.cpp rename to src/libigl/igl/hausdorff.cpp diff --git a/src/igl/hausdorff.h b/src/libigl/igl/hausdorff.h similarity index 100% rename from src/igl/hausdorff.h rename to src/libigl/igl/hausdorff.h diff --git a/src/igl/hessian.cpp b/src/libigl/igl/hessian.cpp similarity index 100% rename from src/igl/hessian.cpp rename to src/libigl/igl/hessian.cpp diff --git a/src/igl/hessian.h b/src/libigl/igl/hessian.h similarity index 100% rename from src/igl/hessian.h rename to src/libigl/igl/hessian.h diff --git a/src/igl/hessian_energy.cpp b/src/libigl/igl/hessian_energy.cpp similarity index 100% rename from src/igl/hessian_energy.cpp rename to src/libigl/igl/hessian_energy.cpp diff --git a/src/igl/hessian_energy.h b/src/libigl/igl/hessian_energy.h similarity index 100% rename from src/igl/hessian_energy.h rename to src/libigl/igl/hessian_energy.h diff --git a/src/igl/histc.cpp b/src/libigl/igl/histc.cpp similarity index 100% rename from src/igl/histc.cpp rename to src/libigl/igl/histc.cpp diff --git a/src/igl/histc.h b/src/libigl/igl/histc.h similarity index 100% rename from src/igl/histc.h rename to src/libigl/igl/histc.h diff --git a/src/igl/hsv_to_rgb.cpp b/src/libigl/igl/hsv_to_rgb.cpp similarity index 100% rename from src/igl/hsv_to_rgb.cpp rename to src/libigl/igl/hsv_to_rgb.cpp diff --git a/src/igl/hsv_to_rgb.h b/src/libigl/igl/hsv_to_rgb.h similarity index 100% rename from src/igl/hsv_to_rgb.h rename to src/libigl/igl/hsv_to_rgb.h diff --git a/src/igl/igl_inline.h b/src/libigl/igl/igl_inline.h similarity index 100% rename from src/igl/igl_inline.h rename to src/libigl/igl/igl_inline.h diff --git a/src/igl/in_element.cpp b/src/libigl/igl/in_element.cpp similarity index 100% rename from src/igl/in_element.cpp rename to src/libigl/igl/in_element.cpp diff --git a/src/igl/in_element.h b/src/libigl/igl/in_element.h similarity index 100% rename from src/igl/in_element.h rename to src/libigl/igl/in_element.h diff --git a/src/igl/infinite_cost_stopping_condition.cpp b/src/libigl/igl/infinite_cost_stopping_condition.cpp similarity index 100% rename from src/igl/infinite_cost_stopping_condition.cpp rename to src/libigl/igl/infinite_cost_stopping_condition.cpp diff --git a/src/igl/infinite_cost_stopping_condition.h b/src/libigl/igl/infinite_cost_stopping_condition.h similarity index 100% rename from src/igl/infinite_cost_stopping_condition.h rename to src/libigl/igl/infinite_cost_stopping_condition.h diff --git a/src/igl/inradius.cpp b/src/libigl/igl/inradius.cpp similarity index 100% rename from src/igl/inradius.cpp rename to src/libigl/igl/inradius.cpp diff --git a/src/igl/inradius.h b/src/libigl/igl/inradius.h similarity index 100% rename from src/igl/inradius.h rename to src/libigl/igl/inradius.h diff --git a/src/igl/internal_angles.cpp b/src/libigl/igl/internal_angles.cpp similarity index 100% rename from src/igl/internal_angles.cpp rename to src/libigl/igl/internal_angles.cpp diff --git a/src/igl/internal_angles.h b/src/libigl/igl/internal_angles.h similarity index 100% rename from src/igl/internal_angles.h rename to src/libigl/igl/internal_angles.h diff --git a/src/igl/intersect.cpp b/src/libigl/igl/intersect.cpp similarity index 100% rename from src/igl/intersect.cpp rename to src/libigl/igl/intersect.cpp diff --git a/src/igl/intersect.h b/src/libigl/igl/intersect.h similarity index 100% rename from src/igl/intersect.h rename to src/libigl/igl/intersect.h diff --git a/src/igl/invert_diag.cpp b/src/libigl/igl/invert_diag.cpp similarity index 100% rename from src/igl/invert_diag.cpp rename to src/libigl/igl/invert_diag.cpp diff --git a/src/igl/invert_diag.h b/src/libigl/igl/invert_diag.h similarity index 100% rename from src/igl/invert_diag.h rename to src/libigl/igl/invert_diag.h diff --git a/src/igl/is_border_vertex.cpp b/src/libigl/igl/is_border_vertex.cpp similarity index 100% rename from src/igl/is_border_vertex.cpp rename to src/libigl/igl/is_border_vertex.cpp diff --git a/src/igl/is_border_vertex.h b/src/libigl/igl/is_border_vertex.h similarity index 100% rename from src/igl/is_border_vertex.h rename to src/libigl/igl/is_border_vertex.h diff --git a/src/igl/is_boundary_edge.cpp b/src/libigl/igl/is_boundary_edge.cpp similarity index 100% rename from src/igl/is_boundary_edge.cpp rename to src/libigl/igl/is_boundary_edge.cpp diff --git a/src/igl/is_boundary_edge.h b/src/libigl/igl/is_boundary_edge.h similarity index 100% rename from src/igl/is_boundary_edge.h rename to src/libigl/igl/is_boundary_edge.h diff --git a/src/igl/is_dir.cpp b/src/libigl/igl/is_dir.cpp similarity index 100% rename from src/igl/is_dir.cpp rename to src/libigl/igl/is_dir.cpp diff --git a/src/igl/is_dir.h b/src/libigl/igl/is_dir.h similarity index 100% rename from src/igl/is_dir.h rename to src/libigl/igl/is_dir.h diff --git a/src/igl/is_edge_manifold.cpp b/src/libigl/igl/is_edge_manifold.cpp similarity index 100% rename from src/igl/is_edge_manifold.cpp rename to src/libigl/igl/is_edge_manifold.cpp diff --git a/src/igl/is_edge_manifold.h b/src/libigl/igl/is_edge_manifold.h similarity index 100% rename from src/igl/is_edge_manifold.h rename to src/libigl/igl/is_edge_manifold.h diff --git a/src/igl/is_file.cpp b/src/libigl/igl/is_file.cpp similarity index 100% rename from src/igl/is_file.cpp rename to src/libigl/igl/is_file.cpp diff --git a/src/igl/is_file.h b/src/libigl/igl/is_file.h similarity index 100% rename from src/igl/is_file.h rename to src/libigl/igl/is_file.h diff --git a/src/igl/is_irregular_vertex.cpp b/src/libigl/igl/is_irregular_vertex.cpp similarity index 100% rename from src/igl/is_irregular_vertex.cpp rename to src/libigl/igl/is_irregular_vertex.cpp diff --git a/src/igl/is_irregular_vertex.h b/src/libigl/igl/is_irregular_vertex.h similarity index 100% rename from src/igl/is_irregular_vertex.h rename to src/libigl/igl/is_irregular_vertex.h diff --git a/src/igl/is_planar.cpp b/src/libigl/igl/is_planar.cpp similarity index 100% rename from src/igl/is_planar.cpp rename to src/libigl/igl/is_planar.cpp diff --git a/src/igl/is_planar.h b/src/libigl/igl/is_planar.h similarity index 100% rename from src/igl/is_planar.h rename to src/libigl/igl/is_planar.h diff --git a/src/igl/is_readable.cpp b/src/libigl/igl/is_readable.cpp similarity index 100% rename from src/igl/is_readable.cpp rename to src/libigl/igl/is_readable.cpp diff --git a/src/igl/is_readable.h b/src/libigl/igl/is_readable.h similarity index 100% rename from src/igl/is_readable.h rename to src/libigl/igl/is_readable.h diff --git a/src/igl/is_sparse.cpp b/src/libigl/igl/is_sparse.cpp similarity index 100% rename from src/igl/is_sparse.cpp rename to src/libigl/igl/is_sparse.cpp diff --git a/src/igl/is_sparse.h b/src/libigl/igl/is_sparse.h similarity index 100% rename from src/igl/is_sparse.h rename to src/libigl/igl/is_sparse.h diff --git a/src/igl/is_stl.cpp b/src/libigl/igl/is_stl.cpp similarity index 100% rename from src/igl/is_stl.cpp rename to src/libigl/igl/is_stl.cpp diff --git a/src/igl/is_stl.h b/src/libigl/igl/is_stl.h similarity index 100% rename from src/igl/is_stl.h rename to src/libigl/igl/is_stl.h diff --git a/src/igl/is_symmetric.cpp b/src/libigl/igl/is_symmetric.cpp similarity index 100% rename from src/igl/is_symmetric.cpp rename to src/libigl/igl/is_symmetric.cpp diff --git a/src/igl/is_symmetric.h b/src/libigl/igl/is_symmetric.h similarity index 100% rename from src/igl/is_symmetric.h rename to src/libigl/igl/is_symmetric.h diff --git a/src/igl/is_vertex_manifold.cpp b/src/libigl/igl/is_vertex_manifold.cpp similarity index 100% rename from src/igl/is_vertex_manifold.cpp rename to src/libigl/igl/is_vertex_manifold.cpp diff --git a/src/igl/is_vertex_manifold.h b/src/libigl/igl/is_vertex_manifold.h similarity index 100% rename from src/igl/is_vertex_manifold.h rename to src/libigl/igl/is_vertex_manifold.h diff --git a/src/igl/is_writable.cpp b/src/libigl/igl/is_writable.cpp similarity index 100% rename from src/igl/is_writable.cpp rename to src/libigl/igl/is_writable.cpp diff --git a/src/igl/is_writable.h b/src/libigl/igl/is_writable.h similarity index 100% rename from src/igl/is_writable.h rename to src/libigl/igl/is_writable.h diff --git a/src/igl/isdiag.cpp b/src/libigl/igl/isdiag.cpp similarity index 100% rename from src/igl/isdiag.cpp rename to src/libigl/igl/isdiag.cpp diff --git a/src/igl/isdiag.h b/src/libigl/igl/isdiag.h similarity index 100% rename from src/igl/isdiag.h rename to src/libigl/igl/isdiag.h diff --git a/src/igl/ismember.cpp b/src/libigl/igl/ismember.cpp similarity index 100% rename from src/igl/ismember.cpp rename to src/libigl/igl/ismember.cpp diff --git a/src/igl/ismember.h b/src/libigl/igl/ismember.h similarity index 100% rename from src/igl/ismember.h rename to src/libigl/igl/ismember.h diff --git a/src/igl/isolines.cpp b/src/libigl/igl/isolines.cpp similarity index 100% rename from src/igl/isolines.cpp rename to src/libigl/igl/isolines.cpp diff --git a/src/igl/isolines.h b/src/libigl/igl/isolines.h similarity index 100% rename from src/igl/isolines.h rename to src/libigl/igl/isolines.h diff --git a/src/igl/jet.cpp b/src/libigl/igl/jet.cpp similarity index 100% rename from src/igl/jet.cpp rename to src/libigl/igl/jet.cpp diff --git a/src/igl/jet.h b/src/libigl/igl/jet.h similarity index 100% rename from src/igl/jet.h rename to src/libigl/igl/jet.h diff --git a/src/igl/knn.cpp b/src/libigl/igl/knn.cpp similarity index 100% rename from src/igl/knn.cpp rename to src/libigl/igl/knn.cpp diff --git a/src/igl/knn.h b/src/libigl/igl/knn.h similarity index 100% rename from src/igl/knn.h rename to src/libigl/igl/knn.h diff --git a/src/igl/launch_medit.cpp b/src/libigl/igl/launch_medit.cpp similarity index 100% rename from src/igl/launch_medit.cpp rename to src/libigl/igl/launch_medit.cpp diff --git a/src/igl/launch_medit.h b/src/libigl/igl/launch_medit.h similarity index 100% rename from src/igl/launch_medit.h rename to src/libigl/igl/launch_medit.h diff --git a/src/igl/lbs_matrix.cpp b/src/libigl/igl/lbs_matrix.cpp similarity index 100% rename from src/igl/lbs_matrix.cpp rename to src/libigl/igl/lbs_matrix.cpp diff --git a/src/igl/lbs_matrix.h b/src/libigl/igl/lbs_matrix.h similarity index 100% rename from src/igl/lbs_matrix.h rename to src/libigl/igl/lbs_matrix.h diff --git a/src/igl/lexicographic_triangulation.cpp b/src/libigl/igl/lexicographic_triangulation.cpp similarity index 100% rename from src/igl/lexicographic_triangulation.cpp rename to src/libigl/igl/lexicographic_triangulation.cpp diff --git a/src/igl/lexicographic_triangulation.h b/src/libigl/igl/lexicographic_triangulation.h similarity index 100% rename from src/igl/lexicographic_triangulation.h rename to src/libigl/igl/lexicographic_triangulation.h diff --git a/src/igl/lim/lim.cpp b/src/libigl/igl/lim/lim.cpp similarity index 100% rename from src/igl/lim/lim.cpp rename to src/libigl/igl/lim/lim.cpp diff --git a/src/igl/lim/lim.h b/src/libigl/igl/lim/lim.h similarity index 100% rename from src/igl/lim/lim.h rename to src/libigl/igl/lim/lim.h diff --git a/src/igl/limit_faces.cpp b/src/libigl/igl/limit_faces.cpp similarity index 100% rename from src/igl/limit_faces.cpp rename to src/libigl/igl/limit_faces.cpp diff --git a/src/igl/limit_faces.h b/src/libigl/igl/limit_faces.h similarity index 100% rename from src/igl/limit_faces.h rename to src/libigl/igl/limit_faces.h diff --git a/src/igl/line_field_missmatch.cpp b/src/libigl/igl/line_field_missmatch.cpp similarity index 100% rename from src/igl/line_field_missmatch.cpp rename to src/libigl/igl/line_field_missmatch.cpp diff --git a/src/igl/line_field_missmatch.h b/src/libigl/igl/line_field_missmatch.h similarity index 100% rename from src/igl/line_field_missmatch.h rename to src/libigl/igl/line_field_missmatch.h diff --git a/src/igl/line_search.cpp b/src/libigl/igl/line_search.cpp similarity index 100% rename from src/igl/line_search.cpp rename to src/libigl/igl/line_search.cpp diff --git a/src/igl/line_search.h b/src/libigl/igl/line_search.h similarity index 100% rename from src/igl/line_search.h rename to src/libigl/igl/line_search.h diff --git a/src/igl/line_segment_in_rectangle.cpp b/src/libigl/igl/line_segment_in_rectangle.cpp similarity index 100% rename from src/igl/line_segment_in_rectangle.cpp rename to src/libigl/igl/line_segment_in_rectangle.cpp diff --git a/src/igl/line_segment_in_rectangle.h b/src/libigl/igl/line_segment_in_rectangle.h similarity index 100% rename from src/igl/line_segment_in_rectangle.h rename to src/libigl/igl/line_segment_in_rectangle.h diff --git a/src/igl/linprog.cpp b/src/libigl/igl/linprog.cpp similarity index 100% rename from src/igl/linprog.cpp rename to src/libigl/igl/linprog.cpp diff --git a/src/igl/linprog.h b/src/libigl/igl/linprog.h similarity index 100% rename from src/igl/linprog.h rename to src/libigl/igl/linprog.h diff --git a/src/igl/list_to_matrix.cpp b/src/libigl/igl/list_to_matrix.cpp similarity index 100% rename from src/igl/list_to_matrix.cpp rename to src/libigl/igl/list_to_matrix.cpp diff --git a/src/igl/list_to_matrix.h b/src/libigl/igl/list_to_matrix.h similarity index 100% rename from src/igl/list_to_matrix.h rename to src/libigl/igl/list_to_matrix.h diff --git a/src/igl/local_basis.cpp b/src/libigl/igl/local_basis.cpp similarity index 100% rename from src/igl/local_basis.cpp rename to src/libigl/igl/local_basis.cpp diff --git a/src/igl/local_basis.h b/src/libigl/igl/local_basis.h similarity index 100% rename from src/igl/local_basis.h rename to src/libigl/igl/local_basis.h diff --git a/src/igl/look_at.cpp b/src/libigl/igl/look_at.cpp similarity index 100% rename from src/igl/look_at.cpp rename to src/libigl/igl/look_at.cpp diff --git a/src/igl/look_at.h b/src/libigl/igl/look_at.h similarity index 100% rename from src/igl/look_at.h rename to src/libigl/igl/look_at.h diff --git a/src/igl/loop.cpp b/src/libigl/igl/loop.cpp similarity index 100% rename from src/igl/loop.cpp rename to src/libigl/igl/loop.cpp diff --git a/src/igl/loop.h b/src/libigl/igl/loop.h similarity index 100% rename from src/igl/loop.h rename to src/libigl/igl/loop.h diff --git a/src/igl/lscm.cpp b/src/libigl/igl/lscm.cpp similarity index 100% rename from src/igl/lscm.cpp rename to src/libigl/igl/lscm.cpp diff --git a/src/igl/lscm.h b/src/libigl/igl/lscm.h similarity index 100% rename from src/igl/lscm.h rename to src/libigl/igl/lscm.h diff --git a/src/igl/map_vertices_to_circle.cpp b/src/libigl/igl/map_vertices_to_circle.cpp similarity index 100% rename from src/igl/map_vertices_to_circle.cpp rename to src/libigl/igl/map_vertices_to_circle.cpp diff --git a/src/igl/map_vertices_to_circle.h b/src/libigl/igl/map_vertices_to_circle.h similarity index 100% rename from src/igl/map_vertices_to_circle.h rename to src/libigl/igl/map_vertices_to_circle.h diff --git a/src/igl/massmatrix.cpp b/src/libigl/igl/massmatrix.cpp similarity index 100% rename from src/igl/massmatrix.cpp rename to src/libigl/igl/massmatrix.cpp diff --git a/src/igl/massmatrix.h b/src/libigl/igl/massmatrix.h similarity index 100% rename from src/igl/massmatrix.h rename to src/libigl/igl/massmatrix.h diff --git a/src/igl/mat_max.cpp b/src/libigl/igl/mat_max.cpp similarity index 100% rename from src/igl/mat_max.cpp rename to src/libigl/igl/mat_max.cpp diff --git a/src/igl/mat_max.h b/src/libigl/igl/mat_max.h similarity index 100% rename from src/igl/mat_max.h rename to src/libigl/igl/mat_max.h diff --git a/src/igl/mat_min.cpp b/src/libigl/igl/mat_min.cpp similarity index 100% rename from src/igl/mat_min.cpp rename to src/libigl/igl/mat_min.cpp diff --git a/src/igl/mat_min.h b/src/libigl/igl/mat_min.h similarity index 100% rename from src/igl/mat_min.h rename to src/libigl/igl/mat_min.h diff --git a/src/igl/mat_to_quat.cpp b/src/libigl/igl/mat_to_quat.cpp similarity index 100% rename from src/igl/mat_to_quat.cpp rename to src/libigl/igl/mat_to_quat.cpp diff --git a/src/igl/mat_to_quat.h b/src/libigl/igl/mat_to_quat.h similarity index 100% rename from src/igl/mat_to_quat.h rename to src/libigl/igl/mat_to_quat.h diff --git a/src/igl/material_colors.h b/src/libigl/igl/material_colors.h similarity index 100% rename from src/igl/material_colors.h rename to src/libigl/igl/material_colors.h diff --git a/src/igl/matlab/MatlabWorkspace.h b/src/libigl/igl/matlab/MatlabWorkspace.h similarity index 100% rename from src/igl/matlab/MatlabWorkspace.h rename to src/libigl/igl/matlab/MatlabWorkspace.h diff --git a/src/igl/matlab/MexStream.h b/src/libigl/igl/matlab/MexStream.h similarity index 100% rename from src/igl/matlab/MexStream.h rename to src/libigl/igl/matlab/MexStream.h diff --git a/src/igl/matlab/matlabinterface.cpp b/src/libigl/igl/matlab/matlabinterface.cpp similarity index 100% rename from src/igl/matlab/matlabinterface.cpp rename to src/libigl/igl/matlab/matlabinterface.cpp diff --git a/src/igl/matlab/matlabinterface.h b/src/libigl/igl/matlab/matlabinterface.h similarity index 100% rename from src/igl/matlab/matlabinterface.h rename to src/libigl/igl/matlab/matlabinterface.h diff --git a/src/igl/matlab/mexErrMsgTxt.cpp b/src/libigl/igl/matlab/mexErrMsgTxt.cpp similarity index 100% rename from src/igl/matlab/mexErrMsgTxt.cpp rename to src/libigl/igl/matlab/mexErrMsgTxt.cpp diff --git a/src/igl/matlab/mexErrMsgTxt.h b/src/libigl/igl/matlab/mexErrMsgTxt.h similarity index 100% rename from src/igl/matlab/mexErrMsgTxt.h rename to src/libigl/igl/matlab/mexErrMsgTxt.h diff --git a/src/igl/matlab/parse_rhs.cpp b/src/libigl/igl/matlab/parse_rhs.cpp similarity index 100% rename from src/igl/matlab/parse_rhs.cpp rename to src/libigl/igl/matlab/parse_rhs.cpp diff --git a/src/igl/matlab/parse_rhs.h b/src/libigl/igl/matlab/parse_rhs.h similarity index 100% rename from src/igl/matlab/parse_rhs.h rename to src/libigl/igl/matlab/parse_rhs.h diff --git a/src/igl/matlab/prepare_lhs.cpp b/src/libigl/igl/matlab/prepare_lhs.cpp similarity index 100% rename from src/igl/matlab/prepare_lhs.cpp rename to src/libigl/igl/matlab/prepare_lhs.cpp diff --git a/src/igl/matlab/prepare_lhs.h b/src/libigl/igl/matlab/prepare_lhs.h similarity index 100% rename from src/igl/matlab/prepare_lhs.h rename to src/libigl/igl/matlab/prepare_lhs.h diff --git a/src/igl/matlab/requires_arg.cpp b/src/libigl/igl/matlab/requires_arg.cpp similarity index 100% rename from src/igl/matlab/requires_arg.cpp rename to src/libigl/igl/matlab/requires_arg.cpp diff --git a/src/igl/matlab/requires_arg.h b/src/libigl/igl/matlab/requires_arg.h similarity index 100% rename from src/igl/matlab/requires_arg.h rename to src/libigl/igl/matlab/requires_arg.h diff --git a/src/igl/matlab/validate_arg.cpp b/src/libigl/igl/matlab/validate_arg.cpp similarity index 100% rename from src/igl/matlab/validate_arg.cpp rename to src/libigl/igl/matlab/validate_arg.cpp diff --git a/src/igl/matlab/validate_arg.h b/src/libigl/igl/matlab/validate_arg.h similarity index 100% rename from src/igl/matlab/validate_arg.h rename to src/libigl/igl/matlab/validate_arg.h diff --git a/src/igl/matlab_format.cpp b/src/libigl/igl/matlab_format.cpp similarity index 100% rename from src/igl/matlab_format.cpp rename to src/libigl/igl/matlab_format.cpp diff --git a/src/igl/matlab_format.h b/src/libigl/igl/matlab_format.h similarity index 100% rename from src/igl/matlab_format.h rename to src/libigl/igl/matlab_format.h diff --git a/src/igl/matrix_to_list.cpp b/src/libigl/igl/matrix_to_list.cpp similarity index 100% rename from src/igl/matrix_to_list.cpp rename to src/libigl/igl/matrix_to_list.cpp diff --git a/src/igl/matrix_to_list.h b/src/libigl/igl/matrix_to_list.h similarity index 100% rename from src/igl/matrix_to_list.h rename to src/libigl/igl/matrix_to_list.h diff --git a/src/igl/max.cpp b/src/libigl/igl/max.cpp similarity index 100% rename from src/igl/max.cpp rename to src/libigl/igl/max.cpp diff --git a/src/igl/max.h b/src/libigl/igl/max.h similarity index 100% rename from src/igl/max.h rename to src/libigl/igl/max.h diff --git a/src/igl/max_faces_stopping_condition.cpp b/src/libigl/igl/max_faces_stopping_condition.cpp similarity index 100% rename from src/igl/max_faces_stopping_condition.cpp rename to src/libigl/igl/max_faces_stopping_condition.cpp diff --git a/src/igl/max_faces_stopping_condition.h b/src/libigl/igl/max_faces_stopping_condition.h similarity index 100% rename from src/igl/max_faces_stopping_condition.h rename to src/libigl/igl/max_faces_stopping_condition.h diff --git a/src/igl/max_size.cpp b/src/libigl/igl/max_size.cpp similarity index 100% rename from src/igl/max_size.cpp rename to src/libigl/igl/max_size.cpp diff --git a/src/igl/max_size.h b/src/libigl/igl/max_size.h similarity index 100% rename from src/igl/max_size.h rename to src/libigl/igl/max_size.h diff --git a/src/igl/median.cpp b/src/libigl/igl/median.cpp similarity index 100% rename from src/igl/median.cpp rename to src/libigl/igl/median.cpp diff --git a/src/igl/median.h b/src/libigl/igl/median.h similarity index 100% rename from src/igl/median.h rename to src/libigl/igl/median.h diff --git a/src/igl/min.cpp b/src/libigl/igl/min.cpp similarity index 100% rename from src/igl/min.cpp rename to src/libigl/igl/min.cpp diff --git a/src/igl/min.h b/src/libigl/igl/min.h similarity index 100% rename from src/igl/min.h rename to src/libigl/igl/min.h diff --git a/src/igl/min_quad_dense.cpp b/src/libigl/igl/min_quad_dense.cpp similarity index 100% rename from src/igl/min_quad_dense.cpp rename to src/libigl/igl/min_quad_dense.cpp diff --git a/src/igl/min_quad_dense.h b/src/libigl/igl/min_quad_dense.h similarity index 100% rename from src/igl/min_quad_dense.h rename to src/libigl/igl/min_quad_dense.h diff --git a/src/igl/min_quad_with_fixed.cpp b/src/libigl/igl/min_quad_with_fixed.cpp similarity index 100% rename from src/igl/min_quad_with_fixed.cpp rename to src/libigl/igl/min_quad_with_fixed.cpp diff --git a/src/igl/min_quad_with_fixed.h b/src/libigl/igl/min_quad_with_fixed.h similarity index 100% rename from src/igl/min_quad_with_fixed.h rename to src/libigl/igl/min_quad_with_fixed.h diff --git a/src/igl/min_size.cpp b/src/libigl/igl/min_size.cpp similarity index 100% rename from src/igl/min_size.cpp rename to src/libigl/igl/min_size.cpp diff --git a/src/igl/min_size.h b/src/libigl/igl/min_size.h similarity index 100% rename from src/igl/min_size.h rename to src/libigl/igl/min_size.h diff --git a/src/igl/mod.cpp b/src/libigl/igl/mod.cpp similarity index 100% rename from src/igl/mod.cpp rename to src/libigl/igl/mod.cpp diff --git a/src/igl/mod.h b/src/libigl/igl/mod.h similarity index 100% rename from src/igl/mod.h rename to src/libigl/igl/mod.h diff --git a/src/igl/mode.cpp b/src/libigl/igl/mode.cpp similarity index 100% rename from src/igl/mode.cpp rename to src/libigl/igl/mode.cpp diff --git a/src/igl/mode.h b/src/libigl/igl/mode.h similarity index 100% rename from src/igl/mode.h rename to src/libigl/igl/mode.h diff --git a/src/igl/mosek/bbw.cpp b/src/libigl/igl/mosek/bbw.cpp similarity index 100% rename from src/igl/mosek/bbw.cpp rename to src/libigl/igl/mosek/bbw.cpp diff --git a/src/igl/mosek/bbw.h b/src/libigl/igl/mosek/bbw.h similarity index 100% rename from src/igl/mosek/bbw.h rename to src/libigl/igl/mosek/bbw.h diff --git a/src/igl/mosek/mosek_guarded.cpp b/src/libigl/igl/mosek/mosek_guarded.cpp similarity index 100% rename from src/igl/mosek/mosek_guarded.cpp rename to src/libigl/igl/mosek/mosek_guarded.cpp diff --git a/src/igl/mosek/mosek_guarded.h b/src/libigl/igl/mosek/mosek_guarded.h similarity index 100% rename from src/igl/mosek/mosek_guarded.h rename to src/libigl/igl/mosek/mosek_guarded.h diff --git a/src/igl/mosek/mosek_linprog.cpp b/src/libigl/igl/mosek/mosek_linprog.cpp similarity index 100% rename from src/igl/mosek/mosek_linprog.cpp rename to src/libigl/igl/mosek/mosek_linprog.cpp diff --git a/src/igl/mosek/mosek_linprog.h b/src/libigl/igl/mosek/mosek_linprog.h similarity index 100% rename from src/igl/mosek/mosek_linprog.h rename to src/libigl/igl/mosek/mosek_linprog.h diff --git a/src/igl/mosek/mosek_quadprog.cpp b/src/libigl/igl/mosek/mosek_quadprog.cpp similarity index 100% rename from src/igl/mosek/mosek_quadprog.cpp rename to src/libigl/igl/mosek/mosek_quadprog.cpp diff --git a/src/igl/mosek/mosek_quadprog.h b/src/libigl/igl/mosek/mosek_quadprog.h similarity index 100% rename from src/igl/mosek/mosek_quadprog.h rename to src/libigl/igl/mosek/mosek_quadprog.h diff --git a/src/igl/mvc.cpp b/src/libigl/igl/mvc.cpp similarity index 100% rename from src/igl/mvc.cpp rename to src/libigl/igl/mvc.cpp diff --git a/src/igl/mvc.h b/src/libigl/igl/mvc.h similarity index 100% rename from src/igl/mvc.h rename to src/libigl/igl/mvc.h diff --git a/src/igl/nchoosek.cpp b/src/libigl/igl/nchoosek.cpp similarity index 100% rename from src/igl/nchoosek.cpp rename to src/libigl/igl/nchoosek.cpp diff --git a/src/igl/nchoosek.h b/src/libigl/igl/nchoosek.h similarity index 100% rename from src/igl/nchoosek.h rename to src/libigl/igl/nchoosek.h diff --git a/src/igl/next_filename.cpp b/src/libigl/igl/next_filename.cpp similarity index 100% rename from src/igl/next_filename.cpp rename to src/libigl/igl/next_filename.cpp diff --git a/src/igl/next_filename.h b/src/libigl/igl/next_filename.h similarity index 100% rename from src/igl/next_filename.h rename to src/libigl/igl/next_filename.h diff --git a/src/igl/normal_derivative.cpp b/src/libigl/igl/normal_derivative.cpp similarity index 100% rename from src/igl/normal_derivative.cpp rename to src/libigl/igl/normal_derivative.cpp diff --git a/src/igl/normal_derivative.h b/src/libigl/igl/normal_derivative.h similarity index 100% rename from src/igl/normal_derivative.h rename to src/libigl/igl/normal_derivative.h diff --git a/src/igl/normalize_quat.cpp b/src/libigl/igl/normalize_quat.cpp similarity index 100% rename from src/igl/normalize_quat.cpp rename to src/libigl/igl/normalize_quat.cpp diff --git a/src/igl/normalize_quat.h b/src/libigl/igl/normalize_quat.h similarity index 100% rename from src/igl/normalize_quat.h rename to src/libigl/igl/normalize_quat.h diff --git a/src/igl/normalize_row_lengths.cpp b/src/libigl/igl/normalize_row_lengths.cpp similarity index 100% rename from src/igl/normalize_row_lengths.cpp rename to src/libigl/igl/normalize_row_lengths.cpp diff --git a/src/igl/normalize_row_lengths.h b/src/libigl/igl/normalize_row_lengths.h similarity index 100% rename from src/igl/normalize_row_lengths.h rename to src/libigl/igl/normalize_row_lengths.h diff --git a/src/igl/normalize_row_sums.cpp b/src/libigl/igl/normalize_row_sums.cpp similarity index 100% rename from src/igl/normalize_row_sums.cpp rename to src/libigl/igl/normalize_row_sums.cpp diff --git a/src/igl/normalize_row_sums.h b/src/libigl/igl/normalize_row_sums.h similarity index 100% rename from src/igl/normalize_row_sums.h rename to src/libigl/igl/normalize_row_sums.h diff --git a/src/igl/null.cpp b/src/libigl/igl/null.cpp similarity index 100% rename from src/igl/null.cpp rename to src/libigl/igl/null.cpp diff --git a/src/igl/null.h b/src/libigl/igl/null.h similarity index 100% rename from src/igl/null.h rename to src/libigl/igl/null.h diff --git a/src/igl/octree.cpp b/src/libigl/igl/octree.cpp similarity index 100% rename from src/igl/octree.cpp rename to src/libigl/igl/octree.cpp diff --git a/src/igl/octree.h b/src/libigl/igl/octree.h similarity index 100% rename from src/igl/octree.h rename to src/libigl/igl/octree.h diff --git a/src/igl/on_boundary.cpp b/src/libigl/igl/on_boundary.cpp similarity index 100% rename from src/igl/on_boundary.cpp rename to src/libigl/igl/on_boundary.cpp diff --git a/src/igl/on_boundary.h b/src/libigl/igl/on_boundary.h similarity index 100% rename from src/igl/on_boundary.h rename to src/libigl/igl/on_boundary.h diff --git a/src/igl/opengl/MeshGL.cpp b/src/libigl/igl/opengl/MeshGL.cpp similarity index 100% rename from src/igl/opengl/MeshGL.cpp rename to src/libigl/igl/opengl/MeshGL.cpp diff --git a/src/igl/opengl/MeshGL.h b/src/libigl/igl/opengl/MeshGL.h similarity index 100% rename from src/igl/opengl/MeshGL.h rename to src/libigl/igl/opengl/MeshGL.h diff --git a/src/igl/opengl/ViewerCore.cpp b/src/libigl/igl/opengl/ViewerCore.cpp similarity index 100% rename from src/igl/opengl/ViewerCore.cpp rename to src/libigl/igl/opengl/ViewerCore.cpp diff --git a/src/igl/opengl/ViewerCore.h b/src/libigl/igl/opengl/ViewerCore.h similarity index 100% rename from src/igl/opengl/ViewerCore.h rename to src/libigl/igl/opengl/ViewerCore.h diff --git a/src/igl/opengl/ViewerData.cpp b/src/libigl/igl/opengl/ViewerData.cpp similarity index 100% rename from src/igl/opengl/ViewerData.cpp rename to src/libigl/igl/opengl/ViewerData.cpp diff --git a/src/igl/opengl/ViewerData.h b/src/libigl/igl/opengl/ViewerData.h similarity index 100% rename from src/igl/opengl/ViewerData.h rename to src/libigl/igl/opengl/ViewerData.h diff --git a/src/igl/opengl/bind_vertex_attrib_array.cpp b/src/libigl/igl/opengl/bind_vertex_attrib_array.cpp similarity index 100% rename from src/igl/opengl/bind_vertex_attrib_array.cpp rename to src/libigl/igl/opengl/bind_vertex_attrib_array.cpp diff --git a/src/igl/opengl/bind_vertex_attrib_array.h b/src/libigl/igl/opengl/bind_vertex_attrib_array.h similarity index 100% rename from src/igl/opengl/bind_vertex_attrib_array.h rename to src/libigl/igl/opengl/bind_vertex_attrib_array.h diff --git a/src/igl/opengl/create_index_vbo.cpp b/src/libigl/igl/opengl/create_index_vbo.cpp similarity index 100% rename from src/igl/opengl/create_index_vbo.cpp rename to src/libigl/igl/opengl/create_index_vbo.cpp diff --git a/src/igl/opengl/create_index_vbo.h b/src/libigl/igl/opengl/create_index_vbo.h similarity index 100% rename from src/igl/opengl/create_index_vbo.h rename to src/libigl/igl/opengl/create_index_vbo.h diff --git a/src/igl/opengl/create_mesh_vbo.cpp b/src/libigl/igl/opengl/create_mesh_vbo.cpp similarity index 100% rename from src/igl/opengl/create_mesh_vbo.cpp rename to src/libigl/igl/opengl/create_mesh_vbo.cpp diff --git a/src/igl/opengl/create_mesh_vbo.h b/src/libigl/igl/opengl/create_mesh_vbo.h similarity index 100% rename from src/igl/opengl/create_mesh_vbo.h rename to src/libigl/igl/opengl/create_mesh_vbo.h diff --git a/src/igl/opengl/create_shader_program.cpp b/src/libigl/igl/opengl/create_shader_program.cpp similarity index 100% rename from src/igl/opengl/create_shader_program.cpp rename to src/libigl/igl/opengl/create_shader_program.cpp diff --git a/src/igl/opengl/create_shader_program.h b/src/libigl/igl/opengl/create_shader_program.h similarity index 100% rename from src/igl/opengl/create_shader_program.h rename to src/libigl/igl/opengl/create_shader_program.h diff --git a/src/igl/opengl/create_vector_vbo.cpp b/src/libigl/igl/opengl/create_vector_vbo.cpp similarity index 100% rename from src/igl/opengl/create_vector_vbo.cpp rename to src/libigl/igl/opengl/create_vector_vbo.cpp diff --git a/src/igl/opengl/create_vector_vbo.h b/src/libigl/igl/opengl/create_vector_vbo.h similarity index 100% rename from src/igl/opengl/create_vector_vbo.h rename to src/libigl/igl/opengl/create_vector_vbo.h diff --git a/src/igl/opengl/destroy_shader_program.cpp b/src/libigl/igl/opengl/destroy_shader_program.cpp similarity index 100% rename from src/igl/opengl/destroy_shader_program.cpp rename to src/libigl/igl/opengl/destroy_shader_program.cpp diff --git a/src/igl/opengl/destroy_shader_program.h b/src/libigl/igl/opengl/destroy_shader_program.h similarity index 100% rename from src/igl/opengl/destroy_shader_program.h rename to src/libigl/igl/opengl/destroy_shader_program.h diff --git a/src/igl/opengl/gl.h b/src/libigl/igl/opengl/gl.h similarity index 100% rename from src/igl/opengl/gl.h rename to src/libigl/igl/opengl/gl.h diff --git a/src/igl/opengl/gl_type_size.cpp b/src/libigl/igl/opengl/gl_type_size.cpp similarity index 100% rename from src/igl/opengl/gl_type_size.cpp rename to src/libigl/igl/opengl/gl_type_size.cpp diff --git a/src/igl/opengl/gl_type_size.h b/src/libigl/igl/opengl/gl_type_size.h similarity index 100% rename from src/igl/opengl/gl_type_size.h rename to src/libigl/igl/opengl/gl_type_size.h diff --git a/src/igl/opengl/glfw/Viewer.cpp b/src/libigl/igl/opengl/glfw/Viewer.cpp similarity index 100% rename from src/igl/opengl/glfw/Viewer.cpp rename to src/libigl/igl/opengl/glfw/Viewer.cpp diff --git a/src/igl/opengl/glfw/Viewer.h b/src/libigl/igl/opengl/glfw/Viewer.h similarity index 100% rename from src/igl/opengl/glfw/Viewer.h rename to src/libigl/igl/opengl/glfw/Viewer.h diff --git a/src/igl/opengl/glfw/ViewerPlugin.h b/src/libigl/igl/opengl/glfw/ViewerPlugin.h similarity index 100% rename from src/igl/opengl/glfw/ViewerPlugin.h rename to src/libigl/igl/opengl/glfw/ViewerPlugin.h diff --git a/src/igl/opengl/glfw/background_window.cpp b/src/libigl/igl/opengl/glfw/background_window.cpp similarity index 100% rename from src/igl/opengl/glfw/background_window.cpp rename to src/libigl/igl/opengl/glfw/background_window.cpp diff --git a/src/igl/opengl/glfw/background_window.h b/src/libigl/igl/opengl/glfw/background_window.h similarity index 100% rename from src/igl/opengl/glfw/background_window.h rename to src/libigl/igl/opengl/glfw/background_window.h diff --git a/src/igl/opengl/glfw/imgui/ImGuiHelpers.h b/src/libigl/igl/opengl/glfw/imgui/ImGuiHelpers.h similarity index 100% rename from src/igl/opengl/glfw/imgui/ImGuiHelpers.h rename to src/libigl/igl/opengl/glfw/imgui/ImGuiHelpers.h diff --git a/src/igl/opengl/glfw/imgui/ImGuiMenu.cpp b/src/libigl/igl/opengl/glfw/imgui/ImGuiMenu.cpp similarity index 100% rename from src/igl/opengl/glfw/imgui/ImGuiMenu.cpp rename to src/libigl/igl/opengl/glfw/imgui/ImGuiMenu.cpp diff --git a/src/igl/opengl/glfw/imgui/ImGuiMenu.h b/src/libigl/igl/opengl/glfw/imgui/ImGuiMenu.h similarity index 100% rename from src/igl/opengl/glfw/imgui/ImGuiMenu.h rename to src/libigl/igl/opengl/glfw/imgui/ImGuiMenu.h diff --git a/src/igl/opengl/glfw/map_texture.cpp b/src/libigl/igl/opengl/glfw/map_texture.cpp similarity index 100% rename from src/igl/opengl/glfw/map_texture.cpp rename to src/libigl/igl/opengl/glfw/map_texture.cpp diff --git a/src/igl/opengl/glfw/map_texture.h b/src/libigl/igl/opengl/glfw/map_texture.h similarity index 100% rename from src/igl/opengl/glfw/map_texture.h rename to src/libigl/igl/opengl/glfw/map_texture.h diff --git a/src/igl/opengl/init_render_to_texture.cpp b/src/libigl/igl/opengl/init_render_to_texture.cpp similarity index 100% rename from src/igl/opengl/init_render_to_texture.cpp rename to src/libigl/igl/opengl/init_render_to_texture.cpp diff --git a/src/igl/opengl/init_render_to_texture.h b/src/libigl/igl/opengl/init_render_to_texture.h similarity index 100% rename from src/igl/opengl/init_render_to_texture.h rename to src/libigl/igl/opengl/init_render_to_texture.h diff --git a/src/igl/opengl/load_shader.cpp b/src/libigl/igl/opengl/load_shader.cpp similarity index 100% rename from src/igl/opengl/load_shader.cpp rename to src/libigl/igl/opengl/load_shader.cpp diff --git a/src/igl/opengl/load_shader.h b/src/libigl/igl/opengl/load_shader.h similarity index 100% rename from src/igl/opengl/load_shader.h rename to src/libigl/igl/opengl/load_shader.h diff --git a/src/igl/opengl/print_program_info_log.cpp b/src/libigl/igl/opengl/print_program_info_log.cpp similarity index 100% rename from src/igl/opengl/print_program_info_log.cpp rename to src/libigl/igl/opengl/print_program_info_log.cpp diff --git a/src/igl/opengl/print_program_info_log.h b/src/libigl/igl/opengl/print_program_info_log.h similarity index 100% rename from src/igl/opengl/print_program_info_log.h rename to src/libigl/igl/opengl/print_program_info_log.h diff --git a/src/igl/opengl/print_shader_info_log.cpp b/src/libigl/igl/opengl/print_shader_info_log.cpp similarity index 100% rename from src/igl/opengl/print_shader_info_log.cpp rename to src/libigl/igl/opengl/print_shader_info_log.cpp diff --git a/src/igl/opengl/print_shader_info_log.h b/src/libigl/igl/opengl/print_shader_info_log.h similarity index 100% rename from src/igl/opengl/print_shader_info_log.h rename to src/libigl/igl/opengl/print_shader_info_log.h diff --git a/src/igl/opengl/report_gl_error.cpp b/src/libigl/igl/opengl/report_gl_error.cpp similarity index 100% rename from src/igl/opengl/report_gl_error.cpp rename to src/libigl/igl/opengl/report_gl_error.cpp diff --git a/src/igl/opengl/report_gl_error.h b/src/libigl/igl/opengl/report_gl_error.h similarity index 100% rename from src/igl/opengl/report_gl_error.h rename to src/libigl/igl/opengl/report_gl_error.h diff --git a/src/igl/opengl/uniform_type_to_string.cpp b/src/libigl/igl/opengl/uniform_type_to_string.cpp similarity index 100% rename from src/igl/opengl/uniform_type_to_string.cpp rename to src/libigl/igl/opengl/uniform_type_to_string.cpp diff --git a/src/igl/opengl/uniform_type_to_string.h b/src/libigl/igl/opengl/uniform_type_to_string.h similarity index 100% rename from src/igl/opengl/uniform_type_to_string.h rename to src/libigl/igl/opengl/uniform_type_to_string.h diff --git a/src/igl/opengl/vertex_array.cpp b/src/libigl/igl/opengl/vertex_array.cpp similarity index 100% rename from src/igl/opengl/vertex_array.cpp rename to src/libigl/igl/opengl/vertex_array.cpp diff --git a/src/igl/opengl/vertex_array.h b/src/libigl/igl/opengl/vertex_array.h similarity index 100% rename from src/igl/opengl/vertex_array.h rename to src/libigl/igl/opengl/vertex_array.h diff --git a/src/igl/opengl2/MouseController.h b/src/libigl/igl/opengl2/MouseController.h similarity index 100% rename from src/igl/opengl2/MouseController.h rename to src/libigl/igl/opengl2/MouseController.h diff --git a/src/igl/opengl2/RotateWidget.h b/src/libigl/igl/opengl2/RotateWidget.h similarity index 100% rename from src/igl/opengl2/RotateWidget.h rename to src/libigl/igl/opengl2/RotateWidget.h diff --git a/src/igl/opengl2/TranslateWidget.h b/src/libigl/igl/opengl2/TranslateWidget.h similarity index 100% rename from src/igl/opengl2/TranslateWidget.h rename to src/libigl/igl/opengl2/TranslateWidget.h diff --git a/src/igl/opengl2/draw_beach_ball.cpp b/src/libigl/igl/opengl2/draw_beach_ball.cpp similarity index 100% rename from src/igl/opengl2/draw_beach_ball.cpp rename to src/libigl/igl/opengl2/draw_beach_ball.cpp diff --git a/src/igl/opengl2/draw_beach_ball.h b/src/libigl/igl/opengl2/draw_beach_ball.h similarity index 100% rename from src/igl/opengl2/draw_beach_ball.h rename to src/libigl/igl/opengl2/draw_beach_ball.h diff --git a/src/igl/opengl2/draw_floor.cpp b/src/libigl/igl/opengl2/draw_floor.cpp similarity index 100% rename from src/igl/opengl2/draw_floor.cpp rename to src/libigl/igl/opengl2/draw_floor.cpp diff --git a/src/igl/opengl2/draw_floor.h b/src/libigl/igl/opengl2/draw_floor.h similarity index 100% rename from src/igl/opengl2/draw_floor.h rename to src/libigl/igl/opengl2/draw_floor.h diff --git a/src/igl/opengl2/draw_mesh.cpp b/src/libigl/igl/opengl2/draw_mesh.cpp similarity index 100% rename from src/igl/opengl2/draw_mesh.cpp rename to src/libigl/igl/opengl2/draw_mesh.cpp diff --git a/src/igl/opengl2/draw_mesh.h b/src/libigl/igl/opengl2/draw_mesh.h similarity index 100% rename from src/igl/opengl2/draw_mesh.h rename to src/libigl/igl/opengl2/draw_mesh.h diff --git a/src/igl/opengl2/draw_point.cpp b/src/libigl/igl/opengl2/draw_point.cpp similarity index 100% rename from src/igl/opengl2/draw_point.cpp rename to src/libigl/igl/opengl2/draw_point.cpp diff --git a/src/igl/opengl2/draw_point.h b/src/libigl/igl/opengl2/draw_point.h similarity index 100% rename from src/igl/opengl2/draw_point.h rename to src/libigl/igl/opengl2/draw_point.h diff --git a/src/igl/opengl2/draw_rectangular_marquee.cpp b/src/libigl/igl/opengl2/draw_rectangular_marquee.cpp similarity index 100% rename from src/igl/opengl2/draw_rectangular_marquee.cpp rename to src/libigl/igl/opengl2/draw_rectangular_marquee.cpp diff --git a/src/igl/opengl2/draw_rectangular_marquee.h b/src/libigl/igl/opengl2/draw_rectangular_marquee.h similarity index 100% rename from src/igl/opengl2/draw_rectangular_marquee.h rename to src/libigl/igl/opengl2/draw_rectangular_marquee.h diff --git a/src/igl/opengl2/draw_skeleton_3d.cpp b/src/libigl/igl/opengl2/draw_skeleton_3d.cpp similarity index 100% rename from src/igl/opengl2/draw_skeleton_3d.cpp rename to src/libigl/igl/opengl2/draw_skeleton_3d.cpp diff --git a/src/igl/opengl2/draw_skeleton_3d.h b/src/libigl/igl/opengl2/draw_skeleton_3d.h similarity index 100% rename from src/igl/opengl2/draw_skeleton_3d.h rename to src/libigl/igl/opengl2/draw_skeleton_3d.h diff --git a/src/igl/opengl2/draw_skeleton_vector_graphics.cpp b/src/libigl/igl/opengl2/draw_skeleton_vector_graphics.cpp similarity index 100% rename from src/igl/opengl2/draw_skeleton_vector_graphics.cpp rename to src/libigl/igl/opengl2/draw_skeleton_vector_graphics.cpp diff --git a/src/igl/opengl2/draw_skeleton_vector_graphics.h b/src/libigl/igl/opengl2/draw_skeleton_vector_graphics.h similarity index 100% rename from src/igl/opengl2/draw_skeleton_vector_graphics.h rename to src/libigl/igl/opengl2/draw_skeleton_vector_graphics.h diff --git a/src/igl/opengl2/flare_textures.h b/src/libigl/igl/opengl2/flare_textures.h similarity index 100% rename from src/igl/opengl2/flare_textures.h rename to src/libigl/igl/opengl2/flare_textures.h diff --git a/src/igl/opengl2/gl.h b/src/libigl/igl/opengl2/gl.h similarity index 100% rename from src/igl/opengl2/gl.h rename to src/libigl/igl/opengl2/gl.h diff --git a/src/igl/opengl2/glext.h b/src/libigl/igl/opengl2/glext.h similarity index 100% rename from src/igl/opengl2/glext.h rename to src/libigl/igl/opengl2/glext.h diff --git a/src/igl/opengl2/glu.h b/src/libigl/igl/opengl2/glu.h similarity index 100% rename from src/igl/opengl2/glu.h rename to src/libigl/igl/opengl2/glu.h diff --git a/src/igl/opengl2/lens_flare.cpp b/src/libigl/igl/opengl2/lens_flare.cpp similarity index 100% rename from src/igl/opengl2/lens_flare.cpp rename to src/libigl/igl/opengl2/lens_flare.cpp diff --git a/src/igl/opengl2/lens_flare.h b/src/libigl/igl/opengl2/lens_flare.h similarity index 100% rename from src/igl/opengl2/lens_flare.h rename to src/libigl/igl/opengl2/lens_flare.h diff --git a/src/igl/opengl2/model_proj_viewport.cpp b/src/libigl/igl/opengl2/model_proj_viewport.cpp similarity index 100% rename from src/igl/opengl2/model_proj_viewport.cpp rename to src/libigl/igl/opengl2/model_proj_viewport.cpp diff --git a/src/igl/opengl2/model_proj_viewport.h b/src/libigl/igl/opengl2/model_proj_viewport.h similarity index 100% rename from src/igl/opengl2/model_proj_viewport.h rename to src/libigl/igl/opengl2/model_proj_viewport.h diff --git a/src/igl/opengl2/print_gl_get.cpp b/src/libigl/igl/opengl2/print_gl_get.cpp similarity index 100% rename from src/igl/opengl2/print_gl_get.cpp rename to src/libigl/igl/opengl2/print_gl_get.cpp diff --git a/src/igl/opengl2/print_gl_get.h b/src/libigl/igl/opengl2/print_gl_get.h similarity index 100% rename from src/igl/opengl2/print_gl_get.h rename to src/libigl/igl/opengl2/print_gl_get.h diff --git a/src/igl/opengl2/project.cpp b/src/libigl/igl/opengl2/project.cpp similarity index 100% rename from src/igl/opengl2/project.cpp rename to src/libigl/igl/opengl2/project.cpp diff --git a/src/igl/opengl2/project.h b/src/libigl/igl/opengl2/project.h similarity index 100% rename from src/igl/opengl2/project.h rename to src/libigl/igl/opengl2/project.h diff --git a/src/igl/opengl2/right_axis.cpp b/src/libigl/igl/opengl2/right_axis.cpp similarity index 100% rename from src/igl/opengl2/right_axis.cpp rename to src/libigl/igl/opengl2/right_axis.cpp diff --git a/src/igl/opengl2/right_axis.h b/src/libigl/igl/opengl2/right_axis.h similarity index 100% rename from src/igl/opengl2/right_axis.h rename to src/libigl/igl/opengl2/right_axis.h diff --git a/src/igl/opengl2/shine_textures.h b/src/libigl/igl/opengl2/shine_textures.h similarity index 100% rename from src/igl/opengl2/shine_textures.h rename to src/libigl/igl/opengl2/shine_textures.h diff --git a/src/igl/opengl2/sort_triangles.cpp b/src/libigl/igl/opengl2/sort_triangles.cpp similarity index 100% rename from src/igl/opengl2/sort_triangles.cpp rename to src/libigl/igl/opengl2/sort_triangles.cpp diff --git a/src/igl/opengl2/sort_triangles.h b/src/libigl/igl/opengl2/sort_triangles.h similarity index 100% rename from src/igl/opengl2/sort_triangles.h rename to src/libigl/igl/opengl2/sort_triangles.h diff --git a/src/igl/opengl2/unproject.cpp b/src/libigl/igl/opengl2/unproject.cpp similarity index 100% rename from src/igl/opengl2/unproject.cpp rename to src/libigl/igl/opengl2/unproject.cpp diff --git a/src/igl/opengl2/unproject.h b/src/libigl/igl/opengl2/unproject.h similarity index 100% rename from src/igl/opengl2/unproject.h rename to src/libigl/igl/opengl2/unproject.h diff --git a/src/igl/opengl2/unproject_to_zero_plane.cpp b/src/libigl/igl/opengl2/unproject_to_zero_plane.cpp similarity index 100% rename from src/igl/opengl2/unproject_to_zero_plane.cpp rename to src/libigl/igl/opengl2/unproject_to_zero_plane.cpp diff --git a/src/igl/opengl2/unproject_to_zero_plane.h b/src/libigl/igl/opengl2/unproject_to_zero_plane.h similarity index 100% rename from src/igl/opengl2/unproject_to_zero_plane.h rename to src/libigl/igl/opengl2/unproject_to_zero_plane.h diff --git a/src/igl/opengl2/up_axis.cpp b/src/libigl/igl/opengl2/up_axis.cpp similarity index 100% rename from src/igl/opengl2/up_axis.cpp rename to src/libigl/igl/opengl2/up_axis.cpp diff --git a/src/igl/opengl2/up_axis.h b/src/libigl/igl/opengl2/up_axis.h similarity index 100% rename from src/igl/opengl2/up_axis.h rename to src/libigl/igl/opengl2/up_axis.h diff --git a/src/igl/opengl2/view_axis.cpp b/src/libigl/igl/opengl2/view_axis.cpp similarity index 100% rename from src/igl/opengl2/view_axis.cpp rename to src/libigl/igl/opengl2/view_axis.cpp diff --git a/src/igl/opengl2/view_axis.h b/src/libigl/igl/opengl2/view_axis.h similarity index 100% rename from src/igl/opengl2/view_axis.h rename to src/libigl/igl/opengl2/view_axis.h diff --git a/src/igl/orient_outward.cpp b/src/libigl/igl/orient_outward.cpp similarity index 100% rename from src/igl/orient_outward.cpp rename to src/libigl/igl/orient_outward.cpp diff --git a/src/igl/orient_outward.h b/src/libigl/igl/orient_outward.h similarity index 100% rename from src/igl/orient_outward.h rename to src/libigl/igl/orient_outward.h diff --git a/src/igl/orientable_patches.cpp b/src/libigl/igl/orientable_patches.cpp similarity index 100% rename from src/igl/orientable_patches.cpp rename to src/libigl/igl/orientable_patches.cpp diff --git a/src/igl/orientable_patches.h b/src/libigl/igl/orientable_patches.h similarity index 100% rename from src/igl/orientable_patches.h rename to src/libigl/igl/orientable_patches.h diff --git a/src/igl/oriented_facets.cpp b/src/libigl/igl/oriented_facets.cpp similarity index 100% rename from src/igl/oriented_facets.cpp rename to src/libigl/igl/oriented_facets.cpp diff --git a/src/igl/oriented_facets.h b/src/libigl/igl/oriented_facets.h similarity index 100% rename from src/igl/oriented_facets.h rename to src/libigl/igl/oriented_facets.h diff --git a/src/igl/orth.cpp b/src/libigl/igl/orth.cpp similarity index 100% rename from src/igl/orth.cpp rename to src/libigl/igl/orth.cpp diff --git a/src/igl/orth.h b/src/libigl/igl/orth.h similarity index 100% rename from src/igl/orth.h rename to src/libigl/igl/orth.h diff --git a/src/igl/ortho.cpp b/src/libigl/igl/ortho.cpp similarity index 100% rename from src/igl/ortho.cpp rename to src/libigl/igl/ortho.cpp diff --git a/src/igl/ortho.h b/src/libigl/igl/ortho.h similarity index 100% rename from src/igl/ortho.h rename to src/libigl/igl/ortho.h diff --git a/src/igl/outer_element.cpp b/src/libigl/igl/outer_element.cpp similarity index 100% rename from src/igl/outer_element.cpp rename to src/libigl/igl/outer_element.cpp diff --git a/src/igl/outer_element.h b/src/libigl/igl/outer_element.h similarity index 100% rename from src/igl/outer_element.h rename to src/libigl/igl/outer_element.h diff --git a/src/igl/parallel_for.h b/src/libigl/igl/parallel_for.h similarity index 100% rename from src/igl/parallel_for.h rename to src/libigl/igl/parallel_for.h diff --git a/src/igl/parallel_transport_angles.cpp b/src/libigl/igl/parallel_transport_angles.cpp similarity index 100% rename from src/igl/parallel_transport_angles.cpp rename to src/libigl/igl/parallel_transport_angles.cpp diff --git a/src/igl/parallel_transport_angles.h b/src/libigl/igl/parallel_transport_angles.h similarity index 100% rename from src/igl/parallel_transport_angles.h rename to src/libigl/igl/parallel_transport_angles.h diff --git a/src/igl/partition.cpp b/src/libigl/igl/partition.cpp similarity index 100% rename from src/igl/partition.cpp rename to src/libigl/igl/partition.cpp diff --git a/src/igl/partition.h b/src/libigl/igl/partition.h similarity index 100% rename from src/igl/partition.h rename to src/libigl/igl/partition.h diff --git a/src/igl/parula.cpp b/src/libigl/igl/parula.cpp similarity index 100% rename from src/igl/parula.cpp rename to src/libigl/igl/parula.cpp diff --git a/src/igl/parula.h b/src/libigl/igl/parula.h similarity index 100% rename from src/igl/parula.h rename to src/libigl/igl/parula.h diff --git a/src/igl/path_to_executable.cpp b/src/libigl/igl/path_to_executable.cpp similarity index 100% rename from src/igl/path_to_executable.cpp rename to src/libigl/igl/path_to_executable.cpp diff --git a/src/igl/path_to_executable.h b/src/libigl/igl/path_to_executable.h similarity index 100% rename from src/igl/path_to_executable.h rename to src/libigl/igl/path_to_executable.h diff --git a/src/igl/pathinfo.cpp b/src/libigl/igl/pathinfo.cpp similarity index 100% rename from src/igl/pathinfo.cpp rename to src/libigl/igl/pathinfo.cpp diff --git a/src/igl/pathinfo.h b/src/libigl/igl/pathinfo.h similarity index 100% rename from src/igl/pathinfo.h rename to src/libigl/igl/pathinfo.h diff --git a/src/igl/per_corner_normals.cpp b/src/libigl/igl/per_corner_normals.cpp similarity index 100% rename from src/igl/per_corner_normals.cpp rename to src/libigl/igl/per_corner_normals.cpp diff --git a/src/igl/per_corner_normals.h b/src/libigl/igl/per_corner_normals.h similarity index 100% rename from src/igl/per_corner_normals.h rename to src/libigl/igl/per_corner_normals.h diff --git a/src/igl/per_edge_normals.cpp b/src/libigl/igl/per_edge_normals.cpp similarity index 100% rename from src/igl/per_edge_normals.cpp rename to src/libigl/igl/per_edge_normals.cpp diff --git a/src/igl/per_edge_normals.h b/src/libigl/igl/per_edge_normals.h similarity index 100% rename from src/igl/per_edge_normals.h rename to src/libigl/igl/per_edge_normals.h diff --git a/src/igl/per_face_normals.cpp b/src/libigl/igl/per_face_normals.cpp similarity index 100% rename from src/igl/per_face_normals.cpp rename to src/libigl/igl/per_face_normals.cpp diff --git a/src/igl/per_face_normals.h b/src/libigl/igl/per_face_normals.h similarity index 100% rename from src/igl/per_face_normals.h rename to src/libigl/igl/per_face_normals.h diff --git a/src/igl/per_vertex_attribute_smoothing.cpp b/src/libigl/igl/per_vertex_attribute_smoothing.cpp similarity index 100% rename from src/igl/per_vertex_attribute_smoothing.cpp rename to src/libigl/igl/per_vertex_attribute_smoothing.cpp diff --git a/src/igl/per_vertex_attribute_smoothing.h b/src/libigl/igl/per_vertex_attribute_smoothing.h similarity index 100% rename from src/igl/per_vertex_attribute_smoothing.h rename to src/libigl/igl/per_vertex_attribute_smoothing.h diff --git a/src/igl/per_vertex_normals.cpp b/src/libigl/igl/per_vertex_normals.cpp similarity index 100% rename from src/igl/per_vertex_normals.cpp rename to src/libigl/igl/per_vertex_normals.cpp diff --git a/src/igl/per_vertex_normals.h b/src/libigl/igl/per_vertex_normals.h similarity index 100% rename from src/igl/per_vertex_normals.h rename to src/libigl/igl/per_vertex_normals.h diff --git a/src/igl/per_vertex_point_to_plane_quadrics.cpp b/src/libigl/igl/per_vertex_point_to_plane_quadrics.cpp similarity index 100% rename from src/igl/per_vertex_point_to_plane_quadrics.cpp rename to src/libigl/igl/per_vertex_point_to_plane_quadrics.cpp diff --git a/src/igl/per_vertex_point_to_plane_quadrics.h b/src/libigl/igl/per_vertex_point_to_plane_quadrics.h similarity index 100% rename from src/igl/per_vertex_point_to_plane_quadrics.h rename to src/libigl/igl/per_vertex_point_to_plane_quadrics.h diff --git a/src/igl/piecewise_constant_winding_number.cpp b/src/libigl/igl/piecewise_constant_winding_number.cpp similarity index 100% rename from src/igl/piecewise_constant_winding_number.cpp rename to src/libigl/igl/piecewise_constant_winding_number.cpp diff --git a/src/igl/piecewise_constant_winding_number.h b/src/libigl/igl/piecewise_constant_winding_number.h similarity index 100% rename from src/igl/piecewise_constant_winding_number.h rename to src/libigl/igl/piecewise_constant_winding_number.h diff --git a/src/igl/pinv.cpp b/src/libigl/igl/pinv.cpp similarity index 100% rename from src/igl/pinv.cpp rename to src/libigl/igl/pinv.cpp diff --git a/src/igl/pinv.h b/src/libigl/igl/pinv.h similarity index 100% rename from src/igl/pinv.h rename to src/libigl/igl/pinv.h diff --git a/src/igl/planarize_quad_mesh.cpp b/src/libigl/igl/planarize_quad_mesh.cpp similarity index 100% rename from src/igl/planarize_quad_mesh.cpp rename to src/libigl/igl/planarize_quad_mesh.cpp diff --git a/src/igl/planarize_quad_mesh.h b/src/libigl/igl/planarize_quad_mesh.h similarity index 100% rename from src/igl/planarize_quad_mesh.h rename to src/libigl/igl/planarize_quad_mesh.h diff --git a/src/igl/ply.h b/src/libigl/igl/ply.h similarity index 100% rename from src/igl/ply.h rename to src/libigl/igl/ply.h diff --git a/src/igl/png/readPNG.cpp b/src/libigl/igl/png/readPNG.cpp similarity index 100% rename from src/igl/png/readPNG.cpp rename to src/libigl/igl/png/readPNG.cpp diff --git a/src/igl/png/readPNG.h b/src/libigl/igl/png/readPNG.h similarity index 100% rename from src/igl/png/readPNG.h rename to src/libigl/igl/png/readPNG.h diff --git a/src/igl/png/render_to_png.cpp b/src/libigl/igl/png/render_to_png.cpp similarity index 100% rename from src/igl/png/render_to_png.cpp rename to src/libigl/igl/png/render_to_png.cpp diff --git a/src/igl/png/render_to_png.h b/src/libigl/igl/png/render_to_png.h similarity index 100% rename from src/igl/png/render_to_png.h rename to src/libigl/igl/png/render_to_png.h diff --git a/src/igl/png/render_to_png_async.cpp b/src/libigl/igl/png/render_to_png_async.cpp similarity index 100% rename from src/igl/png/render_to_png_async.cpp rename to src/libigl/igl/png/render_to_png_async.cpp diff --git a/src/igl/png/render_to_png_async.h b/src/libigl/igl/png/render_to_png_async.h similarity index 100% rename from src/igl/png/render_to_png_async.h rename to src/libigl/igl/png/render_to_png_async.h diff --git a/src/igl/png/texture_from_file.cpp b/src/libigl/igl/png/texture_from_file.cpp similarity index 100% rename from src/igl/png/texture_from_file.cpp rename to src/libigl/igl/png/texture_from_file.cpp diff --git a/src/igl/png/texture_from_file.h b/src/libigl/igl/png/texture_from_file.h similarity index 100% rename from src/igl/png/texture_from_file.h rename to src/libigl/igl/png/texture_from_file.h diff --git a/src/igl/png/texture_from_png.cpp b/src/libigl/igl/png/texture_from_png.cpp similarity index 100% rename from src/igl/png/texture_from_png.cpp rename to src/libigl/igl/png/texture_from_png.cpp diff --git a/src/igl/png/texture_from_png.h b/src/libigl/igl/png/texture_from_png.h similarity index 100% rename from src/igl/png/texture_from_png.h rename to src/libigl/igl/png/texture_from_png.h diff --git a/src/igl/png/writePNG.cpp b/src/libigl/igl/png/writePNG.cpp similarity index 100% rename from src/igl/png/writePNG.cpp rename to src/libigl/igl/png/writePNG.cpp diff --git a/src/igl/png/writePNG.h b/src/libigl/igl/png/writePNG.h similarity index 100% rename from src/igl/png/writePNG.h rename to src/libigl/igl/png/writePNG.h diff --git a/src/igl/point_in_circle.cpp b/src/libigl/igl/point_in_circle.cpp similarity index 100% rename from src/igl/point_in_circle.cpp rename to src/libigl/igl/point_in_circle.cpp diff --git a/src/igl/point_in_circle.h b/src/libigl/igl/point_in_circle.h similarity index 100% rename from src/igl/point_in_circle.h rename to src/libigl/igl/point_in_circle.h diff --git a/src/igl/point_in_poly.cpp b/src/libigl/igl/point_in_poly.cpp similarity index 100% rename from src/igl/point_in_poly.cpp rename to src/libigl/igl/point_in_poly.cpp diff --git a/src/igl/point_in_poly.h b/src/libigl/igl/point_in_poly.h similarity index 100% rename from src/igl/point_in_poly.h rename to src/libigl/igl/point_in_poly.h diff --git a/src/igl/point_mesh_squared_distance.cpp b/src/libigl/igl/point_mesh_squared_distance.cpp similarity index 100% rename from src/igl/point_mesh_squared_distance.cpp rename to src/libigl/igl/point_mesh_squared_distance.cpp diff --git a/src/igl/point_mesh_squared_distance.h b/src/libigl/igl/point_mesh_squared_distance.h similarity index 100% rename from src/igl/point_mesh_squared_distance.h rename to src/libigl/igl/point_mesh_squared_distance.h diff --git a/src/igl/point_simplex_squared_distance.cpp b/src/libigl/igl/point_simplex_squared_distance.cpp similarity index 100% rename from src/igl/point_simplex_squared_distance.cpp rename to src/libigl/igl/point_simplex_squared_distance.cpp diff --git a/src/igl/point_simplex_squared_distance.h b/src/libigl/igl/point_simplex_squared_distance.h similarity index 100% rename from src/igl/point_simplex_squared_distance.h rename to src/libigl/igl/point_simplex_squared_distance.h diff --git a/src/igl/polar_dec.cpp b/src/libigl/igl/polar_dec.cpp similarity index 100% rename from src/igl/polar_dec.cpp rename to src/libigl/igl/polar_dec.cpp diff --git a/src/igl/polar_dec.h b/src/libigl/igl/polar_dec.h similarity index 100% rename from src/igl/polar_dec.h rename to src/libigl/igl/polar_dec.h diff --git a/src/igl/polar_svd.cpp b/src/libigl/igl/polar_svd.cpp similarity index 100% rename from src/igl/polar_svd.cpp rename to src/libigl/igl/polar_svd.cpp diff --git a/src/igl/polar_svd.h b/src/libigl/igl/polar_svd.h similarity index 100% rename from src/igl/polar_svd.h rename to src/libigl/igl/polar_svd.h diff --git a/src/igl/polar_svd3x3.cpp b/src/libigl/igl/polar_svd3x3.cpp similarity index 100% rename from src/igl/polar_svd3x3.cpp rename to src/libigl/igl/polar_svd3x3.cpp diff --git a/src/igl/polar_svd3x3.h b/src/libigl/igl/polar_svd3x3.h similarity index 100% rename from src/igl/polar_svd3x3.h rename to src/libigl/igl/polar_svd3x3.h diff --git a/src/igl/polygon_mesh_to_triangle_mesh.cpp b/src/libigl/igl/polygon_mesh_to_triangle_mesh.cpp similarity index 100% rename from src/igl/polygon_mesh_to_triangle_mesh.cpp rename to src/libigl/igl/polygon_mesh_to_triangle_mesh.cpp diff --git a/src/igl/polygon_mesh_to_triangle_mesh.h b/src/libigl/igl/polygon_mesh_to_triangle_mesh.h similarity index 100% rename from src/igl/polygon_mesh_to_triangle_mesh.h rename to src/libigl/igl/polygon_mesh_to_triangle_mesh.h diff --git a/src/igl/principal_curvature.cpp b/src/libigl/igl/principal_curvature.cpp similarity index 100% rename from src/igl/principal_curvature.cpp rename to src/libigl/igl/principal_curvature.cpp diff --git a/src/igl/principal_curvature.h b/src/libigl/igl/principal_curvature.h similarity index 100% rename from src/igl/principal_curvature.h rename to src/libigl/igl/principal_curvature.h diff --git a/src/igl/print_ijv.cpp b/src/libigl/igl/print_ijv.cpp similarity index 100% rename from src/igl/print_ijv.cpp rename to src/libigl/igl/print_ijv.cpp diff --git a/src/igl/print_ijv.h b/src/libigl/igl/print_ijv.h similarity index 100% rename from src/igl/print_ijv.h rename to src/libigl/igl/print_ijv.h diff --git a/src/igl/print_vector.cpp b/src/libigl/igl/print_vector.cpp similarity index 100% rename from src/igl/print_vector.cpp rename to src/libigl/igl/print_vector.cpp diff --git a/src/igl/print_vector.h b/src/libigl/igl/print_vector.h similarity index 100% rename from src/igl/print_vector.h rename to src/libigl/igl/print_vector.h diff --git a/src/igl/procrustes.cpp b/src/libigl/igl/procrustes.cpp similarity index 100% rename from src/igl/procrustes.cpp rename to src/libigl/igl/procrustes.cpp diff --git a/src/igl/procrustes.h b/src/libigl/igl/procrustes.h similarity index 100% rename from src/igl/procrustes.h rename to src/libigl/igl/procrustes.h diff --git a/src/igl/project.cpp b/src/libigl/igl/project.cpp similarity index 100% rename from src/igl/project.cpp rename to src/libigl/igl/project.cpp diff --git a/src/igl/project.h b/src/libigl/igl/project.h similarity index 100% rename from src/igl/project.h rename to src/libigl/igl/project.h diff --git a/src/igl/project_isometrically_to_plane.cpp b/src/libigl/igl/project_isometrically_to_plane.cpp similarity index 100% rename from src/igl/project_isometrically_to_plane.cpp rename to src/libigl/igl/project_isometrically_to_plane.cpp diff --git a/src/igl/project_isometrically_to_plane.h b/src/libigl/igl/project_isometrically_to_plane.h similarity index 100% rename from src/igl/project_isometrically_to_plane.h rename to src/libigl/igl/project_isometrically_to_plane.h diff --git a/src/igl/project_to_line.cpp b/src/libigl/igl/project_to_line.cpp similarity index 100% rename from src/igl/project_to_line.cpp rename to src/libigl/igl/project_to_line.cpp diff --git a/src/igl/project_to_line.h b/src/libigl/igl/project_to_line.h similarity index 100% rename from src/igl/project_to_line.h rename to src/libigl/igl/project_to_line.h diff --git a/src/igl/project_to_line_segment.cpp b/src/libigl/igl/project_to_line_segment.cpp similarity index 100% rename from src/igl/project_to_line_segment.cpp rename to src/libigl/igl/project_to_line_segment.cpp diff --git a/src/igl/project_to_line_segment.h b/src/libigl/igl/project_to_line_segment.h similarity index 100% rename from src/igl/project_to_line_segment.h rename to src/libigl/igl/project_to_line_segment.h diff --git a/src/igl/pseudonormal_test.cpp b/src/libigl/igl/pseudonormal_test.cpp similarity index 100% rename from src/igl/pseudonormal_test.cpp rename to src/libigl/igl/pseudonormal_test.cpp diff --git a/src/igl/pseudonormal_test.h b/src/libigl/igl/pseudonormal_test.h similarity index 100% rename from src/igl/pseudonormal_test.h rename to src/libigl/igl/pseudonormal_test.h diff --git a/src/igl/pso.cpp b/src/libigl/igl/pso.cpp similarity index 100% rename from src/igl/pso.cpp rename to src/libigl/igl/pso.cpp diff --git a/src/igl/pso.h b/src/libigl/igl/pso.h similarity index 100% rename from src/igl/pso.h rename to src/libigl/igl/pso.h diff --git a/src/igl/qslim.cpp b/src/libigl/igl/qslim.cpp similarity index 100% rename from src/igl/qslim.cpp rename to src/libigl/igl/qslim.cpp diff --git a/src/igl/qslim.h b/src/libigl/igl/qslim.h similarity index 100% rename from src/igl/qslim.h rename to src/libigl/igl/qslim.h diff --git a/src/igl/qslim_optimal_collapse_edge_callbacks.cpp b/src/libigl/igl/qslim_optimal_collapse_edge_callbacks.cpp similarity index 100% rename from src/igl/qslim_optimal_collapse_edge_callbacks.cpp rename to src/libigl/igl/qslim_optimal_collapse_edge_callbacks.cpp diff --git a/src/igl/qslim_optimal_collapse_edge_callbacks.h b/src/libigl/igl/qslim_optimal_collapse_edge_callbacks.h similarity index 100% rename from src/igl/qslim_optimal_collapse_edge_callbacks.h rename to src/libigl/igl/qslim_optimal_collapse_edge_callbacks.h diff --git a/src/igl/quad_planarity.cpp b/src/libigl/igl/quad_planarity.cpp similarity index 100% rename from src/igl/quad_planarity.cpp rename to src/libigl/igl/quad_planarity.cpp diff --git a/src/igl/quad_planarity.h b/src/libigl/igl/quad_planarity.h similarity index 100% rename from src/igl/quad_planarity.h rename to src/libigl/igl/quad_planarity.h diff --git a/src/igl/quadric_binary_plus_operator.cpp b/src/libigl/igl/quadric_binary_plus_operator.cpp similarity index 100% rename from src/igl/quadric_binary_plus_operator.cpp rename to src/libigl/igl/quadric_binary_plus_operator.cpp diff --git a/src/igl/quadric_binary_plus_operator.h b/src/libigl/igl/quadric_binary_plus_operator.h similarity index 100% rename from src/igl/quadric_binary_plus_operator.h rename to src/libigl/igl/quadric_binary_plus_operator.h diff --git a/src/igl/quat_conjugate.cpp b/src/libigl/igl/quat_conjugate.cpp similarity index 100% rename from src/igl/quat_conjugate.cpp rename to src/libigl/igl/quat_conjugate.cpp diff --git a/src/igl/quat_conjugate.h b/src/libigl/igl/quat_conjugate.h similarity index 100% rename from src/igl/quat_conjugate.h rename to src/libigl/igl/quat_conjugate.h diff --git a/src/igl/quat_mult.cpp b/src/libigl/igl/quat_mult.cpp similarity index 100% rename from src/igl/quat_mult.cpp rename to src/libigl/igl/quat_mult.cpp diff --git a/src/igl/quat_mult.h b/src/libigl/igl/quat_mult.h similarity index 100% rename from src/igl/quat_mult.h rename to src/libigl/igl/quat_mult.h diff --git a/src/igl/quat_to_axis_angle.cpp b/src/libigl/igl/quat_to_axis_angle.cpp similarity index 100% rename from src/igl/quat_to_axis_angle.cpp rename to src/libigl/igl/quat_to_axis_angle.cpp diff --git a/src/igl/quat_to_axis_angle.h b/src/libigl/igl/quat_to_axis_angle.h similarity index 100% rename from src/igl/quat_to_axis_angle.h rename to src/libigl/igl/quat_to_axis_angle.h diff --git a/src/igl/quat_to_mat.cpp b/src/libigl/igl/quat_to_mat.cpp similarity index 100% rename from src/igl/quat_to_mat.cpp rename to src/libigl/igl/quat_to_mat.cpp diff --git a/src/igl/quat_to_mat.h b/src/libigl/igl/quat_to_mat.h similarity index 100% rename from src/igl/quat_to_mat.h rename to src/libigl/igl/quat_to_mat.h diff --git a/src/igl/quats_to_column.cpp b/src/libigl/igl/quats_to_column.cpp similarity index 100% rename from src/igl/quats_to_column.cpp rename to src/libigl/igl/quats_to_column.cpp diff --git a/src/igl/quats_to_column.h b/src/libigl/igl/quats_to_column.h similarity index 100% rename from src/igl/quats_to_column.h rename to src/libigl/igl/quats_to_column.h diff --git a/src/igl/ramer_douglas_peucker.cpp b/src/libigl/igl/ramer_douglas_peucker.cpp similarity index 100% rename from src/igl/ramer_douglas_peucker.cpp rename to src/libigl/igl/ramer_douglas_peucker.cpp diff --git a/src/igl/ramer_douglas_peucker.h b/src/libigl/igl/ramer_douglas_peucker.h similarity index 100% rename from src/igl/ramer_douglas_peucker.h rename to src/libigl/igl/ramer_douglas_peucker.h diff --git a/src/igl/random_dir.cpp b/src/libigl/igl/random_dir.cpp similarity index 100% rename from src/igl/random_dir.cpp rename to src/libigl/igl/random_dir.cpp diff --git a/src/igl/random_dir.h b/src/libigl/igl/random_dir.h similarity index 100% rename from src/igl/random_dir.h rename to src/libigl/igl/random_dir.h diff --git a/src/igl/random_points_on_mesh.cpp b/src/libigl/igl/random_points_on_mesh.cpp similarity index 100% rename from src/igl/random_points_on_mesh.cpp rename to src/libigl/igl/random_points_on_mesh.cpp diff --git a/src/igl/random_points_on_mesh.h b/src/libigl/igl/random_points_on_mesh.h similarity index 100% rename from src/igl/random_points_on_mesh.h rename to src/libigl/igl/random_points_on_mesh.h diff --git a/src/igl/random_quaternion.cpp b/src/libigl/igl/random_quaternion.cpp similarity index 100% rename from src/igl/random_quaternion.cpp rename to src/libigl/igl/random_quaternion.cpp diff --git a/src/igl/random_quaternion.h b/src/libigl/igl/random_quaternion.h similarity index 100% rename from src/igl/random_quaternion.h rename to src/libigl/igl/random_quaternion.h diff --git a/src/igl/random_search.cpp b/src/libigl/igl/random_search.cpp similarity index 100% rename from src/igl/random_search.cpp rename to src/libigl/igl/random_search.cpp diff --git a/src/igl/random_search.h b/src/libigl/igl/random_search.h similarity index 100% rename from src/igl/random_search.h rename to src/libigl/igl/random_search.h diff --git a/src/igl/randperm.cpp b/src/libigl/igl/randperm.cpp similarity index 100% rename from src/igl/randperm.cpp rename to src/libigl/igl/randperm.cpp diff --git a/src/igl/randperm.h b/src/libigl/igl/randperm.h similarity index 100% rename from src/igl/randperm.h rename to src/libigl/igl/randperm.h diff --git a/src/igl/ray_box_intersect.cpp b/src/libigl/igl/ray_box_intersect.cpp similarity index 100% rename from src/igl/ray_box_intersect.cpp rename to src/libigl/igl/ray_box_intersect.cpp diff --git a/src/igl/ray_box_intersect.h b/src/libigl/igl/ray_box_intersect.h similarity index 100% rename from src/igl/ray_box_intersect.h rename to src/libigl/igl/ray_box_intersect.h diff --git a/src/igl/ray_mesh_intersect.cpp b/src/libigl/igl/ray_mesh_intersect.cpp similarity index 100% rename from src/igl/ray_mesh_intersect.cpp rename to src/libigl/igl/ray_mesh_intersect.cpp diff --git a/src/igl/ray_mesh_intersect.h b/src/libigl/igl/ray_mesh_intersect.h similarity index 100% rename from src/igl/ray_mesh_intersect.h rename to src/libigl/igl/ray_mesh_intersect.h diff --git a/src/igl/ray_sphere_intersect.cpp b/src/libigl/igl/ray_sphere_intersect.cpp similarity index 100% rename from src/igl/ray_sphere_intersect.cpp rename to src/libigl/igl/ray_sphere_intersect.cpp diff --git a/src/igl/ray_sphere_intersect.h b/src/libigl/igl/ray_sphere_intersect.h similarity index 100% rename from src/igl/ray_sphere_intersect.h rename to src/libigl/igl/ray_sphere_intersect.h diff --git a/src/igl/raytri.c b/src/libigl/igl/raytri.c similarity index 100% rename from src/igl/raytri.c rename to src/libigl/igl/raytri.c diff --git a/src/igl/readBF.cpp b/src/libigl/igl/readBF.cpp similarity index 100% rename from src/igl/readBF.cpp rename to src/libigl/igl/readBF.cpp diff --git a/src/igl/readBF.h b/src/libigl/igl/readBF.h similarity index 100% rename from src/igl/readBF.h rename to src/libigl/igl/readBF.h diff --git a/src/igl/readCSV.cpp b/src/libigl/igl/readCSV.cpp similarity index 100% rename from src/igl/readCSV.cpp rename to src/libigl/igl/readCSV.cpp diff --git a/src/igl/readCSV.h b/src/libigl/igl/readCSV.h similarity index 100% rename from src/igl/readCSV.h rename to src/libigl/igl/readCSV.h diff --git a/src/igl/readDMAT.cpp b/src/libigl/igl/readDMAT.cpp similarity index 100% rename from src/igl/readDMAT.cpp rename to src/libigl/igl/readDMAT.cpp diff --git a/src/igl/readDMAT.h b/src/libigl/igl/readDMAT.h similarity index 100% rename from src/igl/readDMAT.h rename to src/libigl/igl/readDMAT.h diff --git a/src/igl/readMESH.cpp b/src/libigl/igl/readMESH.cpp similarity index 100% rename from src/igl/readMESH.cpp rename to src/libigl/igl/readMESH.cpp diff --git a/src/igl/readMESH.h b/src/libigl/igl/readMESH.h similarity index 100% rename from src/igl/readMESH.h rename to src/libigl/igl/readMESH.h diff --git a/src/igl/readMSH.cpp b/src/libigl/igl/readMSH.cpp similarity index 100% rename from src/igl/readMSH.cpp rename to src/libigl/igl/readMSH.cpp diff --git a/src/igl/readMSH.h b/src/libigl/igl/readMSH.h similarity index 100% rename from src/igl/readMSH.h rename to src/libigl/igl/readMSH.h diff --git a/src/igl/readNODE.cpp b/src/libigl/igl/readNODE.cpp similarity index 100% rename from src/igl/readNODE.cpp rename to src/libigl/igl/readNODE.cpp diff --git a/src/igl/readNODE.h b/src/libigl/igl/readNODE.h similarity index 100% rename from src/igl/readNODE.h rename to src/libigl/igl/readNODE.h diff --git a/src/igl/readOBJ.cpp b/src/libigl/igl/readOBJ.cpp similarity index 100% rename from src/igl/readOBJ.cpp rename to src/libigl/igl/readOBJ.cpp diff --git a/src/igl/readOBJ.h b/src/libigl/igl/readOBJ.h similarity index 100% rename from src/igl/readOBJ.h rename to src/libigl/igl/readOBJ.h diff --git a/src/igl/readOFF.cpp b/src/libigl/igl/readOFF.cpp similarity index 100% rename from src/igl/readOFF.cpp rename to src/libigl/igl/readOFF.cpp diff --git a/src/igl/readOFF.h b/src/libigl/igl/readOFF.h similarity index 100% rename from src/igl/readOFF.h rename to src/libigl/igl/readOFF.h diff --git a/src/igl/readPLY.cpp b/src/libigl/igl/readPLY.cpp similarity index 100% rename from src/igl/readPLY.cpp rename to src/libigl/igl/readPLY.cpp diff --git a/src/igl/readPLY.h b/src/libigl/igl/readPLY.h similarity index 100% rename from src/igl/readPLY.h rename to src/libigl/igl/readPLY.h diff --git a/src/igl/readSTL.cpp b/src/libigl/igl/readSTL.cpp similarity index 100% rename from src/igl/readSTL.cpp rename to src/libigl/igl/readSTL.cpp diff --git a/src/igl/readSTL.h b/src/libigl/igl/readSTL.h similarity index 100% rename from src/igl/readSTL.h rename to src/libigl/igl/readSTL.h diff --git a/src/igl/readTGF.cpp b/src/libigl/igl/readTGF.cpp similarity index 100% rename from src/igl/readTGF.cpp rename to src/libigl/igl/readTGF.cpp diff --git a/src/igl/readTGF.h b/src/libigl/igl/readTGF.h similarity index 100% rename from src/igl/readTGF.h rename to src/libigl/igl/readTGF.h diff --git a/src/igl/readWRL.cpp b/src/libigl/igl/readWRL.cpp similarity index 100% rename from src/igl/readWRL.cpp rename to src/libigl/igl/readWRL.cpp diff --git a/src/igl/readWRL.h b/src/libigl/igl/readWRL.h similarity index 100% rename from src/igl/readWRL.h rename to src/libigl/igl/readWRL.h diff --git a/src/igl/read_triangle_mesh.cpp b/src/libigl/igl/read_triangle_mesh.cpp similarity index 100% rename from src/igl/read_triangle_mesh.cpp rename to src/libigl/igl/read_triangle_mesh.cpp diff --git a/src/igl/read_triangle_mesh.h b/src/libigl/igl/read_triangle_mesh.h similarity index 100% rename from src/igl/read_triangle_mesh.h rename to src/libigl/igl/read_triangle_mesh.h diff --git a/src/igl/redux.h b/src/libigl/igl/redux.h similarity index 100% rename from src/igl/redux.h rename to src/libigl/igl/redux.h diff --git a/src/igl/remesh_along_isoline.cpp b/src/libigl/igl/remesh_along_isoline.cpp similarity index 100% rename from src/igl/remesh_along_isoline.cpp rename to src/libigl/igl/remesh_along_isoline.cpp diff --git a/src/igl/remesh_along_isoline.h b/src/libigl/igl/remesh_along_isoline.h similarity index 100% rename from src/igl/remesh_along_isoline.h rename to src/libigl/igl/remesh_along_isoline.h diff --git a/src/igl/remove_duplicate_vertices.cpp b/src/libigl/igl/remove_duplicate_vertices.cpp similarity index 100% rename from src/igl/remove_duplicate_vertices.cpp rename to src/libigl/igl/remove_duplicate_vertices.cpp diff --git a/src/igl/remove_duplicate_vertices.h b/src/libigl/igl/remove_duplicate_vertices.h similarity index 100% rename from src/igl/remove_duplicate_vertices.h rename to src/libigl/igl/remove_duplicate_vertices.h diff --git a/src/igl/remove_duplicates.cpp b/src/libigl/igl/remove_duplicates.cpp similarity index 100% rename from src/igl/remove_duplicates.cpp rename to src/libigl/igl/remove_duplicates.cpp diff --git a/src/igl/remove_duplicates.h b/src/libigl/igl/remove_duplicates.h similarity index 100% rename from src/igl/remove_duplicates.h rename to src/libigl/igl/remove_duplicates.h diff --git a/src/igl/remove_unreferenced.cpp b/src/libigl/igl/remove_unreferenced.cpp similarity index 100% rename from src/igl/remove_unreferenced.cpp rename to src/libigl/igl/remove_unreferenced.cpp diff --git a/src/igl/remove_unreferenced.h b/src/libigl/igl/remove_unreferenced.h similarity index 100% rename from src/igl/remove_unreferenced.h rename to src/libigl/igl/remove_unreferenced.h diff --git a/src/igl/reorder.cpp b/src/libigl/igl/reorder.cpp similarity index 100% rename from src/igl/reorder.cpp rename to src/libigl/igl/reorder.cpp diff --git a/src/igl/reorder.h b/src/libigl/igl/reorder.h similarity index 100% rename from src/igl/reorder.h rename to src/libigl/igl/reorder.h diff --git a/src/igl/repdiag.cpp b/src/libigl/igl/repdiag.cpp similarity index 100% rename from src/igl/repdiag.cpp rename to src/libigl/igl/repdiag.cpp diff --git a/src/igl/repdiag.h b/src/libigl/igl/repdiag.h similarity index 100% rename from src/igl/repdiag.h rename to src/libigl/igl/repdiag.h diff --git a/src/igl/repmat.cpp b/src/libigl/igl/repmat.cpp similarity index 100% rename from src/igl/repmat.cpp rename to src/libigl/igl/repmat.cpp diff --git a/src/igl/repmat.h b/src/libigl/igl/repmat.h similarity index 100% rename from src/igl/repmat.h rename to src/libigl/igl/repmat.h diff --git a/src/igl/resolve_duplicated_faces.cpp b/src/libigl/igl/resolve_duplicated_faces.cpp similarity index 100% rename from src/igl/resolve_duplicated_faces.cpp rename to src/libigl/igl/resolve_duplicated_faces.cpp diff --git a/src/igl/resolve_duplicated_faces.h b/src/libigl/igl/resolve_duplicated_faces.h similarity index 100% rename from src/igl/resolve_duplicated_faces.h rename to src/libigl/igl/resolve_duplicated_faces.h diff --git a/src/igl/rgb_to_hsv.cpp b/src/libigl/igl/rgb_to_hsv.cpp similarity index 100% rename from src/igl/rgb_to_hsv.cpp rename to src/libigl/igl/rgb_to_hsv.cpp diff --git a/src/igl/rgb_to_hsv.h b/src/libigl/igl/rgb_to_hsv.h similarity index 100% rename from src/igl/rgb_to_hsv.h rename to src/libigl/igl/rgb_to_hsv.h diff --git a/src/igl/rotate_by_quat.cpp b/src/libigl/igl/rotate_by_quat.cpp similarity index 100% rename from src/igl/rotate_by_quat.cpp rename to src/libigl/igl/rotate_by_quat.cpp diff --git a/src/igl/rotate_by_quat.h b/src/libigl/igl/rotate_by_quat.h similarity index 100% rename from src/igl/rotate_by_quat.h rename to src/libigl/igl/rotate_by_quat.h diff --git a/src/igl/rotate_vectors.cpp b/src/libigl/igl/rotate_vectors.cpp similarity index 100% rename from src/igl/rotate_vectors.cpp rename to src/libigl/igl/rotate_vectors.cpp diff --git a/src/igl/rotate_vectors.h b/src/libigl/igl/rotate_vectors.h similarity index 100% rename from src/igl/rotate_vectors.h rename to src/libigl/igl/rotate_vectors.h diff --git a/src/igl/rotation_matrix_from_directions.cpp b/src/libigl/igl/rotation_matrix_from_directions.cpp similarity index 100% rename from src/igl/rotation_matrix_from_directions.cpp rename to src/libigl/igl/rotation_matrix_from_directions.cpp diff --git a/src/igl/rotation_matrix_from_directions.h b/src/libigl/igl/rotation_matrix_from_directions.h similarity index 100% rename from src/igl/rotation_matrix_from_directions.h rename to src/libigl/igl/rotation_matrix_from_directions.h diff --git a/src/igl/round.cpp b/src/libigl/igl/round.cpp similarity index 100% rename from src/igl/round.cpp rename to src/libigl/igl/round.cpp diff --git a/src/igl/round.h b/src/libigl/igl/round.h similarity index 100% rename from src/igl/round.h rename to src/libigl/igl/round.h diff --git a/src/igl/rows_to_matrix.cpp b/src/libigl/igl/rows_to_matrix.cpp similarity index 100% rename from src/igl/rows_to_matrix.cpp rename to src/libigl/igl/rows_to_matrix.cpp diff --git a/src/igl/rows_to_matrix.h b/src/libigl/igl/rows_to_matrix.h similarity index 100% rename from src/igl/rows_to_matrix.h rename to src/libigl/igl/rows_to_matrix.h diff --git a/src/igl/sample_edges.cpp b/src/libigl/igl/sample_edges.cpp similarity index 100% rename from src/igl/sample_edges.cpp rename to src/libigl/igl/sample_edges.cpp diff --git a/src/igl/sample_edges.h b/src/libigl/igl/sample_edges.h similarity index 100% rename from src/igl/sample_edges.h rename to src/libigl/igl/sample_edges.h diff --git a/src/igl/seam_edges.cpp b/src/libigl/igl/seam_edges.cpp similarity index 100% rename from src/igl/seam_edges.cpp rename to src/libigl/igl/seam_edges.cpp diff --git a/src/igl/seam_edges.h b/src/libigl/igl/seam_edges.h similarity index 100% rename from src/igl/seam_edges.h rename to src/libigl/igl/seam_edges.h diff --git a/src/igl/segment_segment_intersect.cpp b/src/libigl/igl/segment_segment_intersect.cpp similarity index 100% rename from src/igl/segment_segment_intersect.cpp rename to src/libigl/igl/segment_segment_intersect.cpp diff --git a/src/igl/segment_segment_intersect.h b/src/libigl/igl/segment_segment_intersect.h similarity index 100% rename from src/igl/segment_segment_intersect.h rename to src/libigl/igl/segment_segment_intersect.h diff --git a/src/igl/serialize.h b/src/libigl/igl/serialize.h similarity index 100% rename from src/igl/serialize.h rename to src/libigl/igl/serialize.h diff --git a/src/igl/setdiff.cpp b/src/libigl/igl/setdiff.cpp similarity index 100% rename from src/igl/setdiff.cpp rename to src/libigl/igl/setdiff.cpp diff --git a/src/igl/setdiff.h b/src/libigl/igl/setdiff.h similarity index 100% rename from src/igl/setdiff.h rename to src/libigl/igl/setdiff.h diff --git a/src/igl/setunion.cpp b/src/libigl/igl/setunion.cpp similarity index 100% rename from src/igl/setunion.cpp rename to src/libigl/igl/setunion.cpp diff --git a/src/igl/setunion.h b/src/libigl/igl/setunion.h similarity index 100% rename from src/igl/setunion.h rename to src/libigl/igl/setunion.h diff --git a/src/igl/setxor.cpp b/src/libigl/igl/setxor.cpp similarity index 100% rename from src/igl/setxor.cpp rename to src/libigl/igl/setxor.cpp diff --git a/src/igl/setxor.h b/src/libigl/igl/setxor.h similarity index 100% rename from src/igl/setxor.h rename to src/libigl/igl/setxor.h diff --git a/src/igl/shape_diameter_function.cpp b/src/libigl/igl/shape_diameter_function.cpp similarity index 100% rename from src/igl/shape_diameter_function.cpp rename to src/libigl/igl/shape_diameter_function.cpp diff --git a/src/igl/shape_diameter_function.h b/src/libigl/igl/shape_diameter_function.h similarity index 100% rename from src/igl/shape_diameter_function.h rename to src/libigl/igl/shape_diameter_function.h diff --git a/src/igl/shapeup.cpp b/src/libigl/igl/shapeup.cpp similarity index 100% rename from src/igl/shapeup.cpp rename to src/libigl/igl/shapeup.cpp diff --git a/src/igl/shapeup.h b/src/libigl/igl/shapeup.h similarity index 100% rename from src/igl/shapeup.h rename to src/libigl/igl/shapeup.h diff --git a/src/igl/shortest_edge_and_midpoint.cpp b/src/libigl/igl/shortest_edge_and_midpoint.cpp similarity index 100% rename from src/igl/shortest_edge_and_midpoint.cpp rename to src/libigl/igl/shortest_edge_and_midpoint.cpp diff --git a/src/igl/shortest_edge_and_midpoint.h b/src/libigl/igl/shortest_edge_and_midpoint.h similarity index 100% rename from src/igl/shortest_edge_and_midpoint.h rename to src/libigl/igl/shortest_edge_and_midpoint.h diff --git a/src/igl/signed_angle.cpp b/src/libigl/igl/signed_angle.cpp similarity index 100% rename from src/igl/signed_angle.cpp rename to src/libigl/igl/signed_angle.cpp diff --git a/src/igl/signed_angle.h b/src/libigl/igl/signed_angle.h similarity index 100% rename from src/igl/signed_angle.h rename to src/libigl/igl/signed_angle.h diff --git a/src/igl/signed_distance.cpp b/src/libigl/igl/signed_distance.cpp similarity index 100% rename from src/igl/signed_distance.cpp rename to src/libigl/igl/signed_distance.cpp diff --git a/src/igl/signed_distance.h b/src/libigl/igl/signed_distance.h similarity index 100% rename from src/igl/signed_distance.h rename to src/libigl/igl/signed_distance.h diff --git a/src/igl/simplify_polyhedron.cpp b/src/libigl/igl/simplify_polyhedron.cpp similarity index 100% rename from src/igl/simplify_polyhedron.cpp rename to src/libigl/igl/simplify_polyhedron.cpp diff --git a/src/igl/simplify_polyhedron.h b/src/libigl/igl/simplify_polyhedron.h similarity index 100% rename from src/igl/simplify_polyhedron.h rename to src/libigl/igl/simplify_polyhedron.h diff --git a/src/igl/slice.cpp b/src/libigl/igl/slice.cpp similarity index 100% rename from src/igl/slice.cpp rename to src/libigl/igl/slice.cpp diff --git a/src/igl/slice.h b/src/libigl/igl/slice.h similarity index 100% rename from src/igl/slice.h rename to src/libigl/igl/slice.h diff --git a/src/igl/slice_cached.cpp b/src/libigl/igl/slice_cached.cpp similarity index 100% rename from src/igl/slice_cached.cpp rename to src/libigl/igl/slice_cached.cpp diff --git a/src/igl/slice_cached.h b/src/libigl/igl/slice_cached.h similarity index 100% rename from src/igl/slice_cached.h rename to src/libigl/igl/slice_cached.h diff --git a/src/igl/slice_into.cpp b/src/libigl/igl/slice_into.cpp similarity index 100% rename from src/igl/slice_into.cpp rename to src/libigl/igl/slice_into.cpp diff --git a/src/igl/slice_into.h b/src/libigl/igl/slice_into.h similarity index 100% rename from src/igl/slice_into.h rename to src/libigl/igl/slice_into.h diff --git a/src/igl/slice_mask.cpp b/src/libigl/igl/slice_mask.cpp similarity index 100% rename from src/igl/slice_mask.cpp rename to src/libigl/igl/slice_mask.cpp diff --git a/src/igl/slice_mask.h b/src/libigl/igl/slice_mask.h similarity index 100% rename from src/igl/slice_mask.h rename to src/libigl/igl/slice_mask.h diff --git a/src/igl/slice_tets.cpp b/src/libigl/igl/slice_tets.cpp similarity index 100% rename from src/igl/slice_tets.cpp rename to src/libigl/igl/slice_tets.cpp diff --git a/src/igl/slice_tets.h b/src/libigl/igl/slice_tets.h similarity index 100% rename from src/igl/slice_tets.h rename to src/libigl/igl/slice_tets.h diff --git a/src/igl/slim.cpp b/src/libigl/igl/slim.cpp similarity index 100% rename from src/igl/slim.cpp rename to src/libigl/igl/slim.cpp diff --git a/src/igl/slim.h b/src/libigl/igl/slim.h similarity index 100% rename from src/igl/slim.h rename to src/libigl/igl/slim.h diff --git a/src/igl/snap_points.cpp b/src/libigl/igl/snap_points.cpp similarity index 100% rename from src/igl/snap_points.cpp rename to src/libigl/igl/snap_points.cpp diff --git a/src/igl/snap_points.h b/src/libigl/igl/snap_points.h similarity index 100% rename from src/igl/snap_points.h rename to src/libigl/igl/snap_points.h diff --git a/src/igl/snap_to_canonical_view_quat.cpp b/src/libigl/igl/snap_to_canonical_view_quat.cpp similarity index 100% rename from src/igl/snap_to_canonical_view_quat.cpp rename to src/libigl/igl/snap_to_canonical_view_quat.cpp diff --git a/src/igl/snap_to_canonical_view_quat.h b/src/libigl/igl/snap_to_canonical_view_quat.h similarity index 100% rename from src/igl/snap_to_canonical_view_quat.h rename to src/libigl/igl/snap_to_canonical_view_quat.h diff --git a/src/igl/snap_to_fixed_up.cpp b/src/libigl/igl/snap_to_fixed_up.cpp similarity index 100% rename from src/igl/snap_to_fixed_up.cpp rename to src/libigl/igl/snap_to_fixed_up.cpp diff --git a/src/igl/snap_to_fixed_up.h b/src/libigl/igl/snap_to_fixed_up.h similarity index 100% rename from src/igl/snap_to_fixed_up.h rename to src/libigl/igl/snap_to_fixed_up.h diff --git a/src/igl/solid_angle.cpp b/src/libigl/igl/solid_angle.cpp similarity index 100% rename from src/igl/solid_angle.cpp rename to src/libigl/igl/solid_angle.cpp diff --git a/src/igl/solid_angle.h b/src/libigl/igl/solid_angle.h similarity index 100% rename from src/igl/solid_angle.h rename to src/libigl/igl/solid_angle.h diff --git a/src/igl/sort.cpp b/src/libigl/igl/sort.cpp similarity index 100% rename from src/igl/sort.cpp rename to src/libigl/igl/sort.cpp diff --git a/src/igl/sort.h b/src/libigl/igl/sort.h similarity index 100% rename from src/igl/sort.h rename to src/libigl/igl/sort.h diff --git a/src/igl/sort_angles.cpp b/src/libigl/igl/sort_angles.cpp similarity index 100% rename from src/igl/sort_angles.cpp rename to src/libigl/igl/sort_angles.cpp diff --git a/src/igl/sort_angles.h b/src/libigl/igl/sort_angles.h similarity index 100% rename from src/igl/sort_angles.h rename to src/libigl/igl/sort_angles.h diff --git a/src/igl/sort_triangles.cpp b/src/libigl/igl/sort_triangles.cpp similarity index 100% rename from src/igl/sort_triangles.cpp rename to src/libigl/igl/sort_triangles.cpp diff --git a/src/igl/sort_triangles.h b/src/libigl/igl/sort_triangles.h similarity index 100% rename from src/igl/sort_triangles.h rename to src/libigl/igl/sort_triangles.h diff --git a/src/igl/sort_vectors_ccw.cpp b/src/libigl/igl/sort_vectors_ccw.cpp similarity index 100% rename from src/igl/sort_vectors_ccw.cpp rename to src/libigl/igl/sort_vectors_ccw.cpp diff --git a/src/igl/sort_vectors_ccw.h b/src/libigl/igl/sort_vectors_ccw.h similarity index 100% rename from src/igl/sort_vectors_ccw.h rename to src/libigl/igl/sort_vectors_ccw.h diff --git a/src/igl/sortrows.cpp b/src/libigl/igl/sortrows.cpp similarity index 100% rename from src/igl/sortrows.cpp rename to src/libigl/igl/sortrows.cpp diff --git a/src/igl/sortrows.h b/src/libigl/igl/sortrows.h similarity index 100% rename from src/igl/sortrows.h rename to src/libigl/igl/sortrows.h diff --git a/src/igl/sparse.cpp b/src/libigl/igl/sparse.cpp similarity index 100% rename from src/igl/sparse.cpp rename to src/libigl/igl/sparse.cpp diff --git a/src/igl/sparse.h b/src/libigl/igl/sparse.h similarity index 100% rename from src/igl/sparse.h rename to src/libigl/igl/sparse.h diff --git a/src/igl/sparse_cached.cpp b/src/libigl/igl/sparse_cached.cpp similarity index 100% rename from src/igl/sparse_cached.cpp rename to src/libigl/igl/sparse_cached.cpp diff --git a/src/igl/sparse_cached.h b/src/libigl/igl/sparse_cached.h similarity index 100% rename from src/igl/sparse_cached.h rename to src/libigl/igl/sparse_cached.h diff --git a/src/igl/speye.cpp b/src/libigl/igl/speye.cpp similarity index 100% rename from src/igl/speye.cpp rename to src/libigl/igl/speye.cpp diff --git a/src/igl/speye.h b/src/libigl/igl/speye.h similarity index 100% rename from src/igl/speye.h rename to src/libigl/igl/speye.h diff --git a/src/igl/squared_edge_lengths.cpp b/src/libigl/igl/squared_edge_lengths.cpp similarity index 100% rename from src/igl/squared_edge_lengths.cpp rename to src/libigl/igl/squared_edge_lengths.cpp diff --git a/src/igl/squared_edge_lengths.h b/src/libigl/igl/squared_edge_lengths.h similarity index 100% rename from src/igl/squared_edge_lengths.h rename to src/libigl/igl/squared_edge_lengths.h diff --git a/src/igl/stdin_to_temp.cpp b/src/libigl/igl/stdin_to_temp.cpp similarity index 100% rename from src/igl/stdin_to_temp.cpp rename to src/libigl/igl/stdin_to_temp.cpp diff --git a/src/igl/stdin_to_temp.h b/src/libigl/igl/stdin_to_temp.h similarity index 100% rename from src/igl/stdin_to_temp.h rename to src/libigl/igl/stdin_to_temp.h diff --git a/src/igl/straighten_seams.cpp b/src/libigl/igl/straighten_seams.cpp similarity index 100% rename from src/igl/straighten_seams.cpp rename to src/libigl/igl/straighten_seams.cpp diff --git a/src/igl/straighten_seams.h b/src/libigl/igl/straighten_seams.h similarity index 100% rename from src/igl/straighten_seams.h rename to src/libigl/igl/straighten_seams.h diff --git a/src/igl/sum.cpp b/src/libigl/igl/sum.cpp similarity index 100% rename from src/igl/sum.cpp rename to src/libigl/igl/sum.cpp diff --git a/src/igl/sum.h b/src/libigl/igl/sum.h similarity index 100% rename from src/igl/sum.h rename to src/libigl/igl/sum.h diff --git a/src/igl/svd3x3.cpp b/src/libigl/igl/svd3x3.cpp similarity index 100% rename from src/igl/svd3x3.cpp rename to src/libigl/igl/svd3x3.cpp diff --git a/src/igl/svd3x3.h b/src/libigl/igl/svd3x3.h similarity index 100% rename from src/igl/svd3x3.h rename to src/libigl/igl/svd3x3.h diff --git a/src/igl/svd3x3_avx.cpp b/src/libigl/igl/svd3x3_avx.cpp similarity index 100% rename from src/igl/svd3x3_avx.cpp rename to src/libigl/igl/svd3x3_avx.cpp diff --git a/src/igl/svd3x3_avx.h b/src/libigl/igl/svd3x3_avx.h similarity index 100% rename from src/igl/svd3x3_avx.h rename to src/libigl/igl/svd3x3_avx.h diff --git a/src/igl/svd3x3_sse.cpp b/src/libigl/igl/svd3x3_sse.cpp similarity index 100% rename from src/igl/svd3x3_sse.cpp rename to src/libigl/igl/svd3x3_sse.cpp diff --git a/src/igl/svd3x3_sse.h b/src/libigl/igl/svd3x3_sse.h similarity index 100% rename from src/igl/svd3x3_sse.h rename to src/libigl/igl/svd3x3_sse.h diff --git a/src/igl/swept_volume_bounding_box.cpp b/src/libigl/igl/swept_volume_bounding_box.cpp similarity index 100% rename from src/igl/swept_volume_bounding_box.cpp rename to src/libigl/igl/swept_volume_bounding_box.cpp diff --git a/src/igl/swept_volume_bounding_box.h b/src/libigl/igl/swept_volume_bounding_box.h similarity index 100% rename from src/igl/swept_volume_bounding_box.h rename to src/libigl/igl/swept_volume_bounding_box.h diff --git a/src/igl/swept_volume_signed_distance.cpp b/src/libigl/igl/swept_volume_signed_distance.cpp similarity index 100% rename from src/igl/swept_volume_signed_distance.cpp rename to src/libigl/igl/swept_volume_signed_distance.cpp diff --git a/src/igl/swept_volume_signed_distance.h b/src/libigl/igl/swept_volume_signed_distance.h similarity index 100% rename from src/igl/swept_volume_signed_distance.h rename to src/libigl/igl/swept_volume_signed_distance.h diff --git a/src/igl/trackball.cpp b/src/libigl/igl/trackball.cpp similarity index 100% rename from src/igl/trackball.cpp rename to src/libigl/igl/trackball.cpp diff --git a/src/igl/trackball.h b/src/libigl/igl/trackball.h similarity index 100% rename from src/igl/trackball.h rename to src/libigl/igl/trackball.h diff --git a/src/igl/transpose_blocks.cpp b/src/libigl/igl/transpose_blocks.cpp similarity index 100% rename from src/igl/transpose_blocks.cpp rename to src/libigl/igl/transpose_blocks.cpp diff --git a/src/igl/transpose_blocks.h b/src/libigl/igl/transpose_blocks.h similarity index 100% rename from src/igl/transpose_blocks.h rename to src/libigl/igl/transpose_blocks.h diff --git a/src/igl/triangle/cdt.cpp b/src/libigl/igl/triangle/cdt.cpp similarity index 100% rename from src/igl/triangle/cdt.cpp rename to src/libigl/igl/triangle/cdt.cpp diff --git a/src/igl/triangle/cdt.h b/src/libigl/igl/triangle/cdt.h similarity index 100% rename from src/igl/triangle/cdt.h rename to src/libigl/igl/triangle/cdt.h diff --git a/src/igl/triangle/triangulate.cpp b/src/libigl/igl/triangle/triangulate.cpp similarity index 100% rename from src/igl/triangle/triangulate.cpp rename to src/libigl/igl/triangle/triangulate.cpp diff --git a/src/igl/triangle/triangulate.h b/src/libigl/igl/triangle/triangulate.h similarity index 100% rename from src/igl/triangle/triangulate.h rename to src/libigl/igl/triangle/triangulate.h diff --git a/src/igl/triangle_fan.cpp b/src/libigl/igl/triangle_fan.cpp similarity index 100% rename from src/igl/triangle_fan.cpp rename to src/libigl/igl/triangle_fan.cpp diff --git a/src/igl/triangle_fan.h b/src/libigl/igl/triangle_fan.h similarity index 100% rename from src/igl/triangle_fan.h rename to src/libigl/igl/triangle_fan.h diff --git a/src/igl/triangle_triangle_adjacency.cpp b/src/libigl/igl/triangle_triangle_adjacency.cpp similarity index 100% rename from src/igl/triangle_triangle_adjacency.cpp rename to src/libigl/igl/triangle_triangle_adjacency.cpp diff --git a/src/igl/triangle_triangle_adjacency.h b/src/libigl/igl/triangle_triangle_adjacency.h similarity index 100% rename from src/igl/triangle_triangle_adjacency.h rename to src/libigl/igl/triangle_triangle_adjacency.h diff --git a/src/igl/triangles_from_strip.cpp b/src/libigl/igl/triangles_from_strip.cpp similarity index 100% rename from src/igl/triangles_from_strip.cpp rename to src/libigl/igl/triangles_from_strip.cpp diff --git a/src/igl/triangles_from_strip.h b/src/libigl/igl/triangles_from_strip.h similarity index 100% rename from src/igl/triangles_from_strip.h rename to src/libigl/igl/triangles_from_strip.h diff --git a/src/igl/two_axis_valuator_fixed_up.cpp b/src/libigl/igl/two_axis_valuator_fixed_up.cpp similarity index 100% rename from src/igl/two_axis_valuator_fixed_up.cpp rename to src/libigl/igl/two_axis_valuator_fixed_up.cpp diff --git a/src/igl/two_axis_valuator_fixed_up.h b/src/libigl/igl/two_axis_valuator_fixed_up.h similarity index 100% rename from src/igl/two_axis_valuator_fixed_up.h rename to src/libigl/igl/two_axis_valuator_fixed_up.h diff --git a/src/igl/uniformly_sample_two_manifold.cpp b/src/libigl/igl/uniformly_sample_two_manifold.cpp similarity index 100% rename from src/igl/uniformly_sample_two_manifold.cpp rename to src/libigl/igl/uniformly_sample_two_manifold.cpp diff --git a/src/igl/uniformly_sample_two_manifold.h b/src/libigl/igl/uniformly_sample_two_manifold.h similarity index 100% rename from src/igl/uniformly_sample_two_manifold.h rename to src/libigl/igl/uniformly_sample_two_manifold.h diff --git a/src/igl/unique.cpp b/src/libigl/igl/unique.cpp similarity index 100% rename from src/igl/unique.cpp rename to src/libigl/igl/unique.cpp diff --git a/src/igl/unique.h b/src/libigl/igl/unique.h similarity index 100% rename from src/igl/unique.h rename to src/libigl/igl/unique.h diff --git a/src/igl/unique_edge_map.cpp b/src/libigl/igl/unique_edge_map.cpp similarity index 100% rename from src/igl/unique_edge_map.cpp rename to src/libigl/igl/unique_edge_map.cpp diff --git a/src/igl/unique_edge_map.h b/src/libigl/igl/unique_edge_map.h similarity index 100% rename from src/igl/unique_edge_map.h rename to src/libigl/igl/unique_edge_map.h diff --git a/src/igl/unique_rows.cpp b/src/libigl/igl/unique_rows.cpp similarity index 100% rename from src/igl/unique_rows.cpp rename to src/libigl/igl/unique_rows.cpp diff --git a/src/igl/unique_rows.h b/src/libigl/igl/unique_rows.h similarity index 100% rename from src/igl/unique_rows.h rename to src/libigl/igl/unique_rows.h diff --git a/src/igl/unique_simplices.cpp b/src/libigl/igl/unique_simplices.cpp similarity index 100% rename from src/igl/unique_simplices.cpp rename to src/libigl/igl/unique_simplices.cpp diff --git a/src/igl/unique_simplices.h b/src/libigl/igl/unique_simplices.h similarity index 100% rename from src/igl/unique_simplices.h rename to src/libigl/igl/unique_simplices.h diff --git a/src/igl/unproject.cpp b/src/libigl/igl/unproject.cpp similarity index 100% rename from src/igl/unproject.cpp rename to src/libigl/igl/unproject.cpp diff --git a/src/igl/unproject.h b/src/libigl/igl/unproject.h similarity index 100% rename from src/igl/unproject.h rename to src/libigl/igl/unproject.h diff --git a/src/igl/unproject_in_mesh.cpp b/src/libigl/igl/unproject_in_mesh.cpp similarity index 100% rename from src/igl/unproject_in_mesh.cpp rename to src/libigl/igl/unproject_in_mesh.cpp diff --git a/src/igl/unproject_in_mesh.h b/src/libigl/igl/unproject_in_mesh.h similarity index 100% rename from src/igl/unproject_in_mesh.h rename to src/libigl/igl/unproject_in_mesh.h diff --git a/src/igl/unproject_onto_mesh.cpp b/src/libigl/igl/unproject_onto_mesh.cpp similarity index 100% rename from src/igl/unproject_onto_mesh.cpp rename to src/libigl/igl/unproject_onto_mesh.cpp diff --git a/src/igl/unproject_onto_mesh.h b/src/libigl/igl/unproject_onto_mesh.h similarity index 100% rename from src/igl/unproject_onto_mesh.h rename to src/libigl/igl/unproject_onto_mesh.h diff --git a/src/igl/unproject_ray.cpp b/src/libigl/igl/unproject_ray.cpp similarity index 100% rename from src/igl/unproject_ray.cpp rename to src/libigl/igl/unproject_ray.cpp diff --git a/src/igl/unproject_ray.h b/src/libigl/igl/unproject_ray.h similarity index 100% rename from src/igl/unproject_ray.h rename to src/libigl/igl/unproject_ray.h diff --git a/src/igl/unzip_corners.cpp b/src/libigl/igl/unzip_corners.cpp similarity index 100% rename from src/igl/unzip_corners.cpp rename to src/libigl/igl/unzip_corners.cpp diff --git a/src/igl/unzip_corners.h b/src/libigl/igl/unzip_corners.h similarity index 100% rename from src/igl/unzip_corners.h rename to src/libigl/igl/unzip_corners.h diff --git a/src/igl/upsample.cpp b/src/libigl/igl/upsample.cpp similarity index 100% rename from src/igl/upsample.cpp rename to src/libigl/igl/upsample.cpp diff --git a/src/igl/upsample.h b/src/libigl/igl/upsample.h similarity index 100% rename from src/igl/upsample.h rename to src/libigl/igl/upsample.h diff --git a/src/igl/vector_area_matrix.cpp b/src/libigl/igl/vector_area_matrix.cpp similarity index 100% rename from src/igl/vector_area_matrix.cpp rename to src/libigl/igl/vector_area_matrix.cpp diff --git a/src/igl/vector_area_matrix.h b/src/libigl/igl/vector_area_matrix.h similarity index 100% rename from src/igl/vector_area_matrix.h rename to src/libigl/igl/vector_area_matrix.h diff --git a/src/igl/verbose.h b/src/libigl/igl/verbose.h similarity index 100% rename from src/igl/verbose.h rename to src/libigl/igl/verbose.h diff --git a/src/igl/vertex_triangle_adjacency.cpp b/src/libigl/igl/vertex_triangle_adjacency.cpp similarity index 100% rename from src/igl/vertex_triangle_adjacency.cpp rename to src/libigl/igl/vertex_triangle_adjacency.cpp diff --git a/src/igl/vertex_triangle_adjacency.h b/src/libigl/igl/vertex_triangle_adjacency.h similarity index 100% rename from src/igl/vertex_triangle_adjacency.h rename to src/libigl/igl/vertex_triangle_adjacency.h diff --git a/src/igl/volume.cpp b/src/libigl/igl/volume.cpp similarity index 100% rename from src/igl/volume.cpp rename to src/libigl/igl/volume.cpp diff --git a/src/igl/volume.h b/src/libigl/igl/volume.h similarity index 100% rename from src/igl/volume.h rename to src/libigl/igl/volume.h diff --git a/src/igl/voxel_grid.cpp b/src/libigl/igl/voxel_grid.cpp similarity index 100% rename from src/igl/voxel_grid.cpp rename to src/libigl/igl/voxel_grid.cpp diff --git a/src/igl/voxel_grid.h b/src/libigl/igl/voxel_grid.h similarity index 100% rename from src/igl/voxel_grid.h rename to src/libigl/igl/voxel_grid.h diff --git a/src/igl/winding_number.cpp b/src/libigl/igl/winding_number.cpp similarity index 100% rename from src/igl/winding_number.cpp rename to src/libigl/igl/winding_number.cpp diff --git a/src/igl/winding_number.h b/src/libigl/igl/winding_number.h similarity index 100% rename from src/igl/winding_number.h rename to src/libigl/igl/winding_number.h diff --git a/src/igl/writeBF.cpp b/src/libigl/igl/writeBF.cpp similarity index 100% rename from src/igl/writeBF.cpp rename to src/libigl/igl/writeBF.cpp diff --git a/src/igl/writeBF.h b/src/libigl/igl/writeBF.h similarity index 100% rename from src/igl/writeBF.h rename to src/libigl/igl/writeBF.h diff --git a/src/igl/writeDMAT.cpp b/src/libigl/igl/writeDMAT.cpp similarity index 100% rename from src/igl/writeDMAT.cpp rename to src/libigl/igl/writeDMAT.cpp diff --git a/src/igl/writeDMAT.h b/src/libigl/igl/writeDMAT.h similarity index 100% rename from src/igl/writeDMAT.h rename to src/libigl/igl/writeDMAT.h diff --git a/src/igl/writeMESH.cpp b/src/libigl/igl/writeMESH.cpp similarity index 100% rename from src/igl/writeMESH.cpp rename to src/libigl/igl/writeMESH.cpp diff --git a/src/igl/writeMESH.h b/src/libigl/igl/writeMESH.h similarity index 100% rename from src/igl/writeMESH.h rename to src/libigl/igl/writeMESH.h diff --git a/src/igl/writeOBJ.cpp b/src/libigl/igl/writeOBJ.cpp similarity index 100% rename from src/igl/writeOBJ.cpp rename to src/libigl/igl/writeOBJ.cpp diff --git a/src/igl/writeOBJ.h b/src/libigl/igl/writeOBJ.h similarity index 100% rename from src/igl/writeOBJ.h rename to src/libigl/igl/writeOBJ.h diff --git a/src/igl/writeOFF.cpp b/src/libigl/igl/writeOFF.cpp similarity index 100% rename from src/igl/writeOFF.cpp rename to src/libigl/igl/writeOFF.cpp diff --git a/src/igl/writeOFF.h b/src/libigl/igl/writeOFF.h similarity index 100% rename from src/igl/writeOFF.h rename to src/libigl/igl/writeOFF.h diff --git a/src/igl/writePLY.cpp b/src/libigl/igl/writePLY.cpp similarity index 100% rename from src/igl/writePLY.cpp rename to src/libigl/igl/writePLY.cpp diff --git a/src/igl/writePLY.h b/src/libigl/igl/writePLY.h similarity index 100% rename from src/igl/writePLY.h rename to src/libigl/igl/writePLY.h diff --git a/src/igl/writeSTL.cpp b/src/libigl/igl/writeSTL.cpp similarity index 100% rename from src/igl/writeSTL.cpp rename to src/libigl/igl/writeSTL.cpp diff --git a/src/igl/writeSTL.h b/src/libigl/igl/writeSTL.h similarity index 100% rename from src/igl/writeSTL.h rename to src/libigl/igl/writeSTL.h diff --git a/src/igl/writeTGF.cpp b/src/libigl/igl/writeTGF.cpp similarity index 100% rename from src/igl/writeTGF.cpp rename to src/libigl/igl/writeTGF.cpp diff --git a/src/igl/writeTGF.h b/src/libigl/igl/writeTGF.h similarity index 100% rename from src/igl/writeTGF.h rename to src/libigl/igl/writeTGF.h diff --git a/src/igl/writeWRL.cpp b/src/libigl/igl/writeWRL.cpp similarity index 100% rename from src/igl/writeWRL.cpp rename to src/libigl/igl/writeWRL.cpp diff --git a/src/igl/writeWRL.h b/src/libigl/igl/writeWRL.h similarity index 100% rename from src/igl/writeWRL.h rename to src/libigl/igl/writeWRL.h diff --git a/src/igl/write_triangle_mesh.cpp b/src/libigl/igl/write_triangle_mesh.cpp similarity index 100% rename from src/igl/write_triangle_mesh.cpp rename to src/libigl/igl/write_triangle_mesh.cpp diff --git a/src/igl/write_triangle_mesh.h b/src/libigl/igl/write_triangle_mesh.h similarity index 100% rename from src/igl/write_triangle_mesh.h rename to src/libigl/igl/write_triangle_mesh.h diff --git a/src/igl/xml/ReAntTweakBarXMLSerialization.h b/src/libigl/igl/xml/ReAntTweakBarXMLSerialization.h similarity index 100% rename from src/igl/xml/ReAntTweakBarXMLSerialization.h rename to src/libigl/igl/xml/ReAntTweakBarXMLSerialization.h diff --git a/src/igl/xml/XMLSerializable.h b/src/libigl/igl/xml/XMLSerializable.h similarity index 100% rename from src/igl/xml/XMLSerializable.h rename to src/libigl/igl/xml/XMLSerializable.h diff --git a/src/igl/xml/serialization_test.skip b/src/libigl/igl/xml/serialization_test.skip similarity index 100% rename from src/igl/xml/serialization_test.skip rename to src/libigl/igl/xml/serialization_test.skip diff --git a/src/igl/xml/serialize_xml.cpp b/src/libigl/igl/xml/serialize_xml.cpp similarity index 100% rename from src/igl/xml/serialize_xml.cpp rename to src/libigl/igl/xml/serialize_xml.cpp diff --git a/src/igl/xml/serialize_xml.h b/src/libigl/igl/xml/serialize_xml.h similarity index 100% rename from src/igl/xml/serialize_xml.h rename to src/libigl/igl/xml/serialize_xml.h diff --git a/src/igl/xml/writeDAE.cpp b/src/libigl/igl/xml/writeDAE.cpp similarity index 100% rename from src/igl/xml/writeDAE.cpp rename to src/libigl/igl/xml/writeDAE.cpp diff --git a/src/igl/xml/writeDAE.h b/src/libigl/igl/xml/writeDAE.h similarity index 100% rename from src/igl/xml/writeDAE.h rename to src/libigl/igl/xml/writeDAE.h diff --git a/src/igl/xml/write_triangle_mesh.cpp b/src/libigl/igl/xml/write_triangle_mesh.cpp similarity index 100% rename from src/igl/xml/write_triangle_mesh.cpp rename to src/libigl/igl/xml/write_triangle_mesh.cpp diff --git a/src/igl/xml/write_triangle_mesh.h b/src/libigl/igl/xml/write_triangle_mesh.h similarity index 100% rename from src/igl/xml/write_triangle_mesh.h rename to src/libigl/igl/xml/write_triangle_mesh.h diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 38e6636043..dc52257aa2 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -189,6 +189,7 @@ target_include_directories(libslic3r PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${LIBNE target_link_libraries(libslic3r libnest2d admesh + libigl miniz boost_libs clipper From 8ffd79cdd84c1df8f0d3d0b3adc9b7e3ec65152a Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 19 Jun 2019 16:23:53 +0200 Subject: [PATCH 18/22] Fix for debug build on Visual Studio --- src/libnest2d/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libnest2d/CMakeLists.txt b/src/libnest2d/CMakeLists.txt index d50c78b171..587b814b24 100644 --- a/src/libnest2d/CMakeLists.txt +++ b/src/libnest2d/CMakeLists.txt @@ -74,7 +74,10 @@ if(TBB_FOUND) target_compile_definitions(libnest2d INTERFACE -DTBB_USE_CAPTURED_EXCEPTION=0) find_package(Threads REQUIRED) - target_link_libraries(libnest2d INTERFACE ${TBB_LIBRARIES} ${CMAKE_DL_LIBS} + target_link_libraries(libnest2d INTERFACE + tbb # VS debug mode needs linking this way: + # ${TBB_LIBRARIES} + ${CMAKE_DL_LIBS} Threads::Threads ) else() From 7f8bb94a55fab885b32f17bd469d929f5df34908 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 19 Jun 2019 16:28:56 +0200 Subject: [PATCH 19/22] Fixed wxEVT_CHAR handling for DoubleSlider --- src/slic3r/GUI/wxExtensions.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index fc34497606..7b7178a824 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -1587,6 +1587,7 @@ DoubleSlider::DoubleSlider( wxWindow *parent, // slider events Bind(wxEVT_PAINT, &DoubleSlider::OnPaint, this); + Bind(wxEVT_CHAR, &DoubleSlider::OnChar, this); Bind(wxEVT_LEFT_DOWN, &DoubleSlider::OnLeftDown, this); Bind(wxEVT_MOTION, &DoubleSlider::OnMotion, this); Bind(wxEVT_LEFT_UP, &DoubleSlider::OnLeftUp, this); @@ -2387,6 +2388,8 @@ void DoubleSlider::OnKeyDown(wxKeyEvent &event) else if (key == WXK_UP || key == WXK_DOWN) move_current_thumb(key == WXK_UP); } + + event.Skip(); // !Needed to have EVT_CHAR generated as well } void DoubleSlider::OnKeyUp(wxKeyEvent &event) From bb58d0fb6953c8782831f230e50eaf7bb07ae80c Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 20 Jun 2019 14:15:36 +0200 Subject: [PATCH 20/22] Add some missing methods into the igl patch. Also, make the static igl dep build the default. --- deps/CMakeLists.txt | 2 +- deps/igl-fixes.patch | 49 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index c98941b5af..cbf4f3a540 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -35,7 +35,7 @@ set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination direct option(DEP_DEBUG "Build debug variants (only applicable on Windows)" ON) option(DEP_WX_STABLE "Build against wxWidgets stable 3.0 as opposed to default 3.1 (Linux only)" OFF) -option(DEP_BUILD_IGL_STATIC "Build IGL as a static library. Might cause link errors." OFF) +option(DEP_BUILD_IGL_STATIC "Build IGL as a static library. Might cause link errors." ON) message(STATUS "PrusaSlicer deps DESTDIR: ${DESTDIR}") message(STATUS "PrusaSlicer deps debug build: ${DEP_DEBUG}") diff --git a/deps/igl-fixes.patch b/deps/igl-fixes.patch index 2b50e200b9..b0ff9205d0 100644 --- a/deps/igl-fixes.patch +++ b/deps/igl-fixes.patch @@ -66,22 +66,63 @@ index 4b11007a..47e6c395 100644 endif() list(APPEND files_to_install ${public_sources}) diff --git a/include/igl/AABB.cpp b/include/igl/AABB.cpp -index 09537335..31594314 100644 +index 09537335..92e90cb7 100644 --- a/include/igl/AABB.cpp +++ b/include/igl/AABB.cpp -@@ -1072,4 +1072,5 @@ template void igl::AABB, 3>::init, 3>::init, 2>::init >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&); template double igl::AABB, 3>::squared_distance >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix const&, double, int&, Eigen::PlainObjectBase >&) const; ++template float igl::AABB const, 0, Eigen::Stride<0, 0> >, 3>::squared_distance const, 0, Eigen::Stride<0, 0> > >(Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::Matrix const&, int&, Eigen::PlainObjectBase >&) const; template bool igl::AABB, 3>::intersect_ray >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix const&, Eigen::Matrix const&, igl::Hit&) const; +template bool igl::AABB, 3>::intersect_ray >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix const&, Eigen::Matrix const&, std::vector&) const; ++ ++template void igl::AABB const, 0, Eigen::Stride<0, 0> >, 3>::init const, 0, Eigen::Stride<0, 0> > >(Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&); ++ ++template bool igl::AABB const, 0, Eigen::Stride<0, 0> >, 3>::intersect_ray const, 0, Eigen::Stride<0, 0> > >(Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::Matrix const&, Eigen::Matrix const&, std::vector >&) const; + #endif +diff --git a/include/igl/barycenter.cpp b/include/igl/barycenter.cpp +index 065f82aa..ec2d96cd 100644 +--- a/include/igl/barycenter.cpp ++++ b/include/igl/barycenter.cpp +@@ -54,4 +54,6 @@ template void igl::barycenter, Eigen::M + template void igl::barycenter, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); + template void igl::barycenter, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); + template void igl::barycenter, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); ++ ++template void igl::barycenter const, 0, Eigen::Stride<0, 0> >, Eigen::Map const, 0, Eigen::Stride<0, 0> >, Eigen::Matrix >(Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::PlainObjectBase >&); + #endif +diff --git a/include/igl/point_simplex_squared_distance.cpp b/include/igl/point_simplex_squared_distance.cpp +index 2b98bd28..c66d9ae1 100644 +--- a/include/igl/point_simplex_squared_distance.cpp ++++ b/include/igl/point_simplex_squared_distance.cpp +@@ -178,4 +178,6 @@ template void igl::point_simplex_squared_distance<3, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, double, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix::Index, double&, Eigen::MatrixBase >&, Eigen::PlainObjectBase >&); + template void igl::point_simplex_squared_distance<2, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, double, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix::Index, double&, Eigen::MatrixBase >&, Eigen::PlainObjectBase >&); + template void igl::point_simplex_squared_distance<2, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, double, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix::Index, double&, Eigen::MatrixBase >&, Eigen::PlainObjectBase >&); ++ ++template void igl::point_simplex_squared_distance<3, Eigen::Matrix, Eigen::Map const, 0, Eigen::Stride<0, 0> >, Eigen::Map const, 0, Eigen::Stride<0, 0> >, float, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::Map const, 0, Eigen::Stride<0, 0> >::Index, float&, Eigen::MatrixBase >&); + #endif +diff --git a/include/igl/ray_box_intersect.cpp b/include/igl/ray_box_intersect.cpp +index 4a88b89e..b547f8f8 100644 +--- a/include/igl/ray_box_intersect.cpp ++++ b/include/igl/ray_box_intersect.cpp +@@ -147,4 +147,6 @@ IGL_INLINE bool igl::ray_box_intersect( + #ifdef IGL_STATIC_LIBRARY + // Explicit template instantiation + template bool igl::ray_box_intersect, Eigen::Matrix, double>(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::AlignedBox const&, double const&, double const&, double&, double&); ++ ++template bool igl::ray_box_intersect, Eigen::Matrix, float>(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::AlignedBox const&, float const&, float const&, float&, float&); #endif diff --git a/include/igl/ray_mesh_intersect.cpp b/include/igl/ray_mesh_intersect.cpp -index 9a70a22b..dda1654b 100644 +index 9a70a22b..4233e722 100644 --- a/include/igl/ray_mesh_intersect.cpp +++ b/include/igl/ray_mesh_intersect.cpp -@@ -83,4 +83,5 @@ IGL_INLINE bool igl::ray_mesh_intersect( +@@ -83,4 +83,7 @@ IGL_INLINE bool igl::ray_mesh_intersect( template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, std::vector >&); template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, igl::Hit&); template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Block const, 1, -1, false> >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase const, 1, -1, false> > const&, igl::Hit&); +template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Block const, 1, -1, false> >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase const, 1, -1, false> > const&, std::vector >&); ++ ++template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Map const, 0, Eigen::Stride<0, 0> >, Eigen::Block const, 0, Eigen::Stride<0, 0> > const, 1, -1, true> >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > const, 1, -1, true> > const&, std::vector >&); #endif From b8f9d2e2d8b312f3dbf55aed05291a70d4e92d30 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 20 Jun 2019 12:54:43 +0200 Subject: [PATCH 21/22] Update default igl dependency to header-only. --- deps/CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index cbf4f3a540..5bc33c896d 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -35,7 +35,11 @@ set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination direct option(DEP_DEBUG "Build debug variants (only applicable on Windows)" ON) option(DEP_WX_STABLE "Build against wxWidgets stable 3.0 as opposed to default 3.1 (Linux only)" OFF) -option(DEP_BUILD_IGL_STATIC "Build IGL as a static library. Might cause link errors." ON) + +# IGL static library in release mode produces 50MB binary. On the build server, it should be +# disabled and used in header-only mode. On developer machines, it can be enabled to speed +# up conpilation and suppress warnings coming from IGL. +option(DEP_BUILD_IGL_STATIC "Build IGL as a static library. Might cause link errors and increase binary size." OFF) message(STATUS "PrusaSlicer deps DESTDIR: ${DESTDIR}") message(STATUS "PrusaSlicer deps debug build: ${DEP_DEBUG}") From fe395546f0cec0aa6fd6c5333f71c73b812ea56c Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 20 Jun 2019 12:56:23 +0200 Subject: [PATCH 22/22] Added "info" tooltip for a LockButton on Manipulation panel (#2539) --- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 6 ++++-- src/slic3r/GUI/wxExtensions.cpp | 3 +++ src/slic3r/GUI/wxExtensions.hpp | 7 ++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 310000ecc3..372cd79efb 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -499,11 +499,13 @@ void ObjectManipulation::update_if_dirty() if (selection.requires_uniform_scale()) { m_lock_bnt->SetLock(true); - m_lock_bnt->Disable(); + m_lock_bnt->SetToolTip(_(L("You cann't use non-uniform scaling mode for multiple objects/parts selection"))); + m_lock_bnt->disable(); } else { m_lock_bnt->SetLock(m_uniform_scale); - m_lock_bnt->Enable(); + m_lock_bnt->SetToolTip(wxEmptyString); + m_lock_bnt->enable(); } { diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 7b7178a824..406daccf55 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -2472,6 +2472,9 @@ LockButton::LockButton( wxWindow *parent, void LockButton::OnButton(wxCommandEvent& event) { + if (m_disabled) + return; + m_is_pushed = !m_is_pushed; enter_button(true); diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index c496c28a0c..dd035690ad 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -838,9 +838,13 @@ public: void OnEnterBtn(wxMouseEvent& event) { enter_button(true); event.Skip(); } void OnLeaveBtn(wxMouseEvent& event) { enter_button(false); event.Skip(); } - bool IsLocked() const { return m_is_pushed; } + bool IsLocked() const { return m_is_pushed; } void SetLock(bool lock); + // create its own Enable/Disable functions to not really disabled button because of tooltip enabling + void enable() { m_disabled = false; } + void disable() { m_disabled = true; } + void msw_rescale(); protected: @@ -848,6 +852,7 @@ protected: private: bool m_is_pushed = false; + bool m_disabled = false; ScalableBitmap m_bmp_lock_on; ScalableBitmap m_bmp_lock_off;