// picogkffi vectorfield: Vector field for voxel data.

///|
pub struct VectorField {
  h : Int64
}

///|
pub fn new_vector_field() -> VectorField {
  VectorField::{ h: vector_field_h_create(get_instance()) }
}

///|
pub fn vector_field_from_voxels(v : Voxels) -> VectorField {
  VectorField::{ h: vector_field_h_create_from_voxels(get_instance(), v.h) }
}

///|
pub fn vector_field_build_from_voxels(
  v : Voxels,
  ref_vec : Vec3,
  scale : Double,
) -> VectorField {
  VectorField::{
    h: vector_field_h_build_from_voxels(
      get_instance(),
      v.h,
      pack_vec3(ref_vec),
      Float::from_double(scale),
    ),
  }
}

///|
pub fn VectorField::copy(self : VectorField) -> VectorField {
  VectorField::{ h: vector_field_h_create_copy(get_instance(), self.h) }
}

///|
pub fn VectorField::is_valid(self : VectorField) -> Bool {
  vector_field_b_is_valid(get_instance(), self.h)
}

///|
pub fn VectorField::destroy(self : VectorField) -> Unit {
  vector_field_destroy(get_instance(), self.h)
}

///|
pub fn VectorField::mem_usage(self : VectorField) -> Int64 {
  vector_field_n_mem_usage(get_instance(), self.h)
}

///|
pub fn VectorField::set_value(
  self : VectorField,
  pt : Vec3,
  val : Vec3,
) -> Unit {
  vector_field_set_value(get_instance(), self.h, pack_vec3(pt), pack_vec3(val))
}

///|
pub fn VectorField::get_value(self : VectorField, pt : Vec3) -> Vec3? {
  let out = FixedArray::make(12, 0L.to_byte())
  if vector_field_b_get_value(get_instance(), self.h, pack_vec3(pt), out) {
    Some(unpack_vec3(out))
  } else {
    None
  }
}

///|
pub fn VectorField::remove_value(self : VectorField, pt : Vec3) -> Unit {
  vector_field_remove_value(get_instance(), self.h, pack_vec3(pt))
}