import processing.video.*; Capture videoCapture; PImage textureImage; PImage heightMap; PImage crystalSubstrate; void setupTexture() { videoCapture = new Capture(this, 256, 256, 14); heightMap = loadImage("crystaphyll_heightMap.png"); textureImage = createImage(256,256, RGB); crystalSubstrate= loadImage("crystaphyll_crystal.png"); for(int i=0; i < textureImage.pixels.length; i++) { textureImage.pixels[i] = crystalSubstrate.pixels[i]; } } void captureEvent(Capture myCapture) { videoCapture.read(); } PImage renderTexture() { imageProcessor(); textureImage.updatePixels(); return textureImage; } float r; float g; float b; float pr; float pg; float pb; float cr; float cg; float cb; float hr; float hg; float hb; float nr; float ng; float nb; float vr; float vg; float vb; void imageProcessor(){ for(int i=round(textureImage.pixels.length*.25); i < round(textureImage.pixels.length*.6); i++) { pr = red(textureImage.pixels[i]); pg = green(textureImage.pixels[i]); pb = blue(textureImage.pixels[i]); cr = red(crystalSubstrate.pixels[i]); cg = green(crystalSubstrate.pixels[i]); cb = blue(crystalSubstrate.pixels[i]); hr = red(heightMap.pixels[i]); hg = green(heightMap.pixels[i]); hb = blue(heightMap.pixels[i]); nr = neighborInfluence(i, "red"); ng = neighborInfluence(i, "green"); nb = neighborInfluence(i, "blue"); float prevvr = vr; float prevvg = vg; float prevvb = vb; vr = red(videoCapture.pixels[i]); vg = green(videoCapture.pixels[i]); vb = blue(videoCapture.pixels[i]); float diffvr = abs(vr-prevvr); float diffvg = abs(vg-prevvg); float diffvb = abs(vb-prevvb); r=channelProcessor(pr, cr, hr, nr, diffvr, 16, 200, 30); g=channelProcessor(pg, cg, hg, ng, diffvg, 128, 255, 15); b=channelProcessor(pb, cb, hb, nb, diffvb, 32, 200, 20); textureImage.pixels[i] = color(r, g, b); } } float growthBarrier; float channelProcessor(float pv, float cv, float hv, float nv, float diffv, float minv, float maxv, float modRange) { float v = 0; ///* growthBarrier = hv-(diffv-16)-((cv-pv)*.01)-((cv-nv)*.01)+244; // println("growthBarrier: "+growthBarrier+" hv: "+hv+" diffv: "+diffv+" cv: "+cv+" nv: "+nv); if(random(255)>growthBarrier){ float decay = (random(modRange)+diffv)*.19; v = (pv-decay);//-((cv-nv)*.007);//((pv-decay)+nv)*.5; } else { float growth = (cv-pv)*.07;//(random(modRange)+diffv)*.1; v = (pv+growth);//+((cv-nv)*.001);//pv+growth; } // */ // v=cv; if(vcv) v=cv; return v; } float pixt; float pixl; float pixr; float pixb; float neighborInfluence(int i, String channel) { float p; if (channel == "red") { pixt = red(textureImage.pixels[i-textureImage.width]); pixl = red(textureImage.pixels[i-1]); pixr = red(textureImage.pixels[i+1]); pixb = red(textureImage.pixels[i+textureImage.width]); } else if (channel == "green") { pixt = green(textureImage.pixels[i-textureImage.width]); pixl = green(textureImage.pixels[i-1]); pixr = green(textureImage.pixels[i+1]); pixb = green(textureImage.pixels[i+textureImage.width]); } else if (channel == "blue") { pixt = blue(textureImage.pixels[i-textureImage.width]); pixl = blue(textureImage.pixels[i-1]); pixr = blue(textureImage.pixels[i+1]); pixb = blue(textureImage.pixels[i+textureImage.width]); } p = (pixt+pixl+pixr+pixb)*.25; return p; }