///|
#module("@mizchi/three-mbt/bake")
extern "js" fn bake_flow_ffi(flow : Flow) -> JsResult[BufferGeometry] = "bakeFlowGeometry"

///|
#module("@mizchi/three-mbt/bake")
extern "js" fn bake_mesh_ffi(mesh : Mesh) -> JsResult[BufferGeometry] = "bakeMeshGeometry"

///|
pub fn bake_mesh_geometry(mesh : Mesh) -> BufferGeometry raise ModelingError {
  match bake_mesh_ffi(mesh).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
#module("@mizchi/three-mbt/bake")
extern "js" fn bake_hierarchy_ffi(root : Object3D) -> JsResult[Group] = "bakeMeshHierarchy"

///|
pub fn bake_mesh_hierarchy(root : Object3D) -> Group raise ModelingError {
  match bake_hierarchy_ffi(root).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
/// Bake the root mesh's shader deformation into a new local-space geometry.
pub fn bake_flow_geometry(flow : Flow) -> BufferGeometry raise ModelingError {
  match bake_flow_ffi(flow).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
#module("@mizchi/three-mbt/bake")
extern "js" fn bake_flow_instance_ffi(
  flow : InstancedFlow,
  index : Int,
) -> JsResult[BufferGeometry] = "bakeFlowInstanceGeometry"

///|
pub fn bake_flow_instance_geometry(
  flow : InstancedFlow,
  index : Int,
) -> BufferGeometry raise ModelingError {
  match bake_flow_instance_ffi(flow, index).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}