 
         root = linesToTree lines
 
-        root._text_object ?= @getLineObject(root.line)
-        root._text_object.children.forEach (mesh) ->
-            mesh.material.uniforms.opacity.value = 1
-        lines_object.add root._text_object
-
-        bbox = new THREE.BoundingBoxHelper( root._text_object, 0xff0000 )
-        do bbox.update
-
-        @scene.add bbox
-
-        @panCameraToPosition bbox.box.center(), 1000
-            .then => @zoomToBoundingBox(bbox.box, 1000)
+        traverse = (parent) =>
+            parent._text_object ?= @getLineObject(parent.line)
+            parent._text_object.children.forEach (mesh) ->
+                mesh.material.uniforms.opacity.value = 1
+            lines_object.add parent._text_object
+
+            return if ! parent.children?
+
+            parent.children.forEach (child) =>
+                child._text_object ?= @getLineObject(child.line)
+                child._text_object.children.forEach (mesh) ->
+                    mesh.material.uniforms.opacity.value = 1
+                lines_object.add child._text_object
+
+            positions_array = parent.children.concat parent
+            d3.shuffle positions_array
+            parent_index = positions_array.indexOf parent
+
+            positions_array.forEach (node, index) =>
+                obj = node._text_object
+                offset_from_parent = index - parent_index
+                height = obj._layout.height
+                obj.position.y = offset_from_parent * (height + LINE_SPACING)
+
+            parent.children.forEach alignToNode(parent)
+
+            # debugger
+
+            # debugger
+
+        traverse root
+
+        # root._text_object ?= @getLineObject(root.line)
+        # root._text_object.children.forEach (mesh) ->
+        #     mesh.material.uniforms.opacity.value = 1
+        # lines_object.add root._text_object
+        #
+        # bbox = new THREE.BoundingBoxHelper( root._text_object, 0xff0000 )
+        # do bbox.update
+        #
+        # @scene.add bbox
+        #
+        # @panCameraToPosition bbox.box.center(), 1000
+        #     .then => @zoomToBoundingBoxWidth(bbox.box, 1000)
 
 
     animate: =>

        h_fov = Math.atan( Math.tan(v_fov/2) * @camera.aspect )

        # See: stackoverflow.com/questions/2866350/move-camera-to-fit-3d-scene
        distance = (width / 2) / Math.tan(h_fov) + buffer

        target = new THREE.Vector3(0, 0, - distance)

        @zoomCameraToPosition target, duration

    addLines: (lines) =>
        lines_object = new THREE.Object3D()

        .domain([0, 360])
        .range([0, Math.PI * 2])

    zoomToBoundingBoxWidth: (box, duration) ->
        width = Math.abs(box.min.x - box.max.x)

        distance_scale = 1.2

        v_fov = _radianScale @camera.fov

