[PyOpenGL-Users] win - mac differencies
Brought to you by:
mcfletch
|
From: <tin...@li...> - 2010-08-27 16:34:27
|
Dear list,
I'm moving my project from win to mac platform.
I made use of openGL with wxpython. I found some differences in the way the
rendering is handled in the two platform.
The simple example below will run good on win, but will not run properly on
mac. It is a panel were dots can be printed with leftclicks; each panel can be
viewed full screen with rightclicks. This functionality is hindert in mac.
Could anyone tell me what I'm doing wring?Thanks
import wx
try:
from wx import glcanvas
haveGLCanvas = True
except ImportError:
haveGLCanvas = False
try:
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
haveOpenGL = True
except ImportError:
haveOpenGL = False
import numpy as np
##---------------------------------------
class MySplash(wx.Frame):
def __init__(self, element, parent, showFLAG=False, id = wx.ID_ANY, title
= wx.EmptyString):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.
DefaultSize)#, wx.CAPTION|wx.CLOSE_BOX|wx.SYSTEM_MENU|wx.CLIP_CHILDREN)#|wx.
MAXIMIZE)
self.m_parentWindow = element.GetParent()
self.m_parentFrame = parent
self.m_oldPos = self.m_parentWindow.GetPosition()
self.m_oldSize = self.m_parentWindow.GetClientSize()
self.splashedelement = element
self.outer_sizer = wx.BoxSizer(wx.VERTICAL)
self.SetBackgroundColour(wx.Colour( 0, 0, 0 ) )
self.outer_sizer.Add(element, 1, wx.ALIGN_CENTER|wx.EXPAND|wx.SHAPED,
5)
self.SetSizer(self.outer_sizer)
self.outer_sizer.Fit(self)
self.Layout()
self.Maximize()
self.Show(showFLAG)
self.Bind(wx.EVT_CLOSE, self.onClose)
def setOldSize(self,size):
self.m_oldSize = size
def setOldPos(self,pos):
#print "passed pos",pos
self.m_oldPos = pos
def getOldSize(self):
return self.m_oldSize
def getOldPos(self):
return self.m_oldPos
def onClose(self, event):
self.splashedelement.Reparent(self.m_parentWindow)
self.Show(False)
self.splashedelement.SetClientSize(self.m_oldSize)
self.splashedelement.SetPosition(self.m_oldPos)
self.m_parentFrame.SendSizeEvent()
##---------------------------------------
class GLPanePixelSel(glcanvas.GLCanvas):
def __init__(self, parent, ID = wx.ID_ANY, pos = wx.DefaultPosition, size
= wx.DefaultSize,
style = 0, name = wx.EmptyString, gl_attr = None):
glcanvas.GLCanvas.__init__(self, parent, ID, pos, size, style = wx.
FULL_REPAINT_ON_RESIZE, name = wx.EmptyString, attribList = None)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.init_fl = False
self.m_imgHight = size[1]
self.m_imgWidth = size[0]
self.m_panHight = 0
self.m_panWidth = 0
self.m_zoomH = 1
self.m_zoomW = 1
self.Bind(wx.EVT_LEFT_UP, self.OnLeftDown)
self.zoomed=[]
self.real=[]
self.contDot=0
self.radius = 10
self.sinR=self.radius*np.sin(np.linspace(0,2*np.pi,20))
self.cosR=self.radius*np.cos(np.linspace(0,2*np.pi,20))
self.splashFrame = MySplash(self, wx.GetTopLevelParent(self))
self.Bind(wx.EVT_RIGHT_DOWN, self.mouseRightClick)
def mouseRightClick(self, event):
self.splashFrame.setOldSize(self.GetClientSize())
self.splashFrame.setOldPos(self.GetPosition())
self.Reparent(self.splashFrame)
self.splashFrame.Show(True)
self.onDraw()
def OnLeftDown(self, event):
pt = event.GetPosition() # position tuple
realpt = (round(pt[0]/self.m_zoomW),round(pt[1]/self.m_zoomH))
self.real.append(realpt)
print pt
self.zoomed.append(pt)
self.contDot+=1
self.Refresh()
def initGL(self):
##openGL required!!
glClearColor(0, 0, 0, 0)
glShadeModel(GL_FLAT)
glPixelStorei(GL_UNPACK_ALIGNMENT,1)
self.init_fl = True
def onDraw(self):
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
glPushMatrix()
glPopMatrix()
glPointSize(10.0)
glColor3f(0.5, 1.0, 0.5)
glLineWidth(2.0)
glEnable(GL_LINE_SMOOTH)
for dot in self.zoomed:
glBegin(GL_LINE_LOOP)
for s,c in zip(self.sinR,self.cosR):
glVertex2f( dot[0]+s, dot[1]+c)
glEnd()
glFlush()
self.SwapBuffers()
def OnPaint(self, event):
dc = wx.PaintDC(self)
if not self.GetContext():
print "No Context!!!"
return
if not self.init_fl:
self.initGL()
self.SetCurrent()
self.onDraw()
def OnSize(self, event):
size = self.GetClientSize()
self.m_panWidth,self.m_panHight = size.width, size.height
self.m_zoomH = (1.0*self.m_panHight)/self.m_imgHight
self.m_zoomW = (1.0*self.m_panWidth)/self.m_imgWidth
cont = 0
while cont<self.contDot:
self.zoomed[cont]=(self.real[cont][0]*self.m_zoomW,self.real[cont]
[1]*self.m_zoomH)
cont+=1
if self.GetContext():
self.SetCurrent()
glViewport(0, 0, self.m_panWidth,self.m_panHight)
glMatrixMode (GL_PROJECTION)
glLoadIdentity ()
gluOrtho2D (0.0, self.m_panWidth, self.m_panHight, 0.0)
def OnEraseBackground(self, event):
pass
##--------------------------------
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Click for mouseposition", size=
(400,300),
style=wx.DEFAULT_FRAME_STYLE |wx.
NO_FULL_REPAINT_ON_RESIZE)
self.panel1=wx.Panel(self,-1)
self.panel1.SetBackgroundColour('Goldenrod')
self.bitmap1=GLPanePixelSel(self.panel1, size=(200,100))
self.bitmap2=GLPanePixelSel(self.panel1, size=(200,100))
sizer1=wx.BoxSizer(wx.HORIZONTAL)
sizer2=wx.BoxSizer(wx.HORIZONTAL)
sizer2.Add(self.bitmap1, 1, wx.ALL|wx.EXPAND|wx.SHAPED|wx.
ALIGN_CENTER, 5)
sizer2.Add(self.bitmap2, 1, wx.ALL|wx.EXPAND|wx.SHAPED|wx.
ALIGN_CENTER, 5)
self.panel1.SetSizer(sizer2)
sizer1.Add(self.panel1,1,wx.EXPAND, 0)
self.SetSizer(sizer1)
sizer1.Fit(self)
self.Layout()
self.Maximize(False)
##--------------------------------
app = wx.PySimpleApp()
frame = MyFrame(None)
frame.Show(True)
app.MainLoop()
|