#!/cygdrive/c/Python26/python.exe

import wx
from wx.glcanvas import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *

class SphereCanvas(GLCanvas):
    def __init__(self, parent):
        # Explicit attribute list to disable double buffering
        attribList = [WX_GL_RGBA, WX_GL_DOUBLEBUFFER]
        GLCanvas.__init__(self, parent, -1, attribList=attribList)
        # glutInit()
        self.gl_is_initialized = False
        wx.EVT_PAINT(self, self.on_paint)
        # Prevent flicker by overriding erase background event
        wx.EVT_ERASE_BACKGROUND(self, lambda event: None)
        # self.Bind(wx.EVT_ERASE_BACKGROUND, self.on_erase_background)
        self.spin = 0.0 # for animation
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.spin_display, self.timer)
        self.timer.Start(50)
        
    def init_gl(self):
        glClearColor(0.0, 0.0, 0.0, 0.0)
        glShadeModel(GL_FLAT)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0)
        
    def on_paint(self, event):
        dc = wx.PaintDC(self)
        self.SetCurrent()
        if not self.gl_is_initialized:
            self.init_gl()
            self.gl_is_initialized = True
        self.render()
        
    def on_erase_background(self, event):
        pass

    def render(self):
        glClear(GL_COLOR_BUFFER_BIT)
        glPushMatrix()
        glRotatef(self.spin, 0.0, 0.0, 1.0)
        glColor3f(1.0, 1.0, 1.0)
        glRectf(-25.0, -25.0, 25.0, 25.0)
        glPopMatrix()
        glFlush()
        self.SwapBuffers()
        
    def spin_display(self, event):
        self.spin = self.spin + 2.0
        if (self.spin > 360.0):
            self.spin = self.spin - 360.0
        # TODO - trigger repaint
        self.Refresh()
        
class SphereApp(wx.PySimpleApp):
    def __init__(self):
        wx.PySimpleApp.__init__(self)
        frame = wx.Frame(None, -1, 'Sphere', size=wx.Size(250,250))
        self.canvas = SphereCanvas(frame)
        frame.Show()
        self.MainLoop()

if __name__ == '__main__':
    SphereApp()

