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.

462 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, true),
  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, kImageFormatBGR);
  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, kImageFormatBGR);
  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. }
  161. // -----------------------------------------------------------------------
  162. // DSP Callbacks
  163. void VectorJuiceUI::parameterChanged(uint32_t index, float value)
  164. {
  165. switch (index)
  166. {
  167. case VectorJuicePlugin::paramX:
  168. if (paramX != value)
  169. {
  170. paramX = value;
  171. fDragValid = false;
  172. repaint();
  173. }
  174. break;
  175. case VectorJuicePlugin::paramY:
  176. if (paramY != value)
  177. {
  178. paramY = value;
  179. fDragValid = false;
  180. repaint();
  181. }
  182. break;
  183. case VectorJuicePlugin::paramOrbitSizeX:
  184. fKnobOrbitSizeX->setValue(value);
  185. break;
  186. case VectorJuicePlugin::paramOrbitSizeY:
  187. fKnobOrbitSizeY->setValue(value);
  188. break;
  189. case VectorJuicePlugin::paramOrbitSpeedX:
  190. fKnobOrbitSpeedX->setValue(value);
  191. break;
  192. case VectorJuicePlugin::paramOrbitSpeedY:
  193. fKnobOrbitSpeedY->setValue(value);
  194. break;
  195. case VectorJuicePlugin::paramSubOrbitSize:
  196. fKnobSubOrbitSize->setValue(value);
  197. break;
  198. case VectorJuicePlugin::paramSubOrbitSpeed:
  199. fKnobSubOrbitSpeed->setValue(value);
  200. break;
  201. case VectorJuicePlugin::paramSubOrbitSmooth:
  202. fKnobSubOrbitSmooth->setValue(value);
  203. break;
  204. case VectorJuicePlugin::paramOrbitWaveX:
  205. fSliderOrbitWaveX->setValue(value);
  206. break;
  207. case VectorJuicePlugin::paramOrbitWaveY:
  208. fSliderOrbitWaveY->setValue(value);
  209. break;
  210. case VectorJuicePlugin::paramOrbitPhaseX:
  211. fSliderOrbitPhaseX->setValue(value);
  212. break;
  213. case VectorJuicePlugin::paramOrbitPhaseY:
  214. fSliderOrbitPhaseY->setValue(value);
  215. break;
  216. case VectorJuicePlugin::paramOrbitOutX:
  217. if (orbitX != value)
  218. {
  219. orbitX = value;
  220. repaint();
  221. }
  222. break;
  223. case VectorJuicePlugin::paramOrbitOutY:
  224. if (orbitY != value)
  225. {
  226. orbitY = value;
  227. repaint();
  228. }
  229. break;
  230. case VectorJuicePlugin::paramSubOrbitOutX:
  231. if (subOrbitX != value)
  232. {
  233. subOrbitX = value;
  234. repaint();
  235. }
  236. break;
  237. case VectorJuicePlugin::paramSubOrbitOutY:
  238. if (subOrbitY != value)
  239. {
  240. subOrbitY = value;
  241. repaint();
  242. }
  243. break;
  244. }
  245. }
  246. void VectorJuiceUI::programLoaded(uint32_t index)
  247. {
  248. if (index != 0)
  249. return;
  250. // Default values
  251. paramX = paramY = 0.5f;
  252. fKnobOrbitSizeX->setValue(0.5f);
  253. fKnobOrbitSizeY->setValue(0.5f);
  254. fKnobOrbitSpeedX->setValue(4.0f);
  255. fKnobOrbitSpeedY->setValue(4.0f);
  256. fKnobSubOrbitSize->setValue(0.5f);
  257. fKnobSubOrbitSpeed->setValue(32.0f);
  258. fKnobSubOrbitSmooth->setValue(0.5f);
  259. fSliderOrbitWaveX->setValue(3.0f);
  260. fSliderOrbitWaveY->setValue(3.0f);
  261. fSliderOrbitPhaseX->setValue(1.0f);
  262. fSliderOrbitPhaseY->setValue(1.0f);
  263. }
  264. // -----------------------------------------------------------------------
  265. // Widget Callbacks
  266. void VectorJuiceUI::imageButtonClicked(ImageButton* button, int)
  267. {
  268. if (button != fButtonAbout)
  269. return;
  270. fAboutWindow.runAsModal();
  271. }
  272. void VectorJuiceUI::imageKnobDragStarted(ImageKnob* knob)
  273. {
  274. editParameter(knob->getId(), true);
  275. }
  276. void VectorJuiceUI::imageKnobDragFinished(ImageKnob* knob)
  277. {
  278. editParameter(knob->getId(), false);
  279. }
  280. void VectorJuiceUI::imageKnobValueChanged(ImageKnob* knob, float value)
  281. {
  282. setParameterValue(knob->getId(), value);
  283. }
  284. void VectorJuiceUI::imageSliderDragStarted(ImageSlider* slider)
  285. {
  286. editParameter(slider->getId(), true);
  287. }
  288. void VectorJuiceUI::imageSliderDragFinished(ImageSlider* slider)
  289. {
  290. editParameter(slider->getId(), false);
  291. }
  292. void VectorJuiceUI::imageSliderValueChanged(ImageSlider* slider, float value)
  293. {
  294. setParameterValue(slider->getId(), value);
  295. }
  296. void VectorJuiceUI::onDisplay()
  297. {
  298. const GraphicsContext& context(getGraphicsContext());
  299. fImgBackground.draw(context);
  300. // get x, y mapped to XY area
  301. const int x = fCanvasArea.getX() + paramX*fCanvasArea.getWidth() - fImgRoundlet.getWidth()/2;
  302. const int y = fCanvasArea.getY() + paramY*fCanvasArea.getHeight() - fImgRoundlet.getHeight()/2;
  303. const int nOrbitX = fCanvasArea.getX()+((orbitX)*fCanvasArea.getWidth())-15;
  304. const int nOrbitY = fCanvasArea.getY()+((orbitY)*fCanvasArea.getWidth())-15;
  305. const int nSubOrbitX = fCanvasArea.getX()+(subOrbitX*fCanvasArea.getWidth())-15;
  306. const int nSubOrbitY = fCanvasArea.getY()+(subOrbitY*fCanvasArea.getWidth())-14;
  307. //draw lines, just for fun
  308. glEnable(GL_BLEND);
  309. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  310. glColor4f(0.0f, 1.0f, 0.0f, 0.05f);
  311. glLineWidth(4);
  312. glBegin(GL_LINES);
  313. glVertex2i(x+ fImgRoundlet.getWidth()/2, y+ fImgRoundlet.getHeight()/2);
  314. glVertex2i(nOrbitX+15, nOrbitY+15);
  315. glEnd();
  316. glBegin(GL_LINES);
  317. glVertex2i(nOrbitX+15, nOrbitY+15);
  318. glVertex2i(nSubOrbitX+15, nSubOrbitY+14);
  319. glEnd();
  320. // draw roundlet and orbits
  321. fImgRoundlet.drawAt(context, x, y);
  322. fImgOrbit.drawAt(context, nOrbitX, nOrbitY);
  323. fImgSubOrbit.drawAt(context, nSubOrbitX, nSubOrbitY);
  324. }
  325. bool VectorJuiceUI::onMouse(const MouseEvent& ev)
  326. {
  327. if (ev.button != 1)
  328. return false;
  329. if (ev.press)
  330. {
  331. const double scaling = getWidth() / static_cast<double>(VectorJuiceArtwork::backgroundWidth);
  332. if (! fCanvasArea.containsAfterScaling(ev.pos, scaling))
  333. return false;
  334. fDragging = true;
  335. fDragValid = true;
  336. fLastX = ev.pos.getX();
  337. fLastY = ev.pos.getY();
  338. return true;
  339. }
  340. else if (fDragging)
  341. {
  342. fDragging = false;
  343. return true;
  344. }
  345. return false;
  346. }
  347. bool VectorJuiceUI::onMotion(const MotionEvent& ev)
  348. {
  349. if (! fDragging)
  350. return false;
  351. const double scaling = getWidth() / static_cast<double>(VectorJuiceArtwork::backgroundWidth);
  352. const int x = ev.pos.getX();
  353. const int y = ev.pos.getY();
  354. if (! fDragValid)
  355. {
  356. fDragValid = true;
  357. fLastX = x;
  358. fLastY = y;
  359. }
  360. const int movedX = fLastX - x;
  361. const int movedY = fLastY - y;
  362. fLastX = x;
  363. fLastY = y;
  364. float newX = paramX;
  365. float newY = paramY;
  366. newX -= float(movedX)/fCanvasArea.getWidth()/scaling;
  367. newY -= float(movedY)/fCanvasArea.getHeight()/scaling;
  368. if (newX < 0.0f)
  369. newX = 0.0f;
  370. else if (newX > 1.0f)
  371. newX = 1.0f;
  372. if (newY < 0.0f)
  373. newY = 0.0f;
  374. else if (newY > 1.0f)
  375. newY = 1.0f;
  376. if (newX != paramX)
  377. {
  378. paramX = newX;
  379. setParameterValue(VectorJuicePlugin::paramX, paramX);
  380. repaint();
  381. }
  382. if (newY != paramY)
  383. {
  384. paramY = newY;
  385. setParameterValue(VectorJuicePlugin::paramY, paramY);
  386. repaint();
  387. }
  388. return true;
  389. }
  390. // -----------------------------------------------------------------------
  391. UI* createUI()
  392. {
  393. return new VectorJuiceUI();
  394. }
  395. // -----------------------------------------------------------------------
  396. END_NAMESPACE_DISTRHO