changeset 346:a08882a05d29

openglsim refactor. now dims a few lights
author drewp@bigasterisk.com
date Sat, 09 Jun 2007 07:09:21 +0000
parents 839545f174d3
children e8f5407fd48d
files lightsim/openglsim.py
diffstat 1 files changed, 105 insertions(+), 91 deletions(-) [+]
line wrap: on
line diff
--- a/lightsim/openglsim.py	Sat Jun 09 06:02:52 2007 +0000
+++ b/lightsim/openglsim.py	Sat Jun 09 07:09:21 2007 +0000
@@ -1,115 +1,129 @@
+#!/usr/bin/python2.4
 # see http://www.sgi.com/software/opengl/advanced97/notes/node57.html for accum notes
 
+from __future__ import division
 import sys, time
 import numarray as num
-
-
-sys.path.append("/usr/lib/python2.4/site-packages/OpenGL/Tk/linux2-tk8.4")
-from OpenGL.GL import *
-import Togl
 import Tkinter as tk
-
 import Image
 
-def drawWithAlpha(imgString, w, h, alpha):
-    """without opengl extensions"""
-    t = time.time()
-    ar = num.reshape(num.fromstring(imgString, dtype='uint8'),
-                     (w * h, 4))
-    print "  tonum", time.time() - t
-    ar[:,3] *= alpha
-
-    print "  scl", time.time() - t
-    glDrawPixels(w, h,
-                 GL_RGBA, GL_UNSIGNED_BYTE, ar.tostring())
-    print "  draw", time.time() - t
+try:
+    from OpenGL import Tk as Togl
+    from OpenGL.GL import *
+except ImportError:
+    sys.path.append("/usr/lib/python2.4/site-packages/OpenGL/Tk/linux2-tk8.4")
+    from OpenGL.GL import *
+    import Togl
   
 
-def drawWithAlpha(imgString, w, h, alpha):
+def xxxdrawWithAlpha(imgString, w, h, alpha):
+    # this one should be faster because GL does the alpha adjust, but
+    # i don't think it works yet
+    
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
     
     glClear(GL_COLOR_BUFFER_BIT)
     #glBlendColor(1, 1, 1, mag) # needs ARB_imaging
     glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, imgString)
-    
 
-class Surface:
-  def Display(self, event=None):
-    assert 'GL_ARB_imaging' in glGetString(GL_EXTENSIONS).split()
-    
-    glClearColor(0.0, 0.0, 0.0, 0)
-    glClear( GL_COLOR_BUFFER_BIT |GL_ACCUM_BUFFER_BIT)
-    glEnable(GL_BLEND)
-    glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA)
-    l=glGenLists(1)
-    glNewList(l,GL_COMPILE)
-    glEndList()
+class Surface(Togl.Opengl):
+    width = 512
+    height = 270
+    imgRescaleTo = 100
+    def __init__(self, master, filenames):
+        Togl.Opengl.__init__(self, master=master, width = self.width,
+                             height = self.height, double = True, depth = 0)
 
-#    glDrawBuffer(GL_BACK)
-                
-    for x, img in enumerate(self.image):
-      mag = self.scales[x].get()
-      print "pic %i at %f" % (x,mag)
-      drawWithAlpha(img, self.imageWidth, self.imageHeight, mag)
-
+        self.levels = {} # filename : brightness
+  
+        self.image = {} # filename : imgstr
+        for filename in filenames:
+            im = Image.open(filename)
+            if self.imgRescaleTo:
+                im.thumbnail((self.imgRescaleTo, self.imgRescaleTo))
+            im = im.transpose(Image.FLIP_TOP_BOTTOM)
+            self.imageWidth = im.size[0]
+            self.imageHeight = im.size[1]
+            self.image[filename] = im.convert("RGBA").tostring()
+  
+        self.set_centerpoint(0, 0, 0)
+  
+        glDisable(GL_CULL_FACE)
+        glShadeModel(GL_FLAT)
+        print 'GL_ARB_imaging', 'GL_ARB_imaging' in glGetString(GL_EXTENSIONS)
+        import OpenGL
+        print OpenGL.__version__
 
-##       if x==0:
-##         glAccum(GL_LOAD,mag)
-##       else:
-##         glAccum(GL_ACCUM,mag)
+        self.bind("<Configure>", self.configure)
 
-      # glAccum(GL_ADD,self.x)
-      self.x=(self.x+.1)%2.0
-##       glAccum(GL_RETURN,1)
-
-  def SetupWindow(self):
-    self.OglFrame = tk.Frame()
-    self.OglFrame.pack(side = 'top',fill='both',expand=1)
-    self.QuitButton = tk.Button(self.OglFrame, {'text':'Quit'})
-    self.QuitButton.bind('<ButtonRelease-1>', sys.exit)
-    self.QuitButton.pack({'side':'top'})
-  
+    def configure(self, ev):
+#        import pdb; pdb.set_trace()
+        self.width, self.height = ev.width, ev.height
   
-  def SetupOpenGL(self):
-    self.ogl = Togl.Opengl(master=self.OglFrame, width = 512, height = 270, double = 1, depth = 0)
-    self.ogl.pack(side = 'top', expand = 1, fill = 'both')
-    self.ogl.set_centerpoint(0, 0, 0)
-    self.ogl.redraw = self.Display
-  
-    for x in range(0,2):
-      self.scales[x] = Scale(self.OglFrame,label="s%i"%x,from_=0,to=1,res=.05,orient='horiz',command=self.ogl.tkRedraw)
-      self.scales[x].pack()
-  
-  
-  def __init__(self):
-    self.x=0
-    self.scales=[None,None]
-  
-    self.SetupWindow()
+    def drawWithAlpha(self, imgString, w, h, alpha):
+        """without opengl extensions"""
+        if alpha == 0:
+            return
+        t = time.time()
+        ar = num.reshape(num.fromstring(imgString, dtype='uint8'),
+                         (w * h, 4))
+        #print "  tonum", time.time() - t
+        if alpha != 1:
+            ar[:,3] *= alpha
+
+        #print "  scl", time.time() - t
+        glPixelZoom(self.width / w, self.height / h)
+        glDrawPixels(w, h,
+                     GL_RGBA, GL_UNSIGNED_BYTE, ar.tostring())
+        #print "  draw", time.time() - t
+
+    def redraw(self, event=None):
+        """you set self.levels to dict and call tkRedraw"""
+        assert 'GL_ARB_imaging' in glGetString(GL_EXTENSIONS).split()
+    
+        glClearColor(0.0, 0.0, 0.0, 0)
+        glClear( GL_COLOR_BUFFER_BIT |GL_ACCUM_BUFFER_BIT)
+        glEnable(GL_BLEND)
+        glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA)
+#        l=glGenLists(1)
+#        glNewList(l,GL_COMPILE)
+#        glEndList()
+
+        # drawing to glAccum might be good
+        for filename, mag in self.levels.items():
+            #print "pic %s at %f" % (filename, mag)
+            self.drawWithAlpha(self.image[filename],
+                               self.imageWidth, self.imageHeight, mag)
+
+    def newLevels(self, event=None, levels=None):
+        self.levels = levels
+        self.tkRedraw()
   
-    self.image=[]
-    for filename in ('skyline/bg.png', 'skyline/cyc-lo-red.png'):
-      im = Image.open(filename)
-      #im.thumbnail((200, 200))
-      self.imageWidth = im.size[0]
-      self.imageHeight = im.size[1]
-      self.image.append(im.convert("RGBA").tostring())#"raw", "RGB", 0, -1))
-      print self.imageWidth, self.imageHeight, self.imageWidth * self.imageHeight*4, len(self.image)
-  
-    self.SetupOpenGL()
-  
-    glDisable(GL_CULL_FACE)
-    #         glEnable(GL_DEPTH_TEST)
-    #         glEnable(GL_NORMALIZE)
-    glShadeModel(GL_FLAT)
-    print 'GL_ARB_imaging', 'GL_ARB_imaging' in glGetString(GL_EXTENSIONS)
-    import OpenGL
-    print OpenGL.__version__
-  
-    self.ogl.tkRedraw()
-    self.ogl.mainloop()
+def main():
+    root = tk.Frame()
+    root.pack(expand=True, fill='both')
+    QuitButton = tk.Button(root, {'text':'Quit'})
+    QuitButton.bind('<ButtonRelease-1>', sys.exit)
+    QuitButton.pack()
+
+    filenames=['skyline/bg.png',
+               'skyline/cyc-lo-red.png',
+               'skyline/cyc-lo-grn.png',
+               ]
+    
+    scales = {} # filename : scale
+    for f in filenames:
+        scales[f] = tk.Scale(
+            root, label=f, from_=0, to=1, res=.05, orient='horiz',
+            command=lambda *args: ogl.newLevels(
+              levels=dict([(f, s.get()) for f,s in scales.items()])))
+        scales[f].pack()
+    ogl = Surface(root, filenames)
+    ogl.pack(side='top', expand=True, fill='both')
+
+    ogl.mainloop()
 
 if __name__ == '__main__':
-  Surface()
+    main()
                 
 demo = Surface