DISTRHO Juice Plugins
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.

449 lines
14KB

  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 "VectorJuicePlugin.hpp"
  18. #include "VectorJuiceUI.hpp"
  19. using DGL::Point;
  20. START_NAMESPACE_DISTRHO
  21. // -----------------------------------------------------------------------
  22. VectorJuiceUI::VectorJuiceUI()
  23. : UI(),
  24. fAboutWindow(this)
  25. {
  26. // xy params
  27. paramX = paramY = 0.5f;
  28. // orbit params
  29. orbitX = orbitY = subOrbitX = subOrbitY = 0.5f;
  30. // set the XY canvas area
  31. fDragging = false;
  32. fDragValid = false;
  33. fLastX = fLastY = 0;
  34. fCanvasArea.setPos(22+12, 49+12);
  35. fCanvasArea.setSize(368-24, 368-24);
  36. // background
  37. fImgBackground = Image(VectorJuiceArtwork::backgroundData, VectorJuiceArtwork::backgroundWidth, VectorJuiceArtwork::backgroundHeight, GL_BGR);
  38. //roundlet
  39. fImgRoundlet = Image(VectorJuiceArtwork::roundletData, VectorJuiceArtwork::roundletWidth, VectorJuiceArtwork::roundletHeight);
  40. //orbit
  41. fImgOrbit = Image(VectorJuiceArtwork::orbitData, VectorJuiceArtwork::orbitWidth, VectorJuiceArtwork::orbitHeight);
  42. //subOrbit
  43. fImgSubOrbit = Image(VectorJuiceArtwork::subOrbitData, VectorJuiceArtwork::subOrbitWidth, VectorJuiceArtwork::subOrbitHeight);
  44. // about
  45. Image aboutImage(VectorJuiceArtwork::aboutData, VectorJuiceArtwork::aboutWidth, VectorJuiceArtwork::aboutHeight, GL_BGR);
  46. fAboutWindow.setImage(aboutImage);
  47. // about button
  48. Image aboutImageNormal(VectorJuiceArtwork::aboutButtonNormalData, VectorJuiceArtwork::aboutButtonNormalWidth, VectorJuiceArtwork::aboutButtonNormalHeight);
  49. Image aboutImageHover(VectorJuiceArtwork::aboutButtonHoverData, VectorJuiceArtwork::aboutButtonHoverWidth, VectorJuiceArtwork::aboutButtonHoverHeight);
  50. fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover);
  51. fButtonAbout->setAbsolutePos(599, 17);
  52. fButtonAbout->setCallback(this);
  53. // knobs
  54. Image knobImage(VectorJuiceArtwork::knobData, VectorJuiceArtwork::knobWidth, VectorJuiceArtwork::knobHeight);
  55. // knob KnobOrbitSizeX
  56. fKnobOrbitSizeX = new ImageKnob(this, knobImage, ImageKnob::Vertical, VectorJuicePlugin::paramOrbitSizeX);
  57. fKnobOrbitSizeX->setAbsolutePos(423, 73);
  58. fKnobOrbitSizeX->setRotationAngle(270);
  59. fKnobOrbitSizeX->setRange(0.0f, 1.0f);
  60. fKnobOrbitSizeX->setDefault(0.5f);
  61. fKnobOrbitSizeX->setCallback(this);
  62. // knob KnobOrbitSizeY
  63. fKnobOrbitSizeY = new ImageKnob(this, knobImage, ImageKnob::Vertical, VectorJuicePlugin::paramOrbitSizeY);
  64. fKnobOrbitSizeY->setAbsolutePos(516, 73);
  65. fKnobOrbitSizeY->setRotationAngle(270);
  66. fKnobOrbitSizeY->setRange(0.0f, 1.0f);
  67. fKnobOrbitSizeY->setDefault(0.5f);
  68. fKnobOrbitSizeY->setCallback(this);
  69. // knob KnobOrbitSpeedX
  70. fKnobOrbitSpeedX = new ImageKnob(this, knobImage, ImageKnob::Vertical, VectorJuicePlugin::paramOrbitSpeedX);
  71. fKnobOrbitSpeedX->setAbsolutePos(423, 185);
  72. fKnobOrbitSpeedX->setRotationAngle(270);
  73. fKnobOrbitSpeedX->setStep(1.0f);
  74. fKnobOrbitSpeedX->setRange(1.0f, 128.0f);
  75. fKnobOrbitSpeedX->setDefault(4.0f);
  76. fKnobOrbitSpeedX->setCallback(this);
  77. // knob KnobOrbitSpeedY
  78. fKnobOrbitSpeedY = new ImageKnob(this, knobImage, ImageKnob::Vertical, VectorJuicePlugin::paramOrbitSpeedY);
  79. fKnobOrbitSpeedY->setAbsolutePos(516, 185);
  80. fKnobOrbitSpeedY->setRotationAngle(270);
  81. fKnobOrbitSpeedY->setStep(1.0f);
  82. fKnobOrbitSpeedY->setRange(1.0f, 128.0f);
  83. fKnobOrbitSpeedY->setDefault(4.0f);
  84. fKnobOrbitSpeedY->setCallback(this);
  85. // knob KnobSubOrbitSize
  86. fKnobSubOrbitSize = new ImageKnob(this, knobImage, ImageKnob::Vertical, VectorJuicePlugin::paramSubOrbitSize);
  87. fKnobSubOrbitSize->setAbsolutePos(620, 73);
  88. fKnobSubOrbitSize->setRange(0.0f, 1.0f);
  89. fKnobSubOrbitSize->setRotationAngle(270);
  90. fKnobSubOrbitSize->setDefault(0.5f);
  91. fKnobSubOrbitSize->setCallback(this);
  92. // knob KnobSubOrbitSpeed
  93. fKnobSubOrbitSpeed = new ImageKnob(this, knobImage, ImageKnob::Vertical, VectorJuicePlugin::paramSubOrbitSpeed);
  94. fKnobSubOrbitSpeed->setAbsolutePos(620, 185);
  95. fKnobSubOrbitSpeed->setRotationAngle(270);
  96. fKnobSubOrbitSpeed->setStep(1.0f);
  97. fKnobSubOrbitSpeed->setRange(1.0f, 128.0f);
  98. fKnobSubOrbitSpeed->setDefault(32.0f);
  99. fKnobSubOrbitSpeed->setCallback(this);
  100. // knob KnobSubOrbitSmooth
  101. fKnobSubOrbitSmooth = new ImageKnob(this, knobImage, ImageKnob::Vertical, VectorJuicePlugin::paramSubOrbitSmooth);
  102. fKnobSubOrbitSmooth->setAbsolutePos(620, 297);
  103. fKnobSubOrbitSmooth->setRotationAngle(270);
  104. fKnobSubOrbitSmooth->setRange(0.0f, 1.0f);
  105. fKnobSubOrbitSmooth->setDefault(0.5f);
  106. fKnobSubOrbitSmooth->setCallback(this);
  107. // sliders
  108. Image sliderImage(VectorJuiceArtwork::sliderData, VectorJuiceArtwork::sliderWidth, VectorJuiceArtwork::sliderHeight);
  109. Point<int> sliderPosStart(410, 284);
  110. Point<int> sliderPosEnd(410+48, 284);
  111. // slider OrbitWaveX
  112. fSliderOrbitWaveX = new ImageSlider(this, sliderImage, VectorJuicePlugin::paramOrbitWaveX);
  113. fSliderOrbitWaveX->setStartPos(sliderPosStart);
  114. fSliderOrbitWaveX->setEndPos(sliderPosEnd);
  115. fSliderOrbitWaveX->setRange(1.0f, 4.0f);
  116. fSliderOrbitWaveX->setStep(1.0f);
  117. fSliderOrbitWaveX->setCallback(this);
  118. // slider OrbitWaveY
  119. sliderPosStart.setX(503);
  120. sliderPosEnd.setX(503+48);
  121. fSliderOrbitWaveY = new ImageSlider(this, sliderImage, VectorJuicePlugin::paramOrbitWaveY);
  122. fSliderOrbitWaveY->setStartPos(sliderPosStart);
  123. fSliderOrbitWaveY->setEndPos(sliderPosEnd);
  124. fSliderOrbitWaveY->setRange(1.0f, 4.0f);
  125. fSliderOrbitWaveY->setStep(1.0f);
  126. fSliderOrbitWaveY->setCallback(this);
  127. // slider OrbitPhaseX
  128. sliderPosStart.setX(410);
  129. sliderPosStart.setY(345);
  130. sliderPosEnd.setX(410+48);
  131. sliderPosEnd.setY(345);
  132. fSliderOrbitPhaseX = new ImageSlider(this, sliderImage, VectorJuicePlugin::paramOrbitPhaseX);
  133. fSliderOrbitPhaseX->setStartPos(sliderPosStart);
  134. fSliderOrbitPhaseX->setEndPos(sliderPosEnd);
  135. fSliderOrbitPhaseX->setRange(1.0f, 4.0f);
  136. fSliderOrbitPhaseX->setStep(1.0f);
  137. fSliderOrbitPhaseX->setCallback(this);
  138. // slider OrbitPhaseY
  139. sliderPosStart.setX(503);
  140. sliderPosEnd.setX(503+48);
  141. fSliderOrbitPhaseY = new ImageSlider(this, sliderImage, VectorJuicePlugin::paramOrbitPhaseY);
  142. fSliderOrbitPhaseY->setStartPos(sliderPosStart);
  143. fSliderOrbitPhaseY->setEndPos(sliderPosEnd);
  144. fSliderOrbitPhaseY->setRange(1.0f, 4.0f);
  145. fSliderOrbitPhaseY->setStep(1.0f);
  146. fSliderOrbitPhaseY->setCallback(this);
  147. // set default values
  148. d_programChanged(0);
  149. }
  150. // -----------------------------------------------------------------------
  151. // DSP Callbacks
  152. void VectorJuiceUI::d_parameterChanged(uint32_t index, float value)
  153. {
  154. switch (index)
  155. {
  156. case VectorJuicePlugin::paramX:
  157. if (paramX != value)
  158. {
  159. paramX = value;
  160. fDragValid = false;
  161. repaint();
  162. }
  163. break;
  164. case VectorJuicePlugin::paramY:
  165. if (paramY != value)
  166. {
  167. paramY = value;
  168. fDragValid = false;
  169. repaint();
  170. }
  171. break;
  172. case VectorJuicePlugin::paramOrbitSizeX:
  173. fKnobOrbitSizeX->setValue(value);
  174. break;
  175. case VectorJuicePlugin::paramOrbitSizeY:
  176. fKnobOrbitSizeY->setValue(value);
  177. break;
  178. case VectorJuicePlugin::paramOrbitSpeedX:
  179. fKnobOrbitSpeedX->setValue(value);
  180. break;
  181. case VectorJuicePlugin::paramOrbitSpeedY:
  182. fKnobOrbitSpeedY->setValue(value);
  183. break;
  184. case VectorJuicePlugin::paramSubOrbitSize:
  185. fKnobSubOrbitSize->setValue(value);
  186. break;
  187. case VectorJuicePlugin::paramSubOrbitSpeed:
  188. fKnobSubOrbitSpeed->setValue(value);
  189. break;
  190. case VectorJuicePlugin::paramSubOrbitSmooth:
  191. fKnobSubOrbitSmooth->setValue(value);
  192. break;
  193. case VectorJuicePlugin::paramOrbitWaveX:
  194. fSliderOrbitWaveX->setValue(value);
  195. break;
  196. case VectorJuicePlugin::paramOrbitWaveY:
  197. fSliderOrbitWaveY->setValue(value);
  198. break;
  199. case VectorJuicePlugin::paramOrbitPhaseX:
  200. fSliderOrbitPhaseX->setValue(value);
  201. break;
  202. case VectorJuicePlugin::paramOrbitPhaseY:
  203. fSliderOrbitPhaseY->setValue(value);
  204. break;
  205. case VectorJuicePlugin::paramOrbitOutX:
  206. if (orbitX != value)
  207. {
  208. orbitX = value;
  209. repaint();
  210. }
  211. break;
  212. case VectorJuicePlugin::paramOrbitOutY:
  213. if (orbitY != value)
  214. {
  215. orbitY = value;
  216. repaint();
  217. }
  218. break;
  219. case VectorJuicePlugin::paramSubOrbitOutX:
  220. if (subOrbitX != value)
  221. {
  222. subOrbitX = value;
  223. repaint();
  224. }
  225. break;
  226. case VectorJuicePlugin::paramSubOrbitOutY:
  227. if (subOrbitY != value)
  228. {
  229. subOrbitY = value;
  230. repaint();
  231. }
  232. break;
  233. }
  234. }
  235. void VectorJuiceUI::d_programChanged(uint32_t index)
  236. {
  237. if (index != 0)
  238. return;
  239. // Default values
  240. paramX = paramY = 0.5f;
  241. fKnobOrbitSizeX->setValue(0.5f);
  242. fKnobOrbitSizeY->setValue(0.5f);
  243. fKnobOrbitSpeedX->setValue(4.0f);
  244. fKnobOrbitSpeedY->setValue(4.0f);
  245. fKnobSubOrbitSize->setValue(0.5f);
  246. fKnobSubOrbitSpeed->setValue(32.0f);
  247. fKnobSubOrbitSmooth->setValue(0.5f);
  248. fSliderOrbitWaveX->setValue(3.0f);
  249. fSliderOrbitWaveY->setValue(3.0f);
  250. fSliderOrbitPhaseX->setValue(1.0f);
  251. fSliderOrbitPhaseY->setValue(1.0f);
  252. }
  253. // -----------------------------------------------------------------------
  254. // Widget Callbacks
  255. void VectorJuiceUI::imageButtonClicked(ImageButton* button, int)
  256. {
  257. if (button != fButtonAbout)
  258. return;
  259. fAboutWindow.exec();
  260. }
  261. void VectorJuiceUI::imageKnobDragStarted(ImageKnob* knob)
  262. {
  263. d_editParameter(knob->getId(), true);
  264. }
  265. void VectorJuiceUI::imageKnobDragFinished(ImageKnob* knob)
  266. {
  267. d_editParameter(knob->getId(), false);
  268. }
  269. void VectorJuiceUI::imageKnobValueChanged(ImageKnob* knob, float value)
  270. {
  271. d_setParameterValue(knob->getId(), value);
  272. }
  273. void VectorJuiceUI::imageSliderDragStarted(ImageSlider* slider)
  274. {
  275. d_editParameter(slider->getId(), true);
  276. }
  277. void VectorJuiceUI::imageSliderDragFinished(ImageSlider* slider)
  278. {
  279. d_editParameter(slider->getId(), false);
  280. }
  281. void VectorJuiceUI::imageSliderValueChanged(ImageSlider* slider, float value)
  282. {
  283. d_setParameterValue(slider->getId(), value);
  284. }
  285. void VectorJuiceUI::onDisplay()
  286. {
  287. fImgBackground.draw();
  288. // get x, y mapped to XY area
  289. int x = fCanvasArea.getX() + paramX*fCanvasArea.getWidth() - fImgRoundlet.getWidth()/2;
  290. int y = fCanvasArea.getY() + paramY*fCanvasArea.getHeight() - fImgRoundlet.getHeight()/2;
  291. int nOrbitX = fCanvasArea.getX()+((orbitX)*fCanvasArea.getWidth())-15;
  292. int nOrbitY = fCanvasArea.getY()+((orbitY)*fCanvasArea.getWidth())-15;
  293. int nSubOrbitX = fCanvasArea.getX()+(subOrbitX*fCanvasArea.getWidth())-15;
  294. int nSubOrbitY = fCanvasArea.getY()+(subOrbitY*fCanvasArea.getWidth())-14;
  295. //draw lines, just for fun
  296. glEnable(GL_BLEND);
  297. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  298. glColor4f(0.0f, 1.0f, 0.0f, 0.05f);
  299. glLineWidth(4);
  300. glBegin(GL_LINES);
  301. glVertex2i(x+ fImgRoundlet.getWidth()/2, y+ fImgRoundlet.getHeight()/2);
  302. glVertex2i(nOrbitX+15, nOrbitY+15);
  303. glEnd();
  304. glBegin(GL_LINES);
  305. glVertex2i(nOrbitX+15, nOrbitY+15);
  306. glVertex2i(nSubOrbitX+15, nSubOrbitY+14);
  307. glEnd();
  308. // reset color
  309. glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  310. // draw roundlet and orbits
  311. fImgRoundlet.drawAt(x, y);
  312. fImgOrbit.drawAt(nOrbitX, nOrbitY);
  313. fImgSubOrbit.drawAt(nSubOrbitX, nSubOrbitY);
  314. }
  315. bool VectorJuiceUI::onMouse(const MouseEvent& ev)
  316. {
  317. if (ev.button != 1)
  318. return false;
  319. if (ev.press)
  320. {
  321. if (! fCanvasArea.contains(ev.pos))
  322. return false;
  323. fDragging = true;
  324. fDragValid = true;
  325. fLastX = ev.pos.getX();
  326. fLastY = ev.pos.getY();
  327. return true;
  328. }
  329. else if (fDragging)
  330. {
  331. fDragging = false;
  332. return true;
  333. }
  334. return false;
  335. }
  336. bool VectorJuiceUI::onMotion(const MotionEvent& ev)
  337. {
  338. if (! fDragging)
  339. return false;
  340. const int x = ev.pos.getX();
  341. const int y = ev.pos.getY();
  342. if (! fDragValid)
  343. {
  344. fDragValid = true;
  345. fLastX = x;
  346. fLastY = y;
  347. }
  348. const int movedX = fLastX - x;
  349. const int movedY = fLastY - y;
  350. fLastX = x;
  351. fLastY = y;
  352. float newX = paramX;
  353. float newY = paramY;
  354. newX -= float(movedX)/fCanvasArea.getWidth();
  355. newY -= float(movedY)/fCanvasArea.getHeight();
  356. if (newX < 0.0f)
  357. newX = 0.0f;
  358. else if (newX > 1.0f)
  359. newX = 1.0f;
  360. if (newY < 0.0f)
  361. newY = 0.0f;
  362. else if (newY > 1.0f)
  363. newY = 1.0f;
  364. if (newX != paramX)
  365. {
  366. paramX = newX;
  367. d_setParameterValue(VectorJuicePlugin::paramX, paramX);
  368. repaint();
  369. }
  370. if (newY != paramY)
  371. {
  372. paramY = newY;
  373. d_setParameterValue(VectorJuicePlugin::paramY, paramY);
  374. repaint();
  375. }
  376. return true;
  377. }
  378. // -----------------------------------------------------------------------
  379. UI* createUI()
  380. {
  381. return new VectorJuiceUI();
  382. }
  383. // -----------------------------------------------------------------------
  384. END_NAMESPACE_DISTRHO