diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index e28c04379f..b49a47a071 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -343,6 +343,9 @@ void Agent::executeScript() { // give this AvatarData object to the script engine _scriptEngine->registerGlobalObject("Avatar", scriptedAvatar.data()); + // register meta types for retrieval of ScriptAvatarData objects + qScriptRegisterMetaType(_scriptEngine, avatarDataToScriptValue, avatarDataFromScriptValue); + auto player = DependencyManager::get(); connect(player.data(), &recording::Deck::playbackStateChanged, [=] { if (player->isPlaying()) { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7cf42a7759..3ef83af68d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -129,6 +129,7 @@ #include "AudioClient.h" #include "audio/AudioScope.h" #include "avatar/AvatarManager.h" +#include "avatar/ScriptAvatar.h" #include "CrashHandler.h" #include "devices/DdeFaceTracker.h" #include "devices/EyeTracker.h" @@ -5437,6 +5438,9 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri // AvatarManager has some custom types AvatarManager::registerMetaTypes(scriptEngine); + // register meta types for retrieval of Avatar objects + qScriptRegisterMetaType(scriptEngine, avatarToScriptValue, avatarFromScriptValue); + if (property(hifi::properties::TEST).isValid()) { scriptEngine->registerGlobalObject("Test", TestScriptingInterface::getInstance()); } diff --git a/interface/src/avatar/ScriptAvatar.cpp b/interface/src/avatar/ScriptAvatar.cpp new file mode 100644 index 0000000000..2684af3c86 --- /dev/null +++ b/interface/src/avatar/ScriptAvatar.cpp @@ -0,0 +1,156 @@ +// +// ScriptAvatar.cpp +// interface/src/avatars +// +// Created by Stephen Birarda on 4/10/17. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "ScriptAvatar.h" + +QScriptValue avatarToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in) { + return engine->newQObject(new ScriptAvatar(in), QScriptEngine::ScriptOwnership); +} + +void avatarFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out) { + // This is not implemented because there are no slots/properties that take an std::shared_ptr from a script + assert(false); + out = std::shared_ptr(); +} + +ScriptAvatar::ScriptAvatar(AvatarSharedPointer avatarData) : + ScriptAvatarData(avatarData) +{ + +} + +std::shared_ptr ScriptAvatar::lockAvatar() const { + if (auto lockedAvatarData = _avatarData.lock()) { + return std::dynamic_pointer_cast(lockedAvatarData); + } else { + return std::shared_ptr(); + } +} + +glm::quat ScriptAvatar::getDefaultJointRotation(int index) const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getDefaultJointRotation(index); + } else { + return glm::quat(); + } +} + +glm::vec3 ScriptAvatar::getDefaultJointTranslation(int index) const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getDefaultJointTranslation(index); + } else { + return glm::vec3(); + } +} + +glm::vec3 ScriptAvatar::getSkeletonOffset() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getSkeletonOffset(); + } else { + return glm::vec3(); + } +} + +glm::vec3 ScriptAvatar::getJointPosition(int index) const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getJointPosition(index); + } else { + return glm::vec3(); + } +} + +glm::vec3 ScriptAvatar::getJointPosition(const QString& name) const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getJointPosition(name); + } else { + return glm::vec3(); + } +} + +glm::vec3 ScriptAvatar::getNeckPosition() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getNeckPosition(); + } else { + return glm::vec3(); + } +} + +glm::vec3 ScriptAvatar::getAcceleration() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getAcceleration(); + } else { + return glm::vec3(); + } +} + +QUuid ScriptAvatar::getParentID() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getParentID(); + } else { + return QUuid(); + } +} + +quint16 ScriptAvatar::getParentJointIndex() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getParentJointIndex(); + } else { + return INVALID_JOINT_INDEX; + } +} + +QVariantList ScriptAvatar::getSkeleton() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getSkeleton(); + } else { + return QVariantList(); + } +} + +float ScriptAvatar::getSimulationRate(const QString& rateName) const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getSimulationRate(rateName); + } else { + return 0.0f;; + } +} + +glm::vec3 ScriptAvatar::getLeftPalmPosition() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getLeftPalmPosition(); + } else { + return glm::vec3(); + } +} + +glm::quat ScriptAvatar::getLeftPalmRotation() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getLeftPalmRotation(); + } else { + return glm::quat(); + } +} + +glm::vec3 ScriptAvatar::getRightPalmPosition() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getRightPalmPosition(); + } else { + return glm::vec3(); + } +} + +glm::quat ScriptAvatar::getRightPalmRotation() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getRightPalmRotation(); + } else { + return glm::quat(); + } +} diff --git a/interface/src/avatar/ScriptAvatar.h b/interface/src/avatar/ScriptAvatar.h new file mode 100644 index 0000000000..c4011803fa --- /dev/null +++ b/interface/src/avatar/ScriptAvatar.h @@ -0,0 +1,61 @@ +// +// ScriptAvatar.h +// interface/src/avatars +// +// Created by Stephen Birarda on 4/10/17. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_ScriptAvatar_h +#define hifi_ScriptAvatar_h + +#include + +#include "Avatar.h" + +class ScriptAvatar : public ScriptAvatarData { + Q_OBJECT + + Q_PROPERTY(glm::vec3 skeletonOffset READ getSkeletonOffset) + +public: + ScriptAvatar(AvatarSharedPointer avatarData); + +public slots: + + glm::quat getDefaultJointRotation(int index) const; + glm::vec3 getDefaultJointTranslation(int index) const; + + glm::vec3 getSkeletonOffset() const; + + glm::vec3 getJointPosition(int index) const; + glm::vec3 getJointPosition(const QString& name) const; + glm::vec3 getNeckPosition() const; + + glm::vec3 getAcceleration() const; + + QUuid getParentID() const; + quint16 getParentJointIndex() const; + + QVariantList getSkeleton() const; + + float getSimulationRate(const QString& rateName = QString("")) const; + + glm::vec3 getLeftPalmPosition() const; + glm::quat getLeftPalmRotation() const; + glm::vec3 getRightPalmPosition() const; + glm::quat getRightPalmRotation() const; + +private: + std::shared_ptr lockAvatar() const; + + std::weak_ptr _avatarData; +}; + +QScriptValue avatarToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in); +void avatarFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out); + +#endif // hifi_ScriptAvatar_h diff --git a/libraries/script-engine/src/ScriptAvatarData.h b/libraries/script-engine/src/ScriptAvatarData.h index 19bfcc63de..211989fa45 100644 --- a/libraries/script-engine/src/ScriptAvatarData.h +++ b/libraries/script-engine/src/ScriptAvatarData.h @@ -14,7 +14,6 @@ #include #include -#include class ScriptAvatarData : public QObject { Q_OBJECT @@ -137,7 +136,7 @@ private: Q_DECLARE_METATYPE(AvatarSharedPointer) -QScriptValue avatarDataToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in); -void avatarDataFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out); +QScriptValue avatarToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in); +void avatarFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out); #endif // hifi_ScriptAvatarData_h diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 3b5931aeb6..9920a66c7d 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -614,7 +614,6 @@ void ScriptEngine::init() { qScriptRegisterMetaType(this, injectorToScriptValue, injectorFromScriptValue); qScriptRegisterMetaType(this, inputControllerToScriptValue, inputControllerFromScriptValue); - qScriptRegisterMetaType(this, avatarDataToScriptValue, avatarDataFromScriptValue); qScriptRegisterMetaType(this, animationDetailsToScriptValue, animationDetailsFromScriptValue); qScriptRegisterMetaType(this, webSocketToScriptValue, webSocketFromScriptValue); qScriptRegisterMetaType(this, qWSCloseCodeToScriptValue, qWSCloseCodeFromScriptValue);