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

///|
#module("@mizchi/three-mbt/constructors")
pub extern "js" fn Quaternion::from_xyzw(
  x : Double,
  y : Double,
  z : Double,
  w : Double,
) -> Quaternion = "quaternion"

///|
pub extern "js" fn Quaternion::x(self : Quaternion) -> Double =
  #| (self) => self.x

///|
pub extern "js" fn Quaternion::y(self : Quaternion) -> Double =
  #| (self) => self.y

///|
pub extern "js" fn Quaternion::z(self : Quaternion) -> Double =
  #| (self) => self.z

///|
pub extern "js" fn Quaternion::w(self : Quaternion) -> Double =
  #| (self) => self.w

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

///|
pub extern "js" fn Quaternion::copy(
  self : Quaternion,
  other : Quaternion,
) -> Quaternion =
  #| (self, other) => self.copy(other)

///|
pub extern "js" fn Quaternion::equals(
  self : Quaternion,
  other : Quaternion,
) -> Bool =
  #| (self, other) => self.equals(other)

///|
pub extern "js" fn Quaternion::same_reference(
  self : Quaternion,
  other : Quaternion,
) -> Bool =
  #| (self, other) => self === other

///|
pub extern "js" fn Quaternion::set(
  self : Quaternion,
  x : Double,
  y : Double,
  z : Double,
  w : Double,
) -> Quaternion =
  #| (self, x, y, z, w) => self.set(x, y, z, w)

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

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

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

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

///|
pub extern "js" fn Quaternion::length(self : Quaternion) -> Double =
  #| (self) => self.length()

///|
pub extern "js" fn Quaternion::dot(
  self : Quaternion,
  other : Quaternion,
) -> Double =
  #| (self, other) => self.dot(other)

///|
pub extern "js" fn Quaternion::multiply(
  self : Quaternion,
  other : Quaternion,
) -> Quaternion =
  #| (self, other) => self.multiply(other)

///|
pub extern "js" fn Quaternion::premultiply(
  self : Quaternion,
  other : Quaternion,
) -> Quaternion =
  #| (self, other) => self.premultiply(other)

///|
pub extern "js" fn Quaternion::slerp(
  self : Quaternion,
  other : Quaternion,
  alpha : Double,
) -> Quaternion =
  #| (self, other, alpha) => self.slerp(other, alpha)

///|
pub extern "js" fn Quaternion::angle_to(
  self : Quaternion,
  other : Quaternion,
) -> Double =
  #| (self, other) => self.angleTo(other)

///|
pub extern "js" fn Quaternion::set_from_axis_angle(
  self : Quaternion,
  axis : Vector3,
  angle : Double,
) -> Quaternion =
  #| (self, axis, angle) => self.setFromAxisAngle(axis, angle)

///|
pub extern "js" fn Quaternion::set_from_euler(
  self : Quaternion,
  euler : Euler,
) -> Quaternion =
  #| (self, euler) => self.setFromEuler(euler)

///|
pub extern "js" fn Quaternion::set_from_rotation_matrix(
  self : Quaternion,
  matrix : Matrix4,
) -> Quaternion =
  #| (self, matrix) => self.setFromRotationMatrix(matrix)

///|
pub extern "js" fn Quaternion::from_array(
  self : Quaternion,
  values : FixedArray[Double],
  offset : Int,
) -> Quaternion =
  #| (self, values, offset) => self.fromArray(values, offset)

///|
pub extern "js" fn Quaternion::to_array(
  self : Quaternion,
) -> FixedArray[Double] =
  #| (self) => self.toArray()

///|
pub extern "js" fn Quaternion::to_array_into(
  self : Quaternion,
  values : FixedArray[Double],
  offset : Int,
) -> FixedArray[Double] =
  #| (self, values, offset) => self.toArray(values, offset)

///|
pub extern "js" fn Quaternion::set_from_unit_vectors(
  self : Quaternion,
  from : Vector3,
  to : Vector3,
) -> Quaternion =
  #| (self, from, to) => self.setFromUnitVectors(from, to)

///|
pub extern "js" fn Quaternion::rotate_towards(
  self : Quaternion,
  other : Quaternion,
  step : Double,
) -> Quaternion =
  #| (self, other, step) => self.rotateTowards(other, step)

///|
pub extern "js" fn Quaternion::length_squared(self : Quaternion) -> Double =
  #| (self) => self.lengthSq()

///|
pub extern "js" fn Quaternion::multiply_quaternions(
  self : Quaternion,
  a : Quaternion,
  b : Quaternion,
) -> Quaternion =
  #| (self, a, b) => self.multiplyQuaternions(a, b)

///|
pub extern "js" fn Quaternion::slerp_quaternions(
  self : Quaternion,
  a : Quaternion,
  b : Quaternion,
  t : Double,
) -> Quaternion =
  #| (self, a, b, t) => self.slerpQuaternions(a, b, t)

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

///|
pub extern "js" fn Quaternion::from_buffer_attribute(
  self : Quaternion,
  attribute : BufferAttribute,
  index : Int,
) -> Quaternion =
  #| (self, attribute, index) => self.fromBufferAttribute(attribute, index)

///|
#module("@mizchi/three-mbt/statics")
pub extern "js" fn Quaternion::slerp_flat(
  target : FixedArray[Double],
  target_offset : Int,
  a : FixedArray[Double],
  a_offset : Int,
  b : FixedArray[Double],
  b_offset : Int,
  t : Double,
) -> Unit = "Quaternion_slerp_flat"

///|
#module("@mizchi/three-mbt/statics")
pub extern "js" fn Quaternion::multiply_quaternions_flat(
  target : FixedArray[Double],
  target_offset : Int,
  a : FixedArray[Double],
  a_offset : Int,
  b : FixedArray[Double],
  b_offset : Int,
) -> FixedArray[Double] = "Quaternion_multiply_quaternions_flat"

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

///|
pub fn Quaternion::to_json(self : Quaternion) -> 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 Quaternion::ffi_to_json_string(
  self : Quaternion,
) -> JsResult[String] =
  #| (self) => { try { return { ok: true, value: (() => JSON.stringify(self.toJSON()))() }; } catch (error) { return { ok: false, error: String(error) }; } }

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