Merge branch 'make_scriptEngine_a_qScriptEngine' of https://github.com/Atlante45/hifi into 19840

This commit is contained in:
David Rowe 2014-07-22 20:21:19 -07:00
commit ffb696dc53
4 changed files with 74 additions and 80 deletions

View file

@ -23,8 +23,8 @@ static const QString CLASS_NAME = "ArrayBuffer";
Q_DECLARE_METATYPE(QByteArray*) Q_DECLARE_METATYPE(QByteArray*)
ArrayBufferClass::ArrayBufferClass(ScriptEngine* scriptEngine) : ArrayBufferClass::ArrayBufferClass(ScriptEngine* scriptEngine) :
QObject(scriptEngine->getEngine()), QObject(scriptEngine),
QScriptClass(scriptEngine->getEngine()), QScriptClass(scriptEngine),
_scriptEngine(scriptEngine) { _scriptEngine(scriptEngine) {
qScriptRegisterMetaType<QByteArray>(engine(), toScriptValue, fromScriptValue); qScriptRegisterMetaType<QByteArray>(engine(), toScriptValue, fromScriptValue);
QScriptValue global = engine()->globalObject(); QScriptValue global = engine()->globalObject();

View file

@ -14,8 +14,8 @@
Q_DECLARE_METATYPE(QByteArray*) Q_DECLARE_METATYPE(QByteArray*)
ArrayBufferViewClass::ArrayBufferViewClass(ScriptEngine* scriptEngine) : ArrayBufferViewClass::ArrayBufferViewClass(ScriptEngine* scriptEngine) :
QObject(scriptEngine->getEngine()), QObject(scriptEngine),
QScriptClass(scriptEngine->getEngine()), QScriptClass(scriptEngine),
_scriptEngine(scriptEngine) { _scriptEngine(scriptEngine) {
// Save string handles for quick lookup // Save string handles for quick lookup
_bufferName = engine()->toStringHandle(BUFFER_PROPERTY_NAME.toLatin1()); _bufferName = engine()->toStringHandle(BUFFER_PROPERTY_NAME.toLatin1());

View file

@ -87,7 +87,6 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNam
_isFinished(false), _isFinished(false),
_isRunning(false), _isRunning(false),
_isInitialized(false), _isInitialized(false),
_engine(),
_isAvatar(false), _isAvatar(false),
_avatarIdentityTimer(NULL), _avatarIdentityTimer(NULL),
_avatarBillboardTimer(NULL), _avatarBillboardTimer(NULL),
@ -113,7 +112,6 @@ ScriptEngine::ScriptEngine(const QUrl& scriptURL,
_isFinished(false), _isFinished(false),
_isRunning(false), _isRunning(false),
_isInitialized(false), _isInitialized(false),
_engine(),
_isAvatar(false), _isAvatar(false),
_avatarIdentityTimer(NULL), _avatarIdentityTimer(NULL),
_avatarBillboardTimer(NULL), _avatarBillboardTimer(NULL),
@ -194,7 +192,7 @@ void ScriptEngine::setAvatarData(AvatarData* avatarData, const QString& objectNa
_avatarData = avatarData; _avatarData = avatarData;
// remove the old Avatar property, if it exists // 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 // give the script engine the new Avatar script property
registerGlobalObject(objectName, _avatarData); registerGlobalObject(objectName, _avatarData);
@ -202,7 +200,7 @@ void ScriptEngine::setAvatarData(AvatarData* avatarData, const QString& objectNa
void ScriptEngine::setAvatarHashMap(AvatarHashMap* avatarHashMap, const QString& objectName) { void ScriptEngine::setAvatarHashMap(AvatarHashMap* avatarHashMap, const QString& objectName) {
// remove the old Avatar property, if it exists // 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 // give the script engine the new avatar hash map
registerGlobalObject(objectName, avatarHashMap); registerGlobalObject(objectName, avatarHashMap);
@ -231,48 +229,48 @@ void ScriptEngine::init() {
_particlesScriptingInterface.init(); _particlesScriptingInterface.init();
// register various meta-types // register various meta-types
registerMetaTypes(&_engine); registerMetaTypes(this);
registerMIDIMetaTypes(&_engine); registerMIDIMetaTypes(this);
registerVoxelMetaTypes(&_engine); registerVoxelMetaTypes(this);
registerEventTypes(&_engine); registerEventTypes(this);
registerMenuItemProperties(&_engine); registerMenuItemProperties(this);
registerAnimationTypes(&_engine); registerAnimationTypes(this);
registerAvatarTypes(&_engine); registerAvatarTypes(this);
Bitstream::registerTypes(&_engine); Bitstream::registerTypes(this);
qScriptRegisterMetaType(&_engine, ParticlePropertiesToScriptValue, ParticlePropertiesFromScriptValue); qScriptRegisterMetaType(this, ParticlePropertiesToScriptValue, ParticlePropertiesFromScriptValue);
qScriptRegisterMetaType(&_engine, ParticleIDtoScriptValue, ParticleIDfromScriptValue); qScriptRegisterMetaType(this, ParticleIDtoScriptValue, ParticleIDfromScriptValue);
qScriptRegisterSequenceMetaType<QVector<ParticleID> >(&_engine); qScriptRegisterSequenceMetaType<QVector<ParticleID> >(this);
qScriptRegisterMetaType(&_engine, ModelItemPropertiesToScriptValue, ModelItemPropertiesFromScriptValue); qScriptRegisterMetaType(this, ModelItemPropertiesToScriptValue, ModelItemPropertiesFromScriptValue);
qScriptRegisterMetaType(&_engine, ModelItemIDtoScriptValue, ModelItemIDfromScriptValue); qScriptRegisterMetaType(this, ModelItemIDtoScriptValue, ModelItemIDfromScriptValue);
qScriptRegisterMetaType(&_engine, RayToModelIntersectionResultToScriptValue, RayToModelIntersectionResultFromScriptValue); qScriptRegisterMetaType(this, RayToModelIntersectionResultToScriptValue, RayToModelIntersectionResultFromScriptValue);
qScriptRegisterSequenceMetaType<QVector<ModelItemID> >(&_engine); qScriptRegisterSequenceMetaType<QVector<ModelItemID> >(this);
qScriptRegisterSequenceMetaType<QVector<glm::vec2> >(&_engine); qScriptRegisterSequenceMetaType<QVector<glm::vec2> >(this);
qScriptRegisterSequenceMetaType<QVector<glm::quat> >(&_engine); qScriptRegisterSequenceMetaType<QVector<glm::quat> >(this);
qScriptRegisterSequenceMetaType<QVector<QString> >(&_engine); qScriptRegisterSequenceMetaType<QVector<QString> >(this);
QScriptValue xmlHttpRequestConstructorValue = _engine.newFunction(XMLHttpRequestClass::constructor); QScriptValue xmlHttpRequestConstructorValue = newFunction(XMLHttpRequestClass::constructor);
_engine.globalObject().setProperty("XMLHttpRequest", xmlHttpRequestConstructorValue); globalObject().setProperty("XMLHttpRequest", xmlHttpRequestConstructorValue);
QScriptValue printConstructorValue = _engine.newFunction(debugPrint); QScriptValue printConstructorValue = newFunction(debugPrint);
_engine.globalObject().setProperty("print", printConstructorValue); globalObject().setProperty("print", printConstructorValue);
QScriptValue soundConstructorValue = _engine.newFunction(soundConstructor); QScriptValue soundConstructorValue = newFunction(soundConstructor);
QScriptValue soundMetaObject = _engine.newQMetaObject(&Sound::staticMetaObject, soundConstructorValue); QScriptValue soundMetaObject = newQMetaObject(&Sound::staticMetaObject, soundConstructorValue);
_engine.globalObject().setProperty("Sound", soundMetaObject); globalObject().setProperty("Sound", soundMetaObject);
QScriptValue injectionOptionValue = _engine.scriptValueFromQMetaObject<AudioInjectorOptions>(); QScriptValue injectionOptionValue = scriptValueFromQMetaObject<AudioInjectorOptions>();
_engine.globalObject().setProperty("AudioInjectionOptions", injectionOptionValue); globalObject().setProperty("AudioInjectionOptions", injectionOptionValue);
QScriptValue localVoxelsValue = _engine.scriptValueFromQMetaObject<LocalVoxels>(); QScriptValue localVoxelsValue = scriptValueFromQMetaObject<LocalVoxels>();
_engine.globalObject().setProperty("LocalVoxels", localVoxelsValue); globalObject().setProperty("LocalVoxels", localVoxelsValue);
qScriptRegisterMetaType(&_engine, injectorToScriptValue, injectorFromScriptValue); qScriptRegisterMetaType(this, injectorToScriptValue, injectorFromScriptValue);
qScriptRegisterMetaType( &_engine, injectorToScriptValueInputController, injectorFromScriptValueInputController); qScriptRegisterMetaType( this, injectorToScriptValueInputController, injectorFromScriptValueInputController);
qScriptRegisterMetaType(&_engine, animationDetailsToScriptValue, animationDetailsFromScriptValue); qScriptRegisterMetaType(this, animationDetailsToScriptValue, animationDetailsFromScriptValue);
registerGlobalObject("Script", this); registerGlobalObject("Script", this);
registerGlobalObject("Audio", &_audioScriptingInterface); registerGlobalObject("Audio", &_audioScriptingInterface);
@ -287,15 +285,14 @@ void ScriptEngine::init() {
registerGlobalObject("Voxels", &_voxelsScriptingInterface); registerGlobalObject("Voxels", &_voxelsScriptingInterface);
// constants // constants
QScriptValue globalObject = _engine.globalObject(); globalObject().setProperty("TREE_SCALE", newVariant(QVariant(TREE_SCALE)));
globalObject.setProperty("TREE_SCALE", _engine.newVariant(QVariant(TREE_SCALE))); globalObject().setProperty("COLLISION_GROUP_ENVIRONMENT", newVariant(QVariant(COLLISION_GROUP_ENVIRONMENT)));
globalObject.setProperty("COLLISION_GROUP_ENVIRONMENT", _engine.newVariant(QVariant(COLLISION_GROUP_ENVIRONMENT))); globalObject().setProperty("COLLISION_GROUP_AVATARS", newVariant(QVariant(COLLISION_GROUP_AVATARS)));
globalObject.setProperty("COLLISION_GROUP_AVATARS", _engine.newVariant(QVariant(COLLISION_GROUP_AVATARS))); globalObject().setProperty("COLLISION_GROUP_VOXELS", newVariant(QVariant(COLLISION_GROUP_VOXELS)));
globalObject.setProperty("COLLISION_GROUP_VOXELS", _engine.newVariant(QVariant(COLLISION_GROUP_VOXELS))); globalObject().setProperty("COLLISION_GROUP_PARTICLES", newVariant(QVariant(COLLISION_GROUP_PARTICLES)));
globalObject.setProperty("COLLISION_GROUP_PARTICLES", _engine.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_LOCAL_GRAVITY", 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_ENVIRONMENTAL_GRAVITY", newVariant(QVariant(AVATAR_MOTION_OBEY_ENVIRONMENTAL_GRAVITY)));
// let the VoxelPacketSender know how frequently we plan to call it // let the VoxelPacketSender know how frequently we plan to call it
_voxelsScriptingInterface.getVoxelPacketSender()->setProcessCallIntervalHint(SCRIPT_DATA_CALLBACK_USECS); _voxelsScriptingInterface.getVoxelPacketSender()->setProcessCallIntervalHint(SCRIPT_DATA_CALLBACK_USECS);
@ -304,8 +301,8 @@ void ScriptEngine::init() {
QScriptValue ScriptEngine::registerGlobalObject(const QString& name, QObject* object) { QScriptValue ScriptEngine::registerGlobalObject(const QString& name, QObject* object) {
if (object) { if (object) {
QScriptValue value = _engine.newQObject(object); QScriptValue value = newQObject(object);
_engine.globalObject().setProperty(name, value); globalObject().setProperty(name, value);
return value; return value;
} }
return QScriptValue::NullValue; return QScriptValue::NullValue;
@ -313,15 +310,15 @@ QScriptValue ScriptEngine::registerGlobalObject(const QString& name, QObject* ob
void ScriptEngine::registerGetterSetter(const QString& name, QScriptEngine::FunctionSignature getter, void ScriptEngine::registerGetterSetter(const QString& name, QScriptEngine::FunctionSignature getter,
QScriptEngine::FunctionSignature setter, QScriptValue object) { QScriptEngine::FunctionSignature setter, QScriptValue object) {
QScriptValue setterFunction = _engine.newFunction(setter, 1); QScriptValue setterFunction = newFunction(setter, 1);
QScriptValue getterFunction = _engine.newFunction(getter); QScriptValue getterFunction = newFunction(getter);
if (!object.isNull()) { if (!object.isNull()) {
object.setProperty(name, setterFunction, QScriptValue::PropertySetter); object.setProperty(name, setterFunction, QScriptValue::PropertySetter);
object.setProperty(name, getterFunction, QScriptValue::PropertyGetter); object.setProperty(name, getterFunction, QScriptValue::PropertyGetter);
} else { } else {
_engine.globalObject().setProperty(name, setterFunction, QScriptValue::PropertySetter); globalObject().setProperty(name, setterFunction, QScriptValue::PropertySetter);
_engine.globalObject().setProperty(name, getterFunction, QScriptValue::PropertyGetter); globalObject().setProperty(name, getterFunction, QScriptValue::PropertyGetter);
} }
} }
@ -330,25 +327,24 @@ void ScriptEngine::evaluate() {
init(); init();
} }
QScriptValue result = _engine.evaluate(_scriptContents); QScriptValue result = evaluate(_scriptContents);
if (_engine.hasUncaughtException()) { if (hasUncaughtException()) {
int line = _engine.uncaughtExceptionLineNumber(); int line = uncaughtExceptionLineNumber();
qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << result.toString(); qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << result.toString();
emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(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 ScriptEngine::evaluate(const QString& program, const QString& fileName, int lineNumber) {
QScriptValue result = _engine.evaluate(program, fileName, lineNumber); QScriptValue result = QScriptEngine::evaluate(program, fileName, lineNumber);
bool hasUncaughtException = _engine.hasUncaughtException(); if (hasUncaughtException()) {
if (hasUncaughtException) { int line = uncaughtExceptionLineNumber();
int line = _engine.uncaughtExceptionLineNumber();
qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ": " << result.toString(); qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ": " << result.toString();
} }
emit evaluationFinished(result, hasUncaughtException); emit evaluationFinished(result, hasUncaughtException());
_engine.clearExceptions(); clearExceptions();
return result; return result;
} }
@ -372,12 +368,12 @@ void ScriptEngine::run() {
_isFinished = false; _isFinished = false;
emit runningStateChanged(); emit runningStateChanged();
QScriptValue result = _engine.evaluate(_scriptContents); QScriptValue result = evaluate(_scriptContents);
if (_engine.hasUncaughtException()) { if (hasUncaughtException()) {
int line = _engine.uncaughtExceptionLineNumber(); int line = uncaughtExceptionLineNumber();
qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << result.toString(); qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << result.toString();
emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + result.toString()); emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + result.toString());
_engine.clearExceptions(); clearExceptions();
} }
QElapsedTimer startTime; QElapsedTimer startTime;
@ -532,11 +528,11 @@ void ScriptEngine::run() {
qint64 now = usecTimestampNow(); qint64 now = usecTimestampNow();
float deltaTime = (float) (now - lastUpdate) / (float) USECS_PER_SECOND; float deltaTime = (float) (now - lastUpdate) / (float) USECS_PER_SECOND;
if (_engine.hasUncaughtException()) { if (hasUncaughtException()) {
int line = _engine.uncaughtExceptionLineNumber(); int line = uncaughtExceptionLineNumber();
qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << _engine.uncaughtException().toString(); qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << uncaughtException().toString();
emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + _engine.uncaughtException().toString()); emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + uncaughtException().toString());
_engine.clearExceptions(); clearExceptions();
} }
emit update(deltaTime); emit update(deltaTime);
@ -694,12 +690,12 @@ void ScriptEngine::include(const QString& includeFile) {
} }
} }
QScriptValue result = _engine.evaluate(includeContents); QScriptValue result = evaluate(includeContents);
if (_engine.hasUncaughtException()) { if (hasUncaughtException()) {
int line = _engine.uncaughtExceptionLineNumber(); int line = uncaughtExceptionLineNumber();
qDebug() << "Uncaught exception at (" << includeFile << ") line" << line << ":" << result.toString(); qDebug() << "Uncaught exception at (" << includeFile << ") line" << line << ":" << result.toString();
emit errorMessage("Uncaught exception at (" + includeFile + ") line" + QString::number(line) + ":" + result.toString()); emit errorMessage("Uncaught exception at (" + includeFile + ") line" + QString::number(line) + ":" + result.toString());
_engine.clearExceptions(); clearExceptions();
} }
} }

View file

@ -38,7 +38,7 @@ const QString NO_SCRIPT("");
const unsigned int SCRIPT_DATA_CALLBACK_USECS = floor(((1.0 / 60.0f) * 1000 * 1000) + 0.5); 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 Q_OBJECT
public: public:
ScriptEngine(const QUrl& scriptURL, 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 /// Access the ModelsScriptingInterface in order to initialize it with a custom packet sender and jurisdiction listener
static ModelsScriptingInterface* getModelsScriptingInterface() { return &_modelsScriptingInterface; } static ModelsScriptingInterface* getModelsScriptingInterface() { return &_modelsScriptingInterface; }
QScriptEngine* getEngine() { return &_engine; }
ArrayBufferClass* getArrayBufferClass() { return _arrayBufferClass; } ArrayBufferClass* getArrayBufferClass() { return _arrayBufferClass; }
/// sets the script contents, will return false if failed, will fail if script is already running /// sets the script contents, will return false if failed, will fail if script is already running
@ -121,7 +120,6 @@ protected:
bool _isFinished; bool _isFinished;
bool _isRunning; bool _isRunning;
bool _isInitialized; bool _isInitialized;
QScriptEngine _engine;
bool _isAvatar; bool _isAvatar;
QTimer* _avatarIdentityTimer; QTimer* _avatarIdentityTimer;
QTimer* _avatarBillboardTimer; QTimer* _avatarBillboardTimer;