From 0a3ec92031b7eafe190c365ffbfbbe72e4c75b0b Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Wed, 17 Aug 2022 10:56:06 +0200 Subject: [PATCH] Type registeration fixes for scripting engine --- interface/src/Application.cpp | 17 +---- interface/src/LODManager.cpp | 8 +++ interface/src/RefreshRateManager.cpp | 9 +++ interface/src/RefreshRateManager.h | 9 ++- interface/src/avatar/MyAvatar.cpp | 16 ++++- interface/src/avatar/MyAvatar.h | 3 +- .../src/raypick/PickScriptingInterface.cpp | 13 +++- .../src/raypick/PickScriptingInterface.h | 4 +- .../AccountServicesScriptingInterface.cpp | 9 +++ .../PerformanceScriptingInterface.cpp | 2 +- .../PlatformInfoScriptingInterface.cpp | 2 +- .../scripting/RenderScriptingInterface.cpp | 3 +- interface/src/ui/InteractiveWindow.cpp | 7 ++ interface/src/ui/overlays/Overlays.cpp | 8 +++ libraries/animation/src/AnimationObject.cpp | 11 ++- libraries/animation/src/AnimationObject.h | 2 + libraries/audio/src/AudioEffectOptions.cpp | 20 +++++- libraries/audio/src/AudioEffectOptions.h | 7 ++ .../audio/src/AudioScriptingInterface.cpp | 8 ++- libraries/audio/src/ScriptAudioInjector.cpp | 3 +- libraries/avatars/src/AvatarData.cpp | 12 +++- libraries/avatars/src/AvatarData.h | 1 + libraries/avatars/src/ScriptAvatarData.cpp | 3 +- .../src/controllers/ScriptingInterface.cpp | 3 +- .../entities/src/EntityScriptingInterface.cpp | 16 +++-- .../GraphicsScriptingInterface.cpp | 9 +++ libraries/networking/src/AddressManager.h | 1 + .../script-engine/src/ScriptEngineCast.h | 10 +-- libraries/script-engine/src/ScriptManager.cpp | 69 +++++++++++++------ libraries/script-engine/src/ScriptManager.h | 17 ++++- .../qtscript/ScriptEngineQtScript_cast.cpp | 8 +++ .../src/qtscript/ScriptObjectQtProxy.cpp | 1 + .../ui/src/ui/TabletScriptingInterface.cpp | 11 +++ .../ui/src/ui/ToolbarScriptingInterface.cpp | 11 +++ 34 files changed, 266 insertions(+), 67 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a6af164146..661d75bab9 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -7463,7 +7463,7 @@ void Application::registerScriptEngineWithApplicationServices(const ScriptManage scriptEngine->registerGlobalObject("Rates", new RatesScriptingInterface(this)); // hook our avatar and avatar hash map object into this script engine - getMyAvatar()->registerMetaTypes(scriptEngine); + getMyAvatar()->registerProperties(scriptEngine); scriptEngine->registerGlobalObject("AvatarList", DependencyManager::get().data()); @@ -7479,8 +7479,6 @@ void Application::registerScriptEngineWithApplicationServices(const ScriptManage connect(scriptManager.get(), &ScriptManager::finished, clipboardScriptable, &ClipboardScriptingInterface::deleteLater); scriptEngine->registerGlobalObject("Overlays", &_overlays); - scriptRegisterMetaType(scriptEngine.get(), RayToOverlayIntersectionResultToScriptValue, - RayToOverlayIntersectionResultFromScriptValue); bool clientScript = scriptManager->isClientScript(); @@ -7497,14 +7495,8 @@ void Application::registerScriptEngineWithApplicationServices(const ScriptManage } #endif - scriptRegisterMetaType(scriptEngine.get(), wrapperToScriptValue, wrapperFromScriptValue); - scriptRegisterMetaType(scriptEngine.get(), - wrapperToScriptValue, wrapperFromScriptValue); scriptEngine->registerGlobalObject("Toolbars", DependencyManager::get().data()); - scriptRegisterMetaType(scriptEngine.get(), wrapperToScriptValue, wrapperFromScriptValue); - scriptRegisterMetaType(scriptEngine.get(), - wrapperToScriptValue, wrapperFromScriptValue); scriptEngine->registerGlobalObject("Tablet", DependencyManager::get().data()); // FIXME remove these deprecated names for the tablet scripting interface scriptEngine->registerGlobalObject("tabletInterface", DependencyManager::get().data()); @@ -7554,12 +7546,10 @@ void Application::registerScriptEngineWithApplicationServices(const ScriptManage scriptEngine->registerGlobalObject("Account", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED scriptEngine->registerGlobalObject("GlobalServices", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED scriptEngine->registerGlobalObject("AccountServices", AccountServicesScriptingInterface::getInstance()); - scriptRegisterMetaType(scriptEngine.get(), DownloadInfoResultToScriptValue, DownloadInfoResultFromScriptValue); scriptEngine->registerGlobalObject("AvatarManager", DependencyManager::get().data()); scriptEngine->registerGlobalObject("LODManager", DependencyManager::get().data()); - scriptRegisterMetaType(scriptEngine.get(), worldDetailQualityToScriptValue, worldDetailQualityFromScriptValue); scriptEngine->registerGlobalObject("Keyboard", DependencyManager::get().data()); scriptEngine->registerGlobalObject("Performance", new PerformanceScriptingInterface()); @@ -7574,7 +7564,6 @@ void Application::registerScriptEngineWithApplicationServices(const ScriptManage scriptEngine->registerGlobalObject("Render", RenderScriptingInterface::getInstance()); scriptEngine->registerGlobalObject("Workload", _gameWorkload._engine->getConfiguration().get()); - GraphicsScriptingInterface::registerMetaTypes(scriptEngine.get()); scriptEngine->registerGlobalObject("Graphics", DependencyManager::get().data()); scriptEngine->registerGlobalObject("ScriptDiscoveryService", DependencyManager::get().data()); @@ -7606,10 +7595,8 @@ void Application::registerScriptEngineWithApplicationServices(const ScriptManage scriptEngine->registerGlobalObject("HifiAbout", AboutUtil::getInstance()); // Deprecated. scriptEngine->registerGlobalObject("ResourceRequestObserver", DependencyManager::get().data()); - registerInteractiveWindowMetaType(scriptEngine.get()); - auto pickScriptingInterface = DependencyManager::get(); - pickScriptingInterface->registerMetaTypes(scriptEngine.get()); + pickScriptingInterface->registerProperties(scriptEngine.get()); // connect this script engines printedMessage signal to the global ScriptEngines these various messages auto scriptEngines = DependencyManager::get().data(); diff --git a/interface/src/LODManager.cpp b/interface/src/LODManager.cpp index 3acd4f4781..26f0ea5293 100644 --- a/interface/src/LODManager.cpp +++ b/interface/src/LODManager.cpp @@ -5,6 +5,7 @@ // Created by Clement on 1/16/15. // Copyright 2015 High Fidelity, Inc. // Copyright 2021 Vircadia contributors. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -15,11 +16,18 @@ #include #include #include +#include #include "Application.h" #include "ui/DialogsManager.h" #include "InterfaceLogging.h" +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ + auto scriptEngine = manager->engine().get(); + + scriptRegisterMetaType(scriptEngine, worldDetailQualityToScriptValue, worldDetailQualityFromScriptValue); +}); + const QString LOD_SETTINGS_PREFIX { "lodManager/" }; Setting::Handle automaticLODAdjust(LOD_SETTINGS_PREFIX + "automaticLODAdjust", (bool)DEFAULT_LOD_AUTO_ADJUST); diff --git a/interface/src/RefreshRateManager.cpp b/interface/src/RefreshRateManager.cpp index b61f1e944b..ebdf4b919d 100644 --- a/interface/src/RefreshRateManager.cpp +++ b/interface/src/RefreshRateManager.cpp @@ -4,6 +4,7 @@ // // Created by Dante Ruiz on 2019-04-15. // Copyright 2019 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -13,7 +14,15 @@ #include "RefreshRateManager.h" #include +#include +#include +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ + auto scriptEngine = manager->engine().get(); + + scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass, scriptValueToEnumClass, "RefreshRateRegime"); + scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass, scriptValueToEnumClass, "UXMode"); +}); static const int VR_TARGET_RATE = 90; diff --git a/interface/src/RefreshRateManager.h b/interface/src/RefreshRateManager.h index cab7539823..521489e057 100644 --- a/interface/src/RefreshRateManager.h +++ b/interface/src/RefreshRateManager.h @@ -4,6 +4,7 @@ // // Created by Dante Ruiz on 2019-04-15. // Copyright 2019 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -19,9 +20,12 @@ #include #include +#include +#include #include -class RefreshRateManager { +class RefreshRateManager : QObject { + Q_OBJECT public: enum RefreshRateProfile { ECO = 0, @@ -29,6 +33,7 @@ public: REALTIME, PROFILE_NUM }; + Q_ENUM(RefreshRateProfile) static bool isValidRefreshRateProfile(RefreshRateProfile value) { return (value >= RefreshRateProfile::ECO && value <= RefreshRateProfile::REALTIME); } /*@jsdoc @@ -57,6 +62,7 @@ public: SHUTDOWN, REGIME_NUM }; + Q_ENUM(RefreshRateRegime) static bool isValidRefreshRateRegime(RefreshRateRegime value) { return (value >= RefreshRateRegime::FOCUS_ACTIVE && value <= RefreshRateRegime::SHUTDOWN); } /*@jsdoc @@ -77,6 +83,7 @@ public: VR, UX_NUM }; + Q_ENUM(UXMode) static bool isValidUXMode(UXMode value) { return (value >= UXMode::DESKTOP && value <= UXMode::VR); } RefreshRateManager(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index f6c2deb4e3..56e6e4e3cc 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -5,6 +5,7 @@ // Created by Mark Peng on 8/16/13. // Copyright 2012 High Fidelity, Inc. // Copyright 2020 Vircadia contributors. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -112,6 +113,12 @@ const QString POINT_BLEND_LINEAR_ALPHA_NAME = "pointBlendAlpha"; const QString POINT_REF_JOINT_NAME = "RightShoulder"; const float POINT_ALPHA_BLENDING = 1.0f; +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ + auto scriptEngine = manager->engine().get(); + + registerMetaTypes(scriptEngine); +}); + const std::array(MyAvatar::AllowAvatarStandingPreference::Count)> MyAvatar::allowAvatarStandingPreferenceStrings = { QStringLiteral("WhenUserIsStanding"), @@ -439,6 +446,11 @@ void MyAvatar::enableHandTouchForID(const QUuid& entityID) { } void MyAvatar::registerMetaTypes(ScriptEnginePointer engine) { + scriptRegisterMetaType(engine.get(), audioListenModeToScriptValue, audioListenModeFromScriptValue); + scriptRegisterMetaType(engine.get(), driveKeysToScriptValue, driveKeysFromScriptValue); +} + +void MyAvatar::registerProperties(ScriptEnginePointer engine) { ScriptValue value = engine->newQObject(this, ScriptEngine::QtOwnership); engine->globalObject().setProperty("MyAvatar", value); @@ -448,11 +460,9 @@ void MyAvatar::registerMetaTypes(ScriptEnginePointer engine) { driveKeys.setProperty(metaEnum.key(i), metaEnum.value(i)); } engine->globalObject().setProperty("DriveKeys", driveKeys); - - scriptRegisterMetaType(engine.get(), audioListenModeToScriptValue, audioListenModeFromScriptValue); - scriptRegisterMetaType(engine.get(), driveKeysToScriptValue, driveKeysFromScriptValue); } + void MyAvatar::setOrientationVar(const QVariant& newOrientationVar) { Avatar::setWorldOrientation(quatFromVariant(newOrientationVar)); } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 8e4b32c5d3..4f4129e462 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -584,7 +584,8 @@ public: virtual ~MyAvatar(); void instantiableAvatar() override {}; - void registerMetaTypes(ScriptEnginePointer engine); + static void registerMetaTypes(ScriptEnginePointer engine); + void registerProperties(ScriptEnginePointer engine); virtual void simulateAttachments(float deltaTime) override; diff --git a/interface/src/raypick/PickScriptingInterface.cpp b/interface/src/raypick/PickScriptingInterface.cpp index b5ef887f62..afaff075f5 100644 --- a/interface/src/raypick/PickScriptingInterface.cpp +++ b/interface/src/raypick/PickScriptingInterface.cpp @@ -1,6 +1,7 @@ // // Created by Sam Gondelman 10/20/2017 // Copyright 2017 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -32,6 +33,12 @@ #include #include +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ + auto scriptEngine = manager->engine().get(); + + PickScriptingInterface::registerMetaTypes(scriptEngine); +}); + static const float WEB_TOUCH_Y_OFFSET = 0.105f; // how far forward (or back with a negative number) to slide stylus in hand static const glm::vec3 TIP_OFFSET = glm::vec3(0.0f, StylusPick::WEB_STYLUS_LENGTH - WEB_TOUCH_Y_OFFSET, 0.0f); @@ -457,14 +464,16 @@ bool pickTypesFromScriptValue(const ScriptValue& object, PickQuery::PickType& pi } void PickScriptingInterface::registerMetaTypes(ScriptEngine* engine) { + scriptRegisterMetaType(engine, pickTypesToScriptValue, pickTypesFromScriptValue); +} + +void PickScriptingInterface::registerProperties(ScriptEngine* engine) { ScriptValue pickTypes = engine->newObject(); auto metaEnum = QMetaEnum::fromType(); for (int i = 0; i < PickQuery::PickType::NUM_PICK_TYPES; ++i) { pickTypes.setProperty(metaEnum.key(i), metaEnum.value(i)); } engine->globalObject().setProperty("PickType", pickTypes); - - scriptRegisterMetaType(engine, pickTypesToScriptValue, pickTypesFromScriptValue); } unsigned int PickScriptingInterface::getPerFrameTimeBudget() const { diff --git a/interface/src/raypick/PickScriptingInterface.h b/interface/src/raypick/PickScriptingInterface.h index 8afe5c45d3..f628c86302 100644 --- a/interface/src/raypick/PickScriptingInterface.h +++ b/interface/src/raypick/PickScriptingInterface.h @@ -1,6 +1,7 @@ // // Created by Sam Gondelman 10/20/2017 // Copyright 2017 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -106,7 +107,8 @@ class PickScriptingInterface : public QObject, public Dependency { SINGLETON_DEPENDENCY public: - void registerMetaTypes(ScriptEngine* engine); + static void registerMetaTypes(ScriptEngine* engine); + void registerProperties(ScriptEngine* engine); /*@jsdoc * Creates a new pick. Different {@link PickType}s use different properties, and within one PickType the properties you diff --git a/interface/src/scripting/AccountServicesScriptingInterface.cpp b/interface/src/scripting/AccountServicesScriptingInterface.cpp index 042cb25978..051581a7ae 100644 --- a/interface/src/scripting/AccountServicesScriptingInterface.cpp +++ b/interface/src/scripting/AccountServicesScriptingInterface.cpp @@ -4,6 +4,7 @@ // // Created by Thijs Wenker on 9/10/14. // Copyright 2014 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -11,11 +12,19 @@ #include "AccountServicesScriptingInterface.h" +#include + #include "AccountManager.h" #include "Application.h" #include "DiscoverabilityManager.h" #include "ResourceCache.h" +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ + auto scriptEngine = manager->engine().get(); + + scriptRegisterMetaType(scriptEngine, DownloadInfoResultToScriptValue, DownloadInfoResultFromScriptValue); +}); + AccountServicesScriptingInterface::AccountServicesScriptingInterface() { auto accountManager = DependencyManager::get(); connect(accountManager.data(), &AccountManager::usernameChanged, this, &AccountServicesScriptingInterface::onUsernameChanged); diff --git a/interface/src/scripting/PerformanceScriptingInterface.cpp b/interface/src/scripting/PerformanceScriptingInterface.cpp index 780def24af..426af07676 100644 --- a/interface/src/scripting/PerformanceScriptingInterface.cpp +++ b/interface/src/scripting/PerformanceScriptingInterface.cpp @@ -14,7 +14,7 @@ #include "../Application.h" -STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager){ +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ auto scriptEngine = manager->engine().get(); scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass, scriptValueToEnumClass, "PerformancePreset"); diff --git a/interface/src/scripting/PlatformInfoScriptingInterface.cpp b/interface/src/scripting/PlatformInfoScriptingInterface.cpp index fb7de16627..bd8ae06335 100644 --- a/interface/src/scripting/PlatformInfoScriptingInterface.cpp +++ b/interface/src/scripting/PlatformInfoScriptingInterface.cpp @@ -21,7 +21,7 @@ #include #endif -STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager){ +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ auto scriptEngine = manager->engine().get(); scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass, scriptValueToEnumClass, "PlatformTier"); diff --git a/interface/src/scripting/RenderScriptingInterface.cpp b/interface/src/scripting/RenderScriptingInterface.cpp index ecaee570b7..4b93e1502c 100644 --- a/interface/src/scripting/RenderScriptingInterface.cpp +++ b/interface/src/scripting/RenderScriptingInterface.cpp @@ -14,10 +14,11 @@ #include #include "ScreenName.h" -STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager){ +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ auto scriptEngine = manager->engine().get(); scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass, scriptValueToEnumClass, "RenderMethod"); + scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass, scriptValueToEnumClass, "Mode"); }); RenderScriptingInterface* RenderScriptingInterface::getInstance() { diff --git a/interface/src/ui/InteractiveWindow.cpp b/interface/src/ui/InteractiveWindow.cpp index cda66c5cf2..bca8f9c0fc 100644 --- a/interface/src/ui/InteractiveWindow.cpp +++ b/interface/src/ui/InteractiveWindow.cpp @@ -4,6 +4,7 @@ // // Created by Thijs Wenker on 2018-06-25 // Copyright 2018 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -35,6 +36,12 @@ #include #endif +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ + auto scriptEngine = manager->engine().get(); + + registerInteractiveWindowMetaType(scriptEngine); +}); + static auto CONTENT_WINDOW_QML = QUrl("InteractiveWindow.qml"); static const char* const ADDITIONAL_FLAGS_PROPERTY = "additionalFlags"; diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 89a5dae049..9268c17c88 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -3,6 +3,7 @@ // interface/src/ui/overlays // // Copyright 2014 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -42,6 +43,13 @@ Q_LOGGING_CATEGORY(trace_render_overlays, "trace.render.overlays") std::unordered_map Overlays::_entityToOverlayTypes; std::unordered_map Overlays::_overlayToEntityTypes; +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ + auto scriptEngine = manager->engine().get(); + + scriptRegisterMetaType(scriptEngine, RayToOverlayIntersectionResultToScriptValue, + RayToOverlayIntersectionResultFromScriptValue); +}); + Overlays::Overlays() : _scriptEngine(newScriptEngine()) { ADD_TYPE_MAP(Box, cube); ADD_TYPE_MAP(Sphere, sphere); diff --git a/libraries/animation/src/AnimationObject.cpp b/libraries/animation/src/AnimationObject.cpp index 6782768f5b..cb19a0b8c4 100644 --- a/libraries/animation/src/AnimationObject.cpp +++ b/libraries/animation/src/AnimationObject.cpp @@ -4,6 +4,7 @@ // // Created by Andrzej Kapolka on 4/17/14. // Copyright (c) 2014 High Fidelity, Inc. All rights reserved. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -18,10 +19,14 @@ #include "AnimationCache.h" -STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager) { registerAnimationTypes(manager->engine().get()); }); +STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { + registerAnimationPrototypes(manager->engine().get()); +}); + QStringList AnimationObject::getJointNames() const { return scriptvalue_cast(thisObject())->getJointNames(); } @@ -36,9 +41,11 @@ QVector AnimationFrameObject::getRotations() const { void registerAnimationTypes(ScriptEngine* engine) { scriptRegisterSequenceMetaType >(engine); +} + +void registerAnimationPrototypes(ScriptEngine* engine) { engine->setDefaultPrototype(qMetaTypeId(), engine->newQObject( new AnimationFrameObject(), ScriptEngine::ScriptOwnership)); engine->setDefaultPrototype(qMetaTypeId(), engine->newQObject( new AnimationObject(), ScriptEngine::ScriptOwnership)); } - diff --git a/libraries/animation/src/AnimationObject.h b/libraries/animation/src/AnimationObject.h index d170b15b08..93130efd81 100644 --- a/libraries/animation/src/AnimationObject.h +++ b/libraries/animation/src/AnimationObject.h @@ -4,6 +4,7 @@ // // Created by Andrzej Kapolka on 4/17/14. // Copyright (c) 2014 High Fidelity, Inc. All rights reserved. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -87,5 +88,6 @@ public: }; void registerAnimationTypes(ScriptEngine* engine); +void registerAnimationPrototypes(ScriptEngine* engine); #endif // hifi_AnimationObject_h diff --git a/libraries/audio/src/AudioEffectOptions.cpp b/libraries/audio/src/AudioEffectOptions.cpp index bed083d7db..b6b722b324 100644 --- a/libraries/audio/src/AudioEffectOptions.cpp +++ b/libraries/audio/src/AudioEffectOptions.cpp @@ -3,6 +3,7 @@ // libraries/audio/src // // Copyright 2013 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -14,14 +15,31 @@ #include #include #include +#include + +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager) { + auto scriptEngine = manager->engine().get(); + + scriptRegisterMetaType(scriptEngine, audioEffectOptionsToScriptValue, audioEffectOptionsFromScriptValue); +}); STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { - auto scriptEngine = manager->engine(); + auto scriptEngine = manager->engine().get(); ScriptValue audioEffectOptionsConstructorValue = scriptEngine->newFunction(AudioEffectOptions::constructor); scriptEngine->globalObject().setProperty("AudioEffectOptions", audioEffectOptionsConstructorValue); }); +ScriptValue audioEffectOptionsToScriptValue(ScriptEngine* scriptEngine, const AudioEffectOptions& audioEffectOptions) { + qCritical() << "Conversion of AudioEffectOptions to ScriptValue should never happen."; + return ScriptValue(); +} + +bool audioEffectOptionsFromScriptValue(const ScriptValue& scriptValue, AudioEffectOptions& audioEffectOptions) { + audioEffectOptions = AudioEffectOptions(scriptValue); + return true; +} + static const QString BANDWIDTH_HANDLE = "bandwidth"; static const QString PRE_DELAY_HANDLE = "preDelay"; static const QString LATE_DELAY_HANDLE = "lateDelay"; diff --git a/libraries/audio/src/AudioEffectOptions.h b/libraries/audio/src/AudioEffectOptions.h index 7ac2c83a24..c9db364c1c 100644 --- a/libraries/audio/src/AudioEffectOptions.h +++ b/libraries/audio/src/AudioEffectOptions.h @@ -3,6 +3,7 @@ // libraries/audio/src // // Copyright 2013 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -182,4 +183,10 @@ private: float _wetDryMix; // [0, 100] percent }; +Q_DECLARE_METATYPE(AudioEffectOptions); + +ScriptValue audioEffectOptionsToScriptValue(ScriptEngine* scriptEngine, const AudioEffectOptions& audioEffectOptions); + +bool audioEffectOptionsFromScriptValue(const ScriptValue& scriptValue, AudioEffectOptions& audioEffectOptions); + #endif // hifi_AudioEffectOptions_h diff --git a/libraries/audio/src/AudioScriptingInterface.cpp b/libraries/audio/src/AudioScriptingInterface.cpp index ec7a50e5df..96bdcfbf71 100644 --- a/libraries/audio/src/AudioScriptingInterface.cpp +++ b/libraries/audio/src/AudioScriptingInterface.cpp @@ -4,6 +4,7 @@ // // Created by Stephen Birarda on 1/2/2014. // Copyright 2014 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -21,15 +22,18 @@ #include #include +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ + auto scriptEngine = manager->engine().get(); + + registerAudioMetaTypes(scriptEngine); +}); STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager){ auto scriptEngine = manager->engine().get(); - registerAudioMetaTypes(scriptEngine); scriptEngine->registerGlobalObject("Audio", DependencyManager::get().data()); }); - void registerAudioMetaTypes(ScriptEngine* engine) { scriptRegisterMetaType(engine, injectorOptionsToScriptValue, injectorOptionsFromScriptValue); scriptRegisterMetaType(engine, soundSharedPointerToScriptValue, soundSharedPointerFromScriptValue); diff --git a/libraries/audio/src/ScriptAudioInjector.cpp b/libraries/audio/src/ScriptAudioInjector.cpp index 28af8b849a..30f84de839 100644 --- a/libraries/audio/src/ScriptAudioInjector.cpp +++ b/libraries/audio/src/ScriptAudioInjector.cpp @@ -4,6 +4,7 @@ // // Created by Stephen Birarda on 2015-02-11. // Copyright 2015 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -17,7 +18,7 @@ #include #include -STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager) { auto scriptEngine = manager->engine().get(); scriptRegisterMetaType(scriptEngine, injectorToScriptValue, injectorFromScriptValue); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index eaa264a669..8035b0b291 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -4,6 +4,7 @@ // // Created by Stephen Birarda on 4/9/13. // Copyright 2013 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -68,7 +69,7 @@ static const float DEFAULT_AVATAR_DENSITY = 1000.0f; // density of water #define ASSERT(COND) do { if (!(COND)) { abort(); } } while(0) -STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager) { auto scriptEngine = manager->engine().get(); registerAvatarTypes(scriptEngine); @@ -76,6 +77,12 @@ STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { scriptRegisterMetaType(scriptEngine, AvatarEntityMapToScriptValue, AvatarEntityMapFromScriptValue); }); +STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { + auto scriptEngine = manager->engine().get(); + + registerAvatarPrototypes(scriptEngine); +}); + size_t AvatarDataPacket::maxFaceTrackerInfoSize(size_t numBlendshapeCoefficients) { return FACE_TRACKER_INFO_SIZE + numBlendshapeCoefficients * sizeof(float); } @@ -2609,6 +2616,9 @@ bool AttachmentDataObject::getIsSoft() const { void registerAvatarTypes(ScriptEngine* engine) { scriptRegisterSequenceMetaType >(engine); +} + +void registerAvatarPrototypes(ScriptEngine* engine) { engine->setDefaultPrototype(qMetaTypeId(), engine->newQObject( new AttachmentDataObject(), ScriptEngine::ScriptOwnership)); } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 9e08da6d46..0ce5736454 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -1958,6 +1958,7 @@ public: }; void registerAvatarTypes(ScriptEngine* engine); +void registerAvatarPrototypes(ScriptEngine* engine); class RayToAvatarIntersectionResult { public: diff --git a/libraries/avatars/src/ScriptAvatarData.cpp b/libraries/avatars/src/ScriptAvatarData.cpp index 5335f8ab5b..717aa19278 100644 --- a/libraries/avatars/src/ScriptAvatarData.cpp +++ b/libraries/avatars/src/ScriptAvatarData.cpp @@ -4,6 +4,7 @@ // // Created by Zach Fox on 2017-04-10. // Copyright 2017 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -25,7 +26,7 @@ bool avatarDataFromScriptValue(const ScriptValue& object, ScriptAvatarData*& out return false; } -STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager) { auto scriptEngine = manager->engine().get(); scriptRegisterMetaType(scriptEngine, avatarDataToScriptValue, avatarDataFromScriptValue); diff --git a/libraries/controllers/src/controllers/ScriptingInterface.cpp b/libraries/controllers/src/controllers/ScriptingInterface.cpp index 2187f4bc99..cb5c18a5f9 100644 --- a/libraries/controllers/src/controllers/ScriptingInterface.cpp +++ b/libraries/controllers/src/controllers/ScriptingInterface.cpp @@ -1,6 +1,7 @@ // // Created by Bradley Austin Davis 2015/10/09 // Copyright 2015 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -40,7 +41,7 @@ bool inputControllerFromScriptValue(const ScriptValue& object, controller::Input return true; } -STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager) { auto scriptEngine = manager->engine().get(); scriptRegisterMetaType(scriptEngine, inputControllerToScriptValue, inputControllerFromScriptValue); diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index f93ad4ef97..38361f757d 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -4,6 +4,7 @@ // // Created by Brad Hefta-Gaub on 12/6/13. // Copyright 2013 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -48,13 +49,9 @@ const QString GRABBABLE_USER_DATA = "{\"grabbableKey\":{\"grabbable\":true}}"; const QString NOT_GRABBABLE_USER_DATA = "{\"grabbableKey\":{\"grabbable\":false}}"; -void staticEntityScriptInitializer(ScriptManager* manager) { +void staticEntityScriptTypesInitializer(ScriptManager* manager) { auto scriptEngine = manager->engine().get(); - auto entityScriptingInterface = DependencyManager::get(); - entityScriptingInterface->init(); - auto interfacePtr = entityScriptingInterface.data(); // using this when we don't want to leak a reference - registerMetaTypes(scriptEngine); scriptRegisterMetaType(scriptEngine, EntityPropertyFlagsToScriptValue, EntityPropertyFlagsFromScriptValue); @@ -62,6 +59,15 @@ void staticEntityScriptInitializer(ScriptManager* manager) { scriptRegisterMetaType(scriptEngine, EntityPropertyInfoToScriptValue, EntityPropertyInfoFromScriptValue); scriptRegisterMetaType(scriptEngine, EntityItemIDtoScriptValue, EntityItemIDfromScriptValue); scriptRegisterMetaType(scriptEngine, RayToEntityIntersectionResultToScriptValue, RayToEntityIntersectionResultFromScriptValue); +} +STATIC_SCRIPT_TYPES_INITIALIZER(staticEntityScriptTypesInitializer); + +void staticEntityScriptInitializer(ScriptManager* manager) { + auto scriptEngine = manager->engine().get(); + + auto entityScriptingInterface = DependencyManager::get(); + entityScriptingInterface->init(); + auto interfacePtr = entityScriptingInterface.data(); // using this when we don't want to leak a reference scriptEngine->registerGlobalObject("Entities", entityScriptingInterface.data()); scriptEngine->registerFunction("Entities", "getMultipleEntityProperties", EntityScriptingInterface::getMultipleEntityProperties); diff --git a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp index aa59a8f445..586a22e48f 100644 --- a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp +++ b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.cpp @@ -3,6 +3,7 @@ // libraries/graphics-scripting/src // // Copyright 2017 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -19,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -26,6 +28,13 @@ #include #include +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ + auto scriptEngine = manager->engine().get(); + + GraphicsScriptingInterface::registerMetaTypes(scriptEngine); +}); + + GraphicsScriptingInterface::GraphicsScriptingInterface(QObject* parent) : QObject(parent), Scriptable() { } diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index a8dbc782c8..58cc860106 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -214,6 +214,7 @@ public: Suggestions, VisitUserFromPAL }; + Q_ENUM(LookupTrigger) bool isConnected(); QString getProtocol() const; diff --git a/libraries/script-engine/src/ScriptEngineCast.h b/libraries/script-engine/src/ScriptEngineCast.h index 59493275fd..a75b635b4b 100644 --- a/libraries/script-engine/src/ScriptEngineCast.h +++ b/libraries/script-engine/src/ScriptEngineCast.h @@ -76,12 +76,12 @@ int scriptRegisterMetaType(ScriptEngine* eng, if (strlen(name) > 0) { // make sure it's registered id = qRegisterMetaType(name); } else { - if (!QMetaType::fromType().name().isNull()) { - qDebug() << "scriptRegisterMetaType: " << QMetaType::fromType().name(); - id = qRegisterMetaType(QMetaType::fromType().name()); - }else{ + //if (!QMetaType::fromType().name().isNull()) { + //qDebug() << "scriptRegisterMetaType: " << QMetaType::fromType().name(); + //id = qRegisterMetaType(QMetaType::fromType().name()); + //}else{ id = qRegisterMetaType(); - } + //} } eng->registerCustomType(id, reinterpret_cast(toScriptValue), reinterpret_cast(fromScriptValue)); diff --git a/libraries/script-engine/src/ScriptManager.cpp b/libraries/script-engine/src/ScriptManager.cpp index 611bb83853..5b4ad7c8e8 100644 --- a/libraries/script-engine/src/ScriptManager.cpp +++ b/libraries/script-engine/src/ScriptManager.cpp @@ -4,6 +4,7 @@ // // Created by Brad Hefta-Gaub on 12/14/13. // Copyright 2013 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -88,6 +89,7 @@ Q_DECLARE_METATYPE(ScriptValue); // --- Static script initialization registry static ScriptManager::StaticInitializerNode* rootInitializer = nullptr; +static ScriptManager::StaticTypesInitializerNode* rootTypesInitializer = nullptr; void ScriptManager::registerNewStaticInitializer(StaticInitializerNode* dest) { // this function is assumed to be called on LoadLibrary, where we are explicitly operating in single-threaded mode @@ -102,6 +104,19 @@ static void runStaticInitializers(ScriptManager* manager) { here = here->prev; } } +void ScriptManager::registerNewStaticTypesInitializer(StaticTypesInitializerNode* dest) { + // this function is assumed to be called on LoadLibrary, where we are explicitly operating in single-threaded mode + // Therefore there is no mutex or threadsafety here and the structure is assumed not to change after loading + dest->prev = rootTypesInitializer; + rootTypesInitializer = dest; +} +static void runStaticTypesInitializers(ScriptManager* manager) { + ScriptManager::StaticTypesInitializerNode* here = rootTypesInitializer; + while (here != nullptr) { + (*here->init)(manager); + here = here->prev; + } +} // --- @@ -210,12 +225,11 @@ ScriptManagerPointer newScriptManager(ScriptManager::Context context, const QString& fileNameString) { ScriptManagerPointer manager(new ScriptManager(context, scriptContents, fileNameString), [](ScriptManager* obj) { obj->deleteLater(); }); - ScriptEnginePointer engine = newScriptEngine(manager.get()); - manager->_engine = engine; return manager; } int ScriptManager::processLevelMaxRetries { ScriptRequest::MAX_RETRIES }; + ScriptManager::ScriptManager(Context context, const QString& scriptContents, const QString& fileNameString) : QObject(), _context(context), @@ -267,6 +281,10 @@ ScriptManager::ScriptManager(Context context, const QString& scriptContents, con } }); } + + if (!_areMetaTypesInitialized) { + initMetaTypes(); + } } QString ScriptManager::getTypeAsString() const { @@ -615,17 +633,13 @@ void ScriptManager::resetModuleCache(bool deleteScriptCache) { jsRequire.setProperty("cache", cache, READONLY_PROP_FLAGS); } -void ScriptManager::init() { - if (_isInitialized) { - return; // only initialize once +void ScriptManager::initMetaTypes() { + if (_areMetaTypesInitialized) { + return; } - - _isInitialized = true; - runStaticInitializers(this); - + _areMetaTypesInitialized = true; auto scriptEngine = _engine.get(); - - // register various meta-types + runStaticTypesInitializers(this); registerMIDIMetaTypes(scriptEngine); registerEventTypes(scriptEngine); registerMenuItemProperties(scriptEngine); @@ -636,6 +650,29 @@ void ScriptManager::init() { scriptRegisterSequenceMetaType>(scriptEngine); scriptRegisterSequenceMetaType>(scriptEngine); scriptRegisterSequenceMetaType>(scriptEngine); + + scriptRegisterMetaType(scriptEngine, animationDetailsToScriptValue, animationDetailsFromScriptValue); + scriptRegisterMetaType(scriptEngine, webSocketToScriptValue, webSocketFromScriptValue); + scriptRegisterMetaType(scriptEngine, qWSCloseCodeToScriptValue, qWSCloseCodeFromScriptValue); + scriptRegisterMetaType(scriptEngine, wscReadyStateToScriptValue, wscReadyStateFromScriptValue); + + scriptRegisterMetaType(scriptEngine, externalResourceBucketToScriptValue, externalResourceBucketFromScriptValue); + + scriptRegisterMetaType(scriptEngine, scriptableResourceToScriptValue, scriptableResourceFromScriptValue); + + scriptRegisterMetaType(scriptEngine, meshToScriptValue, meshFromScriptValue); + scriptRegisterMetaType(scriptEngine, meshesToScriptValue, meshesFromScriptValue); +} + +void ScriptManager::init() { + if (_isInitialized) { + return; // only initialize once + } + + _isInitialized = true; + runStaticInitializers(this); + + auto scriptEngine = _engine.get(); ScriptValue xmlHttpRequestConstructorValue = scriptEngine->newFunction(XMLHttpRequestClass::constructor); scriptEngine->globalObject().setProperty("XMLHttpRequest", xmlHttpRequestConstructorValue); @@ -652,11 +689,6 @@ void ScriptManager::init() { */ scriptEngine->globalObject().setProperty("print", scriptEngine->newFunction(debugPrint)); - scriptRegisterMetaType(scriptEngine, animationDetailsToScriptValue, animationDetailsFromScriptValue); - scriptRegisterMetaType(scriptEngine, webSocketToScriptValue, webSocketFromScriptValue); - scriptRegisterMetaType(scriptEngine, qWSCloseCodeToScriptValue, qWSCloseCodeFromScriptValue); - scriptRegisterMetaType(scriptEngine, wscReadyStateToScriptValue, wscReadyStateFromScriptValue); - // NOTE: You do not want to end up creating new instances of singletons here. They will be on the ScriptManager thread // and are likely to be unusable if we "reset" the ScriptManager by creating a new one (on a whole new thread). @@ -671,7 +703,6 @@ void ScriptManager::init() { resetModuleCache(); } - scriptRegisterMetaType(scriptEngine, externalResourceBucketToScriptValue, externalResourceBucketFromScriptValue); scriptEngine->registerEnum("Script.ExternalPaths", QMetaEnum::fromType()); scriptEngine->registerGlobalObject("Quat", &_quatLibrary); @@ -696,7 +727,6 @@ void ScriptManager::init() { auto resourcePrototype = createScriptableResourcePrototype(shared_from_this()); scriptEngine->globalObject().setProperty("Resource", resourcePrototype); scriptEngine->setDefaultPrototype(qMetaTypeId(), resourcePrototype); - scriptRegisterMetaType(scriptEngine, scriptableResourceToScriptValue, scriptableResourceFromScriptValue); // constants scriptEngine->globalObject().setProperty("TREE_SCALE", scriptEngine->newValue(TREE_SCALE)); @@ -706,9 +736,6 @@ void ScriptManager::init() { scriptEngine->registerGlobalObject("DebugDraw", &DebugDraw::getInstance()); - scriptRegisterMetaType(scriptEngine, meshToScriptValue, meshFromScriptValue); - scriptRegisterMetaType(scriptEngine, meshesToScriptValue, meshesFromScriptValue); - scriptEngine->registerGlobalObject("UserActivityLogger", DependencyManager::get().data()); #if DEV_BUILD || PR_BUILD diff --git a/libraries/script-engine/src/ScriptManager.h b/libraries/script-engine/src/ScriptManager.h index 76540bab81..03f169c3e7 100644 --- a/libraries/script-engine/src/ScriptManager.h +++ b/libraries/script-engine/src/ScriptManager.h @@ -5,6 +5,7 @@ // Created by Brad Hefta-Gaub on 12/14/13. // Copyright 2013 High Fidelity, Inc. // Copyright 2020 Vircadia contributors. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -104,7 +105,10 @@ public: QUrl definingSandboxURL { QUrl("about:EntityScript") }; }; -// declare a static script initializer +// declare a static script initializers +#define STATIC_SCRIPT_TYPES_INITIALIZER(init) \ + static ScriptManager::StaticTypesInitializerNode static_script_types_initializer_(init); + #define STATIC_SCRIPT_INITIALIZER(init) \ static ScriptManager::StaticInitializerNode static_script_initializer_(init); @@ -179,6 +183,13 @@ public: }; static void registerNewStaticInitializer(StaticInitializerNode* dest); + class StaticTypesInitializerNode { + public: + ScriptManagerInitializer init; + StaticTypesInitializerNode* prev; + inline StaticTypesInitializerNode(ScriptManagerInitializer&& pInit) : init(std::move(pInit)),prev(nullptr) { registerNewStaticTypesInitializer(this); } + }; + static void registerNewStaticTypesInitializer(StaticTypesInitializerNode* dest); /// run the script in a dedicated thread. This will have the side effect of evalulating /// the current script contents and calling run(). Callers will likely want to register the script with external /// services before calling this. @@ -874,6 +885,9 @@ signals: void releaseEntityPacketSenderMessages(bool wait); protected: + // Is called by the constructor, bceause all types need to be registered before method discovery with ScriptObjectQtProxy::investigate() + void initMetaTypes(); + void init(); /**jsdoc @@ -934,6 +948,7 @@ protected: std::atomic _isFinished { false }; std::atomic _isRunning { false }; std::atomic _isStopping { false }; + bool _areMetaTypesInitialized { false }; bool _isInitialized { false }; QHash _timerFunctionMap; QSet _includedURLs; diff --git a/libraries/script-engine/src/qtscript/ScriptEngineQtScript_cast.cpp b/libraries/script-engine/src/qtscript/ScriptEngineQtScript_cast.cpp index dabe49d66c..581419fce8 100644 --- a/libraries/script-engine/src/qtscript/ScriptEngineQtScript_cast.cpp +++ b/libraries/script-engine/src/qtscript/ScriptEngineQtScript_cast.cpp @@ -42,6 +42,7 @@ void ScriptEngineQtScript::registerCustomType(int type, CustomMarshal& customType = _customTypes.insert(type, CustomMarshal()).value(); customType.demarshalFunc = demarshalFunc; customType.marshalFunc = marshalFunc; + qDebug() << "registerCustomType: " << QMetaType(type).name() << " type: " << type << " map size: " << _customTypes.size(); } Q_DECLARE_METATYPE(ScriptValue); @@ -209,6 +210,13 @@ bool ScriptEngineQtScript::castValueToVariant(const QScriptValue& val, QVariant& } } } +/* if (QMetaType(destTypeId).name() == "MenuItemProperties") { + qDebug() << "castValueToVariant MenuItemProperties " << destTypeId << "map size: " << _customTypes.size(); + for (auto iter = _customTypes.keyBegin(); iter != _customTypes.keyEnd(); iter++){ + qDebug() << (*iter); + } + printf("castValueToVariant MenuItemProperties"); + }*/ if (destTypeId == qMetaTypeId()) { dest = QVariant::fromValue(ScriptValue(new ScriptValueQtWrapper(this, val))); diff --git a/libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp b/libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp index c551920ac2..53bec36638 100644 --- a/libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp +++ b/libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp @@ -134,6 +134,7 @@ void ScriptObjectQtProxy::investigate() { if (!qobject) return; const QMetaObject* metaObject = qobject->metaObject(); + qDebug() << "ScriptObjectQtProxy::investigate: " << metaObject->className(); // discover properties int startIdx = _wrapOptions & ScriptEngine::ExcludeSuperClassProperties ? metaObject->propertyOffset() : 0; diff --git a/libraries/ui/src/ui/TabletScriptingInterface.cpp b/libraries/ui/src/ui/TabletScriptingInterface.cpp index 81a4e9c718..a4141cdbad 100644 --- a/libraries/ui/src/ui/TabletScriptingInterface.cpp +++ b/libraries/ui/src/ui/TabletScriptingInterface.cpp @@ -1,6 +1,7 @@ // // Created by Anthony J. Thibault on 2016-12-12 // Copyright 2013-2016 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -17,6 +18,8 @@ #include #include #include +#include +#include #include "../QmlWindowClass.h" #include "../OffscreenUi.h" @@ -28,6 +31,14 @@ #include "SettingHandle.h" +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ + auto scriptEngine = manager->engine().get(); + + scriptRegisterMetaType(scriptEngine, wrapperToScriptValue, wrapperFromScriptValue); + scriptRegisterMetaType(scriptEngine, + wrapperToScriptValue, wrapperFromScriptValue); +}); + // FIXME move to global app properties const QString SYSTEM_TOOLBAR = "com.highfidelity.interface.toolbar.system"; const QString SYSTEM_TABLET = "com.highfidelity.interface.tablet.system"; diff --git a/libraries/ui/src/ui/ToolbarScriptingInterface.cpp b/libraries/ui/src/ui/ToolbarScriptingInterface.cpp index c2e908f8a4..c68e765ca8 100644 --- a/libraries/ui/src/ui/ToolbarScriptingInterface.cpp +++ b/libraries/ui/src/ui/ToolbarScriptingInterface.cpp @@ -1,6 +1,7 @@ // // Created by Bradley Austin Davis on 2016-06-16 // Copyright 2013-2016 High Fidelity, Inc. +// Copyright 2022 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -12,10 +13,20 @@ #include #include #include +#include +#include #include #include "../OffscreenUi.h" +STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ + auto scriptEngine = manager->engine().get(); + + scriptRegisterMetaType(scriptEngine, wrapperToScriptValue, wrapperFromScriptValue); + scriptRegisterMetaType(scriptEngine, + wrapperToScriptValue, wrapperFromScriptValue); +}); + ScriptValue toolbarToScriptValue(ScriptEngine* engine, ToolbarProxy* const &in) { if (!in) { return engine->undefinedValue();