From f265656e741eff9da126e1d63933bb1f58b91d64 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 19 Jan 2016 12:55:17 -0800 Subject: [PATCH 1/5] expose getJointNames for entities to js --- .../src/RenderableModelEntityItem.cpp | 16 +++++++++++----- .../src/RenderableModelEntityItem.h | 1 + libraries/entities/src/EntityItem.h | 1 + .../entities/src/EntityScriptingInterface.cpp | 14 ++++++++++++++ .../entities/src/EntityScriptingInterface.h | 1 + 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 57a29de596..72dc79b882 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -772,8 +772,14 @@ int RenderableModelEntityItem::getJointIndex(const QString& name) const { return -1; } - -// TODO -- expose a way to list joint names -// RenderableModelEntityItem::QStringList getJointNames() const { -// rig->nameOfJoint(i); -// } +QStringList RenderableModelEntityItem::getJointNames() const { + QStringList result; + if (_model && _model->isActive()) { + RigPointer rig = _model->getRig(); + int jointCount = rig->getJointStateCount(); + for (int jointIndex = 0; jointIndex < jointCount; jointIndex++) { + result << rig->nameOfJoint(jointIndex); + } + } + return result; +} diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 834513ecf7..20afb3c157 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -80,6 +80,7 @@ public: virtual void resizeJointArrays(int newSize = -1) override; virtual int getJointIndex(const QString& name) const override; + virtual QStringList getJointNames() const override; private: QVariantMap parseTexturesToMap(QString textures); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index f40ee88960..9be018183a 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -396,6 +396,7 @@ public: virtual bool setAbsoluteJointTranslationInObjectFrame(int index, const glm::vec3& translation) override { return false; } virtual int getJointIndex(const QString& name) const { return -1; } + virtual QStringList getJointNames() const { return QStringList(); } virtual void loader() {} // called indirectly when urls for geometry are updated diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index f78cd4fd8c..c90712ac42 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -978,5 +978,19 @@ int EntityScriptingInterface::getJointIndex(const QUuid& entityID, const QString return -1; } EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); + if (!entity) { + return -1; + } return entity->getJointIndex(name); } + +QStringList EntityScriptingInterface::getJointNames(const QUuid& entityID) { + if (!_entityTree) { + return QStringList(); + } + EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); + if (!entity) { + return QStringList(); + } + return entity->getJointNames(); +} diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index e7a4c0e071..641da7518e 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -162,6 +162,7 @@ public slots: const QVector& translations); Q_INVOKABLE int getJointIndex(const QUuid& entityID, const QString& name); + Q_INVOKABLE QStringList getJointNames(const QUuid& entityID); signals: void collisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision); From a515d6debe563e5d08342fd272776eace79c6431 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 19 Jan 2016 15:16:58 -0800 Subject: [PATCH 2/5] call into correct thread to getJointNames on entity --- .../entities-renderer/src/RenderableModelEntityItem.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 72dc79b882..0d99376a7b 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -774,6 +774,11 @@ int RenderableModelEntityItem::getJointIndex(const QString& name) const { QStringList RenderableModelEntityItem::getJointNames() const { QStringList result; + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(const_cast(this), "getJointNames", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QStringList, result)); + return result; + } if (_model && _model->isActive()) { RigPointer rig = _model->getRig(); int jointCount = rig->getJointStateCount(); From edea0320e6d83959d50a1599c6d473f2a2fec87e Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 19 Jan 2016 15:44:22 -0800 Subject: [PATCH 3/5] try again to make this thread safe --- .../src/RenderableModelEntityItem.cpp | 5 ----- .../entities/src/EntityScriptingInterface.cpp | 18 ++++++++---------- libraries/entities/src/EntityTree.cpp | 19 ++++++++++++++++++- libraries/entities/src/EntityTree.h | 4 ++++ 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 0d99376a7b..72dc79b882 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -774,11 +774,6 @@ int RenderableModelEntityItem::getJointIndex(const QString& name) const { QStringList RenderableModelEntityItem::getJointNames() const { QStringList result; - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(const_cast(this), "getJointNames", Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QStringList, result)); - return result; - } if (_model && _model->isActive()) { RigPointer rig = _model->getRig(); int jointCount = rig->getJointStateCount(); diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index c90712ac42..3f7bc83386 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -977,20 +977,18 @@ int EntityScriptingInterface::getJointIndex(const QUuid& entityID, const QString if (!_entityTree) { return -1; } - EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); - if (!entity) { - return -1; - } - return entity->getJointIndex(name); + int result; + QMetaObject::invokeMethod(_entityTree.get(), "getJointIndex", Qt::BlockingQueuedConnection, + Q_ARG(QUuid, entityID), Q_ARG(QString, name), Q_RETURN_ARG(int, result)); + return result; } QStringList EntityScriptingInterface::getJointNames(const QUuid& entityID) { if (!_entityTree) { return QStringList(); } - EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); - if (!entity) { - return QStringList(); - } - return entity->getJointNames(); + QStringList result; + QMetaObject::invokeMethod(_entityTree.get(), "getJointNames", Qt::BlockingQueuedConnection, + Q_ARG(QUuid, entityID), Q_RETURN_ARG(QStringList, result)); + return result; } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index eb23034506..f7a4a9d913 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1358,7 +1358,6 @@ void EntityTree::trackIncomingEntityLastEdited(quint64 lastEditedTime, int bytes } } - void EntityTree::callLoader(EntityItemID entityID) { // this is used to bounce from the networking thread to the main thread EntityItemPointer entity = findEntityByEntityItemID(entityID); @@ -1366,3 +1365,21 @@ void EntityTree::callLoader(EntityItemID entityID) { entity->loader(); } } + +int EntityTree::getJointIndex(const QUuid& entityID, const QString& name) const { + EntityTree* nonConstThis = const_cast(this); + EntityItemPointer entity = nonConstThis->findEntityByEntityItemID(entityID); + if (!entity) { + return -1; + } + return entity->getJointIndex(name); +} + +QStringList EntityTree::getJointNames(const QUuid& entityID) const { + EntityTree* nonConstThis = const_cast(this); + EntityItemPointer entity = nonConstThis->findEntityByEntityItemID(entityID); + if (!entity) { + return QStringList(); + } + return entity->getJointNames(); +} diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 0f77c4af9a..cf62baf808 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -236,6 +236,10 @@ public: return _deletedEntityItemIDs.contains(id); } + // these are used to call through to EntityItems + int getJointIndex(const QUuid& entityID, const QString& name) const; + QStringList getJointNames(const QUuid& entityID) const; + public slots: void callLoader(EntityItemID entityID); From 0064ee6ab2e01a6a6ba4f9a5c492336ddfd358f7 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 19 Jan 2016 15:55:56 -0800 Subject: [PATCH 4/5] try again to make this thread safe --- libraries/entities/src/EntityTree.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index cf62baf808..63bd53120f 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -237,8 +237,8 @@ public: } // these are used to call through to EntityItems - int getJointIndex(const QUuid& entityID, const QString& name) const; - QStringList getJointNames(const QUuid& entityID) const; + Q_INVOKABLE int getJointIndex(const QUuid& entityID, const QString& name) const; + Q_INVOKABLE QStringList getJointNames(const QUuid& entityID) const; public slots: void callLoader(EntityItemID entityID); From 28d673cb97740dc9e71b540beadecd48b6c5b81f Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 19 Jan 2016 16:00:02 -0800 Subject: [PATCH 5/5] try again to make this thread safe --- libraries/entities/src/EntityScriptingInterface.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 3f7bc83386..8fd7be912e 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -979,7 +979,7 @@ int EntityScriptingInterface::getJointIndex(const QUuid& entityID, const QString } int result; QMetaObject::invokeMethod(_entityTree.get(), "getJointIndex", Qt::BlockingQueuedConnection, - Q_ARG(QUuid, entityID), Q_ARG(QString, name), Q_RETURN_ARG(int, result)); + Q_RETURN_ARG(int, result), Q_ARG(QUuid, entityID), Q_ARG(QString, name)); return result; } @@ -989,6 +989,6 @@ QStringList EntityScriptingInterface::getJointNames(const QUuid& entityID) { } QStringList result; QMetaObject::invokeMethod(_entityTree.get(), "getJointNames", Qt::BlockingQueuedConnection, - Q_ARG(QUuid, entityID), Q_RETURN_ARG(QStringList, result)); + Q_RETURN_ARG(QStringList, result), Q_ARG(QUuid, entityID)); return result; }