#!/usr/bin/env python

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from wxGLBase import *

dispList=None

def InitShape():
  global dispList
  dispList = glGenLists(1)
  gObj = gluNewQuadric()
  gluQuadricDrawStyle(gObj,GLU_FILL)
  gluQuadricNormals(gObj,GLU_SMOOTH)
  glNewList(dispList,GL_COMPILE)
  glPushMatrix()
  glTranslate(-0.75,-0.75,0)
  glPushMatrix()
  gluSphere(gObj,.5,20,20)
  glTranslate(1.5,0,0)
  gluSphere(gObj,.5,20,20)
  glTranslate(0,1.5,0)
  gluSphere(gObj,.5,20,20)
  glTranslate(-1.5,0,0)
  gluSphere(gObj,.5,20,20)
  glPopMatrix()

  glPushMatrix()
  glRotate(-90.,1.,0,0)
  gluCylinder(gObj,.1,.1,1.5,20,5)
  glPopMatrix()

  glPushMatrix()
  glRotate(90.,0,1.,0,)
  gluCylinder(gObj,.1,.1,1.5,20,5)
  glPopMatrix()

  glPushMatrix()
  glTranslate(1.5,1.5,0)
  glRotate(90.,1.,0,0,)
  gluCylinder(gObj,.1,.1,1.5,20,5)
  glPopMatrix()

  glPushMatrix()
  glTranslate(1.5,1.5,0)
  glRotate(-90.,0,1.,0,)
  gluCylinder(gObj,.1,.1,1.5,20,5)
  glPopMatrix()

  glPopMatrix()
  glEndList()

def init():

  glMaterial(GL_FRONT, GL_AMBIENT, [0.2, 0.2, 0.2, 1.0])
  glMaterial(GL_FRONT, GL_DIFFUSE, [0.8, 0.8, 0.8, 1.0])
  glMaterial(GL_FRONT, GL_SPECULAR, [1.0, 0.0, 1.0, 1.0])
  glMaterial(GL_FRONT, GL_SHININESS, 50.0)
  glLight(GL_LIGHT0, GL_AMBIENT, [0.0, 1.0, 0.0, 1.0])
  glLight(GL_LIGHT0, GL_DIFFUSE, [1.0, 1.0, 1.0, 1.0])
  glLight(GL_LIGHT0, GL_SPECULAR, [1.0, 1.0, 1.0, 1.0])
  glLight(GL_LIGHT0, GL_POSITION, [1.0, 1.0, 1.0, 0.0]);   
  glLightModel(GL_LIGHT_MODEL_AMBIENT, [0.2, 0.2, 0.2, 1.0])
  glEnable(GL_LIGHTING)
  glEnable(GL_LIGHT0)
  glDepthFunc(GL_LESS)
  glEnable(GL_DEPTH_TEST)

  InitShape()

def redraw(o=None):
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
  glPushMatrix()
  if 0:
    glTranslate(0, 0, 0)
    glutSolidSphere(.5,20,20)
    glTranslate(0, -2, 0)
    glutSolidSphere(.5,20,20)
    glTranslate(2,0,0)
    glutSolidSphere(.5,20,20)
    glTranslate(0,2,0)
    glutSolidSphere(.5,20,20)
  else:
    glCallList(dispList)
    
  #glRotate(250, 1, 0, 0)
  #glutSolidCone(1, 2, 50, 10)
  glPopMatrix()

def main():
  class MyApp(wxApp):
    def OnInit(self):
      frame = wxFrame(NULL, -1, "wxPython Context", wxDefaultPosition, wxSize(400,400))
      win = Opengl(frame)
      win.redraw = redraw
      init()
      frame.Show(TRUE)
      self.SetTopWindow(frame)
      return TRUE
  app = MyApp(0)
  app.MainLoop()


main()
