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.

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