diff --git a/assignment-client/CMakeLists.txt b/assignment-client/CMakeLists.txt index 54afabfd21..c9af474949 100644 --- a/assignment-client/CMakeLists.txt +++ b/assignment-client/CMakeLists.txt @@ -11,7 +11,7 @@ endif () link_hifi_libraries( audio avatars octree gpu model fbx entities networking animation recording shared script-engine embedded-webserver - controllers physics plugins + physics plugins ) if (WIN32) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 5e0cd740e6..93b9b10eb7 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -166,19 +166,6 @@ void AudioMixer::handleMuteEnvironmentPacket(QSharedPointer mes } } -DisplayPluginList getDisplayPlugins() { - DisplayPluginList result; - return result; -} - -InputPluginList getInputPlugins() { - InputPluginList result; - return result; -} - -// must be here to satisfy a reference in PluginManager::saveSettings() -void saveInputPluginSettings(const InputPluginList& plugins) {} - const std::pair AudioMixer::negotiateCodec(std::vector codecs) { QString selectedCodecName; CodecPluginPointer selectedCodec; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a7bed9fc9c..3ca8c29288 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -441,6 +441,11 @@ static const QString STATE_ADVANCED_MOVEMENT_CONTROLS = "AdvancedMovement"; static const QString STATE_GROUNDED = "Grounded"; static const QString STATE_NAV_FOCUSED = "NavigationFocused"; +// Statically provided display and input plugins +extern DisplayPluginList getDisplayPlugins(); +extern InputPluginList getInputPlugins(); +extern void saveInputPluginSettings(const InputPluginList& plugins); + bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { const char** constArgv = const_cast(argv); @@ -480,6 +485,11 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { Setting::init(); + // Tell the plugin manager about our statically linked plugins + PluginManager::setInputPluginProvider([] { return getInputPlugins(); }); + PluginManager::setDisplayPluginProvider([] { return getDisplayPlugins(); }); + PluginManager::setInputPluginSettingsPersister([](const InputPluginList& plugins) { saveInputPluginSettings(plugins); }); + if (auto steamClient = PluginManager::getInstance()->getSteamClientPlugin()) { steamClient->init(); } diff --git a/libraries/plugins/src/plugins/Forward.h b/libraries/plugins/src/plugins/Forward.h index b95bf4c2e6..90746d648e 100644 --- a/libraries/plugins/src/plugins/Forward.h +++ b/libraries/plugins/src/plugins/Forward.h @@ -9,6 +9,7 @@ #include #include +#include enum class PluginType { DISPLAY_PLUGIN, @@ -26,8 +27,12 @@ class PluginManager; using DisplayPluginPointer = std::shared_ptr; using DisplayPluginList = std::vector; +using DisplayPluginProvider = std::function; using InputPluginPointer = std::shared_ptr; using InputPluginList = std::vector; +using InputPluginProvider = std::function; using CodecPluginPointer = std::shared_ptr; using CodecPluginList = std::vector; +using CodecPluginProvider = std::function; using SteamClientPluginPointer = std::shared_ptr; +using InputPluginSettingsPersister = std::function; diff --git a/libraries/plugins/src/plugins/PluginManager.cpp b/libraries/plugins/src/plugins/PluginManager.cpp index 8471dbc7e8..e90d3e3a0f 100644 --- a/libraries/plugins/src/plugins/PluginManager.cpp +++ b/libraries/plugins/src/plugins/PluginManager.cpp @@ -23,6 +23,26 @@ #include "InputPlugin.h" #include "PluginLogging.h" +DisplayPluginProvider PluginManager::_displayPluginProvider = []()->DisplayPluginList { return {}; }; +InputPluginProvider PluginManager::_inputPluginProvider = []()->InputPluginList { return {}; }; +CodecPluginProvider PluginManager::_codecPluginProvider = []()->CodecPluginList { return {}; }; +InputPluginSettingsPersister PluginManager::_inputSettingsPersister = [](const InputPluginList& list) {}; + +void PluginManager::setDisplayPluginProvider(const DisplayPluginProvider& provider) { + _displayPluginProvider = provider; +} + +void PluginManager::setInputPluginProvider(const InputPluginProvider& provider) { + _inputPluginProvider = provider; +} + +void PluginManager::setCodecPluginProvider(const CodecPluginProvider& provider) { + _codecPluginProvider = provider; +} + +void PluginManager::setInputPluginSettingsPersister(const InputPluginSettingsPersister& persister) { + _inputSettingsPersister = persister; +} PluginManager* PluginManager::getInstance() { static PluginManager _manager; @@ -117,12 +137,12 @@ const LoaderList& getLoadedPlugins() { PluginManager::PluginManager() { } -extern CodecPluginList getCodecPlugins(); - const CodecPluginList& PluginManager::getCodecPlugins() { static CodecPluginList codecPlugins; static std::once_flag once; std::call_once(once, [&] { + codecPlugins = _codecPluginProvider(); + // Now grab the dynamic plugins for (auto loader : getLoadedPlugins()) { CodecProvider* codecProvider = qobject_cast(loader->instance()); @@ -163,11 +183,6 @@ const SteamClientPluginPointer PluginManager::getSteamClientPlugin() { #ifndef Q_OS_ANDROID -// TODO migrate to a DLL model where plugins are discovered and loaded at runtime by the PluginManager class -extern DisplayPluginList getDisplayPlugins(); -extern InputPluginList getInputPlugins(); - -extern void saveInputPluginSettings(const InputPluginList& plugins); static DisplayPluginList displayPlugins; const DisplayPluginList& PluginManager::getDisplayPlugins() { @@ -183,7 +198,7 @@ const DisplayPluginList& PluginManager::getDisplayPlugins() { std::call_once(once, [&] { // Grab the built in plugins - displayPlugins = ::getDisplayPlugins(); + displayPlugins = _displayPluginProvider(); // Now grab the dynamic plugins @@ -229,7 +244,7 @@ const InputPluginList& PluginManager::getInputPlugins() { }; std::call_once(once, [&] { - inputPlugins = ::getInputPlugins(); + inputPlugins = _inputPluginProvider(); // Now grab the dynamic plugins for (auto loader : getLoadedPlugins()) { @@ -288,7 +303,7 @@ void PluginManager::disableInputs(const QStringList& inputs) { } void PluginManager::saveSettings() { - saveInputPluginSettings(getInputPlugins()); + _inputSettingsPersister(getInputPlugins()); } void PluginManager::shutdown() { diff --git a/libraries/plugins/src/plugins/PluginManager.h b/libraries/plugins/src/plugins/PluginManager.h index 687e5c9e9b..cb011392a4 100644 --- a/libraries/plugins/src/plugins/PluginManager.h +++ b/libraries/plugins/src/plugins/PluginManager.h @@ -31,6 +31,18 @@ public: void setContainer(PluginContainer* container) { _container = container; } void shutdown(); + + // Application that have statically linked plugins can expose them to the plugin manager with these function + static void setDisplayPluginProvider(const DisplayPluginProvider& provider); + static void setInputPluginProvider(const InputPluginProvider& provider); + static void setCodecPluginProvider(const CodecPluginProvider& provider); + static void setInputPluginSettingsPersister(const InputPluginSettingsPersister& persister); + private: + static DisplayPluginProvider _displayPluginProvider; + static InputPluginProvider _inputPluginProvider; + static CodecPluginProvider _codecPluginProvider; + static InputPluginSettingsPersister _inputSettingsPersister; + PluginContainer* _container { nullptr }; }; diff --git a/plugins/hifiCodec/CMakeLists.txt b/plugins/hifiCodec/CMakeLists.txt index 15572e8266..28c1dc3807 100644 --- a/plugins/hifiCodec/CMakeLists.txt +++ b/plugins/hifiCodec/CMakeLists.txt @@ -8,7 +8,7 @@ set(TARGET_NAME hifiCodec) setup_hifi_client_server_plugin() -link_hifi_libraries(audio plugins input-plugins display-plugins) +link_hifi_libraries(audio plugins) add_dependency_external_projects(hifiAudioCodec) target_include_directories(${TARGET_NAME} PRIVATE ${HIFIAUDIOCODEC_INCLUDE_DIRS}) target_link_libraries(${TARGET_NAME} ${HIFIAUDIOCODEC_LIBRARIES}) diff --git a/plugins/hifiNeuron/CMakeLists.txt b/plugins/hifiNeuron/CMakeLists.txt index e3a725ca2f..a9ed8cca6e 100644 --- a/plugins/hifiNeuron/CMakeLists.txt +++ b/plugins/hifiNeuron/CMakeLists.txt @@ -10,7 +10,7 @@ if (APPLE OR WIN32) set(TARGET_NAME hifiNeuron) setup_hifi_plugin(Script Qml Widgets) - link_hifi_libraries(shared controllers ui plugins input-plugins display-plugins) + link_hifi_libraries(shared controllers ui plugins input-plugins) target_neuron() endif() diff --git a/plugins/hifiSdl2/CMakeLists.txt b/plugins/hifiSdl2/CMakeLists.txt index 86bda5a15d..7e499e314a 100644 --- a/plugins/hifiSdl2/CMakeLists.txt +++ b/plugins/hifiSdl2/CMakeLists.txt @@ -8,5 +8,5 @@ set(TARGET_NAME hifiSdl2) setup_hifi_plugin(Script Qml Widgets) -link_hifi_libraries(shared controllers ui plugins input-plugins script-engine display-plugins) +link_hifi_libraries(shared controllers ui plugins input-plugins script-engine) target_sdl2() diff --git a/plugins/hifiSixense/CMakeLists.txt b/plugins/hifiSixense/CMakeLists.txt index 54884bddff..14676217db 100644 --- a/plugins/hifiSixense/CMakeLists.txt +++ b/plugins/hifiSixense/CMakeLists.txt @@ -9,6 +9,6 @@ if (NOT ANDROID) set(TARGET_NAME hifiSixense) setup_hifi_plugin(Script Qml Widgets) - link_hifi_libraries(shared controllers ui plugins ui-plugins input-plugins display-plugins) + link_hifi_libraries(shared controllers ui plugins ui-plugins input-plugins) target_sixense() endif () diff --git a/plugins/pcmCodec/CMakeLists.txt b/plugins/pcmCodec/CMakeLists.txt index 5e52705033..900a642a88 100644 --- a/plugins/pcmCodec/CMakeLists.txt +++ b/plugins/pcmCodec/CMakeLists.txt @@ -8,6 +8,6 @@ set(TARGET_NAME pcmCodec) setup_hifi_client_server_plugin() -link_hifi_libraries(shared plugins input-plugins display-plugins) +link_hifi_libraries(shared plugins) install_beside_console()