{-# LANGUAGE CApiFFI #-}
module OpenCascade.Poly.Triangulation 
(Triangulation
, new
, nbNodes
, nbTriangles
, node 
, setNode
, triangle
, setTriangle
) where

import OpenCascade.Poly.Types (Triangle, Triangulation)
import OpenCascade.Poly.Internal.Destructors (deleteHandleTriangulation, deleteTriangle)
import OpenCascade.GP.Types as GP
import OpenCascade.GP.Internal.Destructors (deletePnt)
import OpenCascade.Handle (Handle)
import Foreign.Ptr (Ptr)
import Foreign.C (CInt (..), CBool (..))
import OpenCascade.Internal.Bool (boolToCBool)
import Data.Acquire (Acquire, mkAcquire)

foreign import capi unsafe "hs_Poly_Triangulation.h hs_new_Poly_Triangulation" rawNew :: CInt -> CInt -> CBool -> CBool -> IO (Ptr (Handle Triangulation))

new :: Int -> Int -> Bool -> Bool -> Acquire (Ptr (Handle Triangulation))
new nNodes nTriangles hasUVNodes hasNormals = mkAcquire (rawNew (fromIntegral nNodes) (fromIntegral nTriangles) (boolToCBool hasUVNodes) (boolToCBool hasNormals)) deleteHandleTriangulation

foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_nbNodes" rawNbNodes :: Ptr (Handle Triangulation) -> IO CInt

nbNodes :: Ptr (Handle Triangulation) -> IO Int
nbNodes tri = fromIntegral <$> rawNbNodes tri

foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_nbTriangles" rawNbTriangles :: Ptr (Handle Triangulation) -> IO CInt

nbTriangles :: Ptr (Handle Triangulation) -> IO Int
nbTriangles tri = fromIntegral <$> rawNbTriangles tri

foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_node" rawNode :: Ptr (Handle Triangulation) -> CInt -> IO (Ptr GP.Pnt)

node :: Ptr (Handle Triangulation) -> Int -> Acquire (Ptr GP.Pnt)
node tri index = mkAcquire (rawNode tri (fromIntegral index)) deletePnt

foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_setNode" rawSetNode :: Ptr (Handle Triangulation) -> CInt -> Ptr GP.Pnt -> IO()

setNode :: Ptr (Handle Triangulation) -> Int -> Ptr GP.Pnt -> IO ()
setNode tri index pnt = rawSetNode tri (fromIntegral index) pnt

foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_triangle" rawTriangle :: Ptr (Handle Triangulation) -> CInt -> IO (Ptr Triangle)

triangle :: Ptr (Handle Triangulation) -> Int -> Acquire (Ptr Triangle)
triangle tri index = mkAcquire (rawTriangle tri (fromIntegral index)) deleteTriangle

foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_setTriangle" rawSetTriangle :: Ptr (Handle Triangulation) -> CInt -> Ptr Triangle -> IO ()

setTriangle :: Ptr (Handle Triangulation) -> Int -> Ptr Triangle -> IO ()
setTriangle tri index theTriangle = rawSetTriangle tri (fromIntegral index) theTriangle