Merge pull request #3089 from fieldOfView/feature_support_mesh_enhancements

Support Mesh enhancements
This commit is contained in:
jack 2018-01-10 11:58:22 +01:00 committed by GitHub
commit 4751de00ae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 115 additions and 27 deletions

View file

@ -18,6 +18,9 @@ Item {
width: childrenRect.width; width: childrenRect.width;
height: childrenRect.height; 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 Column
{ {
id: items id: items
@ -39,6 +42,13 @@ Item {
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
} }
UM.SettingPropertyProvider
{
id: meshTypePropertyProvider
containerStackId: Cura.MachineManager.activeMachineId
watchedProperties: [ "enabled" ]
}
ComboBox ComboBox
{ {
id: meshTypeSelection id: meshTypeSelection
@ -49,36 +59,55 @@ Item {
model: ListModel model: ListModel
{ {
id: meshTypeModel id: meshTypeModel
Component.onCompleted: Component.onCompleted: meshTypeSelection.populateModel()
}
function populateModel()
{ {
meshTypeModel.append({ meshTypeModel.append({
type: "", type: "",
text: catalog.i18nc("@label", "Normal model") text: catalog.i18nc("@label", "Normal model")
}); });
meshTypePropertyProvider.key = "support_mesh";
if(meshTypePropertyProvider.properties.enabled == "True")
{
meshTypeModel.append({ meshTypeModel.append({
type: "support_mesh", type: "support_mesh",
text: catalog.i18nc("@label", "Print as support") text: catalog.i18nc("@label", "Print as support")
}); });
}
meshTypePropertyProvider.key = "anti_overhang_mesh";
if(meshTypePropertyProvider.properties.enabled == "True")
{
meshTypeModel.append({ meshTypeModel.append({
type: "anti_overhang_mesh", type: "anti_overhang_mesh",
text: catalog.i18nc("@label", "Don't support overlap with other models") text: catalog.i18nc("@label", "Don't support overlap with other models")
}); });
}
meshTypePropertyProvider.key = "cutting_mesh";
if(meshTypePropertyProvider.properties.enabled == "True")
{
meshTypeModel.append({ meshTypeModel.append({
type: "cutting_mesh", type: "cutting_mesh",
text: catalog.i18nc("@label", "Modify settings for overlap with other models") text: catalog.i18nc("@label", "Modify settings for overlap with other models")
}); });
}
meshTypePropertyProvider.key = "infill_mesh";
if(meshTypePropertyProvider.properties.enabled == "True")
{
meshTypeModel.append({ meshTypeModel.append({
type: "infill_mesh", type: "infill_mesh",
text: catalog.i18nc("@label", "Modify settings for infill of other models") text: catalog.i18nc("@label", "Modify settings for infill of other models")
}); });
}
meshTypeSelection.updateCurrentIndex(); meshTypeSelection.updateCurrentIndex();
} }
}
function updateCurrentIndex() function updateCurrentIndex()
{ {
var mesh_type = UM.ActiveTool.properties.getValue("MeshType"); var mesh_type = UM.ActiveTool.properties.getValue("MeshType");
meshTypeSelection.currentIndex = -1;
for(var index=0; index < meshTypeSelection.model.count; index++) for(var index=0; index < meshTypeSelection.model.count; index++)
{ {
if(meshTypeSelection.model.get(index).type == mesh_type) if(meshTypeSelection.model.get(index).type == mesh_type)
@ -91,6 +120,16 @@ Item {
} }
} }
Connections
{
target: Cura.MachineManager
onGlobalContainerChanged:
{
meshTypeSelection.model.clear();
meshTypeSelection.populateModel();
}
}
Connections Connections
{ {
target: UM.Selection target: UM.Selection
@ -106,7 +145,7 @@ Item {
id: currentSettings id: currentSettings
property int maximumHeight: 200 * screenScaleFactor property int maximumHeight: 200 * screenScaleFactor
height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight) 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 ScrollView
{ {
@ -124,7 +163,15 @@ Item {
id: addedSettingsModel; id: addedSettingsModel;
containerId: Cura.MachineManager.activeDefinitionId containerId: Cura.MachineManager.activeDefinitionId
expanded: [ "*" ] 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 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 id: settingPickDialog
title: catalog.i18nc("@title:window", "Select Settings to Customize for this model") title: catalog.i18nc("@title:window", "Select Settings to Customize for this model")
width: screenScaleFactor * 360; width: screenScaleFactor * 360
property string labelFilter: "" property string labelFilter: ""
property var additional_excluded_settings
onVisibilityChanged: onVisibilityChanged:
{ {
@ -396,7 +455,12 @@ Item {
} }
visibilityHandler: UM.SettingPreferenceVisibilityHandler {} visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
expanded: [ "*" ] 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 delegate:Loader
{ {

View file

@ -28,6 +28,7 @@ class SolidView(View):
self._enabled_shader = None self._enabled_shader = None
self._disabled_shader = None self._disabled_shader = None
self._non_printing_shader = None self._non_printing_shader = None
self._support_mesh_shader = None
self._extruders_model = ExtrudersModel() self._extruders_model = ExtrudersModel()
self._theme = None 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_diffuseColor", Color(*self._theme.getColor("model_non_printing").getRgb()))
self._non_printing_shader.setUniformValue("u_opacity", 0.6) 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() global_container_stack = Application.getInstance().getGlobalContainerStack()
if global_container_stack: if global_container_stack:
support_extruder_nr = global_container_stack.getProperty("support_extruder_nr", "value") 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) renderer.queueNode(node, shader = self._non_printing_shader, transparent = True)
elif getattr(node, "_outside_buildarea", False): elif getattr(node, "_outside_buildarea", False):
renderer.queueNode(node, shader = self._disabled_shader) 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: else:
renderer.queueNode(node, shader = self._enabled_shader, uniforms = uniforms) renderer.queueNode(node, shader = self._enabled_shader, uniforms = uniforms)
if node.callDecoration("isGroup") and Selection.isSelected(node): if node.callDecoration("isGroup") and Selection.isSelected(node):

View file

@ -4233,6 +4233,18 @@
"limit_to_extruder": "support_infill_extruder_nr", "limit_to_extruder": "support_infill_extruder_nr",
"enabled": "support_enable and support_use_towers", "enabled": "support_enable and support_use_towers",
"settable_per_mesh": true "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_per_meshgroup": false,
"settable_globally": 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": "anti_overhang_mesh":
{ {
"label": "Anti Overhang Mesh", "label": "Anti Overhang Mesh",

View file

@ -32,6 +32,7 @@ fragment =
uniform highp vec3 u_viewPosition; uniform highp vec3 u_viewPosition;
uniform mediump float u_width; uniform mediump float u_width;
uniform mediump bool u_vertical_stripes;
varying highp vec3 v_position; varying highp vec3 v_position;
varying highp vec3 v_vertex; varying highp vec3 v_vertex;
@ -40,7 +41,9 @@ fragment =
void main() void main()
{ {
mediump vec4 finalColor = vec4(0.0); 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 */ /* Ambient Component */
finalColor += u_ambientColor; finalColor += u_ambientColor;
@ -98,6 +101,7 @@ fragment41core =
uniform highp vec3 u_viewPosition; uniform highp vec3 u_viewPosition;
uniform mediump float u_width; uniform mediump float u_width;
uniform mediump bool u_vertical_stripes;
in highp vec3 v_position; in highp vec3 v_position;
in highp vec3 v_vertex; in highp vec3 v_vertex;
@ -108,7 +112,9 @@ fragment41core =
void main() void main()
{ {
mediump vec4 finalColor = vec4(0.0); 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 */ /* Ambient Component */
finalColor += u_ambientColor; 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_specularColor = [0.4, 0.4, 0.4, 1.0]
u_shininess = 20.0 u_shininess = 20.0
u_width = 5.0 u_width = 5.0
u_vertical_stripes = 0
[bindings] [bindings]
u_modelMatrix = model_matrix u_modelMatrix = model_matrix
@ -145,7 +152,8 @@ u_viewProjectionMatrix = view_projection_matrix
u_normalMatrix = normal_matrix u_normalMatrix = normal_matrix
u_viewPosition = view_position u_viewPosition = view_position
u_lightPosition = light_0_position u_lightPosition = light_0_position
u_diffuseColor = diffuse_color u_diffuseColor1 = diffuse_color
u_diffuseColor2 = diffuse_color_2
[attributes] [attributes]
a_vertex = vertex a_vertex = vertex