self._zoom = 300
self._scene = objectScene.Scene()
self._gcode = None
+ self._gcodeVBOs = []
self._objectShader = None
self._focusObj = None
self._selectedObj = None
def _updateSliceProgress(self, progressValue, ready):
self.printButton.setDisabled(not ready)
self.printButton.setProgressBar(progressValue)
+ if self._gcode is not None:
+ self._gcode = None
+ for layerVBOlist in self._gcodeVBOs:
+ for vbo in layerVBOlist:
+ self.glReleaseList.append(vbo)
+ self._gcodeVBOs = []
if ready:
self._gcode = gcodeInterpreter.gcode()
self._gcode.load(self._slicer.getGCodeFilename())
- else:
- self._gcode = None
self.QueueRefresh()
def loadScene(self, fileList):
glPushMatrix()
glTranslate(-self._machineSize[0] / 2, -self._machineSize[1] / 2, 0)
+ t = time.time()
for n in xrange(0, self.layerSelect.getValue() + 1):
- opengl.DrawGCodeLayer(self._gcode.layerList[n])
+ if len(self._gcodeVBOs) < n + 1:
+ self._gcodeVBOs.append(self._generateGCodeVBOs(self._gcode.layerList[n]))
+ if time.time() - t > 0.5:
+ self.QueueRefresh()
+ break
+ #['WALL-OUTER', 'WALL-INNER', 'FILL', 'SUPPORT', 'SKIRT']
+ glColor3f(1, 0, 0)
+ self._gcodeVBOs[n][0].render(GL_LINES)
+ glColor3f(0, 1, 0)
+ self._gcodeVBOs[n][1].render(GL_LINES)
+ glColor3f(0.5, 0.5, 0.0)
+ self._gcodeVBOs[n][2].render(GL_LINES)
+ glColor3f(0, 1, 1)
+ self._gcodeVBOs[n][3].render(GL_LINES)
+ self._gcodeVBOs[n][4].render(GL_LINES)
glPopMatrix()
else:
glStencilFunc(GL_ALWAYS, 1, 1)
glDisable(GL_BLEND)
glDisable(GL_CULL_FACE)
+ def _generateGCodeVBOs(self, layer):
+ ret = []
+ for extrudeType in ['WALL-OUTER', 'WALL-INNER', 'FILL', 'SUPPORT', 'SKIRT']:
+ pointList = numpy.zeros((0,3), numpy.float32)
+ for path in layer:
+ if path.type == 'extrude' and path.pathType == extrudeType:
+ a = numpy.array(path.points, numpy.float32)
+ a = numpy.concatenate((a[:-1], a[1:]), 1)
+ a = a.reshape((len(a) * 2, 3))
+ pointList = numpy.concatenate((pointList, a))
+ ret.append(opengl.GLVBO(pointList))
+ return ret
+
def getObjectCenterPos(self):
if self._selectedObj is None:
return [0.0, 0.0, 0.0]
print "Shader was not properly released!"
class GLVBO(GLReferenceCounter):
- def __init__(self, vertexArray, normalArray):
+ def __init__(self, vertexArray, normalArray = None):
super(GLVBO, self).__init__()
self._buffer = glGenBuffers(1)
self._size = len(vertexArray)
+ self._hasNormals = normalArray is not None
glBindBuffer(GL_ARRAY_BUFFER, self._buffer)
- glBufferData(GL_ARRAY_BUFFER, numpy.concatenate((vertexArray, normalArray), 1), GL_STATIC_DRAW)
+ if self._hasNormals:
+ glBufferData(GL_ARRAY_BUFFER, numpy.concatenate((vertexArray, normalArray), 1), GL_STATIC_DRAW)
+ else:
+ glBufferData(GL_ARRAY_BUFFER, vertexArray, GL_STATIC_DRAW)
glBindBuffer(GL_ARRAY_BUFFER, 0)
def render(self, render_type = GL_TRIANGLES):
glEnableClientState(GL_VERTEX_ARRAY)
- glEnableClientState(GL_NORMAL_ARRAY)
glBindBuffer(GL_ARRAY_BUFFER, self._buffer)
- glVertexPointer(3, GL_FLOAT, 2*3*4, c_void_p(0))
- glNormalPointer(GL_FLOAT, 2*3*4, c_void_p(3 * 4))
- batchSize = 999 #Warning, batchSize needs to be dividable by 3
+ if self._hasNormals:
+ glEnableClientState(GL_NORMAL_ARRAY)
+ glVertexPointer(3, GL_FLOAT, 2*3*4, c_void_p(0))
+ glNormalPointer(GL_FLOAT, 2*3*4, c_void_p(3 * 4))
+ else:
+ glVertexPointer(3, GL_FLOAT, 3*4, c_void_p(0))
+
+ batchSize = 1002 #Warning, batchSize needs to be dividable by 3 and 2
extraStartPos = int(self._size / batchSize) * batchSize
extraCount = self._size - extraStartPos
glDrawArrays(render_type, i * batchSize, batchSize)
glDrawArrays(render_type, extraStartPos, extraCount)
glBindBuffer(GL_ARRAY_BUFFER, 0)
+
glDisableClientState(GL_VERTEX_ARRAY)
- glDisableClientState(GL_NORMAL_ARRAY)
+ if self._hasNormals:
+ glDisableClientState(GL_NORMAL_ARRAY)
def release(self):
if self._buffer is not None:
prevVv1 = vv1
prevVv3 = vv3
else:
- glBegin(GL_LINE_STRIP)
glColor4fv(c)
+ glBegin(GL_TRIANGLES)
for v in path.points:
glVertex3f(v[0], v[1], v[2])
glEnd()
+
if not path.type == 'move':
prevPathWasRetract = False
#if path.type == 'retract' and path.points[0].almostEqual(path.points[-1]):