Skip to content

Instantly share code, notes, and snippets.

@mbacarella
Created April 15, 2020 23:05
Show Gist options
  • Save mbacarella/163126e87638b718ffcfb8c1e9a3f60d to your computer and use it in GitHub Desktop.
Save mbacarella/163126e87638b718ffcfb8c1e9a3f60d to your computer and use it in GitHub Desktop.
rough translation of three.js hello world into ocaml (js_of_ocaml)
open Js_of_ocaml
let main () =
let doc = Dom_html.document in
let inner_width =
Js.Optdef.get Dom_html.window##.innerWidth (fun () -> 1000)
in
let inner_height =
Js.Optdef.get Dom_html.window##.innerHeight (fun () -> 500)
in
let three = Js.Unsafe.global##._THREE in
let scene_constr = three##._Scene in
let perspective_camera_constr = three##._PerspectiveCamera in
let renderer_constr = three##.WebGLRenderer in
let scene = new%js scene_constr in
let camera =
(new%js perspective_camera_constr) 75
(inner_width / inner_height) 0.1 1000
in
camera##.position##.z := 4;
let renderer =
let args = Js.Unsafe.js_expr "{ antialias: true }" in
(new%js renderer_constr) args
in
let cube =
let geometry_constr = three##._BoxGeometry in
let material_constr = three##._MeshBasicMaterial in
let mesh_constr = three##._Mesh in
let geometry = (new%js geometry_constr) 1 1 1 in
let material =
let args = Js.Unsafe.js_expr "{ color: \"#433F81\" }" in
(new%js material_constr) args
in
let cube = (new%js mesh_constr) geometry material in
cube
in
let requestAnimationFrame f =
Js.Unsafe.fun_call (Js.Unsafe.js_expr "requestAnimationFrame")
[| Js.Unsafe.inject f |]
in
let rec render () =
let () = requestAnimationFrame render in
cube##.rotation##.x := cube##.rotation##.x +. 0.01;
cube##.rotation##.y := cube##.rotation##.y +. 0.01;
renderer##render scene camera;
in
let _ = renderer##setClearColor (Js.string "#000000") in
let _ = renderer##setSize inner_width inner_height in
Dom.appendChild doc##.body renderer##.domElement;
let () = scene##add cube in
render ()
let () = main ()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment