CabinGame/Luxe/outline/renderer.wren

160 lines
4.3 KiB
Text
Raw Normal View History

2020-08-16 13:59:43 +00:00
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
2020-08-16 13:59:43 +00:00
import "math/vector" for Vector
import "math/rect" for AABB
import "globals" for Globals
2020-08-16 13:59:43 +00:00
import "blocks/debug" for Holder
class Renderer {
target{ "scene" }
2020-08-18 21:16:04 +00:00
static on_change{ "change" }
2020-08-16 13:59:43 +00:00
static pixel_width{128}
pixel_width{Renderer.pixel_width}
2020-08-18 21:16:04 +00:00
res{_gameRes}
width{_gameRes.x}
height{_gameRes.y}
pixel_size{_pixel_size}
events{_events}
2020-08-16 13:59:43 +00:00
construct new() {
Globals["Renderer"] = this
2020-08-16 13:59:43 +00:00
2020-08-18 21:16:04 +00:00
_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)
2020-08-16 13:59:43 +00:00
System.print("game / render / init / ok")
} //new
update_targets(){
2020-08-18 21:16:04 +00:00
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
2020-08-18 21:16:04 +00:00
_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)
2020-08-16 13:59:43 +00:00
}
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)
}
ui_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)
}
2020-08-16 13:59:43 +00:00
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)
2020-08-16 13:59:43 +00:00
}
} //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){
2020-08-16 13:59:43 +00:00
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)
}
2020-08-16 13:59:43 +00:00
clear(ctx){
2020-08-16 13:59:43 +00:00
var layer = RenderLayerDesc.new()
layer.dest.color[0].render_target = target
2020-08-29 06:14:01 +00:00
layer.dest.color[0].clear_color = [1,1,1,1]
layer.dest.color[0].load_action = LoadAction.clear
layer.dest.depth.load_action = LoadAction.clear
2020-08-16 13:59:43 +00:00
ctx.layer_render("default", layer)
}
2020-08-16 13:59:43 +00:00
} //Renderer