1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from __future__ import division
24 from OpenGL.GL import *
25 from OpenGL.GLU import *
26
27 import Log
28
29 from Task import Task
30
32 - def render(self, visibility, topMost):
34
37
40
41 - def run(self, ticks):
43
46
50
52 - def __init__(self, engine, geometry = None):
53 Task.__init__(self)
54 self.layers = []
55 self.incoming = []
56 self.outgoing = []
57 self.visibility = {}
58 self.transitionTime = 512.0
59 self.geometry = geometry or glGetIntegerv(GL_VIEWPORT)
60 self.savedGeometry = None
61 self.engine = engine
62 w = self.geometry[2] - self.geometry[0]
63 h = self.geometry[3] - self.geometry[1]
64 self.aspectRatio = float(w) / float(h)
65
67 Log.debug("View: Push: %s" % layer.__class__.__name__)
68
69 if not layer in self.layers:
70 self.layers.append(layer)
71 self.incoming.append(layer)
72 self.visibility[layer] = 0.0
73 layer.shown()
74 elif layer in self.outgoing:
75 layer.hidden()
76 layer.shown()
77 self.outgoing.remove(layer)
78 self.engine.addTask(layer)
79
81 layers = list(self.layers)
82 layers.reverse()
83 for layer in layers:
84 if layer not in self.outgoing:
85 return layer
86
88 Log.debug("View: Pop: %s" % layer.__class__.__name__)
89
90 if layer in self.incoming:
91 self.incoming.remove(layer)
92 if layer in self.layers and not layer in self.outgoing:
93 self.outgoing.append(layer)
94
98
100 return self.incoming or self.outgoing
101
102 - def run(self, ticks):
103 if not self.layers:
104 return
105
106 topLayer = self.topLayer()
107 t = ticks / self.transitionTime
108 for layer in list(self.layers):
109 if not layer in self.visibility:
110 continue
111 if layer in self.outgoing or (layer is not topLayer and not layer.isBackgroundLayer()):
112 if self.visibility[layer] > 0.0:
113 self.visibility[layer] = max(0.0, self.visibility[layer] - t)
114 else:
115 self.visibility[layer] = 0.0
116 if layer in self.outgoing:
117 self.outgoing.remove(layer)
118 self.layers.remove(layer)
119 del self.visibility[layer]
120 self.engine.removeTask(layer)
121 layer.hidden()
122 if layer in self.incoming:
123 self.incoming.remove(layer)
124 elif layer in self.incoming or layer is topLayer:
125 if self.visibility[layer] < 1.0:
126 self.visibility[layer] = min(1.0, self.visibility[layer] + t)
127 else:
128 self.visibility[layer] = 1.0
129 if layer in self.incoming:
130 self.incoming.remove(layer)
131
133 glMatrixMode(GL_PROJECTION)
134 glPushMatrix()
135 glLoadIdentity()
136
137 viewport = glGetIntegerv(GL_VIEWPORT)
138 if normalize:
139 w = viewport[2] - viewport[0]
140 h = viewport[3] - viewport[1]
141
142 h *= (float(w) / float(h)) / (4.0 / 3.0)
143 viewport = [0, 0, 1, h / w]
144
145 if yIsDown:
146 glOrtho(viewport[0], viewport[2] - viewport[0],
147 viewport[3] - viewport[1], viewport[1], -100, 100);
148 else:
149 glOrtho(viewport[0], viewport[2] - viewport[0],
150 viewport[1], viewport[3] - viewport[1], -100, 100);
151 glMatrixMode(GL_MODELVIEW);
152 glPushMatrix();
153 glLoadIdentity();
154
156 glMatrixMode(GL_PROJECTION)
157 glPopMatrix()
158 glMatrixMode(GL_MODELVIEW)
159 glPopMatrix()
160
162 viewport = glGetIntegerv(GL_VIEWPORT)
163 w = viewport[2] - viewport[0]
164 h = viewport[3] - viewport[1]
165 s = (w, h, w, h)
166
167 geometry = tuple([(type(coord) == float) and int(s[i] * coord) or int(coord) for i, coord in enumerate(geometry)])
168 self.savedGeometry, self.geometry = viewport, geometry
169 glViewport(*geometry)
170 glScissor(*geometry)
171
173 assert self.savedGeometry
174
175 self.savedGeometry, geometry = None, self.savedGeometry
176 self.geometry = geometry
177 glViewport(*geometry)
178 glScissor(*geometry)
179
181
182 for layer in self.layers:
183 layer.render(self.visibility[layer], layer == self.layers[-1])
184