ParticleSystem physics; Particle[] siteParticles; Graph myGraph; // SETUP PARAMETERS int rndSeed = floor(random(255)); float tick = 0.25; float scaleAll = 1.0; float fontSize = 10/scaleAll; float titleSize = fontSize * 2; // PLAYBACK OPTIONS boolean blnBoxes = true; boolean blnLines = true; boolean blnExtraSite = true; boolean blnText = false; boolean blnNames = false; boolean blnExplode = true; boolean blnHull = false; boolean blnCamera = true; boolean blnRotate = true; // HULL PARAMETERS float squashPVect = -0.0; float reachDist = 125.0; int maxGenerations = 4; // PVectors PVector[] sitePts; PVector[] sitePtsEnv; PVector[] sitePtsTrain; PVector[] railPts; PVector siteCentre; PVector center; // GLOBAL PARAMETERS float sprStr = 0.2; float sprLength = 25.0; float siteSprMult = 10.0; //base spring strength divided by this factor float siteLengthMult = 10.0; //base spring length divided by this factor float lobbyMult = 1.0; //tighten lobby springs float attrStr = -250.0; float attrLength = 25.0; float siteAttr = -0.0; float siteAttrL = 15; float progHeight = 10.0; float avoidFactor = 1.0; // INITIALIZING PARAMETERS Node closeNode; Node explodeNode; Node drawNode; Node otherNode; Node[] blobNodes; Node[] explodedNodes; Node[] hullNodes; Node[] buildHull; ArrayList arrNetworks; ArrayList hullNetworks; int c = 0; //counter for new exploded nodes int cExplode = 0; // CAMERA PARAMETERS float camLen = 140; float trackRotH = 0; float trackRotV = 0; float trackZoom = 0; float camRotX = 0.0; float camRotY = 0.0; float camRotStartX = 0.0; float camRotStartY = 0.0; // SCALING PARAMETERS float massScale = 20.0; //scale down sqft for representation float noiseFactor = 1.0; //diff in noiseValue pushes nodes apart float noiseMin = 0.25; //min diff between noiseValues float trafficFactor = 1.0; //sum of trafficFactors pulls nodes together float sphereSize = 5.0; float programMult = 1.0; //mult all program sqft float siteScale = 1.5; //3D site NTS t/f import program sqft as is but scale site up to match // THRESHOLD PARAMETERS int crossThld = 8; //sum of node crossover degrees above(incl) which to connect float sqftThld = 4000.0; //sqft above which to break float chunkThld = 1000.0; //node separation below which to chunk float explodeThld = 10000.0; //node separation below which to explode void setup(){ size(600, 450, P3D); colorMode(HSB, 100); randomSeed( rndSeed ); println("random seed = " + rndSeed); //MOUSE WHEEL STUFF addMouseWheelListener(new java.awt.event.MouseWheelListener() { public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) { mouseWheel(evt.getWheelRotation()); } } ); physics = new ParticleSystem(0.0, 0.0, 0.98, 0.2); //Gx, Gy, Gz, drag physics.setGravity(0, 0, 0); physics.setDrag( 0.5 ); myGraph = new Graph(physics); arrNetworks = new ArrayList(); // LOAD SITE NODES String[] dataPoints = loadStrings("site_pts_boundary.txt"); sitePts = new PVector[dataPoints.length]; String[] dataPointsEnv = loadStrings("site_pts_env.txt"); sitePtsEnv = new PVector[dataPointsEnv.length]; String[] dataPointsTrain = loadStrings("site_pts_train.txt"); sitePtsTrain = new PVector[dataPointsTrain.length]; String[] dataPointsRail = loadStrings("site_pts_railway.txt"); railPts = new PVector[dataPointsRail.length]; siteCentre = new PVector(); // GET BOUNDARY POINT DATA for(int i=0; i= 3) ){ //connect to site if(i == 2){ Node siteNode = myGraph.getSiteNodesByLevel(0)[13]; // myGraph.connectNodes(theNode, siteNode, sprStr*siteSprMult*lobbyMult, sprLength/siteLengthMult/lobbyMult); // theNode.p.position().set(siteNode.x, siteNode.y, siteNode.z); // Node siteNodeNext = fx_ClosestNode(siteNode, myGraph.getSiteNodesByLevel(0)); // myGraph.connectNodes(theNode, siteNodeNext, sprStr*siteSprMult*lobbyMult, sprLength/siteLengthMult/lobbyMult); // Node siteNodeNextNext = fx_NextClosestNode(siteNode, myGraph.getSiteNodesByLevel(0)); // myGraph.connectNodes(theNode, siteNodeNextNext, sprStr*siteSprMult*lobbyMult, sprLength/siteLengthMult/lobbyMult); //theNode.p.makeFixed(); } else{ if( int(items[7]) >= 3 ){ //measure of publicness int level = round(random((5-theNode.noiseAllow)*2,(5-theNode.noiseAllow)*2+1)); Node[] siteLevelNodes = myGraph.getSiteNodesByLevel(level); int index = floor(random(0,siteLevelNodes.length)); //Node siteNode = siteLevelNodes[index]; //myGraph.connectNodes(theNode, siteNode, sprStr*siteSprMult, sprLength/siteLengthMult); //Node siteNodeNext = fx_ClosestNode(siteNode, myGraph.getSiteNodesByLevel(level)); //if(blnExtraSite) myGraph.connectNodes(theNode, siteNodeNext, sprStr*siteSprMult, sprLength/siteLengthMult); } } } } // BUILD INCUBATOR CONNECTIONS for(int i=2; i 0){ String[] links = split( items[3], "|"); for(int j=0; j= 3) ){ if(i == 2){ Node siteNode = myGraph.getSiteNodesByLevel(0)[2]; //myGraph.connectNodes(theNode, siteNode, sprStr*siteSprMult*lobbyMult, sprLength/siteLengthMult/lobbyMult); //theNode.p.position().set(siteNode.x, siteNode.y, siteNode.z); //Node siteNodeNext = fx_ClosestNode(siteNode, myGraph.getSiteNodesByLevel(0)); //myGraph.connectNodes(theNode, siteNodeNext, sprStr*siteSprMult*lobbyMult, sprLength/siteLengthMult/lobbyMult); //Node siteNodeNextNext = fx_NextClosestNode(siteNode, myGraph.getSiteNodesByLevel(0)); //myGraph.connectNodes(theNode, siteNodeNextNext, sprStr*siteSprMult*lobbyMult, sprLength/siteLengthMult/lobbyMult); } else{ if( int(items[7]) >= 3 ){ //measure of publicness int level = round(random((5-theNode.noiseAllow)*2,(5-theNode.noiseAllow)*2+1)); Node[] siteLevelNodes = myGraph.getSiteNodesByLevel(level); int index = floor(random(0,siteLevelNodes.length)); Node siteNode = siteLevelNodes[index]; //myGraph.connectNodes(theNode, siteNode, sprStr*siteSprMult, sprLength/siteLengthMult); //Node siteNodeNext = fx_ClosestNode(siteNode, myGraph.getSiteNodesByLevel(level)); //if(blnExtraSite) myGraph.connectNodes(theNode, siteNodeNext, sprStr*siteSprMult, sprLength/siteLengthMult); } } } } // BUILD OFFICE CONNECTIONS for(int i=2; i 0){ String[] links = split( items[3], "|"); for(int j=0; j= 3) ){ if(i == 2){ Node siteNode = myGraph.getSiteNodesByLevel(0)[1]; //myGraph.connectNodes(theNode, siteNode, sprStr*siteSprMult*lobbyMult, sprLength/siteLengthMult/lobbyMult); //theNode.p.position().set(siteNode.x, siteNode.y, siteNode.z); //Node siteNodeNext = fx_ClosestNode(siteNode, myGraph.getSiteNodesByLevel(0)); //myGraph.connectNodes(theNode, siteNodeNext, sprStr*siteSprMult*lobbyMult, sprLength/siteLengthMult/lobbyMult); //Node siteNodeNextNext = fx_NextClosestNode(siteNode, myGraph.getSiteNodesByLevel(0)); //myGraph.connectNodes(theNode, siteNodeNextNext, sprStr*siteSprMult*lobbyMult, sprLength/siteLengthMult/lobbyMult); } else{ if( int(items[7]) >= 3 ){ //measure of publicness int level = round(random((5-theNode.noiseAllow)*2,(5-theNode.noiseAllow)*2+1)); //Node[] siteLevelNodes = myGraph.getSiteNodesByLevel(level); //int index = floor(random(0,siteLevelNodes.length)); //Node siteNode = siteLevelNodes[index]; //myGraph.connectNodes(theNode, siteNode, sprStr*siteSprMult, sprLength/siteLengthMult); //Node siteNodeNext = fx_ClosestNode(siteNode, myGraph.getSiteNodesByLevel(level)); //if(blnExtraSite) myGraph.connectNodes(theNode, siteNodeNext, sprStr*siteSprMult, sprLength/siteLengthMult); } } } } // BUILD PUBLIC CONNECTIONS for(int i=2; i 0){ String[] links = split( items[3], "|"); for(int j=0; j= crossThld){ myGraph.connectNodes(theNode, checkNode, sprStr, sprLength); } } } } } // FORWARD THROUGH INITIAL SEQUENCE for(int t=0; t<2; t++){ physics.tick(tick); } } blobNodes = new Node[0]; buildHull = new Node[0]; hullNetworks = new ArrayList(); } void draw(){ // UPDATE lights(); background(90); physics.tick(tick); myGraph.update(); if( frameCount == 1 ){ myGraph.getNodeByName("Lobby(I)").p.makeFixed(); myGraph.getNodeByName("Lobby(O)").p.makeFixed(); myGraph.getNodeByName("Lobby(P)").p.makeFixed(); } // CAMERA STUFF float eyeX = 0.0; float eyeY = 0.0; float eyeZ = 0.0; Node center = myGraph.getNodeByName("Lobby(O)"); if( blnCamera == true ){ if( blnRotate == true ) { trackRotH += 0.30; } trackRotH -= camRotX*10; trackRotV += camRotY; eyeX = sin(radians(trackRotH+camRotX))*camLen; eyeY = cos(radians(trackRotH+camRotX))*camLen; eyeZ = camLen*0.65 + trackRotV; camera(eyeX+center.x, eyeY+center.y, eyeZ+center.z, center.x, center.y, center.z, 0,0,-1); } PVector camPos = new PVector(eyeX, eyeY, eyeZ); pushMatrix(); translate(center.x, center.y,0); grid(); popMatrix(); // EXPLODE NODES if( (blnExplode == true) ){ // get biggest node that has enough sqft to explode Node[] selectNodes = myGraph.getProgNodes(); explodeNode = fx_BiggestNode(selectNodes); if(explodeNode != null){ explodeNode.blnExplodable = false; explodedNodes = myGraph.explodeNode(explodeNode, sprStr, sprLength); if( explodedNodes != null ){ //println("[x" + cExplode + "] " + explodeNode.name + " chosen @ f" + frameCount + " r" + round(frameRate)); cExplode++; } } } // LET EXPLODE FOR A BIT FIRST THEN PLAY ANIMATION if( frameCount == 15 ){ blnExplode = false; } // BUILD HULLS float touchThresh = 25; PVector blobCenter = new PVector(mouseX, mouseY); if( blnHull == true ){ // FIND CLOSEST NODE TO CAM WITHIN CLICK THRESHOLD Node[] collectNodes = new Node[0]; for(int j=0; j -1 ){ if(index < buildHull.length - 1){ buildHull[index] = buildHull[ buildHull.length-1 ]; } buildHull = (Node[]) shorten(buildHull); } if( hullNetworks.size() > 0 ){ index = -1; for(int k=0; k -1 ){ Network deactivateNetwork = (Network) hullNetworks.get(index); for(int m=0; m