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 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. //contains the GUI (ie CP5) in the secondapplet. also contains 3 classes: shaderManager, Brick and Slider
  2. PImage bin;
  3. int maxSurfaceHeight = 500;
  4. int nativeResoX, nativeResoY;
  5. public class SecondApplet extends PApplet {
  6. ControlP5 cp5;
  7. shaderManager shaderManager = new shaderManager();
  8. ArrayList<Shader> shaderList = new ArrayList<Shader>();
  9. ArrayList<Brick> bricks = new ArrayList<Brick>();
  10. ArrayList<Slider> slider = new ArrayList<Slider>(); //brick
  11. int binX, binY, binS;
  12. public void settings() {
  13. size(275, 120);
  14. }
  15. public void setup() {
  16. surface.setLocation(285, 240);
  17. List l = Arrays.asList(availableFx);
  18. cp5 = new ControlP5(this);
  19. cp5.addScrollableList("")
  20. .setPosition(10, height-110)
  21. .setSize(80, 100)
  22. .setBarHeight(0)
  23. .setItemHeight(20)
  24. .plugTo(this, "CP5_listActions")
  25. .addItems(l)
  26. .setType(ControlP5.LIST);
  27. Toggle rec = cp5.addToggle("record")
  28. .setPosition(100, height-105)
  29. .setSize(15, 15)
  30. .plugTo(this, "CP5_recordAction");
  31. rec.getCaptionLabel().getStyle().setMargin(-17, 0, 0, 20);
  32. Toggle auto = cp5.addToggle("spawn playing")
  33. .setPosition(100, height-85)
  34. .setSize(15, 15)
  35. .setValue(true)
  36. .plugTo(this, "CP5_spawnPlayingAction");
  37. auto.getCaptionLabel().getStyle().setMargin(-17, 0, 0, 20);
  38. Bang pauseAll = cp5.addBang("pause all")
  39. .setPosition(100, height-65)
  40. .setSize(15, 15)
  41. .plugTo(this, "CP5_pauseAllAction");
  42. pauseAll.getCaptionLabel().getStyle().setMargin(-17, 0, 0, 20);
  43. Bang nativeReso = cp5.addBang("native reso")
  44. .setPosition(220,height-35)
  45. .setSize(15,15)
  46. .plugTo(this, "CP5_nativeResoAction");
  47. //nativeReso.getCaptionLabel().getStyle().setMargin(-17,0,0,20);
  48. /*
  49. Toggle saveParams = cp5.addToggle("save parameters")
  50. .setPosition(100, height-45)
  51. .setSize(15, 15)
  52. .plugTo(this, "CP5_saveParamsAction");
  53. saveParams.getCaptionLabel().getStyle().setMargin(-17,0,0,20);
  54. */
  55. binX = width-55;
  56. binY = height-85;
  57. binS = 40;
  58. }
  59. void CP5_nativeResoAction() {
  60. renderSize = max(nativeResoX, nativeResoY);
  61. //renderer.setSize(nativeResoX, nativeResoY);
  62. }
  63. void CP5_recordAction() {
  64. recording = !recording;
  65. }
  66. void CP5_spawnPlayingAction() {
  67. spawnPlaying = !spawnPlaying;
  68. }
  69. void CP5_pauseAllAction() {
  70. for (int i = 0; i < bricks.size(); i++) {
  71. if (!bricks.get(i).paused) bricks.get(i).playPause();
  72. }
  73. }
  74. int totalBrickHeight;
  75. public void draw() {
  76. background(68, 68, 68);
  77. pushMatrix();
  78. if (heightOverLimit) {
  79. translate(0, scrollAmount);
  80. }
  81. totalBrickHeight = 0;
  82. for (int i = 0; i < shaderList.size(); i++) {
  83. bricks.get(i).update();
  84. bricks.get(i).display();
  85. //bricks.get(i).y = totalBrickHeight; ????? what was that for
  86. totalBrickHeight+= bricks.get(i).h;
  87. }
  88. popMatrix();
  89. if(heightOverLimit){
  90. strokeWeight(3);
  91. fill(255);
  92. line(width-5,-scrollAmount+4,width-5,height-120+(maxSurfaceHeight-120-totalBrickHeight)-scrollAmount-4);
  93. //-scrollAmount + (-1*(maxSurfaceHeight-120-totalBrickHeight)));
  94. }
  95. fill(68, 68, 68);
  96. noStroke();
  97. rect(0, height-120, width, 120);
  98. image(bin, binX, binY, binS, binS);
  99. stroke(255);
  100. strokeWeight(1);
  101. textSize(25);
  102. fill(255);
  103. text(renderer.width + "x" + renderer.height, 100, height-18);
  104. textSize(10);
  105. line(0, height-120, width, height-120);
  106. if (pressedBrick != -1) {
  107. fill(255);
  108. noStroke();
  109. rect(mouseX, mouseY, 35, 15);
  110. }
  111. }
  112. boolean heightOverLimit;
  113. void refreshSurface(int mode) {
  114. int currentBrickHeight = 0;
  115. if (shaderList.size() > 0) {
  116. if (mode == 0) {
  117. currentBrickHeight = totalBrickHeight + bricks.get(shaderList.size()-1).h;
  118. surface.setSize(width, height+bricks.get(shaderList.size()-1).h);
  119. } else if (mode == 1) {
  120. currentBrickHeight = totalBrickHeight - bricks.get(pressedBrick).h;
  121. if (heightOverLimit) {
  122. surface.setSize(width, currentBrickHeight+120);
  123. } else {
  124. surface.setSize(width, height-bricks.get(pressedBrick).h);
  125. }
  126. }
  127. } else {
  128. surface.setSize(width, 120);
  129. }
  130. if (currentBrickHeight + 120 > maxSurfaceHeight) {
  131. surface.setSize(width, maxSurfaceHeight);
  132. println("hi");
  133. heightOverLimit = true;
  134. } else {
  135. heightOverLimit = false;
  136. scrollAmount = 0;
  137. }
  138. cp5.setPosition(0, height-120);
  139. binY = height-87;
  140. }
  141. class shaderManager {
  142. void addShader(Shader shader) {
  143. shaderList.add(shader);
  144. shader.pos = shaderList.size()-1;
  145. bricks.add(new Brick(shaderList.size()-1, shaderList.get(shaderList.size()-1).params, shader.name));
  146. refreshSurface(0);
  147. //if (!spawnPlaying) bricks.get(shaderList.size()-1).pauseAllSliders();
  148. println("Added " + shader + " to fxList at spot. List length: " + shaderList.size());
  149. }
  150. void swapShader(int pos1, int pos2) {
  151. Collections.swap(shaderList, pos1, pos2);
  152. Collections.swap(bricks, pos1, pos2);
  153. shaderList.get(pos1).pos = pos1;
  154. shaderList.get(pos2).pos = pos2;
  155. bricks.get(pos1).setPos(pos1);
  156. bricks.get(pos2).setPos(pos2);
  157. for (int i = 0; i < bricks.size(); i++) {
  158. bricks.get(i).updateSliderPos();
  159. }
  160. }
  161. void moveShader(int pos1, int pos2) {
  162. if (pos2 > pos1) {
  163. pos2 -=1;
  164. for (int i = pos1; i < pos2; i++) {
  165. swapShader(i, i+1);
  166. }
  167. } else {
  168. for (int i = pos1; i > pos2; i--) {
  169. swapShader(i, i-1);
  170. }
  171. }
  172. }
  173. void removeShader(int pos) {
  174. if (pos >= 0 && shaderList.size() > pos) {
  175. refreshSurface(1);
  176. shaderList.remove(pos);
  177. bricks.remove(pos);
  178. for (int i = shaderList.size()-1; i > -1; i--) {
  179. bricks.get(i).setPos(i);
  180. bricks.get(i).updateSliderPos();
  181. shaderList.get(i).pos = i;
  182. }
  183. }
  184. }
  185. void applyShader() {
  186. for (int i = 0; i < shaderList.size(); i++) {
  187. try {
  188. if (bricks.get(i).active) {
  189. shaderList.get(i).getValuesFromGUI();
  190. shaderList.get(i).apply();
  191. }
  192. }
  193. catch(Exception e) {
  194. println("Warning: Brick not yet loaded");
  195. }
  196. if (i > maxFx) break;
  197. }
  198. }
  199. }
  200. int pressedBrick = -1;
  201. class Brick {
  202. ArrayList<Slider> slider = new ArrayList<Slider>();
  203. ArrayList<Param> params = new ArrayList<Param>();
  204. boolean active, paused, dragging, dragHovering, hovering, hoveringLineAbove, hoveringLineBelow, hoverActiveButton, hoverPauseButton;
  205. boolean[] pauseStates;
  206. color brickBGcol;
  207. int pos;
  208. int h, y;
  209. String name;
  210. Brick(int pos_, ArrayList params_, String name_) {
  211. name = name_;
  212. pos = pos_;
  213. params = params_;
  214. active = true;
  215. y = totalBrickHeight;
  216. h = 20 + params.size() * 20;
  217. for (int i = 0; i < params.size(); i++) {
  218. 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
  219. }
  220. pauseStates = new boolean[slider.size()];
  221. for (int i = 0; i < pauseStates.length; i++) {
  222. pauseStates[i] = false;
  223. }
  224. if (!spawnPlaying) {
  225. playPause();
  226. }
  227. }
  228. void setPos(int pos_) {
  229. pos = pos_;
  230. }
  231. void updateSliderPos() {
  232. y = 0;
  233. for (int i = 0; i < pos; i++) {
  234. y += bricks.get(i).h;
  235. }
  236. for (int i = 0; i < slider.size(); i++) {
  237. slider.get(i).y = 20+(20*i)+y;
  238. }
  239. }
  240. void exchangeSlider(int sliderNo, Param param) {
  241. slider.get(sliderNo).setMinMax(param.minValue, param.maxValue);
  242. slider.get(sliderNo).setMode(param.type);
  243. slider.get(sliderNo).setLabel(param.name);
  244. }
  245. void playPause() {
  246. paused = !paused;
  247. if (paused) {
  248. pauseAllSliders();
  249. } else {
  250. resumeAllSliders();
  251. }
  252. }
  253. void pauseAllSliders() {
  254. for (int i = 0; i < slider.size(); i++) {
  255. pauseStates[i] = slider.get(i).animated;
  256. slider.get(i).animated = false;
  257. }
  258. }
  259. void resumeAllSliders() {
  260. for (int i = 0; i < slider.size(); i++) {
  261. slider.get(i).animated = pauseStates[i];
  262. }
  263. }
  264. void update() {
  265. boolean sliderHover = false;
  266. for (int i = 0; i < slider.size(); i++) {
  267. if (slider.get(i).hovering || slider.get(i).hovering_anim_btn) sliderHover = true;
  268. if (paused && slider.get(i).animated) paused = false;
  269. }
  270. if (mouseX > 10 && mouseX < 22 && mouseY > 4+totalBrickHeight+scrollAmount && mouseY < 4+totalBrickHeight+13+scrollAmount) {
  271. hoverActiveButton = true;
  272. } else {
  273. hoverActiveButton = false;
  274. }
  275. if (mouseX > 25 && mouseX < 37 && mouseY > 4+totalBrickHeight+scrollAmount && mouseY < 4+totalBrickHeight+13+scrollAmount) {
  276. hoverPauseButton = true;
  277. } else {
  278. hoverPauseButton = false;
  279. }
  280. if (mouseY > y-5+scrollAmount && mouseY < y+5+scrollAmount && pressedBrick != -1) {
  281. hoveringLineAbove = true;
  282. if (pos > 0) {
  283. bricks.get(pos-1).hovering = false;
  284. }
  285. } else if (pos == bricks.size()-1 && mouseY > y+h-5+scrollAmount && mouseY < y+h+5+scrollAmount && pressedBrick != -1) {
  286. hoveringLineBelow = true;
  287. } else {
  288. hoveringLineBelow = false;
  289. hoveringLineAbove = false;
  290. if (mouseY > totalBrickHeight+scrollAmount && mouseY < totalBrickHeight+h+scrollAmount && !sliderHover && !hoverActiveButton && !hoverPauseButton) {
  291. hovering = true;
  292. } else {
  293. hovering = false;
  294. }
  295. }
  296. for (int i = 0; i < slider.size(); i++) {
  297. slider.get(i).update();
  298. params.get(i).value = slider.get(i).value;
  299. }
  300. brickBGcol = color(85, 85, 85);
  301. }
  302. void press() {
  303. pressedBrick = pos;
  304. }
  305. void display() {
  306. noStroke();
  307. if (active) {
  308. if (dragging) brickBGcol = color(51, 51, 51);
  309. else if (dragHovering && !hoveringLineBelow && !hoveringLineAbove) brickBGcol= color (105, 105, 105);
  310. else brickBGcol = color(85, 85, 85);
  311. } else {
  312. brickBGcol = color(0);
  313. }
  314. fill(brickBGcol);
  315. rect(0, totalBrickHeight, width, h);
  316. fill(255);
  317. text(name, 40, 13+totalBrickHeight, 10);
  318. stroke(255);
  319. strokeWeight(1);
  320. if (active) fill(185);
  321. else noFill();
  322. rect(10, 4+totalBrickHeight, 10, 10);
  323. if (paused) fill(185);
  324. else noFill();
  325. rect(25, 4+totalBrickHeight, 10, 10);
  326. for (int i = 0; i < slider.size(); i++) {
  327. slider.get(i).display();
  328. }
  329. stroke(150);
  330. strokeWeight(1);
  331. line(0, totalBrickHeight+h-1, width, totalBrickHeight+h-1);
  332. if (hoveringLineAbove) {
  333. stroke(200);
  334. strokeWeight(5);
  335. line(0, y, width, y);
  336. }
  337. if (hoveringLineBelow) {
  338. stroke(200);
  339. strokeWeight(5);
  340. line(0, y+h, width, y+h);
  341. }
  342. }
  343. }
  344. int pressedSlider = -1;
  345. //class Slider extends Brick{
  346. class Slider {
  347. int x, y, w, h, mode;
  348. int[] osciModes;
  349. float minVal, maxVal, value; //should be private but doesnt work lol
  350. boolean hovering, hovering_anim_btn, animated;
  351. String label;
  352. Oscillator osci;
  353. Slider(int x_, int y_, int w_, int h_, float minVal_, float maxVal_, String label_, int mode_, int[] osciModes_) {
  354. x = x_;
  355. y = y_;
  356. w = w_;
  357. h = h_;
  358. minVal = minVal_;
  359. maxVal = maxVal_;
  360. mode = mode_;
  361. label = label_ + (mode == INTVAL ? " (INT)" : " (FLOAT)");
  362. osciModes = osciModes_;
  363. osci = new Oscillator(int(random(2, 5)), osciModes);
  364. osci.amplitude(minVal, maxVal);
  365. osci.update();
  366. setValue(osci.value);
  367. animated = true;
  368. slider.add(this);
  369. }
  370. void setPosX(int x_) {
  371. x = x_;
  372. }
  373. void setMinMax(float min, float max) {
  374. float cval = map(value, minVal, maxVal, 0, 10000);
  375. minVal = min;
  376. maxVal = max;
  377. osci.amplitude(minVal, maxVal);
  378. setValue(map(cval, 0, 10000, minVal, maxVal));
  379. }
  380. void setLabel(String lab) {
  381. label = lab + (mode == INTVAL ? " (INT)" : " (FLOAT)");
  382. }
  383. void setMode(int mode_) {
  384. mode = mode_;
  385. }
  386. void press(int myId_) {
  387. pressedSlider = myId_;
  388. animated = false;
  389. setValue(map(mouseX, x, x+w, minVal, maxVal));
  390. }
  391. void setValue(float value_) {
  392. value = value_;
  393. value = constrain(value, minVal, maxVal);
  394. if (mode == INTVAL) value = int(round(value));
  395. }
  396. float getValue() {
  397. return(value);
  398. }
  399. void update() {
  400. osci.update();
  401. if (animated) {
  402. setValue(osci.value);
  403. }
  404. if (mouseX >= x && mouseX <= x+w && mouseY >= y+scrollAmount && mouseY <= y+h+scrollAmount) {
  405. hovering = true;
  406. } else {
  407. hovering = false;
  408. }
  409. if (mouseX >= x+w+5 && mouseX <= x+w+5+15 && mouseY >= y+scrollAmount && mouseY <= y+h+scrollAmount) {
  410. hovering_anim_btn = true;
  411. } else {
  412. hovering_anim_btn = false;
  413. }
  414. }
  415. void display() {
  416. stroke(255);
  417. strokeWeight(1);
  418. fill(100+(40*int(hovering)));
  419. rect(x, y, w, h);
  420. fill(185+(40*int(hovering)));
  421. rect(x, y, map(value, minVal, maxVal, 0, w), h);
  422. fill(255);
  423. text(label, x+5, y+10);
  424. if (animated) {
  425. fill(185+(40*int(hovering_anim_btn)));
  426. } else {
  427. fill(100+(40*int(hovering_anim_btn)));
  428. }
  429. rect(x+w+5, y, h, h);
  430. }
  431. }
  432. //CP5
  433. void CP5_listActions(int n) {
  434. if (shaderList.size() < maxFx) {
  435. switch(n) {
  436. case(0):
  437. shaderManager.addShader(new ASDFPIXELSORT());
  438. break;
  439. case(1):
  440. shaderManager.addShader(new DISTORTER());
  441. break;
  442. case(2):
  443. shaderManager.addShader(new FM());
  444. break;
  445. case(3):
  446. shaderManager.addShader(new WZIP());
  447. break;
  448. case(4):
  449. shaderManager.addShader(new AUECHO());
  450. break;
  451. case(5):
  452. shaderManager.addShader(new SLITSCAN());
  453. break;
  454. case(6):
  455. shaderManager.addShader(new WAHWAH());
  456. break;
  457. case(7):
  458. shaderManager.addShader(new PHASER());
  459. break;
  460. case(8):
  461. shaderManager.addShader(new ECHO());
  462. break;
  463. case(9):
  464. shaderManager.addShader(new DARKER());
  465. break;
  466. case(10):
  467. shaderManager.addShader(new BRIGHTER());
  468. break;
  469. case(11):
  470. shaderManager.addShader(new AMPLIFY());
  471. break;
  472. case(12):
  473. shaderManager.addShader(new BROKENCOLORROT());
  474. break;
  475. case(13):
  476. shaderManager.addShader(new POSTER());
  477. break;
  478. case(14):
  479. shaderManager.addShader(new DUAL());
  480. break;
  481. /*
  482. case(4):
  483. shaderManager.addShader(new AUECHO());
  484. break;
  485. */
  486. default:
  487. break;
  488. }
  489. }
  490. }
  491. void mousePressed() {
  492. for (int i = slider.size()-1; i >= 0; i--) {
  493. Slider s = slider.get(i);
  494. if (s.hovering) s.press(i);
  495. if (s.hovering_anim_btn) s.animated = !s.animated;
  496. }
  497. for (int i = bricks.size()-1; i >= 0; i--) {
  498. if (bricks.get(i).hovering) {
  499. bricks.get(i).press();
  500. }
  501. if (bricks.get(i).hoverActiveButton) bricks.get(i).active = !bricks.get(i).active;
  502. if (bricks.get(i).hoverPauseButton) bricks.get(i).playPause();
  503. }
  504. }
  505. void mouseDragged() {
  506. if (pressedSlider != -1) {
  507. Slider s = slider.get(pressedSlider);
  508. s.setValue(map(mouseX, s.x, s.x+s.w, s.minVal, s.maxVal));
  509. }
  510. if (pressedBrick != -1) {
  511. bricks.get(pressedBrick).dragging = true;
  512. for (int i = 0; i < bricks.size(); i++) {
  513. if (pressedBrick != i && bricks.get(i).hovering) {
  514. bricks.get(i).dragHovering = true;
  515. } else {
  516. bricks.get(i).dragHovering = false;
  517. }
  518. }
  519. }
  520. }
  521. void mouseReleased() {
  522. if (pressedBrick != -1) {
  523. bricks.get(pressedBrick).dragging = false;
  524. for (int i = 0; i < bricks.size(); i++) {
  525. bricks.get(i).dragHovering = false;
  526. if (pressedBrick != i) {
  527. if (bricks.get(i).hovering && !bricks.get(i).hoveringLineAbove && !bricks.get(i).hoveringLineBelow) {
  528. shaderManager.swapShader(pressedBrick, i);
  529. }
  530. if (pressedBrick != i-1 && bricks.get(i).hoveringLineAbove) {
  531. shaderManager.moveShader(pressedBrick, i);
  532. break;
  533. }
  534. if (bricks.get(i).hoveringLineBelow) {
  535. shaderManager.moveShader(pressedBrick, bricks.size()); //move to last
  536. }
  537. }
  538. }
  539. if (mouseX > binX && mouseX < binX+binS && mouseY > binY && mouseY < binY+binS) {
  540. println("removing");
  541. shaderManager.removeShader(pressedBrick);
  542. }
  543. }
  544. pressedSlider = -1;
  545. pressedBrick = -1;
  546. }
  547. int scrollAmount;
  548. void mouseWheel(MouseEvent event) {
  549. textSize(25);
  550. if (mouseX > 100 && mouseX < textWidth(str(renderer.width) + "x" + str(renderer.height)) + 100 && mouseY > height - 40 && mouseY < height) {
  551. if (event.getCount() < 0) renderSize += 8;
  552. else renderSize -= 8;
  553. renderSize = constrain(renderSize, 8, 15000);
  554. }
  555. if (heightOverLimit && mouseX > 0 && mouseX < width && mouseY > 0 && mouseY < height-120) {
  556. for (int i = 0; i < bricks.size(); i++) {
  557. scrollAmount -= event.getCount();
  558. scrollAmount = constrain(scrollAmount, maxSurfaceHeight-120-totalBrickHeight, 0);
  559. //bricks.get(i).y += event.getCount();
  560. //bricks.get(i).updateSliderPos();
  561. }
  562. }
  563. textSize(10);
  564. }
  565. }