module SFML.Graphics.ConvexShape
(
module SFML.Utils
, createConvexShape
, copy
, destroy
, setPosition
, setRotation
, setScale
, setOrigin
, getPosition
, getRotation
, getScale
, getOrigin
, move
, rotate
, scale
, getTransform
, getInverseTransform
, setTexture
, setTextureRect
, getTexture
, getTextureRect
, setFillColor
, setOutlineColor
, setOutlineThickness
, getFillColor
, getOutlineColor
, getOutlineThickness
, getPointCount
, getPoint
, setPointCount
, setPoint
, getLocalBounds
, getGlobalBounds
)
where
import SFML.Graphics.SFBounded
import SFML.Graphics.Color
import SFML.Graphics.Rect
import SFML.Graphics.SFShape
import SFML.Graphics.SFShapeResizable
import SFML.Graphics.SFTexturable
import SFML.Graphics.Transform
import SFML.Graphics.SFTransformable
import SFML.Graphics.Types
import SFML.SFCopyable
import SFML.SFException
import SFML.SFResource
import SFML.System.Vector2
import SFML.Utils
import Control.Monad ((>=>))
import Foreign.C.Types
import Foreign.Ptr (Ptr, nullPtr)
import Foreign.Marshal.Alloc (alloca)
import Foreign.Marshal.Utils (with)
import Foreign.Storable (peek)
checkNull :: ConvexShape -> Maybe ConvexShape
checkNull cs@(ConvexShape ptr) = if ptr == nullPtr then Nothing else Just cs
checkNullTexture :: Texture -> Maybe Texture
checkNullTexture tex@(Texture ptr) = if ptr == nullPtr then Nothing else Just tex
createConvexShape :: IO (Either SFException ConvexShape)
createConvexShape =
let err = SFException "Failed creating convex shape"
in fmap (tagErr err . checkNull) sfConvexShape_create
foreign import ccall unsafe "sfConvexShape_create"
sfConvexShape_create :: IO ConvexShape
instance SFCopyable ConvexShape where
copy = sfConvexShape_copy
foreign import ccall unsafe "sfConvexShape_copy"
sfConvexShape_copy :: ConvexShape -> IO ConvexShape
instance SFResource ConvexShape where
destroy = sfConvexShape_destroy
foreign import ccall unsafe "sfConvexShape_destroy"
sfConvexShape_destroy :: ConvexShape -> IO ()
instance SFTransformable ConvexShape where
setPosition c p = with p $ sfConvexShape_setPosition_helper c
setRotation c r = sfConvexShape_setRotation c (realToFrac r)
setScale c s = with s $ sfConvexShape_setScale_helper c
setOrigin c o = with o $ sfConvexShape_setOrigin_helper c
getPosition c = alloca $ \ptr -> sfConvexShape_getPosition_helper c ptr >> peek ptr
getRotation = sfConvexShape_getRotation >=> return . realToFrac
getScale c = alloca $ \ptr -> sfConvexShape_getScale_helper c ptr >> peek ptr
getOrigin c = alloca $ \ptr -> sfConvexShape_getOrigin_helper c ptr >> peek ptr
move c off = with off $ sfConvexShape_move_helper c
rotate c a = sfConvexShape_rotate c (realToFrac a)
scale c s = with s $ sfConvexShape_scale_helper c
getTransform c = alloca $ \ptr -> sfConvexShape_getTransform_helper c ptr >> peek ptr
getInverseTransform c = alloca $ \ptr -> sfConvexShape_getInverseTransform_helper c ptr >> peek ptr
foreign import ccall unsafe "sfConvexShape_setPosition_helper"
sfConvexShape_setPosition_helper :: ConvexShape -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfConvexShape_setRotation"
sfConvexShape_setRotation :: ConvexShape -> CFloat -> IO ()
foreign import ccall unsafe "sfConvexShape_setScale_helper"
sfConvexShape_setScale_helper :: ConvexShape -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfConvexShape_setOrigin_helper"
sfConvexShape_setOrigin_helper :: ConvexShape -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfConvexShape_getPosition_helper"
sfConvexShape_getPosition_helper :: ConvexShape -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfConvexShape_getRotation"
sfConvexShape_getRotation :: ConvexShape -> IO CFloat
foreign import ccall unsafe "sfConvexShape_getScale_helper"
sfConvexShape_getScale_helper :: ConvexShape -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfConvexShape_getOrigin_helper"
sfConvexShape_getOrigin_helper :: ConvexShape -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfConvexShape_move_helper"
sfConvexShape_move_helper :: ConvexShape -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfConvexShape_rotate"
sfConvexShape_rotate :: ConvexShape -> CFloat -> IO ()
foreign import ccall unsafe "sfConvexShape_scale_helper"
sfConvexShape_scale_helper :: ConvexShape -> Ptr Vec2f -> IO ()
foreign import ccall unsafe "sfConvexShape_getTransform_helper"
sfConvexShape_getTransform_helper :: ConvexShape -> Ptr Transform -> IO ()
foreign import ccall unsafe "sfConvexShape_getInverseTransform_helper"
sfConvexShape_getInverseTransform_helper :: ConvexShape -> Ptr Transform -> IO ()
instance SFTexturable ConvexShape where
setTexture c tex reset = sfConvexShape_setTexture c tex (fromIntegral . fromEnum $ reset)
setTextureRect c rect = with rect $ sfConvexShape_setTextureRect_helper c
getTexture = sfConvexShape_getTexture >=> return . checkNullTexture
getTextureRect c = alloca $ \ptr -> sfConvexShape_getTextureRect_helper c ptr >> peek ptr
foreign import ccall unsafe "sfConvexShape_setTexture"
sfConvexShape_setTexture :: ConvexShape -> Texture -> CInt -> IO ()
foreign import ccall unsafe "sfConvexShape_setTextureRect_helper"
sfConvexShape_setTextureRect_helper :: ConvexShape -> Ptr IntRect -> IO ()
foreign import ccall unsafe "sfConvexShape_getTexture"
sfConvexShape_getTexture :: ConvexShape -> IO Texture
foreign import ccall unsafe "sfConvexShape_getTextureRect_helper"
sfConvexShape_getTextureRect_helper :: ConvexShape -> Ptr IntRect -> IO ()
instance SFShape ConvexShape where
setFillColor c color = with color $ sfConvexShape_setFillColor_helper c
setOutlineColor c color = with color $ sfConvexShape_setOutlineColor_helper c
setOutlineThickness c t = sfConvexShape_setOutlineThickness c (realToFrac t)
getFillColor c = alloca $ \ptr -> sfConvexShape_getFillColor_helper c ptr >> peek ptr
getOutlineColor c = alloca $ \ptr -> sfConvexShape_getOutlineColor_helper c ptr >> peek ptr
getOutlineThickness = sfConvexShape_getOutlineThickness >=> return . realToFrac
getPointCount = sfConvexShape_getPointCount >=> return . fromIntegral
getPoint c idx = alloca $ \ptr -> sfConvexShape_getPoint_helper c (fromIntegral idx) ptr >> peek ptr
foreign import ccall unsafe "sfConvexShape_setFillColor_helper"
sfConvexShape_setFillColor_helper :: ConvexShape -> Ptr Color -> IO ()
foreign import ccall unsafe "sfConvexShape_setOutlineColor_helper"
sfConvexShape_setOutlineColor_helper :: ConvexShape -> Ptr Color -> IO ()
foreign import ccall unsafe "sfConvexShape_setOutlineThickness"
sfConvexShape_setOutlineThickness :: ConvexShape -> CFloat -> IO ()
foreign import ccall unsafe "sfConvexShape_getFillColor_helper"
sfConvexShape_getFillColor_helper :: ConvexShape -> Ptr Color -> IO ()
foreign import ccall unsafe "sfConvexShape_getOutlineColor_helper"
sfConvexShape_getOutlineColor_helper :: ConvexShape -> Ptr Color -> IO ()
foreign import ccall unsafe "sfConvexShape_getOutlineThickness"
sfConvexShape_getOutlineThickness :: ConvexShape -> IO CFloat
foreign import ccall unsafe "sfConvexShape_getPointCount"
sfConvexShape_getPointCount :: ConvexShape -> IO CUInt
foreign import ccall unsafe "sfConvexShape_getPoint_helper"
sfConvexShape_getPoint_helper :: ConvexShape -> CUInt -> Ptr Vec2f -> IO ()
instance SFShapeResizable ConvexShape where
setPointCount c count = sfConvexShape_setPointCount c (fromIntegral count)
foreign import ccall unsafe "sfConvexShape_setPointCount"
sfConvexShape_setPointCount :: ConvexShape -> CUInt -> IO ()
setPoint
:: ConvexShape
-> Int
-> Vec2f
-> IO ()
setPoint s idx p = with p $ sfConvexShape_setPoint_helper s (fromIntegral idx)
foreign import ccall unsafe "sfConvexShape_setPoint_helper"
sfConvexShape_setPoint_helper :: ConvexShape -> CUInt -> Ptr Vec2f -> IO ()
instance SFBounded ConvexShape where
getLocalBounds c = alloca $ \ptr -> sfConvexShape_getLocalBounds_helper c ptr >> peek ptr
getGlobalBounds c = alloca $ \ptr -> sfConvexShape_getGlobalBounds_helper c ptr >> peek ptr
foreign import ccall unsafe "sfConvexShape_getLocalBounds_helper"
sfConvexShape_getLocalBounds_helper :: ConvexShape -> Ptr FloatRect -> IO ()
foreign import ccall unsafe "sfConvexShape_getGlobalBounds_helper"
sfConvexShape_getGlobalBounds_helper :: ConvexShape -> Ptr FloatRect -> IO ()