More Ildaeil and ImGui work, only setup GL on context calls

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2021-11-06 14:45:27 +00:00
parent d2b1cf420e
commit a6a4745186
No known key found for this signature in database
GPG key ID: CDBAA37ABC74FBA0
3 changed files with 72 additions and 32 deletions

View file

@ -66,6 +66,9 @@ static const char* host_ui_open_file(NativeHostHandle handle, bool isDir, const
static const char* host_ui_save_file(NativeHostHandle handle, bool isDir, const char* title, const char* filter); static const char* host_ui_save_file(NativeHostHandle handle, bool isDir, const char* title, const char* filter);
static intptr_t host_dispatcher(NativeHostHandle handle, NativeHostDispatcherOpcode opcode, int32_t index, intptr_t value, void* ptr, float opt); static intptr_t host_dispatcher(NativeHostHandle handle, NativeHostDispatcherOpcode opcode, int32_t index, intptr_t value, void* ptr, float opt);
static void ildaeilParameterChangeForUI(void* ui, uint32_t index, float value);
static const char* ildaeilOpenFileForUI(void* ui, bool isDir, const char* title, const char* filter);
// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------
struct IldaeilModule : Module { struct IldaeilModule : Module {
@ -95,6 +98,8 @@ struct IldaeilModule : Module {
mutable NativeTimeInfo fCarlaTimeInfo; mutable NativeTimeInfo fCarlaTimeInfo;
// mutable water::MemoryOutputStream fLastProjectState; // mutable water::MemoryOutputStream fLastProjectState;
void* fUI = nullptr;
float audioDataIn1[BUFFER_SIZE]; float audioDataIn1[BUFFER_SIZE];
float audioDataIn2[BUFFER_SIZE]; float audioDataIn2[BUFFER_SIZE];
float audioDataOut1[BUFFER_SIZE]; float audioDataOut1[BUFFER_SIZE];
@ -279,7 +284,7 @@ static bool host_write_midi_event(const NativeHostHandle handle, const NativeMid
static void host_ui_parameter_changed(const NativeHostHandle handle, const uint32_t index, const float value) static void host_ui_parameter_changed(const NativeHostHandle handle, const uint32_t index, const float value)
{ {
// ildaeilParameterChangeForUI(static_cast<IldaeilModule*>(handle)->fUI, index, value); ildaeilParameterChangeForUI(static_cast<IldaeilModule*>(handle)->fUI, index, value);
} }
static void host_ui_midi_program_changed(NativeHostHandle handle, uint8_t channel, uint32_t bank, uint32_t program) static void host_ui_midi_program_changed(NativeHostHandle handle, uint8_t channel, uint32_t bank, uint32_t program)
@ -299,8 +304,7 @@ static void host_ui_closed(NativeHostHandle handle)
static const char* host_ui_open_file(const NativeHostHandle handle, const bool isDir, const char* const title, const char* const filter) static const char* host_ui_open_file(const NativeHostHandle handle, const bool isDir, const char* const title, const char* const filter)
{ {
// return ildaeilOpenFileForUI(static_cast<IldaeilModule*>(handle)->fUI, isDir, title, filter); return ildaeilOpenFileForUI(static_cast<IldaeilModule*>(handle)->fUI, isDir, title, filter);
return nullptr;
} }
static const char* host_ui_save_file(NativeHostHandle, bool, const char*, const char*) static const char* host_ui_save_file(NativeHostHandle, bool, const char*, const char*)
@ -316,7 +320,7 @@ static intptr_t host_dispatcher(const NativeHostHandle handle, const NativeHostD
// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------
struct IldaeilWidget : ImGuiWidget, public Thread { struct IldaeilWidget : ImGuiWidget, Thread {
static constexpr const uint kButtonHeight = 20; static constexpr const uint kButtonHeight = 20;
struct PluginInfoCache { struct PluginInfoCache {
@ -432,15 +436,15 @@ struct IldaeilWidget : ImGuiWidget, public Thread {
fDrawingState = kDrawingPluginPendingFromInit; fDrawingState = kDrawingPluginPendingFromInit;
fPluginHasCustomUI = hints & PLUGIN_HAS_CUSTOM_UI; fPluginHasCustomUI = hints & PLUGIN_HAS_CUSTOM_UI;
} }
module->fUI = this;
} }
~IldaeilWidget() override ~IldaeilWidget() override
{ {
if (module != nullptr && module->fCarlaHostHandle != nullptr) if (module != nullptr && module->fCarlaHostHandle != nullptr)
{ {
/*
module->fUI = nullptr; module->fUI = nullptr;
*/
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0"); carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
} }
@ -473,15 +477,15 @@ struct IldaeilWidget : ImGuiWidget, public Thread {
} }
} }
/*
const char* openFileFromDSP(const bool isDir, const char* const title, const char* const filter) const char* openFileFromDSP(const bool isDir, const char* const title, const char* const filter)
{ {
/*
Window::FileBrowserOptions opts; Window::FileBrowserOptions opts;
opts.title = title; opts.title = title;
getWindow().openFileBrowser(opts); getWindow().openFileBrowser(opts);
*/
return nullptr; return nullptr;
} }
*/
void showPluginUI(const CarlaHostHandle handle) void showPluginUI(const CarlaHostHandle handle)
{ {
@ -618,8 +622,10 @@ struct IldaeilWidget : ImGuiWidget, public Thread {
return false; return false;
} }
void onContextCreate(const ContextCreateEvent&) override void onContextCreate(const ContextCreateEvent& e) override
{ {
ImGuiWidget::onContextCreate(e);
/* /*
if (module == nullptr || module->fCarlaHostHandle == nullptr) if (module == nullptr || module->fCarlaHostHandle == nullptr)
return; return;
@ -632,9 +638,11 @@ struct IldaeilWidget : ImGuiWidget, public Thread {
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr); carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr);
} }
void onContextDestroy(const ContextDestroyEvent&) override void onContextDestroy(const ContextDestroyEvent& e) override
{ {
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0"); carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
ImGuiWidget::onContextDestroy(e);
} }
void step() override void step() override
@ -1090,6 +1098,22 @@ struct IldaeilWidget : ImGuiWidget, public Thread {
// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------
static void ildaeilParameterChangeForUI(void* const ui, const uint32_t index, const float value)
{
DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,);
static_cast<IldaeilWidget*>(ui)->changeParameterFromDSP(index, value);
}
static const char* ildaeilOpenFileForUI(void* const ui, const bool isDir, const char* const title, const char* const filter)
{
DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr, nullptr);
return static_cast<IldaeilWidget*>(ui)->openFileFromDSP(isDir, title, filter);
}
// --------------------------------------------------------------------------------------------------------------------
struct IldaeilModuleWidget : ModuleWidget { struct IldaeilModuleWidget : ModuleWidget {
IldaeilWidget* ildaeilWidget = nullptr; IldaeilWidget* ildaeilWidget = nullptr;
@ -1098,7 +1122,8 @@ struct IldaeilModuleWidget : ModuleWidget {
setModule(module); setModule(module);
setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/glBars.svg"))); setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/glBars.svg")));
ildaeilWidget = new IldaeilWidget(module, reinterpret_cast<CardinalPluginContext*>(APP)->nativeWindowId); ildaeilWidget = new IldaeilWidget(static_cast<IldaeilModule*>(module),
reinterpret_cast<CardinalPluginContext*>(APP)->nativeWindowId);
ildaeilWidget->box.pos = Vec(2 * RACK_GRID_WIDTH, 0); ildaeilWidget->box.pos = Vec(2 * RACK_GRID_WIDTH, 0);
ildaeilWidget->box.size = Vec(box.size.x - 2 * RACK_GRID_WIDTH, box.size.y); ildaeilWidget->box.size = Vec(box.size.x - 2 * RACK_GRID_WIDTH, box.size.y);
addChild(ildaeilWidget); addChild(ildaeilWidget);

View file

@ -30,7 +30,6 @@ struct ImGuiWidget::PrivateData {
{ {
IMGUI_CHECKVERSION(); IMGUI_CHECKVERSION();
context = ImGui::CreateContext(); context = ImGui::CreateContext();
ImGui::SetCurrentContext(context);
ImGuiIO& io(ImGui::GetIO()); ImGuiIO& io(ImGui::GetIO());
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
@ -74,28 +73,38 @@ struct ImGuiWidget::PrivateData {
io.KeyMap[ImGuiKey_X] = GLFW_KEY_X; io.KeyMap[ImGuiKey_X] = GLFW_KEY_X;
io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y; io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y;
io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z; io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z;
ImGui_ImplOpenGL2_Init();
} }
~PrivateData() ~PrivateData()
{ {
ImGui::SetCurrentContext(context);
ImGui_ImplOpenGL2_Shutdown();
ImGui::DestroyContext(context); ImGui::DestroyContext(context);
} }
}; };
ImGuiWidget::ImGuiWidget() ImGuiWidget::ImGuiWidget()
: imData(new PrivateData()) : imData(new PrivateData()) {}
{
}
ImGuiWidget::~ImGuiWidget() ImGuiWidget::~ImGuiWidget()
{ {
delete imData; delete imData;
} }
void ImGuiWidget::onContextCreate(const ContextCreateEvent& e)
{
OpenGlWidget::onContextCreate(e);
ImGui::SetCurrentContext(imData->context);
ImGui_ImplOpenGL2_Init();
}
void ImGuiWidget::onContextDestroy(const ContextDestroyEvent& e)
{
ImGui::SetCurrentContext(imData->context);
ImGui_ImplOpenGL2_Shutdown();
OpenGlWidget::onContextDestroy(e);
}
void ImGuiWidget::drawFramebuffer() void ImGuiWidget::drawFramebuffer()
{ {
const math::Vec fbSize = getFramebufferSize(); const math::Vec fbSize = getFramebufferSize();
@ -195,17 +204,13 @@ void ImGuiWidget::onButton(const ButtonEvent& e)
void ImGuiWidget::onSelectKey(const SelectKeyEvent& e) void ImGuiWidget::onSelectKey(const SelectKeyEvent& e)
{ {
if (e.key < 0 || e.key >= IM_ARRAYSIZE(ImGuiIO::KeysDown))
return;
ImGui::SetCurrentContext(imData->context); ImGui::SetCurrentContext(imData->context);
ImGuiIO& io(ImGui::GetIO()); ImGuiIO& io(ImGui::GetIO());
io.KeyCtrl = e.mods & GLFW_MOD_CTRL;
io.KeyShift = e.mods & GLFW_MOD_SHIFT;
io.KeyAlt = e.mods & GLFW_MOD_ALT;
io.KeySuper = e.mods & GLFW_MOD_SUPER;
if (e.key >= 0 && e.key < IM_ARRAYSIZE(io.KeysDown))
{
switch (e.action) switch (e.action)
{ {
case GLFW_PRESS: case GLFW_PRESS:
@ -214,8 +219,14 @@ void ImGuiWidget::onSelectKey(const SelectKeyEvent& e)
case GLFW_RELEASE: case GLFW_RELEASE:
io.KeysDown[e.key] = false; io.KeysDown[e.key] = false;
break; break;
default:
return;
} }
}
io.KeyCtrl = e.mods & GLFW_MOD_CTRL;
io.KeyShift = e.mods & GLFW_MOD_SHIFT;
io.KeyAlt = e.mods & GLFW_MOD_ALT;
io.KeySuper = e.mods & GLFW_MOD_SUPER;
if (io.WantCaptureKeyboard) if (io.WantCaptureKeyboard)
e.consume(this); e.consume(this);

View file

@ -34,6 +34,10 @@ struct ImGuiWidget : OpenGlWidget {
ImGui::ShowDemoWindow(); ImGui::ShowDemoWindow();
} }
protected:
void onContextCreate(const ContextCreateEvent& e) override;
void onContextDestroy(const ContextDestroyEvent& e) override;
private: private:
void drawFramebuffer() override; void drawFramebuffer() override;
void onHover(const HoverEvent& e) override; void onHover(const HoverEvent& e) override;