Advertisement
itblanco

maeve

Aug 18th, 2020 (edited)
1,586
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.68 KB | None | 0 0
  1. import wblut.core.*;
  2. import wblut.geom.*;
  3. import wblut.hemesh.*;
  4. import wblut.math.*;
  5. import wblut.nurbs.*;
  6. import wblut.processing.*;
  7. import peasy.*;
  8. import java.util.*;
  9. import controlP5.*;
  10. import com.jogamp.newt.event.KeyEvent;
  11.  
  12. WB_Render render;
  13. WB_SelectRender3D selectRender;
  14. HE_MeshCollection meshColl;
  15. HE_MeshCollection selectedColl;
  16. HE_Mesh tempSelectMesh = null;
  17. HE_Mesh selectedMesh = null;
  18. PeasyCam cam;
  19.  
  20. float meshSize = 800;
  21. float splitProbability;
  22. boolean drawBorder = true;
  23.  
  24. int selectCol = 0xffFF0353;
  25. int selectedCol = 0xff92CE4F;
  26.  
  27. ControlP5 cp5;
  28.  
  29. public void setup() {
  30.   fullScreen(P3D);
  31.   //size(1300, 700, P3D);
  32.   cam = new PeasyCam(this, meshSize);
  33.   render = new WB_Render(this);
  34.   selectedColl = new HE_MeshCollection();
  35.   selectRender = new WB_SelectRender3D(this);
  36.   //ortho(-width/2, width/2, -height/2, height/2, 1, 1000000);
  37.   HEC_Creator creator = new HEC_Box().setSize(meshSize, meshSize*0.2f, meshSize*0.5f);
  38.   //HEC_Creator creator = new HEC_Sphere().setRadius(meshSize*0.8).setUFacets(5).setVFacets(5);
  39.   HE_Mesh mesh = new HE_Mesh(creator);
  40.  
  41.   meshColl = new HE_MeshCollection();
  42.   meshColl.add(mesh);
  43.  
  44.   splitProbability = random(0.1f, 0.9f);
  45.   thread("selectMesh");
  46.  
  47.   initGUI();
  48. }
  49.  
  50. WB_Ray ray = null;
  51. public void draw() {  
  52.   selectedMesh = tempSelectMesh;
  53.   ray = render.getPickingRay(mouseX, mouseY);
  54.   background(30);
  55.   if (drawBorder) {
  56.     push();
  57.     scale(1.1f);
  58.     fill(255);
  59.     noStroke();  
  60.     render.drawFaces(meshColl);
  61.     PImage i = copy();
  62.     pop();
  63.  
  64.     background(30);
  65.     cam.beginHUD();
  66.     image(i, 0, 0);
  67.     cam.endHUD();
  68.   }
  69.   noStroke();  
  70.   scale(1);
  71.   fill(30);
  72.  
  73.   render.drawFaces(meshColl);
  74.  
  75.   noFill();
  76.   stroke(255);
  77.   render.drawEdges(meshColl);
  78.  
  79.   noStroke();
  80.   fill(selectedCol);
  81.   render.drawFaces(selectedColl);
  82.   fill(selectCol);
  83.   if (selectedMesh != null) {
  84.     render.drawFaces(selectedMesh);
  85.   }
  86.  
  87.   cam.beginHUD();
  88.   cp5.draw();
  89.   cam.endHUD();
  90. }
  91.  
  92. public void keyPressed() {
  93.   if (key == 's') {
  94.     splitMesh();
  95.   }
  96.   if (key == 'r') {
  97.     reorganizeMesh();
  98.   }
  99.   if (key == 'b') {
  100.     drawBorder = !drawBorder;
  101.   }
  102.   if (keyCode == KeyEvent.VK_DELETE && selectedColl.size() > 0) {
  103.     HE_MeshIterator mi = selectedColl.mItr();
  104.     while (mi.hasNext()) {
  105.       HE_Mesh mesh = mi.next();
  106.       meshColl.remove(mesh);
  107.     }
  108.     selectedColl = new HE_MeshCollection();
  109.   }
  110.   if (key == 'o') {
  111.     ortho(-width/2, width/2, -height/2, height/2, 1, 1000000);
  112.   }
  113. }
  114.  
  115.  
  116. public void mousePressed() {    
  117.   switch(mouseButton) {
  118.     case(LEFT):
  119.     if (selectedMesh != null) {
  120.       if (selectedColl.size() > 1 && keyCode == SHIFT) selectedColl.add(selectedMesh);
  121.       else if (keyCode == ALT) selectedColl.remove(selectedMesh);
  122.       else selectedColl.add(selectedMesh);
  123.     }
  124.     break;
  125.     case(RIGHT):
  126.  
  127.     break;
  128.   }
  129. }
  130.  
  131. RadioButton changeProjRadio;
  132. int previousRadioButton;
  133. public void initGUI() {
  134.   ControlFont roboto = new ControlFont(createFont("Roboto-Light.ttf", 10));
  135.   ControlFont.sharp();
  136.   CColor guicol = new CColor(0xffEDB016, 0xff505050, selectCol, 0xffffffff, 0xffffffff);
  137.   cp5 = new ControlP5(this, roboto).setColor(guicol);
  138.   //cp5.addButton("flipProjection").setPosition(10, 10).setSize(90, 18).setLabel("PERSP PROJECTION").setColor(guicol);
  139.   Group proj = cp5.addGroup("proj")
  140.     .setPosition(10, 25)
  141.     .setSize(100, 35)
  142.     .setLabel("projection")
  143.     .setBackgroundColor(color(100, 50))
  144.     .setBarHeight(15);
  145.   changeProjRadio = cp5.addRadioButton("changeProjection")
  146.     .setPosition(5, 5)
  147.     .setSize(20, 9)
  148.     .addItem("orthogonal", 0)
  149.     .addItem("perspective", 1)
  150.     .setSpacingRow(3)
  151.     .setGroup(proj);
  152.  
  153.   Group operations = cp5.addGroup("operations")
  154.     .setPosition(120, 25)
  155.     .setSize(150, 35)
  156.     //.setLabel("projection")
  157.     .setBackgroundColor(color(100, 50))
  158.     .setBarHeight(15);
  159.   cp5.addButton("splitMesh")
  160.     .setPosition(5, 5)
  161.     .setSize(140, 16)
  162.     .setGroup(operations);
  163.   cp5.addButton("splitMesh")
  164.     .setPosition(5, 5)
  165.     .setSize(140, 16)
  166.     .setGroup(operations);
  167.  
  168.  
  169.  
  170.   cp5.setAutoDraw(false);
  171. }
  172.  
  173. public void changeProjection(int a) {
  174.   switch(a) {
  175.   case -1:
  176.     if (previousRadioButton == 0) {
  177.       changeProjRadio.activate(1);
  178.       perspective(PI/3.0f, PApplet.parseFloat(width)/PApplet.parseFloat(height), 1, 1000000);
  179.       previousRadioButton = 1;
  180.     } else if (previousRadioButton == 1) {
  181.       changeProjRadio.activate(0);
  182.       ortho(-width/2, width/2, -height/2, height/2, 1, 1000000);
  183.       previousRadioButton = 0;
  184.     }
  185.     break;
  186.   case 0:
  187.     ortho(-width/2, width/2, -height/2, height/2, 1, 1000000);
  188.     previousRadioButton = a;
  189.     break;
  190.   case 1:
  191.     perspective(PI/3.0f, PApplet.parseFloat(width)/PApplet.parseFloat(height), 1, 1000000);
  192.     previousRadioButton = a;
  193.     break;
  194.   }
  195.  
  196.   println(a);
  197. }
  198.  
  199. float rotateR = 0.6f;
  200. public void splitMesh() {
  201.   List<HE_Mesh> meshes;
  202.   if (selectedColl.size() > 0) {
  203.     meshes = selectedColl.toList();
  204.   } else {
  205.     meshes = meshColl.toList();
  206.   }
  207.  
  208.   List<HE_Mesh> newMeshes = new ArrayList<HE_Mesh>();
  209.  
  210.   for (HE_Mesh mesh : meshes) {
  211.     float probability = random(1);
  212.     if (probability < splitProbability || selectedColl.size() > 0) {
  213.       PVector rv = PVector.random3D();
  214.       PVector p = PVector.random3D();
  215.       WB_Point pos = new WB_Point(p.x, p.y, p.z);
  216.       pos.mulSelf(random(-meshSize*0.2f, meshSize*0.2f));
  217.       pos.addSelf(mesh.getCenter());
  218.       WB_Plane plane = new WB_Plane(pos, new WB_Point(rv.x, rv.y, rv.z));
  219.       HEMC_SplitMesh sm = new HEMC_SplitMesh().setCap(true).setMesh(mesh).setPlane(plane);
  220.       HE_MeshCollection mc = new HE_MeshCollection(sm);
  221.       Iterator iterator = mc.iterator();
  222.  
  223.       while (iterator.hasNext()) {
  224.         HE_Mesh m = (HE_Mesh)iterator.next();
  225.         WB_Coord point = plane.getOrigin();
  226.         WB_Coord dir = plane.getNormal();
  227.         m.rotateAboutAxisSelf(random(-rotateR, rotateR), point, dir);
  228.         m.scaleSelf(random(0.85f, 1.05f));
  229.       }
  230.       rotateR *= 0.5f;
  231.       newMeshes.addAll(mc.toList());
  232.     } else {
  233.       newMeshes.add(mesh);
  234.     }
  235.  
  236.     splitProbability = random(0.1f, 0.9f);
  237.   }
  238.  
  239.   if (selectedColl.size() > 0) {
  240.     for (HE_Mesh mesh : meshes) {
  241.       meshColl.remove(mesh);
  242.     }
  243.   } else {
  244.     meshColl = new HE_MeshCollection();
  245.   }
  246.   meshColl.addAll(newMeshes);
  247.   selectedColl = new HE_MeshCollection();
  248. }
  249.  
  250. public void reorganizeMesh() {
  251.   Map<Float, HE_Mesh> dict = new HashMap<Float, HE_Mesh>();
  252.   HE_MeshIterator mi = meshColl.mItr();
  253.   while (mi.hasNext()) {
  254.     HE_Mesh mesh = mi.next();
  255.     float volume = (float)HE_MeshOp.getVolume(mesh);
  256.     dict.put(volume, mesh);
  257.   }
  258.  
  259.   SortedSet<Float> sortedVolumes = new TreeSet<Float>(dict.keySet());
  260.  
  261.   int s = floor(sqrt(meshColl.size()))/6;
  262.   int i = 0;
  263.   for (float k : sortedVolumes) {
  264.     HE_Mesh mesh = dict.get(k);
  265.     WB_Point p = new WB_Point(i%s*(meshSize/5), i/s*(meshSize/5));
  266.     mesh.moveToSelf(p);
  267.     i++;
  268.   }
  269. }
  270.  
  271.  
  272. public void selectMesh() {
  273.   while (true) {    
  274.     HE_Mesh outMesh = null;
  275.     HE_MeshIterator mi = meshColl.mItr();
  276.     float closestDistance = -1;
  277.     while (mi.hasNext() && ray != null) {
  278.       HE_Mesh mesh = mi.next();
  279.       HET_MeshOp.HE_FaceLineIntersection fi = HET_MeshOp.getClosestIntersection(mesh, ray);
  280.       if (fi != null) {
  281.         WB_Coord point = fi.getPoint();
  282.         float distance = (float)WB_Point.getDistance(point, ray.getOrigin());
  283.         if (distance < closestDistance || closestDistance < 0) {
  284.           closestDistance = distance;
  285.           outMesh = mesh;
  286.         }
  287.       } else continue;
  288.     }
  289.     tempSelectMesh = outMesh;
  290.     delay(50);
  291.   }
  292. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement