CabinGame/Luxe/outline/renderer.wren
2020-09-03 17:31:23 +02:00

167 lines
4.5 KiB
Text

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 "luxe: events" for Events
import "math/math" for M
import "math/util" for Util
import "math/vector" for Vector
import "math/rect" for AABB
import "globals" for Globals
import "blocks/debug" for Holder
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() {
Globals["Renderer"] = 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)")
Globals["GameRect"] = AABB.new((_gameRes.x - pixel_width) / 2, _gameRes.y - pixel_width, pixel_width, pixel_width)
Globals["UiRect"] = AABB.new(0, 0, _gameRes.x, _gameRes.y - pixel_width)
var relGameRect = AABB.new(Globals["GameRect"].pos.y0() / _gameRes, Vector.new(pixel_width) / _gameRes)
Globals["RelativeGameRect"] = relGameRect
_desc.width = res.x
_desc.height = res.y
Image.redefine(_rt, _desc)
_texRect = AABB.new((window - _gameRes*_pixel_size)/2, _gameRes * _pixel_size)
events.emit(Renderer.on_change)
}
game_mouse(mouse_pos){
//this is super inflexible, help :(
var pixel_game_rect = Globals["GameRect"]
var game_rect = AABB.new(_texRect.min_x + pixel_game_rect.min_x * _pixel_size,
_texRect.min_y + pixel_game_rect.min_y * _pixel_size,
pixel_game_rect.width * _pixel_size, pixel_game_rect.width * _pixel_size)
var point = M.inv_lerp(game_rect.min, game_rect.max, mouse_pos)
//System.print(point)
return point
}
ui_mouse(mouse_pos){
//good chance this works by luck and is not exact
var window = AABB.new(0, 0, Render.window_w(), Render.window_h())
var screen = AABB.new(_texRect.min_x, Render.window_h() - _texRect.max_y, _texRect.width, _texRect.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)
} else if(ctx.path == "copy_to_screen") {
target_to_screen(ctx)
} else if(ctx.path == "clear"){
clear(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)
} //game_render_path
ui_render_path(ctx) {
var layer = RenderLayerDesc.new()
layer.dest.color[0].render_target = target
layer.dest.color[0].load_action = LoadAction.dont_care
layer.dest.depth.load_action = LoadAction.clear
ctx.layer_render("default", layer)
} //ui_render_path
target_to_screen(ctx){
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" : _texRect.pos_size_list,
"pass.image" : {
"image": target, //image resource name
"sampler": "nearest_clamp" //sampler state
},
}
ctx.layer_pass(out_pass)
}
clear(ctx){
var layer = RenderLayerDesc.new()
layer.dest.color[0].render_target = target
layer.dest.color[0].clear_color = [0,0,0,1]
layer.dest.color[0].load_action = LoadAction.clear
layer.dest.depth.load_action = LoadAction.clear
ctx.layer_render("default", layer)
}
} //Renderer