{-# LANGUAGE CApiFFI #-}
module OpenCascade.BRep.Tool
( curve
, curveParamFirst
, curveParamLast
, triangulation
) where

import qualified OpenCascade.Geom as Geom
import qualified OpenCascade.TopoDS as TopoDS

import qualified OpenCascade.TopLoc.Types as TopLoc
import qualified OpenCascade.Poly.Types as Poly
import OpenCascade.Poly.Internal.Destructors (deleteHandleTriangulation)
import OpenCascade.Handle (Handle)
import OpenCascade.Geom.Internal.Destructors (deleteHandleCurve)
import Foreign.Ptr
import Foreign.C
import Data.Coerce
import Data.Acquire (Acquire, mkAcquire)

foreign import capi unsafe "hs_BRep_Tool.h hs_BRep_Tool_curve" rawCurve :: Ptr (TopoDS.Edge) -> IO(Ptr (Handle Geom.Curve))

curve :: Ptr TopoDS.Edge -> Acquire (Ptr (Handle Geom.Curve))
curve :: Ptr Edge -> Acquire (Ptr (Handle Curve))
curve Ptr Edge
edge = IO (Ptr (Handle Curve))
-> (Ptr (Handle Curve) -> IO ()) -> Acquire (Ptr (Handle Curve))
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire (Ptr Edge -> IO (Ptr (Handle Curve))
rawCurve Ptr Edge
edge) Ptr (Handle Curve) -> IO ()
deleteHandleCurve

foreign import capi unsafe "hs_BRep_Tool.h hs_BRep_Tool_curveParamFirst" rawCurveParamFirst :: Ptr (TopoDS.Edge) -> IO(CDouble)

curveParamFirst :: Ptr TopoDS.Edge -> IO Double 
curveParamFirst :: Ptr Edge -> IO Double
curveParamFirst = (Ptr Edge -> IO CDouble) -> Ptr Edge -> IO Double
forall a b. Coercible a b => a -> b
coerce Ptr Edge -> IO CDouble
rawCurveParamFirst

foreign import capi unsafe "hs_BRep_Tool.h hs_BRep_Tool_curveParamLast" rawCurveParamLast :: Ptr (TopoDS.Edge) -> IO(CDouble)

curveParamLast :: Ptr TopoDS.Edge -> IO Double 
curveParamLast :: Ptr Edge -> IO Double
curveParamLast = (Ptr Edge -> IO CDouble) -> Ptr Edge -> IO Double
forall a b. Coercible a b => a -> b
coerce Ptr Edge -> IO CDouble
rawCurveParamLast

foreign import capi unsafe "hs_BRep_Tool.h hs_BRep_Tool_triangulation" rawTriangulation :: Ptr (TopoDS.Face) -> Ptr TopLoc.Location -> IO(Ptr (Handle Poly.Triangulation))

triangulation :: Ptr TopoDS.Face -> Ptr TopLoc.Location -> Acquire (Ptr (Handle Poly.Triangulation))
triangulation :: Ptr Face -> Ptr Location -> Acquire (Ptr (Handle Triangulation))
triangulation Ptr Face
face Ptr Location
loc = IO (Ptr (Handle Triangulation))
-> (Ptr (Handle Triangulation) -> IO ())
-> Acquire (Ptr (Handle Triangulation))
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire (Ptr Face -> Ptr Location -> IO (Ptr (Handle Triangulation))
rawTriangulation Ptr Face
face Ptr Location
loc) Ptr (Handle Triangulation) -> IO ()
deleteHandleTriangulation