From 751d51ee722e836395cee0e9a69024282b4eaee6 Mon Sep 17 00:00:00 2001 From: James Pollack Date: Thu, 5 Nov 2015 14:19:11 -0800 Subject: [PATCH 1/5] entity call params --- .../entities/src/EntityScriptingInterface.cpp | 4 +-- libraries/script-engine/src/ScriptEngine.cpp | 31 +++++++++++++++++++ libraries/script-engine/src/ScriptEngine.h | 1 + 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 01d46e0a91..719b193dfd 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -217,10 +217,10 @@ void EntityScriptingInterface::deleteEntity(QUuid id) { } } -void EntityScriptingInterface::callEntityMethod(QUuid id, const QString& method) { +void EntityScriptingInterface::callEntityMethod(QUuid id, const QString& method, const QStringList& params) { if (_entitiesScriptEngine) { EntityItemID entityID{ id }; - _entitiesScriptEngine->callEntityScriptMethod(entityID, method); + _entitiesScriptEngine->callEntityScriptMethod(entityID, method, params); } } diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index c6ac6495b1..e9b2bc9acd 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -1200,6 +1200,37 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS } } +void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const QStringList& params) { + if (QThread::currentThread() != thread()) { + #ifdef THREAD_DEBUGGING + qDebug() << "*** WARNING *** ScriptEngine::callEntityScriptMethod() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] " + "entityID:" << entityID << "methodName:" << methodName; + #endif + + QMetaObject::invokeMethod(this, "callEntityScriptMethod", + Q_ARG(const EntityItemID&, entityID), + Q_ARG(const QString&, methodName), + Q_ARG(const QStringList&, params)); + return; + } + #ifdef THREAD_DEBUGGING + qDebug() << "ScriptEngine::callEntityScriptMethod() called on correct thread [" << thread() << "] " + "entityID:" << entityID << "methodName:" << methodName; + #endif + + refreshFileScript(entityID); + if (_entityScripts.contains(entityID)) { + EntityScriptDetails details = _entityScripts[entityID]; + QScriptValue entityScript = details.scriptObject; // previously loaded + if (entityScript.property(methodName).isFunction()) { + QScriptValueList args; + args << entityID.toScriptValue(this); + entityScript.property(methodName).call(entityScript, args); + } + + } +} + void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const MouseEvent& event) { if (QThread::currentThread() != thread()) { #ifdef THREAD_DEBUGGING diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 43fbdc1b0e..7ce79b4bb0 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -116,6 +116,7 @@ public: Q_INVOKABLE void unloadEntityScript(const EntityItemID& entityID); // will call unload method Q_INVOKABLE void unloadAllEntityScripts(); Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName); + Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const QStringList& params); Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const MouseEvent& event); Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const EntityItemID& otherID, const Collision& collision); From b229b5289cc7907c120b042fa0bc44085bb19a2c Mon Sep 17 00:00:00 2001 From: James Pollack Date: Thu, 5 Nov 2015 14:24:21 -0800 Subject: [PATCH 2/5] entity call params --- libraries/entities/src/EntityScriptingInterface.cpp | 8 +++++++- libraries/entities/src/EntityScriptingInterface.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 719b193dfd..a68f946173 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -217,6 +217,13 @@ void EntityScriptingInterface::deleteEntity(QUuid id) { } } +void EntityScriptingInterface::callEntityMethod(QUuid id, const QString& method) { + if (_entitiesScriptEngine) { + EntityItemID entityID{ id }; + _entitiesScriptEngine->callEntityScriptMethod(entityID, method); + } +} + void EntityScriptingInterface::callEntityMethod(QUuid id, const QString& method, const QStringList& params) { if (_entitiesScriptEngine) { EntityItemID entityID{ id }; @@ -224,7 +231,6 @@ void EntityScriptingInterface::callEntityMethod(QUuid id, const QString& method, } } - QUuid EntityScriptingInterface::findClosestEntity(const glm::vec3& center, float radius) const { EntityItemID result; if (_entityTree) { diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 156f16cf46..05c48a8415 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -94,7 +94,7 @@ public slots: /// engine. If the entity does not have an entity script or the method does not exist, this call will have /// no effect. Q_INVOKABLE void callEntityMethod(QUuid entityID, const QString& method); - + Q_INVOKABLE void callEntityMethod(QUuid entityID, const QString& method, const QStringList& params); /// finds the closest model to the center point, within the radius /// will return a EntityItemID.isKnownID = false if no models are in the radius /// this function will not find any models in script engine contexts which don't have access to models From 3cee569baefd46d9ed8c44fc005f0e558f40a63b Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Thu, 5 Nov 2015 16:57:39 -0800 Subject: [PATCH 3/5] pass parameters to entities --- libraries/entities/src/EntitiesScriptEngineProvider.h | 1 + libraries/entities/src/EntityScriptingInterface.h | 1 + libraries/script-engine/src/ScriptEngine.cpp | 2 ++ libraries/script-engine/src/ScriptEngine.h | 1 + 4 files changed, 5 insertions(+) diff --git a/libraries/entities/src/EntitiesScriptEngineProvider.h b/libraries/entities/src/EntitiesScriptEngineProvider.h index d112a6c0f9..1922f660cd 100644 --- a/libraries/entities/src/EntitiesScriptEngineProvider.h +++ b/libraries/entities/src/EntitiesScriptEngineProvider.h @@ -20,6 +20,7 @@ class EntitiesScriptEngineProvider { public: virtual void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName) = 0; + virtual void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const QStringList& params) = 0; }; #endif // hifi_EntitiesScriptEngineProvider_h \ No newline at end of file diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 05c48a8415..afec8e3680 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -15,6 +15,7 @@ #define hifi_EntityScriptingInterface_h #include +#include #include #include diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index e9b2bc9acd..f64efa8c1c 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -1225,6 +1226,7 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS if (entityScript.property(methodName).isFunction()) { QScriptValueList args; args << entityID.toScriptValue(this); + args << qScriptValueFromSequence(this, params); entityScript.property(methodName).call(entityScript, args); } diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 7ce79b4bb0..447a22fe5e 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include From e928c8278b2acfbb968a661b6558e63d2eaba734 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Fri, 6 Nov 2015 11:48:51 -0800 Subject: [PATCH 4/5] overload a single function and cleanup, add examples --- examples/entityScripts/createParamsEntity.js | 43 ++++++++++++++++++ examples/entityScripts/paramsEntity.js | 45 +++++++++++++++++++ .../src/EntitiesScriptEngineProvider.h | 3 +- .../entities/src/EntityScriptingInterface.cpp | 7 --- .../entities/src/EntityScriptingInterface.h | 4 +- libraries/script-engine/src/ScriptEngine.cpp | 31 ------------- libraries/script-engine/src/ScriptEngine.h | 3 +- 7 files changed, 92 insertions(+), 44 deletions(-) create mode 100644 examples/entityScripts/createParamsEntity.js create mode 100644 examples/entityScripts/paramsEntity.js diff --git a/examples/entityScripts/createParamsEntity.js b/examples/entityScripts/createParamsEntity.js new file mode 100644 index 0000000000..e01f075716 --- /dev/null +++ b/examples/entityScripts/createParamsEntity.js @@ -0,0 +1,43 @@ +// +// createParamsEntity.js +// +// +// Additions by James B. Pollack @imgntn on 11/6/2015 +// Copyright 2015 High Fidelity, Inc. +// +// This script demonstrates creates an entity and sends it a method call with parameters. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +var PARAMS_SCRIPT_URL = Script.resolvePath('paramsEntity.js'); + +var testEntity = Entities.addEntity({ + name: 'paramsTestEntity', + dimensions: { + x: 1, + y: 1, + z: 1 + }, + type: 'Box', + position: { + x: 0, + y: 0, + z: 0 + }, + visible: false, + script: PARAMS_SCRIPT_URL +}); + + +var subData1 = ['apple', 'banana', 'orange']; +var subData2 = { + thing: 1, + otherThing: 2 +}; +var data = [subData1, JSON.stringify(subData2), 'third']; +Script.setTimeout(function() { + print('sending data to entity') + Entities.callEntityMethod(testEntity, 'testParams', data); +}, 1500) \ No newline at end of file diff --git a/examples/entityScripts/paramsEntity.js b/examples/entityScripts/paramsEntity.js new file mode 100644 index 0000000000..afcfd279d5 --- /dev/null +++ b/examples/entityScripts/paramsEntity.js @@ -0,0 +1,45 @@ +// +// paramsEntity.js +// +// Script Type: Entity +// +// Additions by James B. Pollack @imgntn on 11/6/2015 +// Copyright 2015 High Fidelity, Inc. +// +// This script demonstrates how to recieve parameters from a Entities.callEntityMethod call +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +(function() { + + function ParamsEntity() { + return; + } + + ParamsEntity.prototype = { + preload: function(entityID) { + print('entity loaded') + this.entityID = entityID; + }, + testParams: function(myID, paramsArray) { + + paramsArray.forEach(function(param) { + var p; + try { + p = JSON.parse(param); + print("it's a json param") + print('json param property:' + p.thing); + } catch (err) { + print('not a json param') + p = param; + print('param is:' + p); + } + + }); + + } + + } + + return new ParamsEntity(); +}); \ No newline at end of file diff --git a/libraries/entities/src/EntitiesScriptEngineProvider.h b/libraries/entities/src/EntitiesScriptEngineProvider.h index 1922f660cd..69bf73e688 100644 --- a/libraries/entities/src/EntitiesScriptEngineProvider.h +++ b/libraries/entities/src/EntitiesScriptEngineProvider.h @@ -19,8 +19,7 @@ class EntitiesScriptEngineProvider { public: - virtual void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName) = 0; - virtual void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const QStringList& params) = 0; + virtual void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const QStringList& params = QStringList()) = 0; }; #endif // hifi_EntitiesScriptEngineProvider_h \ No newline at end of file diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index a68f946173..8ca0e9b5fa 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -217,13 +217,6 @@ void EntityScriptingInterface::deleteEntity(QUuid id) { } } -void EntityScriptingInterface::callEntityMethod(QUuid id, const QString& method) { - if (_entitiesScriptEngine) { - EntityItemID entityID{ id }; - _entitiesScriptEngine->callEntityScriptMethod(entityID, method); - } -} - void EntityScriptingInterface::callEntityMethod(QUuid id, const QString& method, const QStringList& params) { if (_entitiesScriptEngine) { EntityItemID entityID{ id }; diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index afec8e3680..8a4414a596 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -94,8 +94,8 @@ public slots: /// Allows a script to call a method on an entity's script. The method will execute in the entity script /// engine. If the entity does not have an entity script or the method does not exist, this call will have /// no effect. - Q_INVOKABLE void callEntityMethod(QUuid entityID, const QString& method); - Q_INVOKABLE void callEntityMethod(QUuid entityID, const QString& method, const QStringList& params); + Q_INVOKABLE void callEntityMethod(QUuid entityID, const QString& method, const QStringList& params = QStringList()); + /// finds the closest model to the center point, within the radius /// will return a EntityItemID.isKnownID = false if no models are in the radius /// this function will not find any models in script engine contexts which don't have access to models diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index f64efa8c1c..e923ea6d21 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -1170,37 +1170,6 @@ void ScriptEngine::refreshFileScript(const EntityItemID& entityID) { recurseGuard = false; } - -void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName) { - if (QThread::currentThread() != thread()) { - #ifdef THREAD_DEBUGGING - qDebug() << "*** WARNING *** ScriptEngine::callEntityScriptMethod() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] " - "entityID:" << entityID << "methodName:" << methodName; - #endif - - QMetaObject::invokeMethod(this, "callEntityScriptMethod", - Q_ARG(const EntityItemID&, entityID), - Q_ARG(const QString&, methodName)); - return; - } - #ifdef THREAD_DEBUGGING - qDebug() << "ScriptEngine::callEntityScriptMethod() called on correct thread [" << thread() << "] " - "entityID:" << entityID << "methodName:" << methodName; - #endif - - refreshFileScript(entityID); - if (_entityScripts.contains(entityID)) { - EntityScriptDetails details = _entityScripts[entityID]; - QScriptValue entityScript = details.scriptObject; // previously loaded - if (entityScript.property(methodName).isFunction()) { - QScriptValueList args; - args << entityID.toScriptValue(this); - entityScript.property(methodName).call(entityScript, args); - } - - } -} - void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const QStringList& params) { if (QThread::currentThread() != thread()) { #ifdef THREAD_DEBUGGING diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 447a22fe5e..c957b0c3b4 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -116,8 +116,7 @@ public: Q_INVOKABLE void loadEntityScript(const EntityItemID& entityID, const QString& entityScript, bool forceRedownload = false); // will call the preload method once loaded Q_INVOKABLE void unloadEntityScript(const EntityItemID& entityID); // will call unload method Q_INVOKABLE void unloadAllEntityScripts(); - Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName); - Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const QStringList& params); + Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const QStringList& params = QStringList()); Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const MouseEvent& event); Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const EntityItemID& otherID, const Collision& collision); From cf86d27417716ca48a3dd7805730870e920f30e8 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Fri, 6 Nov 2015 11:50:34 -0800 Subject: [PATCH 5/5] cleanup headers --- examples/entityScripts/createParamsEntity.js | 5 ++--- examples/entityScripts/paramsEntity.js | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/entityScripts/createParamsEntity.js b/examples/entityScripts/createParamsEntity.js index e01f075716..991bb0d667 100644 --- a/examples/entityScripts/createParamsEntity.js +++ b/examples/entityScripts/createParamsEntity.js @@ -1,11 +1,10 @@ // // createParamsEntity.js // -// -// Additions by James B. Pollack @imgntn on 11/6/2015 +// Created by James B. Pollack @imgntn on 11/6/2015 // Copyright 2015 High Fidelity, Inc. // -// This script demonstrates creates an entity and sends it a method call with parameters. +// This script demonstrates creating an entity and sending it a method call with parameters. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html diff --git a/examples/entityScripts/paramsEntity.js b/examples/entityScripts/paramsEntity.js index afcfd279d5..6cb5cb5833 100644 --- a/examples/entityScripts/paramsEntity.js +++ b/examples/entityScripts/paramsEntity.js @@ -3,7 +3,7 @@ // // Script Type: Entity // -// Additions by James B. Pollack @imgntn on 11/6/2015 +// Created by James B. Pollack @imgntn on 11/6/2015 // Copyright 2015 High Fidelity, Inc. // // This script demonstrates how to recieve parameters from a Entities.callEntityMethod call