From 17a6a72bdd5a6de499228c6b4ed8d491698e96a8 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 22 Jul 2014 11:39:49 -0700 Subject: [PATCH 1/3] ScriptEngine now inherit from QScriptEngine --- .../script-engine/src/ArrayBufferClass.cpp | 4 +- .../src/ArrayBufferViewClass.cpp | 4 +- libraries/script-engine/src/ScriptEngine.cpp | 142 +++++++++--------- libraries/script-engine/src/ScriptEngine.h | 4 +- 4 files changed, 74 insertions(+), 80 deletions(-) diff --git a/libraries/script-engine/src/ArrayBufferClass.cpp b/libraries/script-engine/src/ArrayBufferClass.cpp index ab33b5ffe7..b84188f707 100644 --- a/libraries/script-engine/src/ArrayBufferClass.cpp +++ b/libraries/script-engine/src/ArrayBufferClass.cpp @@ -23,8 +23,8 @@ static const QString CLASS_NAME = "ArrayBuffer"; Q_DECLARE_METATYPE(QByteArray*) ArrayBufferClass::ArrayBufferClass(ScriptEngine* scriptEngine) : -QObject(scriptEngine->getEngine()), -QScriptClass(scriptEngine->getEngine()), +QObject(scriptEngine), +QScriptClass(scriptEngine), _scriptEngine(scriptEngine) { qScriptRegisterMetaType(engine(), toScriptValue, fromScriptValue); QScriptValue global = engine()->globalObject(); diff --git a/libraries/script-engine/src/ArrayBufferViewClass.cpp b/libraries/script-engine/src/ArrayBufferViewClass.cpp index aad2e6add7..cf776ed834 100644 --- a/libraries/script-engine/src/ArrayBufferViewClass.cpp +++ b/libraries/script-engine/src/ArrayBufferViewClass.cpp @@ -14,8 +14,8 @@ Q_DECLARE_METATYPE(QByteArray*) ArrayBufferViewClass::ArrayBufferViewClass(ScriptEngine* scriptEngine) : -QObject(scriptEngine->getEngine()), -QScriptClass(scriptEngine->getEngine()), +QObject(scriptEngine), +QScriptClass(scriptEngine), _scriptEngine(scriptEngine) { // Save string handles for quick lookup _bufferName = engine()->toStringHandle(BUFFER_PROPERTY_NAME.toLatin1()); diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index fab21ea928..df66fa44d5 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -87,7 +87,6 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNam _isFinished(false), _isRunning(false), _isInitialized(false), - _engine(), _isAvatar(false), _avatarIdentityTimer(NULL), _avatarBillboardTimer(NULL), @@ -113,7 +112,6 @@ ScriptEngine::ScriptEngine(const QUrl& scriptURL, _isFinished(false), _isRunning(false), _isInitialized(false), - _engine(), _isAvatar(false), _avatarIdentityTimer(NULL), _avatarBillboardTimer(NULL), @@ -194,7 +192,7 @@ void ScriptEngine::setAvatarData(AvatarData* avatarData, const QString& objectNa _avatarData = avatarData; // remove the old Avatar property, if it exists - _engine.globalObject().setProperty(objectName, QScriptValue()); + globalObject().setProperty(objectName, QScriptValue()); // give the script engine the new Avatar script property registerGlobalObject(objectName, _avatarData); @@ -202,7 +200,7 @@ void ScriptEngine::setAvatarData(AvatarData* avatarData, const QString& objectNa void ScriptEngine::setAvatarHashMap(AvatarHashMap* avatarHashMap, const QString& objectName) { // remove the old Avatar property, if it exists - _engine.globalObject().setProperty(objectName, QScriptValue()); + globalObject().setProperty(objectName, QScriptValue()); // give the script engine the new avatar hash map registerGlobalObject(objectName, avatarHashMap); @@ -231,48 +229,48 @@ void ScriptEngine::init() { _particlesScriptingInterface.init(); // register various meta-types - registerMetaTypes(&_engine); - registerMIDIMetaTypes(&_engine); - registerVoxelMetaTypes(&_engine); - registerEventTypes(&_engine); - registerMenuItemProperties(&_engine); - registerAnimationTypes(&_engine); - registerAvatarTypes(&_engine); - Bitstream::registerTypes(&_engine); + registerMetaTypes(this); + registerMIDIMetaTypes(this); + registerVoxelMetaTypes(this); + registerEventTypes(this); + registerMenuItemProperties(this); + registerAnimationTypes(this); + registerAvatarTypes(this); + Bitstream::registerTypes(this); - qScriptRegisterMetaType(&_engine, ParticlePropertiesToScriptValue, ParticlePropertiesFromScriptValue); - qScriptRegisterMetaType(&_engine, ParticleIDtoScriptValue, ParticleIDfromScriptValue); - qScriptRegisterSequenceMetaType >(&_engine); + qScriptRegisterMetaType(this, ParticlePropertiesToScriptValue, ParticlePropertiesFromScriptValue); + qScriptRegisterMetaType(this, ParticleIDtoScriptValue, ParticleIDfromScriptValue); + qScriptRegisterSequenceMetaType >(this); - qScriptRegisterMetaType(&_engine, ModelItemPropertiesToScriptValue, ModelItemPropertiesFromScriptValue); - qScriptRegisterMetaType(&_engine, ModelItemIDtoScriptValue, ModelItemIDfromScriptValue); - qScriptRegisterMetaType(&_engine, RayToModelIntersectionResultToScriptValue, RayToModelIntersectionResultFromScriptValue); - qScriptRegisterSequenceMetaType >(&_engine); + qScriptRegisterMetaType(this, ModelItemPropertiesToScriptValue, ModelItemPropertiesFromScriptValue); + qScriptRegisterMetaType(this, ModelItemIDtoScriptValue, ModelItemIDfromScriptValue); + qScriptRegisterMetaType(this, RayToModelIntersectionResultToScriptValue, RayToModelIntersectionResultFromScriptValue); + qScriptRegisterSequenceMetaType >(this); - qScriptRegisterSequenceMetaType >(&_engine); - qScriptRegisterSequenceMetaType >(&_engine); - qScriptRegisterSequenceMetaType >(&_engine); + qScriptRegisterSequenceMetaType >(this); + qScriptRegisterSequenceMetaType >(this); + qScriptRegisterSequenceMetaType >(this); - QScriptValue xmlHttpRequestConstructorValue = _engine.newFunction(XMLHttpRequestClass::constructor); - _engine.globalObject().setProperty("XMLHttpRequest", xmlHttpRequestConstructorValue); + QScriptValue xmlHttpRequestConstructorValue = newFunction(XMLHttpRequestClass::constructor); + globalObject().setProperty("XMLHttpRequest", xmlHttpRequestConstructorValue); - QScriptValue printConstructorValue = _engine.newFunction(debugPrint); - _engine.globalObject().setProperty("print", printConstructorValue); + QScriptValue printConstructorValue = newFunction(debugPrint); + globalObject().setProperty("print", printConstructorValue); - QScriptValue soundConstructorValue = _engine.newFunction(soundConstructor); - QScriptValue soundMetaObject = _engine.newQMetaObject(&Sound::staticMetaObject, soundConstructorValue); - _engine.globalObject().setProperty("Sound", soundMetaObject); + QScriptValue soundConstructorValue = newFunction(soundConstructor); + QScriptValue soundMetaObject = newQMetaObject(&Sound::staticMetaObject, soundConstructorValue); + globalObject().setProperty("Sound", soundMetaObject); - QScriptValue injectionOptionValue = _engine.scriptValueFromQMetaObject(); - _engine.globalObject().setProperty("AudioInjectionOptions", injectionOptionValue); + QScriptValue injectionOptionValue = scriptValueFromQMetaObject(); + globalObject().setProperty("AudioInjectionOptions", injectionOptionValue); - QScriptValue localVoxelsValue = _engine.scriptValueFromQMetaObject(); - _engine.globalObject().setProperty("LocalVoxels", localVoxelsValue); + QScriptValue localVoxelsValue = scriptValueFromQMetaObject(); + globalObject().setProperty("LocalVoxels", localVoxelsValue); - qScriptRegisterMetaType(&_engine, injectorToScriptValue, injectorFromScriptValue); - qScriptRegisterMetaType( &_engine, injectorToScriptValueInputController, injectorFromScriptValueInputController); + qScriptRegisterMetaType(this, injectorToScriptValue, injectorFromScriptValue); + qScriptRegisterMetaType( this, injectorToScriptValueInputController, injectorFromScriptValueInputController); - qScriptRegisterMetaType(&_engine, animationDetailsToScriptValue, animationDetailsFromScriptValue); + qScriptRegisterMetaType(this, animationDetailsToScriptValue, animationDetailsFromScriptValue); registerGlobalObject("Script", this); registerGlobalObject("Audio", &_audioScriptingInterface); @@ -287,15 +285,14 @@ void ScriptEngine::init() { registerGlobalObject("Voxels", &_voxelsScriptingInterface); // constants - QScriptValue globalObject = _engine.globalObject(); - globalObject.setProperty("TREE_SCALE", _engine.newVariant(QVariant(TREE_SCALE))); - globalObject.setProperty("COLLISION_GROUP_ENVIRONMENT", _engine.newVariant(QVariant(COLLISION_GROUP_ENVIRONMENT))); - globalObject.setProperty("COLLISION_GROUP_AVATARS", _engine.newVariant(QVariant(COLLISION_GROUP_AVATARS))); - globalObject.setProperty("COLLISION_GROUP_VOXELS", _engine.newVariant(QVariant(COLLISION_GROUP_VOXELS))); - globalObject.setProperty("COLLISION_GROUP_PARTICLES", _engine.newVariant(QVariant(COLLISION_GROUP_PARTICLES))); + globalObject().setProperty("TREE_SCALE", newVariant(QVariant(TREE_SCALE))); + globalObject().setProperty("COLLISION_GROUP_ENVIRONMENT", newVariant(QVariant(COLLISION_GROUP_ENVIRONMENT))); + globalObject().setProperty("COLLISION_GROUP_AVATARS", newVariant(QVariant(COLLISION_GROUP_AVATARS))); + globalObject().setProperty("COLLISION_GROUP_VOXELS", newVariant(QVariant(COLLISION_GROUP_VOXELS))); + globalObject().setProperty("COLLISION_GROUP_PARTICLES", newVariant(QVariant(COLLISION_GROUP_PARTICLES))); - globalObject.setProperty("AVATAR_MOTION_OBEY_LOCAL_GRAVITY", _engine.newVariant(QVariant(AVATAR_MOTION_OBEY_LOCAL_GRAVITY))); - globalObject.setProperty("AVATAR_MOTION_OBEY_ENVIRONMENTAL_GRAVITY", _engine.newVariant(QVariant(AVATAR_MOTION_OBEY_ENVIRONMENTAL_GRAVITY))); + globalObject().setProperty("AVATAR_MOTION_OBEY_LOCAL_GRAVITY", newVariant(QVariant(AVATAR_MOTION_OBEY_LOCAL_GRAVITY))); + globalObject().setProperty("AVATAR_MOTION_OBEY_ENVIRONMENTAL_GRAVITY", newVariant(QVariant(AVATAR_MOTION_OBEY_ENVIRONMENTAL_GRAVITY))); // let the VoxelPacketSender know how frequently we plan to call it _voxelsScriptingInterface.getVoxelPacketSender()->setProcessCallIntervalHint(SCRIPT_DATA_CALLBACK_USECS); @@ -304,8 +301,8 @@ void ScriptEngine::init() { QScriptValue ScriptEngine::registerGlobalObject(const QString& name, QObject* object) { if (object) { - QScriptValue value = _engine.newQObject(object); - _engine.globalObject().setProperty(name, value); + QScriptValue value = newQObject(object); + globalObject().setProperty(name, value); return value; } return QScriptValue::NullValue; @@ -313,15 +310,15 @@ QScriptValue ScriptEngine::registerGlobalObject(const QString& name, QObject* ob void ScriptEngine::registerGetterSetter(const QString& name, QScriptEngine::FunctionSignature getter, QScriptEngine::FunctionSignature setter, QScriptValue object) { - QScriptValue setterFunction = _engine.newFunction(setter, 1); - QScriptValue getterFunction = _engine.newFunction(getter); + QScriptValue setterFunction = newFunction(setter, 1); + QScriptValue getterFunction = newFunction(getter); if (!object.isNull()) { object.setProperty(name, setterFunction, QScriptValue::PropertySetter); object.setProperty(name, getterFunction, QScriptValue::PropertyGetter); } else { - _engine.globalObject().setProperty(name, setterFunction, QScriptValue::PropertySetter); - _engine.globalObject().setProperty(name, getterFunction, QScriptValue::PropertyGetter); + globalObject().setProperty(name, setterFunction, QScriptValue::PropertySetter); + globalObject().setProperty(name, getterFunction, QScriptValue::PropertyGetter); } } @@ -330,25 +327,24 @@ void ScriptEngine::evaluate() { init(); } - QScriptValue result = _engine.evaluate(_scriptContents); + QScriptValue result = evaluate(_scriptContents); - if (_engine.hasUncaughtException()) { - int line = _engine.uncaughtExceptionLineNumber(); + if (hasUncaughtException()) { + int line = uncaughtExceptionLineNumber(); qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << result.toString(); emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + result.toString()); - _engine.clearExceptions(); + clearExceptions(); } } QScriptValue ScriptEngine::evaluate(const QString& program, const QString& fileName, int lineNumber) { - QScriptValue result = _engine.evaluate(program, fileName, lineNumber); - bool hasUncaughtException = _engine.hasUncaughtException(); - if (hasUncaughtException) { - int line = _engine.uncaughtExceptionLineNumber(); + QScriptValue result = QScriptEngine::evaluate(program, fileName, lineNumber); + if (hasUncaughtException()) { + int line = uncaughtExceptionLineNumber(); qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ": " << result.toString(); } - emit evaluationFinished(result, hasUncaughtException); - _engine.clearExceptions(); + emit evaluationFinished(result, hasUncaughtException()); + clearExceptions(); return result; } @@ -372,12 +368,12 @@ void ScriptEngine::run() { _isFinished = false; emit runningStateChanged(); - QScriptValue result = _engine.evaluate(_scriptContents); - if (_engine.hasUncaughtException()) { - int line = _engine.uncaughtExceptionLineNumber(); + QScriptValue result = evaluate(_scriptContents); + if (hasUncaughtException()) { + int line = uncaughtExceptionLineNumber(); qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << result.toString(); emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + result.toString()); - _engine.clearExceptions(); + clearExceptions(); } QElapsedTimer startTime; @@ -532,11 +528,11 @@ void ScriptEngine::run() { qint64 now = usecTimestampNow(); float deltaTime = (float) (now - lastUpdate) / (float) USECS_PER_SECOND; - if (_engine.hasUncaughtException()) { - int line = _engine.uncaughtExceptionLineNumber(); - qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << _engine.uncaughtException().toString(); - emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + _engine.uncaughtException().toString()); - _engine.clearExceptions(); + if (hasUncaughtException()) { + int line = uncaughtExceptionLineNumber(); + qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << uncaughtException().toString(); + emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + uncaughtException().toString()); + clearExceptions(); } emit update(deltaTime); @@ -694,12 +690,12 @@ void ScriptEngine::include(const QString& includeFile) { } } - QScriptValue result = _engine.evaluate(includeContents); - if (_engine.hasUncaughtException()) { - int line = _engine.uncaughtExceptionLineNumber(); + QScriptValue result = evaluate(includeContents); + if (hasUncaughtException()) { + int line = uncaughtExceptionLineNumber(); qDebug() << "Uncaught exception at (" << includeFile << ") line" << line << ":" << result.toString(); emit errorMessage("Uncaught exception at (" + includeFile + ") line" + QString::number(line) + ":" + result.toString()); - _engine.clearExceptions(); + clearExceptions(); } } diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 0eda74914f..53c2a72b00 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -38,7 +38,7 @@ const QString NO_SCRIPT(""); const unsigned int SCRIPT_DATA_CALLBACK_USECS = floor(((1.0 / 60.0f) * 1000 * 1000) + 0.5); -class ScriptEngine : public QObject { +class ScriptEngine : public QScriptEngine { Q_OBJECT public: ScriptEngine(const QUrl& scriptURL, @@ -57,7 +57,6 @@ public: /// Access the ModelsScriptingInterface in order to initialize it with a custom packet sender and jurisdiction listener static ModelsScriptingInterface* getModelsScriptingInterface() { return &_modelsScriptingInterface; } - QScriptEngine* getEngine() { return &_engine; } ArrayBufferClass* getArrayBufferClass() { return _arrayBufferClass; } /// sets the script contents, will return false if failed, will fail if script is already running @@ -121,7 +120,6 @@ protected: bool _isFinished; bool _isRunning; bool _isInitialized; - QScriptEngine _engine; bool _isAvatar; QTimer* _avatarIdentityTimer; QTimer* _avatarBillboardTimer; From e1365a29279f6c642f4d823337a3851d9d8cd84c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 23 Jul 2014 14:19:47 -0700 Subject: [PATCH 2/3] Forgot one change --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8b00bface7..02f4842e88 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3628,7 +3628,7 @@ ScriptEngine* Application::loadScript(const QString& scriptName, bool loadScript scriptEngine->getModelsScriptingInterface()->setModelTree(_models.getTree()); // model has some custom types - Model::registerMetaTypes(scriptEngine->getEngine()); + Model::registerMetaTypes(scriptEngine); // hook our avatar object into this script engine scriptEngine->setAvatarData(_myAvatar, "MyAvatar"); // leave it as a MyAvatar class to expose thrust features From 0d039b1cdb16c06af447d9bc54afec8fe699545d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 23 Jul 2014 14:38:37 -0700 Subject: [PATCH 3/3] Fixed invokeMethod bug + removed debug --- examples/editModels.js | 1 - interface/src/models/ModelTreeRenderer.h | 3 ++- libraries/models/src/ModelsScriptingInterface.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/editModels.js b/examples/editModels.js index 458ddf7b4a..ea88c87bea 100644 --- a/examples/editModels.js +++ b/examples/editModels.js @@ -1168,7 +1168,6 @@ function handeMenuEvent(menuItem){ angles.z = array[7].value; selectedModelProperties.modelRotation = Quat.fromVec3Degrees(angles); selectedModelProperties.radius = array[8].value / 2; - print(selectedModelProperties.radius); Models.editModel(selectedModelID, selectedModelProperties); } diff --git a/interface/src/models/ModelTreeRenderer.h b/interface/src/models/ModelTreeRenderer.h index b6df71565d..d69b85efe9 100644 --- a/interface/src/models/ModelTreeRenderer.h +++ b/interface/src/models/ModelTreeRenderer.h @@ -27,6 +27,7 @@ // Generic client side Octree renderer class. class ModelTreeRenderer : public OctreeRenderer, public ModelItemFBXService { + Q_OBJECT public: ModelTreeRenderer(); virtual ~ModelTreeRenderer(); @@ -56,7 +57,7 @@ public: protected: void clearModelsCache(); - Model* getModel(const ModelItem& modelItem); + Q_INVOKABLE Model* getModel(const ModelItem& modelItem); QMap _knownModelsItemModels; QMap _unknownModelsItemModels; }; diff --git a/libraries/models/src/ModelsScriptingInterface.cpp b/libraries/models/src/ModelsScriptingInterface.cpp index 634039f949..d2c3ed1ba7 100644 --- a/libraries/models/src/ModelsScriptingInterface.cpp +++ b/libraries/models/src/ModelsScriptingInterface.cpp @@ -70,7 +70,7 @@ ModelItemProperties ModelsScriptingInterface::getModelProperties(ModelItemID mod if (_modelTree) { _modelTree->lockForRead(); ModelItem* model = const_cast(_modelTree->findModelByID(identity.id, true)); - if (model) { + if (model && _modelTree->getGeometryForModel(*model)) { model->setSittingPoints(_modelTree->getGeometryForModel(*model)->sittingPoints); results.copyFromModelItem(*model); } else {