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

///|
#external
pub type NURBSVolume

///|
#module("@mizchi/three-mbt/parametric")
extern "js" fn NURBSVolume::ffi_create_NURBSVolume(
  degree_u : Int,
  degree_v : Int,
  degree_w : Int,
  knots_u : FixedArray[Double],
  knots_v : FixedArray[Double],
  knots_w : FixedArray[Double],
  points : FixedArray[FixedArray[FixedArray[Vector4]]],
) -> JsResult[NURBSVolume] = "nURBSVolumeChecked"

///|
pub fn NURBSVolume::NURBSVolume(
  degree_u : Int,
  degree_v : Int,
  degree_w : Int,
  knots_u : FixedArray[Double],
  knots_v : FixedArray[Double],
  knots_w : FixedArray[Double],
  points : FixedArray[FixedArray[FixedArray[Vector4]]],
) -> NURBSVolume raise ModelingError {
  match
    NURBSVolume::ffi_create_NURBSVolume(
      degree_u, degree_v, degree_w, knots_u, knots_v, knots_w, points,
    ).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn NURBSVolume::ffi_get_point(
  self : NURBSVolume,
  u : Double,
  v : Double,
  w : Double,
  target : Vector3,
) -> JsResult[Unit] =
  #| (self, u, v, w, target) => { try { return { ok: true, value: (() => self.getPoint(u, v, w, target))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSVolume::get_point(
  self : NURBSVolume,
  u : Double,
  v : Double,
  w : Double,
  target : Vector3,
) -> Unit raise ModelingError {
  match self.ffi_get_point(u, v, w, target).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
pub extern "js" fn NURBSVolume::degree_u(self : NURBSVolume) -> Int =
  #| (self) => self.degree1

///|
pub extern "js" fn NURBSVolume::knots_u(
  self : NURBSVolume,
) -> FixedArray[Double] =
  #| (self) => self.knots1.slice()

///|
pub extern "js" fn NURBSVolume::degree_v(self : NURBSVolume) -> Int =
  #| (self) => self.degree2

///|
pub extern "js" fn NURBSVolume::knots_v(
  self : NURBSVolume,
) -> FixedArray[Double] =
  #| (self) => self.knots2.slice()

///|
pub extern "js" fn NURBSVolume::degree_w(self : NURBSVolume) -> Int =
  #| (self) => self.degree3

///|
pub extern "js" fn NURBSVolume::knots_w(
  self : NURBSVolume,
) -> FixedArray[Double] =
  #| (self) => self.knots3.slice()

///|
pub extern "js" fn NURBSVolume::control_points(
  self : NURBSVolume,
) -> FixedArray[FixedArray[FixedArray[Vector4]]] =
  #| (self) => self.controlPoints.map(plane=>plane.map(row=>row.map(point=>point.clone())))

///|
extern "js" fn NURBSVolume::ffi_set_control_point(
  self : NURBSVolume,
  u : Int,
  v : Int,
  w : Int,
  point : Vector4,
) -> JsResult[Unit] =
  #| (self, u, v, w, point) => { try { return { ok: true, value: (() => { const target=self.controlPoints[u]?.[v]?.[w];if(!target||![point.x,point.y,point.z,point.w].every(Number.isFinite)||point.w<=0)throw new RangeError("Invalid control point or index");target.copy(point); })() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSVolume::set_control_point(
  self : NURBSVolume,
  u : Int,
  v : Int,
  w : Int,
  point : Vector4,
) -> Unit raise ModelingError {
  match self.ffi_set_control_point(u, v, w, point).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}