pybevy_math 0.2.1

Math types (Vec2, Vec3, Vec4, Quat, Mat3, Mat4) for PyBevy
Documentation
use bevy::math::{
    Vec2,
    cubic_splines::{CubicBezier, CubicGenerator},
};
use pyo3::{exceptions::PyValueError, prelude::*};

use super::cubic_curve::PyCubicCurve2d;
use crate::vec2::PyVec2;

#[pyclass(name = "CubicBezier2d", frozen)]
#[derive(Debug, Clone)]
pub struct PyCubicBezier2d {
    bezier: CubicBezier<Vec2>,
}

#[pymethods]
impl PyCubicBezier2d {
    #[new]
    pub fn new(control_points: Vec<[PyVec2; 4]>) -> Self {
        let control_points: Vec<[Vec2; 4]> = control_points
            .into_iter()
            .map(|points| {
                [
                    points[0].clone().into(),
                    points[1].clone().into(),
                    points[2].clone().into(),
                    points[3].clone().into(),
                ]
            })
            .collect();

        PyCubicBezier2d {
            bezier: CubicBezier::new(control_points),
        }
    }

    pub fn to_curve(&self, py: Python<'_>) -> PyResult<Py<PyCubicCurve2d>> {
        let curve = self
            .bezier
            .to_curve()
            .map_err(|e| PyValueError::new_err(e.to_string()))?;

        Py::new(py, PyCubicCurve2d::from_curve(curve))
    }

    fn __repr__(&self) -> String {
        format!(
            "CubicBezier2d({} segments)",
            self.bezier.control_points.len()
        )
    }
}