logo

prolebra_StickyStuff_MeshWalking_Tracker

import java.util.List;

class Tracker {
  List<PVector> objectTrails;

  PVector speed, loc;
  PVector acc = new PVector(0, 0, 0);
  float maxforce = 0.01;
  float max = 4.0f;
  float vel = 1.0;
  float maxDist = 100;
  float r, amp, ampDup;
  float wandertheta, wanderTVal, wanderD, wanderR, wanderT;
  float headWidth, strokeWidth, tranparency;
  boolean sepActive = false;
  boolean wonderTrigger = false;
  boolean instanceable;
  boolean dim;
  boolean randomize;
  int maxChildren = 0;
  int instanceTriggerCount;
  int seekerMT;
  int seekerChildMT;
  int minTrailPtCount = 0;
  int currentTrailSize = 0;
  String type, babyType;

  TColor colorA = TColor.newRGB(255.0f / 255.0f, 0.0f / 255.0f, 0.0f / 255.0f); 
  TColor colorB = TColor.newRGB(120.0f, 0.0f, 0.0f);
  TColor colorB2 = TColor.newRGB(0.0f, 255.0f, 255.0f);
  TColor colorC = TColor.newRGB(187.0f / 255.0f, 216.0f / 255.0f, 40.0f / 255.0f);
  TColor colorD = TColor.newRGB(255.0f, 0.0f, 120.0f);
  TColor colorE = TColor.newRGB(200.0f / 60.0f, 160.0f / 100.0f, 80.0f / 30.0f);

  ColorGradient gradA = new ColorGradient();
  ColorGradient gradB = new ColorGradient();
  ColorGradient gradC = new ColorGradient();
  ToneMap toneMapA, toneMapB, toneMapC;
  //-----------------Flocking Things-----------------------------------------------------
  String objectType;
  String behaviorType = "None";
  PVector cummVec, alignVector, separateVector, cohesionVector;
  float maxSpeed, maxForce;
  float searchRad, av, sv, cv;

  List<PVector> otherPtsList;
  List<PVector> otherMoveValues;
  List<Float> allDist;
  List<Tracker> creeperCollection;
  ArrayList<PVector> creeperTrails;
  //-----------------Mesh Things-----------------------------------------------------
  int hitCounter = 0;
  //-------------------------------------------------------------------------------------
  Tracker(PVector location, PVector Speed, boolean instance, String Type, String BabyType) {
    this.loc = location;
    this.objectTrails = new ArrayList<PVector>();

    this.instanceTriggerCount = 0;
    this.instanceable = instance;
    this.type = Type;
    this.babyType = BabyType;
    this.speed = Speed;
    this.r = 12;
    this.gradA.addColorAt(0.0f, this.colorA);
    this.gradA.addColorAt(255.0f, this.colorC);
    this.toneMapA = new ToneMap(0.0f, 1.0f, this.gradA);
    
    this.gradB.addColorAt(0.0f, this.colorB);
    this.gradB.addColorAt(255.0f, this.colorB2);
    this.toneMapB = new ToneMap(0.0f, 1.0f, this.gradB);
    
    this.gradC.addColorAt(0.0f, this.colorD);
    this.gradC.addColorAt(255.0f, this.colorE);
    this.toneMapC = new ToneMap(0.0f, 1.0f, this.gradC);
  }
  //-------------------------------------------------------------------------------------
  //Run all of the other methods---------------------------------------------------------
  //instanceable is whether or not current creeper is type parent or child, child cannot create instances
  //-------------------------------------------------------------------------------------
  void run() {
    if (masterBehavior_F) {
      meshWalk();
    }
    if (enablePathTrack) {
      pathFollow();
    }
    if (this.sepActive && this.instanceable && this.r != 0) {
      separate();
    }
    if (masterBehavior_A || subBehavior_AA || subBehavior_AB) {
      if (enablePathTrack) {
        if (this.wonderTrigger) {
          wander();
        }
      } else {
        wander();
      }
    }  
    if (masterBehavior_B) {
      this.wonderTrigger = true;
      this.randomize = true;
      wanderSolo();
    }  
    if (masterBehavior_C) {
      this.wonderTrigger = true;
      this.randomize = true;
      wanderSolo();
    }  
    if (masterBehavior_D) {
      this.wonderTrigger = true;
      this.randomize = true;
      wanderSolo();
    }  
    if (masterBehavior_E) {
      flock();
    }
    if (simulate) {
      move();
    }
    viz();
    trail();
  }
  public void backUpMeshWalk() {
    PVector predict = this.speed.copy();
    predict.normalize();
    predict.mult(this.amp);
    predict.add(this.loc);
    //-------------------------
    Sphere bs = new Sphere(new Vec3D(this.loc.x, this.loc.y, this.loc.z), 100);
    occTreeVertList = octreeMesh.getPointsWithinSphere(bs);
    if (occTreeVertList!=null) {
      if (occTreeVertList.size()!=50402030) {
        float[] distances = new float[occTreeVertList.size()];
        ArrayList<Float> distancesCopy = new ArrayList<Float>();
        for (int i = 0; i < occTreeVertList.size(); i++) {
          int index = vec3DVertList.indexOf((Vec3D)occTreeVertList.get(i));
          Vec3D tconv = new Vec3D((Vec3D)occTreeVertList.get(i));
          PVector conv = new PVector(tconv.x, tconv.y, tconv.z);
          if (drawConn) {
            drawConnectivity(conv);
          }
          distances[i] = this.loc.dist(conv);
          distancesCopy.add(this.loc.dist(conv));
        }
        Arrays.sort(distances);

        float indexOf;
        if (distances[0] != 0.0f) {
          indexOf = distances[0];
        } else {
          indexOf = distances[1];
        }
        int index = distancesCopy.indexOf(indexOf);
        Vec3D cp = (Vec3D) occTreeVertList.get(index);
        Vec3D tvec = new Vec3D(this.loc.x, this.loc.y, this.loc.z);
        Vec3D delta = cp.sub(tvec);
        PVector newVec = new PVector(delta.x, delta.y, delta.z);
        PVector target = PVector.add(predict, newVec);
        seek2(target);
      }
    } 
  }
  //---------------------------------------------------------------------------------------
  public void meshWalk() {
    PVector predict = this.speed.copy();
    predict.normalize();
    predict.mult(this.amp);
    PVector nextPosPrev = PVector.add(loc, predict);
    Vec3D tvec = new Vec3D(nextPosPrev.x, nextPosPrev.y, nextPosPrev.z);
    Vertex v = mesh.m.getClosestVertexToPoint(tvec);
    int id = v.id;
    Vec3D cp = new Vec3D(v.x, v.y, v.z);
    //-------------------------
    Vec3D delta = cp.sub(tvec);
    PVector newVec = new PVector(delta.x, delta.y, delta.z);
    if (newVec.mag() < 100) {
      this.sepActive = true;
      this.wonderTrigger = true;
      if (triggerSeekers && this.instanceable && this.instanceTriggerCount < this.maxChildren) { //check that we have not exceeded the amount of children we are allowed to create
        addNew = true;
        triggerLoc = nextPosPrev.copy();
        childSpawners.add(new PVector(this.loc.x, this.loc.y, this.loc.z));
        childSpawnType.add(this.instanceTriggerCount);
        triggerCount++;        
        this.instanceTriggerCount ++;
      } else {
        addNew = false;
      }
      PVector zero = new PVector(0, 0, 0);
      zero.mult(3);
      acc.add(zero);
    } else {
      this.wonderTrigger = false;
    }
    newVec.normalize();
    newVec.mult(3);
    this.acc.add(newVec);
  }
  //---------------------------------------------------------------------------------------
  public void wanderSolo() {
    if (this.randomize) {
      this.wandertheta += random(-this.wanderT, this.wanderT); // Randomly change wander theta
    } else {
      this.wandertheta += this.wanderT;
    }
    PVector circleLoc = new PVector(this.speed.x, this.speed.y, this.speed.z);
    circleLoc.normalize(); // Normalize to get heading
    circleLoc.mult(this.wanderD);
    circleLoc.add(this.loc);
    PVector circleOffSet = new PVector(0, 0, 0); 
    if (masterBehavior_B) {
      circleOffSet = new PVector(this.wanderR*cos(wandertheta), this.wanderR*sin(wandertheta), 0);
    } else if (masterBehavior_C) {
      circleOffSet = new PVector(this.wanderR*cos(wandertheta), this.wanderR*sin(wandertheta), random(this.wanderR*cos(wandertheta), this.wanderR*sin(wandertheta)));
    } else if (masterBehavior_D) {
      circleOffSet = new PVector(random(this.wanderR*cos(wandertheta), this.wanderR*sin(wandertheta)), random(this.wanderR*cos(wandertheta), this.wanderR*sin(wandertheta)), random(this.wanderR*cos(wandertheta), this.wanderR*sin(wandertheta)));
    }
    PVector target = circleLoc.add(circleOffSet);
    if (drawMovement) drawWanderStuff(this.loc, circleLoc, target, this.wanderR); // Render wandering circle, etc.
    PVector steer = target.sub(this.loc);
    steer.normalize();
    steer.mult(1);
    this.acc.add(steer);
  }
  //-------------------------------------------------------------------------------------
  //Wandering Creeper----------------------------------------------------
  //“Wandering is a type of random steering which has some long term order: the steering 
  //direction on one frame is related to the steering direction on the next frame. This 
  //produces more interesting motion than, for example, simply generating a random steering 
  //direction each frame.” Reynolds
  //-------------------------------------------------------------------------------------
  void wander() {
    if (stepCount < this.wanderTVal) {
      if (this.type == "parent") {
        this.wandertheta = this.wanderT;
      } else if (this.type == "child") {
        if (this.babyType == "w_a") {
          this.wandertheta = this.wanderT;
        } else {
          this.wandertheta = -this.wanderT;
        }
      }
    } else if (stepCount >= this.wanderTVal && stepCount < this.wanderTVal*2) {
      if (this.type == "parent") {
        this.wandertheta = -this.wanderT;
      } else if (this.type == "child") {
        if (this.babyType == "w_a") {
          this.wandertheta = -this.wanderT;
        } else {
          this.wandertheta = this.wanderT;
        }
      }
    } else {
      stepCount = 0;
    }
    // Now we have to calculate the new location to steer towards on the wander circle
    PVector circleloc = this.speed.copy();    // Start with velocity
    circleloc.normalize();            // Normalize to get heading
    circleloc.mult(this.wanderD);          // Multiply by distance
    circleloc.add(this.loc);               // Make it relative to boid's location
    float h, headingXY, headingYZ, headingXZ;
    PVector circleOffSet;
    if (D2) {
      h = this.speed.heading();
      circleOffSet = new PVector(this.wanderR*cos(this.wandertheta+h), this.wanderR*sin(this.wandertheta+h), 0);
      headingXZ = 0;
      headingYZ = 0;
      headingXY = 0;
    } else {
      headingXY = (float)Math.atan2(this.speed.y, this.speed.x);
      headingXZ = (float)Math.atan2(this.speed.z, this.speed.x);
      headingYZ = (float)Math.atan2(this.speed.y, this.speed.z);
      if (subBehavior_AA) {
        circleOffSet = new PVector(this.wanderR*cos(this.wandertheta+headingXY), this.wanderR*sin(this.wandertheta+headingXY), this.wanderR*cos(this.wandertheta+headingXZ));
      } else if (subBehavior_AB) {
        circleOffSet = new PVector(this.wanderR*cos(this.wandertheta+headingXY), this.wanderR*sin(this.wandertheta+headingXY), (this.wanderR*cos(this.wandertheta+headingYZ) + this.wanderR*sin(this.wandertheta+headingXZ))/2);
      } else {
        circleOffSet = new PVector(this.wanderR*cos(this.wandertheta+headingXY), this.wanderR*sin(this.wandertheta+headingXY), random(this.wanderR*cos(this.wandertheta+(headingYZ + headingXZ)), this.wanderR*sin(this.wandertheta+(headingYZ + headingXZ))));
      }
    }
    PVector target = PVector.add(circleloc, circleOffSet);
    seek(target);
    if (drawMovement) drawWanderStuff(this.loc, circleloc, target, this.wanderR); // Render wandering circle, etc.
  }  
  //-------------------------------------------------------------------------------------
  //Draw the wandering creeper movements-------------------------------------------------
  //-------------------------------------------------------------------------------------
  // A method just to draw the circle associated with wandering
  void drawWanderStuff(PVector location, PVector circle, PVector target, float rad) {
    pushStyle();
    stroke(255); 
    noFill();
    point(circle.x, circle.y, circle.z);
    popStyle();
    pushStyle();
    stroke(120); 
    point(target.x, target.y, target.z);
    popStyle();
    pushStyle();
    stroke(160);
    strokeWeight(1);
    line(location.x, location.y, location.z, circle.x, circle.y, circle.z);
    line(circle.x, circle.y, circle.z, target.x, target.y, target.z);
    popStyle();
  }
  //-------------------------------------------------------------------------------------
  //Setup for path following-------------------------------------------------------------
  //So lets check if we are inside the virtual path thickness, if we are and we can create
  //children then they would spawn here, depending on the max allowed etc.
  //-------------------------------------------------------------------------------------
  void pathFollow() {
    PVector predict = this.speed.copy();
    predict.normalize();
    predict.mult(this.amp);
    PVector nextPosPrev = PVector.add(loc, predict);
    PVector target = null;
    PVector normal = null;
    float worldRecord = 1000000;
    for (int z = 0; z < pathList.size(); z++) {
      for (int i = 0; i <  pathList.get(z).points.size()-1; i++) { 
        PVector a = pathList.get(z).points.get(i);
        PVector b = pathList.get(z).points.get(i+1);
        PVector normalPoint = getNormalPoint(nextPosPrev, a, b);//[offset-down] Finding the normals for each line segment
        if (D2) {
          if (normalPoint.x < min(a.x, b.x) || normalPoint.x > max(a.x, b.x)) {
            normalPoint = b.copy();
          }
        } else {
          if ((normalPoint.x < min(a.x, b.x) || normalPoint.x > max(a.x, b.x)) || (normalPoint.y < min(a.y, b.y) || normalPoint.y > max(a.y, b.y)) || (normalPoint.z < min(a.z, b.z) || normalPoint.z > max(a.z, b.z))) {
            normalPoint = b.copy();
          }
        }
        float distance = nextPosPrev.dist(normalPoint);
        if (distance < worldRecord) {
          worldRecord = distance;
          normal = normalPoint;
          PVector dir = PVector.sub(b, a); // Look at the direction of the line segment so we can seek a little bit ahead of the normal
          dir.normalize();
          dir.mult(10);
          target = normalPoint.copy();
          target.add(dir);
        }
      }
    }
    //remove if you want to just go to the line
    //maxDist = 10000000000000f;
    if (worldRecord < maxDist) {
      this.sepActive = true;
      this.wonderTrigger = true;
      if (worldRecord > tempPath.radius) {
        seek(target);
      } else {
        if (triggerSeekers && this.instanceable && this.instanceTriggerCount < this.maxChildren) { //check that we have not exceeded the amount of children we are allowed to create
          addNew = true;
          triggerLoc = nextPosPrev.copy();
          childSpawners.add(new PVector(this.loc.x, this.loc.y, this.loc.z));
          childSpawnType.add(this.instanceTriggerCount);
          triggerCount++;        
          this.instanceTriggerCount ++;
        } else {
          addNew = false;
        }
        PVector zero = new PVector(0, 0, 0);
        zero.mult(3);
        acc.add(zero);
      }
    } else {
      this.wonderTrigger = false;
    }
    if (drawPathTargets) { // Draw predicted future location
      pushStyle();
      stroke(255);
      strokeWeight(1);
      fill(0);
      popStyle();
      if (D2) {
        ellipse(nextPosPrev.x, nextPosPrev.y, 4, 4);
      } else {
        pushStyle();
        stroke(255, 255, 0);
        strokeWeight(10);
        point(nextPosPrev.x, nextPosPrev.y, nextPosPrev.z);
        popStyle();
        pushStyle();
        stroke(120);
        line(this.loc.x, this.loc.y, this.loc.z, nextPosPrev.x, nextPosPrev.y, nextPosPrev.z);
        popStyle();
      }
      // Draw normal location
      pushStyle();
      stroke(255);
      fill(0);
      if (D2) {
        ellipse(normal.x, normal.y, 4, 4);
      } else {
        pushStyle();
        strokeWeight(4);
        point(normal.x, normal.y, normal.z);
        popStyle();
      }
      popStyle();
      pushStyle();
      stroke(255);
      strokeWeight(2);
      // Draw actual target (red if steering towards it)
      line(nextPosPrev.x, nextPosPrev.y, nextPosPrev.z, normal.x, normal.y, normal.z);
      popStyle();
      pushStyle();
      if (worldRecord > tempPath.radius) fill(255, 0, 0);
      noStroke();
      if (D2) {
        ellipse(target.x, target.y, 8, 8);
      } else {
        pushStyle();
        stroke(255, 0, 0);
        strokeWeight(10);
        point(target.x, target.y, target.z);
        popStyle();
      }
      popStyle();
    }
  }
  //-------------------------------------------------------------------------------------
  //Gets the normal point of each path---------------------------------------------------
  //Paths are comprised of multiple segments per path------------------------------------
  PVector getNormalPoint(PVector p, PVector a, PVector b) {
    PVector ap = PVector.sub(p, a); 
    PVector ab = PVector.sub(b, a); 
    ab.normalize();
    ab.mult(PVector.dot(ap, ab)); //Using the dot product for scalar projection
    PVector normalPoint = PVector.add(a, ab);// Finding the normal point along the line segment
    return normalPoint;
  }
  //-------------------------------------------------------------------------------------
  //Created the steering vector towards the target position------------------------------
  //-------------------------------------------------------------------------------------
  void seek(PVector target) {
    PVector desired = PVector.sub(target, this.loc);
    desired.normalize();
    desired.mult(this.max);
    PVector steer = desired.sub(this.speed);
    // Limit the magnitude of the steering force.
    steer.limit(this.maxforce);
    //acc.addSelf(steer);
    steer.mult(3);
    applyForce(steer);
  }
  //-------------------------------------------------------------------------------------
  //Created the steering vector towards the target position------------------------------
  //-------------------------------------------------------------------------------------
  void seek2(PVector target) {
    PVector desired = PVector.sub(target, this.loc);
    desired.normalize();
    desired.mult(this.max);
    PVector steer = desired.sub(this.speed);
    steer.limit(this.maxforce);
    steer.mult(1);
    applyForce(steer);
  }
  //-------------------------------------------------------------------------------------
  //Apply Force to the acceleration------------------------------------------------------
  //-------------------------------------------------------------------------------------
  void applyForce(PVector force) {
    acc.add(force);
  }
  //-------------------------------------------------------------------------------------
  //Move creeper to the next location----------------------------------------------------
  //-------------------------------------------------------------------------------------
  void move() {
    if (!mathBehavior) {
      this.speed.add(this.acc);
      this.speed.limit(this.max);
      this.loc.add(this.speed);
      this.acc = new PVector();
    } else {
      this.speed.add(this.acc);
      this.speed.normalize();
      this.speed.mult(this.vel);
      this.speed.limit(this.max);
      this.loc.add(this.speed);
      this.acc = new PVector();
    }
  }
  //-------------------------------------------------------------------------------------
  //Draw the heads and set values based on type------------------------------------------
  //-------------------------------------------------------------------------------------
  void viz() {
    if (this.type == "parent" && headWidth != 0.0f) {
      stroke(191, 255, 0);
      strokeWeight(headWidth);
      point(this.loc.x, this.loc.y, this.loc.z);
    } else if (this.type == "child" && headWidth != 0.0f) {
      if (this.babyType == "w_a") {
        stroke(120, 75, 255);
        strokeWeight(headWidth/2);
        point(this.loc.x, this.loc.y, this.loc.z);
      } else {
        stroke(190, 255, 115);
        strokeWeight(headWidth/2);
        point(this.loc.x, this.loc.y, this.loc.z);
      }
    }
  }
  //-------------------------------------------------------------------------------------
  //Separation Method steers away from nearby dudes--------------------------------------
  //-------------------------------------------------------------------------------------
  void separate () {
    float desiredseparation = this.r*2;
    PVector steer = new PVector(0, 0, 0);
    int count = 0;
    // check if we are too close
    for (int i = 0; i < agentList.size(); i++) {
      Tracker other = (Tracker) agentList.get(i);
      float d = loc.dist(other.loc);
      if ((d > 0) && (d < desiredseparation)) { 
        PVector diff = PVector.sub(this.loc, other.loc); 
        diff.normalize();
        diff = PVector.mult(diff, (1.00f / d)); // Weight by distance

        steer.add(diff);
        count++;
      }
    }
    if (count > 0) {
      steer.mult(1.0/(float)count);
    }
    if (steer.mag() > 0) {
      //Steering = Desired - Velocity
      steer.normalize();
      steer.mult(this.max);
      steer.sub(this.speed);
      steer.limit(this.maxforce);
    }
    steer.mult(3);
    applyForce(steer);
  }
  //-------------------------------------------------------------------------------------
  //Draw Tail and decay based on trail point amount--------------------------------------
  //Trail is drawn from segment to segment and colored based on a tonemap----------------
  //-------------------------------------------------------------------------------------
  void trail() {
    this.currentTrailSize++;
    if (this.currentTrailSize > this.minTrailPtCount) {
      this.objectTrails.add(new PVector(this.loc.x, this.loc.y, this.loc.z));
      this.currentTrailSize = 0;
    }
    if (this.type == "parent") { //if the type is a parent then set the trail decay by removing backwards from the tail after a target is met
      if (this.objectTrails.size() > this.seekerMT) {
        this.objectTrails.remove(0);
      }
    } else if (this.type == "child") { //if the type is a child then set the trail decay by removing backwards from the tail after a target is met
      if (this.objectTrails.size() > this.seekerChildMT) {
        this.objectTrails.remove(0);
      }
    }
    if (this.objectTrails.size() > 0) {
      for (int j = 0; j < this.objectTrails.size(); j++) {
        if (j != 0) {
          PVector pos = objectTrails.get(j);
          PVector prevpos = objectTrails.get(j - 1);
          if (this.type == "parent") {
            int a = this.toneMapA.getARGBToneFor(j / (1.0f * this.objectTrails.size()));
            if (toggleColor) {
              stroke(a, map(j, 0, objectTrails.size(), 0, tranparency));
              strokeWeight(map(j, 0, this.objectTrails.size(), 0.45, strokeWidth));
            } else {
              stroke(255, 0, 0, map(j, 0, this.objectTrails.size(), 0, 200));
              strokeWeight(map(j, 0, this.objectTrails.size(), 0.45, 1.5));
            }
          } else if (this.babyType == "w_a") {
            int a = this.toneMapB.getARGBToneFor(j / (1.0f * this.objectTrails.size()));
            if (toggleColor) {
              stroke(a, map(j, 0, objectTrails.size(), 0, tranparency));
              strokeWeight(map(j, 0, this.objectTrails.size(), 0.45, strokeWidth));
            } else {
              stroke(0, 0, 255, map(j, 0, this.objectTrails.size(), 0, 200));
              strokeWeight(map(j, 0, this.objectTrails.size(), 0.45, 1.0));
            }
          } else {
            int a = this.toneMapC.getARGBToneFor(j / (1.0f * this.objectTrails.size()));
            if (toggleColor) {
              stroke(a, map(j, 0, objectTrails.size(), 0, tranparency));
              strokeWeight(map(j, 0, this.objectTrails.size(), 0.45, strokeWidth));
            } else {
              stroke(0, 255, 255, map(j, 0, this.objectTrails.size(), 0, 200));
              strokeWeight(map(j, 0, this.objectTrails.size(), 0.45, 1.0));
            }
          } 
          line(pos.x, pos.y, pos.z, prevpos.x, prevpos.y, prevpos.z);
        }
      }
    }
  }
  void drawConnectivity(PVector conv) {
    pushStyle();
    stroke(255, 255, 255, 150);
    strokeWeight(0.5);
    line(loc.x, loc.y, loc.z, conv.x, conv.y, conv.z);
    popStyle();
  }
  void flock() {
    this.otherPtsList = new ArrayList<PVector>();
    this.otherMoveValues = new ArrayList<PVector>();
    this.allDist = new ArrayList<Float>();
    Sphere bs = new Sphere(new Vec3D(this.loc.x, this.loc.y, this.loc.z), this.searchRad);
    occTreeList = octree.getPointsWithinSphere(bs);
    if (occTreeList!=null) {
      if (occTreeList.size()!=50402030) {
        for (int i = 0; i < occTreeList.size(); i++) {
          int index = vec3DList.indexOf((Vec3D)occTreeList.get(i));
          if (drawConn) {
            Vec3D tconv = new Vec3D((Vec3D)occTreeList.get(i));
            PVector conv = new PVector(tconv.x, tconv.y, tconv.z);
            drawConnectivity(conv);
          }
          Tracker other = (Tracker) creeperCollection.get(index);
          float distance = this.loc.dist(other.loc);
          if (distance != 0) {
            this.otherPtsList.add(other.loc);
            this.allDist.add(distance);
            if (index != -1) {
              this.otherMoveValues.add(other.speed);
            }
          }
        }
      }
    }
    if (this.otherPtsList.size() > 0) {
      this.cummVec = new PVector();
      // ----------Align-----------------
      alignMethod();
      if (this.alignVector.mag() > 0) {
        this.alignVector.normalize();
      }
      this.alignVector.mult(this.av);
      // ----------Separate-----------------
      separateMethod();
      if (this.separateVector.mag() > 0) {
        this.separateVector.normalize();
      }
      this.separateVector.mult(this.sv);
      // ----------Cohesion-----------------
      cohesionMethod();
      if (this.cohesionVector.mag() > 0) {
        this.cohesionVector.normalize();
      }
      this.cohesionVector.mult(this.cv);
      // -----------------------------------
      this.cummVec.add(this.alignVector);
      this.cummVec.add(this.separateVector);
      this.cummVec.add(this.cohesionVector);
      this.acc.add(this.cummVec);
    }
  }
  void separate(float searchRadius, float separateValue, List<Tracker> collection) {
    this.creeperCollection = collection;
    this.searchRad = searchRadius;
    this.sv = separateValue;
    this.otherPtsList = new ArrayList<PVector>();
    this.otherMoveValues = new ArrayList<PVector>();
    this.allDist = new ArrayList<Float>();
    Sphere bs = new Sphere(new Vec3D(this.loc.x, this.loc.y, this.loc.z), this.searchRad);
    occTreeList = octree.getPointsWithinSphere(bs);
    if (occTreeList!=null) {
      if (occTreeList.size()!=50402030) {
        for (int i = 0; i < occTreeList.size(); i++) {
          int index = vec3DList.indexOf((Vec3D)occTreeList.get(i));
          if (drawConn) {
            Vec3D tconv = new Vec3D((Vec3D)occTreeList.get(i));
            PVector conv = new PVector(tconv.x, tconv.y, tconv.z);
            drawConnectivity(conv);
          }
          Tracker other = (Tracker) creeperCollection.get(index);
          float distance = this.loc.dist(other.loc);
          if (distance != 0) {
            this.otherPtsList.add(other.loc);
            this.allDist.add(distance);
            if (index != -1) {
              this.otherMoveValues.add(other.speed);
            }
          }
        }
      }
    }
    if (this.otherPtsList.size() > 0) {
      this.cummVec = new PVector();
      // ----------Separate-----------------
      separateMethod();
      if (this.separateVector.mag() > 0) {
        this.separateVector.normalize();
      }
      this.separateVector.mult(this.sv);
      this.cummVec.add(this.separateVector);
      this.speed.add(this.cummVec);
      this.speed.normalize();
      this.speed.mult(1.5f);
    }
  }
  void align(float searchRadius, float alignThreshold, List<Tracker> collection) {
    this.creeperCollection = collection;
    this.searchRad = searchRadius;
    this.av = alignThreshold;
    this.otherPtsList = new ArrayList<PVector>();
    this.otherMoveValues = new ArrayList<PVector>();
    this.allDist = new ArrayList<Float>();
    Sphere bs = new Sphere(new Vec3D(this.loc.x, this.loc.y, this.loc.z), this.searchRad);
    occTreeList = octree.getPointsWithinSphere(bs);
    if (occTreeList!=null) {
      if (occTreeList.size()!=50402030) {
        for (int i = 0; i < occTreeList.size(); i++) {
          int index = vec3DList.indexOf((Vec3D)occTreeList.get(i));
          if (drawConn) {
            Vec3D tconv = new Vec3D((Vec3D)occTreeList.get(i));
            PVector conv = new PVector(tconv.x, tconv.y, tconv.z);
            drawConnectivity(conv);
          }
          Tracker other = (Tracker) creeperCollection.get(index);
          float distance = this.loc.dist(other.loc);
          if (distance != 0) {
            this.otherPtsList.add(other.loc);
            this.allDist.add(distance);
            if (index != -1) {
              this.otherMoveValues.add(other.speed);
            }
          }
        }
      }
    }
    if (this.otherPtsList.size() > 0) {
      this.cummVec = new PVector();
      // ----------Align-----------------
      alignMethod();
      if (this.alignVector.mag() > 0) {
        this.alignVector.normalize();
      }
      this.alignVector.mult(this.av);
      // -----------------------------------
      this.cummVec.add(this.alignVector);
      this.speed.add(this.cummVec);
      this.speed.normalize();
      this.speed.mult(1.5f);
    }
  }
  void cohesion(float searchRadius, float cohesionValue, List<Tracker> collection) {
    this.creeperCollection = collection;
    this.searchRad = searchRadius;
    this.cv = cohesionValue;
    this.otherPtsList = new ArrayList<PVector>();
    this.otherMoveValues = new ArrayList<PVector>();
    this.allDist = new ArrayList<Float>();
    Sphere bs = new Sphere(new Vec3D(this.loc.x, this.loc.y, this.loc.z), this.searchRad);
    occTreeList = octree.getPointsWithinSphere(bs);
    if (occTreeList!=null) {
      if (occTreeList.size()!=50402030) {
        for (int i = 0; i < occTreeList.size(); i++) {
          int index = vec3DList.indexOf((Vec3D)occTreeList.get(i));
          if (drawConn) {
            Vec3D tconv = new Vec3D((Vec3D)occTreeList.get(i));
            PVector conv = new PVector(tconv.x, tconv.y, tconv.z);
            drawConnectivity(conv);
          }
          Tracker other = (Tracker) creeperCollection.get(index);
          float distance = this.loc.dist(other.loc);
          if (distance != 0) {
            this.otherPtsList.add(other.loc);
            this.allDist.add(distance);
            if (index != -1) {
              this.otherMoveValues.add(other.speed);
            }
          }
        }
      }
    }
    if (this.otherPtsList.size() > 0) {
      this.cummVec = new PVector();
      // ----------Cohesion-----------------
      cohesionMethod();
      if (this.cohesionVector.mag() > 0) {
        this.cohesionVector.normalize();
      }
      this.cohesionVector.mult(this.cv);
      // -----------------------------------
      this.cummVec.add(this.cohesionVector);
      this.speed.add(this.cummVec);
      this.speed.normalize();
      this.speed.mult(1.5f);
    }
  }
  void separateMethod() {
    this.separateVector = new PVector();
    for (int i = 0; i < this.otherPtsList.size(); i++) {
      this.separateVector.add(PVector.mult(PVector.sub(this.loc, this.otherPtsList.get(i)), 
        this.searchRad / this.allDist.get(i)));
    }
  }
  void alignMethod() {
    this.alignVector = new PVector();
    for (int i = 0; i < this.otherPtsList.size(); i++) {
      this.alignVector.add(PVector.mult(this.otherMoveValues.get(i), this.searchRad / this.allDist.get(i)));
    }
  }
  void cohesionMethod() {
    this.cohesionVector = new PVector();
    for (int i = 0; i < this.otherPtsList.size(); i++) {
      this.cohesionVector.add(this.otherPtsList.get(i));
    }
    PVector scaleVec = PVector.mult(this.cohesionVector, (1.00f / this.otherPtsList.size()));
    float dist = this.loc.dist(scaleVec);
    this.cohesionVector = PVector.mult(PVector.sub(scaleVec, this.loc), this.searchRad / dist);
  }
}
  • Share