///|
#module("@mizchi/three-mbt/constructors")
pub extern "js" fn DataTexture::values(
  self : DataTexture,
) -> FixedArray[Double] = "dataTextureValues"

///|
pub extern "js" fn HDRLoader::load_async(
  self : HDRLoader,
  url : String,
) -> @js_async.Promise[DataTexture] =
  #| (self, url) => Promise.resolve().then(() => self.loadAsync(url))

///|
pub async fn HDRLoader::load(
  self : HDRLoader,
  url : String,
) -> DataTexture raise LoadError {
  self.load_async(url).wait() catch {
    error => raise LoadError(error.to_string())
  }
}

///|
extern "js" fn HDRLoader::parse_async(
  self : HDRLoader,
  bytes : Bytes,
) -> @js_async.Promise[DataTexture] =
  #| (self, bytes) => Promise.resolve().then(() => self.createDataTexture(bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)))

///|
pub async fn HDRLoader::parse(
  self : HDRLoader,
  bytes : Bytes,
) -> DataTexture raise LoadError {
  self.parse_async(bytes).wait() catch {
    error => raise LoadError(error.to_string())
  }
}

///|
pub extern "js" fn EXRLoader::load_async(
  self : EXRLoader,
  url : String,
) -> @js_async.Promise[DataTexture] =
  #| (self, url) => Promise.resolve().then(() => self.loadAsync(url))

///|
pub async fn EXRLoader::load(
  self : EXRLoader,
  url : String,
) -> DataTexture raise LoadError {
  self.load_async(url).wait() catch {
    error => raise LoadError(error.to_string())
  }
}

///|
extern "js" fn EXRLoader::parse_async(
  self : EXRLoader,
  bytes : Bytes,
) -> @js_async.Promise[DataTexture] =
  #| (self, bytes) => Promise.resolve().then(() => self.createDataTexture(bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)))

///|
pub async fn EXRLoader::parse(
  self : EXRLoader,
  bytes : Bytes,
) -> DataTexture raise LoadError {
  self.parse_async(bytes).wait() catch {
    error => raise LoadError(error.to_string())
  }
}

///|
extern "js" fn PMREMGenerator::from_scene_ffi(
  self : PMREMGenerator,
  scene : Scene,
  sigma : Double,
  near : Double,
  far : Double,
  size : Int,
  position : Vector3,
) -> WebGLRenderTarget =
  #| (self, scene, sigma, near, far, size, position) => self.fromScene(scene, sigma, near, far, {size, position})

///|
pub fn PMREMGenerator::from_scene(
  self : PMREMGenerator,
  scene : Scene,
  sigma? : Double = 0,
  near? : Double = 0.1,
  far? : Double = 100,
  size? : Int = 256,
  position? : Vector3 = Vector3(0, 0, 0),
) -> WebGLRenderTarget {
  self.from_scene_ffi(scene, sigma, near, far, size, position)
}