/**
   * collect all nodes
   *
   * @param branch
   */
  private void collectNodes(KNode branch) {
    Camera cam = engine.getCamera();

    Iterator<KNode> nodeIterator = branch.getLeafs().iterator();
    while (nodeIterator.hasNext()) {
      KNode n = nodeIterator.next();

      n.updateMatrix();

      if (n.isVisible()) {
        if (n instanceof VisualNode) {
          if (cam == null || (cam != null && cam.isVisible((VisualNode) n))) {
            visuals.add((VisualNode) n);
          }
        }

        collectNodes(n);
      }
    }
  }
  public void renderScene(GL2 gl, KNode branch) {
    // enter model view matrix
    gl.glMatrixMode(GL2.GL_MODELVIEW);

    if (branch.isVisible() == false) return;

    if (updateNeeded) {
      // collect nodes
      visuals.clear();
      collectNodes(branch);
    }

    // TODO: sort nodes, when transformations changed
    // TODO: split in transparent / opaque

    // render nodes
    for (VisualNode n : visuals) {
      gl.glPushMatrix();
      renderVisualNode(gl, n);
      gl.glPopMatrix();
    }
  }