diff options
| -rw-r--r-- | renderer.py | 11 | ||||
| -rw-r--r-- | window.py | 77 |
2 files changed, 53 insertions, 35 deletions
diff --git a/renderer.py b/renderer.py index 01c9f3f..909ad2b 100644 --- a/renderer.py +++ b/renderer.py @@ -21,9 +21,6 @@ class ImageRenderer: # Setup transition self.transition = None - # State helper - self._state = None - def set_transition(self, transition_cls): self.transition = transition_cls(self) @@ -139,14 +136,14 @@ class ImageRenderer: glutSwapBuffers() - def draw_transition(self, tex_start, tex_end, win_w, win_h, delta_time, transition_time, transition_duration): + def draw_transition(self, tex_start, tex_end, win_w, win_h, delta_time, transition_time, transition_duration, reversed): assert self.transition, "No transition has been set" # Set the background color to black glClearColor(0.0, 0.0, 0.0, 1.0) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) - self.transition.draw(tex_start, tex_end, win_w, win_h, delta_time, transition_time, transition_duration) + self.transition.draw(tex_start, tex_end, win_w, win_h, delta_time, transition_time, transition_duration, reversed) glutSwapBuffers() @@ -155,12 +152,12 @@ class Transition(Protocol): def __init__(self, renderer): self.renderer = renderer - def draw(self, tex_start, tex_end, win_w, win_h, delta_time, transition_time, transition_duration): + def draw(self, tex_start, tex_end, win_w, win_h, delta_time, transition_time, transition_duration, reversed): pass class TransitionMix(Transition): - def draw(self, tex_start, tex_end, win_w, win_h, delta_time, transition_time, transition_duration): + def draw(self, tex_start, tex_end, win_w, win_h, delta_time, transition_time, transition_duration, reversed): # Update alpha value for fade effect alpha = transition_time / transition_duration if alpha > 1.0: @@ -19,8 +19,13 @@ class PixDisplay: self.win_h = 0 self.max_framerate = 30 - self.display_duration = 2.0 + self.image_duration = 2.0 self.transition_duration = 0.5 + self.auto_transition = True + self.transition_reverse = False + + self.tex = None + self.text_next = None @property def max_framerate(self): @@ -31,17 +36,19 @@ class PixDisplay: self._max_fps = max_fps # This is just for the getter since otherwise e.g. int(1000/int(1000/60)) would round to 62 self.frame_time = int(1000 / 60) # In ms - @property - def prev_texture_index(self): return self.current_texture_index - 1 + def increment_texture_index(self, increment): + if len(self.textures) < 2: + return - @property - def next_texture_index(self): return (self.current_texture_index + 1) % len(self.textures) + self.transition_reverse = increment < 0 - @property - def tex(self): return self.textures[self.current_texture_index] + self.tex_prev = self.textures[self.current_texture_index] + self.current_texture_index = (self.current_texture_index + increment) % len(self.textures) + self.tex = self.textures[self.current_texture_index] - @property - def tex_next(self): return self.textures[self.next_texture_index] + # Ensure textures are initialized + self.tex_prev.gl_init() + self.tex.gl_init() # Main display function def display(self): @@ -51,16 +58,14 @@ class PixDisplay: delta_time = current_time - self.last_time self.last_time = current_time - # Draw black window if no textures are available - if not self.textures: - glClearColor(0.0, 0.0, 0.0, 1.0) - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) - glutSwapBuffers() - return - - # Ensure textures are initialized - self.tex.gl_init() - self.tex_next.gl_init() + if not self.tex: + self.increment_texture_index(0) + # Draw black window if no textures are available + if not self.tex: + glClearColor(0.0, 0.0, 0.0, 1.0) + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) + glutSwapBuffers() + return # Progress image time self.image_time += delta_time @@ -70,30 +75,45 @@ class PixDisplay: self.win_w, self.win_h = glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT) # Draw static image except during a transition - if self.image_time <= self.display_duration: + if self.image_time < self.image_duration: # Avoid redraw unless window size has changed if self.win_w != old_win_w or self.win_h != old_win_h: - self.renderer.draw_static(self.tex, self.win_w, self.win_h, 1) + self.renderer.draw_static(self.tex, self.win_w, self.win_h, 1.0) return - # Draw transition - transition_time = self.image_time - self.display_duration + # Start drawing transition once image_time >= image_duration + if self.auto_transition: + self.increment_texture_index(1) + self.auto_transition = False - # Draw frame of transition, function will return True if the transition is complete - self.renderer.draw_transition(self.tex, self.tex_next, self.win_w, self.win_h, delta_time, transition_time, self.transition_duration) + transition_time = self.image_time - self.image_duration + + self.renderer.draw_transition(self.tex_prev, self.tex, self.win_w, self.win_h, delta_time, transition_time, self.transition_duration, self.transition_reverse) if transition_time >= self.transition_duration: self.image_time = 0 - self.current_texture_index = self.next_texture_index + self.auto_transition = True + # Limit framerate def timer(self, value): glutPostRedisplay() glutTimerFunc(self.frame_time, self.timer, 0) # Schedule next frame + def skip(self, increment): + self.auto_transition = False + self.increment_texture_index(increment) + self.image_time = self.image_duration + + def handle_special_key(self, key, x, y): + if key == GLUT_KEY_LEFT: + self.skip(-1) + elif key == GLUT_KEY_RIGHT: + self.skip(1) + # Initialization and main loop - def main(self): + def main(self, glut_args): # Initialize the window - glutInit(sys.argv) + glutInit(glut_args) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB) glutCreateWindow("Image Viewer with Fade Transition") glEnable(GL_TEXTURE_2D) @@ -117,5 +137,6 @@ class PixDisplay: # Run display glutDisplayFunc(self.display) glutTimerFunc(self.frame_time, self.timer, 0) + glutSpecialFunc(self.handle_special_key) glutMainLoop() |
