compositor for 2d glitch effects
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

secondapplet.pde 13KB

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