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

///|
#module("@mizchi/three-mbt/constructors")
pub extern "js" fn Object3D::Object3D() -> Object3D = "object3D"

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

///|
pub extern "js" fn Object3D::user_data(self : Object3D) -> UserData =
  #| (self) => self.userData

///|
pub extern "js" fn Object3D::layers(self : Object3D) -> Layers =
  #| (self) => self.layers

///|
pub extern "js" fn Object3D::cast_shadow(self : Object3D) -> Bool =
  #| (self) => self.castShadow

///|
pub extern "js" fn Object3D::set_cast_shadow(
  self : Object3D,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.castShadow = value; }

///|
pub extern "js" fn Object3D::receive_shadow(self : Object3D) -> Bool =
  #| (self) => self.receiveShadow

///|
pub extern "js" fn Object3D::set_receive_shadow(
  self : Object3D,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.receiveShadow = value; }

///|
pub extern "js" fn Object3D::frustum_culled(self : Object3D) -> Bool =
  #| (self) => self.frustumCulled

///|
pub extern "js" fn Object3D::set_frustum_culled(
  self : Object3D,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.frustumCulled = value; }

///|
pub extern "js" fn Object3D::render_order(self : Object3D) -> Int =
  #| (self) => self.renderOrder

///|
pub extern "js" fn Object3D::set_render_order(
  self : Object3D,
  value : Int,
) -> Unit =
  #| (self, value) => { self.renderOrder = value; }

///|
extern "js" fn Object3D::ffi_as_mesh(self : Object3D) -> Nullable[Mesh] =
  #| (self) => self.isMesh ? self : null

///|
pub fn Object3D::as_mesh(self : Object3D) -> Mesh? {
  self.ffi_as_mesh().to_option()
}

///|
extern "js" fn Object3D::ffi_as_skinned_mesh(
  self : Object3D,
) -> Nullable[SkinnedMesh] =
  #| (self) => self.isSkinnedMesh ? self : null

///|
pub fn Object3D::as_skinned_mesh(self : Object3D) -> SkinnedMesh? {
  self.ffi_as_skinned_mesh().to_option()
}

///|
extern "js" fn Object3D::ffi_as_camera(self : Object3D) -> Nullable[Camera] =
  #| (self) => self.isCamera ? self : null

///|
pub fn Object3D::as_camera(self : Object3D) -> Camera? {
  self.ffi_as_camera().to_option()
}

///|
extern "js" fn Object3D::ffi_as_light(self : Object3D) -> Nullable[Light] =
  #| (self) => self.isLight ? self : null

///|
pub fn Object3D::as_light(self : Object3D) -> Light? {
  self.ffi_as_light().to_option()
}

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

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

///|
pub extern "js" fn Object3D::kind(self : Object3D) -> String =
  #| (self) => self.type

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

///|
pub extern "js" fn Object3D::visible(self : Object3D) -> Bool =
  #| (self) => self.visible

///|
/// Returns the live three.js reference, not a copy.
pub extern "js" fn Object3D::position(self : Object3D) -> Vector3 =
  #| (self) => self.position

///|
/// Returns the live three.js reference, not a copy.
pub extern "js" fn Object3D::rotation(self : Object3D) -> Euler =
  #| (self) => self.rotation

///|
/// Returns the live three.js reference, not a copy.
pub extern "js" fn Object3D::quaternion(self : Object3D) -> Quaternion =
  #| (self) => self.quaternion

///|
/// Returns the live three.js reference, not a copy.
pub extern "js" fn Object3D::scale(self : Object3D) -> Vector3 =
  #| (self) => self.scale

///|
/// Returns the live three.js reference, not a copy.
pub extern "js" fn Object3D::up(self : Object3D) -> Vector3 =
  #| (self) => self.up

///|
/// Returns the live three.js reference, not a copy.
pub extern "js" fn Object3D::matrix(self : Object3D) -> Matrix4 =
  #| (self) => self.matrix

///|
/// Returns the live three.js reference, not a copy.
pub extern "js" fn Object3D::matrix_world(self : Object3D) -> Matrix4 =
  #| (self) => self.matrixWorld

///|
pub extern "js" fn Object3D::set_name(self : Object3D, name : String) -> Unit =
  #| (self, name) => { self.name = name; }

///|
pub extern "js" fn Object3D::set_visible(
  self : Object3D,
  visible : Bool,
) -> Unit =
  #| (self, visible) => { self.visible = visible; }

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

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

///|
pub extern "js" fn Object3D::remove(
  self : Object3D,
  child : Object3D,
) -> Object3D =
  #| (self, child) => self.remove(child)

///|
pub extern "js" fn Object3D::attach(
  self : Object3D,
  child : Object3D,
) -> Object3D =
  #| (self, child) => self.attach(child)

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

///|
pub extern "js" fn Object3D::remove_from_parent(self : Object3D) -> Object3D =
  #| (self) => self.removeFromParent()

///|
pub extern "js" fn Object3D::look_at(self : Object3D, target : Vector3) -> Unit =
  #| (self, target) => self.lookAt(target)

///|
pub extern "js" fn Object3D::rotate_x(
  self : Object3D,
  angle : Double,
) -> Object3D =
  #| (self, angle) => self.rotateX(angle)

///|
pub extern "js" fn Object3D::rotate_y(
  self : Object3D,
  angle : Double,
) -> Object3D =
  #| (self, angle) => self.rotateY(angle)

///|
pub extern "js" fn Object3D::rotate_z(
  self : Object3D,
  angle : Double,
) -> Object3D =
  #| (self, angle) => self.rotateZ(angle)

///|
pub extern "js" fn Object3D::translate_x(
  self : Object3D,
  distance : Double,
) -> Object3D =
  #| (self, distance) => self.translateX(distance)

///|
pub extern "js" fn Object3D::translate_y(
  self : Object3D,
  distance : Double,
) -> Object3D =
  #| (self, distance) => self.translateY(distance)

///|
pub extern "js" fn Object3D::translate_z(
  self : Object3D,
  distance : Double,
) -> Object3D =
  #| (self, distance) => self.translateZ(distance)

///|
pub extern "js" fn Object3D::apply_matrix4(
  self : Object3D,
  matrix : Matrix4,
) -> Unit =
  #| (self, matrix) => self.applyMatrix4(matrix)

///|
pub extern "js" fn Object3D::apply_quaternion(
  self : Object3D,
  quaternion : Quaternion,
) -> Object3D =
  #| (self, quaternion) => self.applyQuaternion(quaternion)

///|
pub extern "js" fn Object3D::update_matrix(self : Object3D) -> Unit =
  #| (self) => self.updateMatrix()

///|
pub extern "js" fn Object3D::update_matrix_world(
  self : Object3D,
  force : Bool,
) -> Unit =
  #| (self, force) => self.updateMatrixWorld(force)

///|
pub extern "js" fn Object3D::update_world_matrix(
  self : Object3D,
  update_parents : Bool,
  update_children : Bool,
) -> Unit =
  #| (self, update_parents, update_children) => self.updateWorldMatrix(update_parents, update_children)

///|
pub extern "js" fn Object3D::get_world_position(
  self : Object3D,
  target : Vector3,
) -> Vector3 =
  #| (self, target) => self.getWorldPosition(target)

///|
pub extern "js" fn Object3D::get_world_quaternion(
  self : Object3D,
  target : Quaternion,
) -> Quaternion =
  #| (self, target) => self.getWorldQuaternion(target)

///|
pub extern "js" fn Object3D::get_world_scale(
  self : Object3D,
  target : Vector3,
) -> Vector3 =
  #| (self, target) => self.getWorldScale(target)

///|
pub extern "js" fn Object3D::get_world_direction(
  self : Object3D,
  target : Vector3,
) -> Vector3 =
  #| (self, target) => self.getWorldDirection(target)

///|
pub extern "js" fn Object3D::local_to_world(
  self : Object3D,
  vector : Vector3,
) -> Vector3 =
  #| (self, vector) => self.localToWorld(vector)

///|
pub extern "js" fn Object3D::world_to_local(
  self : Object3D,
  vector : Vector3,
) -> Vector3 =
  #| (self, vector) => self.worldToLocal(vector)

///|
pub extern "js" fn Object3D::traverse(
  self : Object3D,
  callback : (Object3D) -> Unit,
) -> Unit =
  #| (self, callback) => self.traverse(callback)

///|
pub extern "js" fn Object3D::traverse_visible(
  self : Object3D,
  callback : (Object3D) -> Unit,
) -> Unit =
  #| (self, callback) => self.traverseVisible(callback)

///|
extern "js" fn Object3D::ffi_as_batched_mesh(
  self : Object3D,
) -> Nullable[BatchedMesh] =
  #| (self) => self.isBatchedMesh ? self : null

///|
pub fn Object3D::as_batched_mesh(self : Object3D) -> BatchedMesh? {
  self.ffi_as_batched_mesh().to_option()
}

///|
pub extern "js" fn Object3D::model_view_matrix(self : Object3D) -> Matrix4 =
  #| (self) => self.modelViewMatrix

///|
pub extern "js" fn Object3D::normal_matrix(self : Object3D) -> Matrix3 =
  #| (self) => self.normalMatrix

///|
pub extern "js" fn Object3D::matrix_auto_update(self : Object3D) -> Bool =
  #| (self) => self.matrixAutoUpdate

///|
pub extern "js" fn Object3D::set_matrix_auto_update(
  self : Object3D,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.matrixAutoUpdate = value; }

///|
pub extern "js" fn Object3D::matrix_world_auto_update(self : Object3D) -> Bool =
  #| (self) => self.matrixWorldAutoUpdate

///|
pub extern "js" fn Object3D::set_matrix_world_auto_update(
  self : Object3D,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.matrixWorldAutoUpdate = value; }

///|
pub extern "js" fn Object3D::matrix_world_needs_update(self : Object3D) -> Bool =
  #| (self) => self.matrixWorldNeedsUpdate

///|
pub extern "js" fn Object3D::set_matrix_world_needs_update(
  self : Object3D,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.matrixWorldNeedsUpdate = value; }

///|
pub extern "js" fn Object3D::is_static(self : Object3D) -> Bool =
  #| (self) => self.static

///|
pub extern "js" fn Object3D::set_is_static(
  self : Object3D,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.static = value; }

///|
pub extern "js" fn Object3D::animations(
  self : Object3D,
) -> FixedArray[AnimationClip] =
  #| (self) => self.animations.slice()

///|
pub extern "js" fn Object3D::set_animations(
  self : Object3D,
  clips : FixedArray[AnimationClip],
) -> Unit =
  #| (self, clips) => { self.animations = clips.slice(); }

///|
extern "js" fn Object3D::ffi_pivot(self : Object3D) -> Nullable[Vector3] =
  #| (self) => self.pivot

///|
pub fn Object3D::pivot(self : Object3D) -> Vector3? {
  self.ffi_pivot().to_option()
}

///|
extern "js" fn Object3D::ffi_set_pivot(
  self : Object3D,
  value : Nullable[Vector3],
) -> Unit =
  #| (self, value) => { self.pivot = value; }

///|
pub fn Object3D::set_pivot(self : Object3D, value : Vector3?) -> Unit {
  self.ffi_set_pivot(Nullable::from_option(value))
}

///|
extern "js" fn Object3D::ffi_custom_depth_material(
  self : Object3D,
) -> Nullable[Material] =
  #| (self) => self.customDepthMaterial

///|
pub fn Object3D::custom_depth_material(self : Object3D) -> Material? {
  self.ffi_custom_depth_material().to_option()
}

///|
extern "js" fn Object3D::ffi_set_custom_depth_material(
  self : Object3D,
  value : Nullable[Material],
) -> Unit =
  #| (self, value) => { self.customDepthMaterial = value; }

///|
pub fn Object3D::set_custom_depth_material(
  self : Object3D,
  value : Material?,
) -> Unit {
  self.ffi_set_custom_depth_material(Nullable::from_option(value))
}

///|
extern "js" fn Object3D::ffi_custom_distance_material(
  self : Object3D,
) -> Nullable[Material] =
  #| (self) => self.customDistanceMaterial

///|
pub fn Object3D::custom_distance_material(self : Object3D) -> Material? {
  self.ffi_custom_distance_material().to_option()
}

///|
extern "js" fn Object3D::ffi_set_custom_distance_material(
  self : Object3D,
  value : Nullable[Material],
) -> Unit =
  #| (self, value) => { self.customDistanceMaterial = value; }

///|
pub fn Object3D::set_custom_distance_material(
  self : Object3D,
  value : Material?,
) -> Unit {
  self.ffi_set_custom_distance_material(Nullable::from_option(value))
}

///|
pub extern "js" fn Object3D::set_rotation_from_axis_angle(
  self : Object3D,
  axis : Vector3,
  angle : Double,
) -> Unit =
  #| (self, axis, angle) => self.setRotationFromAxisAngle(axis, angle)

///|
pub extern "js" fn Object3D::set_rotation_from_euler(
  self : Object3D,
  euler : Euler,
) -> Unit =
  #| (self, euler) => self.setRotationFromEuler(euler)

///|
pub extern "js" fn Object3D::set_rotation_from_matrix(
  self : Object3D,
  matrix : Matrix4,
) -> Unit =
  #| (self, matrix) => self.setRotationFromMatrix(matrix)

///|
pub extern "js" fn Object3D::set_rotation_from_quaternion(
  self : Object3D,
  quaternion : Quaternion,
) -> Unit =
  #| (self, quaternion) => self.setRotationFromQuaternion(quaternion)

///|
pub extern "js" fn Object3D::rotate_on_axis(
  self : Object3D,
  axis : Vector3,
  angle : Double,
) -> Object3D =
  #| (self, axis, angle) => self.rotateOnAxis(axis, angle)

///|
pub extern "js" fn Object3D::rotate_on_world_axis(
  self : Object3D,
  axis : Vector3,
  angle : Double,
) -> Object3D =
  #| (self, axis, angle) => self.rotateOnWorldAxis(axis, angle)

///|
pub extern "js" fn Object3D::translate_on_axis(
  self : Object3D,
  axis : Vector3,
  distance : Double,
) -> Object3D =
  #| (self, axis, distance) => self.translateOnAxis(axis, distance)

///|
extern "js" fn Object3D::ffi_get_object_by_id(
  self : Object3D,
  id : Int,
) -> Nullable[Object3D] =
  #| (self, id) => self.getObjectById(id)

///|
pub fn Object3D::get_object_by_id(self : Object3D, id : Int) -> Object3D? {
  self.ffi_get_object_by_id(id).to_option()
}

///|
extern "js" fn Object3D::ffi_get_object_by_string_property(
  self : Object3D,
  name : String,
  value : String,
) -> Nullable[Object3D] =
  #| (self, name, value) => self.getObjectByProperty(name, value)

///|
pub fn Object3D::get_object_by_string_property(
  self : Object3D,
  name : String,
  value : String,
) -> Object3D? {
  self.ffi_get_object_by_string_property(name, value).to_option()
}

///|
pub extern "js" fn Object3D::get_objects_by_string_property(
  self : Object3D,
  name : String,
  value : String,
) -> FixedArray[Object3D] =
  #| (self, name, value) => self.getObjectsByProperty(name, value)

///|
extern "js" fn Object3D::ffi_get_object_by_number_property(
  self : Object3D,
  name : String,
  value : Double,
) -> Nullable[Object3D] =
  #| (self, name, value) => self.getObjectByProperty(name, value)

///|
pub fn Object3D::get_object_by_number_property(
  self : Object3D,
  name : String,
  value : Double,
) -> Object3D? {
  self.ffi_get_object_by_number_property(name, value).to_option()
}

///|
pub extern "js" fn Object3D::get_objects_by_number_property(
  self : Object3D,
  name : String,
  value : Double,
) -> FixedArray[Object3D] =
  #| (self, name, value) => self.getObjectsByProperty(name, value)

///|
extern "js" fn Object3D::ffi_get_object_by_bool_property(
  self : Object3D,
  name : String,
  value : Bool,
) -> Nullable[Object3D] =
  #| (self, name, value) => self.getObjectByProperty(name, value)

///|
pub fn Object3D::get_object_by_bool_property(
  self : Object3D,
  name : String,
  value : Bool,
) -> Object3D? {
  self.ffi_get_object_by_bool_property(name, value).to_option()
}

///|
pub extern "js" fn Object3D::get_objects_by_bool_property(
  self : Object3D,
  name : String,
  value : Bool,
) -> FixedArray[Object3D] =
  #| (self, name, value) => self.getObjectsByProperty(name, value)

///|
pub extern "js" fn Object3D::traverse_ancestors(
  self : Object3D,
  callback : (Object3D) -> Unit,
) -> Unit =
  #| (self, callback) => self.traverseAncestors(callback)

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

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

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

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

///|
pub extern "js" fn Object3D::set_on_before_render(
  self : Object3D,
  callback : (RenderContext) -> Unit,
) -> Unit =
  #| (self, callback) => { self.onBeforeRender = (renderer,scene,camera,geometry,material,group) => callback({renderer,scene,camera,geometry,material,group,object:self}); }

///|
pub extern "js" fn Object3D::clear_on_before_render(self : Object3D) -> Unit =
  #| (self) => { self.onBeforeRender = () => {}; }

///|
pub extern "js" fn Object3D::set_on_after_render(
  self : Object3D,
  callback : (RenderContext) -> Unit,
) -> Unit =
  #| (self, callback) => { self.onAfterRender = (renderer,scene,camera,geometry,material,group) => callback({renderer,scene,camera,geometry,material,group,object:self}); }

///|
pub extern "js" fn Object3D::clear_on_after_render(self : Object3D) -> Unit =
  #| (self) => { self.onAfterRender = () => {}; }

///|
extern "js" fn Object3D::ffi_as_points(self : Object3D) -> Nullable[Points] =
  #| (self) => self.isPoints?self:null

///|
pub fn Object3D::as_points(self : Object3D) -> Points? {
  self.ffi_as_points().to_option()
}

///|
pub extern "js" fn Object3D::set_on_before_shadow(
  self : Object3D,
  callback : (ShadowRenderContext) -> Unit,
) -> Unit =
  #| (self, callback) => { self.onBeforeShadow=(renderer,object,camera,shadowCamera,geometry,depthMaterial,group)=>callback({renderer,object,camera,shadowCamera,geometry,depthMaterial,group}); }

///|
pub extern "js" fn Object3D::clear_on_before_shadow(self : Object3D) -> Unit =
  #| (self) => { self.onBeforeShadow=()=>{}; }

///|
pub extern "js" fn Object3D::set_on_after_shadow(
  self : Object3D,
  callback : (ShadowRenderContext) -> Unit,
) -> Unit =
  #| (self, callback) => { self.onAfterShadow=(renderer,object,camera,shadowCamera,geometry,depthMaterial,group)=>callback({renderer,object,camera,shadowCamera,geometry,depthMaterial,group}); }

///|
pub extern "js" fn Object3D::clear_on_after_shadow(self : Object3D) -> Unit =
  #| (self) => { self.onAfterShadow=()=>{}; }

///|
/// Copies coordinates into the live position vector; does not retain the input vector.
pub extern "js" fn Object3D::set_position(
  self : Object3D,
  position : Vector3,
) -> Unit =
  #| (self, position) => { self.position.copy(position); }

///|
/// Sets local position coordinates while preserving the live position reference.
pub extern "js" fn Object3D::set_position_xyz(
  self : Object3D,
  x : Double,
  y : Double,
  z : Double,
) -> Unit =
  #| (self, x, y, z) => { self.position.set(x, y, z); }

///|
/// Copies Euler angles and order; native quaternion synchronization is preserved.
pub extern "js" fn Object3D::set_rotation(
  self : Object3D,
  rotation : Euler,
) -> Unit =
  #| (self, rotation) => { self.rotation.copy(rotation); }

///|
/// Sets local Euler angles in radians, retaining the current Euler order.
pub extern "js" fn Object3D::set_rotation_xyz(
  self : Object3D,
  x : Double,
  y : Double,
  z : Double,
) -> Unit =
  #| (self, x, y, z) => { self.rotation.set(x, y, z); }

///|
/// Copies quaternion components; native Euler synchronization is preserved. Does not normalize.
pub extern "js" fn Object3D::set_quaternion(
  self : Object3D,
  quaternion : Quaternion,
) -> Unit =
  #| (self, quaternion) => { self.quaternion.copy(quaternion); }

///|
/// Copies local scale components into the existing live scale vector.
pub extern "js" fn Object3D::set_scale(
  self : Object3D,
  scale : Vector3,
) -> Unit =
  #| (self, scale) => { self.scale.copy(scale); }

///|
/// Sets the three local scale components.
pub extern "js" fn Object3D::set_scale_xyz(
  self : Object3D,
  x : Double,
  y : Double,
  z : Double,
) -> Unit =
  #| (self, x, y, z) => { self.scale.set(x, y, z); }

///|
/// Sets all local scale components to the supplied value.
pub extern "js" fn Object3D::set_uniform_scale(
  self : Object3D,
  scale : Double,
) -> Unit =
  #| (self, scale) => { self.scale.setScalar(scale); }

///|
/// Adds a child using native reparenting and event behavior.
pub extern "js" fn Object3D::add_child(
  self : Object3D,
  child : Object3D,
) -> Unit =
  #| (self, child) => { self.add(child); }

///|
/// Adds children in order using native reparenting and event behavior. An empty list is a no-op.
pub extern "js" fn Object3D::add_children(
  self : Object3D,
  children : FixedArray[Object3D],
) -> Unit =
  #| (self, children) => { if (children.length > 0) { self.add(...children); }; }

///|
/// Adds this object to the parent, retaining this object as the cascade receiver.
pub extern "js" fn Object3D::add_to(self : Object3D, parent : Object3D) -> Unit =
  #| (self, parent) => { parent.add(self); }

///|
/// Removes a child using native event behavior. Does not dispose resources.
pub extern "js" fn Object3D::remove_child(
  self : Object3D,
  child : Object3D,
) -> Unit =
  #| (self, child) => { self.remove(child); }