changeset 341:f866d4dec57b

openglsim now mixes images
author drewp@bigasterisk.com
date Tue, 29 May 2007 18:20:15 +0000
parents 88352cff403d
children 2c782ca93e73
files lightsim/openglsim.py lightsim/sim2 lightsim/skyline/bg.png lightsim/skyline/cyc-lo-blu.png lightsim/skyline/cyc-lo-grn.png lightsim/skyline/cyc-lo-or.png lightsim/skyline/cyc-lo-red.png lightsim/skyline/layers.xcf
diffstat 8 files changed, 160 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/lightsim/openglsim.py	Sun Jun 18 22:20:10 2006 +0000
+++ b/lightsim/openglsim.py	Tue May 29 18:20:15 2007 +0000
@@ -1,38 +1,56 @@
 # see http://www.sgi.com/software/opengl/advanced97/notes/node57.html for accum notes
 
-import sys
-from Image import *
+import sys, time
+import numpy as num
 from OpenGL.GL import *
 from OpenGL.Tk import *
+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
+  
 
 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_ONE_MINUS_SRC_ALPHA)
+    glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA)
     l=glGenLists(1)
     glNewList(l,GL_COMPILE)
     glEndList()
 
 #    glDrawBuffer(GL_BACK)
                 
-    for x in range(1,2):
-
+    for x, img in enumerate(self.image):
       mag = self.scales[x].get()
       print "pic %i at %f" % (x,mag)
-      glClear(GL_COLOR_BUFFER_BIT)
-      glDrawPixels(self.imageWidth, self.imageHeight, GL_RGB, GL_UNSIGNED_BYTE, self.image[x])
+#      glClear(GL_COLOR_BUFFER_BIT)
+      #glBlendColor(1, 1, 1, mag) # needs ARB_imaging
+      drawWithAlpha(img, self.imageWidth, self.imageHeight, mag)
+
 
-      if x==0:
-        glAccum(GL_LOAD,mag)
-      else:
-        glAccum(GL_ACCUM,mag)
+##       if x==0:
+##         glAccum(GL_LOAD,mag)
+##       else:
+##         glAccum(GL_ACCUM,mag)
 
       # glAccum(GL_ADD,self.x)
       self.x=(self.x+.1)%2.0
-      print "return"
-      glAccum(GL_RETURN,1)
+##       glAccum(GL_RETURN,1)
 
   def SetupWindow(self):
     self.OglFrame = Frame()
@@ -43,7 +61,7 @@
   
   
   def SetupOpenGL(self):
-    self.ogl = Opengl(master=self.OglFrame, width = 270, height = 270, double = 1, depth = 0)
+    self.ogl = 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
@@ -60,11 +78,12 @@
     self.SetupWindow()
   
     self.image=[]
-    for filename in ('pic1.ppm','pic2.ppm'):
-      im = open(filename)
+    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.tostring("raw", "RGB", 0, -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()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lightsim/sim2	Tue May 29 18:20:15 2007 +0000
@@ -0,0 +1,123 @@
+#!/usr/bin/python2.4
+from __future__ import division
+import sys, time, math
+import Image, ImageFilter
+import Numeric as num
+from OpenGL import GL, GLUT, GLU
+from OpenGL.GL import *
+
+def openglSetup(width=512, height=256):
+    global cardList
+
+    glClearColor (0.0, 0.0, 0.0, 0.0)
+    glShadeModel (GL_SMOOTH)
+    glEnable(GL_COLOR_MATERIAL)
+
+    glLightfv(GL_LIGHT0, GL_AMBIENT, [0.0, 0.0, 0.0, 1.0])
+    glLightfv(GL_LIGHT0, GL_DIFFUSE, [1.0, 1.0, 1.0, 1.0])
+    glLightfv(GL_LIGHT0, GL_POSITION, [0.0, 3.0, 3.0, 0.0])
+    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, [0.2, 0.2, 0.2, 1.0])
+    glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, [0])
+
+    #glFrontFace(GL_CW)
+    glEnable(GL_LIGHTING)
+    glEnable(GL_LIGHT0)
+    #glEnable(GL_AUTO_NORMAL)
+    #glEnable(GL_NORMALIZE)
+    glEnable(GL_DEPTH_TEST) 
+
+
+    glViewport (0, 0, width, height)
+    glMatrixMode (GL_PROJECTION)
+    glLoadIdentity ()
+    glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0)
+    glMatrixMode (GL_MODELVIEW)
+
+    cardList = glGenLists(1)
+    glNewList(cardList, GL_COMPILE)
+    glColor3f(1,1,1)
+    glBegin(GL_QUADS)
+    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 0.0,  1.0)
+    glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 0.0,  1.0)
+    glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0,  1.0)
+    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0,  1.0)
+    glEnd()
+    glEndList()
+
+
+
+def imageCard(img):
+    """card facing +Z from -1<x<1 -1<y<1"""
+    textureData = img.convert(mode="RGBA").tostring()
+
+    glBindTexture(GL_TEXTURE_2D, 0)
+    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA,
+                  512, #multiImage.size()[0],
+                  256, #multiImage.size()[1],
+                  0,
+                  GL_RGBA, GL_UNSIGNED_BYTE, textureData)
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
+
+    glCallList(cardList)
+
+def setupDraw():
+    """per-frame setup"""
+    glClearColor(0.0, 0.0, 0.0, 0.0)
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
+    glLoadIdentity ()
+    GLU.gluLookAt (0.5, 0.5, 8.0,
+                   0.5, 0.5, 0.0,
+                   0.0, 1.0, 0.0)
+
+    glDisable(GL_TEXTURE_2D)
+
+correctFrameStart = None
+def drawFrame():
+    global correctFrameStart
+    t1 = time.time()
+    setupDraw()
+    
+    matching = False
+    glPushMatrix()
+    try:
+        glTranslatef(1, -.9, 3.2)
+        # flip to compensate for the camera facing the user
+        glScalef(-1, 1, 1)
+        
+        glDisable(GL_LIGHTING)
+        glEnable(GL_TEXTURE_2D)
+
+#        imageCard(Image.open("skyline/bg.png"))
+        imageCard(Image.open("skyline/cyc-lo-red.png"))
+
+##         if grab.lastFrame:
+##             imageCard(grab.lastFrame)
+##             glEnable(GL_LIGHTING)
+##             glDisable(GL_TEXTURE_2D)
+##             if grab.seenPose:
+##                 for colorName, pos in grab.seenPose.pos.items():
+##                     cube(color=(x / 255 for x in vision.colors[colorName]),
+##                          center=((1-pos[0]) * 2 - 1, pos[1] * 2 - 1, 1),
+##                          side=.1, wire=False)
+##                 matching = game.pose.compare(grab.seenPose)
+        glEnable(GL_LIGHTING)
+        glDisable(GL_TEXTURE_2D)
+    finally:
+        glPopMatrix()
+
+    
+    glFlush()
+    #print "draw", time.time() - t1
+
+GLUT.glutInit(sys.argv)
+window = GLUT.glutCreateWindow("sim2")
+openglSetup()
+GLUT.glutDisplayFunc(drawFrame)
+def menu(arg):
+    print "hi", arg
+GLUT.glutCreateMenu(menu)
+GLUT.glutAddMenuEntry("hi", 1)
+GLUT.glutAttachMenu(GLUT.GLUT_RIGHT_BUTTON)
+
+GLUT.glutMainLoop()
Binary file lightsim/skyline/bg.png has changed
Binary file lightsim/skyline/cyc-lo-blu.png has changed
Binary file lightsim/skyline/cyc-lo-grn.png has changed
Binary file lightsim/skyline/cyc-lo-or.png has changed
Binary file lightsim/skyline/cyc-lo-red.png has changed
Binary file lightsim/skyline/layers.xcf has changed