opencascade 0.3.0

A high level Rust wrapper to build 3D models in code, using the OpenCascade CAD kernel
use crate::primitives::make_point2d;
use cxx::UniquePtr;
use glam::dvec2;
use opencascade_sys as ffi;

#[must_use]
pub(crate) fn law_function_from_graph(
    pairs: impl IntoIterator<Item = (f64, f64)>,
) -> UniquePtr<ffi::law::Law_Function> {
    let pairs: Vec<_> = pairs.into_iter().collect();
    let mut array = ffi::t_col_gp::TColgp_Array1OfPnt2d_new(1, pairs.len() as i32);

    for (index, (input, output)) in pairs.into_iter().enumerate() {
        array.pin_mut().SetValue(index as i32 + 1, &make_point2d(dvec2(input, output)));
    }

    let mut interpol = ffi::law::Law_Interpol_new();
    let is_periodic = false;
    interpol.pin_mut().Set(&array, is_periodic);
    ffi::law::Law_Interpol_into_Law_Function(interpol)
}