Store entire time info in context; More ImGui/Ildaeil fixups

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2021-11-06 15:19:06 +00:00
parent a6a4745186
commit af80d41aef
No known key found for this signature in database
GPG key ID: CDBAA37ABC74FBA0
5 changed files with 68 additions and 30 deletions

View file

@ -89,6 +89,8 @@ struct IldaeilModule : Module {
NUM_LIGHTS NUM_LIGHTS
}; };
CardinalPluginContext* const pcontext;
const NativePluginDescriptor* fCarlaPluginDescriptor = nullptr; const NativePluginDescriptor* fCarlaPluginDescriptor = nullptr;
NativePluginHandle fCarlaPluginHandle = nullptr; NativePluginHandle fCarlaPluginHandle = nullptr;
@ -107,6 +109,7 @@ struct IldaeilModule : Module {
unsigned audioDataFill = 0; unsigned audioDataFill = 0;
IldaeilModule() IldaeilModule()
: pcontext(reinterpret_cast<CardinalPluginContext*>(APP))
{ {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
@ -172,19 +175,19 @@ struct IldaeilModule : Module {
const NativeTimeInfo* hostGetTimeInfo() const noexcept const NativeTimeInfo* hostGetTimeInfo() const noexcept
{ {
if (CardinalPluginContext* const pcontext = reinterpret_cast<CardinalPluginContext*>(APP)) if (pcontext != nullptr)
{ {
fCarlaTimeInfo.playing = pcontext->playing; fCarlaTimeInfo.playing = pcontext->playing;
// fCarlaTimeInfo.frame = timePos.frame; fCarlaTimeInfo.frame = pcontext->frame;
// fCarlaTimeInfo.bbt.valid = timePos.bbt.valid; fCarlaTimeInfo.bbt.valid = pcontext->bbtValid;
fCarlaTimeInfo.bbt.bar = pcontext->bar; fCarlaTimeInfo.bbt.bar = pcontext->bar;
fCarlaTimeInfo.bbt.beat = pcontext->beat; fCarlaTimeInfo.bbt.beat = pcontext->beat;
fCarlaTimeInfo.bbt.tick = pcontext->tick; fCarlaTimeInfo.bbt.tick = pcontext->tick;
// fCarlaTimeInfo.bbt.barStartTick = timePos.bbt.barStartTick; fCarlaTimeInfo.bbt.barStartTick = pcontext->barStartTick;
fCarlaTimeInfo.bbt.beatsPerBar = pcontext->beatsPerBar; fCarlaTimeInfo.bbt.beatsPerBar = pcontext->beatsPerBar;
// fCarlaTimeInfo.bbt.beatType = timePos.bbt.beatType; fCarlaTimeInfo.bbt.beatType = pcontext->beatType;
fCarlaTimeInfo.bbt.ticksPerBeat = pcontext->ticksPerBeat; fCarlaTimeInfo.bbt.ticksPerBeat = pcontext->ticksPerBeat;
// fCarlaTimeInfo.bbt.beatsPerMinute = timePos.bbt.beatsPerMinute; fCarlaTimeInfo.bbt.beatsPerMinute = pcontext->beatsPerMinute;
} }
return &fCarlaTimeInfo; return &fCarlaTimeInfo;
@ -405,7 +408,7 @@ struct IldaeilWidget : ImGuiWidget, Thread {
IldaeilModule* const module; IldaeilModule* const module;
IldaeilWidget(IldaeilModule* const m, const uintptr_t nativeWindowId) IldaeilWidget(IldaeilModule* const m)
: ImGuiWidget(), : ImGuiWidget(),
module(m) module(m)
{ {
@ -424,7 +427,7 @@ struct IldaeilWidget : ImGuiWidget, Thread {
const CarlaHostHandle handle = module->fCarlaHostHandle; const CarlaHostHandle handle = module->fCarlaHostHandle;
char winIdStr[24]; char winIdStr[24];
std::snprintf(winIdStr, sizeof(winIdStr), "%lx", (ulong)nativeWindowId); std::snprintf(winIdStr, sizeof(winIdStr), "%lx", (ulong)module->pcontext->nativeWindowId);
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr); carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, winIdStr);
/* /*
carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_UI_SCALE, getScaleFactor()*1000, nullptr); carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_UI_SCALE, getScaleFactor()*1000, nullptr);
@ -626,21 +629,18 @@ struct IldaeilWidget : ImGuiWidget, Thread {
{ {
ImGuiWidget::onContextCreate(e); ImGuiWidget::onContextCreate(e);
/* if (module == nullptr || module->pcontext == nullptr || module->fCarlaHostHandle == nullptr)
if (module == nullptr || module->fCarlaHostHandle == nullptr)
return; return;
*/
const uintptr_t nativeWindowId = reinterpret_cast<CardinalPluginContext*>(APP)->nativeWindowId;
char winIdStr[24]; char winIdStr[24];
std::snprintf(winIdStr, sizeof(winIdStr), "%lx", (ulong)nativeWindowId); std::snprintf(winIdStr, sizeof(winIdStr), "%lx", (ulong)module->pcontext->nativeWindowId);
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& e) override void onContextDestroy(const ContextDestroyEvent& e) override
{ {
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0"); if (module != nullptr && module->fCarlaHostHandle != nullptr)
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0");
ImGuiWidget::onContextDestroy(e); ImGuiWidget::onContextDestroy(e);
} }
@ -1122,11 +1122,13 @@ 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(static_cast<IldaeilModule*>(module), if (module != nullptr && module->pcontext != nullptr)
reinterpret_cast<CardinalPluginContext*>(APP)->nativeWindowId); {
ildaeilWidget->box.pos = Vec(2 * RACK_GRID_WIDTH, 0); ildaeilWidget = new IldaeilWidget(module);
ildaeilWidget->box.size = Vec(box.size.x - 2 * RACK_GRID_WIDTH, box.size.y); ildaeilWidget->box.pos = Vec(2 * RACK_GRID_WIDTH, 0);
addChild(ildaeilWidget); ildaeilWidget->box.size = Vec(box.size.x - 2 * RACK_GRID_WIDTH, box.size.y);
addChild(ildaeilWidget);
}
addChild(createWidget<ScrewSilver>(Vec(0, 0))); addChild(createWidget<ScrewSilver>(Vec(0, 0)));
addChild(createWidget<ScrewSilver>(Vec(0, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); addChild(createWidget<ScrewSilver>(Vec(0, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));

View file

@ -16,6 +16,7 @@
*/ */
#include "ImGuiWidget.hpp" #include "ImGuiWidget.hpp"
#include "DistrhoUtils.hpp"
#ifndef DGL_NO_SHARED_RESOURCES #ifndef DGL_NO_SHARED_RESOURCES
# include "../../../dpf/dgl/src/Resources.hpp" # include "../../../dpf/dgl/src/Resources.hpp"
@ -24,12 +25,14 @@
#include "DearImGui/imgui_impl_opengl2.h" #include "DearImGui/imgui_impl_opengl2.h"
struct ImGuiWidget::PrivateData { struct ImGuiWidget::PrivateData {
ImGuiContext* context; ImGuiContext* context = nullptr;
bool created = false;
PrivateData(const double scaleFactor = 1.0) PrivateData(const double scaleFactor = 1.0)
{ {
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;
@ -77,6 +80,13 @@ struct ImGuiWidget::PrivateData {
~PrivateData() ~PrivateData()
{ {
// this should not happen
if (created)
{
ImGui::SetCurrentContext(context);
ImGui_ImplOpenGL2_Shutdown();
}
ImGui::DestroyContext(context); ImGui::DestroyContext(context);
} }
}; };
@ -92,15 +102,21 @@ ImGuiWidget::~ImGuiWidget()
void ImGuiWidget::onContextCreate(const ContextCreateEvent& e) void ImGuiWidget::onContextCreate(const ContextCreateEvent& e)
{ {
OpenGlWidget::onContextCreate(e); OpenGlWidget::onContextCreate(e);
DISTRHO_SAFE_ASSERT_RETURN(!imData->created,);
ImGui::SetCurrentContext(imData->context); ImGui::SetCurrentContext(imData->context);
ImGui_ImplOpenGL2_Init(); ImGui_ImplOpenGL2_Init();
imData->created = true;
} }
void ImGuiWidget::onContextDestroy(const ContextDestroyEvent& e) void ImGuiWidget::onContextDestroy(const ContextDestroyEvent& e)
{ {
ImGui::SetCurrentContext(imData->context); if (imData->created)
ImGui_ImplOpenGL2_Shutdown(); {
ImGui::SetCurrentContext(imData->context);
ImGui_ImplOpenGL2_Shutdown();
imData->created = false;
}
OpenGlWidget::onContextDestroy(e); OpenGlWidget::onContextDestroy(e);
} }
@ -115,6 +131,12 @@ void ImGuiWidget::drawFramebuffer()
io.DisplayFramebufferScale = ImVec2(fbSize.x / box.size.x, fbSize.y / box.size.y); io.DisplayFramebufferScale = ImVec2(fbSize.x / box.size.x, fbSize.y / box.size.y);
io.DisplaySize = ImVec2(box.size.x, box.size.y); io.DisplaySize = ImVec2(box.size.x, box.size.y);
if (!imData->created)
{
ImGui_ImplOpenGL2_Init();
imData->created = true;
}
// TODO io.DeltaTime // TODO io.DeltaTime
ImGui_ImplOpenGL2_NewFrame(); ImGui_ImplOpenGL2_NewFrame();

View file

@ -33,8 +33,10 @@ struct CardinalPluginContext : rack::Context {
uint32_t bufferSize; uint32_t bufferSize;
double sampleRate; double sampleRate;
float parameters[kModuleParameters]; float parameters[kModuleParameters];
bool playing, reset; bool playing, reset, bbtValid;
int32_t bar, beat, beatsPerBar; int32_t bar, beat, beatsPerBar, beatType;
uint64_t frame;
double barStartTick, beatsPerMinute;
double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame; double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame;
uintptr_t nativeWindowId; uintptr_t nativeWindowId;
Plugin* const plugin; Plugin* const plugin;

View file

@ -818,6 +818,8 @@ protected:
{ {
const TimePosition& timePos(getTimePosition()); const TimePosition& timePos(getTimePosition());
context->playing = timePos.playing; context->playing = timePos.playing;
context->bbtValid = timePos.bbt.valid;
context->frame = timePos.frame;
if (timePos.bbt.valid) if (timePos.bbt.valid)
{ {
@ -827,6 +829,9 @@ protected:
context->bar = timePos.bbt.bar; context->bar = timePos.bbt.bar;
context->beat = timePos.bbt.beat; context->beat = timePos.bbt.beat;
context->beatsPerBar = timePos.bbt.beatsPerBar; context->beatsPerBar = timePos.bbt.beatsPerBar;
context->beatType = timePos.bbt.beatType;
context->barStartTick = timePos.bbt.barStartTick;
context->beatsPerMinute = timePos.bbt.beatsPerMinute;
context->tick = timePos.bbt.tick; context->tick = timePos.bbt.tick;
context->ticksPerBeat = timePos.bbt.ticksPerBeat; context->ticksPerBeat = timePos.bbt.ticksPerBeat;
context->ticksPerClock = timePos.bbt.ticksPerBeat / timePos.bbt.beatType; context->ticksPerClock = timePos.bbt.ticksPerBeat / timePos.bbt.beatType;

View file

@ -40,8 +40,10 @@ struct CardinalPluginContext : rack::Context {
uint32_t bufferSize; uint32_t bufferSize;
double sampleRate; double sampleRate;
float parameters[kModuleParameters]; float parameters[kModuleParameters];
bool playing, reset; bool playing, reset, bbtValid;
int32_t bar, beat, beatsPerBar; int32_t bar, beat, beatsPerBar, beatType;
uint64_t frame;
double barStartTick, beatsPerMinute;
double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame; double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame;
uintptr_t nativeWindowId; uintptr_t nativeWindowId;
Plugin* const plugin; Plugin* const plugin;
@ -51,9 +53,14 @@ struct CardinalPluginContext : rack::Context {
sampleRate(p->getSampleRate()), sampleRate(p->getSampleRate()),
playing(false), playing(false),
reset(false), reset(false),
bar(0), bbtValid(false),
beat(0), bar(1),
beatsPerBar(0), beat(1),
beatsPerBar(4),
beatType(4),
frame(0),
barStartTick(0.0),
beatsPerMinute(120.0),
tick(0.0), tick(0.0),
tickClock(0.0), tickClock(0.0),
ticksPerBeat(0.0), ticksPerBeat(0.0),