module Direct.GL () where
import Common.GL
import Direct.Graph
import GraphRewriting.Layout.PortSpec
import qualified Graphics.UI.GLUT as GL
import GraphRewriting.GL.Render
instance PortSpec SKI where
portSpec node = let sd = sameDir in case node of
S {} → [sd n]
K {} → [sd n]
I {} → [sd n]
Applicator {} → [sd n, sd (sw*0.7), sd (se*0.7)]
Duplicator {} → [sd nw, sd ne, sd s]
Eraser {} → [sd s]
Variable {} → [sd n]
Root {} → [sd s]
where
n = Vector2 0 1
s = Vector2 0 (-1)
sw = Vector2 (-1) (-1)
se = Vector2 1 (-1)
nw = Vector2 (-1) 1
ne = Vector2 1 1
instance Render SKI where render = renderNode
renderNode Root {} = return ()
renderNode node = drawPorts node >> case node of
S {} → drawNode "S"
K {} → drawNode "K"
I {} → drawNode "I"
Applicator {} → drawNode "A"
Duplicator {} → GL.preservingMatrix $ GL.renderPrimitive GL.LineLoop $ do
vertex2 (0,-1)
vertex2 (-1,1)
vertex2 (1,1)
Eraser {} → drawNode "E"
Variable {name = n} → drawNode n