Signed-off-by: falkTX <falktx@falktx.com>tags/22.02
| @@ -64,3 +64,6 @@ | |||
| [submodule "plugins/DrumKit"] | |||
| path = plugins/DrumKit | |||
| url = https://github.com/SVModular/DrumKit.git | |||
| [submodule "carla"] | |||
| path = carla | |||
| url = https://github.com/falkTX/Carla.git | |||
| @@ -6,7 +6,7 @@ | |||
| include dpf/Makefile.base.mk | |||
| all: cardinal deps dgl plugins gen resources | |||
| all: cardinal carla deps dgl plugins gen resources | |||
| # -------------------------------------------------------------- | |||
| # Build config | |||
| @@ -62,6 +62,11 @@ endif | |||
| cardinal: deps dgl plugins | |||
| $(MAKE) all -C src | |||
| carla: | |||
| $(MAKE) -C carla plugin \ | |||
| CAN_GENERATE_LV2_TTL=false \ | |||
| STATIC_PLUGIN_TARGET=true | |||
| deps: | |||
| ifneq ($(SYSDEPS),true) | |||
| $(MAKE) all -C deps | |||
| @@ -116,4 +121,4 @@ install: | |||
| # -------------------------------------------------------------- | |||
| .PHONY: deps plugins | |||
| .PHONY: carla deps plugins | |||
| @@ -0,0 +1 @@ | |||
| Subproject commit 14e9ec85fa2866c423e8a7c36490272ec49fb924 | |||
| @@ -21,7 +21,6 @@ | |||
| # include "../../../dpf/dgl/src/Resources.hpp" | |||
| #endif | |||
| #include "DearImGui/imgui.h" | |||
| #include "DearImGui/imgui_impl_opengl2.h" | |||
| struct ImGuiWidget::PrivateData { | |||
| @@ -115,13 +114,10 @@ void ImGuiWidget::drawFramebuffer() | |||
| // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | |||
| ImGui::SetCurrentContext(imData->context); | |||
| ImGui_ImplOpenGL2_NewFrame(); | |||
| ImGui::NewFrame(); | |||
| ImGui::SetNextWindowPos(ImVec2(0, 0)); | |||
| ImGui::SetNextWindowSize(ImVec2(box.size.x, box.size.y)); | |||
| ImGui::ShowDemoWindow(); | |||
| drawImGui(); | |||
| ImGui::Render(); | |||
| @@ -140,8 +136,30 @@ void ImGuiWidget::onHover(const HoverEvent& e) | |||
| ImGui::SetCurrentContext(imData->context); | |||
| ImGuiIO& io(ImGui::GetIO()); | |||
| io.MousePos.x = e.pos.x; | |||
| io.MousePos.y = e.pos.y; | |||
| io.MousePos.x = e.pos.x + e.mouseDelta.x; | |||
| io.MousePos.y = e.pos.y + e.mouseDelta.y; | |||
| } | |||
| void ImGuiWidget::onDragHover(const DragHoverEvent& e) | |||
| { | |||
| ImGui::SetCurrentContext(imData->context); | |||
| ImGuiIO& io(ImGui::GetIO()); | |||
| io.MousePos.x = e.pos.x + e.mouseDelta.x; | |||
| io.MousePos.y = e.pos.y + e.mouseDelta.y; | |||
| } | |||
| void ImGuiWidget::onHoverScroll(const HoverScrollEvent& e) | |||
| { | |||
| ImGui::SetCurrentContext(imData->context); | |||
| ImGuiIO& io(ImGui::GetIO()); | |||
| io.MouseWheel += e.scrollDelta.y * 0.01f; | |||
| io.MouseWheelH += e.scrollDelta.x * 0.01f; | |||
| if (io.WantCaptureMouse) | |||
| e.consume(this); | |||
| } | |||
| void ImGuiWidget::onButton(const ButtonEvent& e) | |||
| @@ -153,13 +171,75 @@ void ImGuiWidget::onButton(const ButtonEvent& e) | |||
| switch (e.button) | |||
| { | |||
| case GLFW_MOUSE_BUTTON_LEFT: | |||
| io.MouseDown[0] = e.action; | |||
| io.MouseDown[0] = e.action == GLFW_PRESS; | |||
| break; | |||
| case GLFW_MOUSE_BUTTON_MIDDLE: | |||
| io.MouseDown[1] = e.action; | |||
| io.MouseDown[1] = e.action == GLFW_PRESS; | |||
| break; | |||
| case GLFW_MOUSE_BUTTON_RIGHT: | |||
| io.MouseDown[2] = e.action; | |||
| io.MouseDown[2] = e.action == GLFW_PRESS; | |||
| break; | |||
| } | |||
| 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.WantCaptureMouse) | |||
| e.consume(this); | |||
| } | |||
| void ImGuiWidget::onSelectKey(const SelectKeyEvent& e) | |||
| { | |||
| ImGui::SetCurrentContext(imData->context); | |||
| 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; | |||
| printf("onSelectKey %i %i\n", e.key, e.scancode); | |||
| // d_stdout("onKeyboard %u %u", event.key, event.keycode); | |||
| /* | |||
| if (event.key <= kKeyDelete) | |||
| io.KeysDown[event.key] = event.press; | |||
| else if (event.key >= kKeyF1 && event.key <= kKeyPause) | |||
| io.KeysDown[0xff + event.key - kKeyF1] = event.press; | |||
| */ | |||
| if (io.WantCaptureKeyboard) | |||
| e.consume(this); | |||
| } | |||
| void ImGuiWidget::onSelectText(const SelectTextEvent& e) | |||
| { | |||
| ImGui::SetCurrentContext(imData->context); | |||
| ImGuiIO& io(ImGui::GetIO()); | |||
| switch (e.codepoint) | |||
| { | |||
| /* | |||
| case kKeyBackspace: | |||
| case kKeyEscape: | |||
| case kKeyDelete: | |||
| */ | |||
| case '\n': | |||
| case '\r': | |||
| case '\t': | |||
| break; | |||
| default: | |||
| // d_stdout("input %u %u %lu '%s'", event.keycode, event.character, std::strlen(event.string), event.string); | |||
| char character[2] = { (char)e.codepoint, 0 }; | |||
| io.AddInputCharactersUTF8(character); | |||
| break; | |||
| } | |||
| if (io.WantCaptureKeyboard) | |||
| e.consume(this); | |||
| } | |||
| @@ -18,6 +18,7 @@ | |||
| #pragma once | |||
| #include "plugin.hpp" | |||
| #include "DearImGui/imgui.h" | |||
| struct ImGuiWidget : OpenGlWidget { | |||
| struct PrivateData; | |||
| @@ -25,8 +26,20 @@ struct ImGuiWidget : OpenGlWidget { | |||
| ImGuiWidget(float width, float height); | |||
| ~ImGuiWidget() override; | |||
| void drawFramebuffer() override; | |||
| virtual void drawImGui() | |||
| { | |||
| ImGui::SetNextWindowPos(ImVec2(0, 0)); | |||
| ImGui::SetNextWindowSize(ImVec2(box.size.x, box.size.y)); | |||
| ImGui::ShowDemoWindow(); | |||
| } | |||
| private: | |||
| void drawFramebuffer() override; | |||
| void onHover(const HoverEvent& e) override; | |||
| void onDragHover(const DragHoverEvent& e) override; | |||
| void onHoverScroll(const HoverScrollEvent& e) override; | |||
| void onButton(const ButtonEvent& e) override; | |||
| void onSelectKey(const SelectKeyEvent& e) override; | |||
| void onSelectText(const SelectTextEvent& e) override; | |||
| }; | |||
| @@ -36,6 +36,7 @@ struct CardinalPluginContext : rack::Context { | |||
| bool playing, reset; | |||
| int32_t bar, beat, beatsPerBar; | |||
| double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame; | |||
| uintptr_t nativeWindowId; | |||
| Plugin* const plugin; | |||
| CardinalPluginContext(Plugin* const p); | |||
| }; | |||
| @@ -676,7 +676,13 @@ $(BUILD_DIR)/Cardinal/%.cpp.o: Cardinal/%.cpp | |||
| -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
| @echo "Compiling $<" | |||
| $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ \ | |||
| -DpluginInstance=pluginInstance__Cardinal | |||
| -DpluginInstance=pluginInstance__Cardinal \ | |||
| -DREAL_BUILD \ | |||
| -DSTATIC_PLUGIN_TARGET \ | |||
| -I../carla/source/backend \ | |||
| -I../carla/source/includes \ | |||
| -I../carla/source/modules \ | |||
| -I../carla/source/utils | |||
| $(BUILD_DIR)/AmalgamatedHarmonics/%.cpp.o: AmalgamatedHarmonics/%.cpp | |||
| -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
| @@ -98,6 +98,8 @@ public: | |||
| fContext(getRackContextFromPlugin(getPluginInstancePointer())), | |||
| fResizeHandle(this) | |||
| { | |||
| fContext->nativeWindowId = getWindow().getNativeWindowHandle(); | |||
| if (isResizable()) | |||
| fResizeHandle.hide(); | |||
| @@ -13,6 +13,58 @@ PREFIX ?= /usr/local | |||
| DESTDIR ?= | |||
| SYSDEPS ?= false | |||
| # -------------------------------------------------------------- | |||
| # Carla stuff | |||
| CWD = ../../carla/source | |||
| include $(CWD)/Makefile.deps.mk | |||
| CARLA_BUILD_DIR = ../../carla/build | |||
| ifeq ($(DEBUG),true) | |||
| CARLA_BUILD_TYPE = Debug | |||
| else | |||
| CARLA_BUILD_TYPE = Release | |||
| endif | |||
| CARLA_EXTRA_LIBS = $(CARLA_BUILD_DIR)/plugin/$(CARLA_BUILD_TYPE)/carla-host-plugin.cpp.o | |||
| # ifneq ($(MACOS),true) | |||
| # CARLA_EXTRA_LIBS += -Wl,--start-group -Wl,--whole-archive | |||
| # endif | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/carla_engine_plugin.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/carla_plugin.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/native-plugins.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/audio_decoder.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/jackbridge.min.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/lilv.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/rtmempool.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/sfzero.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/water.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/zita-resampler.a | |||
| # CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/eel2.a | |||
| # CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/jsusfx.a | |||
| ifeq ($(USING_JUCE),true) | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_audio_basics.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_audio_processors.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_core.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_data_structures.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_events.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_graphics.a | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_gui_basics.a | |||
| ifeq ($(USING_JUCE_GUI_EXTRA),true) | |||
| CARLA_EXTRA_LIBS += $(CARLA_BUILD_DIR)/modules/$(CARLA_BUILD_TYPE)/juce_gui_extra.a | |||
| endif | |||
| endif | |||
| # ifneq ($(MACOS),true) | |||
| # CARLA_EXTRA_LIBS += -Wl,--no-whole-archive -Wl,--end-group | |||
| # endif | |||
| # FIXME patch fluidsynth package | |||
| ifeq ($(WINDOWS),true) | |||
| STATIC_CARLA_PLUGIN_LIBS += -ldsound -lwinmm | |||
| endif | |||
| CARLA_EXTRA_LIBS += $(STATIC_CARLA_PLUGIN_LIBS) | |||
| # -------------------------------------------------------------- | |||
| # Import base definitions | |||
| @@ -37,22 +89,25 @@ endif | |||
| # -------------------------------------------------------------- | |||
| # Extra libraries to link against | |||
| EXTRA_LIBS = ../../plugins/plugins.a | |||
| EXTRA_LIBS += ../rack.a | |||
| RACK_EXTRA_LIBS = ../../plugins/plugins.a | |||
| RACK_EXTRA_LIBS += ../rack.a | |||
| ifneq ($(SYSDEPS),true) | |||
| EXTRA_LIBS += ../Rack/dep/lib/libjansson.a | |||
| EXTRA_LIBS += ../Rack/dep/lib/libsamplerate.a | |||
| EXTRA_LIBS += ../Rack/dep/lib/libspeexdsp.a | |||
| RACK_EXTRA_LIBS += ../Rack/dep/lib/libjansson.a | |||
| RACK_EXTRA_LIBS += ../Rack/dep/lib/libsamplerate.a | |||
| RACK_EXTRA_LIBS += ../Rack/dep/lib/libspeexdsp.a | |||
| ifeq ($(WINDOWS),true) | |||
| EXTRA_LIBS += ../Rack/dep/lib/libarchive_static.a | |||
| RACK_EXTRA_LIBS += ../Rack/dep/lib/libarchive_static.a | |||
| else | |||
| EXTRA_LIBS += ../Rack/dep/lib/libarchive.a | |||
| RACK_EXTRA_LIBS += ../Rack/dep/lib/libarchive.a | |||
| endif | |||
| EXTRA_LIBS += ../Rack/dep/lib/libzstd.a | |||
| RACK_EXTRA_LIBS += ../Rack/dep/lib/libzstd.a | |||
| endif | |||
| EXTRA_DEPENDENCIES = $(EXTRA_LIBS) | |||
| # -------------------------------------------------------------- | |||
| EXTRA_DEPENDENCIES = $(RACK_EXTRA_LIBS) | |||
| EXTRA_LIBS = $(CARLA_EXTRA_LIBS) $(RACK_EXTRA_LIBS) | |||
| # -------------------------------------------------------------- | |||
| # Do some magic | |||
| @@ -43,6 +43,7 @@ struct CardinalPluginContext : rack::Context { | |||
| bool playing, reset; | |||
| int32_t bar, beat, beatsPerBar; | |||
| double tick, tickClock, ticksPerBeat, ticksPerClock, ticksPerFrame; | |||
| uintptr_t nativeWindowId; | |||
| Plugin* const plugin; | |||
| CardinalPluginContext(Plugin* const p) | |||
| @@ -58,6 +59,7 @@ struct CardinalPluginContext : rack::Context { | |||
| ticksPerBeat(0.0), | |||
| ticksPerClock(0.0), | |||
| ticksPerFrame(0.0), | |||
| nativeWindowId(0), | |||
| plugin(p) | |||
| { | |||
| std::memset(parameters, 0, sizeof(parameters)); | |||
| @@ -82,6 +82,7 @@ | |||
| "version": "2.0", | |||
| "params": [], | |||
| "leftModuleId": 3, | |||
| "rightModuleId": 5, | |||
| "pos": [ | |||
| 21, | |||
| 0 | |||
| @@ -94,10 +95,23 @@ | |||
| "version": "2.0", | |||
| "params": [], | |||
| "leftModuleId": 4, | |||
| "rightModuleId": 6, | |||
| "pos": [ | |||
| 30, | |||
| 0 | |||
| ] | |||
| }, | |||
| { | |||
| "id": 6, | |||
| "plugin": "Cardinal", | |||
| "model": "Ildaeil", | |||
| "version": "2.0", | |||
| "params": [], | |||
| "leftModuleId": 4, | |||
| "pos": [ | |||
| 38, | |||
| 0 | |||
| ] | |||
| } | |||
| ], | |||
| "cables": [], | |||