pyrogue/game/render.py

84 lines
2.8 KiB
Python

"""All rendering stuff"""
from tcod.sdl.video import new_window
from tcod.console import Console
from tcod.sdl.video import WindowFlags, Window
from tcod.render import SDLConsoleRender, SDLTilesetAtlas
from tcod.sdl.render import new_renderer, TextureAccess, Renderer, Texture
from tcod.tileset import Tileset
from tcod.event import Event, MouseState
import g
class Renderer():
foreground: Console
"""The foreground console"""
background: Console
"""The background console"""
console_render1: SDLConsoleRender
console_render2: SDLConsoleRender
"""The console renderer"""
sdl_window: Window
"""The SDL window"""
sdl_renderer: Renderer
"""The SDL renderer"""
target_texture: Texture
"""The final texture that is rendered"""
atlas: SDLTilesetAtlas
"""The tileset atlas"""
tileset: Tileset
"""The tileset to use"""
def __init__(self, w, h, tileset):
self.background = Console(w, h)
self.foreground = Console(w, h)
self.tileset = tileset
w, h = self.background.width * tileset.tile_width, self.background.height * tileset.tile_height
self.sdl_window = new_window(w,h, flags=WindowFlags.RESIZABLE)
self.sdl_renderer = new_renderer(self.sdl_window, target_textures=True)
self.target_texture = self.sdl_renderer.new_texture(w, h, access=TextureAccess.TARGET)
self.atlas = SDLTilesetAtlas(self.sdl_renderer, self.tileset)
self.console_render1 = SDLConsoleRender(atlas=self.atlas)
self.console_render2 = SDLConsoleRender(atlas=self.atlas)
def main_draw(self) -> None:
"""Render and present the active screen."""
if not g.screens:
return
self.background.clear()
self.foreground.clear()
self.foreground.rgba["bg"][:] = 0
self.foreground.rgba["fg"][:] = 0
g.screens[-1].on_draw()
bg_tex = self.console_render1.render(self.background)
bg_tex.blend_mode = 1
fg_tex = self.console_render2.render(self.foreground)
fg_tex.blend_mode = 1
with self.sdl_renderer.set_render_target(self.target_texture):
self.sdl_renderer.clear()
self.sdl_renderer.copy(bg_tex)
self.sdl_renderer.copy(fg_tex)
self.sdl_renderer.copy(self.target_texture)
self.sdl_renderer.present()
def convert_event(self, event: Event):
match event:
case MouseState(position=pos):
width, height = self.tileset.tile_width, self.tileset.tile_height
event.position = (pos[0]//width, pos[1]//height)
return event
def dim(self):
self.foreground.rgb["fg"] //= 4
self.foreground.rgb["bg"] //= 4
self.background.rgb["fg"] //= 4
self.background.rgb["bg"] //= 4