// Generated by scripts/generate.mjs from bindings/api.mjs. Do not edit.

///|
#external
pub type SceneUtils

///|
#module("@mizchi/three-mbt/scene-tools")
pub extern "js" fn SceneUtils::SceneUtils() -> SceneUtils = "sceneUtils"

///|
pub extern "js" fn SceneUtils::batch_instance_ids(
  self : SceneUtils,
  batch : BatchedMesh,
) -> FixedArray[BatchedInstanceId] =
  #| (self, batch) => self.batchInstanceIds(batch)

///|
extern "js" fn SceneUtils::ffi_batch_geometry(
  self : SceneUtils,
  batch : BatchedMesh,
  id : BatchedGeometryId,
) -> JsResult[BufferGeometry] =
  #| (self, batch, id) => { try { return { ok: true, value: (() => self.batchGeometry(batch, id))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn SceneUtils::batch_geometry(
  self : SceneUtils,
  batch : BatchedMesh,
  id : BatchedGeometryId,
) -> BufferGeometry raise ModelingError {
  match self.ffi_batch_geometry(batch, id).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn SceneUtils::ffi_meshes_from_batch(
  self : SceneUtils,
  batch : BatchedMesh,
  only_visible : Bool,
) -> JsResult[Group] =
  #| (self, batch, only_visible) => { try { return { ok: true, value: (() => self.meshesFromBatch(batch, only_visible))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn SceneUtils::meshes_from_batch(
  self : SceneUtils,
  batch : BatchedMesh,
  only_visible : Bool,
) -> Group raise ModelingError {
  match self.ffi_meshes_from_batch(batch, only_visible).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn SceneUtils::ffi_meshes_from_instances(
  self : SceneUtils,
  mesh : InstancedMesh,
) -> JsResult[Group] =
  #| (self, mesh) => { try { return { ok: true, value: (() => self.meshesFromInstances(mesh))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn SceneUtils::meshes_from_instances(
  self : SceneUtils,
  mesh : InstancedMesh,
) -> Group raise ModelingError {
  match self.ffi_meshes_from_instances(mesh).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn SceneUtils::ffi_meshes_from_materials(
  self : SceneUtils,
  mesh : Mesh,
) -> JsResult[Group] =
  #| (self, mesh) => { try { return { ok: true, value: (() => self.meshesFromMaterials(mesh))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn SceneUtils::meshes_from_materials(
  self : SceneUtils,
  mesh : Mesh,
) -> Group raise ModelingError {
  match self.ffi_meshes_from_materials(mesh).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
pub extern "js" fn SceneUtils::multi_material_object(
  self : SceneUtils,
  geometry : BufferGeometry,
  materials : FixedArray[Material],
) -> Group =
  #| (self, geometry, materials) => self.createMultiMaterialObject(geometry, materials)

///|
pub extern "js" fn SceneUtils::sort_instances(
  self : SceneUtils,
  mesh : InstancedMesh,
  compare : (Int, Int) -> Int,
) -> Unit =
  #| (self, mesh, compare) => self.sortInstancedMesh(mesh, compare)

///|
extern "js" fn SceneUtils::ffi_uv_debug(
  self : SceneUtils,
  geometry : BufferGeometry,
  size : Int,
) -> JsResult[Canvas] =
  #| (self, geometry, size) => { try { return { ok: true, value: (() => self.uvDebug(geometry, size))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn SceneUtils::uv_debug(
  self : SceneUtils,
  geometry : BufferGeometry,
  size : Int,
) -> Canvas raise ModelingError {
  match self.ffi_uv_debug(geometry, size).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}