module SFML.Graphics.PrimitiveType
(
    PrimitiveType(..)
)
where


import Foreign.C.Types (CInt)
import Foreign.Ptr
import Foreign.Storable


-- | Types of primitives that a sf::VertexArray can render.
--
-- Points and lines have no area, therefore their thickness
-- will always be 1 pixel, regardless of the current transform
-- and view.
data PrimitiveType
    = Points        -- ^ List of individual points
    | Lines         -- ^ List of individual lines
    | LineStrip     -- ^ List of connected lines, a point uses the previous point to form a line
    | Triangles     -- ^ List of individual triangles
    | TriangleStrip -- ^ List of connected triangles, a point uses the two previous points to form a triangle
    | TriangleFan   -- ^ List of connected triangles, a point uses the common center and the previous point to form a triangle
    | Quads         -- ^ List of individual quads
    deriving (Eq, Enum, Bounded, Show)


instance Storable PrimitiveType where
    sizeOf _ = sizeOf (undefined :: CInt)
    alignment _ = alignment (undefined :: CInt)
    
    peek ptr = peek (castPtr ptr :: Ptr CInt) >>= return . toEnum . fromIntegral
    poke ptr pt = poke (castPtr ptr :: Ptr CInt) (fromIntegral . fromEnum $ pt)


{-typedef enum 
{
    sfPoints,         
    sfLines,          
    sfLinesStrip,     
    sfTriangles,      
    sfTrianglesStrip, 
    sfTrianglesFan,   
    sfQuads           
} sfPrimitiveType;-}