from OpenGL.GL import *
from Cura.gui import printWindow
+from Cura.gui import printWindow2
from Cura.util import profile
from Cura.util import meshLoader
from Cura.util import objectScene
from Cura.util import machineCom
from Cura.util import removableStorage
from Cura.util import gcodeInterpreter
+from Cura.util import explorer
+from Cura.util.printerConnection import printerConnectionManager
from Cura.gui.util import previewTools
from Cura.gui.util import opengl
from Cura.gui.util import openglGui
self._animView = None
self._animZoom = None
self._platformMesh = {}
+ self._platformTexture = None
self._isSimpleMode = True
self._usbPrintMonitor = printWindow.printProcessMonitor(lambda : self._queueRefresh())
+ self._printerConnectionManager = printerConnectionManager.PrinterConnectionManager()
self._viewport = None
self._modelMatrix = None
def OnPrintButton(self, button):
if button == 1:
+ connectionGroup = self._printerConnectionManager.getAvailableGroup()
if machineCom.machineIsConnected():
self.showPrintWindow()
- elif len(removableStorage.getPossibleSDcardDrives()) > 0:
+ elif len(removableStorage.getPossibleSDcardDrives()) > 0 and (connectionGroup is None or connectionGroup.getPriority() < 0):
drives = removableStorage.getPossibleSDcardDrives()
if len(drives) > 1:
dlg = wx.SingleChoiceDialog(self, "Select SD drive", "Multiple removable drives have been found,\nplease select your SD card drive", map(lambda n: n[0], drives))
drive = drives[0]
filename = self._scene._objectList[0].getName() + '.gcode'
threading.Thread(target=self._copyFile,args=(self._gcodeFilename, drive[1] + filename, drive[1])).start()
+ elif connectionGroup is not None:
+ connections = connectionGroup.getAvailableConnections()
+ if len(connections) < 2:
+ connection = connections[0]
+ else:
+ dlg = wx.SingleChoiceDialog(self, "Select the %s connection to use" % (connectionGroup.getName()), "Multiple %s connections found" % (connectionGroup.getName()), map(lambda n: n.getName(), connections))
+ if dlg.ShowModal() != wx.ID_OK:
+ dlg.Destroy()
+ return
+ connection = connections[dlg.GetSelection()]
+ dlg.Destroy()
+ self._openPrintWindowForConnection(connection)
else:
self.showSaveGCode()
if button == 3:
menu = wx.Menu()
self.Bind(wx.EVT_MENU, lambda e: self.showPrintWindow(), menu.Append(-1, _("Print with USB")))
+ connections = self._printerConnectionManager.getAvailableConnections()
+ menu.connectionMap = {}
+ for connection in connections:
+ i = menu.Append(-1, _("Print with %s") % (connection.getName()))
+ menu.connectionMap[i.GetId()] = connection
+ self.Bind(wx.EVT_MENU, lambda e: self._openPrintWindowForConnection(e.GetEventObject().connectionMap[e.GetId()]), i)
self.Bind(wx.EVT_MENU, lambda e: self.showSaveGCode(), menu.Append(-1, _("Save GCode...")))
self.Bind(wx.EVT_MENU, lambda e: self._showSliceLog(), menu.Append(-1, _("Slice engine log...")))
self.PopupMenu(menu)
menu.Destroy()
+ def _openPrintWindowForConnection(self, connection):
+ print '_openPrintWindowForConnection', connection.getName()
+ if connection.window is None or not connection.window:
+ connection.window = printWindow2.printWindow(connection)
+ connection.window.Show()
+ connection.window.Raise()
+ if not connection.loadFile(self._gcodeFilename):
+ if connection.isPrinting():
+ self.notification.message("Cannot start print, because other print still running.")
+ else:
+ self.notification.message("Failed to start print...")
+
def showPrintWindow(self):
if self._gcodeFilename is None:
return
self.notification.message("Failed to save")
else:
if allowEject:
- self.notification.message("Saved as %s" % (fileB), lambda : self.notification.message('You can now eject the card.') if removableStorage.ejectDrive(allowEject) else self.notification.message('Safe remove failed...'))
+ self.notification.message("Saved as %s" % (fileB), lambda : self._doEjectSD(allowEject), 31, 'Eject')
+ elif explorer.hasExplorer():
+ self.notification.message("Saved as %s" % (fileB), lambda : explorer.openExplorer(fileB), 4, 'Open folder')
else:
self.notification.message("Saved as %s" % (fileB))
self.printButton.setProgressBar(None)
if fileA == self._slicer.getGCodeFilename():
self._slicer.submitSliceInfoOnline()
+ def _doEjectSD(self, drive):
+ if removableStorage.ejectDrive(drive):
+ self.notification.message('You can now eject the card.')
+ else:
+ self.notification.message('Safe remove failed...')
+
def _showSliceLog(self):
dlg = wx.TextEntryDialog(self, _("The slicing engine reported the following"), _("Engine log..."), '\n'.join(self._slicer.getSliceLog()), wx.TE_MULTILINE | wx.OK | wx.CENTRE)
dlg.ShowModal()
if self._selectedObj is None:
return
self._selectedObj.resetRotation()
- self._scene.pushFree()
+ self._scene.pushFree(self._selectedObj)
self._selectObject(self._selectedObj)
self.sceneUpdated()
if self._selectedObj is None:
return
self._selectedObj.layFlat()
- self._scene.pushFree()
+ self._scene.pushFree(self._selectedObj)
self._selectObject(self._selectedObj)
self.sceneUpdated()
return
machine = profile.getMachineSetting('machine_type')
self._selectedObj.setPosition(numpy.array([0.0, 0.0]))
- self._scene.pushFree()
+ self._scene.pushFree(self._selectedObj)
#self.sceneUpdated()
if machine == "ultimaker2":
#This is bad and Jaime should feel bad!
self._selectedObj.setPosition(numpy.array([0.0,-10.0]))
self._selectedObj.scaleUpTo(self._machineSize - numpy.array(profile.calculateObjectSizeOffsets() + [0.0], numpy.float32) * 2 - numpy.array([1,1,1], numpy.float32))
self._selectedObj.setPosition(numpy.array([0.0,0.0]))
- self._scene.pushFree()
+ self._scene.pushFree(self._selectedObj)
else:
self._selectedObj.setPosition(numpy.array([0.0, 0.0]))
- self._scene.pushFree()
+ self._scene.pushFree(self._selectedObj)
self._selectedObj.scaleUpTo(self._machineSize - numpy.array(profile.calculateObjectSizeOffsets() + [0.0], numpy.float32) * 2 - numpy.array([1,1,1], numpy.float32))
- self._scene.pushFree()
+ self._scene.pushFree(self._selectedObj)
self._selectObject(self._selectedObj)
self.updateProfileToControls()
self.sceneUpdated()
return
self._selectedObj.setScale(value, axis, self.scaleUniform.getValue())
self.updateProfileToControls()
- self._scene.pushFree()
+ self._scene.pushFree(self._selectedObj)
self._selectObject(self._selectedObj)
self.sceneUpdated()
return
self._selectedObj.setSize(value, axis, self.scaleUniform.getValue())
self.updateProfileToControls()
- self._scene.pushFree()
+ self._scene.pushFree(self._selectedObj)
self._selectObject(self._selectedObj)
self.sceneUpdated()
if self._focusObj is None:
return
self._focusObj.setPosition(numpy.array([0.0, 0.0]))
- self._scene.pushFree()
+ self._scene.pushFree(self._selectedObj)
newViewPos = numpy.array([self._focusObj.getPosition()[0], self._focusObj.getPosition()[1], self._focusObj.getSize()[2] / 2])
self._animView = openglGui.animation(self, self._viewTarget.copy(), newViewPos, 0.5)
self.sceneUpdated()
def sceneUpdated(self):
self._sceneUpdateTimer.Start(500, True)
self._slicer.abortSlicer()
- self._scene.setSizeOffsets(numpy.array(profile.calculateObjectSizeOffsets(), numpy.float32))
+ self._scene.updateSizeOffsets()
self.QueueRefresh()
def _onRunSlicer(self, e):
else:
obj._loadAnim = None
self._scene.add(obj)
- self._scene.centerAll()
+ if not self._scene.checkPlatform(obj):
+ self._scene.centerAll()
self._selectObject(obj)
if obj.getScale()[0] < 1.0:
self.notification.message("Warning: Object scaled down.")
def _selectObject(self, obj, zoom = True):
if obj != self._selectedObj:
self._selectedObj = obj
- self.updateProfileToControls()
+ self.updateModelSettingsToControls()
self.updateToolButtons()
if zoom and obj is not None:
newViewPos = numpy.array([obj.getPosition()[0], obj.getPosition()[1], obj.getSize()[2] / 2])
if self._isSimpleMode != oldSimpleMode:
self._scene.arrangeAll()
self.sceneUpdated()
+ self._scene.updateSizeOffsets(True)
self._machineSize = numpy.array([profile.getMachineSettingFloat('machine_width'), profile.getMachineSettingFloat('machine_depth'), profile.getMachineSettingFloat('machine_height')])
self._objColors[0] = profile.getPreferenceColour('model_colour')
self._objColors[1] = profile.getPreferenceColour('model_colour2')
self._objColors[2] = profile.getPreferenceColour('model_colour3')
self._objColors[3] = profile.getPreferenceColour('model_colour4')
- self._scene.setMachineSize(self._machineSize)
- self._scene.setSizeOffsets(numpy.array(profile.calculateObjectSizeOffsets(), numpy.float32))
- self._scene.setHeadSize(profile.getMachineSettingFloat('extruder_head_size_min_x'), profile.getMachineSettingFloat('extruder_head_size_max_x'), profile.getMachineSettingFloat('extruder_head_size_min_y'), profile.getMachineSettingFloat('extruder_head_size_max_y'), profile.getMachineSettingFloat('extruder_head_size_height'))
+ self._scene.updateMachineDimensions()
+ self.updateModelSettingsToControls()
+ def updateModelSettingsToControls(self):
if self._selectedObj is not None:
scale = self._selectedObj.getScale()
size = self._selectedObj.getSize()
if self._selectedObj is not None:
self._deleteObject(self._selectedObj)
self.QueueRefresh()
- if keyCode == wx.WXK_UP:
- self.layerSelect.setValue(self.layerSelect.getValue() + 1)
- self.QueueRefresh()
- elif keyCode == wx.WXK_DOWN:
- self.layerSelect.setValue(self.layerSelect.getValue() - 1)
- self.QueueRefresh()
- elif keyCode == wx.WXK_PAGEUP:
- self.layerSelect.setValue(self.layerSelect.getValue() + 10)
- self.QueueRefresh()
- elif keyCode == wx.WXK_PAGEDOWN:
- self.layerSelect.setValue(self.layerSelect.getValue() - 10)
- self.QueueRefresh()
+ if self.viewMode == 'gcode':
+ if keyCode == wx.WXK_UP:
+ self.layerSelect.setValue(self.layerSelect.getValue() + 1)
+ self.QueueRefresh()
+ elif keyCode == wx.WXK_DOWN:
+ self.layerSelect.setValue(self.layerSelect.getValue() - 1)
+ self.QueueRefresh()
+ elif keyCode == wx.WXK_PAGEUP:
+ self.layerSelect.setValue(self.layerSelect.getValue() + 10)
+ self.QueueRefresh()
+ elif keyCode == wx.WXK_PAGEDOWN:
+ self.layerSelect.setValue(self.layerSelect.getValue() - 10)
+ self.QueueRefresh()
+ else:
+ if keyCode == wx.WXK_UP:
+ if wx.GetKeyState(wx.WXK_SHIFT):
+ self._zoom /= 1.2
+ if self._zoom < 1:
+ self._zoom = 1
+ else:
+ self._pitch -= 15
+ self.QueueRefresh()
+ elif keyCode == wx.WXK_DOWN:
+ if wx.GetKeyState(wx.WXK_SHIFT):
+ self._zoom *= 1.2
+ if self._zoom > numpy.max(self._machineSize) * 3:
+ self._zoom = numpy.max(self._machineSize) * 3
+ else:
+ self._pitch += 15
+ self.QueueRefresh()
+ elif keyCode == wx.WXK_LEFT:
+ self._yaw -= 15
+ self.QueueRefresh()
+ elif keyCode == wx.WXK_RIGHT:
+ self._yaw += 15
+ self.QueueRefresh()
+ elif keyCode == wx.WXK_NUMPAD_ADD or keyCode == wx.WXK_ADD or keyCode == ord('+') or keyCode == ord('='):
+ self._zoom /= 1.2
+ if self._zoom < 1:
+ self._zoom = 1
+ self.QueueRefresh()
+ elif keyCode == wx.WXK_NUMPAD_SUBTRACT or keyCode == wx.WXK_SUBTRACT or keyCode == ord('-'):
+ self._zoom *= 1.2
+ if self._zoom > numpy.max(self._machineSize) * 3:
+ self._zoom = numpy.max(self._machineSize) * 3
+ self.QueueRefresh()
+ elif keyCode == wx.WXK_HOME:
+ self._yaw = 30
+ self._pitch = 60
+ self.QueueRefresh()
+ elif keyCode == wx.WXK_PAGEUP:
+ self._yaw = 0
+ self._pitch = 0
+ self.QueueRefresh()
+ elif keyCode == wx.WXK_PAGEDOWN:
+ self._yaw = 0
+ self._pitch = 90
+ self.QueueRefresh()
+ elif keyCode == wx.WXK_END:
+ self._yaw = 90
+ self._pitch = 90
+ self.QueueRefresh()
if keyCode == wx.WXK_F3 and wx.GetKeyState(wx.WXK_SHIFT):
shaderEditor(self, self.ShaderUpdate, self._objectLoadShader.getVertexShader(), self._objectLoadShader.getFragmentShader())
self.PopupMenu(menu)
menu.Destroy()
elif self._mouseState == 'dragObject' and self._selectedObj is not None:
- self._scene.pushFree()
+ self._scene.pushFree(self._selectedObj)
self.sceneUpdated()
elif self._mouseState == 'tool':
if self.tempMatrix is not None and self._selectedObj is not None:
self._selectedObj.applyMatrix(self.tempMatrix)
- self._scene.pushFree()
+ self._scene.pushFree(self._selectedObj)
self._selectObject(self._selectedObj)
self.tempMatrix = None
self.tool.OnDragEnd()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
def OnPaint(self,e):
+ connectionGroup = self._printerConnectionManager.getAvailableGroup()
if machineCom.machineIsConnected():
self.printButton._imageID = 6
self.printButton._tooltip = _("Print")
- elif len(removableStorage.getPossibleSDcardDrives()) > 0:
+ elif len(removableStorage.getPossibleSDcardDrives()) > 0 and (connectionGroup is None or connectionGroup.getPriority() < 0):
self.printButton._imageID = 2
self.printButton._tooltip = _("Toolpath to SD")
+ elif connectionGroup is not None:
+ self.printButton._imageID = connectionGroup.getIconID()
+ self.printButton._tooltip = _("Print with %s") % (connectionGroup.getName())
else:
self.printButton._imageID = 3
self.printButton._tooltip = _("Save toolpath")
self._drawMachine()
if self._usbPrintMonitor.getState() == 'PRINTING' and self._usbPrintMonitor.getID() == self._slicer.getID():
- glEnable(GL_BLEND)
z = self._usbPrintMonitor.getZ()
- size = self._machineSize
- glColor4ub(255,255,0,128)
- glBegin(GL_QUADS)
- glVertex3f(-size[0]/2,-size[1]/2, z)
- glVertex3f( size[0]/2,-size[1]/2, z)
- glVertex3f( size[0]/2, size[1]/2, z)
- glVertex3f(-size[0]/2, size[1]/2, z)
- glEnd()
+ if self.viewMode == 'gcode':
+ layer_height = profile.getProfileSettingFloat('layer_height')
+ layer1_height = profile.getProfileSettingFloat('bottom_thickness')
+ if layer_height > 0:
+ if layer1_height > 0:
+ layer = int((z - layer1_height) / layer_height) + 1
+ else:
+ layer = int(z / layer_height)
+ else:
+ layer = 1
+ self.layerSelect.setValue(layer)
+ else:
+ size = self._machineSize
+ glEnable(GL_BLEND)
+ glColor4ub(255,255,0,128)
+ glBegin(GL_QUADS)
+ glVertex3f(-size[0]/2,-size[1]/2, z)
+ glVertex3f( size[0]/2,-size[1]/2, z)
+ glVertex3f( size[0]/2, size[1]/2, z)
+ glVertex3f(-size[0]/2, size[1]/2, z)
+ glEnd()
if self.viewMode == 'gcode':
if self._gcodeLoadThread is not None and self._gcodeLoadThread.isAlive():
glPopMatrix()
else:
#Draw the object box-shadow, so you can see where it will collide with other objects.
- if self._selectedObj is not None and len(self._scene.objects()) > 1:
- size = self._selectedObj.getSize()[0:2] / 2 + self._scene.getObjectExtend()
- glPushMatrix()
- glTranslatef(self._selectedObj.getPosition()[0], self._selectedObj.getPosition()[1], 0)
+ if self._selectedObj is not None:
glEnable(GL_BLEND)
glEnable(GL_CULL_FACE)
- glColor4f(0,0,0,0.12)
- glBegin(GL_QUADS)
- glVertex3f(-size[0], size[1], 0.1)
- glVertex3f(-size[0], -size[1], 0.1)
- glVertex3f( size[0], -size[1], 0.1)
- glVertex3f( size[0], size[1], 0.1)
- glEnd()
+ glColor4f(0,0,0,0.16)
+ glDepthMask(False)
+ for obj in self._scene.objects():
+ glPushMatrix()
+ glTranslatef(obj.getPosition()[0], obj.getPosition()[1], 0)
+ glBegin(GL_TRIANGLE_FAN)
+ for p in obj._boundaryHull[::-1]:
+ glVertex3f(p[0], p[1], 0)
+ glEnd()
+ glPopMatrix()
+ if self._scene.isOneAtATime():
+ glPushMatrix()
+ glColor4f(0,0,0,0.06)
+ glTranslatef(self._selectedObj.getPosition()[0], self._selectedObj.getPosition()[1], 0)
+ glBegin(GL_TRIANGLE_FAN)
+ for p in self._selectedObj._printAreaHull[::-1]:
+ glVertex3f(p[0], p[1], 0)
+ glEnd()
+ glBegin(GL_TRIANGLE_FAN)
+ for p in self._selectedObj._headAreaMinHull[::-1]:
+ glVertex3f(p[0], p[1], 0)
+ glEnd()
+ glPopMatrix()
+ glDepthMask(True)
glDisable(GL_CULL_FACE)
- glPopMatrix()
#Draw the outline of the selected object, on top of everything else except the GUI.
if self._selectedObj is not None and self._selectedObj._loadAnim is None:
size = [profile.getMachineSettingFloat('machine_width'), profile.getMachineSettingFloat('machine_depth'), profile.getMachineSettingFloat('machine_height')]
machine = profile.getMachineSetting('machine_type')
- if profile.getMachineSetting('machine_type').startswith('ultimaker'):
+ if machine.startswith('ultimaker'):
if machine not in self._platformMesh:
meshes = meshLoader.loadMeshes(resources.getPathForMesh(machine + '_platform.stl'))
if len(meshes) > 0:
glVertex3f(-size[0] / 2, -size[1] / 2+10, 0)
glEnd()
- #Cornerpoints for big blue square
- v0 = [ size[0] / 2, size[1] / 2, size[2]]
- v1 = [ size[0] / 2,-size[1] / 2, size[2]]
- v2 = [-size[0] / 2, size[1] / 2, size[2]]
- v3 = [-size[0] / 2,-size[1] / 2, size[2]]
- v4 = [ size[0] / 2, size[1] / 2, 0]
- v5 = [ size[0] / 2,-size[1] / 2, 0]
- v6 = [-size[0] / 2, size[1] / 2, 0]
- v7 = [-size[0] / 2,-size[1] / 2, 0]
-
- vList = [v0,v1,v3,v2, v1,v0,v4,v5, v2,v3,v7,v6, v0,v2,v6,v4, v3,v1,v5,v7]
- glEnableClientState(GL_VERTEX_ARRAY)
- glVertexPointer(3, GL_FLOAT, 3*4, vList)
-
- glColor4ub(5, 171, 231, 64)
- glDrawArrays(GL_QUADS, 0, 4)
- glColor4ub(5, 171, 231, 96)
- glDrawArrays(GL_QUADS, 4, 8)
+ glDepthMask(False)
+
+ polys = profile.getMachineSizePolygons()
+ height = profile.getMachineSettingFloat('machine_height')
+ glBegin(GL_QUADS)
+ for n in xrange(0, len(polys[0])):
+ if n % 2 == 0:
+ glColor4ub(5, 171, 231, 96)
+ else:
+ glColor4ub(5, 171, 231, 64)
+ glVertex3f(polys[0][n][0], polys[0][n][1], height)
+ glVertex3f(polys[0][n][0], polys[0][n][1], 0)
+ glVertex3f(polys[0][n-1][0], polys[0][n-1][1], 0)
+ glVertex3f(polys[0][n-1][0], polys[0][n-1][1], height)
+ glEnd()
glColor4ub(5, 171, 231, 128)
- glDrawArrays(GL_QUADS, 12, 8)
- glDisableClientState(GL_VERTEX_ARRAY)
+ glBegin(GL_TRIANGLE_FAN)
+ for p in polys[0][::-1]:
+ glVertex3f(p[0], p[1], height)
+ glEnd()
#Draw checkerboard
- sx = self._machineSize[0]
- sy = self._machineSize[1]
- for x in xrange(-int(sx/20)-1, int(sx / 20) + 1):
- for y in xrange(-int(sx/20)-1, int(sy / 20) + 1):
- x1 = x * 10
- x2 = x1 + 10
- y1 = y * 10
- y2 = y1 + 10
- x1 = max(min(x1, sx/2), -sx/2)
- y1 = max(min(y1, sy/2), -sy/2)
- x2 = max(min(x2, sx/2), -sx/2)
- y2 = max(min(y2, sy/2), -sy/2)
- #Black or "white" checker
- if (x & 1) == (y & 1):
- glColor4ub(5, 171, 231, 127)
- else:
- glColor4ub(5 * 8 / 10, 171 * 8 / 10, 231 * 8 / 10, 128)
- glBegin(GL_QUADS)
- glVertex3f(x1, y1, -0.02) #Draw bit below z0 to prevent zfighting.
- glVertex3f(x2, y1, -0.02)
- glVertex3f(x2, y2, -0.02)
- glVertex3f(x1, y2, -0.02)
- glEnd()
-
- if machine == 'ultimaker2':
-
- glColor4ub(127, 127, 127, 200)
- #if UM2, draw bat-area zone for head. THe head can't stop there, because its bat-area.
- #UpperRight
- clipWidth = 25
- clipHeight = 10
- posX = sx / 2 - clipWidth
- posY = sy / 2 - clipHeight
- glBegin(GL_QUADS)
- glVertex3f(posX, posY, 0.1)
- glVertex3f(posX+clipWidth, posY, 0.1)
- glVertex3f(posX+clipWidth, posY+clipHeight, 0.1)
- glVertex3f(posX, posY+clipHeight, 0.1)
- glEnd()
- #UpperLeft
- clipWidth = 25
- clipHeight = 10
- posX = -sx / 2
- posY = sy / 2 - clipHeight
- glBegin(GL_QUADS)
- glVertex3f(posX, posY, 0.1)
- glVertex3f(posX+clipWidth, posY, 0.1)
- glVertex3f(posX+clipWidth, posY+clipHeight, 0.1)
- glVertex3f(posX, posY+clipHeight, 0.1)
- glEnd()
- #LowerRight
- clipWidth = 25
- clipHeight = 10
- posX = sx / 2 - clipWidth
- posY = -sy / 2
- glBegin(GL_QUADS)
- glVertex3f(posX, posY, 0.1)
- glVertex3f(posX+clipWidth, posY, 0.1)
- glVertex3f(posX+clipWidth, posY+clipHeight, 0.1)
- glVertex3f(posX, posY+clipHeight, 0.1)
- glEnd()
- #LowerLeft
- clipWidth = 25
- clipHeight = 10
- posX = -sx / 2
- posY = -sy / 2
- glBegin(GL_QUADS)
- glVertex3f(posX, posY, 0.1)
- glVertex3f(posX+clipWidth, posY, 0.1)
- glVertex3f(posX+clipWidth, posY+clipHeight, 0.1)
- glVertex3f(posX, posY+clipHeight, 0.1)
+ if self._platformTexture is None:
+ self._platformTexture = opengl.loadGLTexture('checkerboard.png')
+ glBindTexture(GL_TEXTURE_2D, self._platformTexture)
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
+ glColor4f(1,1,1,0.5)
+ glBindTexture(GL_TEXTURE_2D, self._platformTexture)
+ glEnable(GL_TEXTURE_2D)
+ glBegin(GL_TRIANGLE_FAN)
+ for p in polys[0]:
+ glTexCoord2f(p[0]/20, p[1]/20)
+ glVertex3f(p[0], p[1], 0)
+ glEnd()
+ glDisable(GL_TEXTURE_2D)
+ glColor4ub(127, 127, 127, 200)
+ for poly in polys[1:]:
+ glBegin(GL_TRIANGLE_FAN)
+ for p in poly:
+ glTexCoord2f(p[0]/20, p[1]/20)
+ glVertex3f(p[0], p[1], 0)
glEnd()
+ glDepthMask(True)
glDisable(GL_BLEND)
glDisable(GL_CULL_FACE)