SketchPad

Some web space to sketch, doodle and make notes. Made using these tools. See more of my work here.

Sketch 2015-09-10

        void ofApp::setup(){
    ofSetWindowShape(500, 500);
    gif.setup(50);
    gif.fadeInOut(2, 3, ofColor::darkGray);
    gif.enableTextOverlay();
    numLayers = 4;
    numRects = gif.width * 0.5;
    masker.setup(numLayers);
    
    img.setup("road.png", 1.0, TEXTURE_OFFSET__MIDDLE__RIGHT_TO_CENTER);
    for(int i = 0; i < numLayers; i++) {
        scale = ofMap(i, 0, numLayers-1, -3, 16);
        img.setTextureScale(scale);
        img.setTextureOffsetY(ofRandom(2));
        textures.push_back(img);
    }
    
    img.setup("pcb2.png", 1.0, TEXTURE_OFFSET__MIDDLE__LEFT_TO_CENTER);
    for(int i = 0; i < numLayers; i++) {
        scale = ofMap(i, 0, numLayers-1, 2, 1);
        img.setTextureScale(scale);
        img.setTextureOffsetY(ofRandom(2));
        masks.push_back(img);
    }

    for(int i = 0; i < numRects; i++) {
        rectAlphaMultipliers.push_back(ofRandom(0.1, 0.5));
    }
    rectWidth = gif.width / numRects;
    
    ofSetWindowShape(1200, 1200);
    masker.toggleOverlay();
}

void ofApp::update(){
    for(int i = 0; i < numLayers; i++) {
        masker.beginLayer(i);
        {
            textures.at(i).incrementTextureOffsetY(ofMap(i, 0, numLayers-1, -0.002, 0.002));
            textures.at(i).draw();
        }
        masker.endLayer(i);
        
        masker.beginMask(i);
        {
            masks.at(i).incrementTextureOffsetY(ofMap(i, 0, numLayers-1, -0.002, 0.002));
            masks.at(i).draw();
        }
        masker.endMask(i);
    }
}

void ofApp::draw(){
    gif.begin();
    {
        masker.draw();
    }
    gif.endCaptureDraw();
    masker.drawOverlay();
}
    

Faces in the soup

Daily sketch

Sketch 2015-09-03

        void ofApp::setup(){
    ofSetWindowShape(500, 500);
    gif.setupPaused(170, 220);
    gif.fadeInOut(6, 4, ofColor::white, 0);
    card1.setup("card-1.png", 1.0, TEXTURE_OFFSET_MIDDLE_RIGHT);
    card2.setup("glass-2.png", 1.0, TEXTURE_OFFSET_MIDDLE_RIGHT);
    card3.setup("card-mask.png", 1.0, TEXTURE_OFFSET_MIDDLE_RIGHT);
    card4.setup("card-mask.png", 0.75, TEXTURE_OFFSET_MIDDLE_LEFT);
    glass1.setup("glass-1.png", 0.4, TEXTURE_OFFSET_TOP_LEFT);
    glass2.setup("card-1.png", 150.0, TEXTURE_OFFSET_BOTTOM_LEFT);
    glass3.setup("glass-2.png", 110.0, TEXTURE_OFFSET_BOTTOM_RIGHT);
    glass4.setup("glass-2.png", 120.0, TEXTURE_OFFSET_TOP_LEFT);
    masker.setup(4, ISOLATE_LAYERS);
    card4.incrementTextureOffset(-0.1, -0.5);
    ofSetWindowShape(1200, 1000);
    masker.toggleOverlay();
}

void ofApp::update(){
    masker.beginLayer(0);
    {
        ofSetColor(ofColor::red);
        card1.incrementTextureOffsetX(0.003);
        card1.draw();
    }
    masker.endLayer(0);
    
    masker.beginMask(0);
    {
        glass2.incrementTextureOffsetX(0.005);
        glass2.incrementTextureScale(0.1);
        glass2.draw();
    }
    masker.endMask(0);

    masker.beginLayer(1);
    {
        ofSetColor(ofColor::red);
        card2.incrementTextureOffsetX(0.002);
        card2.draw();
    }
    masker.endLayer(1);
    
    masker.beginMask(1);
    {
        glass3.incrementTextureOffsetX(0.002);
        glass3.incrementTextureScale(0.05);
        glass3.draw();
    }
    masker.endMask(1);

    masker.beginLayer(2);
    {
        ofSetColor(ofColor::red);
        card3.incrementTextureOffsetX(0.005);
        card3.draw();
    }
    masker.endLayer(2);
    
    masker.beginMask(2);
    {
        glass4.incrementTextureOffsetX(0.008);
        glass4.incrementTextureScale(0.14);
        glass4.draw();
    }
    masker.endMask(2);

    masker.beginLayer(3);
    {
        glass1.incrementTextureOffset(-0.0025, 0.004);
        glass1.incrementTextureScale(0.004);
        glass1.draw(0, -gif.halfHeight);
        glass1.draw(0, gif.halfHeight, TEXTURE_FLIP_HORIZONTAL);
    }
    masker.endLayer(3);
    
    masker.beginMask(3);
    {
        card4.incrementTextureScale(0.0075);
        card4.incrementTextureOffsetX(0.001);
        card4.draw();
    }
    masker.endMask(3);
}

void ofApp::draw(){
    gif.begin();
    {
        gif.rotateAroundCenter(270);
        //card1.draw();
        masker.draw();
    }
    gif.endAndCaptureFrame();
    gif.draw();
    masker.drawOverlay();
}
    

A sheer drop.

Daily sketch

Sketch 2015-08-31

        void ofApp::setup(){
    ofSetWindowShape(500, 500);
    gif.setupPaused(280, 330);
    gif.fadeInOut(2, 3, ofColor::white);
    
    pattern1.setup(&gif);
    pattern2.setup(&gif);

    ofSetWindowShape(1200, 1200);
}

void ofApp::update(){
    pattern1.update();
    pattern2.update();
}

void ofApp::draw(){
    gif.begin();
    {
        ofEnableAlphaBlending();
        pattern1.draw();
        pattern2.draw();
    }
    gif.endCaptureDraw();
}

void Pattern1::setup(ofxGifEncoderTemplate *_gif) {
    gif = _gif;
    masker.setup(1, ISOLATE_LAYERS);
    masker.toggleOverlay();
    
    img1.setup("pcb-bw.png", 2.0);
    img2.setup("glass3.png", 0.2);
}

void Pattern1::update() {
    masker.beginLayer();
    {
        img1.draw();
    }
    masker.endLayer();
    
    masker.beginMask();
    {
        img1.draw();
    }
    masker.endMask();
}

void Pattern1::draw() {
    ofPushMatrix();
    ofEnableAlphaBlending();
    img1.incrementTextureScale(0.06);
    img2.incrementTextureScale(0.06);
    
    ofSetColor(ofColor::white, ceil(ofRandom(6)) * 13);
    img2.draw();
    
    masker.draw();
    if(ofRandom(1) > 0.75) {
        ofSetColor(ofColor::white, 255);
        gif->rotateAroundCenter(90 * floor(ofRandom(4)));
        
        for(int i = 0; i < ofRandom(2, 10); i++) {
            masker.draw();
        }
    } else if(ofRandom(1) > 0.75) {
        img1.setTexturePosition(ofRandom(2), ofRandom(2));
        img1.setTextureScale(ofRandom(0.2, 2));
        img2.setTextureScale(ofRandom(1, 3));
        gif->rotateAroundCenter(90 * floor(ofRandom(4)));
        ofSetColor(ofColor::white, ofRandom(10, 20));
        img1.draw();
    }
    ofPopMatrix();
}

void Pattern2::setup(ofxGifEncoderTemplate *_gif) {
    gif = _gif;
    layerIncrement = 0.01;
    maskIncrement = 0.0005;
    
    numLayers = 20;
    masker.setup(numLayers);
    
    for(int i = 0; i < numLayers; i++) {
        scale = ofMap(i, 0, numLayers-1, 0.25, 1);

        img.setup("rust-tall2.png");
        img.setTextureScale(scale);
        img.setTextureOffset(i % 2 == 0 ? TEXTURE_OFFSET_TOP_LEFT : TEXTURE_OFFSET_TOP_RIGHT);
        img.setTextureOffsetY(ofRandom(2));
        layers.push_back(img);
        
        scale = ofMap(i, 0, numLayers-1, 0.5, 1.3);
        img.setup("circle-feather.png", scale, TEXTURE_OFFSET_MIDDLE_CENTER);
        img.setTextureOffsetY(ofRandom(2));
        masks.push_back(img);
    }
}

void Pattern2::update() {
    for(int i = 0; i < numLayers; i++) {
        masker.beginLayer(i);
        {
            gif->rotateAroundCenter(i * 90);
            ofSetColor(ofColor(ofColor::white, 160));
            increment = ofMap(i, 0, numLayers-1, layerIncrement, -layerIncrement);
            layers.at(i).incrementTextureScale(i % 2 == 0 ? increment : -increment * 8);
            layers.at(i).incrementTextureOffsetX((i % 2 == 0 ? increment : -increment) * ofRandom(-2, 27));
            layers.at(i).incrementTextureOffsetY((i % 2 == 0 ? -increment : increment) * ofRandom(-2, 27));
            layers.at(i).draw();
        }
        masker.endLayer(i);
        
        masker.beginMask(i);
        {
            ofSetColor(ofColor::white);
            ofBackground(ofColor::white);
            increment = ofMap(i, 0, numLayers-1, maskIncrement, -maskIncrement);
            masks.at(i).incrementTextureOffsetY(increment);
            i % 2 == 0 ? masks.at(i).draw() : masker.drawLayer(i - 1, false);
        }
        masker.endMask(i);
    }
}

void Pattern2::draw() {
    masker.drawLayer(4);
    masker.drawLayer(9);
    masker.drawLayer(12);
    masker.drawLayer(13);
    masker.drawLayer(16);
}
    

The murky underneath.

Daily sketch

Sketch 2015-08-23

        void ofApp::setup(){
    ofSetWindowShape(500, 500);
    gif.setupPaused(40, 80);

    numLayers = 2;
    masker.setup(numLayers, ISOLATE_LAYERS);
    masker.toggleOverlay();
    
    img1.setup("pcb-bw.png");
    img2.setup("rust-tall2.png", 1.0, TEXTURE_OFFSET__MIDDLE__RIGHT_TO_CENTER);
    
    horizontalMasks.setup(200, gif.height);
    
    ofSetWindowShape(1200, 1200);
}

void ofApp::update(){
    masker.beginLayer(0);
    {
        ofBackground(ofColor::black);
        horizontalMasks.draw();
    }
    masker.endLayer(0);
    
    masker.beginMask(0);
    {
        ofBackground(ofColor::black);
        img1.incrementTextureOffsetY(-0.2);
        img1.draw();
    }
    masker.endMask(0);

    masker.beginLayer(1);
    {
        ofBackground(ofColor::black);
        masker.drawLayer(0);
    }
    masker.endLayer(1);
    
    masker.beginMask(1);
    {
        ofBackground(ofColor::black);
        img2.incrementTextureOffsetY(0.02);
        img2.setTextureScale(ofMap(sin(ofGetFrameNum() * 0.125), -1, 1, 0.5, 1.5));
        img2.draw();
    }
    masker.endMask(1);
}

void ofApp::draw(){
    gif.begin();
    {
        ofEnableAlphaBlending();
        ofBackground(ofColor::red);
        int i = 0;
        while(i < 1000) {
            i += ofRandom(90, 360);
            gif.rotateAroundCenter(i);
            masker.draw();
        }
    }
    gif.endCaptureDraw();
    masker.drawOverlay();
}

void MaskArray::setup(int _number, float _size) {
    number = _number;
    size = _size;
    unitSize = size / number;
    
    for(int i = 0; i < size; i++) {
        alphas.push_back(ofRandom(255));
        speeds.push_back(ceil(ofRandom(6)) * 30);
        directions.push_back(ofRandom(1) > 0.5 ? 1 : -1);
    }
}

void MaskArray::draw() {
    for(int i = 0; i < number; i++) {
        alphas.at(i) += speeds.at(i) * directions.at(i);
        bounce(i);
        ofSetColor(ofColor(ofColor::white, alphas.at(i)));
        ofRect(0, unitSize * i, size, unitSize);
    }
}

void MaskArray::bounce(int i) {
    if(alphas.at(i) < 0) {
        alphas.at(i) = 0;
        directions.at(i) = 1;
    }

    if(alphas.at(i) > 255) {
        alphas.at(i) = 255;
        directions.at(i) = -1;
    }
}

void MaskArray::debug() {
    for(int i = 0; i < number; i++) {
        cout << i << " " << alphas.at(i) << endl;
    }
    
    cout << "=======" << endl << endl << endl;
}
    

Vaz Differenz

Daily sketch

Sketch 2015-08-18

        void ofApp::setup(){
    ofSetWindowShape(500, 500);
    gif.setup(50);
    gif.fadeInOut(2, 1, ofColor::red);
    gif.enableTextOverlay();

    layerIncrement = 0.01;
    maskIncrement = 0.0005;

    numLayers = 20;
    numMasksPerLayer = 1;
    masker.setup(numLayers);

    layer.setup("rust-tall2.png");
    for(int i = 0; i < numLayers; i++) {
        scale = ofMap(i, 0, numLayers-1, 0.25, 1);
        layer.setTextureScale(scale);
        layer.setTextureOffset(i % 2 == 0 ? TEXTURE_OFFSET_TOP_LEFT : TEXTURE_OFFSET_TOP_RIGHT);
        layer.setTextureOffsetY(ofRandom(2));
        layers.push_back(layer);

        maskLoader.clear();
        scale = ofMap(i, 0, numLayers-1, 0.5, 1.3);
        mask.setup("circle-feather.png", scale, TEXTURE_OFFSET_MIDDLE_CENTER);
        for(int j = 0; j < numMasksPerLayer; j++) {
            mask.setTextureOffsetY(ofRandom(2));
            maskLoader.push_back(mask);
        }
        masks.push_back(maskLoader);
    }

    ofSetWindowShape(1000, 1200);
    masker.toggleOverlay();
}

void ofApp::update(){
    for(int i = 0; i < numLayers; i++) {
        masker.beginLayer(i);
        {
            gif.rotateAroundCenter(i * 90);
            ofSetColor(ofColor(ofColor::red));
            increment = ofMap(i, 0, numLayers-1, layerIncrement, -layerIncrement);
            layers.at(i).incrementTextureScale(i % 2 == 0 ? increment : -increment * 8 );
            layers.at(i).incrementTextureOffsetX((i % 2 == 0 ? increment : -increment) * ofRandom(-2, 27));
            layers.at(i).incrementTextureOffsetY((i % 2 == 0 ? -increment : increment) * ofRandom(-2, 27));
            layers.at(i).draw();
        }
        masker.endLayer(i);
        
        masker.beginMask(i);
        {
            ofSetColor(ofColor::white);
            ofBackground(ofColor::white);
            for(int j = 0; j < numMasksPerLayer; j++) {
                increment = (j+1) * ofMap(i, 0, numLayers-1, maskIncrement, -maskIncrement);
                masks.at(i).at(j).incrementTextureOffsetY(increment);
                i % 2 == 0 ? masks.at(i).at(j).draw() : masker.drawLayer(i - 1, false);
            }
        }
        masker.endMask(i);
    }
}

void ofApp::draw(){
    gif.begin();
    {
        gif.rotateAroundCenter(45);
        layers.at(0).draw();
        masker.drawLayer(13);
        masker.drawLayer(16);
    }
    gif.endCaptureDraw();
    masker.drawOverlay();
}
    

Uncertain agenda.

Daily sketch

Sketch 2015-08-15

        void ofApp::setup(){
    ofSetWindowShape(500, 500);
    gif.setup(ofGetTimestampString("out/%Y-%m-%d"), 50);
    gif.fadeInOut(2, 1, ofColor::red);
    gif.enableTextOverlay();

    layerIncrement = 0.005;
    maskIncrement = 0.0002;

    numLayers = 32;
    numMasksPerLayer = 6;
    masker.setup(numLayers);

    layer.setup("glass3.png");
    for(int i = 0; i < numLayers; i++) {
        scale = ofMap(i, 0, numLayers-1, 4, 2.5);
        layer.setTextureScale(scale);
        layer.setTextureOffset(i % 2 == 0 ? TEXTURE_OFFSET__MIDDLE__LEFT_TO_CENTER : TEXTURE_OFFSET__MIDDLE__RIGHT_TO_CENTER);
        layer.setTextureOffsetY(ofRandom(2));
        layers.push_back(layer);

        maskLoader.clear();
        scale = ofMap(i, 0, numLayers-1, 6, 0.33);
        mask.setup("tissue.png", scale, TEXTURE_OFFSET__MIDDLE__LEFT_TO_CENTER);
        for(int j = 0; j < numMasksPerLayer; j++) {
            mask.setTextureOffsetY(ofRandom(2));
            maskLoader.push_back(mask);
        }
        masks.push_back(maskLoader);
    }

    ofSetWindowShape(1000, 1200);
    masker.toggleOverlay();
}

void ofApp::update(){
    for(int i = 0; i < numLayers; i++) {
        masker.beginLayer(i);
        {
            ofSetColor(ofColor(ofColor::red));
            increment = ofMap(i, 0, numLayers-1, layerIncrement, -layerIncrement);
            layers.at(i).incrementTextureOffsetY(increment);
            layers.at(i).draw();
        }
        masker.endLayer(i);
        
        masker.beginMask(i);
        {
            ofSetColor(ofColor::white);
            ofBackground(ofColor::white);
            for(int j = 0; j < numMasksPerLayer; j++) {
                increment = (j+1) * ofMap(i, 0, numLayers-1, maskIncrement, -maskIncrement);
                masks.at(i).at(j).incrementTextureOffsetY(increment);
                masks.at(i).at(j).draw();
            }
        }
        masker.endMask(i);
    }
}

void ofApp::draw(){
    gif.begin();
    {
        ofSetColor(ofColor(ofColor::red));
        layers.at(0).draw();
        masker.draw();
    }
    gif.endCaptureDraw();
    masker.drawOverlay();
}
    

Blood work.

Daily sketch

Sketch 2015-08-13

        void ofApp::setup(){
    ofSetWindowShape(500, 500);
    gif.setupPaused(ofGetTimestampString("out/%Y-%m-%d"), 30, 80);
    gif.fadeInOut(3, 6, ofColor::white);
    gif.enableTextOverlay();
    numTissues = 16;
    numRoads = 4;
    masker.setup(numRoads);

    road.setup("tissue.png");
    for(int i = 0; i < numRoads; i++) {
        scale = ofMap(i, 0, numRoads-1, 4, 2.5);
        road.setTextureScale(scale);
        road.setTextureOffset(TEXTURE_OFFSET__MIDDLE__LEFT_TO_CENTER);
        road.setTextureOffsetY(ofRandom(2));
        roads.push_back(road);

        tissuesLoader.clear();
        scale = ofMap(i, 0, numRoads-1, 64, 1.5);
        tissue.setup("glass3.png", scale, i % 2 == 0 ? TEXTURE_OFFSET__MIDDLE__LEFT_TO_CENTER : TEXTURE_OFFSET__MIDDLE__RIGHT_TO_CENTER);
        for(int j = 0; j < numTissues; j++) {
            tissue.setTextureOffsetY(ofRandom(2));
            tissuesLoader.push_back(tissue);
        }
        tissues.push_back(tissuesLoader);
    }
}

void ofApp::update(){
    for(int i = 0; i < numRoads; i++) {
        masker.beginLayer(i);
        {
            float others = ofMap(i, 0, numRoads-1, 100, 255);
            ofSetColor(ofColor(others, others, others, others));
            roads.at(i).incrementTextureOffsetY(ofMap(i, 0, numRoads-1, -0.001, 0.001));
            roads.at(i).draw();
        }
        masker.endLayer(i);
        
        masker.beginMask(i);
        {
            ofSetColor(ofColor::white);
            ofBackground(ofColor::white);
            for(int j = 0; j < tissues.size(); j++) {
                tissues.at(i).at(j).incrementTextureOffsetY((j+1) * ofMap(i, 0, numRoads-1, 0.0002, -0.0002));
                tissues.at(i).at(j).draw();
            }
        }
        masker.endMask(i);
    }
}

void ofApp::draw(){
    gif.begin();
    {
        ofBackground(ofColor::white);
        masker.draw();
    }
    gif.endCaptureDraw();
    masker.drawOverlay();
}
    

Writing your own history.

Daily sketch

Sketch 2015-07-30

        void ofApp::setup(){
    ofSetWindowShape(1000, 800);
    gif.setupPaused(ofGetTimestampString("out/%Y-%m-%d"), 160, 220, 500, 500, ISOLATE_DRAWING);
    gif.fadeInOut(2, 4, ofColor::white, 4);
    masker.setup(500, 500, 1, ISOLATE_LAYERS);
    masker.toggleOverlay();
    foil1.setup("foil.png", 500, 500, 2.0);
    foil1.setTextureOffset(8);
    foil2.setup("foil.png", 500, 500, 6.0);
    foil2.setTextureOffset(TEXTURE_OFFSET_BOTTOM_RIGHT);
    
    glass.setup("glass.png", 0.1);
    for(int i = 0; i < 60; i++) {
        glass.setTextureOffset(ofRandom(2), ofRandom(2));
        glasses.push_back(glass);
    }
    shapeSystem.setup();
    
    shapeSize = gif.width / 3;
    thickness = 90;
    halfShapeSize = shapeSize * 0.5;
    
    for(int i = 0; i < gif.width; i += shapeSize) {
        for(int j = 0; j < gif.height; j += shapeSize) {
            shape.setupHollowArc(30, thickness, shapeSize, 180);
            shape.setColor(ofColor::white);
            shape.setBlur(25);
            shape.setPosition(ofVec3f(i + halfShapeSize, j + halfShapeSize, 0));
            shape.rotateZ(ofRandom(360));
            shapes.push_back(shape);
        }
    }
    
    for(int i = 0; i < shapes.size(); i++) {
        shapeSystem.add(shapes.at(i));
    }
}

void ofApp::update(){
    for(int i = 0; i < shapes.size(); i++) {
        i % 2 == 0 ?
        shapes.at(i).incrementRotateZ(12) :
        shapes.at(i).incrementRotateZ(-12);
    }
    
    foil1.incrementTextureOffsetY(-0.01);
    
    masker.beginLayer(0);
    {
        ofSetColor(ofColor(ofColor::white, 255));
        foil1.draw();
        ofSetColor(ofColor(ofColor::white, 40));
        for(int i = 0; i < glasses.size(); i++) {
            glasses.at(i).incrementTextureOffsetY(0.002 * (i + 1));
            glasses.at(i).draw();
        }
    }
    masker.endLayer(0);

    masker.beginMask(0);
    {
        ofSetColor(ofColor::black, 16);
        ofRect(0, 0, gif.width, gif.height);
        
        ofEnableAlphaBlending();
        
        for(int i = 0; i < shapes.size(); i++) {
            shapes.at(i).setColor(ofColor::white);
        }
        shapeSystem.draw();
        
        gif.rotateAroundCenter(90);
        for(int i = 0; i < shapes.size(); i++) {
            shapes.at(i).setColor(ofColor(ofColor::black, 120));
        }
        shapeSystem.draw();
        
        gif.rotateAroundCenter(90);
        for(int i = 0; i < shapes.size(); i++) {
            shapes.at(i).setColor(ofColor(ofColor::black, 90));
        }
        shapeSystem.draw();
        
        gif.rotateAroundCenter(90);
        for(int i = 0; i < shapes.size(); i++) {
            shapes.at(i).setColor(ofColor(ofColor::black, 60));
        }
        shapeSystem.draw();
        
        ofDisableAlphaBlending();
    }
    masker.endMask(0);
}

void ofApp::draw(){
    gif.begin();
    {
        ofEnableAlphaBlending();
        //ofBackground(ofColor::white);
        ofSetColor(ofColor(ofColor::white, 40));
        foil2.incrementTextureOffset(0.0025, 0.003);
        foil2.draw();
        masker.draw();
        ofDisableAlphaBlending();
    }
    gif.endAndCaptureFrame();
    gif.draw();
    masker.drawOverlay();
}
    

Ironworks

Daily sketch

Sketch 2015-07-23

        void ofApp::setup(){
    ofSetWindowShape(1000, 800);
    numLayers = 2;
    gif.setupPaused(ofGetTimestampString("out/%Y-%m-%d"), 100, 180, 500, 500, ISOLATE_DRAWING);
    gif.fadeInOut(2, 4, 4);
    masker.setup(500, 500, numLayers, ISOLATE_LAYERS);
    masker.toggleOverlay();
    foil.setup("foil.png", 500, 500, 6.0);
    wbw.setup("wbw.png", 500, 500, 0.5);
    for(int i = 0; i < numLayers; i++) {
        wbw.setTextureOffset(i);
        wbws.push_back(wbw);
    }
    mask.setup("foil.png", 500, 500, 2.0);
    for(int i = 0; i < numLayers; i++) {
        mask.setTextureOffset(8-i);
        masks.push_back(mask);
    }
}

void ofApp::update(){
    for(int i = 0; i < numLayers; i++) {
        wbws.at(i).incrementTextureOffset(-0.01, i % 2 == 0 ? -0.01 : 0.01);
        masks.at(i).incrementTextureOffset(i % 2 == 0 ? 0.005 : 0, i % 2 == 0 ? -0.005 : 0.01);
        
        masker.beginLayer(i);
        {
            if(i % 2 == 0) {
                ofSetColor(ofColor::powderBlue);
                for(int y = i * 2; y < gif.height; y+=4) {
                    ofLine(0, y, gif.width, y);
                }
            } else {
                wbws.at(i).draw();
            }
        }
        masker.endLayer(i);
        
        masker.beginMask(i);
        {
            masks.at(i).draw();
        }
        masker.endMask(i);
    }
}

void ofApp::draw(){
    gif.begin();
    {
        foil.incrementTextureOffset(0.0015, 0.0015);
        foil.draw();
        masker.draw();
    }
    gif.endAndCaptureFrame();
    gif.draw();
    masker.drawOverlay();
}
    

Floating

Daily sketch

Sketch 2015-07-20

        void ofApp::setup(){
    ofSetWindowShape(1000, 800);
    gif.setup(ofGetTimestampString("out/%Y-%m-%d"), 100, 500, 500, ISOLATE_DRAWING);
    masker.setup(500, 500, 3, ISOLATE_LAYERS);
    masker.toggleOverlay();
    mask.setup("face-mask.png", 500, 500, 1.5, TEXTURE_OFFSET_MIDDLE_CENTER);
    glass.setup("glass3.png", 500, 500, 2.0);
    shapeSystem.setup();
    numPerDimension.x = 2;
    numPerDimension.y = numPerDimension.x * 2;
    spacing.x = gif.width / numPerDimension.x;
    halfSpacing.x = spacing.x * 0.5;
    spacing.y = gif.height / numPerDimension.y;
    halfSpacing.y = spacing.y * 0.5;
    for(int x = 0; x < numPerDimension.x; x++) {
        for(int y = 0; y < numPerDimension.y; y++) {
            shape.setupFilledSquare(halfSpacing.x);
            shape.setPosition(
                x * spacing.x + halfSpacing.x*0.5 + (y % 2 == 0 ? halfSpacing.x : 0),
                y * spacing.y + halfSpacing.y);
            shapes.push_back(shape);
        }
    }
    for(int i = 0; i < shapes.size(); i++) {
        shapeSystem.add(shapes.at(i));
    }
}

void ofApp::update(){
    mask.incrementTextureOffsetY(0.02);
    glass.incrementTextureOffsetY(0.08);
    masker.beginLayer(0);
    {
        ofBackground(ofColor::black);
        shapeSystem.draw();
    }
    masker.endLayer(0);
    
    masker.beginMask(0);
    {
        ofBackground(ofColor::black);
        mask.draw();
    }
    masker.endMask(0);
    
    masker.beginLayer(1);
    {
        ofSetColor(ofColor::red);
        glass.draw();
    }
    masker.endLayer(1);
    
    masker.beginMask(1);
    {
        masker.drawLayer(0, false);
    }
    masker.endMask(1);
    
    masker.beginLayer(2);
    {
        ofBackground(ofColor::white);
        masker.drawLayer(1);
        masker.drawLayer(0);
    }
    masker.endLayer(2);
}

void ofApp::draw(){
    gif.begin();
    {
        ofBackground(ofColor::white);
        masker.draw();
    }
    gif.endAndCaptureFrame();
    gif.draw();
    masker.drawOverlay();
}
    

A torn checkerboard

Daily sketch

Sketch 2015-07-18

        void ofApp::setup(){
    ofSetWindowShape(1000, 800);
    gif.setupPaused(ofGetTimestampString("out/%Y-%m-%d"), 30, 75, 500, 500, ISOLATE_DRAWING);
    masker.setup(500, 500, 1, ISOLATE_LAYERS);
    masker.toggleOverlay();

    glass1.setup("glass.png", 500, 500, 2.0);
    glass2.setup("glass.png", 500, 500, 2.0);
    framesBeforeRefresh = 15;
}

void ofApp::update(){
    if(ofGetFrameNum() % framesBeforeRefresh == 0) {
        refresh = true;
        int offsetIndex = floor(ofGetFrameNum() / framesBeforeRefresh);
        offsetIndex = ((offsetIndex % 3) + 0) * 2;
        glass1.setTextureOffset(offsetIndex);
        glass2.setTextureOffset(offsetIndex);
        glass1.setTextureScale(3.0);
        glass2.setTextureScale(3.0);
    } else {
        refresh = false;
        glass1.incrementTextureScale(-0.05);
        glass2.incrementTextureScale(0.05);
    }
    
    masker.beginLayer(0);
    {
        glass1.draw();
    }
    masker.endLayer(0);
    
    masker.beginMask(0);
    {
        glass2.draw();
    }
    masker.endMask(0);
}

void ofApp::draw(){
    gif.begin();
    {
        ofEnableAlphaBlending();
        if(refresh) {
            ofSetColor(ofColor::red);
            ofRect(0, 0, gif.width, gif.height);
        }
        masker.draw();
        ofDisableAlphaBlending();
    }
    gif.endAndCaptureFrame();
    gif.draw();
    masker.drawOverlay();
}
    

"...a conscious, purposeful, and personal subject confronting an unconscious, purposeless, and impersonal universe..." (Richard Tarnas)

Daily sketch

Sketch 2015-07-12

        void ofApp::setup(){
    increment = 0.02;
    ofSetWindowShape(500, 500);
    gif.setupPaused(ofGetTimestampString("out/%Y-%m-%d"), 105, 140);
    gif.fadeInOut(17, 4, ofColor::red, 1);
    masker.setup(1);
    transp1.setup("road-transp.png");
    transp1.setTexturePositionY(0.5);
    transp2.setup("road-transp.png");
    transp2.setTexturePositionY(0.5);
}

void ofApp::update(){
    masker.beginLayer(0);
    {
        transp1.incrementTextureScale(-increment);
        transp1.draw();
    }
    masker.endLayer(0);

    masker.beginMask(0);
    {
        transp2.incrementTextureScale(-increment*0.5);
        ofBackground(ofColor::white);
        ofSetColor(ofColor::white);
        transp2.draw();
    }
    masker.endMask(0);
}

void ofApp::draw(){
    gif.begin();
    {
        ofBackground(ofColor::red);
        masker.draw();
    }
    gif.endAndCaptureFrame();
    gif.draw();
    masker.drawOverlay();
}
    

Transparencies masking transparencies (against a red background)

Daily sketch

Sketch 2015-06-04

        
//Pattern based on http://www.openprocessing.org/sketch/157035

ofxLayerMask masker;
int layerId;

float tx0, ty0, tx1, ty1;
float offset;
ofImage img;
ofTexture tex;
ofPlanePrimitive plane;

float x, y, radians;

void ofApp::setupAnim() {
    masker.setup(width, height);
    layerId = masker.newLayer();
    
    ofDisableArbTex();
    offset = ofRandom(3);
    setupImage("face.png", &img, &tex);

    plane.set(width, height);
    plane.setPosition(halfWidth, halfHeight, 0);
    plane.setResolution(2, 2);
}

void ofApp::setupImage(string file, ofImage *img, ofTexture *tex) {
    img->loadImage(file);
    *tex = img->getTextureReference();
    tex->setTextureWrap(GL_MIRRORED_REPEAT, GL_MIRRORED_REPEAT);
}

void ofApp::drawLayer(ofTexture *tex) {
    plane.mapTexCoords(tx0, ty0, tx1, ty1);
    plane.mapTexCoords(tx1, ty1, tx0, ty0);
    tex->bind();
    plane.draw();
    tex->unbind();
}

void ofApp::updateAnim(){
    masker.beginLayer(layerId);
    ofBackground(ofColor::black);
    ofSetColor(ofColor::white);
    tx0 = 1;
    ty0 = ofGetFrameNum() * 0.0012 + offset;
    tx1 = tx0 - 1;
    ty1 = ty0 - 0.2;
    drawLayer(&tex);
    masker.endLayer(layerId);
    
    masker.beginMask(layerId);
    ofBackground(ofColor::black);
    if(ofGetFrameNum() == 0 || ofRandom(1) > 0.6) {
        ofTriangle(ofRandom(-width, width*2), ofRandom(-height, height*2),
                   ofRandom(-width, width*2), ofRandom(-height, height*2),
                   ofRandom(-width, width*2), ofRandom(-height, height*2));
    } else if(ofRandom(1) > 0.3) {
        offset = ofRandom(3);
    }
    masker.endMask(layerId);
}

void ofApp::drawAnim() {
    if(ofGetFrameNum() == 0) ofBackground(ofColor::black);
    ofSetColor(ofColor::white, 40);
    drawLayer(&tex);

    ofSetColor(ofColor::white, 15);
    ofTranslate(halfWidth, halfHeight);
    for (int i = 0; i < 360; i+=6) {
        for (int q = 0; q < 360; q+=360) {
            radians = ofDegToRad(q + i + ofGetFrameNum() * 5);
            
            x = ofMap(sin(radians) * i, -600, -10, i, 0);
            y = ofMap(cos(radians) * i, -600, -10, 0, i);
            ofCircle(x, y, 2);
            ofCircle(y, x, 2);
            ofCircle(-x, -y, 2);
            ofCircle(-y, -x, 2);
            
            x = ofMap(sin(radians) * i, -600, -10, -i, 0);
            ofCircle(x, y, 2);
            ofCircle(y, x, 2);
            ofCircle(-x, -y, 2);
            ofCircle(-y, -x, 2);
        }
    }
    ofTranslate(-halfWidth, -halfHeight);
    masker.draw();
    if(ofGetFrameNum() == 72) {
        renderGif();
    }
}
    

Frustration can be bitter sweet

Daily sketch

Sketch 2015-05-16

        void ofApp::setupAnim() {
    ofDisableArbTex();
    setupImage("building.png", &img, &tex);

    plane.set(width, height);
    plane.setPosition(width * 0.5, height * 0.5, 0);
    plane.setResolution(2, 2);
}

void ofApp::drawAnim() {
    ofBackground(0, 0, 0);
    ofSetColor(255, 255, 255);
    
    ofEnableBlendMode(OF_BLENDMODE_ADD);
    drawLayers();
    rotateScreen(90);
    drawLayers();
    rotateScreen(90);
    drawLayers();
    rotateScreen(90);
    drawLayers();
    ofDisableBlendMode();
    
    if(ofGetFrameNum() == 200) renderGif();
}

void ofApp::drawLayers() {
    tx0 = -0.4;
    ty0 = ofGetFrameNum() * 0.01;
    tx1 = tx0 + 1;
    ty1 = ty0 + 0.25;
    drawLayer();
    
    ty0 = -ofGetFrameNum() * 0.01;
    ty1 = ty0 + 0.25;
    drawLayer();
}

void ofApp::drawLayer() {
    plane.mapTexCoords(tx0, ty0, tx1, ty1);
    plane.mapTexCoords(tx1, ty1, tx0, ty0);
    tex.bind();
    plane.draw();
    tex.unbind();
}

void ofApp::setupImage(string file, ofImage *img, ofTexture *tex) {
    img->loadImage(file);
    *tex = img->getTextureReference();
    tex->setTextureWrap(GL_MIRRORED_REPEAT, GL_MIRRORED_REPEAT);
}

void ofApp::rotateScreen(float degrees) {
    ofTranslate(halfWidth, halfHeight, 0);
    ofRotate(90);
    ofTranslate(-halfWidth, -halfHeight, 0);
}
    

Framing nothing.

Daily sketch