compositor for 2d glitch effects
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

secondapplet.pde 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. //contains the GUI (ie CP5) in the secondapplet. also contains 3 classes: shaderManager, Brick and Slider
  2. PImage bin;
  3. public class SecondApplet extends PApplet {
  4. ControlP5 cp5;
  5. shaderManager shaderManager = new shaderManager();
  6. ArrayList<Shader> shaderList = new ArrayList<Shader>();
  7. ArrayList<Brick> bricks = new ArrayList<Brick>();
  8. ArrayList<Slider> slider = new ArrayList<Slider>(); //brick
  9. int binX, binY, binS;
  10. public void settings() {
  11. size(275, 120);
  12. }
  13. public void setup() {
  14. surface.setLocation(285, 240);
  15. List l = Arrays.asList(availableFx);
  16. cp5 = new ControlP5(this);
  17. cp5.addScrollableList("")
  18. .setPosition(10, height-110)
  19. .setSize(80, 100)
  20. .setBarHeight(0)
  21. .setItemHeight(20)
  22. .plugTo(this, "CP5_listActions")
  23. .addItems(l)
  24. .setType(ControlP5.LIST);
  25. cp5.addToggle("rec")
  26. .setPosition(100, height-50)
  27. .setSize(20, 20)
  28. .plugTo(this, "CP5_recordAction");
  29. binX = width-55;
  30. binY = height-85;
  31. binS = 40;
  32. }
  33. void CP5_recordAction() {
  34. recording = !recording;
  35. }
  36. int totalBrickHeight;
  37. public void draw() {
  38. background(68, 68, 68);
  39. image(bin, binX, binY, binS, binS);
  40. stroke(255);
  41. strokeWeight(1);
  42. line(0, height-120, width, height-120);
  43. totalBrickHeight = 0;
  44. for (int i = 0; i < shaderList.size(); i++) {
  45. bricks.get(i).update();
  46. bricks.get(i).display();
  47. bricks.get(i).y = totalBrickHeight;
  48. totalBrickHeight+= bricks.get(i).h;
  49. }
  50. if (pressedBrick != -1) {
  51. fill(255);
  52. noStroke();
  53. rect(mouseX, mouseY, 35, 15);
  54. }
  55. }
  56. void refreshSurface(int mode) {
  57. if (shaderList.size() > 0) {
  58. if (mode == 0) surface.setSize(width, height+bricks.get(shaderList.size()-1).h);
  59. else if (mode == 1) surface.setSize(width, height-bricks.get(pressedBrick).h);
  60. } else {
  61. surface.setSize(width, 120);
  62. }
  63. cp5.setPosition(0, height-120);
  64. binY = height-85;
  65. }
  66. class shaderManager {
  67. void addShader(Shader shader) {
  68. shaderList.add(shader);
  69. shader.pos = shaderList.size()-1;
  70. bricks.add(new Brick(shaderList.size()-1, shaderList.get(shaderList.size()-1).params, shader.name));
  71. refreshSurface(0);
  72. println("Added " + shader + " to fxList at spot. List length: " + shaderList.size());
  73. }
  74. void swapShader(int pos1, int pos2) {
  75. Collections.swap(shaderList, pos1, pos2);
  76. Collections.swap(bricks, pos1, pos2);
  77. shaderList.get(pos1).pos = pos1;
  78. shaderList.get(pos2).pos = pos2;
  79. bricks.get(pos1).setPos(pos1);
  80. bricks.get(pos2).setPos(pos2);
  81. for (int i = 0; i < bricks.size(); i++) {
  82. bricks.get(i).updateSliderPos();
  83. }
  84. }
  85. void moveShader(int pos1, int pos2) {
  86. if (pos2 > pos1) {
  87. pos2 -=1;
  88. for (int i = pos1; i < pos2; i++) {
  89. swapShader(i, i+1);
  90. }
  91. } else {
  92. for (int i = pos1; i > pos2; i--) {
  93. swapShader(i, i-1);
  94. }
  95. }
  96. }
  97. void removeShader(int pos) {
  98. if (pos >= 0 && shaderList.size() > pos) {
  99. refreshSurface(1);
  100. shaderList.remove(pos);
  101. bricks.remove(pos);
  102. for (int i = shaderList.size()-1; i > -1; i--) {
  103. bricks.get(i).setPos(i);
  104. bricks.get(i).updateSliderPos();
  105. shaderList.get(i).pos = i;
  106. }
  107. }
  108. }
  109. void applyShader() {
  110. for (int i = 0; i < shaderList.size(); i++) {
  111. shaderList.get(i).getValuesFromGUI();
  112. shaderList.get(i).apply();
  113. if (i > maxFx) break;
  114. }
  115. }
  116. }
  117. int pressedBrick = -1;
  118. class Brick {
  119. ArrayList<Slider> slider = new ArrayList<Slider>();
  120. ArrayList<Param> params = new ArrayList<Param>();
  121. boolean dragging, dragHovering, hovering, hoveringLineAbove, hoveringLineBelow;
  122. color brickBGcol;
  123. int pos;
  124. int h, y;
  125. String name;
  126. Brick(int pos_, ArrayList params_, String name_) {
  127. name = name_;
  128. pos = pos_;
  129. params = params_;
  130. y = totalBrickHeight;
  131. h = 20 + params.size() * 20;
  132. for (int i = 0; i < params.size(); i++) {
  133. slider.add(new Slider(10, 20+(20*i)+y, 230, 12, params.get(i).minValue, params.get(i).maxValue, params.get(i).name, params.get(i).type, params.get(i).osciModes)); //add possible waves to slider
  134. }
  135. println(totalBrickHeight + " " + h);
  136. }
  137. void setPos(int pos_) {
  138. pos = pos_;
  139. }
  140. void updateSliderPos() {
  141. y = 0;
  142. for (int i = 0; i < pos; i++) {
  143. y += bricks.get(i).h;
  144. }
  145. for (int i = 0; i < slider.size(); i++) {
  146. slider.get(i).y = 20+(20*i)+y;
  147. }
  148. }
  149. void exchangeSlider(int sliderNo, Param param) {
  150. slider.get(sliderNo).setMinMax(param.minValue, param.maxValue);
  151. slider.get(sliderNo).setMode(param.type);
  152. slider.get(sliderNo).setLabel(param.name);
  153. }
  154. void update() {
  155. boolean sliderHover = false;
  156. for (int i = 0; i < slider.size(); i++) {
  157. if (slider.get(i).hovering || slider.get(i).hovering_anim_btn)
  158. sliderHover = true;
  159. }
  160. if (mouseY > y-5 && mouseY < y+5 && pressedBrick != -1) {
  161. hoveringLineAbove = true;
  162. if (pos > 0) {
  163. bricks.get(pos-1).hovering = false;
  164. }
  165. } else if (pos == bricks.size()-1 && mouseY > y+h-5 && mouseY < y+h+5 && pressedBrick != -1) {
  166. hoveringLineBelow = true;
  167. } else {
  168. hoveringLineBelow = false;
  169. hoveringLineAbove = false;
  170. if (mouseY > totalBrickHeight && mouseY < totalBrickHeight+h && !sliderHover) {
  171. hovering = true;
  172. } else {
  173. hovering = false;
  174. }
  175. }
  176. for (int i = 0; i < slider.size(); i++) {
  177. slider.get(i).update();
  178. params.get(i).value = slider.get(i).value;
  179. }
  180. brickBGcol = color(85, 85, 85);
  181. }
  182. void press() {
  183. pressedBrick = pos;
  184. }
  185. void display() {
  186. noStroke();
  187. if (dragging) brickBGcol = color(51, 51, 51);
  188. else if (dragHovering && !hoveringLineBelow && !hoveringLineAbove) brickBGcol= color (105, 105, 105);
  189. else brickBGcol = color(85, 85, 85);
  190. fill(brickBGcol);
  191. rect(0, totalBrickHeight, width, h);
  192. fill(255);
  193. text(name, 10, 10+totalBrickHeight, 10);
  194. for (int i = 0; i < slider.size(); i++) {
  195. slider.get(i).display();
  196. }
  197. stroke(150);
  198. strokeWeight(1);
  199. line(0, totalBrickHeight+h-1, width, totalBrickHeight+h-1);
  200. if (hoveringLineAbove) {
  201. stroke(200);
  202. strokeWeight(5);
  203. line(0, y, width, y);
  204. }
  205. if (hoveringLineBelow) {
  206. stroke(200);
  207. strokeWeight(5);
  208. line(0, y+h, width, y+h);
  209. }
  210. }
  211. }
  212. int pressedSlider = -1;
  213. //class Slider extends Brick{
  214. class Slider {
  215. int x, y, w, h, mode;
  216. int[] osciModes;
  217. float minVal, maxVal, value; //should be private but doesnt work lol
  218. boolean hovering, hovering_anim_btn, animated;
  219. String label;
  220. Oscillator osci;
  221. Slider(int x_, int y_, int w_, int h_, float minVal_, float maxVal_, String label_, int mode_, int[] osciModes_) {
  222. x = x_;
  223. y = y_;
  224. w = w_;
  225. h = h_;
  226. minVal = minVal_;
  227. maxVal = maxVal_;
  228. mode = mode_;
  229. label = label_ + (mode == INTVAL ? " (INT)" : " (FLOAT)");
  230. osciModes = osciModes_;
  231. osci = new Oscillator(int(random(5, 15)), osciModes);
  232. osci.amplitude(minVal, maxVal);
  233. animated = true;
  234. slider.add(this);
  235. }
  236. void setPosX(int x_) {
  237. x = x_;
  238. }
  239. void setMinMax(float min, float max) {
  240. float cval = map(value, minVal, maxVal, 0, 10000);
  241. minVal = min;
  242. maxVal = max;
  243. osci.amplitude(minVal, maxVal);
  244. setValue(map(cval, 0, 10000, minVal, maxVal));
  245. }
  246. void setLabel(String lab) {
  247. label = lab + (mode == INTVAL ? " (INT)" : " (FLOAT)");
  248. }
  249. void setMode(int mode_) {
  250. mode = mode_;
  251. }
  252. void press(int myId_) {
  253. pressedSlider = myId_;
  254. animated = false;
  255. setValue(map(mouseX, x, x+w, minVal, maxVal));
  256. }
  257. void setValue(float value_) {
  258. value = value_;
  259. value = constrain(value, minVal, maxVal);
  260. if (mode == INTVAL) value = int(round(value));
  261. }
  262. float getValue() {
  263. return(value);
  264. }
  265. void update() {
  266. osci.update();
  267. if (animated) {
  268. setValue(osci.value);
  269. }
  270. if (mouseX >= x && mouseX <= x+w && mouseY >= y && mouseY <= y+h) {
  271. hovering = true;
  272. } else {
  273. hovering = false;
  274. }
  275. if (mouseX >= x+w+5 && mouseX <= x+w+5+15 && mouseY >= y && mouseY <= y+h) {
  276. hovering_anim_btn = true;
  277. } else {
  278. hovering_anim_btn = false;
  279. }
  280. }
  281. void display() {
  282. stroke(255);
  283. strokeWeight(1);
  284. fill(100+(40*int(hovering)));
  285. rect(x, y, w, h);
  286. fill(185+(40*int(hovering)));
  287. rect(x, y, map(value, minVal, maxVal, 0, w), h);
  288. fill(255);
  289. text(label, x+5, y+7);
  290. if (animated) {
  291. fill(185+(40*int(hovering_anim_btn)));
  292. } else {
  293. fill(100+(40*int(hovering_anim_btn)));
  294. }
  295. rect(x+w+5, y, h, h);
  296. }
  297. }
  298. //CP5
  299. void CP5_listActions(int n) {
  300. if (shaderList.size() < maxFx) {
  301. switch(n) {
  302. case(0):
  303. shaderManager.addShader(new ASDFPIXELSORT());
  304. break;
  305. case(1):
  306. shaderManager.addShader(new DISTORTER());
  307. break;
  308. /*
  309. case(2):
  310. shaderManager.addShader(new WAHWAH());
  311. break;
  312. case(3):
  313. shaderManager.addShader(new AUECHO());
  314. break;
  315. case(4):
  316. shaderManager.addShader(new PHASER());
  317. break;
  318. case(0):
  319. shaderManager.addShader(new WZIP());
  320. break;
  321. case(0):
  322. shaderManager.addShader(new DARKER());
  323. break;
  324. case(0):
  325. shaderManager.addShader(new BRIGHTER());
  326. break;
  327. case(0):
  328. shaderManager.addShader(new MOVE());
  329. break;
  330. case(0):
  331. shaderManager.addShader(new SCALE());
  332. break;
  333. case(0):
  334. shaderManager.addShader(new EPILEPSY());
  335. break;
  336. case(0):
  337. shaderManager.addShader(new POSTERIZE());
  338. break;
  339. case(0):
  340. shaderManager.addShader(new COPYZOOM());
  341. break;
  342. case(0):
  343. shaderManager.addShader(new DUAL());
  344. break;
  345. case(0):
  346. shaderManager.addShader(new SCANKER());
  347. break;
  348. case(0):
  349. shaderManager.addShader(new PIXELSORT());
  350. break;
  351. case(0):
  352. shaderManager.addShader(new HSB());
  353. break;
  354. case(0):
  355. shaderManager.addShader(new ECHO());
  356. break;
  357. case(0):
  358. shaderManager.addShader(new SUBTLESORT());
  359. break;
  360. case(0):
  361. shaderManager.addShader(new BLACKWHITE());
  362. break;
  363. case(0):
  364. shaderManager.addShader(new DRAWGENERATIVE());
  365. break;
  366. case(0):
  367. shaderManager.addShader(new DRAWSTROKES());
  368. break;
  369. case(0):
  370. shaderManager.addShader(new FM());
  371. break;
  372. case(0):
  373. shaderManager.addShader(new GRAUZONE());
  374. break;
  375. case(0):
  376. shaderManager.addShader(new SLITSCAN());
  377. break;
  378. */
  379. default:
  380. break;
  381. }
  382. }
  383. }
  384. void mousePressed() {
  385. for (int i = slider.size()-1; i >= 0; i--) {
  386. Slider s = slider.get(i);
  387. if (s.hovering) s.press(i);
  388. if (s.hovering_anim_btn) s.animated = !s.animated;
  389. }
  390. for (int i = bricks.size()-1; i >= 0; i--) {
  391. if (bricks.get(i).hovering) {
  392. bricks.get(i).press();
  393. }
  394. }
  395. }
  396. void mouseDragged() {
  397. if (pressedSlider != -1) {
  398. Slider s = slider.get(pressedSlider);
  399. s.setValue(map(mouseX, s.x, s.x+s.w, s.minVal, s.maxVal));
  400. }
  401. if (pressedBrick != -1) {
  402. bricks.get(pressedBrick).dragging = true;
  403. for (int i = 0; i < bricks.size(); i++) {
  404. if (pressedBrick != i && bricks.get(i).hovering) {
  405. bricks.get(i).dragHovering = true;
  406. } else {
  407. bricks.get(i).dragHovering = false;
  408. }
  409. }
  410. }
  411. }
  412. void mouseReleased() {
  413. if (pressedBrick != -1) {
  414. bricks.get(pressedBrick).dragging = false;
  415. for (int i = 0; i < bricks.size(); i++) {
  416. bricks.get(i).dragHovering = false;
  417. if (pressedBrick != i) {
  418. if (bricks.get(i).hovering && !bricks.get(i).hoveringLineAbove && !bricks.get(i).hoveringLineBelow) {
  419. shaderManager.swapShader(pressedBrick, i);
  420. }
  421. if (pressedBrick != i-1 && bricks.get(i).hoveringLineAbove) {
  422. shaderManager.moveShader(pressedBrick, i);
  423. break;
  424. }
  425. if (bricks.get(i).hoveringLineBelow) {
  426. shaderManager.moveShader(pressedBrick, bricks.size()); //move to last
  427. }
  428. }
  429. }
  430. if (mouseX > binX && mouseX < binX+binS && mouseY > binY && mouseY < binY+binS) {
  431. println("removing");
  432. shaderManager.removeShader(pressedBrick);
  433. }
  434. }
  435. pressedSlider = -1;
  436. pressedBrick = -1;
  437. }
  438. }