Filarius

processing sketch5

Aug 10th, 2018
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.09 KB | None | 0 0
  1. int ar_size = 15;// number of cubes is ar_size^3
  2. float cube_scale = 500; //hardcoded scaling
  3. int texture_size = int(sqrt(ar_size*ar_size*ar_size) + 10);
  4.  
  5. PShape bigCube;
  6. PGraphics texture;
  7. int q[][] = new int[ar_size* ar_size*ar_size][4];
  8.  
  9. int fcount, lastm;
  10. float frate;
  11. int fint = 3;
  12.  
  13. void setup()  {
  14.   size(640, 640, P3D);  
  15.  // frameRate(60);
  16.  // hint(ENABLE_DEPTH_SORT);
  17.   //hint(DISABLE_DEPTH_TEST);;
  18.  
  19. // init cubes order maping
  20. for(int i=0;i<ar_size;i++){
  21.   for(int j=0;j<ar_size;j++){
  22.     for(int k=0;k<ar_size;k++){  
  23.      q[i+j*ar_size+k*ar_size*ar_size][0] = i;
  24.      q[i+j*ar_size+k*ar_size*ar_size][1] = j;  
  25.      q[i+j*ar_size+k*ar_size*ar_size][2] = k;
  26.      q[i+j*ar_size+k*ar_size*ar_size][3] = i+j*ar_size+k*ar_size*ar_size;
  27.     }
  28.   }
  29. }
  30.  
  31. //bubble sort of cubes for drawing order
  32. for(int i=0; i<ar_size*ar_size*ar_size-1; i++){
  33.   for(int j=i+1; j<ar_size*ar_size*ar_size; j++){
  34.     int s1 = q[i][0]+q[i][1]+q[i][2];
  35.     int s2 = q[j][0]+q[j][1]+q[j][2];
  36.     if(s1<s2){
  37.       int t1 = q[i][0];
  38.       int t2 = q[i][1];
  39.       int t3 = q[i][2];
  40.       int t4 = q[i][3];
  41.       q[i][0]=q[j][0];
  42.       q[i][1]=q[j][1];
  43.       q[i][2]=q[j][2];
  44.       q[i][3]=q[j][3];
  45.       q[j][0]=t1;
  46.       q[j][1]=t2;
  47.       q[j][2]=t3;
  48.       q[j][3]=t4;
  49.     }
  50.   }
  51. }
  52.   texture = createGraphics(texture_size, texture_size, P3D);
  53.   texture.beginDraw();
  54.   texture.background(0,255,0);
  55.   texture.endDraw();
  56.  
  57.   float size = cube_scale/(2*ar_size);
  58.   bigCube = createShape(PShape.GROUP);
  59.   for(int i=0; i<ar_size*ar_size*ar_size; i++){
  60.     PVector uv = map3dto2d(q[i][0],q[i][1],q[i][2]);
  61.  
  62.     PShape cube = createShape();            
  63.     cube.beginShape(QUAD);
  64.     cube.texture(texture);
  65.     cube.noStroke();    
  66.     setCube(cube,    
  67.        q[i][0]*size-size*ar_size/2,
  68.        q[i][1]*size-size*ar_size/2,
  69.        q[i][2]*size-size*ar_size/2,
  70.        int(uv.x),
  71.        int(uv.y),
  72.        size/2);
  73.     cube.endShape();
  74.     bigCube.addChild(cube);    
  75.   }
  76. }
  77.  
  78. PVector map3dto2d(int x, int y,int z){
  79.  int u,v;
  80.  int r = x + y*ar_size+z*ar_size*ar_size;
  81.  u = r % texture_size;
  82.  v = r / texture_size;
  83.  return new PVector(u,v);
  84. }
  85.  
  86. PVector map2dto3d(int u,int v){
  87.   int x,y,z;
  88.   int r = u + v*texture_size;
  89.   x = r % ar_size;
  90.   r /= ar_size;
  91.   y = r % ar_size;
  92.   r /= ar_size;
  93.   z = r;
  94.   return new PVector(x,y,z);  
  95. }
  96.  
  97.  
  98. // place only 3 "front" faces of cube to the world and map all faces to same pixel on texture
  99. void setCube(PShape cube,float x,float y,float z,int pixelIdX,int pixelIdY,float size){
  100.   cube.vertex(x-size,y-size,z-size,pixelIdX,pixelIdY);
  101.   cube.vertex(x-size,y+size,z-size,pixelIdX,pixelIdY);
  102.   cube.vertex(x+size,y+size,z-size,pixelIdX,pixelIdY);
  103.   cube.vertex(x+size,y-size,z-size,pixelIdX,pixelIdY);
  104.    
  105.   cube.vertex(x-size,y-size,z+size,pixelIdX,pixelIdY);
  106.   cube.vertex(x+size,y-size,z+size,pixelIdX,pixelIdY);
  107.   cube.vertex(x+size,y-size,z-size,pixelIdX,pixelIdY);
  108.   cube.vertex(x-size,y-size,z-size,pixelIdX,pixelIdY);
  109.    
  110.   cube.vertex(x-size,y-size,z+size,pixelIdX,pixelIdY);
  111.   cube.vertex(x-size,y-size,z-size,pixelIdX,pixelIdY);
  112.   cube.vertex(x-size,y+size,z-size,pixelIdX,pixelIdY);
  113.   cube.vertex(x-size,y+size,z+size,pixelIdX,pixelIdY);
  114. }
  115.  
  116. void draw()  {
  117.   colorMode(HSB,100,100,100,100);
  118.   background(50,100,100);
  119.  
  120.   translate(width/2, height/2, 0);
  121.   rotateX(0.05*210*PI/8 + (mouseY-height/2)*0.004);  
  122.   rotateY(0.05*285*PI/8 + (mouseX-width/2)*0.004);
  123.  
  124.   //update texture
  125.   texture.loadPixels();
  126.   for(int i=0;i<ar_size*ar_size*ar_size;i++){    
  127.     int u = i % texture_size;
  128.     int v = i / texture_size;
  129.     PVector vec = map2dto3d(u,v);
  130.     int x = int(vec.x);
  131.     int y = int(vec.y);
  132.     int z = int(vec.z);
  133.     //int cl = 100*(x % 2);
  134.     //int cl = 100*(y % 2);
  135.     int cl = 100*(z % 2);
  136.     texture.pixels[u + v*texture_size] = color(0,0,cl,20);
  137.   }  
  138.   texture.updatePixels();
  139.  
  140.   //draw cubes
  141.   shape(bigCube);
  142.  
  143.   //calc FPS  
  144.   fcount += 1;
  145.   int m = millis();      
  146.   if (m - lastm > 1000 * fint) {
  147.     frate = float(fcount) / fint;
  148.     fcount = 0;
  149.     lastm = m;
  150.     println("fps: " + frate);
  151.   }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment