///|
#module("@mizchi/three-mbt/constructors")
extern "js" fn new_renderer(antialias : Bool, alpha : Bool) -> WebGLRenderer = "webGLRenderer"

///|
/// Requires a browser with WebGL2 support.
pub fn WebGLRenderer::WebGLRenderer(
  antialias? : Bool = true,
  alpha? : Bool = false,
) -> WebGLRenderer {
  new_renderer(antialias, alpha)
}

///|
#module("@mizchi/three-mbt/constructors")
extern "js" fn renderer_with_canvas(
  canvas : Canvas,
  antialias : Bool,
  alpha : Bool,
) -> WebGLRenderer = "webGLRendererWithCanvas"

///|
pub fn WebGLRenderer::with_canvas(
  canvas : Canvas,
  antialias? : Bool = true,
  alpha? : Bool = false,
) -> WebGLRenderer {
  renderer_with_canvas(canvas, antialias, alpha)
}

///|
extern "js" fn WebGLRenderer::set_size_ffi(
  self : WebGLRenderer,
  width : Int,
  height : Int,
  update_style : Bool,
) -> Unit =
  #| (self, width, height, update_style) => self.setSize(width, height, update_style)

///|
pub fn WebGLRenderer::set_size(
  self : WebGLRenderer,
  width : Int,
  height : Int,
  update_style? : Bool = true,
) -> Unit {
  self.set_size_ffi(width, height, update_style)
}

///|
extern "js" fn canvas_from_id(id : String) -> Nullable[Canvas] =
  #| id => { const element = document.getElementById(id); return element instanceof HTMLCanvasElement ? element : null; }

///|
pub fn Canvas::from_id(id : String) -> Canvas? {
  canvas_from_id(id).to_option()
}

///|
pub extern "js" fn Canvas::Canvas() -> Canvas =
  #| () => document.createElement('canvas')