Request Image

request-image.pde
/**
 * Request Image
 * by Ira Greenberg. Translated to ProcessingGL C++.
 *
 * requestImage() loads images on a background thread so the sketch
 * doesn't freeze. While loading, a bouncing ellipse plays.
 * Width == 0: still loading. Width == -1: load failed.
 */

int imgCount = 12;
PImage* imgs[12];
float imgW;
bool loadStates[12];
float loaderX, loaderY, theta;

bool checkLoadStates() {
    for (int i = 0; i < imgCount; i++) {
        if (!loadStates[i]) return false;
    }
    return true;
}

void drawImages() {
    int y = (height - imgs[0]->height) / 2;
    for (int i = 0; i < imgCount; i++) {
        image(imgs[i], width / imgCount * i, y,
              imgs[i]->height, imgs[i]->height);
    }
}

void runLoaderAni() {
    if (!checkLoadStates()) {
        ellipse(loaderX, loaderY, 10, 10);
        loaderX += 2;
        loaderY = height/2 + sin(theta) * (height/8);
        theta += PI / 22;
        if (loaderX > width + 5) loaderX = -5;
    }
}

void setup() {
    size(640, 360);
    imgW = width / imgCount;
    for (int i = 0; i < imgCount; i++) {
        loadStates[i] = false;
        imgs[i] = requestImage("PT_anim" + nf(i, 4) + ".gif");
    }
}

void draw() {
    background(0);
    runLoaderAni();
    for (int i = 0; i < imgCount; i++) {
        if (imgs[i] != nullptr &&
            imgs[i]->width != 0 &&
            imgs[i]->width != -1) {
            loadStates[i] = true;
        }
    }
    if (checkLoadStates()) {
        drawImages();
    }
}