Module View
[hide private]
[frames] | no frames]

Source Code for Module View

  1  ##################################################################### 
  2  # -*- coding: iso-8859-1 -*-                                        # 
  3  #                                                                   # 
  4  # Frets on Fire                                                     # 
  5  # Copyright (C) 2006 Sami Kyöstilä                                  # 
  6  #                                                                   # 
  7  # This program is free software; you can redistribute it and/or     # 
  8  # modify it under the terms of the GNU General Public License       # 
  9  # as published by the Free Software Foundation; either version 2    # 
 10  # of the License, or (at your option) any later version.            # 
 11  #                                                                   # 
 12  # This program is distributed in the hope that it will be useful,   # 
 13  # but WITHOUT ANY WARRANTY; without even the implied warranty of    # 
 14  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     # 
 15  # GNU General Public License for more details.                      # 
 16  #                                                                   # 
 17  # You should have received a copy of the GNU General Public License # 
 18  # along with this program; if not, write to the Free Software       # 
 19  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,        # 
 20  # MA  02110-1301, USA.                                              # 
 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   
31 -class Layer(Task):
32 - def render(self, visibility, topMost):
33 pass
34
35 - def shown(self):
36 pass
37
38 - def hidden(self):
39 pass
40
41 - def run(self, ticks):
42 pass
43
44 - def isBackgroundLayer(self):
45 return False
46
47 -class BackgroundLayer(Layer):
48 - def isBackgroundLayer(self):
49 return True
50
51 -class View(Task):
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
66 - def pushLayer(self, layer):
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
80 - def topLayer(self):
81 layers = list(self.layers) 82 layers.reverse() 83 for layer in layers: 84 if layer not in self.outgoing: 85 return layer
86
87 - def popLayer(self, layer):
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
95 - def popAllLayers(self):
96 Log.debug("View: Pop all") 97 [self.popLayer(l) for l in list(self.layers)]
98
99 - def isTransitionInProgress(self):
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
132 - def setOrthogonalProjection(self, normalize = True, yIsDown = True):
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 # aspect ratio correction 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
155 - def resetProjection(self):
156 glMatrixMode(GL_PROJECTION) 157 glPopMatrix() 158 glMatrixMode(GL_MODELVIEW) 159 glPopMatrix()
160
161 - def setGeometry(self, geometry):
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
172 - def resetGeometry(self):
173 assert self.savedGeometry 174 175 self.savedGeometry, geometry = None, self.savedGeometry 176 self.geometry = geometry 177 glViewport(*geometry) 178 glScissor(*geometry)
179
180 - def render(self):
181 #print [(str(m.__class__), v) for m, v in self.visibility.items()] 182 for layer in self.layers: 183 layer.render(self.visibility[layer], layer == self.layers[-1])
184