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

///|
#external
pub type BatchedMesh

///|
#module("@mizchi/three-mbt/constructors")
pub extern "js" fn BatchedMesh::BatchedMesh(
  max_instances : Int,
  max_vertices : Int,
  max_indices : Int,
  material : Material,
) -> BatchedMesh = "batchedMesh"

///|
pub fn BatchedMesh::as_object3d(self : BatchedMesh) -> Object3D = "%identity"

///|
pub fn BatchedMesh::as_mesh(self : BatchedMesh) -> Mesh = "%identity"

///|
pub extern "js" fn BatchedMesh::instance_count(self : BatchedMesh) -> Int =
  #| (self) => self.instanceCount

///|
pub extern "js" fn BatchedMesh::max_instance_count(self : BatchedMesh) -> Int =
  #| (self) => self.maxInstanceCount

///|
pub extern "js" fn BatchedMesh::unused_vertex_count(self : BatchedMesh) -> Int =
  #| (self) => self.unusedVertexCount

///|
pub extern "js" fn BatchedMesh::unused_index_count(self : BatchedMesh) -> Int =
  #| (self) => self.unusedIndexCount

///|
pub extern "js" fn BatchedMesh::per_object_frustum_culled(
  self : BatchedMesh,
) -> Bool =
  #| (self) => self.perObjectFrustumCulled

///|
pub extern "js" fn BatchedMesh::set_per_object_frustum_culled(
  self : BatchedMesh,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.perObjectFrustumCulled = value; }

///|
pub extern "js" fn BatchedMesh::sort_objects(self : BatchedMesh) -> Bool =
  #| (self) => self.sortObjects

///|
pub extern "js" fn BatchedMesh::set_sort_objects(
  self : BatchedMesh,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.sortObjects = value; }

///|
pub extern "js" fn BatchedMesh::add_geometry(
  self : BatchedMesh,
  geometry : BufferGeometry,
) -> BatchedGeometryId =
  #| (self, geometry) => self.addGeometry(geometry)

///|
pub extern "js" fn BatchedMesh::add_instance(
  self : BatchedMesh,
  geometry : BatchedGeometryId,
) -> BatchedInstanceId =
  #| (self, geometry) => self.addInstance(geometry)

///|
pub extern "js" fn BatchedMesh::delete_geometry(
  self : BatchedMesh,
  geometry : BatchedGeometryId,
) -> BatchedMesh =
  #| (self, geometry) => self.deleteGeometry(geometry)

///|
pub extern "js" fn BatchedMesh::delete_instance(
  self : BatchedMesh,
  instance : BatchedInstanceId,
) -> BatchedMesh =
  #| (self, instance) => self.deleteInstance(instance)

///|
pub extern "js" fn BatchedMesh::set_matrix_at(
  self : BatchedMesh,
  instance : BatchedInstanceId,
  matrix : Matrix4,
) -> BatchedMesh =
  #| (self, instance, matrix) => self.setMatrixAt(instance, matrix)

///|
pub extern "js" fn BatchedMesh::get_matrix_at(
  self : BatchedMesh,
  instance : BatchedInstanceId,
  target : Matrix4,
) -> Matrix4 =
  #| (self, instance, target) => self.getMatrixAt(instance, target)

///|
pub extern "js" fn BatchedMesh::set_color_at(
  self : BatchedMesh,
  instance : BatchedInstanceId,
  color : Color,
) -> BatchedMesh =
  #| (self, instance, color) => self.setColorAt(instance, color)

///|
pub extern "js" fn BatchedMesh::get_color_at(
  self : BatchedMesh,
  instance : BatchedInstanceId,
  target : Color,
) -> Color =
  #| (self, instance, target) => self.getColorAt(instance, target)

///|
pub extern "js" fn BatchedMesh::set_rgba_at(
  self : BatchedMesh,
  instance : BatchedInstanceId,
  color : Vector4,
) -> BatchedMesh =
  #| (self, instance, color) => self.setColorAt(instance, color)

///|
pub extern "js" fn BatchedMesh::get_rgba_at(
  self : BatchedMesh,
  instance : BatchedInstanceId,
  target : Vector4,
) -> Vector4 =
  #| (self, instance, target) => self.getColorAt(instance, target)

///|
pub extern "js" fn BatchedMesh::set_visible_at(
  self : BatchedMesh,
  instance : BatchedInstanceId,
  visible : Bool,
) -> BatchedMesh =
  #| (self, instance, visible) => self.setVisibleAt(instance, visible)

///|
pub extern "js" fn BatchedMesh::get_visible_at(
  self : BatchedMesh,
  instance : BatchedInstanceId,
) -> Bool =
  #| (self, instance) => self.getVisibleAt(instance)

///|
pub extern "js" fn BatchedMesh::set_geometry_id_at(
  self : BatchedMesh,
  instance : BatchedInstanceId,
  geometry : BatchedGeometryId,
) -> BatchedMesh =
  #| (self, instance, geometry) => self.setGeometryIdAt(instance, geometry)

///|
pub extern "js" fn BatchedMesh::get_geometry_id_at(
  self : BatchedMesh,
  instance : BatchedInstanceId,
) -> BatchedGeometryId =
  #| (self, instance) => self.getGeometryIdAt(instance)

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

///|
pub extern "js" fn BatchedMesh::compute_bounding_box(
  self : BatchedMesh,
) -> Unit =
  #| (self) => self.computeBoundingBox()

///|
pub extern "js" fn BatchedMesh::compute_bounding_sphere(
  self : BatchedMesh,
) -> Unit =
  #| (self) => self.computeBoundingSphere()

///|
pub extern "js" fn BatchedMesh::dispose(self : BatchedMesh) -> Unit =
  #| (self) => self.dispose()

///|
extern "js" fn BatchedMesh::ffi_set_geometry_at(
  self : BatchedMesh,
  id : BatchedGeometryId,
  geometry : BufferGeometry,
) -> JsResult[BatchedGeometryId] =
  #| (self, id, geometry) => { try { return { ok: true, value: (() => self.setGeometryAt(id, geometry))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn BatchedMesh::set_geometry_at(
  self : BatchedMesh,
  id : BatchedGeometryId,
  geometry : BufferGeometry,
) -> BatchedGeometryId raise ModelingError {
  match self.ffi_set_geometry_at(id, geometry).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn BatchedMesh::ffi_set_geometry_size(
  self : BatchedMesh,
  max_vertices : Int,
  max_indices : Int,
) -> JsResult[Unit] =
  #| (self, max_vertices, max_indices) => { try { return { ok: true, value: (() => self.setGeometrySize(max_vertices, max_indices))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn BatchedMesh::set_geometry_size(
  self : BatchedMesh,
  max_vertices : Int,
  max_indices : Int,
) -> Unit raise ModelingError {
  match self.ffi_set_geometry_size(max_vertices, max_indices).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn BatchedMesh::ffi_set_instance_count(
  self : BatchedMesh,
  max_instances : Int,
) -> JsResult[Unit] =
  #| (self, max_instances) => { try { return { ok: true, value: (() => self.setInstanceCount(max_instances))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn BatchedMesh::set_instance_count(
  self : BatchedMesh,
  max_instances : Int,
) -> Unit raise ModelingError {
  match self.ffi_set_instance_count(max_instances).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn BatchedMesh::ffi_get_geometry_range_at(
  self : BatchedMesh,
  id : BatchedGeometryId,
) -> Nullable[BatchedGeometryRange] =
  #| (self, id) => { try { return self.getGeometryRangeAt(id); } catch { return null; } }

///|
pub fn BatchedMesh::get_geometry_range_at(
  self : BatchedMesh,
  id : BatchedGeometryId,
) -> BatchedGeometryRange? {
  self.ffi_get_geometry_range_at(id).to_option()
}

///|
extern "js" fn BatchedMesh::ffi_get_bounding_box_at(
  self : BatchedMesh,
  id : BatchedGeometryId,
  target : Box3,
) -> Nullable[Box3] =
  #| (self, id, target) => { try { self.getGeometryRangeAt(id); } catch { return null; } return self.getBoundingBoxAt(id,target); }

///|
pub fn BatchedMesh::get_bounding_box_at(
  self : BatchedMesh,
  id : BatchedGeometryId,
  target : Box3,
) -> Box3? {
  self.ffi_get_bounding_box_at(id, target).to_option()
}

///|
extern "js" fn BatchedMesh::ffi_get_bounding_sphere_at(
  self : BatchedMesh,
  id : BatchedGeometryId,
  target : Sphere,
) -> Nullable[Sphere] =
  #| (self, id, target) => { try { self.getGeometryRangeAt(id); } catch { return null; } return self.getBoundingSphereAt(id,target); }

///|
pub fn BatchedMesh::get_bounding_sphere_at(
  self : BatchedMesh,
  id : BatchedGeometryId,
  target : Sphere,
) -> Sphere? {
  self.ffi_get_bounding_sphere_at(id, target).to_option()
}

///|
extern "js" fn BatchedMesh::ffi_bounding_box(
  self : BatchedMesh,
) -> Nullable[Box3] =
  #| (self) => self.boundingBox

///|
pub fn BatchedMesh::bounding_box(self : BatchedMesh) -> Box3? {
  self.ffi_bounding_box().to_option()
}

///|
extern "js" fn BatchedMesh::ffi_bounding_sphere(
  self : BatchedMesh,
) -> Nullable[Sphere] =
  #| (self) => self.boundingSphere

///|
pub fn BatchedMesh::bounding_sphere(self : BatchedMesh) -> Sphere? {
  self.ffi_bounding_sphere().to_option()
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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