diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 10760b9039..eb492d8de2 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -18,6 +18,9 @@ Item { width: childrenRect.width; height: childrenRect.height; + property var all_categories_except_support: [ "machine_settings", "resolution", "shell", "infill", "material", "speed", + "travel", "cooling", "platform_adhesion", "dual", "meshfix", "blackmagic", "experimental"] + Column { id: items @@ -39,6 +42,13 @@ Item { verticalAlignment: Text.AlignVCenter } + UM.SettingPropertyProvider + { + id: meshTypePropertyProvider + containerStackId: Cura.MachineManager.activeMachineId + watchedProperties: [ "enabled" ] + } + ComboBox { id: meshTypeSelection @@ -49,36 +59,55 @@ Item { model: ListModel { id: meshTypeModel - Component.onCompleted: + Component.onCompleted: meshTypeSelection.populateModel() + } + + function populateModel() + { + meshTypeModel.append({ + type: "", + text: catalog.i18nc("@label", "Normal model") + }); + meshTypePropertyProvider.key = "support_mesh"; + if(meshTypePropertyProvider.properties.enabled == "True") { - meshTypeModel.append({ - type: "", - text: catalog.i18nc("@label", "Normal model") - }); meshTypeModel.append({ type: "support_mesh", text: catalog.i18nc("@label", "Print as support") }); + } + meshTypePropertyProvider.key = "anti_overhang_mesh"; + if(meshTypePropertyProvider.properties.enabled == "True") + { meshTypeModel.append({ type: "anti_overhang_mesh", text: catalog.i18nc("@label", "Don't support overlap with other models") }); + } + meshTypePropertyProvider.key = "cutting_mesh"; + if(meshTypePropertyProvider.properties.enabled == "True") + { meshTypeModel.append({ type: "cutting_mesh", text: catalog.i18nc("@label", "Modify settings for overlap with other models") }); + } + meshTypePropertyProvider.key = "infill_mesh"; + if(meshTypePropertyProvider.properties.enabled == "True") + { meshTypeModel.append({ type: "infill_mesh", text: catalog.i18nc("@label", "Modify settings for infill of other models") }); - - meshTypeSelection.updateCurrentIndex(); } + + meshTypeSelection.updateCurrentIndex(); } function updateCurrentIndex() { var mesh_type = UM.ActiveTool.properties.getValue("MeshType"); + meshTypeSelection.currentIndex = -1; for(var index=0; index < meshTypeSelection.model.count; index++) { if(meshTypeSelection.model.get(index).type == mesh_type) @@ -91,6 +120,16 @@ Item { } } + Connections + { + target: Cura.MachineManager + onGlobalContainerChanged: + { + meshTypeSelection.model.clear(); + meshTypeSelection.populateModel(); + } + } + Connections { target: UM.Selection @@ -106,7 +145,7 @@ Item { id: currentSettings property int maximumHeight: 200 * screenScaleFactor height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight) - visible: ["support_mesh", "anti_overhang_mesh"].indexOf(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type) == -1 + visible: meshTypeSelection.model.get(meshTypeSelection.currentIndex).type != "anti_overhang_mesh" ScrollView { @@ -124,7 +163,15 @@ Item { id: addedSettingsModel; containerId: Cura.MachineManager.activeDefinitionId expanded: [ "*" ] - exclude: [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ] + exclude: { + var excluded_settings = [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]; + + if(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh") + { + excluded_settings = excluded_settings.concat(base.all_categories_except_support); + } + return excluded_settings; + } visibilityHandler: Cura.PerObjectSettingVisibilityHandler { @@ -306,7 +353,18 @@ Item { } } - onClicked: settingPickDialog.visible = true; + onClicked: + { + settingPickDialog.visible = true; + if (meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh") + { + settingPickDialog.additional_excluded_settings = base.all_categories_except_support; + } + else + { + settingPickDialog.additional_excluded_settings = [] + } + } } } @@ -315,9 +373,10 @@ Item { id: settingPickDialog title: catalog.i18nc("@title:window", "Select Settings to Customize for this model") - width: screenScaleFactor * 360; + width: screenScaleFactor * 360 property string labelFilter: "" + property var additional_excluded_settings onVisibilityChanged: { @@ -396,7 +455,12 @@ Item { } visibilityHandler: UM.SettingPreferenceVisibilityHandler {} expanded: [ "*" ] - exclude: [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ] + exclude: + { + var excluded_settings = [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]; + excluded_settings = excluded_settings.concat(settingPickDialog.additional_excluded_settings); + return excluded_settings; + } } delegate:Loader { diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index e156e655ce..50ff2864b7 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -28,6 +28,7 @@ class SolidView(View): self._enabled_shader = None self._disabled_shader = None self._non_printing_shader = None + self._support_mesh_shader = None self._extruders_model = ExtrudersModel() self._theme = None @@ -54,6 +55,11 @@ class SolidView(View): self._non_printing_shader.setUniformValue("u_diffuseColor", Color(*self._theme.getColor("model_non_printing").getRgb())) self._non_printing_shader.setUniformValue("u_opacity", 0.6) + if not self._support_mesh_shader: + self._support_mesh_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "striped.shader")) + self._support_mesh_shader.setUniformValue("u_vertical_stripes", True) + self._support_mesh_shader.setUniformValue("u_width", 5.0) + global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: support_extruder_nr = global_container_stack.getProperty("support_extruder_nr", "value") @@ -117,6 +123,16 @@ class SolidView(View): renderer.queueNode(node, shader = self._non_printing_shader, transparent = True) elif getattr(node, "_outside_buildarea", False): renderer.queueNode(node, shader = self._disabled_shader) + elif per_mesh_stack and per_mesh_stack.getProperty("support_mesh", "value"): + # Render support meshes with a vertical stripe that is darker + shade_factor = 0.6 + uniforms["diffuse_color_2"] = [ + uniforms["diffuse_color"][0] * shade_factor, + uniforms["diffuse_color"][1] * shade_factor, + uniforms["diffuse_color"][2] * shade_factor, + 1.0 + ] + renderer.queueNode(node, shader = self._support_mesh_shader, uniforms = uniforms) else: renderer.queueNode(node, shader = self._enabled_shader, uniforms = uniforms) if node.callDecoration("isGroup") and Selection.isSelected(node): diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 22b7992d64..87b72928ca 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4233,6 +4233,18 @@ "limit_to_extruder": "support_infill_extruder_nr", "enabled": "support_enable and support_use_towers", "settable_per_mesh": true + }, + "support_mesh_drop_down": + { + "label": "Drop Down Support Mesh", + "description": "Make support everywhere below the support mesh, so that there's no overhang in the support mesh.", + "type": "bool", + "default_value": true, + "enabled": "support_mesh", + "settable_per_mesh": true, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": false } } }, @@ -5261,18 +5273,6 @@ "settable_per_meshgroup": false, "settable_globally": false }, - "support_mesh_drop_down": - { - "label": "Drop Down Support Mesh", - "description": "Make support everywhere below the support mesh, so that there's no overhang in the support mesh.", - "type": "bool", - "default_value": true, - "enabled": "support_mesh", - "settable_per_mesh": true, - "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": false - }, "anti_overhang_mesh": { "label": "Anti Overhang Mesh", diff --git a/resources/shaders/striped.shader b/resources/shaders/striped.shader index ce7d14e39e..7cf5a62c3f 100644 --- a/resources/shaders/striped.shader +++ b/resources/shaders/striped.shader @@ -32,6 +32,7 @@ fragment = uniform highp vec3 u_viewPosition; uniform mediump float u_width; + uniform mediump bool u_vertical_stripes; varying highp vec3 v_position; varying highp vec3 v_vertex; @@ -40,7 +41,9 @@ fragment = void main() { mediump vec4 finalColor = vec4(0.0); - mediump vec4 diffuseColor = (mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2; + mediump vec4 diffuseColor = u_vertical_stripes ? + (((mod(v_vertex.x, u_width) < (u_width / 2.)) ^^ (mod(v_vertex.z, u_width) < (u_width / 2.))) ? u_diffuseColor1 : u_diffuseColor2) : + ((mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2); /* Ambient Component */ finalColor += u_ambientColor; @@ -98,6 +101,7 @@ fragment41core = uniform highp vec3 u_viewPosition; uniform mediump float u_width; + uniform mediump bool u_vertical_stripes; in highp vec3 v_position; in highp vec3 v_vertex; @@ -108,7 +112,9 @@ fragment41core = void main() { mediump vec4 finalColor = vec4(0.0); - mediump vec4 diffuseColor = (mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2; + mediump vec4 diffuseColor = u_vertical_stripes ? + (((mod(v_vertex.x, u_width) < (u_width / 2.)) ^^ (mod(v_vertex.z, u_width) < (u_width / 2.))) ? u_diffuseColor1 : u_diffuseColor2) : + ((mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2); /* Ambient Component */ finalColor += u_ambientColor; @@ -138,6 +144,7 @@ u_diffuseColor2 = [0.5, 0.5, 0.5, 1.0] u_specularColor = [0.4, 0.4, 0.4, 1.0] u_shininess = 20.0 u_width = 5.0 +u_vertical_stripes = 0 [bindings] u_modelMatrix = model_matrix @@ -145,7 +152,8 @@ u_viewProjectionMatrix = view_projection_matrix u_normalMatrix = normal_matrix u_viewPosition = view_position u_lightPosition = light_0_position -u_diffuseColor = diffuse_color +u_diffuseColor1 = diffuse_color +u_diffuseColor2 = diffuse_color_2 [attributes] a_vertex = vertex