Exemplo n.º 1
0
  protected void drawCurrentPolygon(Graphics2D g) {
    if (!(sourcePolygon instanceof TexturedPolygon3D)) {
      // not a textured polygon - return
      return;
    }
    buildSurface();
    TexturedPolygon3D poly = (TexturedPolygon3D) destPolygon;
    Texture texture = poly.getTexture();
    ScanRenderer scanRenderer = (ScanRenderer) scanRenderers.get(texture.getClass());
    scanRenderer.setTexture(texture);
    Rectangle3D textureBounds = poly.getTextureBounds();

    a.setToCrossProduct(textureBounds.getDirectionV(), textureBounds.getOrigin());
    b.setToCrossProduct(textureBounds.getOrigin(), textureBounds.getDirectionU());
    c.setToCrossProduct(textureBounds.getDirectionU(), textureBounds.getDirectionV());

    // w is used to compute depth at each pixel
    w =
        SCALE
            * MIN_DISTANCE
            * Short.MAX_VALUE
            / (viewWindow.getDistance() * c.getDotProduct(textureBounds.getOrigin()));

    int y = scanConverter.getTopBoundary();
    viewPos.y = viewWindow.convertFromScreenYToViewY(y);
    viewPos.z = -viewWindow.getDistance();

    while (y <= scanConverter.getBottomBoundary()) {
      ScanConverter.Scan scan = scanConverter.getScan(y);

      if (scan.isValid()) {
        viewPos.x = viewWindow.convertFromScreenXToViewX(scan.left);
        int offset =
            (y - viewWindow.getTopOffset()) * viewWindow.getWidth()
                + (scan.left - viewWindow.getLeftOffset());

        scanRenderer.render(offset, scan.left, scan.right);
      }
      y++;
      viewPos.y--;
    }
  }