-module(fluo@window). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/fluo/window.gleam"). -export([window_should_close/1, poll_events/1, keys_down/1, mouse_position/1, mouse_delta/1, swap/2, delta/1, create_window/3, present/1, width/1, height/1, title/1, color/1, depth/1, loop/3]). -export_type([window/0, key/0, position/0, context/1]). -opaque window() :: {window, integer(), integer(), binary(), fluo@image:color_image(), fluo@image:depth_image(), gleam@dynamic:dynamic_()}. -type key() :: key_a | key_b | key_c | key_d | key_e | key_f | key_g | key_h | key_i | key_j | key_k | key_l | key_m | key_n | key_o | key_p | key_q | key_r | key_s | key_t | key_u | key_v | key_w | key_x | key_y | key_z | arrow_up | arrow_down | arrow_left | arrow_right | enter | space | backspace | tab | l_shift | r_shift | l_ctrl | r_ctrl | l_alt | r_alt. -type position() :: {position, float(), float()}. -type context(DRA) :: {context, fun((fluo@render:renderer(), fluo@mesh:mesh(), DRA) -> nil), float(), list(key()), position(), position(), integer(), integer(), fluo@image:color_image(), fluo@image:depth_image(), binary()}. -file("src/fluo/window.gleam", 71). -spec window_should_close(window()) -> boolean(). window_should_close(Window) -> fluo_nif:window_should_close(Window). -file("src/fluo/window.gleam", 74). -spec poll_events(window()) -> nil. poll_events(Window) -> fluo_nif:window_poll_events(Window). -file("src/fluo/window.gleam", 77). -spec keys_down(window()) -> list(key()). keys_down(Window) -> fluo_nif:window_keys_down(Window). -file("src/fluo/window.gleam", 80). -spec mouse_position(window()) -> position(). mouse_position(Window) -> fluo_nif:window_mouse_pos(Window). -file("src/fluo/window.gleam", 83). -spec mouse_delta(window()) -> position(). mouse_delta(Window) -> fluo_nif:window_mouse_delta(Window). -file("src/fluo/window.gleam", 86). -spec swap(window(), fluo@image:color_image()) -> nil. swap(Window, Color) -> fluo_nif:swap_buffers(Window, Color). -file("src/fluo/window.gleam", 89). -spec delta(window()) -> float(). delta(Window) -> fluo_nif:window_delta_time(Window). -file("src/fluo/window.gleam", 91). -spec create_window(binary(), integer(), integer()) -> window(). create_window(Title, Width, Height) -> Handle = fluo_nif:create_window(Title, Width, Height), Color = fluo@image:create_color_image(Width, Height), Depth = fluo@image:create_depth_image(Width, Height), {window, Width, Height, Title, Color, Depth, Handle}. -file("src/fluo/window.gleam", 103). -spec present(window()) -> nil. present(Window) -> fluo_nif:swap_buffers(Window, erlang:element(5, Window)). -file("src/fluo/window.gleam", 107). -spec width(window()) -> integer(). width(Window) -> erlang:element(2, Window). -file("src/fluo/window.gleam", 111). -spec height(window()) -> integer(). height(Window) -> erlang:element(3, Window). -file("src/fluo/window.gleam", 115). -spec title(window()) -> binary(). title(Window) -> erlang:element(4, Window). -file("src/fluo/window.gleam", 119). -spec color(window()) -> fluo@image:color_image(). color(Window) -> erlang:element(5, Window). -file("src/fluo/window.gleam", 123). -spec depth(window()) -> fluo@image:depth_image(). depth(Window) -> erlang:element(6, Window). -file("src/fluo/window.gleam", 142). -spec loop(window(), DRC, fun((context(any()), DRC) -> DRC)) -> nil. loop(Window, State, Callback) -> case fluo_nif:window_should_close(Window) of true -> nil; false -> fluo_nif:start_rendering(), fluo_nif:window_poll_events(Window), Delta = fluo_nif:window_delta_time(Window), Keys_down = fluo_nif:window_keys_down(Window), Mouse_pos = fluo_nif:window_mouse_pos(Window), Mouse_delta = fluo_nif:window_mouse_delta(Window), Draw = fun(Renderer, Mesh, Params) -> Color = {some, erlang:element(5, Window)}, Depth = {some, erlang:element(6, Window)}, fluo_nif:draw_mesh(Renderer, Mesh, Params, Color, Depth) end, Ctx = {context, Draw, Delta, Keys_down, Mouse_pos, Mouse_delta, erlang:element(2, Window), erlang:element(3, Window), erlang:element(5, Window), erlang:element(6, Window), erlang:element(4, Window)}, State@1 = Callback(Ctx, State), fluo_nif:end_rendering(), present(Window), loop(Window, State@1, Callback) end.