Mercurial > code > home > repos > light9
annotate lightsim/openglsim.py @ 353:941cfe1e1691
lightsim now reads levels from dmxserver
author | drewp@bigasterisk.com |
---|---|
date | Mon, 11 Jun 2007 00:53:16 +0000 |
parents | a08882a05d29 |
children | 60b49f6c2027 |
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 |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
10 try: |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
11 from OpenGL import Tk as Togl |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
12 from OpenGL.GL import * |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
13 except ImportError: |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
14 sys.path.append("/usr/lib/python2.4/site-packages/OpenGL/Tk/linux2-tk8.4") |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
15 from OpenGL.GL import * |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
16 import Togl |
341 | 17 |
0 | 18 |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
19 def xxxdrawWithAlpha(imgString, w, h, alpha): |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
20 # 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
|
21 # i don't think it works yet |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
22 |
345
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
23 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) |
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
24 |
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
25 glClear(GL_COLOR_BUFFER_BIT) |
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
26 #glBlendColor(1, 1, 1, mag) # needs ARB_imaging |
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
27 glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, imgString) |
839545f174d3
add drawPixels version
Drew Perttula <drewp@bigasterisk.com>
parents:
341
diff
changeset
|
28 |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
29 class Surface(Togl.Opengl): |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
30 """widget that adds multiple image files together with adjustable scales""" |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
31 def __init__(self, master, filenames, width=512, height=270, |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
32 imgRescaleTo=None): |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
33 """ |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
34 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
|
35 images into. Try 64 for a low res drawing. |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
36 """ |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
37 Togl.Opengl.__init__(self, master=master, width=width, |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
38 height=height, double=True, depth=0) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
39 self.width, self.height = width, height |
0 | 40 |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
41 self.levels = {} # filename : brightness |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
42 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
43 self.image = {} # filename : imgstr |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
44 for filename in filenames: |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
45 im = Image.open(filename) |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
46 if imgRescaleTo: |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
47 im.thumbnail((imgRescaleTo, imgRescaleTo)) |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
48 im = im.transpose(Image.FLIP_TOP_BOTTOM) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
49 self.imageWidth = im.size[0] |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
50 self.imageHeight = im.size[1] |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
51 self.image[filename] = im.convert("RGBA").tostring() |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
52 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
53 self.set_centerpoint(0, 0, 0) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
54 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
55 glDisable(GL_CULL_FACE) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
56 glShadeModel(GL_FLAT) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
57 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
|
58 import OpenGL |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
59 print OpenGL.__version__ |
0 | 60 |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
61 self.bind("<Configure>", self.configure) |
0 | 62 |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
63 def configure(self, ev): |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
64 self.width, self.height = ev.width, ev.height |
0 | 65 |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
66 def redraw(self, event=None): |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
67 """you set self.levels to dict and call tkRedraw""" |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
68 assert 'GL_ARB_imaging' in glGetString(GL_EXTENSIONS).split() |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
69 start = time.time() |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
70 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
71 glClearColor(0.0, 0.0, 0.0, 0) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
72 glClear( GL_COLOR_BUFFER_BIT |GL_ACCUM_BUFFER_BIT) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
73 glEnable(GL_BLEND) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
74 glBlendFunc(GL_SRC_ALPHA, GL_ONE) # add |
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 # l=glGenLists(1) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
77 # glNewList(l,GL_COMPILE) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
78 # glEndList() |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
79 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
80 # drawing to glAccum might be good |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
81 layerTimes = [] |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
82 for filename, mag in self.levels.items(): |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
83 #print "pic %s at %f" % (filename, mag) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
84 t = time.time() |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
85 self.drawWithAlpha(self.image[filename], |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
86 self.imageWidth, self.imageHeight, mag) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
87 layerTimes.append(time.time() - t) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
88 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
89 dispatcher.send("status", key="redraw", |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
90 value="%.1fms" % ((time.time() - start) * 1000)) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
91 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
92 |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
93 def drawWithAlpha(self, imgString, w, h, alpha): |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
94 """without opengl extensions""" |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
95 if alpha == 0: |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
96 return |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
97 t = time.time() |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
98 ar = num.reshape(num.fromstring(imgString, dtype='uint8'), |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
99 (w * h, 4)) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
100 #print " tonum", time.time() - t |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
101 if alpha != 1: |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
102 ar[:,3] *= alpha |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
103 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
104 #print " scl", time.time() - t |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
105 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
106 # 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
|
107 # but the blend might take two steps. Anyway, |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
108 # 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
|
109 # this right now. |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
110 #glBlendFunc(GL_CONSTANT_COLOR, GL_ONE) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
111 #glBlendColor(.8, .5, .5, .5) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
112 |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
113 glPixelZoom(self.width / w, self.height / h) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
114 glDrawPixels(w, h, |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
115 GL_RGBA, GL_UNSIGNED_BYTE, ar.tostring()) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
116 #print " draw", time.time() - t |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
117 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
118 def newLevels(self, event=None, levels=None): |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
119 if levels != self.levels: |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
120 self.levels = levels |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
346
diff
changeset
|
121 self.tkRedraw() |
0 | 122 |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
123 def main(): |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
124 root = tk.Frame() |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
125 root.pack(expand=True, fill='both') |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
126 QuitButton = tk.Button(root, {'text':'Quit'}) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
127 QuitButton.bind('<ButtonRelease-1>', sys.exit) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
128 QuitButton.pack() |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
129 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
130 filenames=['skyline/bg.png', |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
131 'skyline/cyc-lo-red.png', |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
132 'skyline/cyc-lo-grn.png', |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
133 ] |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
134 |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
135 scales = {} # filename : scale |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
136 for f in filenames: |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
137 scales[f] = tk.Scale( |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
138 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
|
139 command=lambda *args: ogl.newLevels( |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
140 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
|
141 scales[f].pack() |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
142 ogl = Surface(root, filenames) |
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
143 ogl.pack(side='top', expand=True, fill='both') |
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 ogl.mainloop() |
0 | 146 |
147 if __name__ == '__main__': | |
346
a08882a05d29
openglsim refactor. now dims a few lights
drewp@bigasterisk.com
parents:
345
diff
changeset
|
148 main() |
0 | 149 |
150 demo = Surface |