Type registeration fixes for scripting engine

This commit is contained in:
ksuprynowicz 2022-08-17 10:56:06 +02:00
parent 39fe4b619b
commit 1f2042f826
34 changed files with 266 additions and 67 deletions

View file

@ -7463,7 +7463,7 @@ void Application::registerScriptEngineWithApplicationServices(const ScriptManage
scriptEngine->registerGlobalObject("Rates", new RatesScriptingInterface(this)); scriptEngine->registerGlobalObject("Rates", new RatesScriptingInterface(this));
// hook our avatar and avatar hash map object into this script engine // hook our avatar and avatar hash map object into this script engine
getMyAvatar()->registerMetaTypes(scriptEngine); getMyAvatar()->registerProperties(scriptEngine);
scriptEngine->registerGlobalObject("AvatarList", DependencyManager::get<AvatarManager>().data()); scriptEngine->registerGlobalObject("AvatarList", DependencyManager::get<AvatarManager>().data());
@ -7479,8 +7479,6 @@ void Application::registerScriptEngineWithApplicationServices(const ScriptManage
connect(scriptManager.get(), &ScriptManager::finished, clipboardScriptable, &ClipboardScriptingInterface::deleteLater); connect(scriptManager.get(), &ScriptManager::finished, clipboardScriptable, &ClipboardScriptingInterface::deleteLater);
scriptEngine->registerGlobalObject("Overlays", &_overlays); scriptEngine->registerGlobalObject("Overlays", &_overlays);
scriptRegisterMetaType(scriptEngine.get(), RayToOverlayIntersectionResultToScriptValue,
RayToOverlayIntersectionResultFromScriptValue);
bool clientScript = scriptManager->isClientScript(); bool clientScript = scriptManager->isClientScript();
@ -7497,14 +7495,8 @@ void Application::registerScriptEngineWithApplicationServices(const ScriptManage
} }
#endif #endif
scriptRegisterMetaType(scriptEngine.get(), wrapperToScriptValue<ToolbarProxy>, wrapperFromScriptValue<ToolbarProxy>);
scriptRegisterMetaType(scriptEngine.get(),
wrapperToScriptValue<ToolbarButtonProxy>, wrapperFromScriptValue<ToolbarButtonProxy>);
scriptEngine->registerGlobalObject("Toolbars", DependencyManager::get<ToolbarScriptingInterface>().data()); scriptEngine->registerGlobalObject("Toolbars", DependencyManager::get<ToolbarScriptingInterface>().data());
scriptRegisterMetaType(scriptEngine.get(), wrapperToScriptValue<TabletProxy>, wrapperFromScriptValue<TabletProxy>);
scriptRegisterMetaType(scriptEngine.get(),
wrapperToScriptValue<TabletButtonProxy>, wrapperFromScriptValue<TabletButtonProxy>);
scriptEngine->registerGlobalObject("Tablet", DependencyManager::get<TabletScriptingInterface>().data()); scriptEngine->registerGlobalObject("Tablet", DependencyManager::get<TabletScriptingInterface>().data());
// FIXME remove these deprecated names for the tablet scripting interface // FIXME remove these deprecated names for the tablet scripting interface
scriptEngine->registerGlobalObject("tabletInterface", DependencyManager::get<TabletScriptingInterface>().data()); scriptEngine->registerGlobalObject("tabletInterface", DependencyManager::get<TabletScriptingInterface>().data());
@ -7554,12 +7546,10 @@ void Application::registerScriptEngineWithApplicationServices(const ScriptManage
scriptEngine->registerGlobalObject("Account", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED scriptEngine->registerGlobalObject("Account", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED
scriptEngine->registerGlobalObject("GlobalServices", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED scriptEngine->registerGlobalObject("GlobalServices", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED
scriptEngine->registerGlobalObject("AccountServices", AccountServicesScriptingInterface::getInstance()); scriptEngine->registerGlobalObject("AccountServices", AccountServicesScriptingInterface::getInstance());
scriptRegisterMetaType(scriptEngine.get(), DownloadInfoResultToScriptValue, DownloadInfoResultFromScriptValue);
scriptEngine->registerGlobalObject("AvatarManager", DependencyManager::get<AvatarManager>().data()); scriptEngine->registerGlobalObject("AvatarManager", DependencyManager::get<AvatarManager>().data());
scriptEngine->registerGlobalObject("LODManager", DependencyManager::get<LODManager>().data()); scriptEngine->registerGlobalObject("LODManager", DependencyManager::get<LODManager>().data());
scriptRegisterMetaType(scriptEngine.get(), worldDetailQualityToScriptValue, worldDetailQualityFromScriptValue);
scriptEngine->registerGlobalObject("Keyboard", DependencyManager::get<KeyboardScriptingInterface>().data()); scriptEngine->registerGlobalObject("Keyboard", DependencyManager::get<KeyboardScriptingInterface>().data());
scriptEngine->registerGlobalObject("Performance", new PerformanceScriptingInterface()); scriptEngine->registerGlobalObject("Performance", new PerformanceScriptingInterface());
@ -7574,7 +7564,6 @@ void Application::registerScriptEngineWithApplicationServices(const ScriptManage
scriptEngine->registerGlobalObject("Render", RenderScriptingInterface::getInstance()); scriptEngine->registerGlobalObject("Render", RenderScriptingInterface::getInstance());
scriptEngine->registerGlobalObject("Workload", _gameWorkload._engine->getConfiguration().get()); scriptEngine->registerGlobalObject("Workload", _gameWorkload._engine->getConfiguration().get());
GraphicsScriptingInterface::registerMetaTypes(scriptEngine.get());
scriptEngine->registerGlobalObject("Graphics", DependencyManager::get<GraphicsScriptingInterface>().data()); scriptEngine->registerGlobalObject("Graphics", DependencyManager::get<GraphicsScriptingInterface>().data());
scriptEngine->registerGlobalObject("ScriptDiscoveryService", DependencyManager::get<ScriptEngines>().data()); scriptEngine->registerGlobalObject("ScriptDiscoveryService", DependencyManager::get<ScriptEngines>().data());
@ -7606,10 +7595,8 @@ void Application::registerScriptEngineWithApplicationServices(const ScriptManage
scriptEngine->registerGlobalObject("HifiAbout", AboutUtil::getInstance()); // Deprecated. scriptEngine->registerGlobalObject("HifiAbout", AboutUtil::getInstance()); // Deprecated.
scriptEngine->registerGlobalObject("ResourceRequestObserver", DependencyManager::get<ResourceRequestObserver>().data()); scriptEngine->registerGlobalObject("ResourceRequestObserver", DependencyManager::get<ResourceRequestObserver>().data());
registerInteractiveWindowMetaType(scriptEngine.get());
auto pickScriptingInterface = DependencyManager::get<PickScriptingInterface>(); auto pickScriptingInterface = DependencyManager::get<PickScriptingInterface>();
pickScriptingInterface->registerMetaTypes(scriptEngine.get()); pickScriptingInterface->registerProperties(scriptEngine.get());
// connect this script engines printedMessage signal to the global ScriptEngines these various messages // connect this script engines printedMessage signal to the global ScriptEngines these various messages
auto scriptEngines = DependencyManager::get<ScriptEngines>().data(); auto scriptEngines = DependencyManager::get<ScriptEngines>().data();

View file

@ -5,6 +5,7 @@
// Created by Clement on 1/16/15. // Created by Clement on 1/16/15.
// Copyright 2015 High Fidelity, Inc. // Copyright 2015 High Fidelity, Inc.
// Copyright 2021 Vircadia contributors. // Copyright 2021 Vircadia contributors.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -15,11 +16,18 @@
#include <SettingHandle.h> #include <SettingHandle.h>
#include <Util.h> #include <Util.h>
#include <shared/GlobalAppProperties.h> #include <shared/GlobalAppProperties.h>
#include <ScriptEngineCast.h>
#include "Application.h" #include "Application.h"
#include "ui/DialogsManager.h" #include "ui/DialogsManager.h"
#include "InterfaceLogging.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/" }; const QString LOD_SETTINGS_PREFIX { "lodManager/" };
Setting::Handle<bool> automaticLODAdjust(LOD_SETTINGS_PREFIX + "automaticLODAdjust", (bool)DEFAULT_LOD_AUTO_ADJUST); Setting::Handle<bool> automaticLODAdjust(LOD_SETTINGS_PREFIX + "automaticLODAdjust", (bool)DEFAULT_LOD_AUTO_ADJUST);

View file

@ -4,6 +4,7 @@
// //
// Created by Dante Ruiz on 2019-04-15. // Created by Dante Ruiz on 2019-04-15.
// Copyright 2019 High Fidelity, Inc. // Copyright 2019 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -13,7 +14,15 @@
#include "RefreshRateManager.h" #include "RefreshRateManager.h"
#include <array> #include <array>
#include <ScriptEngineCast.h>
#include <ScriptManager.h>
STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get();
scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass<RefreshRateManager::RefreshRateRegime>, scriptValueToEnumClass<RefreshRateManager::RefreshRateRegime>, "RefreshRateRegime");
scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass<RefreshRateManager::UXMode>, scriptValueToEnumClass<RefreshRateManager::UXMode>, "UXMode");
});
static const int VR_TARGET_RATE = 90; static const int VR_TARGET_RATE = 90;

View file

@ -4,6 +4,7 @@
// //
// Created by Dante Ruiz on 2019-04-15. // Created by Dante Ruiz on 2019-04-15.
// Copyright 2019 High Fidelity, Inc. // Copyright 2019 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -19,9 +20,12 @@
#include <QTimer> #include <QTimer>
#include <SettingHandle.h> #include <SettingHandle.h>
#include <ScriptEngineCast.h>
#include <ScriptManager.h>
#include <shared/ReadWriteLockable.h> #include <shared/ReadWriteLockable.h>
class RefreshRateManager { class RefreshRateManager : QObject {
Q_OBJECT
public: public:
enum RefreshRateProfile { enum RefreshRateProfile {
ECO = 0, ECO = 0,
@ -29,6 +33,7 @@ public:
REALTIME, REALTIME,
PROFILE_NUM PROFILE_NUM
}; };
Q_ENUM(RefreshRateProfile)
static bool isValidRefreshRateProfile(RefreshRateProfile value) { return (value >= RefreshRateProfile::ECO && value <= RefreshRateProfile::REALTIME); } static bool isValidRefreshRateProfile(RefreshRateProfile value) { return (value >= RefreshRateProfile::ECO && value <= RefreshRateProfile::REALTIME); }
/*@jsdoc /*@jsdoc
@ -57,6 +62,7 @@ public:
SHUTDOWN, SHUTDOWN,
REGIME_NUM REGIME_NUM
}; };
Q_ENUM(RefreshRateRegime)
static bool isValidRefreshRateRegime(RefreshRateRegime value) { return (value >= RefreshRateRegime::FOCUS_ACTIVE && value <= RefreshRateRegime::SHUTDOWN); } static bool isValidRefreshRateRegime(RefreshRateRegime value) { return (value >= RefreshRateRegime::FOCUS_ACTIVE && value <= RefreshRateRegime::SHUTDOWN); }
/*@jsdoc /*@jsdoc
@ -77,6 +83,7 @@ public:
VR, VR,
UX_NUM UX_NUM
}; };
Q_ENUM(UXMode)
static bool isValidUXMode(UXMode value) { return (value >= UXMode::DESKTOP && value <= UXMode::VR); } static bool isValidUXMode(UXMode value) { return (value >= UXMode::DESKTOP && value <= UXMode::VR); }
RefreshRateManager(); RefreshRateManager();

View file

@ -5,6 +5,7 @@
// Created by Mark Peng on 8/16/13. // Created by Mark Peng on 8/16/13.
// Copyright 2012 High Fidelity, Inc. // Copyright 2012 High Fidelity, Inc.
// Copyright 2020 Vircadia contributors. // Copyright 2020 Vircadia contributors.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // 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 QString POINT_REF_JOINT_NAME = "RightShoulder";
const float POINT_ALPHA_BLENDING = 1.0f; const float POINT_ALPHA_BLENDING = 1.0f;
STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get();
registerMetaTypes(scriptEngine);
});
const std::array<QString, static_cast<uint>(MyAvatar::AllowAvatarStandingPreference::Count)> const std::array<QString, static_cast<uint>(MyAvatar::AllowAvatarStandingPreference::Count)>
MyAvatar::allowAvatarStandingPreferenceStrings = { MyAvatar::allowAvatarStandingPreferenceStrings = {
QStringLiteral("WhenUserIsStanding"), QStringLiteral("WhenUserIsStanding"),
@ -439,6 +446,11 @@ void MyAvatar::enableHandTouchForID(const QUuid& entityID) {
} }
void MyAvatar::registerMetaTypes(ScriptEnginePointer engine) { 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); ScriptValue value = engine->newQObject(this, ScriptEngine::QtOwnership);
engine->globalObject().setProperty("MyAvatar", value); engine->globalObject().setProperty("MyAvatar", value);
@ -448,11 +460,9 @@ void MyAvatar::registerMetaTypes(ScriptEnginePointer engine) {
driveKeys.setProperty(metaEnum.key(i), metaEnum.value(i)); driveKeys.setProperty(metaEnum.key(i), metaEnum.value(i));
} }
engine->globalObject().setProperty("DriveKeys", driveKeys); engine->globalObject().setProperty("DriveKeys", driveKeys);
scriptRegisterMetaType(engine.get(), audioListenModeToScriptValue, audioListenModeFromScriptValue);
scriptRegisterMetaType(engine.get(), driveKeysToScriptValue, driveKeysFromScriptValue);
} }
void MyAvatar::setOrientationVar(const QVariant& newOrientationVar) { void MyAvatar::setOrientationVar(const QVariant& newOrientationVar) {
Avatar::setWorldOrientation(quatFromVariant(newOrientationVar)); Avatar::setWorldOrientation(quatFromVariant(newOrientationVar));
} }

View file

@ -584,7 +584,8 @@ public:
virtual ~MyAvatar(); virtual ~MyAvatar();
void instantiableAvatar() override {}; void instantiableAvatar() override {};
void registerMetaTypes(ScriptEnginePointer engine); static void registerMetaTypes(ScriptEnginePointer engine);
void registerProperties(ScriptEnginePointer engine);
virtual void simulateAttachments(float deltaTime) override; virtual void simulateAttachments(float deltaTime) override;

View file

@ -1,6 +1,7 @@
// //
// Created by Sam Gondelman 10/20/2017 // Created by Sam Gondelman 10/20/2017
// Copyright 2017 High Fidelity, Inc. // Copyright 2017 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -32,6 +33,12 @@
#include <ScriptEngineCast.h> #include <ScriptEngineCast.h>
#include <ScriptValueUtils.h> #include <ScriptValueUtils.h>
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 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); 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) { void PickScriptingInterface::registerMetaTypes(ScriptEngine* engine) {
scriptRegisterMetaType(engine, pickTypesToScriptValue, pickTypesFromScriptValue);
}
void PickScriptingInterface::registerProperties(ScriptEngine* engine) {
ScriptValue pickTypes = engine->newObject(); ScriptValue pickTypes = engine->newObject();
auto metaEnum = QMetaEnum::fromType<PickQuery::PickType>(); auto metaEnum = QMetaEnum::fromType<PickQuery::PickType>();
for (int i = 0; i < PickQuery::PickType::NUM_PICK_TYPES; ++i) { for (int i = 0; i < PickQuery::PickType::NUM_PICK_TYPES; ++i) {
pickTypes.setProperty(metaEnum.key(i), metaEnum.value(i)); pickTypes.setProperty(metaEnum.key(i), metaEnum.value(i));
} }
engine->globalObject().setProperty("PickType", pickTypes); engine->globalObject().setProperty("PickType", pickTypes);
scriptRegisterMetaType(engine, pickTypesToScriptValue, pickTypesFromScriptValue);
} }
unsigned int PickScriptingInterface::getPerFrameTimeBudget() const { unsigned int PickScriptingInterface::getPerFrameTimeBudget() const {

View file

@ -1,6 +1,7 @@
// //
// Created by Sam Gondelman 10/20/2017 // Created by Sam Gondelman 10/20/2017
// Copyright 2017 High Fidelity, Inc. // Copyright 2017 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // 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 SINGLETON_DEPENDENCY
public: public:
void registerMetaTypes(ScriptEngine* engine); static void registerMetaTypes(ScriptEngine* engine);
void registerProperties(ScriptEngine* engine);
/*@jsdoc /*@jsdoc
* Creates a new pick. Different {@link PickType}s use different properties, and within one PickType the properties you * Creates a new pick. Different {@link PickType}s use different properties, and within one PickType the properties you

View file

@ -4,6 +4,7 @@
// //
// Created by Thijs Wenker on 9/10/14. // Created by Thijs Wenker on 9/10/14.
// Copyright 2014 High Fidelity, Inc. // Copyright 2014 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -11,11 +12,19 @@
#include "AccountServicesScriptingInterface.h" #include "AccountServicesScriptingInterface.h"
#include <ScriptEngineCast.h>
#include "AccountManager.h" #include "AccountManager.h"
#include "Application.h" #include "Application.h"
#include "DiscoverabilityManager.h" #include "DiscoverabilityManager.h"
#include "ResourceCache.h" #include "ResourceCache.h"
STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get();
scriptRegisterMetaType(scriptEngine, DownloadInfoResultToScriptValue, DownloadInfoResultFromScriptValue);
});
AccountServicesScriptingInterface::AccountServicesScriptingInterface() { AccountServicesScriptingInterface::AccountServicesScriptingInterface() {
auto accountManager = DependencyManager::get<AccountManager>(); auto accountManager = DependencyManager::get<AccountManager>();
connect(accountManager.data(), &AccountManager::usernameChanged, this, &AccountServicesScriptingInterface::onUsernameChanged); connect(accountManager.data(), &AccountManager::usernameChanged, this, &AccountServicesScriptingInterface::onUsernameChanged);

View file

@ -14,7 +14,7 @@
#include "../Application.h" #include "../Application.h"
STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager){ STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get(); auto scriptEngine = manager->engine().get();
scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass<PerformanceScriptingInterface::PerformancePreset>, scriptValueToEnumClass<PerformanceScriptingInterface::PerformancePreset>, "PerformancePreset"); scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass<PerformanceScriptingInterface::PerformancePreset>, scriptValueToEnumClass<PerformanceScriptingInterface::PerformancePreset>, "PerformancePreset");

View file

@ -21,7 +21,7 @@
#include <sstream> #include <sstream>
#endif #endif
STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager){ STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get(); auto scriptEngine = manager->engine().get();
scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass<PlatformInfoScriptingInterface::PlatformTier>, scriptValueToEnumClass<PlatformInfoScriptingInterface::PlatformTier>, "PlatformTier"); scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass<PlatformInfoScriptingInterface::PlatformTier>, scriptValueToEnumClass<PlatformInfoScriptingInterface::PlatformTier>, "PlatformTier");

View file

@ -12,10 +12,11 @@
#include "LightingModel.h" #include "LightingModel.h"
STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager){ STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get(); auto scriptEngine = manager->engine().get();
scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass<RenderScriptingInterface::RenderMethod>, scriptValueToEnumClass<RenderScriptingInterface::RenderMethod>, "RenderMethod"); scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass<RenderScriptingInterface::RenderMethod>, scriptValueToEnumClass<RenderScriptingInterface::RenderMethod>, "RenderMethod");
scriptRegisterMetaType(scriptEngine, scriptValueFromEnumClass<AntialiasingConfig::Mode>, scriptValueToEnumClass<AntialiasingConfig::Mode>, "Mode");
}); });
RenderScriptingInterface* RenderScriptingInterface::getInstance() { RenderScriptingInterface* RenderScriptingInterface::getInstance() {

View file

@ -4,6 +4,7 @@
// //
// Created by Thijs Wenker on 2018-06-25 // Created by Thijs Wenker on 2018-06-25
// Copyright 2018 High Fidelity, Inc. // Copyright 2018 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -35,6 +36,12 @@
#include <WinUser.h> #include <WinUser.h>
#endif #endif
STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get();
registerInteractiveWindowMetaType(scriptEngine);
});
static auto CONTENT_WINDOW_QML = QUrl("InteractiveWindow.qml"); static auto CONTENT_WINDOW_QML = QUrl("InteractiveWindow.qml");
static const char* const ADDITIONAL_FLAGS_PROPERTY = "additionalFlags"; static const char* const ADDITIONAL_FLAGS_PROPERTY = "additionalFlags";

View file

@ -3,6 +3,7 @@
// interface/src/ui/overlays // interface/src/ui/overlays
// //
// Copyright 2014 High Fidelity, Inc. // Copyright 2014 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // 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<QString, QString> Overlays::_entityToOverlayTypes; std::unordered_map<QString, QString> Overlays::_entityToOverlayTypes;
std::unordered_map<QString, QString> Overlays::_overlayToEntityTypes; std::unordered_map<QString, QString> Overlays::_overlayToEntityTypes;
STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get();
scriptRegisterMetaType(scriptEngine, RayToOverlayIntersectionResultToScriptValue,
RayToOverlayIntersectionResultFromScriptValue);
});
Overlays::Overlays() : _scriptEngine(newScriptEngine()) { Overlays::Overlays() : _scriptEngine(newScriptEngine()) {
ADD_TYPE_MAP(Box, cube); ADD_TYPE_MAP(Box, cube);
ADD_TYPE_MAP(Sphere, sphere); ADD_TYPE_MAP(Sphere, sphere);

View file

@ -4,6 +4,7 @@
// //
// Created by Andrzej Kapolka on 4/17/14. // Created by Andrzej Kapolka on 4/17/14.
// Copyright (c) 2014 High Fidelity, Inc. All rights reserved. // Copyright (c) 2014 High Fidelity, Inc. All rights reserved.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -18,10 +19,14 @@
#include "AnimationCache.h" #include "AnimationCache.h"
STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager) {
registerAnimationTypes(manager->engine().get()); registerAnimationTypes(manager->engine().get());
}); });
STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) {
registerAnimationPrototypes(manager->engine().get());
});
QStringList AnimationObject::getJointNames() const { QStringList AnimationObject::getJointNames() const {
return scriptvalue_cast<AnimationPointer>(thisObject())->getJointNames(); return scriptvalue_cast<AnimationPointer>(thisObject())->getJointNames();
} }
@ -36,9 +41,11 @@ QVector<glm::quat> AnimationFrameObject::getRotations() const {
void registerAnimationTypes(ScriptEngine* engine) { void registerAnimationTypes(ScriptEngine* engine) {
scriptRegisterSequenceMetaType<QVector<HFMAnimationFrame> >(engine); scriptRegisterSequenceMetaType<QVector<HFMAnimationFrame> >(engine);
}
void registerAnimationPrototypes(ScriptEngine* engine) {
engine->setDefaultPrototype(qMetaTypeId<HFMAnimationFrame>(), engine->newQObject( engine->setDefaultPrototype(qMetaTypeId<HFMAnimationFrame>(), engine->newQObject(
new AnimationFrameObject(), ScriptEngine::ScriptOwnership)); new AnimationFrameObject(), ScriptEngine::ScriptOwnership));
engine->setDefaultPrototype(qMetaTypeId<AnimationPointer>(), engine->newQObject( engine->setDefaultPrototype(qMetaTypeId<AnimationPointer>(), engine->newQObject(
new AnimationObject(), ScriptEngine::ScriptOwnership)); new AnimationObject(), ScriptEngine::ScriptOwnership));
} }

View file

@ -4,6 +4,7 @@
// //
// Created by Andrzej Kapolka on 4/17/14. // Created by Andrzej Kapolka on 4/17/14.
// Copyright (c) 2014 High Fidelity, Inc. All rights reserved. // Copyright (c) 2014 High Fidelity, Inc. All rights reserved.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // 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 registerAnimationTypes(ScriptEngine* engine);
void registerAnimationPrototypes(ScriptEngine* engine);
#endif // hifi_AnimationObject_h #endif // hifi_AnimationObject_h

View file

@ -3,6 +3,7 @@
// libraries/audio/src // libraries/audio/src
// //
// Copyright 2013 High Fidelity, Inc. // Copyright 2013 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -14,14 +15,31 @@
#include <ScriptEngine.h> #include <ScriptEngine.h>
#include <ScriptManager.h> #include <ScriptManager.h>
#include <ScriptValue.h> #include <ScriptValue.h>
#include <ScriptEngineCast.h>
STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager) {
auto scriptEngine = manager->engine().get();
scriptRegisterMetaType(scriptEngine, audioEffectOptionsToScriptValue, audioEffectOptionsFromScriptValue);
});
STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) {
auto scriptEngine = manager->engine(); auto scriptEngine = manager->engine().get();
ScriptValue audioEffectOptionsConstructorValue = scriptEngine->newFunction(AudioEffectOptions::constructor); ScriptValue audioEffectOptionsConstructorValue = scriptEngine->newFunction(AudioEffectOptions::constructor);
scriptEngine->globalObject().setProperty("AudioEffectOptions", audioEffectOptionsConstructorValue); 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 BANDWIDTH_HANDLE = "bandwidth";
static const QString PRE_DELAY_HANDLE = "preDelay"; static const QString PRE_DELAY_HANDLE = "preDelay";
static const QString LATE_DELAY_HANDLE = "lateDelay"; static const QString LATE_DELAY_HANDLE = "lateDelay";

View file

@ -3,6 +3,7 @@
// libraries/audio/src // libraries/audio/src
// //
// Copyright 2013 High Fidelity, Inc. // Copyright 2013 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // 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 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 #endif // hifi_AudioEffectOptions_h

View file

@ -4,6 +4,7 @@
// //
// Created by Stephen Birarda on 1/2/2014. // Created by Stephen Birarda on 1/2/2014.
// Copyright 2014 High Fidelity, Inc. // Copyright 2014 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -21,15 +22,18 @@
#include <ScriptEngineLogging.h> #include <ScriptEngineLogging.h>
#include <ScriptManager.h> #include <ScriptManager.h>
STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get();
registerAudioMetaTypes(scriptEngine);
});
STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager){ STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get(); auto scriptEngine = manager->engine().get();
registerAudioMetaTypes(scriptEngine);
scriptEngine->registerGlobalObject("Audio", DependencyManager::get<AudioScriptingInterface>().data()); scriptEngine->registerGlobalObject("Audio", DependencyManager::get<AudioScriptingInterface>().data());
}); });
void registerAudioMetaTypes(ScriptEngine* engine) { void registerAudioMetaTypes(ScriptEngine* engine) {
scriptRegisterMetaType(engine, injectorOptionsToScriptValue, injectorOptionsFromScriptValue); scriptRegisterMetaType(engine, injectorOptionsToScriptValue, injectorOptionsFromScriptValue);
scriptRegisterMetaType(engine, soundSharedPointerToScriptValue, soundSharedPointerFromScriptValue); scriptRegisterMetaType(engine, soundSharedPointerToScriptValue, soundSharedPointerFromScriptValue);

View file

@ -4,6 +4,7 @@
// //
// Created by Stephen Birarda on 2015-02-11. // Created by Stephen Birarda on 2015-02-11.
// Copyright 2015 High Fidelity, Inc. // Copyright 2015 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -17,7 +18,7 @@
#include <ScriptManager.h> #include <ScriptManager.h>
#include <ScriptValue.h> #include <ScriptValue.h>
STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager) {
auto scriptEngine = manager->engine().get(); auto scriptEngine = manager->engine().get();
scriptRegisterMetaType(scriptEngine, injectorToScriptValue, injectorFromScriptValue); scriptRegisterMetaType(scriptEngine, injectorToScriptValue, injectorFromScriptValue);

View file

@ -4,6 +4,7 @@
// //
// Created by Stephen Birarda on 4/9/13. // Created by Stephen Birarda on 4/9/13.
// Copyright 2013 High Fidelity, Inc. // Copyright 2013 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // 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) #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(); auto scriptEngine = manager->engine().get();
registerAvatarTypes(scriptEngine); registerAvatarTypes(scriptEngine);
@ -76,6 +77,12 @@ STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) {
scriptRegisterMetaType(scriptEngine, AvatarEntityMapToScriptValue, AvatarEntityMapFromScriptValue); scriptRegisterMetaType(scriptEngine, AvatarEntityMapToScriptValue, AvatarEntityMapFromScriptValue);
}); });
STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) {
auto scriptEngine = manager->engine().get();
registerAvatarPrototypes(scriptEngine);
});
size_t AvatarDataPacket::maxFaceTrackerInfoSize(size_t numBlendshapeCoefficients) { size_t AvatarDataPacket::maxFaceTrackerInfoSize(size_t numBlendshapeCoefficients) {
return FACE_TRACKER_INFO_SIZE + numBlendshapeCoefficients * sizeof(float); return FACE_TRACKER_INFO_SIZE + numBlendshapeCoefficients * sizeof(float);
} }
@ -2609,6 +2616,9 @@ bool AttachmentDataObject::getIsSoft() const {
void registerAvatarTypes(ScriptEngine* engine) { void registerAvatarTypes(ScriptEngine* engine) {
scriptRegisterSequenceMetaType<QVector<AttachmentData> >(engine); scriptRegisterSequenceMetaType<QVector<AttachmentData> >(engine);
}
void registerAvatarPrototypes(ScriptEngine* engine) {
engine->setDefaultPrototype(qMetaTypeId<AttachmentData>(), engine->newQObject( engine->setDefaultPrototype(qMetaTypeId<AttachmentData>(), engine->newQObject(
new AttachmentDataObject(), ScriptEngine::ScriptOwnership)); new AttachmentDataObject(), ScriptEngine::ScriptOwnership));
} }

View file

@ -1958,6 +1958,7 @@ public:
}; };
void registerAvatarTypes(ScriptEngine* engine); void registerAvatarTypes(ScriptEngine* engine);
void registerAvatarPrototypes(ScriptEngine* engine);
class RayToAvatarIntersectionResult { class RayToAvatarIntersectionResult {
public: public:

View file

@ -4,6 +4,7 @@
// //
// Created by Zach Fox on 2017-04-10. // Created by Zach Fox on 2017-04-10.
// Copyright 2017 High Fidelity, Inc. // Copyright 2017 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // 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; return false;
} }
STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager) {
auto scriptEngine = manager->engine().get(); auto scriptEngine = manager->engine().get();
scriptRegisterMetaType(scriptEngine, avatarDataToScriptValue, avatarDataFromScriptValue); scriptRegisterMetaType(scriptEngine, avatarDataToScriptValue, avatarDataFromScriptValue);

View file

@ -1,6 +1,7 @@
// //
// Created by Bradley Austin Davis 2015/10/09 // Created by Bradley Austin Davis 2015/10/09
// Copyright 2015 High Fidelity, Inc. // Copyright 2015 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // 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; return true;
} }
STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager) { STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager) {
auto scriptEngine = manager->engine().get(); auto scriptEngine = manager->engine().get();
scriptRegisterMetaType(scriptEngine, inputControllerToScriptValue, inputControllerFromScriptValue); scriptRegisterMetaType(scriptEngine, inputControllerToScriptValue, inputControllerFromScriptValue);

View file

@ -4,6 +4,7 @@
// //
// Created by Brad Hefta-Gaub on 12/6/13. // Created by Brad Hefta-Gaub on 12/6/13.
// Copyright 2013 High Fidelity, Inc. // Copyright 2013 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // 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 GRABBABLE_USER_DATA = "{\"grabbableKey\":{\"grabbable\":true}}";
const QString NOT_GRABBABLE_USER_DATA = "{\"grabbableKey\":{\"grabbable\":false}}"; const QString NOT_GRABBABLE_USER_DATA = "{\"grabbableKey\":{\"grabbable\":false}}";
void staticEntityScriptInitializer(ScriptManager* manager) { void staticEntityScriptTypesInitializer(ScriptManager* manager) {
auto scriptEngine = manager->engine().get(); auto scriptEngine = manager->engine().get();
auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
entityScriptingInterface->init();
auto interfacePtr = entityScriptingInterface.data(); // using this when we don't want to leak a reference
registerMetaTypes(scriptEngine); registerMetaTypes(scriptEngine);
scriptRegisterMetaType(scriptEngine, EntityPropertyFlagsToScriptValue, EntityPropertyFlagsFromScriptValue); scriptRegisterMetaType(scriptEngine, EntityPropertyFlagsToScriptValue, EntityPropertyFlagsFromScriptValue);
@ -62,6 +59,15 @@ void staticEntityScriptInitializer(ScriptManager* manager) {
scriptRegisterMetaType(scriptEngine, EntityPropertyInfoToScriptValue, EntityPropertyInfoFromScriptValue); scriptRegisterMetaType(scriptEngine, EntityPropertyInfoToScriptValue, EntityPropertyInfoFromScriptValue);
scriptRegisterMetaType(scriptEngine, EntityItemIDtoScriptValue, EntityItemIDfromScriptValue); scriptRegisterMetaType(scriptEngine, EntityItemIDtoScriptValue, EntityItemIDfromScriptValue);
scriptRegisterMetaType(scriptEngine, RayToEntityIntersectionResultToScriptValue, RayToEntityIntersectionResultFromScriptValue); scriptRegisterMetaType(scriptEngine, RayToEntityIntersectionResultToScriptValue, RayToEntityIntersectionResultFromScriptValue);
}
STATIC_SCRIPT_TYPES_INITIALIZER(staticEntityScriptTypesInitializer);
void staticEntityScriptInitializer(ScriptManager* manager) {
auto scriptEngine = manager->engine().get();
auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
entityScriptingInterface->init();
auto interfacePtr = entityScriptingInterface.data(); // using this when we don't want to leak a reference
scriptEngine->registerGlobalObject("Entities", entityScriptingInterface.data()); scriptEngine->registerGlobalObject("Entities", entityScriptingInterface.data());
scriptEngine->registerFunction("Entities", "getMultipleEntityProperties", EntityScriptingInterface::getMultipleEntityProperties); scriptEngine->registerFunction("Entities", "getMultipleEntityProperties", EntityScriptingInterface::getMultipleEntityProperties);

View file

@ -3,6 +3,7 @@
// libraries/graphics-scripting/src // libraries/graphics-scripting/src
// //
// Copyright 2017 High Fidelity, Inc. // Copyright 2017 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -19,6 +20,7 @@
#include <QUuid> #include <QUuid>
#include <ScriptEngine.h> #include <ScriptEngine.h>
#include <ScriptEngineCast.h> #include <ScriptEngineCast.h>
#include <ScriptManager.h>
#include <ScriptValue.h> #include <ScriptValue.h>
#include <ScriptValueUtils.h> #include <ScriptValueUtils.h>
#include <graphics/BufferViewHelpers.h> #include <graphics/BufferViewHelpers.h>
@ -26,6 +28,13 @@
#include <shared/QtHelpers.h> #include <shared/QtHelpers.h>
#include <SpatiallyNestable.h> #include <SpatiallyNestable.h>
STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get();
GraphicsScriptingInterface::registerMetaTypes(scriptEngine);
});
GraphicsScriptingInterface::GraphicsScriptingInterface(QObject* parent) : QObject(parent), Scriptable() { GraphicsScriptingInterface::GraphicsScriptingInterface(QObject* parent) : QObject(parent), Scriptable() {
} }

View file

@ -214,6 +214,7 @@ public:
Suggestions, Suggestions,
VisitUserFromPAL VisitUserFromPAL
}; };
Q_ENUM(LookupTrigger)
bool isConnected(); bool isConnected();
QString getProtocol() const; QString getProtocol() const;

View file

@ -76,12 +76,12 @@ int scriptRegisterMetaType(ScriptEngine* eng,
if (strlen(name) > 0) { // make sure it's registered if (strlen(name) > 0) { // make sure it's registered
id = qRegisterMetaType<T>(name); id = qRegisterMetaType<T>(name);
} else { } else {
if (!QMetaType::fromType<T>().name().isNull()) { //if (!QMetaType::fromType<T>().name().isNull()) {
qDebug() << "scriptRegisterMetaType: " << QMetaType::fromType<T>().name(); //qDebug() << "scriptRegisterMetaType: " << QMetaType::fromType<T>().name();
id = qRegisterMetaType<T>(QMetaType::fromType<T>().name()); //id = qRegisterMetaType<T>(QMetaType::fromType<T>().name());
}else{ //}else{
id = qRegisterMetaType<T>(); id = qRegisterMetaType<T>();
} //}
} }
eng->registerCustomType(id, reinterpret_cast<ScriptEngine::MarshalFunction>(toScriptValue), eng->registerCustomType(id, reinterpret_cast<ScriptEngine::MarshalFunction>(toScriptValue),
reinterpret_cast<ScriptEngine::DemarshalFunction>(fromScriptValue)); reinterpret_cast<ScriptEngine::DemarshalFunction>(fromScriptValue));

View file

@ -4,6 +4,7 @@
// //
// Created by Brad Hefta-Gaub on 12/14/13. // Created by Brad Hefta-Gaub on 12/14/13.
// Copyright 2013 High Fidelity, Inc. // Copyright 2013 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // 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 script initialization registry
static ScriptManager::StaticInitializerNode* rootInitializer = nullptr; static ScriptManager::StaticInitializerNode* rootInitializer = nullptr;
static ScriptManager::StaticTypesInitializerNode* rootTypesInitializer = nullptr;
void ScriptManager::registerNewStaticInitializer(StaticInitializerNode* dest) { void ScriptManager::registerNewStaticInitializer(StaticInitializerNode* dest) {
// this function is assumed to be called on LoadLibrary, where we are explicitly operating in single-threaded mode // 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; 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) { const QString& fileNameString) {
ScriptManagerPointer manager(new ScriptManager(context, scriptContents, fileNameString), ScriptManagerPointer manager(new ScriptManager(context, scriptContents, fileNameString),
[](ScriptManager* obj) { obj->deleteLater(); }); [](ScriptManager* obj) { obj->deleteLater(); });
ScriptEnginePointer engine = newScriptEngine(manager.get());
manager->_engine = engine;
return manager; return manager;
} }
int ScriptManager::processLevelMaxRetries { ScriptRequest::MAX_RETRIES }; int ScriptManager::processLevelMaxRetries { ScriptRequest::MAX_RETRIES };
ScriptManager::ScriptManager(Context context, const QString& scriptContents, const QString& fileNameString) : ScriptManager::ScriptManager(Context context, const QString& scriptContents, const QString& fileNameString) :
QObject(), QObject(),
_context(context), _context(context),
@ -267,6 +281,10 @@ ScriptManager::ScriptManager(Context context, const QString& scriptContents, con
} }
}); });
} }
if (!_areMetaTypesInitialized) {
initMetaTypes();
}
} }
QString ScriptManager::getTypeAsString() const { QString ScriptManager::getTypeAsString() const {
@ -615,17 +633,13 @@ void ScriptManager::resetModuleCache(bool deleteScriptCache) {
jsRequire.setProperty("cache", cache, READONLY_PROP_FLAGS); jsRequire.setProperty("cache", cache, READONLY_PROP_FLAGS);
} }
void ScriptManager::init() { void ScriptManager::initMetaTypes() {
if (_isInitialized) { if (_areMetaTypesInitialized) {
return; // only initialize once return;
} }
_areMetaTypesInitialized = true;
_isInitialized = true;
runStaticInitializers(this);
auto scriptEngine = _engine.get(); auto scriptEngine = _engine.get();
runStaticTypesInitializers(this);
// register various meta-types
registerMIDIMetaTypes(scriptEngine); registerMIDIMetaTypes(scriptEngine);
registerEventTypes(scriptEngine); registerEventTypes(scriptEngine);
registerMenuItemProperties(scriptEngine); registerMenuItemProperties(scriptEngine);
@ -636,6 +650,29 @@ void ScriptManager::init() {
scriptRegisterSequenceMetaType<QVector<glm::vec2>>(scriptEngine); scriptRegisterSequenceMetaType<QVector<glm::vec2>>(scriptEngine);
scriptRegisterSequenceMetaType<QVector<glm::quat>>(scriptEngine); scriptRegisterSequenceMetaType<QVector<glm::quat>>(scriptEngine);
scriptRegisterSequenceMetaType<QVector<QString>>(scriptEngine); scriptRegisterSequenceMetaType<QVector<QString>>(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); ScriptValue xmlHttpRequestConstructorValue = scriptEngine->newFunction(XMLHttpRequestClass::constructor);
scriptEngine->globalObject().setProperty("XMLHttpRequest", xmlHttpRequestConstructorValue); scriptEngine->globalObject().setProperty("XMLHttpRequest", xmlHttpRequestConstructorValue);
@ -652,11 +689,6 @@ void ScriptManager::init() {
*/ */
scriptEngine->globalObject().setProperty("print", scriptEngine->newFunction(debugPrint)); 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 // 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). // 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(); resetModuleCache();
} }
scriptRegisterMetaType(scriptEngine, externalResourceBucketToScriptValue, externalResourceBucketFromScriptValue);
scriptEngine->registerEnum("Script.ExternalPaths", QMetaEnum::fromType<ExternalResource::Bucket>()); scriptEngine->registerEnum("Script.ExternalPaths", QMetaEnum::fromType<ExternalResource::Bucket>());
scriptEngine->registerGlobalObject("Quat", &_quatLibrary); scriptEngine->registerGlobalObject("Quat", &_quatLibrary);
@ -696,7 +727,6 @@ void ScriptManager::init() {
auto resourcePrototype = createScriptableResourcePrototype(shared_from_this()); auto resourcePrototype = createScriptableResourcePrototype(shared_from_this());
scriptEngine->globalObject().setProperty("Resource", resourcePrototype); scriptEngine->globalObject().setProperty("Resource", resourcePrototype);
scriptEngine->setDefaultPrototype(qMetaTypeId<ScriptableResource*>(), resourcePrototype); scriptEngine->setDefaultPrototype(qMetaTypeId<ScriptableResource*>(), resourcePrototype);
scriptRegisterMetaType(scriptEngine, scriptableResourceToScriptValue, scriptableResourceFromScriptValue);
// constants // constants
scriptEngine->globalObject().setProperty("TREE_SCALE", scriptEngine->newValue(TREE_SCALE)); scriptEngine->globalObject().setProperty("TREE_SCALE", scriptEngine->newValue(TREE_SCALE));
@ -706,9 +736,6 @@ void ScriptManager::init() {
scriptEngine->registerGlobalObject("DebugDraw", &DebugDraw::getInstance()); scriptEngine->registerGlobalObject("DebugDraw", &DebugDraw::getInstance());
scriptRegisterMetaType(scriptEngine, meshToScriptValue, meshFromScriptValue);
scriptRegisterMetaType(scriptEngine, meshesToScriptValue, meshesFromScriptValue);
scriptEngine->registerGlobalObject("UserActivityLogger", DependencyManager::get<UserActivityLoggerScriptingInterface>().data()); scriptEngine->registerGlobalObject("UserActivityLogger", DependencyManager::get<UserActivityLoggerScriptingInterface>().data());
#if DEV_BUILD || PR_BUILD #if DEV_BUILD || PR_BUILD

View file

@ -5,6 +5,7 @@
// Created by Brad Hefta-Gaub on 12/14/13. // Created by Brad Hefta-Gaub on 12/14/13.
// Copyright 2013 High Fidelity, Inc. // Copyright 2013 High Fidelity, Inc.
// Copyright 2020 Vircadia contributors. // Copyright 2020 Vircadia contributors.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // 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") }; 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) \ #define STATIC_SCRIPT_INITIALIZER(init) \
static ScriptManager::StaticInitializerNode static_script_initializer_(init); static ScriptManager::StaticInitializerNode static_script_initializer_(init);
@ -179,6 +183,13 @@ public:
}; };
static void registerNewStaticInitializer(StaticInitializerNode* dest); 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 /// 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 /// the current script contents and calling run(). Callers will likely want to register the script with external
/// services before calling this. /// services before calling this.
@ -874,6 +885,9 @@ signals:
void releaseEntityPacketSenderMessages(bool wait); void releaseEntityPacketSenderMessages(bool wait);
protected: protected:
// Is called by the constructor, bceause all types need to be registered before method discovery with ScriptObjectQtProxy::investigate()
void initMetaTypes();
void init(); void init();
/**jsdoc /**jsdoc
@ -934,6 +948,7 @@ protected:
std::atomic<bool> _isFinished { false }; std::atomic<bool> _isFinished { false };
std::atomic<bool> _isRunning { false }; std::atomic<bool> _isRunning { false };
std::atomic<bool> _isStopping { false }; std::atomic<bool> _isStopping { false };
bool _areMetaTypesInitialized { false };
bool _isInitialized { false }; bool _isInitialized { false };
QHash<QTimer*, CallbackData> _timerFunctionMap; QHash<QTimer*, CallbackData> _timerFunctionMap;
QSet<QUrl> _includedURLs; QSet<QUrl> _includedURLs;

View file

@ -42,6 +42,7 @@ void ScriptEngineQtScript::registerCustomType(int type,
CustomMarshal& customType = _customTypes.insert(type, CustomMarshal()).value(); CustomMarshal& customType = _customTypes.insert(type, CustomMarshal()).value();
customType.demarshalFunc = demarshalFunc; customType.demarshalFunc = demarshalFunc;
customType.marshalFunc = marshalFunc; customType.marshalFunc = marshalFunc;
qDebug() << "registerCustomType: " << QMetaType(type).name() << " type: " << type << " map size: " << _customTypes.size();
} }
Q_DECLARE_METATYPE(ScriptValue); 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<ScriptValue>()) { if (destTypeId == qMetaTypeId<ScriptValue>()) {
dest = QVariant::fromValue(ScriptValue(new ScriptValueQtWrapper(this, val))); dest = QVariant::fromValue(ScriptValue(new ScriptValueQtWrapper(this, val)));

View file

@ -134,6 +134,7 @@ void ScriptObjectQtProxy::investigate() {
if (!qobject) return; if (!qobject) return;
const QMetaObject* metaObject = qobject->metaObject(); const QMetaObject* metaObject = qobject->metaObject();
qDebug() << "ScriptObjectQtProxy::investigate: " << metaObject->className();
// discover properties // discover properties
int startIdx = _wrapOptions & ScriptEngine::ExcludeSuperClassProperties ? metaObject->propertyOffset() : 0; int startIdx = _wrapOptions & ScriptEngine::ExcludeSuperClassProperties ? metaObject->propertyOffset() : 0;

View file

@ -1,6 +1,7 @@
// //
// Created by Anthony J. Thibault on 2016-12-12 // Created by Anthony J. Thibault on 2016-12-12
// Copyright 2013-2016 High Fidelity, Inc. // Copyright 2013-2016 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -17,6 +18,8 @@
#include <DependencyManager.h> #include <DependencyManager.h>
#include <AccountManager.h> #include <AccountManager.h>
#include <RegisteredMetaTypes.h> #include <RegisteredMetaTypes.h>
#include <ScriptManager.h>
#include <ScriptEngineCast.h>
#include "../QmlWindowClass.h" #include "../QmlWindowClass.h"
#include "../OffscreenUi.h" #include "../OffscreenUi.h"
@ -28,6 +31,14 @@
#include "SettingHandle.h" #include "SettingHandle.h"
STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get();
scriptRegisterMetaType(scriptEngine, wrapperToScriptValue<TabletProxy>, wrapperFromScriptValue<TabletProxy>);
scriptRegisterMetaType(scriptEngine,
wrapperToScriptValue<TabletButtonProxy>, wrapperFromScriptValue<TabletButtonProxy>);
});
// FIXME move to global app properties // FIXME move to global app properties
const QString SYSTEM_TOOLBAR = "com.highfidelity.interface.toolbar.system"; const QString SYSTEM_TOOLBAR = "com.highfidelity.interface.toolbar.system";
const QString SYSTEM_TABLET = "com.highfidelity.interface.tablet.system"; const QString SYSTEM_TABLET = "com.highfidelity.interface.tablet.system";

View file

@ -1,6 +1,7 @@
// //
// Created by Bradley Austin Davis on 2016-06-16 // Created by Bradley Austin Davis on 2016-06-16
// Copyright 2013-2016 High Fidelity, Inc. // Copyright 2013-2016 High Fidelity, Inc.
// Copyright 2022 Overte e.V.
// //
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -12,10 +13,20 @@
#include <QtQuick/QQuickItem> #include <QtQuick/QQuickItem>
#include <ScriptValue.h> #include <ScriptValue.h>
#include <ScriptEngine.h> #include <ScriptEngine.h>
#include <ScriptEngineCast.h>
#include <ScriptManager.h>
#include <shared/QtHelpers.h> #include <shared/QtHelpers.h>
#include "../OffscreenUi.h" #include "../OffscreenUi.h"
STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){
auto scriptEngine = manager->engine().get();
scriptRegisterMetaType(scriptEngine, wrapperToScriptValue<ToolbarProxy>, wrapperFromScriptValue<ToolbarProxy>);
scriptRegisterMetaType(scriptEngine,
wrapperToScriptValue<ToolbarButtonProxy>, wrapperFromScriptValue<ToolbarButtonProxy>);
});
ScriptValue toolbarToScriptValue(ScriptEngine* engine, ToolbarProxy* const &in) { ScriptValue toolbarToScriptValue(ScriptEngine* engine, ToolbarProxy* const &in) {
if (!in) { if (!in) {
return engine->undefinedValue(); return engine->undefinedValue();