/* * Vector Juice Plugin * Copyright (C) 2014 Andre Sklenar , www.juicelab.cz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * For a full copy of the GNU General Public License see the doc/GPL.txt file. */ #include "VectorJuiceUI.hpp" using DGL::Point; START_NAMESPACE_DISTRHO // ----------------------------------------------------------------------- VectorJuiceUI::VectorJuiceUI() : UI(), fAboutWindow(this) { // xy params paramX = paramY = 0.5f; // set the XY canvas area fDragging = false; fDragValid = false; fLastX = fLastY = 0; fCanvasArea.setPos(22+12, 49+12); fCanvasArea.setSize(368-24, 368-24); // background fImgBackground = Image(VectorJuiceArtwork::backgroundData, VectorJuiceArtwork::backgroundWidth, VectorJuiceArtwork::backgroundHeight, GL_BGR); //roundlet fImgRoundlet = Image(VectorJuiceArtwork::roundletData, VectorJuiceArtwork::roundletWidth, VectorJuiceArtwork::roundletHeight); //orbit fImgOrbit = Image(VectorJuiceArtwork::orbitData, VectorJuiceArtwork::orbitWidth, VectorJuiceArtwork::orbitHeight); //subOrbit fImgSubOrbit = Image(VectorJuiceArtwork::subOrbitData, VectorJuiceArtwork::subOrbitWidth, VectorJuiceArtwork::subOrbitHeight); // about Image imageAbout(VectorJuiceArtwork::aboutData, VectorJuiceArtwork::aboutWidth, VectorJuiceArtwork::aboutHeight, GL_BGR); fAboutWindow.setImage(imageAbout); // about button Image aboutImageNormal(VectorJuiceArtwork::aboutButtonNormalData, VectorJuiceArtwork::aboutButtonNormalWidth, VectorJuiceArtwork::aboutButtonNormalHeight); Image aboutImageHover(VectorJuiceArtwork::aboutButtonHoverData, VectorJuiceArtwork::aboutButtonHoverWidth, VectorJuiceArtwork::aboutButtonHoverHeight); fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover); fButtonAbout->setPos(599, 17); fButtonAbout->setCallback(this); // knobs Image knobImage(VectorJuiceArtwork::knobData, VectorJuiceArtwork::knobWidth, VectorJuiceArtwork::knobHeight); // knob KnobOrbitSpeedX fKnobOrbitSpeedX = new ImageKnob(this, knobImage); fKnobOrbitSpeedX->setPos(423, 185); fKnobOrbitSpeedX->setStep(1.0f); fKnobOrbitSpeedX->setRange(1.0f, 128.0f); fKnobOrbitSpeedX->setValue(4.0f); fKnobOrbitSpeedX->setRotationAngle(270); fKnobOrbitSpeedX->setCallback(this); // knob KnobOrbitSpeedY fKnobOrbitSpeedY = new ImageKnob(this, knobImage); fKnobOrbitSpeedY->setPos(516, 185); fKnobOrbitSpeedY->setStep(1.0f); fKnobOrbitSpeedY->setRange(1.0f, 128.0f); fKnobOrbitSpeedY->setValue(4.0f); fKnobOrbitSpeedY->setRotationAngle(270); fKnobOrbitSpeedY->setCallback(this); // knob KnobOrbitSizeX fKnobOrbitSizeX = new ImageKnob(this, knobImage); fKnobOrbitSizeX->setPos(423, 73); fKnobOrbitSizeX->setRange(0.0f, 1.0f); fKnobOrbitSizeX->setValue(0.5f); fKnobOrbitSizeX->setRotationAngle(270); fKnobOrbitSizeX->setCallback(this); // knob KnobOrbitSizeY fKnobOrbitSizeY = new ImageKnob(this, knobImage); fKnobOrbitSizeY->setPos(516, 73); fKnobOrbitSizeY->setRange(0.0f, 1.0f); fKnobOrbitSizeY->setValue(0.5f); fKnobOrbitSizeY->setRotationAngle(270); fKnobOrbitSizeY->setCallback(this); // knob KnobSubOrbitSpeed fKnobSubOrbitSpeed = new ImageKnob(this, knobImage); fKnobSubOrbitSpeed->setPos(620, 185); fKnobSubOrbitSpeed->setStep(1.0f); fKnobSubOrbitSpeed->setRange(1.0f, 128.0f); fKnobSubOrbitSpeed->setValue(32.0f); fKnobSubOrbitSpeed->setRotationAngle(270); fKnobSubOrbitSpeed->setCallback(this); // knob KnobSubOrbitSize fKnobSubOrbitSize = new ImageKnob(this, knobImage); fKnobSubOrbitSize->setPos(620, 73); fKnobSubOrbitSize->setRange(0.0f, 1.0f); fKnobSubOrbitSize->setValue(0.5f); fKnobSubOrbitSize->setRotationAngle(270); fKnobSubOrbitSize->setCallback(this); // knob KnobSubOrbitSmooth fKnobSubOrbitSmooth = new ImageKnob(this, knobImage); fKnobSubOrbitSmooth->setPos(620, 297); fKnobSubOrbitSmooth->setRange(0.0f, 1.0f); fKnobSubOrbitSmooth->setValue(0.5f); fKnobSubOrbitSmooth->setRotationAngle(270); fKnobSubOrbitSmooth->setCallback(this); // sliders Image sliderImage(VectorJuiceArtwork::sliderData, VectorJuiceArtwork::sliderWidth, VectorJuiceArtwork::sliderHeight); Point sliderPosStart(410+48, 284); Point sliderPosEnd(410, 284); // slider OrbitWaveX fSliderOrbitWaveX = new ImageSlider(this, sliderImage); fSliderOrbitWaveX->setStartPos(sliderPosStart); fSliderOrbitWaveX->setEndPos(sliderPosEnd); fSliderOrbitWaveX->setRange(1.0f, 4.0f); fSliderOrbitWaveX->setValue(3.0f); fSliderOrbitWaveX->setCallback(this); // slider OrbitWaveY sliderPosStart.setX(503+48); sliderPosEnd.setX(503); fSliderOrbitWaveY = new ImageSlider(this, sliderImage); fSliderOrbitWaveY->setStartPos(sliderPosStart); fSliderOrbitWaveY->setEndPos(sliderPosEnd); fSliderOrbitWaveY->setRange(1.0f, 4.0f); fSliderOrbitWaveY->setStep(1.0f); fSliderOrbitWaveY->setValue(3.0f); fSliderOrbitWaveY->setCallback(this); // slider OrbitPhaseX sliderPosStart.setX(410+48); sliderPosStart.setY(345); sliderPosEnd.setX(410); sliderPosEnd.setY(345); fSliderOrbitPhaseX = new ImageSlider(this, sliderImage); fSliderOrbitPhaseX->setStartPos(sliderPosStart); fSliderOrbitPhaseX->setEndPos(sliderPosEnd); fSliderOrbitPhaseX->setRange(0.0f, 1.0f); fSliderOrbitPhaseX->setStep(1.0f); fSliderOrbitPhaseX->setValue(0.0f); fSliderOrbitPhaseX->setCallback(this); // slider OrbitPhaseY sliderPosStart.setX(503+48); sliderPosEnd.setX(503); fSliderOrbitPhaseY = new ImageSlider(this, sliderImage); fSliderOrbitPhaseY->setStartPos(sliderPosStart); fSliderOrbitPhaseY->setEndPos(sliderPosEnd); fSliderOrbitPhaseY->setRange(0.0f, 1.0f); fSliderOrbitPhaseY->setStep(1.0f); fSliderOrbitPhaseY->setValue(0.0f); fSliderOrbitPhaseY->setCallback(this); } VectorJuiceUI::~VectorJuiceUI() { delete fButtonAbout; //knobs delete fKnobOrbitSpeedX; delete fKnobOrbitSpeedY; delete fKnobOrbitSizeX; delete fKnobOrbitSizeY; delete fKnobSubOrbitSpeed; delete fKnobSubOrbitSize; delete fKnobSubOrbitSmooth; //sliders delete fSliderOrbitWaveX; delete fSliderOrbitWaveY; delete fSliderOrbitPhaseX; delete fSliderOrbitPhaseY; } // ----------------------------------------------------------------------- // DSP Callbacks void VectorJuiceUI::d_parameterChanged(uint32_t index, float value) { switch (index) { case VectorJuicePlugin::paramX: if (paramX != value) { paramX = value; fDragValid = false; repaint(); } break; case VectorJuicePlugin::paramY: if (paramY != value) { paramY = value; fDragValid = false; repaint(); } break; case VectorJuicePlugin::paramOrbitSizeX: fKnobOrbitSizeX->setValue(value); break; case VectorJuicePlugin::paramOrbitSizeY: fKnobOrbitSizeY->setValue(value); break; case VectorJuicePlugin::paramOrbitSpeedX: fKnobOrbitSpeedX->setValue(value); break; case VectorJuicePlugin::paramOrbitSpeedY: fKnobOrbitSpeedY->setValue(value); break; case VectorJuicePlugin::paramSubOrbitSize: fKnobSubOrbitSize->setValue(value); break; case VectorJuicePlugin::paramSubOrbitSpeed: fKnobSubOrbitSpeed->setValue(value); break; case VectorJuicePlugin::paramSubOrbitSmooth: fKnobSubOrbitSmooth->setValue(value); break; case VectorJuicePlugin::paramOrbitWaveX: fSliderOrbitWaveX->setValue(value); break; case VectorJuicePlugin::paramOrbitWaveY: fSliderOrbitWaveY->setValue(value); break; case VectorJuicePlugin::paramOrbitPhaseX: fSliderOrbitPhaseX->setValue(value); break; case VectorJuicePlugin::paramOrbitPhaseY: fSliderOrbitPhaseY->setValue(value); break; case VectorJuicePlugin::paramOrbitOutX: if (orbitX != value) { orbitX = value; repaint(); } break; case VectorJuicePlugin::paramOrbitOutY: if (orbitY != value) { orbitY = value; repaint(); } break; case VectorJuicePlugin::paramSubOrbitOutX: if (subOrbitX != value) { subOrbitX = value; repaint(); } break; case VectorJuicePlugin::paramSubOrbitOutY: if (subOrbitY != value) { subOrbitY = value; repaint(); } break; } } void VectorJuiceUI::d_programChanged(uint32_t index) { if (index != 0) return; // Default values paramX = paramY = 0.5f; fKnobOrbitSpeedX->setValue(4.0f); fKnobOrbitSpeedY->setValue(4.0f); fKnobOrbitSizeX->setValue(1.0f); fKnobOrbitSizeY->setValue(1.0f); fKnobSubOrbitSize->setValue(1.0f); fKnobSubOrbitSpeed->setValue(32.0f); fKnobSubOrbitSmooth->setValue(0.5f); fSliderOrbitWaveX->setValue(3.0f); fSliderOrbitWaveY->setValue(3.0f); fSliderOrbitPhaseX->setValue(0.0f); fSliderOrbitPhaseY->setValue(0.0f); } // ----------------------------------------------------------------------- // Widget Callbacks void VectorJuiceUI::imageButtonClicked(ImageButton* button, int) { if (button != fButtonAbout) return; fAboutWindow.exec(); } void VectorJuiceUI::imageKnobDragStarted(ImageKnob* knob) { if (knob == fKnobOrbitSpeedX) d_editParameter(VectorJuicePlugin::paramOrbitSpeedX, true); else if (knob == fKnobOrbitSpeedY) d_editParameter(VectorJuicePlugin::paramOrbitSpeedY, true); else if (knob == fKnobOrbitSizeX) d_editParameter(VectorJuicePlugin::paramOrbitSizeX, true); else if (knob == fKnobOrbitSizeY) d_editParameter(VectorJuicePlugin::paramOrbitSizeY, true); else if (knob == fKnobSubOrbitSize) d_editParameter(VectorJuicePlugin::paramSubOrbitSize, true); else if (knob == fKnobSubOrbitSpeed) d_editParameter(VectorJuicePlugin::paramSubOrbitSpeed, true); else if (knob == fKnobSubOrbitSmooth) d_editParameter(VectorJuicePlugin::paramSubOrbitSmooth, true); } void VectorJuiceUI::imageKnobDragFinished(ImageKnob* knob) { if (knob == fKnobOrbitSpeedX) d_editParameter(VectorJuicePlugin::paramOrbitSpeedX, false); else if (knob == fKnobOrbitSpeedY) d_editParameter(VectorJuicePlugin::paramOrbitSpeedY, false); else if (knob == fKnobOrbitSizeX) d_editParameter(VectorJuicePlugin::paramOrbitSizeX, false); else if (knob == fKnobOrbitSizeY) d_editParameter(VectorJuicePlugin::paramOrbitSizeY, false); else if (knob == fKnobSubOrbitSize) d_editParameter(VectorJuicePlugin::paramSubOrbitSize, false); else if (knob == fKnobSubOrbitSpeed) d_editParameter(VectorJuicePlugin::paramSubOrbitSpeed, false); else if (knob == fKnobSubOrbitSmooth) d_editParameter(VectorJuicePlugin::paramSubOrbitSmooth, false); } void VectorJuiceUI::imageKnobValueChanged(ImageKnob* knob, float value) { if (knob == fKnobOrbitSpeedX) d_setParameterValue(VectorJuicePlugin::paramOrbitSpeedX, value); else if (knob == fKnobOrbitSpeedY) d_setParameterValue(VectorJuicePlugin::paramOrbitSpeedY, value); else if (knob == fKnobOrbitSizeX) d_setParameterValue(VectorJuicePlugin::paramOrbitSizeX, value); else if (knob == fKnobOrbitSizeY) d_setParameterValue(VectorJuicePlugin::paramOrbitSizeY, value); else if (knob == fKnobSubOrbitSize) d_setParameterValue(VectorJuicePlugin::paramSubOrbitSize, value); else if (knob == fKnobSubOrbitSpeed) d_setParameterValue(VectorJuicePlugin::paramSubOrbitSpeed, value); else if (knob == fKnobSubOrbitSmooth) d_setParameterValue(VectorJuicePlugin::paramSubOrbitSmooth, value); } void VectorJuiceUI::imageSliderDragStarted(ImageSlider* slider) { if (slider == fSliderOrbitWaveX) d_editParameter(VectorJuicePlugin::paramOrbitWaveX, true); else if (slider == fSliderOrbitWaveY) d_editParameter(VectorJuicePlugin::paramOrbitWaveY, true); else if (slider == fSliderOrbitPhaseX) d_editParameter(VectorJuicePlugin::paramOrbitPhaseX, true); else if (slider == fSliderOrbitPhaseY) d_editParameter(VectorJuicePlugin::paramOrbitPhaseY, true); } void VectorJuiceUI::imageSliderDragFinished(ImageSlider* slider) { if (slider == fSliderOrbitWaveX) d_editParameter(VectorJuicePlugin::paramOrbitWaveX, false); else if (slider == fSliderOrbitWaveY) d_editParameter(VectorJuicePlugin::paramOrbitWaveY, false); else if (slider == fSliderOrbitPhaseX) d_editParameter(VectorJuicePlugin::paramOrbitPhaseX, false); else if (slider == fSliderOrbitPhaseY) d_editParameter(VectorJuicePlugin::paramOrbitPhaseY, false); } void VectorJuiceUI::imageSliderValueChanged(ImageSlider* slider, float value) { if (slider == fSliderOrbitWaveX) d_setParameterValue(VectorJuicePlugin::paramOrbitWaveX, value); else if (slider == fSliderOrbitWaveY) d_setParameterValue(VectorJuicePlugin::paramOrbitWaveY, value); else if (slider == fSliderOrbitPhaseX) d_setParameterValue(VectorJuicePlugin::paramOrbitPhaseX, value); else if (slider == fSliderOrbitPhaseY) d_setParameterValue(VectorJuicePlugin::paramOrbitPhaseY, value); } void VectorJuiceUI::onDisplay() { fImgBackground.draw(); /* // TESTING - remove later // this paints the 'fCanvasArea' so we can clearly see its bounds { const int x = fCanvasArea.getX(); const int y = fCanvasArea.getY(); const int w = fCanvasArea.getWidth(); const int h = fCanvasArea.getHeight(); glColor4f(0.0f, 1.0f, 0.0f, 0.1f); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2i(x, y); glTexCoord2f(1.0f, 0.0f); glVertex2i(x+w, y); glTexCoord2f(1.0f, 1.0f); glVertex2i(x+w, y+h); glTexCoord2f(0.0f, 1.0f); glVertex2i(x, y+h); glEnd(); // reset color glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } */ // get x, y mapped to XY area int x = fCanvasArea.getX() + paramX*fCanvasArea.getWidth() - fImgRoundlet.getWidth()/2; int y = fCanvasArea.getY() + paramY*fCanvasArea.getHeight() - fImgRoundlet.getHeight()/2; int nOrbitX = fCanvasArea.getX()+((orbitX)*fCanvasArea.getWidth())-15; int nOrbitY = fCanvasArea.getY()+((orbitY)*fCanvasArea.getWidth())-15; int nSubOrbitX = fCanvasArea.getX()+(subOrbitX*fCanvasArea.getWidth())-15; int nSubOrbitY = fCanvasArea.getY()+(subOrbitY*fCanvasArea.getWidth())-14; //draw lines, just for fun glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(0.0f, 1.0f, 0.0f, 0.05f); glLineWidth(4); glBegin(GL_LINES); glVertex2i(x+ fImgRoundlet.getWidth()/2, y+ fImgRoundlet.getHeight()/2); glVertex2i(nOrbitX+15, nOrbitY+15); glEnd(); glBegin(GL_LINES); glVertex2i(nOrbitX+15, nOrbitY+15); glVertex2i(nSubOrbitX+15, nSubOrbitY+14); glEnd(); // reset color glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // draw roundlet and orbits fImgRoundlet.draw(x, y); fImgOrbit.draw(nOrbitX, nOrbitY); fImgSubOrbit.draw(nSubOrbitX, nSubOrbitY); } bool VectorJuiceUI::onMouse(int button, bool press, int x, int y) { if (button != 1) return false; if (press) { if (! fCanvasArea.contains(x, y)) return false; fDragging = true; fDragValid = true; fLastX = x; fLastY = y; return true; } else if (fDragging) { fDragging = false; return true; } return false; } bool VectorJuiceUI::onMotion(int x, int y) { if (! fDragging) return false; if (! fDragValid) { fDragValid = true; fLastX = x; fLastY = y; } const int movedX = fLastX - x; const int movedY = fLastY - y; fLastX = x; fLastY = y; float newX = paramX; float newY = paramY; newX -= float(movedX)/fCanvasArea.getWidth(); newY -= float(movedY)/fCanvasArea.getHeight(); if (newX < 0.0f) newX = 0.0f; else if (newX > 1.0f) newX = 1.0f; if (newY < 0.0f) newY = 0.0f; else if (newY > 1.0f) newY = 1.0f; if (newX != paramX) { paramX = newX; d_setParameterValue(VectorJuicePlugin::paramX, paramX); repaint(); } if (newY != paramY) { paramY = newY; d_setParameterValue(VectorJuicePlugin::paramY, paramY); repaint(); } return true; } // ----------------------------------------------------------------------- UI* createUI() { return new VectorJuiceUI(); } // ----------------------------------------------------------------------- END_NAMESPACE_DISTRHO