import "luxe: render" for Render, RenderLayerDesc, PassLayerDesc, LoadAction import "luxe: render" for SortType, ImageDesc, ImageType, PixelFormat, Image import "luxe: math" for Math import "luxe: io" for IO import "globals" for ActiveRenderer import "math/vector" for Vector import "math/rect" for AABB import "blocks/debug" for Holder import "math/math" for M import "luxe: events" for Events class Renderer { target{ "scene" } static on_change{ "change" } static pixel_width{128} pixel_width{Renderer.pixel_width} res{_gameRes} width{_gameRes.x} height{_gameRes.y} pixel_size{_pixel_size} events{_events} construct new() { ActiveRenderer.x = this _events = Events.new() _desc = ImageDesc.new() _desc.type = ImageType.image2D _desc.pixel_format = PixelFormat.rgba8Unorm _desc.width = pixel_width _desc.height = pixel_width _rt = Image.create(_desc) Render.define_resource(target, _rt) System.print("game / render / init / ok") } //new update_targets(){ var window = Vector.new(Render.window_w(), Render.window_h()) _pixel_size = (window.x / pixel_width).floor _gameRes = window / _pixel_size _gameRes = _gameRes - _gameRes % 2 System.print("game is now %(res.x) x %(res.y)") _desc.width = res.x _desc.height = res.y Image.redefine(_rt, _desc) _gameRect = AABB.new((window - res*_pixel_size)/2, res * _pixel_size) events.emit(Renderer.on_change) } game_mouse(mouse_pos){ var window = AABB.new(0, 0, Render.window_w(), Render.window_h()) var screen = AABB.new(_gameRect.min_x, Render.window_h() - _gameRect.max_y, _gameRect.width, _gameRect.height) //Y- mouse positions are the bane of my existance return M.remap(screen.min, screen.max, window.min, window.max, mouse_pos) } ready() { update_targets() IO.on("engine.runtime.window.size_changed") {|type, data| update_targets() } } tick(delta) { } render_path(ctx) { if(ctx.path == "game") { game_render_path(ctx) } else if(ctx.path == "ui") { ui_render_path(ctx) } } //render_path game_render_path(ctx) { var layer = RenderLayerDesc.new() layer.dest.color[0].render_target = target layer.dest.color[0].clear_color = ctx.get("clear_color", [1,1,1,1]) layer.dest.color[0].load_action = LoadAction.clear layer.dest.depth.load_action = LoadAction.clear ctx.layer_render("default", layer) var out_pass = PassLayerDesc.new() out_pass.library = "shaders/upscale" out_pass.function = "upscale_top_center" out_pass.targets = ["screen"] out_pass.inputs = { "pass.flipy" : true, "pass.rect" : _gameRect.pos_size_list, "pass.image" : { "image": target, //image resource name "sampler": "nearest_clamp" //sampler state }, } ctx.layer_pass(out_pass) } //game_render_path ui_render_path(ctx) { var layer = RenderLayerDesc.new() layer.dest.color[0].load_action = LoadAction.dont_care layer.dest.depth.load_action = LoadAction.clear ctx.layer_render("default", layer) } //ui_render_path } //Renderer