mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-15 23:05:57 +08:00
Merge branch 'master' of ssh://github.com/Ultimaker/Cura
This commit is contained in:
commit
95efcfd035
@ -46,19 +46,10 @@ class SimulationPass(RenderPass):
|
|||||||
self._layer_view = layerview
|
self._layer_view = layerview
|
||||||
self._compatibility_mode = layerview.getCompatibilityMode()
|
self._compatibility_mode = layerview.getCompatibilityMode()
|
||||||
|
|
||||||
def render(self):
|
def _updateLayerShaderValues(self):
|
||||||
if not self._layer_shader:
|
|
||||||
if self._compatibility_mode:
|
|
||||||
shader_filename = "layers.shader"
|
|
||||||
shadow_shader_filename = "layers_shadow.shader"
|
|
||||||
else:
|
|
||||||
shader_filename = "layers3d.shader"
|
|
||||||
shadow_shader_filename = "layers3d_shadow.shader"
|
|
||||||
self._layer_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), shader_filename))
|
|
||||||
self._layer_shadow_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), shadow_shader_filename))
|
|
||||||
self._current_shader = self._layer_shader
|
|
||||||
# Use extruder 0 if the extruder manager reports extruder index -1 (for single extrusion printers)
|
# Use extruder 0 if the extruder manager reports extruder index -1 (for single extrusion printers)
|
||||||
self._layer_shader.setUniformValue("u_active_extruder", float(max(0, self._extruder_manager.activeExtruderIndex)))
|
self._layer_shader.setUniformValue("u_active_extruder",
|
||||||
|
float(max(0, self._extruder_manager.activeExtruderIndex)))
|
||||||
if self._layer_view:
|
if self._layer_view:
|
||||||
self._layer_shader.setUniformValue("u_max_feedrate", self._layer_view.getMaxFeedrate())
|
self._layer_shader.setUniformValue("u_max_feedrate", self._layer_view.getMaxFeedrate())
|
||||||
self._layer_shader.setUniformValue("u_min_feedrate", self._layer_view.getMinFeedrate())
|
self._layer_shader.setUniformValue("u_min_feedrate", self._layer_view.getMinFeedrate())
|
||||||
@ -71,7 +62,7 @@ class SimulationPass(RenderPass):
|
|||||||
self._layer_shader.setUniformValue("u_show_skin", self._layer_view.getShowSkin())
|
self._layer_shader.setUniformValue("u_show_skin", self._layer_view.getShowSkin())
|
||||||
self._layer_shader.setUniformValue("u_show_infill", self._layer_view.getShowInfill())
|
self._layer_shader.setUniformValue("u_show_infill", self._layer_view.getShowInfill())
|
||||||
else:
|
else:
|
||||||
#defaults
|
# defaults
|
||||||
self._layer_shader.setUniformValue("u_max_feedrate", 1)
|
self._layer_shader.setUniformValue("u_max_feedrate", 1)
|
||||||
self._layer_shader.setUniformValue("u_min_feedrate", 0)
|
self._layer_shader.setUniformValue("u_min_feedrate", 0)
|
||||||
self._layer_shader.setUniformValue("u_max_thickness", 1)
|
self._layer_shader.setUniformValue("u_max_thickness", 1)
|
||||||
@ -83,6 +74,20 @@ class SimulationPass(RenderPass):
|
|||||||
self._layer_shader.setUniformValue("u_show_skin", 1)
|
self._layer_shader.setUniformValue("u_show_skin", 1)
|
||||||
self._layer_shader.setUniformValue("u_show_infill", 1)
|
self._layer_shader.setUniformValue("u_show_infill", 1)
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
if not self._layer_shader:
|
||||||
|
if self._compatibility_mode:
|
||||||
|
shader_filename = "layers.shader"
|
||||||
|
shadow_shader_filename = "layers_shadow.shader"
|
||||||
|
else:
|
||||||
|
shader_filename = "layers3d.shader"
|
||||||
|
shadow_shader_filename = "layers3d_shadow.shader"
|
||||||
|
self._layer_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), shader_filename))
|
||||||
|
self._layer_shadow_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), shadow_shader_filename))
|
||||||
|
self._current_shader = self._layer_shader
|
||||||
|
|
||||||
|
self._updateLayerShaderValues()
|
||||||
|
|
||||||
if not self._tool_handle_shader:
|
if not self._tool_handle_shader:
|
||||||
self._tool_handle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "toolhandle.shader"))
|
self._tool_handle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "toolhandle.shader"))
|
||||||
|
|
||||||
@ -93,12 +98,10 @@ class SimulationPass(RenderPass):
|
|||||||
self.bind()
|
self.bind()
|
||||||
|
|
||||||
tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay, backface_cull = True)
|
tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay, backface_cull = True)
|
||||||
active_build_plate = Application.getInstance().getMultiBuildPlateModel().activeBuildPlate
|
|
||||||
head_position = None # Indicates the current position of the print head
|
head_position = None # Indicates the current position of the print head
|
||||||
nozzle_node = None
|
nozzle_node = None
|
||||||
|
|
||||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||||
|
|
||||||
if isinstance(node, ToolHandle):
|
if isinstance(node, ToolHandle):
|
||||||
tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh())
|
tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh())
|
||||||
|
|
||||||
@ -113,29 +116,21 @@ class SimulationPass(RenderPass):
|
|||||||
|
|
||||||
# Render all layers below a certain number as line mesh instead of vertices.
|
# Render all layers below a certain number as line mesh instead of vertices.
|
||||||
if self._layer_view._current_layer_num > -1 and ((not self._layer_view._only_show_top_layers) or (not self._layer_view.getCompatibilityMode())):
|
if self._layer_view._current_layer_num > -1 and ((not self._layer_view._only_show_top_layers) or (not self._layer_view.getCompatibilityMode())):
|
||||||
start = 0
|
start = self._layer_view.start_elements_index
|
||||||
end = 0
|
end = self._layer_view.end_elements_index
|
||||||
element_counts = layer_data.getElementCounts()
|
index = self._layer_view._current_path_num
|
||||||
for layer in sorted(element_counts.keys()):
|
offset = 0
|
||||||
# In the current layer, we show just the indicated paths
|
for polygon in layer_data.getLayer(self._layer_view._current_layer_num).polygons:
|
||||||
if layer == self._layer_view._current_layer_num:
|
# The size indicates all values in the two-dimension array, and the second dimension is
|
||||||
# We look for the position of the head, searching the point of the current path
|
# always size 3 because we have 3D points.
|
||||||
index = self._layer_view._current_path_num
|
if index >= polygon.data.size // 3 - offset:
|
||||||
offset = 0
|
index -= polygon.data.size // 3 - offset
|
||||||
for polygon in layer_data.getLayer(layer).polygons:
|
offset = 1 # This is to avoid the first point when there is more than one polygon, since has the same value as the last point in the previous polygon
|
||||||
# The size indicates all values in the two-dimension array, and the second dimension is
|
continue
|
||||||
# always size 3 because we have 3D points.
|
# The head position is calculated and translated
|
||||||
if index >= polygon.data.size // 3 - offset:
|
head_position = Vector(polygon.data[index + offset][0], polygon.data[index + offset][1],
|
||||||
index -= polygon.data.size // 3 - offset
|
polygon.data[index + offset][2]) + node.getWorldPosition()
|
||||||
offset = 1 # This is to avoid the first point when there is more than one polygon, since has the same value as the last point in the previous polygon
|
break
|
||||||
continue
|
|
||||||
# The head position is calculated and translated
|
|
||||||
head_position = Vector(polygon.data[index+offset][0], polygon.data[index+offset][1], polygon.data[index+offset][2]) + node.getWorldPosition()
|
|
||||||
break
|
|
||||||
break
|
|
||||||
if self._layer_view._minimum_layer_num > layer:
|
|
||||||
start += element_counts[layer]
|
|
||||||
end += element_counts[layer]
|
|
||||||
|
|
||||||
# Calculate the range of paths in the last layer
|
# Calculate the range of paths in the last layer
|
||||||
current_layer_start = end
|
current_layer_start = end
|
||||||
|
@ -71,6 +71,8 @@ class SimulationView(CuraView):
|
|||||||
self._max_paths = 0
|
self._max_paths = 0
|
||||||
self._current_path_num = 0
|
self._current_path_num = 0
|
||||||
self._minimum_path_num = 0
|
self._minimum_path_num = 0
|
||||||
|
self.start_elements_index = 0
|
||||||
|
self.end_elements_index = 0
|
||||||
self.currentLayerNumChanged.connect(self._onCurrentLayerNumChanged)
|
self.currentLayerNumChanged.connect(self._onCurrentLayerNumChanged)
|
||||||
|
|
||||||
self._busy = False
|
self._busy = False
|
||||||
@ -243,6 +245,7 @@ class SimulationView(CuraView):
|
|||||||
self._minimum_layer_num = self._current_layer_num
|
self._minimum_layer_num = self._current_layer_num
|
||||||
|
|
||||||
self._startUpdateTopLayers()
|
self._startUpdateTopLayers()
|
||||||
|
self.recalculateStartEndElements()
|
||||||
|
|
||||||
self.currentLayerNumChanged.emit()
|
self.currentLayerNumChanged.emit()
|
||||||
|
|
||||||
@ -257,7 +260,7 @@ class SimulationView(CuraView):
|
|||||||
self._current_layer_num = self._minimum_layer_num
|
self._current_layer_num = self._minimum_layer_num
|
||||||
|
|
||||||
self._startUpdateTopLayers()
|
self._startUpdateTopLayers()
|
||||||
|
self.recalculateStartEndElements()
|
||||||
self.currentLayerNumChanged.emit()
|
self.currentLayerNumChanged.emit()
|
||||||
|
|
||||||
def setPath(self, value: int) -> None:
|
def setPath(self, value: int) -> None:
|
||||||
@ -271,7 +274,7 @@ class SimulationView(CuraView):
|
|||||||
self._minimum_path_num = self._current_path_num
|
self._minimum_path_num = self._current_path_num
|
||||||
|
|
||||||
self._startUpdateTopLayers()
|
self._startUpdateTopLayers()
|
||||||
|
self.recalculateStartEndElements()
|
||||||
self.currentPathNumChanged.emit()
|
self.currentPathNumChanged.emit()
|
||||||
|
|
||||||
def setMinimumPath(self, value: int) -> None:
|
def setMinimumPath(self, value: int) -> None:
|
||||||
@ -359,6 +362,24 @@ class SimulationView(CuraView):
|
|||||||
return 0.0 # If it's still max-float, there are no measurements. Use 0 then.
|
return 0.0 # If it's still max-float, there are no measurements. Use 0 then.
|
||||||
return self._min_thickness
|
return self._min_thickness
|
||||||
|
|
||||||
|
def recalculateStartEndElements(self):
|
||||||
|
self.start_elements_index = 0
|
||||||
|
self.end_elements_index = 0
|
||||||
|
scene = self.getController().getScene()
|
||||||
|
for node in DepthFirstIterator(scene.getRoot()): # type: ignore
|
||||||
|
layer_data = node.callDecoration("getLayerData")
|
||||||
|
if not layer_data:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Found a the layer data!
|
||||||
|
element_counts = layer_data.getElementCounts()
|
||||||
|
for layer in sorted(element_counts.keys()):
|
||||||
|
if layer == self._current_layer_num:
|
||||||
|
break
|
||||||
|
if self._minimum_layer_num > layer:
|
||||||
|
self.start_elements_index += element_counts[layer]
|
||||||
|
self.end_elements_index += element_counts[layer]
|
||||||
|
|
||||||
def getMaxThickness(self) -> float:
|
def getMaxThickness(self) -> float:
|
||||||
return self._max_thickness
|
return self._max_thickness
|
||||||
|
|
||||||
@ -578,7 +599,7 @@ class SimulationView(CuraView):
|
|||||||
def _startUpdateTopLayers(self) -> None:
|
def _startUpdateTopLayers(self) -> None:
|
||||||
if not self._compatibility_mode:
|
if not self._compatibility_mode:
|
||||||
return
|
return
|
||||||
|
self.recalculateStartEndElements()
|
||||||
if self._top_layers_job:
|
if self._top_layers_job:
|
||||||
self._top_layers_job.finished.disconnect(self._updateCurrentLayerMesh)
|
self._top_layers_job.finished.disconnect(self._updateCurrentLayerMesh)
|
||||||
self._top_layers_job.cancel()
|
self._top_layers_job.cancel()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user