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

///|
#module("@mizchi/three-mbt/constructors")
pub extern "js" fn Vector2::Vector2(x : Double, y : Double) -> Vector2 = "vector2"

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

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

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

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

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

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

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

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

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

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

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

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

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

///|
pub extern "js" fn Vector2::multiply_scalar(
  self : Vector2,
  scalar : Double,
) -> Vector2 =
  #| (self, scalar) => self.multiplyScalar(scalar)

///|
pub extern "js" fn Vector2::divide_scalar(
  self : Vector2,
  scalar : Double,
) -> Vector2 =
  #| (self, scalar) => self.divideScalar(scalar)

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

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

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

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

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

///|
pub extern "js" fn Vector2::distance_to(
  self : Vector2,
  other : Vector2,
) -> Double =
  #| (self, other) => self.distanceTo(other)

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

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

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

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

///|
pub extern "js" fn Vector2::is_vector2(self : Vector2) -> Bool =
  #| (self) => self.isVector2

///|
pub extern "js" fn Vector2::set_x(self : Vector2, value : Double) -> Vector2 =
  #| (self, value) => self.setX(value)

///|
pub extern "js" fn Vector2::set_y(self : Vector2, value : Double) -> Vector2 =
  #| (self, value) => self.setY(value)

///|
pub extern "js" fn Vector2::set_component(
  self : Vector2,
  index : Int,
  value : Double,
) -> Vector2 =
  #| (self, index, value) => self.setComponent(index, value)

///|
pub extern "js" fn Vector2::get_component(
  self : Vector2,
  index : Int,
) -> Double =
  #| (self, index) => self.getComponent(index)

///|
pub extern "js" fn Vector2::set_scalar(
  self : Vector2,
  value : Double,
) -> Vector2 =
  #| (self, value) => self.setScalar(value)

///|
pub extern "js" fn Vector2::add_scalar(
  self : Vector2,
  value : Double,
) -> Vector2 =
  #| (self, value) => self.addScalar(value)

///|
pub extern "js" fn Vector2::sub_scalar(
  self : Vector2,
  value : Double,
) -> Vector2 =
  #| (self, value) => self.subScalar(value)

///|
pub extern "js" fn Vector2::set_length(
  self : Vector2,
  value : Double,
) -> Vector2 =
  #| (self, value) => self.setLength(value)

///|
pub extern "js" fn Vector2::add_vectors(
  self : Vector2,
  a : Vector2,
  b : Vector2,
) -> Vector2 =
  #| (self, a, b) => self.addVectors(a, b)

///|
pub extern "js" fn Vector2::sub_vectors(
  self : Vector2,
  a : Vector2,
  b : Vector2,
) -> Vector2 =
  #| (self, a, b) => self.subVectors(a, b)

///|
pub extern "js" fn Vector2::add_scaled_vector(
  self : Vector2,
  other : Vector2,
  scale : Double,
) -> Vector2 =
  #| (self, other, scale) => self.addScaledVector(other, scale)

///|
pub extern "js" fn Vector2::clamp(
  self : Vector2,
  min : Vector2,
  max : Vector2,
) -> Vector2 =
  #| (self, min, max) => self.clamp(min, max)

///|
pub extern "js" fn Vector2::clamp_scalar(
  self : Vector2,
  min : Double,
  max : Double,
) -> Vector2 =
  #| (self, min, max) => self.clampScalar(min, max)

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

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

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

///|
pub extern "js" fn Vector2::round_to_zero(self : Vector2) -> Vector2 =
  #| (self) => self.roundToZero()

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

///|
pub extern "js" fn Vector2::manhattan_length(self : Vector2) -> Double =
  #| (self) => self.manhattanLength()

///|
pub extern "js" fn Vector2::lerp_vectors(
  self : Vector2,
  a : Vector2,
  b : Vector2,
  alpha : Double,
) -> Vector2 =
  #| (self, a, b, alpha) => self.lerpVectors(a, b, alpha)

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

///|
pub extern "js" fn Vector2::clamp_length(
  self : Vector2,
  min : Double,
  max : Double,
) -> Vector2 =
  #| (self, min, max) => self.clampLength(min, max)

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

///|
pub extern "js" fn Vector2::distance_to_squared(
  self : Vector2,
  other : Vector2,
) -> Double =
  #| (self, other) => self.distanceToSquared(other)

///|
pub extern "js" fn Vector2::manhattan_distance_to(
  self : Vector2,
  other : Vector2,
) -> Double =
  #| (self, other) => self.manhattanDistanceTo(other)

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

///|
pub extern "js" fn Vector2::set_width(self : Vector2, value : Double) -> Unit =
  #| (self, value) => { self.width = value; }

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

///|
pub extern "js" fn Vector2::set_height(self : Vector2, value : Double) -> Unit =
  #| (self, value) => { self.height = value; }

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

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

///|
pub extern "js" fn Vector2::rotate_around(
  self : Vector2,
  center : Vector2,
  angle : Double,
) -> Vector2 =
  #| (self, center, angle) => self.rotateAround(center, angle)

///|
pub extern "js" fn Vector2::apply_matrix3(
  self : Vector2,
  matrix : Matrix3,
) -> Vector2 =
  #| (self, matrix) => self.applyMatrix3(matrix)

///|
/// Returns a fresh vector; leaves the receiver unchanged. Numeric behavior follows three.js.
pub extern "js" fn Vector2::scaled(self : Vector2, scalar : Double) -> Vector2 =
  #| (self, scalar) => self.clone().multiplyScalar(scalar)

///|
/// Returns a fresh vector; leaves the receiver unchanged. Numeric behavior follows three.js.
pub extern "js" fn Vector2::divided_by(
  self : Vector2,
  scalar : Double,
) -> Vector2 =
  #| (self, scalar) => self.clone().divideScalar(scalar)

///|
/// Returns a fresh vector without changing either operand. Binary operations are component-wise.
pub impl Add for Vector2 with fn add(self : Vector2, other : Vector2) -> Vector2 {
  self.clone().add(other)
}

///|
/// Returns a fresh vector without changing either operand. Binary operations are component-wise.
pub impl Sub for Vector2 with fn sub(self : Vector2, other : Vector2) -> Vector2 {
  self.clone().sub(other)
}

///|
/// Returns a fresh vector without changing either operand. Binary operations are component-wise.
pub impl Mul for Vector2 with fn mul(self : Vector2, other : Vector2) -> Vector2 {
  self.clone().multiply(other)
}

///|
/// Returns a fresh vector without changing either operand. Binary operations are component-wise.
pub impl Div for Vector2 with fn div(self : Vector2, other : Vector2) -> Vector2 {
  self.clone().divide(other)
}

///|
/// Returns a fresh vector without changing either operand. Binary operations are component-wise.
pub impl Neg for Vector2 with fn neg(self : Vector2) -> Vector2 {
  self.clone().negate()
}