/**
  * process the hit
  *
  * @param hitting e.g. ray
  * @param hits hits where drawables are stored
  */
 public void hit(Hitting hitting, Hits3D hits) {
   for (Drawable3DList list : lists) {
     for (Drawable3D d : list) {
       d.hitIfVisibleAndPickable(hitting, hits);
     }
   }
 }
 /**
  * draw in .obj format through renderer
  *
  * @param renderer renderer
  */
 public void drawInObjFormat(Renderer renderer) {
   for (Drawable3DList list : lists) {
     for (Drawable3D d : list) {
       d.drawInObjFormat(renderer);
     }
   }
 }
 public String toString() {
   StringBuilder sb = new StringBuilder();
   for (Drawable3D d : this) {
     sb.append(d);
     sb.append(" -- ");
     sb.append(d.getGeoElement().getLabel(StringTemplate.defaultTemplate));
     sb.append("\n");
   }
   return sb.toString();
 }
  /**
   * @param mouseLoc mouse location
   * @return first hitted label geo
   */
  public GeoElement getLabelHit(GPoint mouseLoc) {
    for (Drawable3DList list : lists) {
      for (Drawable3D d : list) {
        if (d.isVisible()) {
          GeoElement geo = d.getGeoElement();
          if (!geo.isGeoText() && geo.isPickable() && d.label.hit(mouseLoc)) {
            return geo;
          }
        }
      }
    }

    return null;
  }
  /**
   * remove the drawable from the correct list
   *
   * @param drawable drawable to remove
   */
  protected void remove(Drawable3D drawable) {

    // TODO fix it
    if (drawable != null) {
      // App.debug(drawable.getGeoElement()+"");
      drawable.removeFromDrawable3DLists(this);
    }
  }
  /** update all 3D objects */
  public void updateAll() {

    /*
     * if (isUpdatingAll){
     * Application.printStacktrace("is already updating"); return; }
     *
     * isUpdatingAll = true;
     */

    for (int i = 0; i < Drawable3D.DRAW_TYPE_MAX; i++)
      for (Iterator<Drawable3D> d = lists[i].iterator(); d.hasNext(); ) {
        Drawable3D d3d = d.next();
        // Application.debug("updating :"+d3d.getGeoElement());
        d3d.update();
      }

    // isUpdatingAll = false;

  }
 /** says that it has to be updated */
 @Override
 public void setWaitForUpdate() {
   elementHasChanged = true;
   super.setWaitForUpdate();
 }
  /**
   * add the drawable to the correct list
   *
   * @param drawable drawable to add
   */
  public void add(Drawable3D drawable) {

    drawable.addToDrawable3DLists(this);
  }