History

resolve conflicts on merge with huffman/baseball

Stephen Birarda committed 11 years ago

Commit 8cd41b92 parents 017cee6 67b43ca305 files · +12164 −5205Browse files

Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 305 files). Show all

Unified · Split

libraries/script-engine/src/ScriptEngine.cpp+72−30
@@ -28,7 +28,9 @@ · 27 unmodified lines
2828 #include <udt/PacketHeaders.h>
2929 #include <UUID.h>
3030
31−#include "AnimationObject.h"
31+#include <controllers/ScriptingInterface.h>
32+#include <AnimationObject.h>
33+
3234 #include "ArrayBufferViewClass.h"
3335 #include "BatchLoader.h"
3436 #include "DataViewClass.h"
@@ -76,13 +78,16 @@ void avatarDataFromScriptValue(const QScriptValue &object, AvatarData* &out) { · 41 unmodified lines
7678 out = qobject_cast<AvatarData*>(object.toQObject());
7779 }
7880
79−QScriptValue inputControllerToScriptValue(QScriptEngine *engine, AbstractInputController* const &in) {
81+QScriptValue inputControllerToScriptValue(QScriptEngine *engine, controller::InputController* const &in) {
8082 return engine->newQObject(in);
8183 }
82−void inputControllerFromScriptValue(const QScriptValue &object, AbstractInputController* &out) {
83− out = qobject_cast<AbstractInputController*>(object.toQObject());
84+
85+void inputControllerFromScriptValue(const QScriptValue &object, controller::InputController* &out) {
86+ out = qobject_cast<controller::InputController*>(object.toQObject());
8487 }
8588
89+
90+
8691 static bool hasCorrectSyntax(const QScriptProgram& program) {
8792 const auto syntaxCheck = QScriptEngine::checkSyntax(program.sourceCode());
8893 if (syntaxCheck.state() != QScriptSyntaxCheckResult::Valid) {
@@ -114,20 +119,17 @@ static bool hadUncaughtExceptions(QScriptEngine& engine, const QString& fileName · 25 unmodified lines
114119 return false;
115120 }
116121
117−ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNameString,
118− AbstractControllerScriptingInterface* controllerScriptingInterface, bool wantSignals) :
119−
120−_scriptContents(scriptContents),
121−_isFinished(false),
122−_isRunning(false),
123−_isInitialized(false),
124−_timerFunctionMap(),
125−_wantSignals(wantSignals),
126−_controllerScriptingInterface(controllerScriptingInterface),
127−_fileNameString(fileNameString),
128−_isUserLoaded(false),
129−_isReloading(false),
130−_arrayBufferClass(new ArrayBufferClass(this))
122+ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNameString, bool wantSignals) :
123+ _scriptContents(scriptContents),
124+ _isFinished(false),
125+ _isRunning(false),
126+ _isInitialized(false),
127+ _timerFunctionMap(),
128+ _wantSignals(wantSignals),
129+ _fileNameString(fileNameString),
130+ _isUserLoaded(false),
131+ _isReloading(false),
132+ _arrayBufferClass(new ArrayBufferClass(this))
131133 {
132134 _allScriptsMutex.lock();
133135 _allKnownScriptEngines.insert(this);
@@ -285,6 +287,27 @@ void ScriptEngine::errorInLoadingScript(const QUrl& url) { · 151 unmodified lines
285287 }
286288 }
287289
290+// Even though we never pass AnimVariantMap directly to and from javascript, the queued invokeMethod of
291+// callAnimationStateHandler requires that the type be registered.
292+// These two are meaningful, if we ever do want to use them...
293+static QScriptValue animVarMapToScriptValue(QScriptEngine* engine, const AnimVariantMap& parameters) {
294+ QStringList unused;
295+ return parameters.animVariantMapToScriptValue(engine, unused, false);
296+}
297+static void animVarMapFromScriptValue(const QScriptValue& value, AnimVariantMap& parameters) {
298+ parameters.animVariantMapFromScriptValue(value);
299+}
300+// ... while these two are not. But none of the four are ever used.
301+static QScriptValue resultHandlerToScriptValue(QScriptEngine* engine, const AnimVariantResultHandler& resultHandler) {
302+ qCCritical(scriptengine) << "Attempt to marshall result handler to javascript";
303+ assert(false);
304+ return QScriptValue();
305+}
306+static void resultHandlerFromScriptValue(const QScriptValue& value, AnimVariantResultHandler& resultHandler) {
307+ qCCritical(scriptengine) << "Attempt to marshall result handler from javascript";
308+ assert(false);
309+}
310+
288311 void ScriptEngine::init() {
289312 if (_isInitialized) {
290313 return; // only initialize once
@@ -337,27 +360,26 @@ void ScriptEngine::init() { · 46 unmodified lines
337360
338361 registerGlobalObject("Script", this);
339362 registerGlobalObject("Audio", &AudioScriptingInterface::getInstance());
340− registerGlobalObject("Controller", _controllerScriptingInterface);
341363 registerGlobalObject("Entities", entityScriptingInterface.data());
342364 registerGlobalObject("Quat", &_quatLibrary);
343365 registerGlobalObject("Vec3", &_vec3Library);
344366 registerGlobalObject("Uuid", &_uuidLibrary);
345367 registerGlobalObject("AnimationCache", DependencyManager::get<AnimationCache>().data());
346−
368+ qScriptRegisterMetaType(this, animVarMapToScriptValue, animVarMapFromScriptValue);
369+ qScriptRegisterMetaType(this, resultHandlerToScriptValue, resultHandlerFromScriptValue);
370+
347371 // constants
348372 globalObject().setProperty("TREE_SCALE", newVariant(QVariant(TREE_SCALE)));
349−
350− if (_controllerScriptingInterface) {
351− _controllerScriptingInterface->registerControllerTypes(this);
352− }
353−
354−
373+
374+ auto scriptingInterface = DependencyManager::get<controller::ScriptingInterface>();
375+ registerGlobalObject("Controller", scriptingInterface.data());
376+ UserInputMapper::registerControllerTypes(this);
355377 }
356378
357379 void ScriptEngine::registerValue(const QString& valueName, QScriptValue value) {
358380 if (QThread::currentThread() != thread()) {
359381 #ifdef THREAD_DEBUGGING
360− qDebug() << "*** WARNING *** ScriptEngine::registerValue() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] name:" << name;
382+ qDebug() << "*** WARNING *** ScriptEngine::registerValue() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "]";
361383 #endif
362384 QMetaObject::invokeMethod(this, "registerValue",
363385 Q_ARG(const QString&, valueName),
@@ -558,7 +580,7 @@ void ScriptEngine::addEventHandler(const EntityItemID& entityID, const QString& · 194 unmodified lines
558580 auto makeCollisionHandler = [this](QString eventName) -> CollisionHandler {
559581 return [this, eventName](const EntityItemID& idA, const EntityItemID& idB, const Collision& collision) {
560582 forwardHandlerCall(idA, eventName, { idA.toScriptValue(this), idB.toScriptValue(this),
561− collisionToScriptValue(this, collision) });
583+ collisionToScriptValue(this, collision) });
562584 };
563585 };
564586
@@ -743,6 +765,27 @@ void ScriptEngine::stop() { · 178 unmodified lines
743765 }
744766 }
745767
768+// Other threads can invoke this through invokeMethod, which causes the callback to be asynchronously executed in this script's thread.
769+void ScriptEngine::callAnimationStateHandler(QScriptValue callback, AnimVariantMap parameters, QStringList names, bool useNames, AnimVariantResultHandler resultHandler) {
770+ if (QThread::currentThread() != thread()) {
771+#ifdef THREAD_DEBUGGING
772+ qDebug() << "*** WARNING *** ScriptEngine::callAnimationStateHandler() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] name:" << name;
773+#endif
774+ QMetaObject::invokeMethod(this, "callAnimationStateHandler",
775+ Q_ARG(QScriptValue, callback),
776+ Q_ARG(AnimVariantMap, parameters),
777+ Q_ARG(QStringList, names),
778+ Q_ARG(bool, useNames),
779+ Q_ARG(AnimVariantResultHandler, resultHandler));
780+ return;
781+ }
782+ QScriptValue javascriptParameters = parameters.animVariantMapToScriptValue(this, names, useNames);
783+ QScriptValueList callingArguments;
784+ callingArguments << javascriptParameters;
785+ QScriptValue result = callback.call(QScriptValue(), callingArguments);
786+ resultHandler(result);
787+}
788+
746789 void ScriptEngine::timerFired() {
747790 QTimer* callingTimer = reinterpret_cast<QTimer*>(sender());
748791 QScriptValue timerFunction = _timerFunctionMap.value(callingTimer);
@@ -928,9 +971,8 @@ void ScriptEngine::forwardHandlerCall(const EntityItemID& entityID, const QStrin · 179 unmodified lines
928971 if (QThread::currentThread() != thread()) {
929972 qDebug() << "*** ERROR *** ScriptEngine::forwardHandlerCall() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "]";
930973 assert(false);
931− return;
974+ return ;
932975 }
933−
934976 if (!_registeredHandlers.contains(entityID)) {
935977 return;
936978 }