Mercurial > code > home > repos > light9
annotate lightsim/openglsim.py @ 463:60b49f6c2027
start porting lightsim to qt
author | drewp@bigasterisk.com |
---|---|
date | Mon, 01 Sep 2008 00:41:29 +0000 |
parents | 941cfe1e1691 |
children | f69ba5ac17c5 |
rev | line source |
---|---|
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
1 #!/usr/bin/python2.4 |
0 | 2 # see http://www.sgi.com/software/opengl/advanced97/notes/node57.html for accum notes |
3 | |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
4 from __future__ import division |
341 | 5 import sys, time |
345
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
6 import numarray as num |
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
7 import Tkinter as tk |
341 | 8 import Image |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
9 from louie import dispatcher |
463 | 10 |
11 from PyQt4 import QtCore, QtOpenGL | |
12 from OpenGL.GL import * | |
0 | 13 |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
14 def xxxdrawWithAlpha(imgString, w, h, alpha): |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
15 # this one should be faster because GL does the alpha adjust, but |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
16 # i don't think it works yet |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
17 |
345
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
18 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) |
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
19 |
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
20 glClear(GL_COLOR_BUFFER_BIT) |
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
21 #glBlendColor(1, 1, 1, mag) # needs ARB_imaging |
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
22 glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, imgString) |
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
23 |
463 | 24 class Surface(QtOpenGL.QGLWidget): |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
25 """widget that adds multiple image files together with adjustable scales""" |
463 | 26 def __init__(self, parent, filenames, width=512, height=270, |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
27 imgRescaleTo=None): |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
28 """ |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
29 imgRescaleTo can be a length of pixels to reduce all the input |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
30 images into. Try 64 for a low res drawing. |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
31 """ |
463 | 32 QtOpenGL.QGLWidget.__init__(self, parent) |
0 | 33 |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
34 self.levels = {} # filename : brightness |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
35 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
36 self.image = {} # filename : imgstr |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
37 for filename in filenames: |
463 | 38 print "open", filename |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
39 im = Image.open(filename) |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
40 if imgRescaleTo: |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
41 im.thumbnail((imgRescaleTo, imgRescaleTo)) |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
42 im = im.transpose(Image.FLIP_TOP_BOTTOM) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
43 self.imageWidth = im.size[0] |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
44 self.imageHeight = im.size[1] |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
45 self.image[filename] = im.convert("RGBA").tostring() |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
46 |
463 | 47 #self.set_centerpoint(0, 0, 0) |
48 | |
49 def initializeGL(self): | |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
50 glDisable(GL_CULL_FACE) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
51 glShadeModel(GL_FLAT) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
52 print 'GL_ARB_imaging', 'GL_ARB_imaging' in glGetString(GL_EXTENSIONS) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
53 import OpenGL |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
54 print OpenGL.__version__ |
463 | 55 |
56 # def minimumSizeHint(self): | |
57 # return QtCore.QSize(512, 512) | |
0 | 58 |
463 | 59 # def sizeHint(self): |
60 # return QtCore.QSize(512, 512) | |
61 | |
62 def paintGL(self): | |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
63 """you set self.levels to dict and call tkRedraw""" |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
64 assert 'GL_ARB_imaging' in glGetString(GL_EXTENSIONS).split() |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
65 start = time.time() |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
66 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
67 glClearColor(0.0, 0.0, 0.0, 0) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
68 glClear( GL_COLOR_BUFFER_BIT |GL_ACCUM_BUFFER_BIT) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
69 glEnable(GL_BLEND) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
70 glBlendFunc(GL_SRC_ALPHA, GL_ONE) # add |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
71 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
72 # l=glGenLists(1) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
73 # glNewList(l,GL_COMPILE) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
74 # glEndList() |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
75 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
76 # drawing to glAccum might be good |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
77 layerTimes = [] |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
78 for filename, mag in self.levels.items(): |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
79 t = time.time() |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
80 self.drawWithAlpha(self.image[filename], |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
81 self.imageWidth, self.imageHeight, mag) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
82 layerTimes.append(time.time() - t) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
83 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
84 dispatcher.send("status", key="redraw", |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
85 value="%.1fms" % ((time.time() - start) * 1000)) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
86 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
87 |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
88 def drawWithAlpha(self, imgString, w, h, alpha): |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
89 """without opengl extensions""" |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
90 if alpha == 0: |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
91 return |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
92 t = time.time() |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
93 ar = num.reshape(num.fromstring(imgString, dtype='uint8'), |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
94 (w * h, 4)) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
95 #print " tonum", time.time() - t |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
96 if alpha != 1: |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
97 ar[:,3] *= alpha |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
98 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
99 #print " scl", time.time() - t |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
100 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
101 # this might be a good way to scale the color channels too, |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
102 # but the blend might take two steps. Anyway, |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
103 # GL_CONSTANT_COLOR seems not to work, so i'm not exploring |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
104 # this right now. |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
105 #glBlendFunc(GL_CONSTANT_COLOR, GL_ONE) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
106 #glBlendColor(.8, .5, .5, .5) |
463 | 107 |
108 glPixelZoom(self.width() / w, self.height() / h) | |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
109 glDrawPixels(w, h, |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
110 GL_RGBA, GL_UNSIGNED_BYTE, ar.tostring()) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
111 #print " draw", time.time() - t |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
112 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
113 def newLevels(self, event=None, levels=None): |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
114 if levels != self.levels: |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
115 self.levels = levels |
463 | 116 self.updateGL() |
117 | |
118 | |
119 ## def mousePressEvent(self, event): | |
120 ## self.lastPos = QtCore.QPoint(event.pos()) | |
121 | |
122 ## def mouseMoveEvent(self, event): | |
123 ## dx = event.x() - self.lastPos.x() | |
124 ## dy = event.y() - self.lastPos.y() | |
125 ## rot = (.25*dy, .25*dx, 0) | |
126 ## if event.buttons() & QtCore.Qt.LeftButton: | |
127 ## self.emit(QtCore.SIGNAL("rotationChanged"), rot) | |
128 ## elif event.buttons() & QtCore.Qt.MidButton: | |
129 ## self.emit(QtCore.SIGNAL("camDistChanged"), .01*dy) | |
130 | |
131 ## self.lastPos = QtCore.QPoint(event.pos()) | |
132 | |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
133 def main(): |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
134 root = tk.Frame() |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
135 root.pack(expand=True, fill='both') |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
136 QuitButton = tk.Button(root, {'text':'Quit'}) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
137 QuitButton.bind('<ButtonRelease-1>', sys.exit) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
138 QuitButton.pack() |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
139 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
140 filenames=['skyline/bg.png', |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
141 'skyline/cyc-lo-red.png', |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
142 'skyline/cyc-lo-grn.png', |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
143 ] |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
144 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
145 scales = {} # filename : scale |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
146 for f in filenames: |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
147 scales[f] = tk.Scale( |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
148 root, label=f, from_=0, to=1, res=.05, orient='horiz', |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
149 command=lambda *args: ogl.newLevels( |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
150 levels=dict([(f, s.get()) for f,s in scales.items()]))) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
151 scales[f].pack() |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
152 ogl = Surface(root, filenames) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
153 ogl.pack(side='top', expand=True, fill='both') |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
154 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
155 ogl.mainloop() |
0 | 156 |
157 if __name__ == '__main__': | |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
158 main() |
0 | 159 |
160 demo = Surface |