\section{Nonaffine Transformations}
The \texttt{Deformation} typeclass describes any affine or nonaffine transformation.
\texttt{Deformation}s fall into two catagories: those that compute their own surface normals and those that don't.
\begin{code}
module RSAGL.Deformation
(Deformation,DeformationClass(..),constrain)
where
import RSAGL.Vector
import RSAGL.Matrix
import RSAGL.Affine
import RSAGL.Auxiliary
type Deformation = Either (SurfaceVertex3D -> Point3D) (SurfaceVertex3D -> SurfaceVertex3D)
class DeformationClass a where
deformation :: a -> Deformation
instance (DeformationClass a,DeformationClass b) => DeformationClass (Either a b) where
deformation = either deformation deformation
instance DeformationClass Matrix where
deformation m = Right (\s -> transform m s)
instance DeformationClass (Point3D -> Point3D) where
deformation f = Left (\(SurfaceVertex3D p _) -> f p)
instance DeformationClass (Point3D -> SurfaceVertex3D) where
deformation f = Right (\(SurfaceVertex3D p _) -> f p)
instance DeformationClass (SurfaceVertex3D -> Point3D) where
deformation f = Left f
instance DeformationClass (SurfaceVertex3D -> SurfaceVertex3D) where
deformation f = Right f
\end{code}