84 lines
2.8 KiB
Python
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
|