diff pytouhou/ui/gamerunner.pyx @ 459:6e733ed817bd

Move every rendering function from gamerunner to gamerenderer.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Fri, 06 Sep 2013 22:35:54 +0200
parents 1b56d62250ab
children 11708a1d0a1a
line wrap: on
line diff
--- a/pytouhou/ui/gamerunner.pyx
+++ b/pytouhou/ui/gamerunner.pyx
@@ -14,37 +14,23 @@
 
 from pytouhou.lib cimport sdl
 
-from pytouhou.lib.opengl cimport \
-         (glMatrixMode, glEnable, glDisable, glViewport, glScissor,
-          glLoadMatrixf, glGenBuffers, glDeleteBuffers, GL_MODELVIEW,
-          GL_FOG, GL_SCISSOR_TEST, glClear, GL_DEPTH_BUFFER_BIT)
-
-from pytouhou.utils.helpers import get_logger
-from pytouhou.utils.maths cimport perspective, setup_camera, ortho_2d
-
 from .window cimport Window
 from .gamerenderer cimport GameRenderer
-from .background import BackgroundRenderer
 from .music import MusicPlayer, SFXPlayer, NullPlayer
-from .shaders.eosd import GameShader, BackgroundShader
-
-from collections import namedtuple
-Rect = namedtuple('Rect', 'x y w h')
-Color = namedtuple('Color', 'r g b a')
-
-logger = get_logger(__name__)
 
 
-cdef class GameRunner(GameRenderer):
+cdef class GameRunner:
+    cdef object game, background
+    cdef GameRenderer renderer
     cdef Window window
     cdef object replay_level, save_keystates
     cdef long width, height, keystate
-    cdef bint skip
+    cdef bint skip, use_fixed_pipeline
 
     def __init__(self, window, resource_loader, bint skip=False):
         self.use_fixed_pipeline = window.use_fixed_pipeline #XXX
 
-        GameRenderer.__init__(self, resource_loader)
+        self.renderer = GameRenderer(resource_loader, self.use_fixed_pipeline)
 
         self.window = window
         self.replay_level = None
@@ -54,21 +40,13 @@ cdef class GameRunner(GameRenderer):
         self.width = window.width #XXX
         self.height = window.height #XXX
 
-        if not self.use_fixed_pipeline:
-            self.game_shader = GameShader()
-            self.background_shader = BackgroundShader()
-            self.interface_shader = self.game_shader
-
 
     def load_game(self, game=None, background=None, bgms=None, replay=None, save_keystates=None):
         self.game = game
         self.background = background
 
-        self.texture_manager.load(game.resource_loader.instanced_anms.values())
-
-        if background:
-            self.background_renderer = BackgroundRenderer(self.use_fixed_pipeline)
-            self.background_renderer.prerender(background)
+        self.renderer.texture_manager.load(game.resource_loader.instanced_anms.values())
+        self.renderer.load_background(background)
 
         self.set_input(replay)
         if replay and replay.levels[game.stage - 1]:
@@ -98,16 +76,13 @@ cdef class GameRunner(GameRenderer):
 
 
     def start(self):
-        width = self.game.interface.width if self.game else 640
-        height = self.game.interface.height if self.game else 480
-        if (width, height) != (self.width, self.height):
+        cdef long width, height
+        width = self.game.interface.width if self.game is not None else 640
+        height = self.game.interface.height if self.game is not None else 480
+        if width != self.width or height != self.height:
             self.window.set_size(width, height)
 
-        self.proj = perspective(30, float(self.game.width) / float(self.game.height),
-                                101010101./2010101., 101010101./10101.)
-        game_view = setup_camera(0, 0, 1)
-        self.game_mvp = game_view * self.proj
-        self.interface_mvp = ortho_2d(0., float(self.width), float(self.height), 0.)
+        self.renderer.start(self.game)
 
 
     def finish(self):
@@ -166,88 +141,7 @@ cdef class GameRunner(GameRenderer):
                 self.save_keystates.append(keystate)
 
             self.game.run_iter(keystate)
+            self.game.interface.labels['framerate'].set_text('%.2ffps' % self.window.get_fps())
         if not self.skip:
-            self.render_game()
-            self.render_text()
-            self.render_interface()
+            self.renderer.render(self.game)
         return True
-
-
-    def render_game(self):
-        # Switch to game projection
-        #TODO: move that to GameRenderer?
-        x, y = self.game.interface.game_pos
-        glViewport(x, y, self.game.width, self.game.height)
-        glClear(GL_DEPTH_BUFFER_BIT)
-        glScissor(x, y, self.game.width, self.game.height)
-        glEnable(GL_SCISSOR_TEST)
-
-        GameRenderer.render(self)
-
-        glDisable(GL_SCISSOR_TEST)
-
-        if self.game.msg_runner:
-            rect = Rect(48, 368, 288, 48)
-            color1 = Color(0, 0, 0, 192)
-            color2 = Color(0, 0, 0, 128)
-            self.render_quads([rect], [(color1, color1, color2, color2)], 0)
-
-
-    def render_text(self):
-        if self.font_manager is None:
-            return
-
-        labels = [label for label in self.game.texts + self.game.native_texts if label is not None]
-        self.font_manager.load(labels)
-
-        black = Color(0, 0, 0, 255)
-
-        for label in labels:
-            if label is None:
-                continue
-
-            rect = Rect(label.x, label.y, label.width, label.height)
-            gradient = [Color(*color, a=label.alpha) for color in label.gradient]
-
-            if label.shadow:
-                shadow_rect = Rect(label.x + 1, label.y + 1, label.width, label.height)
-                shadow = [black._replace(a=label.alpha)] * 4
-                self.render_quads([shadow_rect, rect], [shadow, gradient], label.texture)
-            else:
-                self.render_quads([rect], [gradient], label.texture)
-
-
-    def render_interface(self):
-        elements = []
-        interface = self.game.interface
-        interface.labels['framerate'].set_text('%.2ffps' % self.window.get_fps())
-
-        if self.use_fixed_pipeline:
-            glMatrixMode(GL_MODELVIEW)
-            glLoadMatrixf(self.interface_mvp.data)
-            glDisable(GL_FOG)
-        else:
-            self.interface_shader.bind()
-            self.interface_shader.uniform_matrix('mvp', self.interface_mvp)
-        glViewport(0, 0, self.width, self.height)
-
-        items = [item for item in interface.items if item.anmrunner and item.anmrunner.running]
-        labels = interface.labels.values()
-
-        if items:
-            # Redraw all the interface
-            elements.extend(items)
-        else:
-            # Redraw only changed labels
-            labels = [label for label in labels if label.changed]
-
-        elements.extend(interface.level_start)
-
-        if self.game.boss:
-            elements.extend(interface.boss_items)
-
-        elements.extend(labels)
-        self.render_elements(elements)
-        for label in labels:
-            label.changed = False
-