diff --git a/pde/IF3Si/IF3Si.pde b/pde/IF3Si/IF3Si.pde new file mode 100644 index 0000000..2c27793 --- /dev/null +++ b/pde/IF3Si/IF3Si.pde @@ -0,0 +1,209 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + Interface Fractures III - SILICON + (c) nova@deviator.si + + IF3Si.pde + + */ + +// undecorate window (remove window borders etc) - - - - - - - - - - - - - - - +public void init() { frame.removeNotify(); frame.setUndecorated(true); + frame.addNotify(); super.init(); } + +// load libs +import oscP5.*; // Open Sound Control +import netP5.*; + + +// declarations - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +// declare OSC object +OscP5 oscP5; + + +// IMAGE POOL, a 2D array +PImage[][] imgPool; + +// texture (tiles) +float texX = 0; +float texY = 0; + +// generate an array of random numbers +int[] rands = new int[500]; +IntList randz; // arrayList + +// for draw cube +int cubesnum = 20; +PGraphics[] cubes = new PGraphics[cubesnum]; +PShader blur; +PGraphics bpass1, bpass2; + +// spheres +int ptsW, ptsH; + +int numPointsW; +int numPointsH_2pi; +int numPointsH; + +float[] coorX; +float[] coorY; +float[] coorZ; +float[] multXZ; + +PGraphics sphere; + +int tilesOverlap; + +void setup() { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + float sizefactor = 1; // define the size of the screen, 1 = 1080p + size( int( 1920 * sizefactor ), + int( 1080 * sizefactor ), + P3D ); // renderer + + // framerate + frameRate(60); + smooth(32); // 32?? + noCursor(); + background(10); + + println("\n\n~~~ Hello. Starting Interface Fractures III - SILICON." + + " - - - - - - - - - - - - - - - - - - - - - -\n"); + + // start oscP5, listening for incoming messages at port 12000 + println("~~~ starting oscP5 ..."); + oscP5 = new OscP5(this,12000); + oscP5.plug(this,"ctlin","/ctlin"); // to be converted for PD OSC input + + // get all textures into an image pool + println("\n\n~~~ loading textures into image pool ...\n"); + imgPool = getImages("/images/"); + + // create an array of random value between -50 and 50 + for (int i=0; i < 500; i++) { rands[i] = i-250; } + shuffle(rands); + + + // drawCube ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` + // an array of PGraphics + for (int i = 0; i < cubesnum; i++) { + cubes[i] = createGraphics(width, height, P3D); + } + blur = loadShader("blur.glsl"); + bpass1 = createGraphics(width, height, P3D); + bpass1.smooth(); + bpass2 = createGraphics(width, height, P3D); + bpass2.smooth(); + + + randz = new IntList(width); + for (int i=0; i < width; i++) { + randz.set(i, i); + } + randz.shuffle(); + //println(randz); + + // spheres + ptsW=30; + ptsH=30; + initializeSphere(ptsW, ptsH); // number of vertices around the width and height + sphere = createGraphics(width, height, P3D); + +} + + +// process OSC messages +public void ctlin(int cc, int val) { // - - - - - - - - - - - - - - - - - - - - - - - + + // debug + println("## OSC: /ctlin cc:" + cc + " value:" + val); + + if (cc == 2) { tilesOverlap = val; } + + /* // triggers are on controller number 0 + if (cc == 0) { + } + + if (cc == 2) { flySpeedXfactor = (val - 64); } // speed (&direction) on X axis [-1 - 1] FIXit! + if (cc == 3) { flySpeedYfactor = (val - 64); } // speed (&direction) on Y axis [-1 - 1] FIXit! + */ + +} + + + + + + + +void draw() { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + // clean screen ````````````````````````````````````````````````````| + blendMode(BLEND); + screenClean(color(50)); + + + + + + + + // SCENENGINES / / / / / / / / / / / / / / / / / / / / / / / / / / | + + + // draw spheress```````````````````````````````````````````````````| + drawSpheres(boolean(0) + ); + + + + // draw tiles `````````````````````````````````````````````````````| + tiles(boolean(0), // render on/off + color(0, 0, 0, 80), // background color (HSBA) + color(80, 70, 20, 100), // tile color + 20, // tile hue distance + 0, // blendMode + 6, // number of tiles on X axis + 1, // number of tiles on Y axis + 2, // texture bank number + 0, // texture number/id + 10, // texture speed X + 1, // texture speed Y + tilesOverlap // overlap. 127 = 300% + ); + + + + // draw cubes `````````````````````````````````````````````````````| + drawCube(boolean(0), cubes, + 100, height/2, -100, + 400, 300, 300, + radians(frameCount), radians(frameCount*0.7), PI/2, + 0); + + + + // test pattern```````````````````````````````````````````````````| + testPattern(boolean(0), // on/off + 2, 0, // img bank & ID + 255, // image alpha + 10, // number of horizontal 'lanes' + 10, // density + 4, // stroke width + 255, // stroke alpha + 2 // speed + ); + + + // debug `````````````````````````````````````````````````````````| + // draw test picture + testPicture(boolean(0)); + + // frames per second + displayFps(true); + // document + autoSnap(false); +} // -------------------------------------------------------------------------- + + + diff --git a/pde/IF3Si/functions.pde b/pde/IF3Si/functions.pde new file mode 100644 index 0000000..30a82d1 --- /dev/null +++ b/pde/IF3Si/functions.pde @@ -0,0 +1,523 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + Interface Fractures III - SILICON + (c) nova@deviator.si + + functions.pde + + */ + +// loads all images into an array - - - - - - - - - - - - - - - - - - - - - - - - - +PImage[][] getImages(String folder) { + + PImage[][] imgPool; // declare 2D array imgPool + + File dir = new File(dataPath(sketchPath + folder)); // first folder + String[] dirlist = dir.list(); // an array of folders (strings) + dirlist = sort(dirlist); // + imgPool = new PImage[dirlist.length][10]; // create 2d array imgPool + + + for (int i = 0; i < dirlist.length; i++) { + String fulldir = dataPath(sketchPath + folder + dirlist[i]) + "/"; + File dir2 = new File(fulldir); + String[] filelist = dir2.list(); // an array of image names + filelist = sort(filelist); + + if (filelist.length != 0) { + + for (int j = 0; j < filelist.length; j++) { + println("imgPool[" + i + "][" + j + "]: " + fulldir + filelist[j]); + imgPool[i][j] = loadImage(fulldir + filelist[j]); + } + + } else { + println("No files in this folder: " + fulldir); + } + } + + return imgPool; + +} + + + +// function to shuffle an array of integers - - - - - - - - - - - - - - - - - - - - - +void shuffle(int[] a) +{ + int temp, pick; + + for(int i=0; i- more TO BE EXPANDED / REFINED!!! */ + +void testPattern( boolean render, + int imgBank, int imgID, + int imgAlpha, + int ylines, + int density, + int lwidth, + int lalpha, + int speed + ) +{ + if (render) { + + tint(imgAlpha); + image(imgPool[imgBank][imgID], 0, 0); + + blendMode(BLEND); + + int yheight = height/ylines; + + for (int y=0; y < ylines; y++) { + int yloc = int((y+1)*height/(ylines+1)); + for (int x=0; x < width; x++) { + + int index = x + (y * (width/ylines)); + index = index % width; + if (randz.get(index) < density * 0.01 * randz.get((index + x + y) % randz.size())) { + + int fx = (x + frameCount); // move! + fx = fx * speed * 1 * randz.get((abs(index - x + y) % randz.size())) / randz.size(); // speed! + fx %= width; // wrap at the right edge + + color imgC = imgPool[imgBank][imgID].get(fx, yloc); + stroke(imgC, lalpha); + strokeWeight(1 + map(brightness(imgC), 0, 255, 0, lwidth)); + + line(fx, yheight * y + (yheight/30), fx, yheight * (y+1) - (yheight/30)); + } + } + } + } +} + + + + + + + +// SPHERES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// A 3D textured sphere with simple rotation control. +// thanks to https://processing.org/examples/texturesphere.html +// Texture Sphere written by Gillian Ramsay to better display the poles. +// Previous version by Mike 'Flux' Chang (and cleaned up by Aaron Koblin). +// Original based on code by Toxi. +// modified to accomodate offscreen PGraphics + +void initializeSphere(int numPtsW, int numPtsH_2pi) { + + // The number of points around the width and height + numPointsW=numPtsW+1; + numPointsH_2pi=numPtsH_2pi; // How many actual pts around the sphere (not just from top to bottom) + numPointsH=ceil((float)numPointsH_2pi/2)+1; // How many pts from top to bottom (abs(....) b/c of the possibility of an odd numPointsH_2pi) + + coorX=new float[numPointsW]; // All the x-coor in a horizontal circle radius 1 + coorY=new float[numPointsH]; // All the y-coor in a vertical circle radius 1 + coorZ=new float[numPointsW]; // All the z-coor in a horizontal circle radius 1 + multXZ=new float[numPointsH]; // The radius of each horizontal circle (that you will multiply with coorX and coorZ) + + for (int i=0; i