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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  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. if (pos1 >= 0 && pos2 < shaderList.size()) {
  76. Collections.swap(shaderList, pos1, pos2);
  77. Collections.swap(bricks, pos1, pos2);
  78. shaderList.get(pos1).pos = pos1;
  79. shaderList.get(pos2).pos = pos2;
  80. bricks.get(pos1).setPos(pos1);
  81. bricks.get(pos2).setPos(pos2);
  82. for (int i = 0; i < bricks.size(); i++) {
  83. bricks.get(i).updateSliderPos();
  84. }
  85. }
  86. }
  87. void removeShader(int pos) {
  88. if (pos >= 0 && shaderList.size() > pos) {
  89. refreshSurface(1);
  90. shaderList.remove(pos);
  91. bricks.remove(pos);
  92. for (int i = shaderList.size()-1; i > -1; i--) {
  93. //bricks.get(i).pos = i;
  94. bricks.get(i).setPos(i);
  95. shaderList.get(i).pos = i;
  96. }
  97. }
  98. }
  99. void applyShader() {
  100. for (int i = 0; i < shaderList.size(); i++) {
  101. shaderList.get(i).getValuesFromGUI();
  102. shaderList.get(i).apply();
  103. if (i > maxFx) break;
  104. }
  105. }
  106. }
  107. int pressedBrick = -1;
  108. class Brick {
  109. ArrayList<Slider> slider = new ArrayList<Slider>();
  110. ArrayList<Param> params = new ArrayList<Param>();
  111. boolean dragging, dragHovering, hovering;
  112. color brickBGcol;
  113. int pos;
  114. int h, y;
  115. String name;
  116. Brick(int pos_, ArrayList params_, String name_) {
  117. name = name_;
  118. pos = pos_;
  119. params = params_;
  120. y = totalBrickHeight;
  121. h = 20 + params.size() * 20;
  122. for (int i = 0; i < params.size(); i++) {
  123. 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
  124. }
  125. println(totalBrickHeight + " " + h);
  126. }
  127. void setPos(int pos_) {
  128. pos = pos_;
  129. }
  130. void updateSliderPos() {
  131. y = 0;
  132. for (int i = 0; i < pos; i++) {
  133. y += bricks.get(i).h;
  134. }
  135. for (int i = 0; i < slider.size(); i++) {
  136. slider.get(i).y = 20+(20*i)+y;
  137. }
  138. }
  139. void exchangeSlider(int sliderNo, Param param) {
  140. slider.get(sliderNo).setMinMax(param.minValue, param.maxValue);
  141. slider.get(sliderNo).setMode(param.type);
  142. slider.get(sliderNo).setLabel(param.name);
  143. }
  144. void update() {
  145. boolean sliderHover = false;
  146. for (int i = 0; i < slider.size(); i++) {
  147. if (slider.get(i).hovering || slider.get(i).hovering_anim_btn)
  148. sliderHover = true;
  149. }
  150. if (mouseY > totalBrickHeight && mouseY < totalBrickHeight+h && !sliderHover) {
  151. hovering = true;
  152. } else {
  153. hovering = false;
  154. }
  155. for (int i = 0; i < slider.size(); i++) {
  156. slider.get(i).update();
  157. params.get(i).value = slider.get(i).value;
  158. }
  159. brickBGcol = color(85, 85, 85);
  160. }
  161. void press() {
  162. pressedBrick = pos;
  163. }
  164. void display() {
  165. noStroke();
  166. if (dragging) brickBGcol = color(51, 51, 51);
  167. else if (dragHovering) brickBGcol= color (105, 105, 105);
  168. else brickBGcol = color(85, 85, 85);
  169. fill(brickBGcol);
  170. rect(0, totalBrickHeight, width, h);
  171. fill(255);
  172. text(name, 10, 10+totalBrickHeight, 10);
  173. for (int i = 0; i < slider.size(); i++) {
  174. slider.get(i).display();
  175. }
  176. stroke(150);
  177. strokeWeight(1);
  178. line(0, totalBrickHeight+h-1, width, totalBrickHeight+h-1);
  179. }
  180. }
  181. int pressedSlider = -1;
  182. //class Slider extends Brick{
  183. class Slider {
  184. int x, y, w, h, mode;
  185. int[] osciModes;
  186. float minVal, maxVal, value; //should be private but doesnt work lol
  187. boolean hovering, hovering_anim_btn, animated;
  188. String label;
  189. Oscillator osci;
  190. Slider(int x_, int y_, int w_, int h_, float minVal_, float maxVal_, String label_, int mode_, int[] osciModes_) {
  191. x = x_;
  192. y = y_;
  193. w = w_;
  194. h = h_;
  195. minVal = minVal_;
  196. maxVal = maxVal_;
  197. mode = mode_;
  198. label = label_ + (mode == INTVAL ? " (INT)" : " (FLOAT)");
  199. osciModes = osciModes_;
  200. osci = new Oscillator(int(random(5, 15)), osciModes);
  201. osci.amplitude(minVal, maxVal);
  202. animated = true;
  203. slider.add(this);
  204. }
  205. void setPosX(int x_) {
  206. x = x_;
  207. }
  208. void setMinMax(float min, float max) {
  209. float cval = map(value, minVal, maxVal, 0, 10000);
  210. minVal = min;
  211. maxVal = max;
  212. osci.amplitude(minVal, maxVal);
  213. setValue(map(cval, 0, 10000, minVal, maxVal));
  214. }
  215. void setLabel(String lab) {
  216. label = lab + (mode == INTVAL ? " (INT)" : " (FLOAT)");
  217. }
  218. void setMode(int mode_) {
  219. mode = mode_;
  220. }
  221. void press(int myId_) {
  222. pressedSlider = myId_;
  223. animated = false;
  224. setValue(map(mouseX, x, x+w, minVal, maxVal));
  225. }
  226. void setValue(float value_) {
  227. value = value_;
  228. value = constrain(value, minVal, maxVal);
  229. if (mode == INTVAL) value = int(round(value));
  230. }
  231. float getValue() {
  232. return(value);
  233. }
  234. void update() {
  235. osci.update();
  236. if (animated) {
  237. setValue(osci.value);
  238. }
  239. if (mouseX >= x && mouseX <= x+w && mouseY >= y && mouseY <= y+h) {
  240. hovering = true;
  241. } else {
  242. hovering = false;
  243. }
  244. if (mouseX >= x+w+5 && mouseX <= x+w+5+15 && mouseY >= y && mouseY <= y+h) {
  245. hovering_anim_btn = true;
  246. } else {
  247. hovering_anim_btn = false;
  248. }
  249. }
  250. void display() {
  251. stroke(255);
  252. strokeWeight(1);
  253. fill(100+(40*int(hovering)));
  254. rect(x, y, w, h);
  255. fill(185+(40*int(hovering)));
  256. rect(x, y, map(value, minVal, maxVal, 0, w), h);
  257. fill(255);
  258. text(label, x+5, y+7);
  259. if (animated) {
  260. fill(185+(40*int(hovering_anim_btn)));
  261. } else {
  262. fill(100+(40*int(hovering_anim_btn)));
  263. }
  264. rect(x+w+5, y, h, h);
  265. }
  266. }
  267. //CP5
  268. void CP5_listActions(int n) {
  269. if (shaderList.size() < maxFx) {
  270. switch(n) {
  271. case(0):
  272. shaderManager.addShader(new ASDFPIXELSORT());
  273. break;
  274. case(1):
  275. shaderManager.addShader(new DISTORTER());
  276. break;
  277. /*
  278. case(2):
  279. shaderManager.addShader(new WAHWAH());
  280. break;
  281. case(3):
  282. shaderManager.addShader(new AUECHO());
  283. break;
  284. case(4):
  285. shaderManager.addShader(new PHASER());
  286. break;
  287. case(0):
  288. shaderManager.addShader(new WZIP());
  289. break;
  290. case(0):
  291. shaderManager.addShader(new DARKER());
  292. break;
  293. case(0):
  294. shaderManager.addShader(new BRIGHTER());
  295. break;
  296. case(0):
  297. shaderManager.addShader(new MOVE());
  298. break;
  299. case(0):
  300. shaderManager.addShader(new SCALE());
  301. break;
  302. case(0):
  303. shaderManager.addShader(new EPILEPSY());
  304. break;
  305. case(0):
  306. shaderManager.addShader(new POSTERIZE());
  307. break;
  308. case(0):
  309. shaderManager.addShader(new COPYZOOM());
  310. break;
  311. case(0):
  312. shaderManager.addShader(new DUAL());
  313. break;
  314. case(0):
  315. shaderManager.addShader(new SCANKER());
  316. break;
  317. case(0):
  318. shaderManager.addShader(new PIXELSORT());
  319. break;
  320. case(0):
  321. shaderManager.addShader(new HSB());
  322. break;
  323. case(0):
  324. shaderManager.addShader(new ECHO());
  325. break;
  326. case(0):
  327. shaderManager.addShader(new SUBTLESORT());
  328. break;
  329. case(0):
  330. shaderManager.addShader(new BLACKWHITE());
  331. break;
  332. case(0):
  333. shaderManager.addShader(new DRAWGENERATIVE());
  334. break;
  335. case(0):
  336. shaderManager.addShader(new DRAWSTROKES());
  337. break;
  338. case(0):
  339. shaderManager.addShader(new FM());
  340. break;
  341. case(0):
  342. shaderManager.addShader(new GRAUZONE());
  343. break;
  344. case(0):
  345. shaderManager.addShader(new SLITSCAN());
  346. break;
  347. */
  348. default:
  349. break;
  350. }
  351. }
  352. }
  353. void mousePressed() {
  354. for (int i = slider.size()-1; i >= 0; i--) {
  355. Slider s = slider.get(i);
  356. if (s.hovering) s.press(i);
  357. if (s.hovering_anim_btn) s.animated = !s.animated;
  358. }
  359. for (int i = bricks.size()-1; i >= 0; i--) {
  360. if (bricks.get(i).hovering) {
  361. bricks.get(i).press();
  362. }
  363. }
  364. }
  365. void mouseDragged() {
  366. if (pressedSlider != -1) {
  367. Slider s = slider.get(pressedSlider);
  368. s.setValue(map(mouseX, s.x, s.x+s.w, s.minVal, s.maxVal));
  369. }
  370. if (pressedBrick != -1) {
  371. bricks.get(pressedBrick).dragging = true;
  372. for (int i = 0; i < bricks.size(); i++) {
  373. if (pressedBrick != i && bricks.get(i).hovering) {
  374. bricks.get(i).dragHovering = true;
  375. } else {
  376. bricks.get(i).dragHovering = false;
  377. }
  378. }
  379. }
  380. }
  381. void mouseReleased() {
  382. if (pressedBrick != -1) {
  383. bricks.get(pressedBrick).dragging = false;
  384. for (int i = 0; i < bricks.size(); i++) {
  385. bricks.get(i).dragHovering = false;
  386. if (pressedBrick != i && bricks.get(i).hovering) {
  387. shaderManager.swapShader(pressedBrick, i);
  388. }
  389. }
  390. if (mouseX > binX && mouseX < binX+binS && mouseY > binY && mouseY < binY+binS) {
  391. println("removing");
  392. shaderManager.removeShader(pressedBrick);
  393. }
  394. }
  395. pressedSlider = -1;
  396. pressedBrick = -1;
  397. }
  398. }