urgh... stuck with how to implement cursor/focus etc. Decided to try to integrate Nottui and Nottui_widgets directly istead of reinventing another wheel.
This commit is contained in:
119
boot_js.ml
119
boot_js.ml
@ -27,23 +27,20 @@ let scale_canvas (canvas : Dom_html.canvasElement Js.t) =
|
||||
canvas##.style##.width := width;
|
||||
canvas##.style##.height := height
|
||||
|
||||
let _ =
|
||||
let canvas =
|
||||
Js.Unsafe.coerce (Dom_html.getElementById_exn "canvas")
|
||||
in
|
||||
let webgl_initialize canvas =
|
||||
scale_canvas canvas;
|
||||
let webgl_ctx =
|
||||
(* Graphv requires a stencil buffer to work properly *)
|
||||
let attrs = WebGL.defaultContextAttributes in
|
||||
attrs##.stencil := Js._true;
|
||||
match
|
||||
WebGL.getContextWithAttributes canvas attrs |> Js.Opt.to_option
|
||||
with
|
||||
| None ->
|
||||
print_endline "Sorry your browser does not support WebGL";
|
||||
raise Exit
|
||||
| Some ctx -> ctx
|
||||
in
|
||||
(* Graphv requires a stencil buffer to work properly *)
|
||||
let attrs = WebGL.defaultContextAttributes in
|
||||
attrs##.stencil := Js._true;
|
||||
match
|
||||
WebGL.getContextWithAttributes canvas attrs |> Js.Opt.to_option
|
||||
with
|
||||
| None ->
|
||||
print_endline "Sorry your browser does not support WebGL";
|
||||
raise Exit
|
||||
| Some ctx -> ctx
|
||||
|
||||
let graphv_initialize webgl_ctx =
|
||||
let open NVG in
|
||||
let vg =
|
||||
create
|
||||
@ -53,55 +50,55 @@ let _ =
|
||||
(* File in this case is actually the CSS font name *)
|
||||
Text.create vg ~name:"sans" ~file:"sans" |> ignore;
|
||||
webgl_ctx##clearColor 0.3 0.3 0.32 1.;
|
||||
vg
|
||||
|
||||
(*
|
||||
let render ev =
|
||||
webgl_ctx##clear
|
||||
(webgl_ctx##._COLOR_BUFFER_BIT_
|
||||
lor webgl_ctx##._DEPTH_BUFFER_BIT_
|
||||
lor webgl_ctx##._STENCIL_BUFFER_BIT_);
|
||||
let device_ratio = Dom_html.window##.devicePixelRatio in
|
||||
begin_frame vg ~width:canvas##.width ~height:canvas##.height
|
||||
~device_ratio;
|
||||
Transform.scale vg ~x:device_ratio ~y:device_ratio;
|
||||
ignore Human.Panel.Ui.(panel vg Gg.P2.o test ev);
|
||||
(*
|
||||
Path.begin_ vg ;
|
||||
Path.rect vg ~x:40. ~y:40. ~w:320. ~h:320. ;
|
||||
set_fill_color vg ~color:Color.(rgba ~r:154 ~g:203 ~b:255 ~a:200) ;
|
||||
fill vg ;
|
||||
Transform.translate vg ~x:200. ~y:200. ;
|
||||
Transform.rotate vg ~angle:(time *. 0.0005) ;
|
||||
Text.set_font_face vg ~name:"sans" ;
|
||||
Text.set_size vg ~size:48. ;
|
||||
Text.set_align vg ~align:Align.(center lor middle) ;
|
||||
set_fill_color vg ~color:Color.white ;
|
||||
Text.text vg ~x:0. ~y:0. "Hello World!" ; *)
|
||||
NVG.end_frame vg
|
||||
let request_animation_frame () =
|
||||
let t, s = Lwt.wait () in
|
||||
let (_ : Dom_html.animation_frame_request_id) =
|
||||
Dom_html.window##requestAnimationFrame
|
||||
(Js.wrap_callback (fun (time : float) -> Lwt.wakeup s time))
|
||||
in
|
||||
Dom_html.window##requestAnimationFrame
|
||||
(Js.wrap_callback (fun _ -> render Human.Event.empty))
|
||||
|> ignore;*)
|
||||
t
|
||||
|
||||
let request_render canvas webgl_ctx vg
|
||||
(render : NVG.t -> ?time:float -> Gg.p2 -> Gg.p2 Lwt.t) =
|
||||
request_animation_frame () >>= fun time ->
|
||||
webgl_ctx##clear
|
||||
(webgl_ctx##._COLOR_BUFFER_BIT_
|
||||
lor webgl_ctx##._DEPTH_BUFFER_BIT_
|
||||
lor webgl_ctx##._STENCIL_BUFFER_BIT_);
|
||||
let device_ratio = Dom_html.window##.devicePixelRatio in
|
||||
NVG.begin_frame vg ~width:canvas##.width ~height:canvas##.height
|
||||
~device_ratio;
|
||||
NVG.Transform.scale vg ~x:device_ratio ~y:device_ratio;
|
||||
render vg ~time Gg.P2.o >>= fun _p ->
|
||||
(* Logs.debug (fun m -> m "Drawing finished at point: %a" Gg.V2.pp p); *)
|
||||
NVG.end_frame vg;
|
||||
Lwt.return_unit
|
||||
|
||||
let _ =
|
||||
let canvas =
|
||||
Js.Unsafe.coerce (Dom_html.getElementById_exn "canvas")
|
||||
in
|
||||
let webgl_ctx = webgl_initialize canvas in
|
||||
let vg = graphv_initialize webgl_ctx in
|
||||
let open Js_of_ocaml_lwt.Lwt_js_events in
|
||||
let page_var = Lwd.var Human.Panel.Ui.empty in
|
||||
|
||||
async (fun () ->
|
||||
buffered_loop (make_event Dom_html.Event.keydown)
|
||||
Dom_html.document (fun ev _ ->
|
||||
webgl_ctx##clear
|
||||
(webgl_ctx##._COLOR_BUFFER_BIT_
|
||||
lor webgl_ctx##._DEPTH_BUFFER_BIT_
|
||||
lor webgl_ctx##._STENCIL_BUFFER_BIT_);
|
||||
let device_ratio = Dom_html.window##.devicePixelRatio in
|
||||
begin_frame vg ~width:canvas##.width ~height:canvas##.height
|
||||
~device_ratio;
|
||||
Transform.scale vg ~x:device_ratio ~y:device_ratio;
|
||||
Human.Panel.Ui.(
|
||||
render_lwt vg Gg.P2.o
|
||||
(Human.Event_js.evt_of_jskey `Press ev))
|
||||
>>= fun p ->
|
||||
Logs.debug (fun m ->
|
||||
m "Drawing finished at point: %a" Gg.V2.pp p);
|
||||
NVG.end_frame vg;
|
||||
Lwt.return_unit))
|
||||
Human.Panel.Ui.boot_page >>= fun page ->
|
||||
Lwd.set page_var page;
|
||||
let render = Human.Panel.Ui.renderer page_var in
|
||||
request_render canvas webgl_ctx vg render >>= fun () ->
|
||||
buffered_loop
|
||||
(make_event Dom_html.Event.keydown)
|
||||
Dom_html.document
|
||||
Human.(
|
||||
fun ev _ ->
|
||||
Lwd.set page_var
|
||||
(Panel.Ui.handle_event (Lwd.peek page_var)
|
||||
(Event_js.evt_of_jskey `Press ev));
|
||||
request_render canvas webgl_ctx vg render))
|
||||
|
||||
(* Dom_html.document##.onkeydown
|
||||
:= Dom.handler (fun (evt : Dom_html.keyboardEvent Js.t) ->
|
||||
|
||||
Reference in New Issue
Block a user