module Waterfall.Internal.ToOpenCascade
( v3ToVertex
, v3ToPnt
, v3ToDir
) where

import Linear (V3 (..))
import Data.Acquire (Acquire)
import Foreign.Ptr (Ptr)
import qualified OpenCascade.TopoDS as TopoDS
import qualified OpenCascade.GP as GP
import qualified OpenCascade.GP.Pnt as GP.Pnt
import qualified OpenCascade.GP.Dir as GP.Dir
import qualified OpenCascade.BRepBuilderAPI.MakeVertex as MakeVertex


v3ToPnt :: V3 Double -> Acquire (Ptr GP.Pnt)
v3ToPnt :: V3 Double -> Acquire (Ptr Pnt)
v3ToPnt (V3 Double
x Double
y Double
z) = Double -> Double -> Double -> Acquire (Ptr Pnt)
GP.Pnt.new Double
x Double
y Double
z

v3ToDir :: V3 Double -> Acquire (Ptr GP.Dir)
v3ToDir :: V3 Double -> Acquire (Ptr Dir)
v3ToDir (V3 Double
x Double
y Double
z) = Double -> Double -> Double -> Acquire (Ptr Dir)
GP.Dir.new Double
x Double
y Double
z

v3ToVertex :: V3 Double -> Acquire (Ptr TopoDS.Vertex)
v3ToVertex :: V3 Double -> Acquire (Ptr Vertex)
v3ToVertex V3 Double
v = do
    Ptr Pnt
pnt <- V3 Double -> Acquire (Ptr Pnt)
v3ToPnt V3 Double
v
    Ptr MakeVertex
builder <- Ptr Pnt -> Acquire (Ptr MakeVertex)
MakeVertex.fromPnt Ptr Pnt
pnt
    Ptr MakeVertex -> Acquire (Ptr Vertex)
MakeVertex.vertex Ptr MakeVertex
builder