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

///|
#external
pub type Octree

///|
#module("@mizchi/three-mbt/modeling-workflow")
pub extern "js" fn Octree::Octree() -> Octree = "octree"

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

///|
pub extern "js" fn Octree::triangles_per_leaf(self : Octree) -> Int =
  #| (self) => self.trianglesPerLeaf

///|
pub extern "js" fn Octree::set_triangles_per_leaf(
  self : Octree,
  value : Int,
) -> Unit =
  #| (self, value) => { self.trianglesPerLeaf = value; }

///|
pub extern "js" fn Octree::max_level(self : Octree) -> Int =
  #| (self) => self.maxLevel

///|
pub extern "js" fn Octree::set_max_level(self : Octree, value : Int) -> Unit =
  #| (self, value) => { self.maxLevel = value; }

///|
pub extern "js" fn Octree::add_triangle(
  self : Octree,
  triangle : Triangle,
) -> Octree =
  #| (self, triangle) => self.addTriangle(triangle)

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

///|
pub extern "js" fn Octree::from_graph_node(
  self : Octree,
  root : Object3D,
) -> Octree =
  #| (self, root) => self.fromGraphNode(root)

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

///|
extern "js" fn Octree::ffi_box(self : Octree) -> Nullable[Box3] =
  #| (self) => self.box

///|
pub fn Octree::box(self : Octree) -> Box3? {
  self.ffi_box().to_option()
}

///|
extern "js" fn Octree::ffi_sphere_intersect(
  self : Octree,
  shape : Sphere,
) -> Nullable[OctreeIntersection] =
  #| (self, shape) => self.sphereIntersect(shape) || null

///|
pub fn Octree::sphere_intersect(
  self : Octree,
  shape : Sphere,
) -> OctreeIntersection? {
  self.ffi_sphere_intersect(shape).to_option()
}

///|
extern "js" fn Octree::ffi_capsule_intersect(
  self : Octree,
  shape : Capsule,
) -> Nullable[OctreeIntersection] =
  #| (self, shape) => self.capsuleIntersect(shape) || null

///|
pub fn Octree::capsule_intersect(
  self : Octree,
  shape : Capsule,
) -> OctreeIntersection? {
  self.ffi_capsule_intersect(shape).to_option()
}

///|
extern "js" fn Octree::ffi_box_intersect(
  self : Octree,
  shape : Box3,
) -> Nullable[OctreeIntersection] =
  #| (self, shape) => self.boxIntersect(shape) || null

///|
pub fn Octree::box_intersect(
  self : Octree,
  shape : Box3,
) -> OctreeIntersection? {
  self.ffi_box_intersect(shape).to_option()
}

///|
extern "js" fn Octree::ffi_ray_intersect(
  self : Octree,
  ray : Ray,
) -> Nullable[OctreeRayIntersection] =
  #| (self, ray) => self.rayIntersect(ray) || null

///|
pub fn Octree::ray_intersect(
  self : Octree,
  ray : Ray,
) -> OctreeRayIntersection? {
  self.ffi_ray_intersect(ray).to_option()
}

///|
pub extern "js" fn Octree::bounds(self : Octree) -> Box3 =
  #| (self) => self.bounds

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

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

///|
pub extern "js" fn Octree::ray_triangles(
  self : Octree,
  ray : Ray,
) -> FixedArray[Triangle] =
  #| (self, ray) => { const result=[]; self.getRayTriangles(ray,result); return result; }

///|
pub extern "js" fn Octree::sphere_triangles(
  self : Octree,
  shape : Sphere,
) -> FixedArray[Triangle] =
  #| (self, shape) => { const result=[]; self.getSphereTriangles(shape,result); return result; }

///|
extern "js" fn Octree::ffi_triangle_sphere_intersect(
  self : Octree,
  shape : Sphere,
  triangle : Triangle,
) -> Nullable[OctreeTriangleIntersection] =
  #| (self, shape, triangle) => self.triangleSphereIntersect(shape,triangle) || null

///|
pub fn Octree::triangle_sphere_intersect(
  self : Octree,
  shape : Sphere,
  triangle : Triangle,
) -> OctreeTriangleIntersection? {
  self.ffi_triangle_sphere_intersect(shape, triangle).to_option()
}

///|
pub extern "js" fn Octree::box_triangles(
  self : Octree,
  shape : Box3,
) -> FixedArray[Triangle] =
  #| (self, shape) => { const result=[]; self.getBoxTriangles(shape,result); return result; }

///|
extern "js" fn Octree::ffi_triangle_box_intersect(
  self : Octree,
  shape : Box3,
  triangle : Triangle,
) -> Nullable[OctreeTriangleIntersection] =
  #| (self, shape, triangle) => self.triangleBoxIntersect(shape,triangle) || null

///|
pub fn Octree::triangle_box_intersect(
  self : Octree,
  shape : Box3,
  triangle : Triangle,
) -> OctreeTriangleIntersection? {
  self.ffi_triangle_box_intersect(shape, triangle).to_option()
}

///|
pub extern "js" fn Octree::capsule_triangles(
  self : Octree,
  shape : Capsule,
) -> FixedArray[Triangle] =
  #| (self, shape) => { const result=[]; self.getCapsuleTriangles(shape,result); return result; }

///|
extern "js" fn Octree::ffi_triangle_capsule_intersect(
  self : Octree,
  shape : Capsule,
  triangle : Triangle,
) -> Nullable[OctreeTriangleIntersection] =
  #| (self, shape, triangle) => self.triangleCapsuleIntersect(shape,triangle) || null

///|
pub fn Octree::triangle_capsule_intersect(
  self : Octree,
  shape : Capsule,
  triangle : Triangle,
) -> OctreeTriangleIntersection? {
  self.ffi_triangle_capsule_intersect(shape, triangle).to_option()
}