pub trait Geometry: Sized {
type LengthExpr;
fn length(self) -> Self::LengthExpr;
fn distance(self, other: Self) -> Self::LengthExpr;
fn dot(self, other: Self) -> Self::LengthExpr;
fn cross(self, other: Self) -> Self;
fn normalize(self) -> Self;
fn face_forward(self, normal: Self, reference: Self) -> Self;
fn reflect(self, normal: Self) -> Self;
fn refract(self, normal: Self, eta: Expr<f32>) -> Self;
}