pub mod boy_surface;
pub mod catenoid;
pub mod ellipsoid;
pub mod enneper;
pub mod helicoid;
pub mod hyperbolic_paraboloid;
pub mod hyperboloid;
pub mod klein_bottle;
pub mod procedural;
pub mod pseudosphere;
pub mod saddle;
pub mod sphere;
pub mod torus;
pub mod torus_knot;
pub mod trefoil;
pub mod user_defined;
use glam::Vec3;
pub trait Surface: Send + Sync {
fn position(&self, u: f32, v: f32) -> Vec3;
fn metric(&self, u: f32, v: f32) -> [[f32; 2]; 2];
fn christoffel(&self, u: f32, v: f32) -> [[[f32; 2]; 2]; 2];
fn wrap(&self, u: f32, v: f32) -> (f32, f32);
fn normal(&self, u: f32, v: f32) -> Vec3;
fn random_position(&self, rng: &mut dyn rand::RngCore) -> (f32, f32);
fn random_tangent(&self, u: f32, v: f32, rng: &mut dyn rand::RngCore) -> (f32, f32);
fn mesh_vertices(&self, u_steps: u32, v_steps: u32) -> (Vec<[f32; 3]>, Vec<u32>);
}