Implement rendering the top 5 layers solid and with infill

Fixes #52
This commit is contained in:
Arjen Hiemstra 2015-06-16 13:19:45 +02:00
parent 06b5e9d0ca
commit 995b76fad9

View file

@ -7,12 +7,13 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from UM.Resources import Resources from UM.Resources import Resources
from UM.Event import Event, KeyEvent from UM.Event import Event, KeyEvent
from UM.Signal import Signal from UM.Signal import Signal
from . import LayerViewProxy
from UM.Scene.Selection import Selection from UM.Scene.Selection import Selection
from UM.Math.Color import Color from UM.Math.Color import Color
from UM.Mesh.MeshData import MeshData
from cura.ConvexHullNode import ConvexHullNode from cura.ConvexHullNode import ConvexHullNode
from . import LayerViewProxy
## View used to display g-code paths. ## View used to display g-code paths.
class LayerView(View): class LayerView(View):
@ -25,6 +26,9 @@ class LayerView(View):
self._controller.getScene().sceneChanged.connect(self._onSceneChanged) self._controller.getScene().sceneChanged.connect(self._onSceneChanged)
self._max_layers = 10 self._max_layers = 10
self._current_layer_num = 10 self._current_layer_num = 10
self._current_layer_mesh = None
self._solid_layers = 5
def getCurrentLayer(self): def getCurrentLayer(self):
return self._current_layer_num return self._current_layer_num
@ -63,19 +67,39 @@ class LayerView(View):
except AttributeError: except AttributeError:
continue continue
start = 0 # Render all layers below a certain number as line mesh instead of vertices.
end = 0 if self._current_layer_num - self._solid_layers > -1:
start = 0
end = 0
element_counts = layer_data.getElementCounts()
for layer, counts in element_counts.items():
if layer + self._solid_layers > self._current_layer_num:
break
end += counts
element_counts = layer_data.getElementCounts() # This uses glDrawRangeElements internally to only draw a certain range of lines.
for layer, counts in element_counts.items(): renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, start = start, end = end)
end += sum(counts)
## Hack to ensure the end is correct. Not quite sure what causes this
end += 2 * len(counts)
if layer >= self._current_layer_num: # We currently recreate the current "solid" layers every time a
break if not self._current_layer_mesh:
self._current_layer_mesh = MeshData()
for i in range(self._solid_layers):
layer = self._current_layer_num - i
if layer < 0:
continue
renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, start = start, end = end) layer_mesh = layer_data.getLayer(layer).createMesh()
if not layer_mesh or layer_mesh.getVertices() is None:
continue
self._current_layer_mesh.addVertices(layer_mesh.getVertices())
# Scale layer color by a brightness factor based on the current layer number
# This will result in a range of 0.5 - 1.0 to multiply colors by.
brightness = (2.0 - (i / self._solid_layers)) / 2.0
self._current_layer_mesh.addColors(layer_mesh.getColors() * brightness)
renderer.queueNode(node, mesh = self._current_layer_mesh, material = self._material)
def setLayer(self, value): def setLayer(self, value):
if self._current_layer_num != value: if self._current_layer_num != value:
@ -84,6 +108,8 @@ class LayerView(View):
self._current_layer_num = 0 self._current_layer_num = 0
if self._current_layer_num > self._max_layers: if self._current_layer_num > self._max_layers:
self._current_layer_num = self._max_layers self._current_layer_num = self._max_layers
self._current_layer_mesh = None
self.currentLayerNumChanged.emit() self.currentLayerNumChanged.emit()
currentLayerNumChanged = Signal() currentLayerNumChanged = Signal()
@ -104,7 +130,7 @@ class LayerView(View):
except AttributeError: except AttributeError:
continue continue
if new_max_layers < len(layer_data.getLayers()): if new_max_layers < len(layer_data.getLayers()):
new_max_layers = len(layer_data.getLayers()) new_max_layers = len(layer_data.getLayers()) - 1
if new_max_layers > 0 and new_max_layers != self._old_max_layers: if new_max_layers > 0 and new_max_layers != self._old_max_layers:
self._max_layers = new_max_layers self._max_layers = new_max_layers