# Another forms test program for the Python port of
# the Fast Light Tool Kit (pyFLTK).
# Modified to have 2 cubes to test multiple OpenGL contexts
#
# FLTk is Copyright 1998-2003 by Bill Spitzak and others.
# pyFLTK is Copyright 2003 by Andreas Held
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA.
#

from fltk import *
import sys, time

try:
	from OpenGL.GLUT import *
	from OpenGL.GL import *
except:
	print('''
ERROR: PyOpenGL not installed properly.  
		''')
	sys.exit()


# requires OpenGL

class cube_box(Fl_Gl_Window):
      lasttime = 0.0
      size = 0.0
      speed = 0.0
      wire = 0
      def __init__(self, x, y, w, h, l):
	      Fl_Gl_Window.__init__(self, x, y, w, h, l)
	      self.lasttime = 0.0

      def draw(self):
	      self.lasttime = self.lasttime+self.speed	
	      if self.valid() == 0:
		      glLoadIdentity()
		      glViewport(0,0,self.w(),self.h())
		      glEnable(GL_DEPTH_TEST)
		      glFrustum(-1,1,-1,1,2,10000)
		      glTranslatef(0,0,-10)
		      gl_font(FL_HELVETICA_BOLD, 16 )

	      try:
		      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
		      glPushMatrix()
          
		      glRotatef(self.lasttime*1.6,0,0,1)
		      glRotatef(self.lasttime*4.2,1,0,0)
		      glRotatef(self.lasttime*2.3,0,1,0)
		      glTranslatef(-1.0, 1.2, -1.5);
		      glScalef(self.size,self.size,self.size)
		      drawcube(self.wire)
		      glPopMatrix()
		      gl_color(FL_GRAY)
		      glDisable(GL_DEPTH_TEST)
		      if self.wire == 1:
			      gl_draw("Cube: wire", -4.5, -4.5)
		      else:
			      gl_draw("Cube: flat", -4.5, -4.5)
		      glEnable(GL_DEPTH_TEST)
	      except:
		      print("Exception: ", sys.exc_type, sys.exc_value)

# the cube definition
v0 = [0.0, 0.0, 0.0]
v1 = [1.0, 0.0, 0.0]
v2 = [1.0, 1.0, 0.0]
v3 = [0.0, 1.0, 0.0]
v4 = [0.0, 0.0, 1.0]
v5 = [1.0, 0.0, 1.0]
v6 = [1.0, 1.0, 1.0]
v7 = [0.0, 1.0, 1.0]


def drawcube(wire):
    # draw a colored cube
    if wire == 1:
	    glBegin(GL_LINE_LOOP)
    else:
	    glBegin(GL_POLYGON)
    glColor3ub(0,0,255);
    glVertex3fv(v0)
    glVertex3fv(v1) 
    glVertex3fv(v2) 
    glVertex3fv(v3)
    glEnd()

    if wire == 1:
	    glBegin(GL_LINE_LOOP)
    else:
	    glBegin(GL_POLYGON)
    glColor3ub(0,255,255)
    glVertex3fv(v4)
    glVertex3fv(v5)
    glVertex3fv(v6)	
    glVertex3fv(v7)
    glEnd()
    if wire == 1:
	    glBegin(GL_LINE_LOOP)
    else:
	    glBegin(GL_POLYGON)
    glColor3ub(255,0,255)
    glVertex3fv(v0)
    glVertex3fv(v1)
    glVertex3fv(v5)	
    glVertex3fv(v4)
    glEnd()
    if wire == 1:
	    glBegin(GL_LINE_LOOP)
    else:
	    glBegin(GL_POLYGON)
    glColor3ub(255,255,0)
    glVertex3fv(v2)
    glVertex3fv(v3)
    glVertex3fv(v7)
    glVertex3fv(v6)
    glEnd()
    if wire == 1:
	    glBegin(GL_LINE_LOOP)
    else:
	    glBegin(GL_POLYGON)
    glColor3ub(0,255,0)
    glVertex3fv(v0)
    glVertex3fv(v4)
    glVertex3fv(v7)
    glVertex3fv(v3)
    glEnd()
    if wire == 1:
	    glBegin(GL_LINE_LOOP)
    else:
	    glBegin(GL_POLYGON)
    glColor3ub(255,0,0)
    glVertex3fv(v1)
    glVertex3fv(v2)
    glVertex3fv(v6)
    glVertex3fv(v5)
    glEnd()	


form = None
speed = None
size = None
button = None
wire = None
flat = None
cube = None
cube2 = None

class MyBox(Fl_Group):
      def __init__(self, type, x, y, w, h, l):
            Fl_Group.__init__(self, x, y, w, h, l)
            Fl_Group.box(self, type)
            self.end()

def exit_cb(ptr):
      sys.exit(0)

def makeform(name):
    global form
    global speed
    global size
    global wire
    global flat
    global button
    global cube
    global cube2
    form = Fl_Window(510+390,390,name)
    b1 = Fl_Box(FL_DOWN_FRAME,20,20,350,350,"")
    b2 = Fl_Box(FL_DOWN_FRAME,510,20,350,350,"")
    speed = Fl_Slider(FL_VERT_SLIDER,390,90,40,220,"Speed")
    size = Fl_Slider(FL_VERT_SLIDER,450,90,40,220,"Size")
    wire = Fl_Radio_Light_Button(390,20,100,30,"Wire")
    flat = Fl_Radio_Light_Button(390,50,100,30,"Flat")	
    button = Fl_Button(390,340,100,30,"Exit")
    button.callback(exit_cb)
    cube = cube_box(23,23,344,344, "")
    cube2 = cube_box(513,23,344,344, "")
    b = Fl_Box(FL_NO_BOX,cube.x(),size.y(), cube.w(),size.h(),"")
    #b = MyBox(FL_NO_BOX,cube.x(),size.y(), cube.w(),size.h(),"")
    form.resizable(b)
    b.hide()
    form.end()


if __name__ == '__main__':
   makeform(sys.argv[0])

   speed.bounds(4,0)
   cube.speed = 1.0
   cube2.speed = 1.0
   speed.value(1.0)
   size.bounds(4,0.01)
   cube.size = 1.0
   cube2.size = 1.0
   size.value(1.0)
   flat.value(1)
   cube.wire = 0
   cube2.wire = 1
   form.label("cube");

   form.show(len(sys.argv), sys.argv)
   cube.show()
   cube2.show()

   while 1:
	   if form.visible() == 1 and speed.value() != 0:
		   if Fl.check() == 0:
			   break
	   else:
		   if Fl.wait() == 0:
			   break

	   cube.wire = wire.value()
	   cube2.wire = not wire.value()
	   cube.size = size.value()
	   cube2.size = size.value()
	   cube.speed = speed.value()
	   cube2.speed = speed.value()
	   cube.redraw()
	   cube2.redraw()
	   if Fl.readqueue() == button:
		   break

   
