protected Vec4 draw(DrawContext dc, Iterator<TrackPoint> trackPositions) {
    if (dc.getVisibleSector() == null) return null;

    SectorGeometryList geos = dc.getSurfaceGeometry();
    if (geos == null) return null;

    if (!this.pipeShape.isInitialized) {
      this.pipeShape.initialize(dc);
    }

    if (!this.junctionShape.isInitialized) this.junctionShape.initialize(dc);

    int index = 0;
    List<Vec4> points = new ArrayList<Vec4>();
    while (trackPositions.hasNext()) {
      TrackPoint tp = trackPositions.next();
      if (index >= this.lowerLimit && index <= this.upperLimit) {
        Vec4 point = this.computeSurfacePoint(dc, tp);
        if (point != null) {
          points.add(point);
        }
      }
      if (++index >= this.upperLimit) break;
    }

    if (points.size() < 1) return null;

    this.begin(dc);
    {
      this.pipeMaterial.apply(dc.getGL(), GL.GL_FRONT);
      Vec4 p1 = points.get(0);
      for (int i = 1; i < points.size(); i++) {
        Vec4 p2 = points.get(i);
        this.pipeShape.render(dc, p1, p2, this.pipeRadius);
        p1 = p2;
      }

      this.junctionMaterial.apply(dc.getGL(), GL.GL_FRONT);
      for (Vec4 point : points) {
        this.junctionShape.render(dc, point, this.junctionShapeRadius);
      }
    }
    this.end(dc);

    return null; // TODO: return the last-drawn location
  }
Exemple #2
0
  protected void drawMany(DrawContext dc, Iterable<? extends WWIcon> icons, Layer layer) {
    if (dc == null) {
      String msg = Logging.getMessage("nullValue.DrawContextIsNull");
      Logging.logger().severe(msg);
      throw new IllegalArgumentException(msg);
    }

    if (dc.getVisibleSector() == null) return;

    SectorGeometryList geos = dc.getSurfaceGeometry();
    //noinspection RedundantIfStatement
    if (geos == null) return;

    if (icons == null) {
      String msg = Logging.getMessage("nullValue.IconIterator");
      Logging.logger().severe(msg);
      throw new IllegalArgumentException(msg);
    }

    Iterator<? extends WWIcon> iterator = icons.iterator();

    if (!iterator.hasNext()) return;

    double horizon = dc.getView().getHorizonDistance();

    while (iterator.hasNext()) {
      WWIcon icon = iterator.next();
      if (!isIconValid(icon, true)) {
        // Record feedback data for this WWIcon if feedback is enabled.
        if (icon != null) this.recordFeedback(dc, icon, null, null);

        continue;
      }

      if (!icon.isVisible()) {
        // Record feedback data for this WWIcon if feedback is enabled.
        this.recordFeedback(dc, icon, null, null);

        continue;
      }

      // Determine Cartesian position from the surface geometry if the icon is near the surface,
      // otherwise draw it from the globe.
      Position pos = icon.getPosition();
      Vec4 iconPoint = null;
      if (pos.getElevation() < dc.getGlobe().getMaxElevation()
          && !this.isAlwaysUseAbsoluteElevation()) {
        iconPoint = dc.getSurfaceGeometry().getSurfacePoint(icon.getPosition());
      }

      if (iconPoint == null) {
        Angle lat = pos.getLatitude();
        Angle lon = pos.getLongitude();
        double elevation = pos.getElevation();
        if (!this.isAlwaysUseAbsoluteElevation()) elevation += dc.getGlobe().getElevation(lat, lon);
        iconPoint = dc.getGlobe().computePointFromPosition(lat, lon, elevation);
      }

      double eyeDistance =
          icon.isAlwaysOnTop() ? 0 : dc.getView().getEyePoint().distanceTo3(iconPoint);

      // X-PATCH Marjan
      // extracted skip conditions into an overrideable method
      if (!meetsRenderCriteria(dc, icon, iconPoint, eyeDistance)) {
        this.recordFeedback(dc, icon, iconPoint, null);
        continue;
      }
      // X-END

      // The icons aren't drawn here, but added to the ordered queue to be drawn back-to-front.
      dc.addOrderedRenderable(new OrderedIcon(icon, iconPoint, layer, eyeDistance, horizon));

      if (icon.isShowToolTip()) this.addToolTip(dc, icon, iconPoint);
    }
  }