logo

prolebra_PathFollowing_Cucarachas_Main

import java.util.List;
import toxi.geom.*;
import toxi.geom.PointOctree;
import toxi.color.*;
import controlP5.*;
import peasy.*;

Tracker a;
ControlP5 cp5;
Culebra_UI cgui;
Path tempPath;

PVector locStart;
PVector triggerLoc = new PVector(0, 0, 0);

boolean simulate, spawnEdge, addNew, D2;
boolean drawPathTargets, toggleUI, drawMovement, mathBehavior, genRandom, triggerSeekers, drawBoundary, drawConn, createOctree;
boolean toggleColor = true;
boolean masterBehavior_A = true;
boolean masterBehavior_B, masterBehavior_C, masterBehavior_D, masterBehavior_E, subBehavior_AA, subBehavior_AB;
boolean drawPaths = false;
boolean SpawnEdge = true;
boolean Dimension = true;
boolean enablePathTrack = true;
boolean showOctree = true;

int triggerCount = 0;
int agentCount = 500;
int resetAmount = 0; 
int camToggle = 0;  
int pathCount = 15;

int nWidth = 1920;
int nDepth = 1080;
int nHeight = 1000;

float WanderRadius, WanderDist, WanderTheta, WanderRotTrigger, MaxChildren;
float PathRad, ScalarProjectDist, PathThresh;
float InitSpeed, MaxSpeed, MaxForce, MaxSep;
float AgentCount;
float seekerTrail, childSeekerTrail;
float HeadWidth, StrokeWidth, Transparency;
float stepCount = 0;
float sepTrigger = 0.0f;

ArrayList<PVector>childSpawners;
ArrayList childSpawnType;
ArrayList<Path> pathList;

List<Tracker> agentList;
java.util.List occTreeList;
List<Vec3D>vec3DList;
VisibleOctree octree;

Button btypeA, btypeAA, btypeAB, btypeB, btypeC, btypeD, btypeE;

PeasyCam cam;
CameraState state;
//---------------------------------------Settings--------------------------------------------
void settings() {
  size(1920, 1080, P3D);
  smooth();
}
//---------------------------------------Setup-----------------------------------------------
void setup() {
  background(0);
  this.octree = new VisibleOctree(new Vec3D(0, 0, 0), nWidth);
  this.octree.setTreeAutoReduction(true);
  
  this.agentList = new ArrayList<Tracker>();
  this.childSpawners = new ArrayList<PVector>();
  this.childSpawnType = new ArrayList();
  this.pathList = new ArrayList<Path>();

  if (!this.D2 && this.camToggle < 1) {
    this.camToggle ++;  
    this.cam = new PeasyCam(this, 1500);
    this.cam.setMinimumDistance(100);
    this.cam.setMaximumDistance(10000);
    this.cam.lookAt(this.nWidth/2, this.nDepth/2, this.nHeight/2);
    this.cam.setSuppressRollRotationMode();
  }
  if (D2) {
    this.cam.reset();
    this.cam.setMinimumDistance(100);
    this.cam.setMaximumDistance(10000);
    this.cam.lookAt(this.nWidth/2, this.nDepth/2, 0);
    this.cam.setDistance(1000);  // distance from looked-at point
    this.cam.setSuppressRollRotationMode();
  }
  simulate = true;
  if (this.resetAmount == 0) {
    this.cgui = new Culebra_UI();
    this.cgui.run(this);
  }
  for (int pth = 0; pth < this.pathCount; pth++) {
    newPath();
  }
  for (int i = 0; i < this.agentCount; i ++) {
    PVector speed;
    if (this.D2) {
      if (this.spawnEdge) {
        locStart = new PVector(0, random(height), 0);
        speed = new PVector(1, 0, 0);
      } else {
        locStart = new PVector(random(width), random(height), 0);
        speed = new PVector(random(-1, 1), random(-1, 1), 0);
      }
      //this.octree.addPoint(new Vec3D(locStart.x,locStart.y,locStart.z));
      this.a = new Tracker(locStart, speed, true, "parent", "main");
    } else {
      if (this.spawnEdge) {
        locStart = new PVector(random(width), random(height), 0);
        speed = new PVector(random(-1, 1), random(-1, 1), random(0, 2));
      } else {
        locStart = new PVector(random(width), random(height), random(0, nHeight));
        speed = new PVector(random(-1, 1), random(-1, 1), random(-1, 1));
      }
      //this.octree.addPoint(new Vec3D(locStart.x,locStart.y,locStart.z));
      this.a = new Tracker(locStart, speed, true, "parent", "main");
    }
    this.agentList.add(this.a);
  }
}
//---------------------------------------Draw------------------------------------------------
void draw() {
  background(0);
  this.sepTrigger = this.cgui.msep.getValue();
  if (this.createOctree || this.masterBehavior_E || this.sepTrigger > 0) {
    this.createOctree = true;
    this.octree.empty();
    this.vec3DList = new ArrayList<Vec3D>();
    //--Sets the octree pts------------------------------------------------------------------
    for (Tracker ag : agentList) {
      this.vec3DList.add(new Vec3D(ag.loc.x, ag.loc.y, ag.loc.z));
    }
    this.octree.addAll(vec3DList);
  }
  this.D2 = this.cgui.d.getState();
  if (!this.D2 && this.drawBoundary) {
    drawExtents();
  }
  this.spawnEdge = this.cgui.se.getState();
  this.agentCount = (int)this.cgui.ac.getValue();
  for (Path pths : pathList) {
    if (this.drawPaths) {
      pths.display();
    }
    pths.dim = this.cgui.d.getState();
    pths.radius = this.cgui.pr.getValue();
  }
  //--Agents-------------------------------------------------------------------------------
  for (Tracker ag : agentList) {
    if (ag.type == "parent") {
      ag.wanderD = this.cgui.wd.getValue();
      ag.wanderR = this.cgui.wr.getValue();
      ag.wanderT = this.cgui.wt.getValue();
      ag.wanderTVal = this.cgui.wrt.getValue();

      ag.headWidth = this.cgui.hw.getValue();
      ag.strokeWidth = this.cgui.stw.getValue();
      ag.tranparency = this.cgui.t.getValue();

      ag.seekerMT = (int)this.cgui.st.getValue();

      ag.maxforce = this.cgui.mf.getValue();
      ag.max = this.cgui.ms.getValue();
      ag.amp = this.cgui.sd.getValue();
      ag.vel = this.cgui.is.getValue();
      ag.maxDist = this.cgui.pt.getValue();
      ag.r = this.cgui.msep.getValue();
      ag.maxChildren = (int)this.cgui.mc.getValue();
      ag.dim = this.cgui.d.getState();
      ag.randomize = this.genRandom;
      ag.wandertheta = 0.0f; 

      ag.av = this.cgui.f_av.getValue();
      ag.cv = this.cgui.f_cv.getValue();
      ag.sv = this.cgui.f_sv.getValue();
      ag.searchRad = this.cgui.f_sR.getValue();
      ag.creeperCollection = this.agentList;

      ag.run();
    } else {
      ag.wanderD = this.cgui.c_wd.getValue();
      ag.wanderR = this.cgui.c_wr.getValue();
      ag.wanderT = this.cgui.c_wt.getValue();
      ag.wanderTVal = this.cgui.c_wrt.getValue();

      ag.headWidth = this.cgui.c_hw.getValue();
      ag.strokeWidth = this.cgui.c_stw.getValue();
      ag.tranparency = this.cgui.c_t.getValue();

      ag.seekerChildMT = (int)this.cgui.c_ct.getValue();

      ag.maxforce = this.cgui.c_mf.getValue();
      ag.max = this.cgui.c_ms.getValue();
      ag.amp = this.cgui.c_sd.getValue();
      ag.vel = this.cgui.c_is.getValue();
      ag.maxDist = this.cgui.c_pt.getValue();
      //ag.r = this.cgui.c_msep.getValue();
      ag.maxChildren = 0;
      ag.dim = this.cgui.d.getState();
      ag.randomize = this.genRandom;
      ag.wandertheta = 0.0f;

      ag.av = this.cgui.f_av.getValue();
      ag.cv = this.cgui.f_cv.getValue();
      ag.sv = this.cgui.f_sv.getValue();
      ag.searchRad = this.cgui.f_sR.getValue();
      ag.creeperCollection = this.agentList;

      ag.run();
    }
  }
  if (this.createOctree) {
    if (this.showOctree) this.octree.draw();
  }
  //--CreateBabies---------------------------------------------------------------------------
  if (this.childSpawners.size() > 0) {
    newDude();
    this.childSpawners = new ArrayList<PVector>();
    this.childSpawnType = new ArrayList();
  }
  stepCount++;
  if (this.D2) {
    surface.setSize(this.nWidth, this.nDepth);
  }
  this.cgui.createGui();
}
//---------------------------------------Create Static Paths---------------------------------
void newPath() {
  if (this.D2) {
    this.tempPath = new Path();
    this.tempPath.addPoint(random(30, 300), random(height/4, height), 0);
    this.tempPath.addPoint(random(101, width/2), random(0, height), 0);
    this.tempPath.addPoint(random(width/2, width), random(0, height), 0);
    this.tempPath.addPoint(random(width-100, width), height/2, 0);
  } else {
    this.tempPath = new Path();
    this.tempPath.addPoint(random(0, 300), random(0, height), random(0, this.nHeight));
    this.tempPath.addPoint(random(0, width/2), random(0, height), random(0, this.nHeight));
    this.tempPath.addPoint(random(0, width), random(0, height), random(0, this.nHeight));
    this.tempPath.addPoint(random(0, width), 0, random(0, this.nHeight));
  }
  this.pathList.add(this.tempPath);
}
//---------------------------------------Keyboard Inputs-------------------------------------
void keyPressed() {
  if (key == 'r') {
    this.resetAmount ++;
    this.triggerCount = 0;
    setup();
  }
  if (key == 's') this.simulate = !this.simulate;
  if (key == 'w') this.newPath();
  if (key == 'q') this.drawPathTargets = !this.drawPathTargets;
  if (key == 'p') this.drawPaths = !this.drawPaths;
  if (key == 't') this.toggleUI = !this.toggleUI;
  if (key == 'm') this.mathBehavior = !this.mathBehavior;
  if (key == 'n') this.genRandom = !this.genRandom;
  if (key == 'd') this.drawMovement = !this.drawMovement;
  if (key == 'P') this.enablePathTrack = !this.enablePathTrack;
  if (key == 'b') this.triggerSeekers = !this.triggerSeekers;
  if (key == 'c') this.toggleColor = !this.toggleColor;
  if (key == 'i') saveFrame("img-######.png");
  if (key == 'v') this.drawBoundary = !this.drawBoundary;
  if (key=='o') this.showOctree=!this.showOctree;
  if (key=='z') this.createOctree =!this.createOctree;
  if (key=='1') this.drawConn=!this.drawConn;
}
//---------------------------------------Children Creation-----------------------------------
void newDude() {
  int babyCount = 0;
  for (PVector px : this.childSpawners) {
    PVector speed;
    if (this.spawnEdge) {
      speed = new PVector(1, 0, 0);
    } else {
      speed = new PVector(random(-1, 1), random(-1, 1), 0);
    }
    if ((int)this.childSpawnType.get(babyCount) % 2 == 0) {
      this.agentList.add(new Tracker(new PVector(px.x, px.y, px.z), speed, false, "child", "w_a"));
    } else {
      this.agentList.add(new Tracker(new PVector(px.x, px.y, px.z), speed, false, "child", "w_b"));
    }
    babyCount++;
  }
}
//---------------------------------------Draw Bounds-----------------------------------------
void drawExtents()
{
  pushStyle();
  pushMatrix();
  strokeWeight(.5);  
  stroke(200);
  noFill();
  translate(this.nWidth/2, this.nDepth/2, this.nHeight/2);
  box(this.nWidth, this.nDepth, this.nHeight);
  popMatrix();
  popStyle();
}
//---------------------------------------Behaviors------------------------------------------
void Beh_A(boolean resetFlag) {
  if (resetFlag) {
    this.masterBehavior_A = !this.masterBehavior_A;
  }
}
void Beh_B(boolean resetFlag) {
  if (resetFlag) {
    this.masterBehavior_B = !this.masterBehavior_B;
  }
}
void Beh_C(boolean resetFlag) {
  if (resetFlag) {
    this.masterBehavior_C = !this.masterBehavior_C;
  }
}
void Beh_D(boolean resetFlag) {
  if (resetFlag) {
    this.masterBehavior_D = !this.masterBehavior_D;
  }
}
void Beh_E(boolean resetFlag) {
  if (resetFlag) {
    this.masterBehavior_E = !this.masterBehavior_E;
  }
}
void Beh_AA(boolean resetFlag) {
  if (resetFlag) {
    this.subBehavior_AA = !this.subBehavior_AA;
  }
}
void Beh_AB(boolean resetFlag) {
  if (resetFlag) {
    this.subBehavior_AB = !this.subBehavior_AB;
  }
}
Update
  • Share