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

///|
#external
pub type Skeleton

///|
#module("@mizchi/three-mbt/constructors")
pub extern "js" fn Skeleton::Skeleton(bones : FixedArray[Bone]) -> Skeleton = "skeleton"

///|
pub extern "js" fn Skeleton::bones(self : Skeleton) -> FixedArray[Bone] =
  #| (self) => self.bones.slice()

///|
pub extern "js" fn Skeleton::pose(self : Skeleton) -> Unit =
  #| (self) => self.pose()

///|
pub extern "js" fn Skeleton::update(self : Skeleton) -> Unit =
  #| (self) => self.update()

///|
pub extern "js" fn Skeleton::dispose(self : Skeleton) -> Unit =
  #| (self) => self.dispose()

///|
extern "js" fn Skeleton::ffi_get_bone_by_name(
  self : Skeleton,
  name : String,
) -> Nullable[Bone] =
  #| (self, name) => self.getBoneByName(name)

///|
pub fn Skeleton::get_bone_by_name(self : Skeleton, name : String) -> Bone? {
  self.ffi_get_bone_by_name(name).to_option()
}

///|
pub extern "js" fn Skeleton::uuid(self : Skeleton) -> String =
  #| (self) => self.uuid

///|
pub extern "js" fn Skeleton::frame(self : Skeleton) -> Int =
  #| (self) => self.frame

///|
pub extern "js" fn Skeleton::set_frame(self : Skeleton, value : Int) -> Unit =
  #| (self, value) => { self.frame = value; }

///|
pub extern "js" fn Skeleton::bone_inverses(
  self : Skeleton,
) -> FixedArray[Matrix4] =
  #| (self) => self.boneInverses.slice()

///|
extern "js" fn Skeleton::ffi_bone_matrices(
  self : Skeleton,
) -> Nullable[FixedArray[Double]] =
  #| (self) => self.boneMatrices ? Array.from(self.boneMatrices) : null

///|
pub fn Skeleton::bone_matrices(self : Skeleton) -> FixedArray[Double]? {
  self.ffi_bone_matrices().to_option()
}

///|
extern "js" fn Skeleton::ffi_bone_texture(
  self : Skeleton,
) -> Nullable[DataTexture] =
  #| (self) => self.boneTexture

///|
pub fn Skeleton::bone_texture(self : Skeleton) -> DataTexture? {
  self.ffi_bone_texture().to_option()
}

///|
pub extern "js" fn Skeleton::init(self : Skeleton) -> Unit =
  #| (self) => self.init()

///|
pub extern "js" fn Skeleton::calculate_inverses(self : Skeleton) -> Unit =
  #| (self) => self.calculateInverses()

///|
pub extern "js" fn Skeleton::compute_bone_texture(self : Skeleton) -> Skeleton =
  #| (self) => self.computeBoneTexture()

///|
pub extern "js" fn Skeleton::clone(self : Skeleton) -> Skeleton =
  #| (self) => self.clone()

///|
extern "js" fn Skeleton::ffi_to_json(self : Skeleton) -> JsResult[String] =
  #| (self) => { try { return { ok: true, value: (() => JSON.stringify(self.toJSON()))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn Skeleton::to_json(self : Skeleton) -> Json raise SerializationError {
  match self.ffi_to_json().into_result() {
    Ok(value) =>
      @json.parse(value) catch {
        error => raise SerializationError((error : Error).to_string())
      }
    Err(message) => raise SerializationError(message)
  }
}

///|
extern "js" fn Skeleton::ffi_to_json_string(
  self : Skeleton,
) -> JsResult[String] =
  #| (self) => { try { return { ok: true, value: (() => JSON.stringify(self.toJSON()))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn Skeleton::to_json_string(
  self : Skeleton,
) -> String raise SerializationError {
  match self.ffi_to_json_string().into_result() {
    Ok(value) => value
    Err(message) => raise SerializationError(message)
  }
}