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

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