add ScriptAvatar for std::shared_ptr<Avatar> passing to scripts

This commit is contained in:
Stephen Birarda 2017-04-10 19:07:37 -07:00 committed by Zach Fox
parent 0aa1e633fe
commit 42a406e90a
6 changed files with 226 additions and 4 deletions
assignment-client/src
interface/src
libraries/script-engine/src

View file

@ -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<recording::Deck>();
connect(player.data(), &recording::Deck::playbackStateChanged, [=] {
if (player->isPlaying()) {

View file

@ -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());
}

View file

@ -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<Avatar> from a script
assert(false);
out = std::shared_ptr<Avatar>();
}
ScriptAvatar::ScriptAvatar(AvatarSharedPointer avatarData) :
ScriptAvatarData(avatarData)
{
}
std::shared_ptr<Avatar> ScriptAvatar::lockAvatar() const {
if (auto lockedAvatarData = _avatarData.lock()) {
return std::dynamic_pointer_cast<Avatar>(lockedAvatarData);
} else {
return std::shared_ptr<Avatar>();
}
}
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();
}
}

View file

@ -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 <ScriptAvatarData.h>
#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<Avatar> lockAvatar() const;
std::weak_ptr<AvatarData> _avatarData;
};
QScriptValue avatarToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in);
void avatarFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out);
#endif // hifi_ScriptAvatar_h

View file

@ -14,7 +14,6 @@
#include <QtCore/QObject>
#include <AvatarData.h>
#include <SpatiallyNestable.h>
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

View file

@ -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);