compositor for 2d shader
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. class SLITSCAN extends Shader {
  2. int[] fx;
  3. int[] fy;
  4. float[] phx;
  5. float[] phy;
  6. int[] sx, sy;
  7. boolean[] skipfx;
  8. boolean[] skipfy;
  9. boolean dox, doy;
  10. PImage buffer;
  11. float[][] ft = new float[2][32];
  12. int depth; // number of octaves
  13. int fxnum;
  14. int fynum;
  15. SLITSCAN() {
  16. name = "fxSlitSscan";
  17. buffer = createImage(renderer.width, renderer.height, ARGB);
  18. for (int i=0; i<32; i++) {
  19. ft[0][i] = pow(2.0, i);
  20. ft[1][i] = 0.5*1.0/ft[0][i];
  21. }
  22. }
  23. void animate() {
  24. buffer.resize(renderer.width, renderer.height);
  25. buffer = renderer.get(0, 0, renderer.width, renderer.height);
  26. int s = buffer.width>buffer.height?buffer.height:buffer.width;
  27. depth = (int)(log(s)/log(2));
  28. fxnum = (int)random(depth);
  29. fynum = (int)random(depth);
  30. fx = new int[fxnum+1];
  31. fy = new int[fynum+1];
  32. sx = new int[fxnum+1];
  33. sy = new int[fynum+1];
  34. phx = new float[fxnum+1];
  35. phy = new float[fynum+1];
  36. skipfx = new boolean[fxnum+1];
  37. skipfy = new boolean[fynum+1];
  38. for (int i=0; i<fxnum; i++) {
  39. //fx[i]=(int)random(6);
  40. fx[i]=(int)random(6);
  41. phx[i] = random(1);
  42. skipfx[i] = random(1)<0.2;
  43. sx[i] = random(1)<0.2?-1:1;
  44. }
  45. for (int i=0; i<fynum; i++) {
  46. fy[i]=(int)random(6);
  47. //fy[i]=6;
  48. phy[i] = random(1);
  49. skipfy[i] = random(1)<0.2;
  50. sy[i] = random(1)<0.2?-1:1;
  51. }
  52. dox = random(1)<0.8;
  53. doy = dox?random(1)<0.8:true;
  54. }
  55. void apply() {
  56. renderer.beginDraw();
  57. renderer.colorMode(RGB);
  58. renderer.noStroke();
  59. colorMode(RGB);
  60. renderer.fill(255);
  61. if (!this.animating) {
  62. // buffer = createImage(renderW, renderH, ARGB);
  63. buffer.resize(renderer.width, renderer.height);
  64. buffer = renderer.get(0, 0, renderer.width, renderer.height);
  65. // int s = buffer.width>buffer.height?buffer.height:buffer.width;
  66. // depth = (int)(log(s)/log(2));
  67. // fxnum = (int)map(knobZero, 0, 255, 0, depth);
  68. // fynum = (int)map(knobOne, 0, 255, 0, depth);
  69. // fx = new int[fxnum+1];
  70. // fy = new int[fynum+1];
  71. // sx = new int[fxnum+1];
  72. // sy = new int[fynum+1];
  73. //
  74. // phx = new float[fxnum+1];
  75. // phy = new float[fynum+1];
  76. //
  77. // skipfx = new boolean[fxnum+1];
  78. // skipfy = new boolean[fynum+1];
  79. //
  80. //
  81. // for (int i=0; i<fxnum; i++) {
  82. // fx[i]=(int)random(6);
  83. // phx[i] = random(1);
  84. // skipfx[i] = random(1)<0.2;
  85. // sx[i] = random(1)<0.2?-1:1;
  86. // }
  87. // for (int i=0; i<fynum; i++) {
  88. // fy[i]=(int)random(6);
  89. // phy[i] = random(1);
  90. // skipfy[i] = random(1)<0.2;
  91. // sy[i] = random(1)<0.2?-1:1;
  92. // }
  93. // dox = random(1)<0.8;
  94. // doy = dox?random(1)<0.8:true;
  95. // } else {
  96. // println("ratatata");
  97. // buffer = createImage(renderW, renderH, ARGB);
  98. // buffer = renderer.get(0, 0, renderer.width, renderer.height);
  99. }
  100. float v=0;
  101. for (int y=0; y<buffer.height; y++)
  102. for (int x=0; x<buffer.width; x++) {
  103. float iy = map(y, 0, buffer.height, 0, 1);
  104. v=0;
  105. if (doy) for (int i=0; i<fy.length; i++)
  106. if (!skipfy[i]) v+=sy[i]*getValue(fy[i], iy, i, phy[i]);
  107. float ry = 2*iy+v;
  108. float y2 = (3*buffer.height+ry * buffer.height/2)%buffer.height;
  109. float ix = map(x, 0, buffer.width, 0, 1);
  110. v=0;
  111. if (dox) for (int i=0; i<fx.length; i++)
  112. if (!skipfx[i]) v+=sx[i]*getValue(fx[i], ix, i, phx[i]);
  113. float rx = 2*ix+v;
  114. float x2 = (3*buffer.width+rx * buffer.width/2)%buffer.width;
  115. renderer.fill(buffer.get((int)x2, (int)y2));
  116. renderer.rect(x, y, 1, 1);
  117. }
  118. renderer.endDraw();
  119. }
  120. float getValue(int fun, float idx, int freq, float phase) {
  121. switch(fun) {
  122. case 0:
  123. return getSin(idx, freq, phase);
  124. case 1:
  125. return getSaw(idx, freq, phase);
  126. case 2:
  127. return getTriangle(idx, freq, phase);
  128. case 3:
  129. return getCutTriangle(idx, freq, phase);
  130. case 4:
  131. return getSquare(idx, freq, phase);
  132. case 5:
  133. return getNoise(idx, freq, phase);
  134. default:
  135. return getSin(idx, freq, phase);
  136. }
  137. }
  138. float getNoise(float idx, int freq, float phase) {
  139. return 2*ft[1][freq]*(noise((idx+phase)*ft[0][freq])-0.5);
  140. }
  141. float getSin(float idx, int freq, float phase) {
  142. float p = ft[0][freq];
  143. return ft[1][freq] * sin(idx*TWO_PI*p+phase*TWO_PI);
  144. }
  145. float getSaw(float idx, int freq, float phase) {
  146. float p = ft[0][freq];
  147. float rp = 2.0*ft[1][freq];
  148. float p2 = p*((idx+phase+ft[1][freq])%1.0);
  149. return rp*(p2-floor(p2)-0.5);
  150. }
  151. float getSquare(float idx, int freq, float phase) {
  152. float p = ft[0][freq];
  153. float rp = ft[1][freq];
  154. return (((idx*p)+phase)%1.0)<0.5?rp:-rp;
  155. }
  156. float getTriangle(float idx, int freq, float phase) {
  157. return 2*abs(getSaw(idx, freq, phase+0.5*ft[1][freq]))-ft[1][freq];
  158. }
  159. float getCutTriangle(float idx, int freq, float phase) {
  160. return constrain(getTriangle(idx, freq, phase), -ft[1][freq+1], ft[1][freq+1]);
  161. }
  162. }