ImageLoader imageLoader; ImageLoadThread imageLoadThread = new ImageLoadThread(""); BImage b; int help; BFont font; ScapeSound scapesound; int numbOfFreqs; void setup () { numbOfFreqs = 80; scapesound = new ScapeSound(numbOfFreqs); scapesound.start(); background(255); size(720, 500); smooth(); font = loadFont("Meta.vlw.gz"); textFont(font, 24); noStroke(); imageLoader = new ImageLoader(); } int start = 0; boolean didntTypeYet = true; boolean finnished = false; String showMeAtStart = "Landscape generates a scenery for your entered words"; boolean first = false; boolean allowedToPressEnter = true; int rightmargin = 10; StringBuffer urlInput = new StringBuffer(); void loop () { if (!finnished) { textFont(font, 24); background(255); float rPos = font.width(urlInput.toString()) + 110; fill(0); stroke(0); line(rPos + 1, 110, rPos + 1, 140); text(showMeAtStart, 110, 100); if (didntTypeYet) { text("type a word for your desired scape!", 115, 130); } text(urlInput.toString(), 110, 130); } else { noStroke(); if (first) { int timeAlive = 0; while (imageLoadThread.isAlive()) { timeAlive++; if (keyPressed && key == 27) { handleException("Run again?"); imageLoadThread.interrupt(); break; } } b = imageLoadThread.getImage(); int w = b.width; first = false; background(255); startImageLoadThread(); } if (start < b.height - 1) { push(); translate(width / 2 - b.width * 2, 0); rotateX(1.5f); translate(0, -b.height * 4 + height/2, -height*0.9); int step = b.width / numbOfFreqs; for (int i = 0; i < numbOfFreqs; i++) { double helpD = 0; for (int j = 0; j < step; j++) { if (i * step + j < b.width - 1) { helpD += paint(i * step + j, start); } else { help = b.pixels[b.width * start]; helpD += (red(help) + green(help) + blue(help)) / (3 * 255); } } scapesound.setAmplitude(i, helpD / (255 * step)); } for (int i = 0; i < b.width - 1; i++) { int x = i; paint(x, start); } pop(); } else { start = 0; first = true; } start++; } } void startImageLoadThread () { String nextLink = ""; try { nextLink = imageLoader.getNextLink(); } catch (Exception e) { handleException("No more Scape to build. Run again?"); } imageLoadThread = new ImageLoadThread(nextLink); imageLoadThread.start(); } void handleException (String message) { showMeAtStart = message; didntTypeYet = true; urlInput.delete(0, urlInput.length()); finnished = false; allowedToPressEnter = true; imageLoader = new ImageLoader(); } void keyPressed () { char k; k = (char)key; switch (key) { case 8: //user pressed delete key if (urlInput.length() > 0) { urlInput = urlInput.deleteCharAt(urlInput.length() - 1); } break; case 10: //user pressed return key if (allowedToPressEnter) { first = true; allowedToPressEnter = false; imageLoader.init(urlInput.toString()); startImageLoadThread(); finnished = true; } break ; case 27: //user pressed escape handleException("Canceling of generation. Run again?"); break; default: if (font.width(urlInput.toString() + k) < width - rightmargin && key > 31 && key < 127) { didntTypeYet = false; urlInput.append(k); } break; } } float paint (int x, int y) { float result; beginShape(QUADS); help = b.pixels[y * b.width + x]; fill(help); result = getZ(help, x, y); vertex(x * 4, y * 4, result); help = b.pixels[(y + 1) * b.width + x]; fill(help); vertex(x * 4, (y + 1) * 4, getZ(help, x, y + 1)); help = b.pixels[(y + 1) * b.width + x + 1]; fill(help); vertex((x + 1) * 4, (y + 1) * 4, getZ(help, x + 1, y + 1)); help = b.pixels[y * b.width + x + 1]; fill(help); vertex((x + 1) * 4, y * 4, getZ(help, x + 1, y)); endShape(); return result; } float getZ (color col, int x, int y) { if (x == 0 || y == 0 || x == b.width - 1 || y == b.height - 1) { return 0; } return ((red(col) + green(col) + blue(col)) / 3); } class ImageLoader { prohtml.HtmlTree findImages; java.util.List imageLinks; int availableImages; int numberOfPic; String url; BImage image; ImageLoader () { imageLinks = new ArrayList(); availableImages = 0; numberOfPic = 0; } void init (String url) { String phpUrl = ""; String phpImg = ""; if(online()){ findImages = new prohtml.HtmlTree(new StringReader(getUrlString(url)),url); phpImg = "open_image.php?image="; }else{ findImages = new prohtml.HtmlTree("http://www.flickr.com/services/rest/?api_key=dddbf89af26f74f68506d8dce99178ff&method=flickr.photos.search&text="+url); } prohtml.HtmlElement photos = (prohtml.HtmlElement)findImages.pageTree.getSpecificElements("photos").get(0); availableImages = Math.max(Integer.parseInt(photos.getAttribute("total")), 100); println("availableImages:"+availableImages); java.util.List photoList = photos.getChildren(); prohtml.StandAloneElement photo; String serverId = ""; String photoId = ""; String secret = ""; for (int i = 0; i < photoList.size(); i++) { photo = (prohtml.StandAloneElement)photoList.get(i); serverId = photo.getAttribute("server"); photoId = photo.getAttribute("id"); secret = photo.getAttribute("secret"); imageLinks.add(phpImg+"http://photos" + serverId + ".flickr.com/" + photoId + "_" + secret + "_m.jpg"); } } private String getUrlString (String url) { url = "open_list.php?text=" + url; String result = ""; try { String lines[] = loadStrings(url); for (int i = 0; i < lines.length; i++) { result += lines[i]; } } catch (Exception e) { e.printStackTrace(); throw new IllegalArgumentException(); } println(result); return result; } String getNextLink () throws NoMorePicturesException { if (numberOfPic == availableImages) { throw new NoMorePicturesException(); } String result = (String)imageLinks.get(numberOfPic); numberOfPic++; return result; } } class NoMorePicturesException extends Exception { NoMorePicturesException () { super("This is not a parsable URL"); } } class ImageLoadThread extends Thread { String url; BImage image; ImageLoadThread (String url) { this.url = url; } public void run () { //println("startload:"+url); image = loadImage(url); //println("endload:"+url); } BImage getImage () { return image; } }