module Data.Vector.Transform.T3 where
import Data.Monoid
import Data.Vector.Class
import Data.Vector.V3
data Transform3 =
Transform3
{
t3_XX, t3_YX, t3_ZX, t3_1X,
t3_XY, t3_YY, t3_ZY, t3_1Y,
t3_XZ, t3_YZ, t3_ZZ, t3_1Z :: !Scalar
}
deriving (Eq, Show)
instance Monoid Transform3 where
mempty = Transform3 1 0 0 0 0 1 0 0 0 0 1 0
mappend a b =
Transform3
{
t3_XX = t3_XX a * t3_XX b + t3_XY a * t3_YX b + t3_XZ a * t3_ZX b,
t3_YX = t3_YX a * t3_XX b + t3_YY a * t3_YX b + t3_YZ a * t3_ZX b,
t3_ZX = t3_ZX a * t3_XX b + t3_ZY a * t3_YX b + t3_ZZ a * t3_ZX b,
t3_1X = t3_1X a * t3_XX b + t3_1Y a * t3_YX b + t3_1Z a * t3_ZX b + t3_1X b,
t3_XY = t3_XX a * t3_XY b + t3_XY a * t3_YY b + t3_XZ a * t3_ZY b,
t3_YY = t3_YX a * t3_XY b + t3_YY a * t3_YY b + t3_YZ a * t3_ZY b,
t3_ZY = t3_ZX a * t3_XY b + t3_ZY a * t3_YY b + t3_ZZ a * t3_ZY b,
t3_1Y = t3_1X a * t3_XY b + t3_1Y a * t3_YY b + t3_1Z a * t3_ZY b + t3_1Y b,
t3_XZ = t3_XX a * t3_XZ b + t3_XY a * t3_YZ b + t3_XZ a * t3_ZZ b,
t3_YZ = t3_YX a * t3_XZ b + t3_YY a * t3_YZ b + t3_YZ a * t3_ZZ b,
t3_ZZ = t3_ZX a * t3_XZ b + t3_ZY a * t3_YZ b + t3_ZZ a * t3_ZZ b,
t3_1Z = t3_1X a * t3_XZ b + t3_1Y a * t3_YZ b + t3_1Z a * t3_ZZ b + t3_1Z b
}
transformP3 :: Transform3 -> Vector3 -> Vector3
transformP3 a (Vector3 x y z) =
Vector3
{
v3x = t3_XX a * x + t3_YX a * y + t3_ZX a * z + t3_1X a,
v3y = t3_XY a * x + t3_YY a * y + t3_ZY a * z + t3_1Y a,
v3z = t3_XZ a * x + t3_YZ a * y + t3_ZZ a * z + t3_1Z a
}