/* * DISTRHO ProM Plugin * Copyright (C) 2015 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation. * * 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 Lesser General Public License for more details. * * For a full copy of the license see the LICENSE file. */ #include "DistrhoPluginProM.hpp" #include "DistrhoUIProM.hpp" #include "libprojectM/projectM.hpp" START_NAMESPACE_DISTRHO // ----------------------------------------------------------------------- #if 0 static const projectM::Settings kSettings = { /* meshX */ 32, /* meshY */ 24, /* fps */ 35, /* textureSize */ 1024, /* windowWidth */ 512, /* windowHeight */ 512, /* presetURL */ "/usr/share/projectM/presets", /* titleFontURL */ "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf", /* menuFontURL */ "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf", /* smoothPresetDuration */ 5, /* presetDuration */ 30, /* beatSensitivity */ 10.0f, /* aspectCorrection */ true, /* easterEgg */ 1.0f, /* shuffleEnabled */ true, /* softCutRatingsEnabled */ false }; #endif // ----------------------------------------------------------------------- DistrhoUIProM::DistrhoUIProM() : UI(512, 512) { } DistrhoUIProM::~DistrhoUIProM() { if (DistrhoPluginProM* const dspPtr = (DistrhoPluginProM*)getPluginInstancePointer()) { const MutexLocker csm(dspPtr->fMutex); dspPtr->fPM = nullptr; } } // ----------------------------------------------------------------------- // DSP Callbacks void DistrhoUIProM::parameterChanged(uint32_t, float) { } // ----------------------------------------------------------------------- // UI Callbacks void DistrhoUIProM::uiIdle() { if (fPM == nullptr) return; repaint(); if (DistrhoPluginProM* const dspPtr = (DistrhoPluginProM*)getPluginInstancePointer()) { if (dspPtr->fPM != nullptr) return; const MutexLocker csm(dspPtr->fMutex); dspPtr->fPM = fPM; } } void DistrhoUIProM::uiReshape(uint width, uint height) { glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); glEnable(GL_POINT_SMOOTH); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glShadeModel(GL_SMOOTH); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, width, height, 0, 0.0f, 1.0f); glViewport(0, 0, width, height); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glDrawBuffer(GL_BACK); glReadBuffer(GL_BACK); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glLineStipple(2, 0xAAAA); if (fPM == nullptr) //fPM = new projectM(kSettings); fPM = new projectM("/usr/share/projectM/config.inp"); fPM->projectM_resetGL(width, height); } // ----------------------------------------------------------------------- // Widget Callbacks void DistrhoUIProM::onDisplay() { if (fPM == nullptr) return; fPM->renderFrame(); } bool DistrhoUIProM::onKeyboard(const KeyboardEvent& ev) { if (fPM == nullptr) return false; if (ev.press && (ev.key == '1' || ev.key == '+' || ev.key == '-')) { if (ev.key == '1') { if (getWidth() != 512 || getHeight() != 512) setSize(512, 512); } else if (ev.key == '+') { /**/ if (getWidth() < 1100 && getHeight() < 1100) setSize(getWidth()+100, getHeight()+100); else if (getWidth() != 1100 || getHeight() != 1100) setSize(1100, 1100); } else if (ev.key == '-') { /**/ if (getWidth() >= 200 && getHeight() >= 200) setSize(getWidth()-100, getHeight()-100); else if (getWidth() != 100 || getHeight() != 100) setSize(100, 100); } return true; } projectMKeycode pmKey = PROJECTM_K_NONE; projectMModifier pmMod = PROJECTM_KMOD_LSHIFT; if ((ev.key >= PROJECTM_K_0 && ev.key <= PROJECTM_K_9) || (ev.key >= PROJECTM_K_A && ev.key <= PROJECTM_K_Z) || (ev.key >= PROJECTM_K_a && ev.key <= PROJECTM_K_z)) { pmKey = static_cast(ev.key); } else { switch (ev.key) { case DGL::kCharBackspace: pmKey = PROJECTM_K_BACKSPACE; break; case DGL::kCharEscape: pmKey = PROJECTM_K_ESCAPE; break; case DGL::kCharDelete: pmKey = PROJECTM_K_DELETE; break; } } if (pmKey == PROJECTM_K_NONE) return false; if (ev.mod & DGL::kModifierControl) pmMod = PROJECTM_KMOD_LCTRL; fPM->key_handler(ev.press ? PROJECTM_KEYUP : PROJECTM_KEYDOWN, pmKey, pmMod); return true; } bool DistrhoUIProM::onSpecial(const SpecialEvent& ev) { if (fPM == nullptr) return false; projectMKeycode pmKey = PROJECTM_K_NONE; projectMModifier pmMod = PROJECTM_KMOD_LSHIFT; switch (ev.key) { case DGL::kKeyF1: pmKey = PROJECTM_K_F1; break; case DGL::kKeyF2: pmKey = PROJECTM_K_F2; break; case DGL::kKeyF3: pmKey = PROJECTM_K_F3; break; case DGL::kKeyF4: pmKey = PROJECTM_K_F4; break; case DGL::kKeyF5: pmKey = PROJECTM_K_F5; break; case DGL::kKeyF6: pmKey = PROJECTM_K_F6; break; case DGL::kKeyF7: pmKey = PROJECTM_K_F7; break; case DGL::kKeyF8: pmKey = PROJECTM_K_F8; break; case DGL::kKeyF9: pmKey = PROJECTM_K_F9; break; case DGL::kKeyF10: pmKey = PROJECTM_K_F10; break; case DGL::kKeyF11: pmKey = PROJECTM_K_F11; break; case DGL::kKeyF12: pmKey = PROJECTM_K_F12; break; case DGL::kKeyLeft: pmKey = PROJECTM_K_LEFT; break; case DGL::kKeyUp: pmKey = PROJECTM_K_UP; break; case DGL::kKeyRight: pmKey = PROJECTM_K_RIGHT; break; case DGL::kKeyDown: pmKey = PROJECTM_K_DOWN; break; case DGL::kKeyPageUp: pmKey = PROJECTM_K_PAGEUP; break; case DGL::kKeyPageDown: pmKey = PROJECTM_K_PAGEDOWN; break; case DGL::kKeyHome: pmKey = PROJECTM_K_HOME; break; case DGL::kKeyEnd: pmKey = PROJECTM_K_END; break; case DGL::kKeyInsert: pmKey = PROJECTM_K_INSERT; break; case DGL::kKeyShift: pmKey = PROJECTM_K_LSHIFT; break; case DGL::kKeyControl: pmKey = PROJECTM_K_LCTRL; break; case DGL::kKeyAlt: case DGL::kKeySuper: break; } if (pmKey == PROJECTM_K_NONE) return false; if (ev.mod & DGL::kModifierControl) pmMod = PROJECTM_KMOD_LCTRL; fPM->key_handler(ev.press ? PROJECTM_KEYUP : PROJECTM_KEYDOWN, pmKey, pmMod); return true; } // ----------------------------------------------------------------------- UI* createUI() { return new DistrhoUIProM(); } // ----------------------------------------------------------------------- END_NAMESPACE_DISTRHO