From a55022ae2f22ae347be961033bc0933afd2ad9f9 Mon Sep 17 00:00:00 2001
From: tamasmeszaros <meszaros.q@gmail.com>
Date: Fri, 12 Apr 2019 10:26:33 +0200
Subject: [PATCH 1/6] Fix for issue SPE-901

---
 src/libslic3r/SLA/SLASupportTree.cpp | 30 +++++++++++++---------------
 1 file changed, 14 insertions(+), 16 deletions(-)

diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp
index 34dd80cee..bb0e5e007 100644
--- a/src/libslic3r/SLA/SLASupportTree.cpp
+++ b/src/libslic3r/SLA/SLASupportTree.cpp
@@ -1572,10 +1572,8 @@ public:
             auto hit = bridge_mesh_intersect(headjp, n, r);
 
             if(std::isinf(hit.distance())) ground_head_indices.emplace_back(i);
-            else {
-                if(m_cfg.ground_facing_only) head.invalidate();
-                m_iheads_onmodel.emplace_back(std::make_pair(i, hit));
-            }
+            else if(m_cfg.ground_facing_only)  head.invalidate();
+            else m_iheads_onmodel.emplace_back(std::make_pair(i, hit));
         }
 
         // We want to search for clusters of points that are far enough
@@ -1872,7 +1870,7 @@ public:
         }
     }
 
-    void cascade_pillars() {
+    void interconnect_pillars() {
         // Now comes the algorithm that connects pillars with each other.
         // Ideally every pillar should be connected with at least one of its
         // neighbors if that neighbor is within max_pillar_link_distance
@@ -2121,7 +2119,7 @@ bool SLASupportTree::generate(const std::vector<SupportPoint> &support_points,
 
         std::bind(&Algorithm::routing_to_model, &alg),
 
-        std::bind(&Algorithm::cascade_pillars, &alg),
+        std::bind(&Algorithm::interconnect_pillars, &alg),
 
         std::bind(&Algorithm::routing_headless, &alg),
 
@@ -2150,16 +2148,16 @@ bool SLASupportTree::generate(const std::vector<SupportPoint> &support_points,
     // Let's define a simple automaton that will run our program.
     auto progress = [&ctl, &pc] () {
         static const std::array<std::string, NUM_STEPS> stepstr {
-            L("Starting"),
-            L("Filtering"),
-            L("Generate pinheads"),
-            L("Classification"),
-            L("Routing to ground"),
-            L("Routing supports to model surface"),
-            L("Cascading pillars"),
-            L("Processing small holes"),
-            L("Done"),
-            L("Abort")
+            "Starting",
+            "Filtering",
+            "Generate pinheads",
+            "Classification",
+            "Routing to ground",
+            "Routing supports to model surface",
+            "Interconnecting pillars",
+            "Processing small holes",
+            "Done",
+            "Abort"
         };
 
         static const std::array<unsigned, NUM_STEPS> stepstate {

From 566bb7041a9444a9b14616d172dee061a7db616f Mon Sep 17 00:00:00 2001
From: bubnikv <bubnikv@gmail.com>
Date: Fri, 12 Apr 2019 11:01:53 +0200
Subject: [PATCH 2/6] Optimization of the OpenGL shaders for clipping with
 clipping planes.

---
 resources/shaders/gouraud.fs | 15 +++------------
 resources/shaders/gouraud.vs | 16 ++++++++++++----
 2 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/resources/shaders/gouraud.fs b/resources/shaders/gouraud.fs
index b2bc915ab..09003f407 100644
--- a/resources/shaders/gouraud.fs
+++ b/resources/shaders/gouraud.fs
@@ -2,30 +2,21 @@
 
 const vec3 ZERO = vec3(0.0, 0.0, 0.0);
 
+varying vec3 clipping_planes_dots;
+
 // x = tainted, y = specular;
 varying vec2 intensity;
 
 varying vec3 delta_box_min;
 varying vec3 delta_box_max;
 
-varying vec3 world_pos;
-
 uniform vec4 uniform_color;
 
-// x = min z, y = max z;
-uniform vec2 z_range;
-
-// clipping plane (general orientation):
-uniform vec4 clipping_plane;
 
 void main()
 {
-    if ((world_pos.z < z_range.x) || (z_range.y < world_pos.z))
+    if (any(lessThan(clipping_planes_dots, ZERO)))
         discard;
-
-    if (world_pos.x*clipping_plane.x + world_pos.y*clipping_plane.y + world_pos.z*clipping_plane.z + clipping_plane.w < 0.0 )
-        discard;
-
     // if the fragment is outside the print volume -> use darker color
     vec3 color = (any(lessThan(delta_box_min, ZERO)) || any(greaterThan(delta_box_max, ZERO))) ? mix(uniform_color.rgb, ZERO, 0.3333) : uniform_color.rgb;
     gl_FragColor = vec4(vec3(intensity.y, intensity.y, intensity.y) + color * intensity.x, uniform_color.a);
diff --git a/resources/shaders/gouraud.vs b/resources/shaders/gouraud.vs
index a226cf312..cc54c1c44 100644
--- a/resources/shaders/gouraud.vs
+++ b/resources/shaders/gouraud.vs
@@ -28,13 +28,18 @@ struct PrintBoxDetection
 
 uniform PrintBoxDetection print_box;
 
+// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane.
+uniform vec2 z_range;
+// Clipping plane - general orientation. Used by the SLA gizmo.
+uniform vec4 clipping_plane;
+
 // x = tainted, y = specular;
 varying vec2 intensity;
 
 varying vec3 delta_box_min;
 varying vec3 delta_box_max;
 
-varying vec3 world_pos;
+varying vec3 clipping_planes_dots;
 
 void main()
 {
@@ -66,8 +71,11 @@ void main()
     {
         delta_box_min = ZERO;
         delta_box_max = ZERO;
-    }    
+    }
 
     gl_Position = ftransform();
-    world_pos = vec3(print_box.volume_world_matrix * gl_Vertex);
-} 
+    // Point in homogenous coordinates.
+    vec4 world_pos = print_box.volume_world_matrix * gl_Vertex;
+    // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded.
+    clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z);
+}

From 2fe63e0b045361584e9320039088c7634303017a Mon Sep 17 00:00:00 2001
From: Vojtech Kral <vojtech@kral.hk>
Date: Fri, 12 Apr 2019 10:57:30 +0200
Subject: [PATCH 3/6] Revert high DPI bitmaps in Preset and PresetBundle for
 now due to bugs in wxBitmapComboBox et al.

---
 src/slic3r/GUI/Preset.cpp       |  8 ++++++--
 src/slic3r/GUI/PresetBundle.cpp | 15 +++++++++++----
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp
index 97c42d7fb..bed960a62 100644
--- a/src/slic3r/GUI/Preset.cpp
+++ b/src/slic3r/GUI/Preset.cpp
@@ -801,12 +801,16 @@ bool PresetCollection::delete_current_preset()
 
 void PresetCollection::load_bitmap_default(wxWindow *window, const std::string &file_name)
 {
-    *m_bitmap_main_frame = create_scaled_bitmap(window, file_name);
+    // XXX: See note in PresetBundle::load_compatible_bitmaps()
+    (void)window;
+    *m_bitmap_main_frame = create_scaled_bitmap(nullptr, file_name);
 }
 
 void PresetCollection::load_bitmap_add(wxWindow *window, const std::string &file_name)
 {
-    *m_bitmap_add = create_scaled_bitmap(window, file_name);
+    // XXX: See note in PresetBundle::load_compatible_bitmaps()
+    (void)window;
+    *m_bitmap_add = create_scaled_bitmap(nullptr, file_name);
 }
 
 const Preset* PresetCollection::get_selected_preset_parent() const
diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp
index ad7829b2c..a8a63056c 100644
--- a/src/slic3r/GUI/PresetBundle.cpp
+++ b/src/slic3r/GUI/PresetBundle.cpp
@@ -398,10 +398,17 @@ void PresetBundle::export_selections(AppConfig &config)
 
 void PresetBundle::load_compatible_bitmaps(wxWindow *window)
 {
-    *m_bitmapCompatible     = create_scaled_bitmap(window, "flag_green");
-    *m_bitmapIncompatible   = create_scaled_bitmap(window, "flag_red");
-    *m_bitmapLock           = create_scaled_bitmap(window, "lock_closed");
-    *m_bitmapLockOpen       = create_scaled_bitmap(window, "sys_unlock.png");
+    // We don't actually pass the window pointer here and instead generate
+    // a low DPI bitmap, because the wxBitmapComboBox and wxDataViewControl don't support
+    // high DPI bitmaps very well, they compute their dimensions wrong.
+    // TODO: Update this when fixed in wxWidgets
+    // See also PresetCollection::load_bitmap_default() and PresetCollection::load_bitmap_add()
+
+    (void)window;
+    *m_bitmapCompatible     = create_scaled_bitmap(nullptr, "flag_green");
+    *m_bitmapIncompatible   = create_scaled_bitmap(nullptr, "flag_red");
+    *m_bitmapLock           = create_scaled_bitmap(nullptr, "lock_closed");
+    *m_bitmapLockOpen       = create_scaled_bitmap(nullptr, "sys_unlock.png");
 
     prints       .set_bitmap_compatible(m_bitmapCompatible);
     filaments    .set_bitmap_compatible(m_bitmapCompatible);

From 5522ed95744ef82ff925421fe195880b35eab73a Mon Sep 17 00:00:00 2001
From: Vojtech Kral <vojtech@kral.hk>
Date: Fri, 12 Apr 2019 11:28:07 +0200
Subject: [PATCH 4/6] Also revert high DPI bitmaps in ObjectList for now

---
 src/slic3r/GUI/GUI_ObjectList.cpp | 41 +++++++++++++++++--------------
 src/slic3r/GUI/PresetBundle.cpp   |  2 +-
 2 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp
index dc3909351..87a00ea0f 100644
--- a/src/slic3r/GUI/GUI_ObjectList.cpp
+++ b/src/slic3r/GUI/GUI_ObjectList.cpp
@@ -61,19 +61,22 @@ ObjectList::ObjectList(wxWindow* parent) :
 {
     // Fill CATEGORY_ICON
     {
+        // Note: `this` isn't passed to create_scaled_bitmap() here because of bugs in the widget,
+        // see note in PresetBundle::load_compatible_bitmaps()
+
         // ptFFF
-		CATEGORY_ICON[L("Layers and Perimeters")]	= create_scaled_bitmap(this, "layers");
-		CATEGORY_ICON[L("Infill")]					= create_scaled_bitmap(this, "infill");
-		CATEGORY_ICON[L("Support material")]		= create_scaled_bitmap(this, "support");
-		CATEGORY_ICON[L("Speed")]					= create_scaled_bitmap(this, "time");
-		CATEGORY_ICON[L("Extruders")]				= create_scaled_bitmap(this, "funnel");
-		CATEGORY_ICON[L("Extrusion Width")]			= create_scaled_bitmap(this, "funnel");
-// 		CATEGORY_ICON[L("Skirt and brim")]			= create_scaled_bitmap(this, "skirt+brim"); 
-// 		CATEGORY_ICON[L("Speed > Acceleration")]	= create_scaled_bitmap(this, "time");
-		CATEGORY_ICON[L("Advanced")]				= create_scaled_bitmap(this, "wrench");
-		// ptSLA
-		CATEGORY_ICON[L("Supports")]				= create_scaled_bitmap(this, "sla_supports");
-		CATEGORY_ICON[L("Pad")]				        = create_scaled_bitmap(this, "brick.png");
+        CATEGORY_ICON[L("Layers and Perimeters")]    = create_scaled_bitmap(nullptr, "layers");
+        CATEGORY_ICON[L("Infill")]                   = create_scaled_bitmap(nullptr, "infill");
+        CATEGORY_ICON[L("Support material")]         = create_scaled_bitmap(nullptr, "support");
+        CATEGORY_ICON[L("Speed")]                    = create_scaled_bitmap(nullptr, "time");
+        CATEGORY_ICON[L("Extruders")]                = create_scaled_bitmap(nullptr, "funnel");
+        CATEGORY_ICON[L("Extrusion Width")]          = create_scaled_bitmap(nullptr, "funnel");
+//         CATEGORY_ICON[L("Skirt and brim")]          = create_scaled_bitmap(nullptr, "skirt+brim"); 
+//         CATEGORY_ICON[L("Speed > Acceleration")]    = create_scaled_bitmap(nullptr, "time");
+        CATEGORY_ICON[L("Advanced")]                 = create_scaled_bitmap(nullptr, "wrench");
+        // ptSLA
+        CATEGORY_ICON[L("Supports")]                 = create_scaled_bitmap(nullptr, "sla_supports");
+        CATEGORY_ICON[L("Pad")]                      = create_scaled_bitmap(nullptr, "brick.png");
     }
 
     // create control
@@ -392,10 +395,10 @@ void ObjectList::update_name_in_model(const wxDataViewItem& item) const
 
 void ObjectList::init_icons()
 {
-    m_bmp_modifiermesh     = create_scaled_bitmap(this, "lambda.png");
-    m_bmp_solidmesh        = create_scaled_bitmap(this, "object.png");
-    m_bmp_support_enforcer = create_scaled_bitmap(this, "support_enforcer_.png");
-    m_bmp_support_blocker  = create_scaled_bitmap(this, "support_blocker_.png");
+    m_bmp_modifiermesh     = create_scaled_bitmap(nullptr, "lambda.png");
+    m_bmp_solidmesh        = create_scaled_bitmap(nullptr, "object.png");
+    m_bmp_support_enforcer = create_scaled_bitmap(nullptr, "support_enforcer_.png");
+    m_bmp_support_blocker  = create_scaled_bitmap(nullptr, "support_blocker_.png");
 
 
     m_bmp_vector.reserve(4); // bitmaps for different types of parts 
@@ -406,13 +409,13 @@ void ObjectList::init_icons()
     m_objects_model->SetVolumeBitmaps(m_bmp_vector);
 
     // init icon for manifold warning
-    m_bmp_manifold_warning  = create_scaled_bitmap(this, "exclamation_mark_.png");
+    m_bmp_manifold_warning  = create_scaled_bitmap(nullptr, "exclamation_mark_.png");
 
     // init bitmap for "Split to sub-objects" context menu
-    m_bmp_split             = create_scaled_bitmap(this, "split_parts");
+    m_bmp_split             = create_scaled_bitmap(nullptr, "split_parts");
 
     // init bitmap for "Add Settings" context menu
-    m_bmp_cog               = create_scaled_bitmap(this, "cog");
+    m_bmp_cog               = create_scaled_bitmap(nullptr, "cog");
 }
 
 
diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp
index a8a63056c..6e93d0670 100644
--- a/src/slic3r/GUI/PresetBundle.cpp
+++ b/src/slic3r/GUI/PresetBundle.cpp
@@ -399,7 +399,7 @@ void PresetBundle::export_selections(AppConfig &config)
 void PresetBundle::load_compatible_bitmaps(wxWindow *window)
 {
     // We don't actually pass the window pointer here and instead generate
-    // a low DPI bitmap, because the wxBitmapComboBox and wxDataViewControl don't support
+    // a low DPI bitmap, because the wxBitmapComboBox and wxDataViewCtrl don't support
     // high DPI bitmaps very well, they compute their dimensions wrong.
     // TODO: Update this when fixed in wxWidgets
     // See also PresetCollection::load_bitmap_default() and PresetCollection::load_bitmap_add()

From 9f53123204bfef4f444eafcedff3634d621dbeb7 Mon Sep 17 00:00:00 2001
From: bubnikv <bubnikv@gmail.com>
Date: Fri, 12 Apr 2019 11:43:29 +0200
Subject: [PATCH 5/6] Windows specific: Added "--sw-renderer" to load the MESA
 SW rasterizer.

---
 src/libslic3r/PrintConfig.cpp |  7 +++++++
 src/slic3r_app_msvc.cpp       | 12 ++++++++++--
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp
index 66641a7f5..8c031bcaa 100644
--- a/src/libslic3r/PrintConfig.cpp
+++ b/src/libslic3r/PrintConfig.cpp
@@ -3117,6 +3117,13 @@ CLIMiscConfigDef::CLIMiscConfigDef()
     def->label = L("Logging level");
     def->tooltip = L("Messages with severity lower or eqal to the loglevel will be printed out. 0:trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal");
     def->min = 0;
+
+#ifdef _MSC_VER
+    def = this->add("sw_renderer", coBool);
+    def->label = L("Render with a software renderer");
+    def->tooltip = L("Render with a software renderer. The bundled MESA software renderer is loaded instead of the default OpenGL driver.");
+    def->min = 0;
+#endif /* _MSC_VER */
 }
 
 const CLIActionsConfigDef    cli_actions_config_def;
diff --git a/src/slic3r_app_msvc.cpp b/src/slic3r_app_msvc.cpp
index 380d30cf4..e2c6013a2 100644
--- a/src/slic3r_app_msvc.cpp
+++ b/src/slic3r_app_msvc.cpp
@@ -207,12 +207,20 @@ int wmain(int argc, wchar_t **argv)
 	std::vector<wchar_t*> argv_extended;
 	argv_extended.emplace_back(argv[0]);
 	// Here one may push some additional parameters based on the wrapper type.
-	for (int i = 1; i < argc; ++ i)
+	bool force_mesa = false;
+	for (int i = 1; i < argc; ++ i) {
+		if (wcscmp(argv[i], L"--sw-renderer") == 0)
+			force_mesa = true;
+		else if (wcscmp(argv[i], L"--no-sw-renderer") == 0)
+			force_mesa = false;
 		argv_extended.emplace_back(argv[i]);
+	}
 	argv_extended.emplace_back(nullptr);
 
 	OpenGLVersionCheck opengl_version_check;
 	bool load_mesa = 
+		// Forced from the command line.
+		force_mesa ||
 		// Running over a rempote desktop, and the RemoteFX is not enabled, therefore Windows will only provide SW OpenGL 1.1 context.
 		// In that case, use Mesa.
 		::GetSystemMetrics(SM_REMOTESESSION) ||
@@ -267,5 +275,5 @@ int wmain(int argc, wchar_t **argv)
 		return -1;
 	}
 	// argc minus the trailing nullptr of the argv
-	return slic3r_main(argv_extended.size() - 1, argv_extended.data());
+	return slic3r_main((int)argv_extended.size() - 1, argv_extended.data());
 }

From 349e30a39c351fdedd4ec8e216442ccf71c906f1 Mon Sep 17 00:00:00 2001
From: bubnikv <bubnikv@gmail.com>
Date: Fri, 12 Apr 2019 12:16:44 +0200
Subject: [PATCH 6/6] WIP: Restoring of the command line only builds (no GUI
 support).

---
 CMakeLists.txt          |  4 ++++
 src/slic3r.cpp          | 24 ++++++++++++++++--------
 src/slic3r_app_msvc.cpp | 27 ++++++++++++++++++++++-----
 3 files changed, 42 insertions(+), 13 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1e6cf45bd..8adea28c3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -49,6 +49,10 @@ foreach (_cache_var ${_cache_vars})
     endif ()
 endforeach()
 
+if (SLIC3R_GUI)
+    add_definitions(-DSLIC3R_GUI)
+endif ()
+
 if (MSVC)
     if (SLIC3R_MSVC_COMPILE_PARALLEL)
 	   add_compile_options(/MP)
diff --git a/src/slic3r.cpp b/src/slic3r.cpp
index 780efea7b..f6a2282bb 100644
--- a/src/slic3r.cpp
+++ b/src/slic3r.cpp
@@ -6,10 +6,12 @@
     #define NOMINMAX
     #include <Windows.h>
     #include <wchar.h>
-    // Let the NVIDIA and AMD know we want to use their graphics card
-    // on a dual graphics card system.
-    __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
-    __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
+    #ifdef SLIC3R_GUI
+        // Let the NVIDIA and AMD know we want to use their graphics card
+        // on a dual graphics card system.
+        __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
+        __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
+    #endif /* SLIC3R_GUI */
 #endif /* WIN32 */
 
 #include <cstdio>
@@ -448,7 +450,7 @@ int CLI::run(int argc, char **argv)
     }
     
 	if (start_gui) {
-#if 1
+#ifdef SLIC3R_GUI
 // #ifdef USE_WX
 		GUI::GUI_App *gui = new GUI::GUI_App();
 //		gui->autosave = m_config.opt_string("autosave");
@@ -477,12 +479,12 @@ int CLI::run(int argc, char **argv)
 				gui->mainframe->load_config(m_extra_config);
 		});
 		return wxEntry(argc, argv);
-#else
+#else /* SLIC3R_GUI */
 		// No GUI support. Just print out a help.
 		this->print_help(false);
 		// If started without a parameter, consider it to be OK, otherwise report an error code (no action etc).
 		return (argc == 0) ? 0 : 1;
-#endif   
+#endif /* SLIC3R_GUI */
     }
     
     return 0;
@@ -563,7 +565,13 @@ bool CLI::setup(int argc, char **argv)
 void CLI::print_help(bool include_print_options, PrinterTechnology printer_technology) const 
 {
     boost::nowide::cout
-		<< "Slic3r Prusa Edition " << SLIC3R_BUILD << std::endl
+		<< "Slic3r Prusa Edition " << SLIC3R_BUILD 
+#ifdef SLIC3R_GUI
+        << " (with GUI support)"
+#else /* SLIC3R_GUI */
+        << " (without GUI support)"
+#endif /* SLIC3R_GUI */
+        << std::endl
         << "https://github.com/prusa3d/Slic3r" << std::endl << std::endl
         << "Usage: slic3r [ ACTIONS ] [ TRANSFORM ] [ OPTIONS ] [ file.stl ... ]" << std::endl
         << std::endl
diff --git a/src/slic3r_app_msvc.cpp b/src/slic3r_app_msvc.cpp
index e2c6013a2..bf72ee136 100644
--- a/src/slic3r_app_msvc.cpp
+++ b/src/slic3r_app_msvc.cpp
@@ -6,14 +6,20 @@
 #include <Windows.h>
 #include <shellapi.h>
 #include <wchar.h>
-// Let the NVIDIA and AMD know we want to use their graphics card
-// on a dual graphics card system.
-__declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
-__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
+
+#ifdef SLIC3R_GUI
+	// Let the NVIDIA and AMD know we want to use their graphics card
+	// on a dual graphics card system.
+	__declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
+	__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
+#endif /* SLIC3R_GUI */
 
 #include <stdlib.h>
 #include <stdio.h>
-#include <GL/GL.h>
+
+#ifdef SLIC3R_GUI
+	#include <GL/GL.h>
+#endif /* SLIC3R_GUI */
 
 #include <string>
 #include <vector>
@@ -23,6 +29,7 @@ __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
 
 #include <stdio.h>
 
+#ifdef SLIC3R_GUI
 class OpenGLVersionCheck
 {
 public:
@@ -188,6 +195,7 @@ protected:
 };
 
 bool OpenGLVersionCheck::message_pump_exit = false;
+#endif /* SLIC3R_GUI */
 
 extern "C" {
 	typedef int (__stdcall *Slic3rMainFunc)(int argc, wchar_t **argv);
@@ -206,17 +214,23 @@ int wmain(int argc, wchar_t **argv)
 
 	std::vector<wchar_t*> argv_extended;
 	argv_extended.emplace_back(argv[0]);
+
+#ifdef SLIC3R_GUI
 	// Here one may push some additional parameters based on the wrapper type.
 	bool force_mesa = false;
+#endif /* SLIC3R_GUI */
 	for (int i = 1; i < argc; ++ i) {
+#ifdef SLIC3R_GUI
 		if (wcscmp(argv[i], L"--sw-renderer") == 0)
 			force_mesa = true;
 		else if (wcscmp(argv[i], L"--no-sw-renderer") == 0)
 			force_mesa = false;
+#endif /* SLIC3R_GUI */
 		argv_extended.emplace_back(argv[i]);
 	}
 	argv_extended.emplace_back(nullptr);
 
+#ifdef SLIC3R_GUI
 	OpenGLVersionCheck opengl_version_check;
 	bool load_mesa = 
 		// Forced from the command line.
@@ -226,6 +240,7 @@ int wmain(int argc, wchar_t **argv)
 		::GetSystemMetrics(SM_REMOTESESSION) ||
 		// Try to load the default OpenGL driver and test its context version.
 		! opengl_version_check.load_opengl_dll() || ! opengl_version_check.is_version_greater_or_equal_to(2, 0);
+#endif /* SLIC3R_GUI */
 
 	wchar_t path_to_exe[MAX_PATH + 1] = { 0 };
 	::GetModuleFileNameW(nullptr, path_to_exe, MAX_PATH);
@@ -236,6 +251,7 @@ int wmain(int argc, wchar_t **argv)
 	_wsplitpath(path_to_exe, drive, dir, fname, ext);
 	_wmakepath(path_to_exe, drive, dir, nullptr, nullptr);
 
+#ifdef SLIC3R_GUI
 // https://wiki.qt.io/Cross_compiling_Mesa_for_Windows
 // http://download.qt.io/development_releases/prebuilt/llvmpipe/windows/
 	if (load_mesa) {
@@ -260,6 +276,7 @@ int wmain(int argc, wchar_t **argv)
 		printf("slic3r.dll was not loaded\n");
 		return -1;
 	}
+#endif /* SLIC3R_GUI */
 
 	// resolve function address here
 	slic3r_main = (Slic3rMainFunc)GetProcAddress(hInstance_Slic3r,