Audio plugin host https://kx.studio/carla
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.

551 lines
17KB

  1. /*
  2. * Vector Juice Plugin
  3. * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the doc/GPL.txt file.
  16. */
  17. #include "VectorJuiceUI.hpp"
  18. using DGL::Point;
  19. START_NAMESPACE_DISTRHO
  20. // -----------------------------------------------------------------------
  21. VectorJuiceUI::VectorJuiceUI()
  22. : UI(),
  23. fAboutWindow(this)
  24. {
  25. // xy params
  26. paramX = paramY = 0.5f;
  27. // set the XY canvas area
  28. fDragging = false;
  29. fDragValid = false;
  30. fLastX = fLastY = 0;
  31. fCanvasArea.setPos(22+12, 49+12);
  32. fCanvasArea.setSize(368-24, 368-24);
  33. // background
  34. fImgBackground = Image(VectorJuiceArtwork::backgroundData, VectorJuiceArtwork::backgroundWidth, VectorJuiceArtwork::backgroundHeight, GL_BGR);
  35. //roundlet
  36. fImgRoundlet = Image(VectorJuiceArtwork::roundletData, VectorJuiceArtwork::roundletWidth, VectorJuiceArtwork::roundletHeight);
  37. //orbit
  38. fImgOrbit = Image(VectorJuiceArtwork::orbitData, VectorJuiceArtwork::orbitWidth, VectorJuiceArtwork::orbitHeight);
  39. //subOrbit
  40. fImgSubOrbit = Image(VectorJuiceArtwork::subOrbitData, VectorJuiceArtwork::subOrbitWidth, VectorJuiceArtwork::subOrbitHeight);
  41. // about
  42. Image imageAbout(VectorJuiceArtwork::aboutData, VectorJuiceArtwork::aboutWidth, VectorJuiceArtwork::aboutHeight, GL_BGR);
  43. fAboutWindow.setImage(imageAbout);
  44. // about button
  45. Image aboutImageNormal(VectorJuiceArtwork::aboutButtonNormalData, VectorJuiceArtwork::aboutButtonNormalWidth, VectorJuiceArtwork::aboutButtonNormalHeight);
  46. Image aboutImageHover(VectorJuiceArtwork::aboutButtonHoverData, VectorJuiceArtwork::aboutButtonHoverWidth, VectorJuiceArtwork::aboutButtonHoverHeight);
  47. fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover);
  48. fButtonAbout->setPos(599, 17);
  49. fButtonAbout->setCallback(this);
  50. // knobs
  51. Image knobImage(VectorJuiceArtwork::knobData, VectorJuiceArtwork::knobWidth, VectorJuiceArtwork::knobHeight);
  52. // knob KnobOrbitSpeedX
  53. fKnobOrbitSpeedX = new ImageKnob(this, knobImage);
  54. fKnobOrbitSpeedX->setPos(423, 185);
  55. fKnobOrbitSpeedX->setStep(1.0f);
  56. fKnobOrbitSpeedX->setRange(1.0f, 128.0f);
  57. fKnobOrbitSpeedX->setValue(4.0f);
  58. fKnobOrbitSpeedX->setRotationAngle(270);
  59. fKnobOrbitSpeedX->setCallback(this);
  60. // knob KnobOrbitSpeedY
  61. fKnobOrbitSpeedY = new ImageKnob(this, knobImage);
  62. fKnobOrbitSpeedY->setPos(516, 185);
  63. fKnobOrbitSpeedY->setStep(1.0f);
  64. fKnobOrbitSpeedY->setRange(1.0f, 128.0f);
  65. fKnobOrbitSpeedY->setValue(4.0f);
  66. fKnobOrbitSpeedY->setRotationAngle(270);
  67. fKnobOrbitSpeedY->setCallback(this);
  68. // knob KnobOrbitSizeX
  69. fKnobOrbitSizeX = new ImageKnob(this, knobImage);
  70. fKnobOrbitSizeX->setPos(423, 73);
  71. fKnobOrbitSizeX->setRange(0.0f, 1.0f);
  72. fKnobOrbitSizeX->setValue(0.5f);
  73. fKnobOrbitSizeX->setRotationAngle(270);
  74. fKnobOrbitSizeX->setCallback(this);
  75. // knob KnobOrbitSizeY
  76. fKnobOrbitSizeY = new ImageKnob(this, knobImage);
  77. fKnobOrbitSizeY->setPos(516, 73);
  78. fKnobOrbitSizeY->setRange(0.0f, 1.0f);
  79. fKnobOrbitSizeY->setValue(0.5f);
  80. fKnobOrbitSizeY->setRotationAngle(270);
  81. fKnobOrbitSizeY->setCallback(this);
  82. // knob KnobSubOrbitSpeed
  83. fKnobSubOrbitSpeed = new ImageKnob(this, knobImage);
  84. fKnobSubOrbitSpeed->setPos(620, 185);
  85. fKnobSubOrbitSpeed->setStep(1.0f);
  86. fKnobSubOrbitSpeed->setRange(1.0f, 128.0f);
  87. fKnobSubOrbitSpeed->setValue(32.0f);
  88. fKnobSubOrbitSpeed->setRotationAngle(270);
  89. fKnobSubOrbitSpeed->setCallback(this);
  90. // knob KnobSubOrbitSize
  91. fKnobSubOrbitSize = new ImageKnob(this, knobImage);
  92. fKnobSubOrbitSize->setPos(620, 73);
  93. fKnobSubOrbitSize->setRange(0.0f, 1.0f);
  94. fKnobSubOrbitSize->setValue(0.5f);
  95. fKnobSubOrbitSize->setRotationAngle(270);
  96. fKnobSubOrbitSize->setCallback(this);
  97. // knob KnobSubOrbitSmooth
  98. fKnobSubOrbitSmooth = new ImageKnob(this, knobImage);
  99. fKnobSubOrbitSmooth->setPos(620, 297);
  100. fKnobSubOrbitSmooth->setRange(0.0f, 1.0f);
  101. fKnobSubOrbitSmooth->setValue(0.5f);
  102. fKnobSubOrbitSmooth->setRotationAngle(270);
  103. fKnobSubOrbitSmooth->setCallback(this);
  104. // sliders
  105. Image sliderImage(VectorJuiceArtwork::sliderData, VectorJuiceArtwork::sliderWidth, VectorJuiceArtwork::sliderHeight);
  106. Point<int> sliderPosStart(410+48, 284);
  107. Point<int> sliderPosEnd(410, 284);
  108. // slider OrbitWaveX
  109. fSliderOrbitWaveX = new ImageSlider(this, sliderImage);
  110. fSliderOrbitWaveX->setStartPos(sliderPosStart);
  111. fSliderOrbitWaveX->setEndPos(sliderPosEnd);
  112. fSliderOrbitWaveX->setRange(1.0f, 4.0f);
  113. fSliderOrbitWaveX->setValue(3.0f);
  114. fSliderOrbitWaveX->setCallback(this);
  115. // slider OrbitWaveY
  116. sliderPosStart.setX(503+48);
  117. sliderPosEnd.setX(503);
  118. fSliderOrbitWaveY = new ImageSlider(this, sliderImage);
  119. fSliderOrbitWaveY->setStartPos(sliderPosStart);
  120. fSliderOrbitWaveY->setEndPos(sliderPosEnd);
  121. fSliderOrbitWaveY->setRange(1.0f, 4.0f);
  122. fSliderOrbitWaveY->setStep(1.0f);
  123. fSliderOrbitWaveY->setValue(3.0f);
  124. fSliderOrbitWaveY->setCallback(this);
  125. // slider OrbitPhaseX
  126. sliderPosStart.setX(410+48);
  127. sliderPosStart.setY(345);
  128. sliderPosEnd.setX(410);
  129. sliderPosEnd.setY(345);
  130. fSliderOrbitPhaseX = new ImageSlider(this, sliderImage);
  131. fSliderOrbitPhaseX->setStartPos(sliderPosStart);
  132. fSliderOrbitPhaseX->setEndPos(sliderPosEnd);
  133. fSliderOrbitPhaseX->setRange(0.0f, 1.0f);
  134. fSliderOrbitPhaseX->setStep(1.0f);
  135. fSliderOrbitPhaseX->setValue(0.0f);
  136. fSliderOrbitPhaseX->setCallback(this);
  137. // slider OrbitPhaseY
  138. sliderPosStart.setX(503+48);
  139. sliderPosEnd.setX(503);
  140. fSliderOrbitPhaseY = new ImageSlider(this, sliderImage);
  141. fSliderOrbitPhaseY->setStartPos(sliderPosStart);
  142. fSliderOrbitPhaseY->setEndPos(sliderPosEnd);
  143. fSliderOrbitPhaseY->setRange(0.0f, 1.0f);
  144. fSliderOrbitPhaseY->setStep(1.0f);
  145. fSliderOrbitPhaseY->setValue(0.0f);
  146. fSliderOrbitPhaseY->setCallback(this);
  147. }
  148. VectorJuiceUI::~VectorJuiceUI()
  149. {
  150. delete fButtonAbout;
  151. //knobs
  152. delete fKnobOrbitSpeedX;
  153. delete fKnobOrbitSpeedY;
  154. delete fKnobOrbitSizeX;
  155. delete fKnobOrbitSizeY;
  156. delete fKnobSubOrbitSpeed;
  157. delete fKnobSubOrbitSize;
  158. delete fKnobSubOrbitSmooth;
  159. //sliders
  160. delete fSliderOrbitWaveX;
  161. delete fSliderOrbitWaveY;
  162. delete fSliderOrbitPhaseX;
  163. delete fSliderOrbitPhaseY;
  164. }
  165. // -----------------------------------------------------------------------
  166. // DSP Callbacks
  167. void VectorJuiceUI::d_parameterChanged(uint32_t index, float value)
  168. {
  169. switch (index)
  170. {
  171. case VectorJuicePlugin::paramX:
  172. if (paramX != value)
  173. {
  174. paramX = value;
  175. fDragValid = false;
  176. repaint();
  177. }
  178. break;
  179. case VectorJuicePlugin::paramY:
  180. if (paramY != value)
  181. {
  182. paramY = value;
  183. fDragValid = false;
  184. repaint();
  185. }
  186. break;
  187. case VectorJuicePlugin::paramOrbitSizeX:
  188. fKnobOrbitSizeX->setValue(value);
  189. break;
  190. case VectorJuicePlugin::paramOrbitSizeY:
  191. fKnobOrbitSizeY->setValue(value);
  192. break;
  193. case VectorJuicePlugin::paramOrbitSpeedX:
  194. fKnobOrbitSpeedX->setValue(value);
  195. break;
  196. case VectorJuicePlugin::paramOrbitSpeedY:
  197. fKnobOrbitSpeedY->setValue(value);
  198. break;
  199. case VectorJuicePlugin::paramSubOrbitSize:
  200. fKnobSubOrbitSize->setValue(value);
  201. break;
  202. case VectorJuicePlugin::paramSubOrbitSpeed:
  203. fKnobSubOrbitSpeed->setValue(value);
  204. break;
  205. case VectorJuicePlugin::paramSubOrbitSmooth:
  206. fKnobSubOrbitSmooth->setValue(value);
  207. break;
  208. case VectorJuicePlugin::paramOrbitWaveX:
  209. fSliderOrbitWaveX->setValue(value);
  210. break;
  211. case VectorJuicePlugin::paramOrbitWaveY:
  212. fSliderOrbitWaveY->setValue(value);
  213. break;
  214. case VectorJuicePlugin::paramOrbitPhaseX:
  215. fSliderOrbitPhaseX->setValue(value);
  216. break;
  217. case VectorJuicePlugin::paramOrbitPhaseY:
  218. fSliderOrbitPhaseY->setValue(value);
  219. break;
  220. case VectorJuicePlugin::paramOrbitOutX:
  221. if (orbitX != value)
  222. {
  223. orbitX = value;
  224. repaint();
  225. }
  226. break;
  227. case VectorJuicePlugin::paramOrbitOutY:
  228. if (orbitY != value)
  229. {
  230. orbitY = value;
  231. repaint();
  232. }
  233. break;
  234. case VectorJuicePlugin::paramSubOrbitOutX:
  235. if (subOrbitX != value)
  236. {
  237. subOrbitX = value;
  238. repaint();
  239. }
  240. break;
  241. case VectorJuicePlugin::paramSubOrbitOutY:
  242. if (subOrbitY != value)
  243. {
  244. subOrbitY = value;
  245. repaint();
  246. }
  247. break;
  248. }
  249. }
  250. void VectorJuiceUI::d_programChanged(uint32_t index)
  251. {
  252. if (index != 0)
  253. return;
  254. // Default values
  255. paramX = paramY = 0.5f;
  256. fKnobOrbitSpeedX->setValue(4.0f);
  257. fKnobOrbitSpeedY->setValue(4.0f);
  258. fKnobOrbitSizeX->setValue(1.0f);
  259. fKnobOrbitSizeY->setValue(1.0f);
  260. fKnobSubOrbitSize->setValue(1.0f);
  261. fKnobSubOrbitSpeed->setValue(32.0f);
  262. fKnobSubOrbitSmooth->setValue(0.5f);
  263. fSliderOrbitWaveX->setValue(3.0f);
  264. fSliderOrbitWaveY->setValue(3.0f);
  265. fSliderOrbitPhaseX->setValue(0.0f);
  266. fSliderOrbitPhaseY->setValue(0.0f);
  267. }
  268. // -----------------------------------------------------------------------
  269. // Widget Callbacks
  270. void VectorJuiceUI::imageButtonClicked(ImageButton* button, int)
  271. {
  272. if (button != fButtonAbout)
  273. return;
  274. fAboutWindow.exec();
  275. }
  276. void VectorJuiceUI::imageKnobDragStarted(ImageKnob* knob)
  277. {
  278. if (knob == fKnobOrbitSpeedX)
  279. d_editParameter(VectorJuicePlugin::paramOrbitSpeedX, true);
  280. else if (knob == fKnobOrbitSpeedY)
  281. d_editParameter(VectorJuicePlugin::paramOrbitSpeedY, true);
  282. else if (knob == fKnobOrbitSizeX)
  283. d_editParameter(VectorJuicePlugin::paramOrbitSizeX, true);
  284. else if (knob == fKnobOrbitSizeY)
  285. d_editParameter(VectorJuicePlugin::paramOrbitSizeY, true);
  286. else if (knob == fKnobSubOrbitSize)
  287. d_editParameter(VectorJuicePlugin::paramSubOrbitSize, true);
  288. else if (knob == fKnobSubOrbitSpeed)
  289. d_editParameter(VectorJuicePlugin::paramSubOrbitSpeed, true);
  290. else if (knob == fKnobSubOrbitSmooth)
  291. d_editParameter(VectorJuicePlugin::paramSubOrbitSmooth, true);
  292. }
  293. void VectorJuiceUI::imageKnobDragFinished(ImageKnob* knob)
  294. {
  295. if (knob == fKnobOrbitSpeedX)
  296. d_editParameter(VectorJuicePlugin::paramOrbitSpeedX, false);
  297. else if (knob == fKnobOrbitSpeedY)
  298. d_editParameter(VectorJuicePlugin::paramOrbitSpeedY, false);
  299. else if (knob == fKnobOrbitSizeX)
  300. d_editParameter(VectorJuicePlugin::paramOrbitSizeX, false);
  301. else if (knob == fKnobOrbitSizeY)
  302. d_editParameter(VectorJuicePlugin::paramOrbitSizeY, false);
  303. else if (knob == fKnobSubOrbitSize)
  304. d_editParameter(VectorJuicePlugin::paramSubOrbitSize, false);
  305. else if (knob == fKnobSubOrbitSpeed)
  306. d_editParameter(VectorJuicePlugin::paramSubOrbitSpeed, false);
  307. else if (knob == fKnobSubOrbitSmooth)
  308. d_editParameter(VectorJuicePlugin::paramSubOrbitSmooth, false);
  309. }
  310. void VectorJuiceUI::imageKnobValueChanged(ImageKnob* knob, float value)
  311. {
  312. if (knob == fKnobOrbitSpeedX)
  313. d_setParameterValue(VectorJuicePlugin::paramOrbitSpeedX, value);
  314. else if (knob == fKnobOrbitSpeedY)
  315. d_setParameterValue(VectorJuicePlugin::paramOrbitSpeedY, value);
  316. else if (knob == fKnobOrbitSizeX)
  317. d_setParameterValue(VectorJuicePlugin::paramOrbitSizeX, value);
  318. else if (knob == fKnobOrbitSizeY)
  319. d_setParameterValue(VectorJuicePlugin::paramOrbitSizeY, value);
  320. else if (knob == fKnobSubOrbitSize)
  321. d_setParameterValue(VectorJuicePlugin::paramSubOrbitSize, value);
  322. else if (knob == fKnobSubOrbitSpeed)
  323. d_setParameterValue(VectorJuicePlugin::paramSubOrbitSpeed, value);
  324. else if (knob == fKnobSubOrbitSmooth)
  325. d_setParameterValue(VectorJuicePlugin::paramSubOrbitSmooth, value);
  326. }
  327. void VectorJuiceUI::imageSliderDragStarted(ImageSlider* slider)
  328. {
  329. if (slider == fSliderOrbitWaveX)
  330. d_editParameter(VectorJuicePlugin::paramOrbitWaveX, true);
  331. else if (slider == fSliderOrbitWaveY)
  332. d_editParameter(VectorJuicePlugin::paramOrbitWaveY, true);
  333. else if (slider == fSliderOrbitPhaseX)
  334. d_editParameter(VectorJuicePlugin::paramOrbitPhaseX, true);
  335. else if (slider == fSliderOrbitPhaseY)
  336. d_editParameter(VectorJuicePlugin::paramOrbitPhaseY, true);
  337. }
  338. void VectorJuiceUI::imageSliderDragFinished(ImageSlider* slider)
  339. {
  340. if (slider == fSliderOrbitWaveX)
  341. d_editParameter(VectorJuicePlugin::paramOrbitWaveX, false);
  342. else if (slider == fSliderOrbitWaveY)
  343. d_editParameter(VectorJuicePlugin::paramOrbitWaveY, false);
  344. else if (slider == fSliderOrbitPhaseX)
  345. d_editParameter(VectorJuicePlugin::paramOrbitPhaseX, false);
  346. else if (slider == fSliderOrbitPhaseY)
  347. d_editParameter(VectorJuicePlugin::paramOrbitPhaseY, false);
  348. }
  349. void VectorJuiceUI::imageSliderValueChanged(ImageSlider* slider, float value)
  350. {
  351. if (slider == fSliderOrbitWaveX)
  352. d_setParameterValue(VectorJuicePlugin::paramOrbitWaveX, value);
  353. else if (slider == fSliderOrbitWaveY)
  354. d_setParameterValue(VectorJuicePlugin::paramOrbitWaveY, value);
  355. else if (slider == fSliderOrbitPhaseX)
  356. d_setParameterValue(VectorJuicePlugin::paramOrbitPhaseX, value);
  357. else if (slider == fSliderOrbitPhaseY)
  358. d_setParameterValue(VectorJuicePlugin::paramOrbitPhaseY, value);
  359. }
  360. void VectorJuiceUI::onDisplay()
  361. {
  362. fImgBackground.draw();
  363. /*
  364. // TESTING - remove later
  365. // this paints the 'fCanvasArea' so we can clearly see its bounds
  366. {
  367. const int x = fCanvasArea.getX();
  368. const int y = fCanvasArea.getY();
  369. const int w = fCanvasArea.getWidth();
  370. const int h = fCanvasArea.getHeight();
  371. glColor4f(0.0f, 1.0f, 0.0f, 0.1f);
  372. glBegin(GL_QUADS);
  373. glTexCoord2f(0.0f, 0.0f);
  374. glVertex2i(x, y);
  375. glTexCoord2f(1.0f, 0.0f);
  376. glVertex2i(x+w, y);
  377. glTexCoord2f(1.0f, 1.0f);
  378. glVertex2i(x+w, y+h);
  379. glTexCoord2f(0.0f, 1.0f);
  380. glVertex2i(x, y+h);
  381. glEnd();
  382. // reset color
  383. glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  384. }
  385. */
  386. // get x, y mapped to XY area
  387. int x = fCanvasArea.getX() + paramX*fCanvasArea.getWidth() - fImgRoundlet.getWidth()/2;
  388. int y = fCanvasArea.getY() + paramY*fCanvasArea.getHeight() - fImgRoundlet.getHeight()/2;
  389. int nOrbitX = fCanvasArea.getX()+((orbitX)*fCanvasArea.getWidth())-15;
  390. int nOrbitY = fCanvasArea.getY()+((orbitY)*fCanvasArea.getWidth())-15;
  391. int nSubOrbitX = fCanvasArea.getX()+(subOrbitX*fCanvasArea.getWidth())-15;
  392. int nSubOrbitY = fCanvasArea.getY()+(subOrbitY*fCanvasArea.getWidth())-14;
  393. //draw lines, just for fun
  394. glEnable(GL_BLEND);
  395. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  396. glColor4f(0.0f, 1.0f, 0.0f, 0.05f);
  397. glLineWidth(4);
  398. glBegin(GL_LINES);
  399. glVertex2i(x+ fImgRoundlet.getWidth()/2, y+ fImgRoundlet.getHeight()/2);
  400. glVertex2i(nOrbitX+15, nOrbitY+15);
  401. glEnd();
  402. glBegin(GL_LINES);
  403. glVertex2i(nOrbitX+15, nOrbitY+15);
  404. glVertex2i(nSubOrbitX+15, nSubOrbitY+14);
  405. glEnd();
  406. // reset color
  407. glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  408. // draw roundlet and orbits
  409. fImgRoundlet.draw(x, y);
  410. fImgOrbit.draw(nOrbitX, nOrbitY);
  411. fImgSubOrbit.draw(nSubOrbitX, nSubOrbitY);
  412. }
  413. bool VectorJuiceUI::onMouse(int button, bool press, int x, int y)
  414. {
  415. if (button != 1)
  416. return false;
  417. if (press)
  418. {
  419. if (! fCanvasArea.contains(x, y))
  420. return false;
  421. fDragging = true;
  422. fDragValid = true;
  423. fLastX = x;
  424. fLastY = y;
  425. return true;
  426. }
  427. else if (fDragging)
  428. {
  429. fDragging = false;
  430. return true;
  431. }
  432. return false;
  433. }
  434. bool VectorJuiceUI::onMotion(int x, int y)
  435. {
  436. if (! fDragging)
  437. return false;
  438. if (! fDragValid)
  439. {
  440. fDragValid = true;
  441. fLastX = x;
  442. fLastY = y;
  443. }
  444. const int movedX = fLastX - x;
  445. const int movedY = fLastY - y;
  446. fLastX = x;
  447. fLastY = y;
  448. float newX = paramX;
  449. float newY = paramY;
  450. newX -= float(movedX)/fCanvasArea.getWidth();
  451. newY -= float(movedY)/fCanvasArea.getHeight();
  452. if (newX < 0.0f)
  453. newX = 0.0f;
  454. else if (newX > 1.0f)
  455. newX = 1.0f;
  456. if (newY < 0.0f)
  457. newY = 0.0f;
  458. else if (newY > 1.0f)
  459. newY = 1.0f;
  460. if (newX != paramX)
  461. {
  462. paramX = newX;
  463. d_setParameterValue(VectorJuicePlugin::paramX, paramX);
  464. repaint();
  465. }
  466. if (newY != paramY)
  467. {
  468. paramY = newY;
  469. d_setParameterValue(VectorJuicePlugin::paramY, paramY);
  470. repaint();
  471. }
  472. return true;
  473. }
  474. // -----------------------------------------------------------------------
  475. UI* createUI()
  476. {
  477. return new VectorJuiceUI();
  478. }
  479. // -----------------------------------------------------------------------
  480. END_NAMESPACE_DISTRHO