SceneGraph traversal in Haskell -
i want implement simple scenegraph in haskell using data.tree
consisting of transform
, shape
nodes. in scenegraph spatial transformation accumulated while traversing , applied shape rendering.
type transform = vector2 double data shape = circle double | square double data scenenode = xformnode transform | shapenode shape
say have scene object moved right , consisting of square @ bottom , circle on top
^ | | () | [] 0----->
i came tree definition:
let tree = node (xformnode (vector2 10 0)) [node (shapenode (square 10)) [] ,node (xformnode (vector2 0 10)) [node (shapenode (circle 10)) []] ]
the rendering this:
render :: position2 -> shape -> io () render p (circle r) = drawcircle p r render p (square a) = drawsquare p
my questions are:
1) how define traverse
function, accumulates transformation , calls render tasks?
2) how avoid making traverse io?
3) there shorter version define tree? first node definition , empty subforests superfluous.
thank you!
paradoxically, data.tree
not used in haskell because defining custom tree type easy. in case, implement scene graph (tree) follows:
type transform = vector2 double data shape = circle double | square double data scene = transform transform [scene] | shape shape
your example becomes
example :: scene example = transform (vector2 10 0) [ shape (square 10) , transform (vector2 0 10) [shape (circle 10)] ]
this answers point 3.
to traverse tree, use recursion:
render :: position2 -> scene -> io () render p (transform v scenes) = mapm_ (render (p+v)) scenes render p (shape (circle r)) = drawcircle p r render p (shape (square a)) = drawsquare p
there more generic traversals available, instance in data.traversable
, more "uniform". in short, using recursion on trees fine.
concering point 2, there nothing can once decide circles , squares should rendered in io
monad.
Comments
Post a Comment