gltf-codec-0.1.0.1: src/Codec/GlTF/Node.hs
module Codec.GlTF.Node
( NodeIx(..)
, Node(..)
, NodeMatrix(..)
-- XXX: Misplaced here due to mutual recursion.
, SkinIx(..)
, Skin(..)
) where
import Codec.GlTF.Prelude
import Codec.GlTF.Accessor (AccessorIx)
import Codec.GlTF.Camera (CameraIx)
import Codec.GlTF.Mesh (MeshIx)
newtype NodeIx = NodeIx { unNodeIx :: Int }
deriving (Eq, Ord, Show, FromJSON, ToJSON, Generic)
-- | A node in the node hierarchy.
--
-- When the node contains skin, all mesh.primitives must contain JOINTS_0 and WEIGHTS_0 attributes.
--
-- A node can have either a matrix or any combination of translation/rotation/scale (TRS) properties.
--
-- TRS properties are converted to matrices and postmultiplied in the T * R * S order to
-- compose the transformation matrix; first the scale is applied to the vertices, then
-- the rotation, and then the translation.
-- If none are provided, the transform is the identity.
--
-- When a node is targeted for animation (referenced by an animation.channel.target),
-- only TRS properties may be present; matrix will not be present.
data Node = Node
{ camera :: Maybe CameraIx
, children :: Maybe (Vector NodeIx)
, skin :: Maybe SkinIx
, matrix :: Maybe NodeMatrix
, mesh :: Maybe MeshIx
, rotation :: Maybe (Float, Float, Float, Float)
, scale :: Maybe (Float, Float, Float)
, translation :: Maybe (Float, Float, Float)
, weights :: Maybe (Vector Float)
, name :: Maybe Text
, extensions :: Maybe Object
, extras :: Maybe Value
} deriving (Eq, Show, Generic)
instance FromJSON Node
instance ToJSON Node
-- | A floating-point 4x4 transformation matrix stored in column-major order.
newtype NodeMatrix = NodeMatrix { unNodeMatrix :: Vector Float }
deriving (Eq, Ord, Show, FromJSON, ToJSON, Generic)
newtype SkinIx = SkinIx { unSkinIx :: Int }
deriving (Eq, Ord, Show, FromJSON, ToJSON, Generic)
-- | Joints and matrices defining a skin.
data Skin = Skin
{ joints :: Vector (NodeIx)
, skeleton :: Maybe NodeIx
, inverseBindMatrices :: Maybe AccessorIx
-- ^ The index of the accessor containing the floating-point
-- 4x4 inverse-bind matrices.
-- The default is that each matrix is a 4x4 identity matrix,
-- which implies that inverse-bind matrices were pre-applied.
, name :: Maybe Text
, extensions :: Maybe Object
, extras :: Maybe Value
} deriving (Eq, Show, Generic)
instance FromJSON Skin
instance ToJSON Skin