"""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