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--; } }