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

///|
#external
pub type NURBSCurve

///|
#module("@mizchi/three-mbt/modeling-edit")
pub extern "js" fn NURBSCurve::NURBSCurve(
  degree : Int,
  knots : FixedArray[Double],
  control_points : FixedArray[Vector4],
) -> NURBSCurve = "nURBSCurve"

///|
pub fn NURBSCurve::as_curve3(self : NURBSCurve) -> Curve3 = "%identity"

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

///|
pub extern "js" fn NURBSCurve::knots(self : NURBSCurve) -> FixedArray[Double] =
  #| (self) => self.knots.slice()

///|
pub extern "js" fn NURBSCurve::control_points(
  self : NURBSCurve,
) -> FixedArray[Vector4] =
  #| (self) => self.controlPoints.slice()

///|
pub extern "js" fn NURBSCurve::start_knot(self : NURBSCurve) -> Int =
  #| (self) => self.startKnot

///|
pub extern "js" fn NURBSCurve::set_start_knot(
  self : NURBSCurve,
  value : Int,
) -> Unit =
  #| (self, value) => { self.startKnot = value; }

///|
pub extern "js" fn NURBSCurve::end_knot(self : NURBSCurve) -> Int =
  #| (self) => self.endKnot

///|
pub extern "js" fn NURBSCurve::set_end_knot(
  self : NURBSCurve,
  value : Int,
) -> Unit =
  #| (self, value) => { self.endKnot = value; }

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

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

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

///|
extern "js" fn NURBSCurve::ffi_from_json(
  self : NURBSCurve,
  json : String,
) -> JsResult[NURBSCurve] =
  #| (self, json) => { try { return { ok: true, value: (() => { self.fromJSON(JSON.parse(json)); self.updateArcLengths(); return self; })() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSCurve::from_json(
  self : NURBSCurve,
  json : Json,
) -> NURBSCurve raise SerializationError {
  match self.ffi_from_json(json.stringify()).into_result() {
    Ok(value) => value
    Err(message) => raise SerializationError(message)
  }
}

///|
extern "js" fn NURBSCurve::ffi_from_json_string(
  self : NURBSCurve,
  text : String,
) -> JsResult[NURBSCurve] =
  #| (self, text) => { try { return { ok: true, value: (() => { self.fromJSON(JSON.parse(text)); self.updateArcLengths(); return self; })() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn NURBSCurve::from_json_string(
  self : NURBSCurve,
  text : String,
) -> NURBSCurve raise SerializationError {
  match self.ffi_from_json_string(text).into_result() {
    Ok(value) => value
    Err(message) => raise SerializationError(message)
  }
}

///|
extern "js" fn NURBSCurve::ffi_get_point(
  self : NURBSCurve,
  t : Double,
  target : Vector3,
) -> Vector3 =
  #| (self, t, target) => self.getPoint(t, target)

///|
/// Passes target to the native method and preserves its return value. An omitted target is allocated per call.
pub fn NURBSCurve::get_point(
  self : NURBSCurve,
  t : Double,
  target? : Vector3 = Vector3(0, 0, 0),
) -> Vector3 {
  self.ffi_get_point(t, target)
}

///|
extern "js" fn NURBSCurve::ffi_get_point_at(
  self : NURBSCurve,
  u : Double,
  target : Vector3,
) -> Vector3 =
  #| (self, u, target) => self.getPointAt(u, target)

///|
/// Passes target to the native method and preserves its return value. An omitted target is allocated per call.
pub fn NURBSCurve::get_point_at(
  self : NURBSCurve,
  u : Double,
  target? : Vector3 = Vector3(0, 0, 0),
) -> Vector3 {
  self.ffi_get_point_at(u, target)
}

///|
extern "js" fn NURBSCurve::ffi_get_tangent(
  self : NURBSCurve,
  t : Double,
  target : Vector3,
) -> Vector3 =
  #| (self, t, target) => self.getTangent(t, target)

///|
/// Passes target to the native method and preserves its return value. An omitted target is allocated per call.
pub fn NURBSCurve::get_tangent(
  self : NURBSCurve,
  t : Double,
  target? : Vector3 = Vector3(0, 0, 0),
) -> Vector3 {
  self.ffi_get_tangent(t, target)
}

///|
extern "js" fn NURBSCurve::ffi_get_tangent_at(
  self : NURBSCurve,
  u : Double,
  target : Vector3,
) -> Vector3 =
  #| (self, u, target) => self.getTangentAt(u, target)

///|
/// Passes target to the native method and preserves its return value. An omitted target is allocated per call.
pub fn NURBSCurve::get_tangent_at(
  self : NURBSCurve,
  u : Double,
  target? : Vector3 = Vector3(0, 0, 0),
) -> Vector3 {
  self.ffi_get_tangent_at(u, target)
}

///|
pub extern "js" fn NURBSCurve::get_points(
  self : NURBSCurve,
  divisions : Int,
) -> FixedArray[Vector3] =
  #| (self, divisions) => self.getPoints(divisions)

///|
pub extern "js" fn NURBSCurve::get_spaced_points(
  self : NURBSCurve,
  divisions : Int,
) -> FixedArray[Vector3] =
  #| (self, divisions) => self.getSpacedPoints(divisions)

///|
pub extern "js" fn NURBSCurve::get_length(self : NURBSCurve) -> Double =
  #| (self) => self.getLength()

///|
pub extern "js" fn NURBSCurve::update_arc_lengths(self : NURBSCurve) -> Unit =
  #| (self) => self.updateArcLengths()

///|
pub extern "js" fn NURBSCurve::compute_frenet_frames(
  self : NURBSCurve,
  segments : Int,
  closed : Bool,
) -> FrenetFrames =
  #| (self, segments, closed) => self.computeFrenetFrames(segments, closed)