History

merged with master

wangyix committed 12 years ago

Commit 0dfe0b12 parents a3b44a6 63624fa258 files · +11580 −2424Browse files

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

Unified · Split

libraries/script-engine/src/ScriptEngine.cpp+86−85
@@ -87,7 +87,6 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNam · 86 unmodified lines
87 _isFinished(false),87 _isFinished(false),
88 _isRunning(false),88 _isRunning(false),
89 _isInitialized(false),89 _isInitialized(false),
90 _engine(),
91 _isAvatar(false),90 _isAvatar(false),
92 _avatarIdentityTimer(NULL),91 _avatarIdentityTimer(NULL),
93 _avatarBillboardTimer(NULL),92 _avatarBillboardTimer(NULL),
@@ -113,7 +112,6 @@ ScriptEngine::ScriptEngine(const QUrl& scriptURL, · 19 unmodified lines
113 _isFinished(false),112 _isFinished(false),
114 _isRunning(false),113 _isRunning(false),
115 _isInitialized(false),114 _isInitialized(false),
116 _engine(),
117 _isAvatar(false),115 _isAvatar(false),
118 _avatarIdentityTimer(NULL),116 _avatarIdentityTimer(NULL),
119 _avatarBillboardTimer(NULL),117 _avatarBillboardTimer(NULL),
@@ -158,7 +156,7 @@ ScriptEngine::ScriptEngine(const QUrl& scriptURL, · 38 unmodified lines
158 } else {156 } else {
159 NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();157 NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
160 QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url));158 QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url));
161 qDebug() << "Downloading included script at" << url;159 qDebug() << "Downloading script at" << url;
162 QEventLoop loop;160 QEventLoop loop;
163 QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));161 QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
164 loop.exec();162 loop.exec();
@@ -194,7 +192,7 @@ void ScriptEngine::setAvatarData(AvatarData* avatarData, const QString& objectNa · 29 unmodified lines
194 _avatarData = avatarData;192 _avatarData = avatarData;
195 193
196 // remove the old Avatar property, if it exists194 // remove the old Avatar property, if it exists
197 _engine.globalObject().setProperty(objectName, QScriptValue());195 globalObject().setProperty(objectName, QScriptValue());
198 196
199 // give the script engine the new Avatar script property197 // give the script engine the new Avatar script property
200 registerGlobalObject(objectName, _avatarData);198 registerGlobalObject(objectName, _avatarData);
@@ -202,7 +200,7 @@ void ScriptEngine::setAvatarData(AvatarData* avatarData, const QString& objectNa · 1 unmodified line
202 200
203void ScriptEngine::setAvatarHashMap(AvatarHashMap* avatarHashMap, const QString& objectName) {201void ScriptEngine::setAvatarHashMap(AvatarHashMap* avatarHashMap, const QString& objectName) {
204 // remove the old Avatar property, if it exists202 // remove the old Avatar property, if it exists
205 _engine.globalObject().setProperty(objectName, QScriptValue());203 globalObject().setProperty(objectName, QScriptValue());
206 204
207 // give the script engine the new avatar hash map205 // give the script engine the new avatar hash map
208 registerGlobalObject(objectName, avatarHashMap);206 registerGlobalObject(objectName, avatarHashMap);
@@ -231,48 +229,48 @@ void ScriptEngine::init() { · 22 unmodified lines
231 _particlesScriptingInterface.init();229 _particlesScriptingInterface.init();
232 230
233 // register various meta-types231 // register various meta-types
234 registerMetaTypes(&_engine);232 registerMetaTypes(this);
235 registerMIDIMetaTypes(&_engine);233 registerMIDIMetaTypes(this);
236 registerVoxelMetaTypes(&_engine);234 registerVoxelMetaTypes(this);
237 registerEventTypes(&_engine);235 registerEventTypes(this);
238 registerMenuItemProperties(&_engine);236 registerMenuItemProperties(this);
239 registerAnimationTypes(&_engine);237 registerAnimationTypes(this);
240 registerAvatarTypes(&_engine);238 registerAvatarTypes(this);
241 Bitstream::registerTypes(&_engine);239 Bitstream::registerTypes(this);
242 240
243 qScriptRegisterMetaType(&_engine, ParticlePropertiesToScriptValue, ParticlePropertiesFromScriptValue);241 qScriptRegisterMetaType(this, ParticlePropertiesToScriptValue, ParticlePropertiesFromScriptValue);
244 qScriptRegisterMetaType(&_engine, ParticleIDtoScriptValue, ParticleIDfromScriptValue);242 qScriptRegisterMetaType(this, ParticleIDtoScriptValue, ParticleIDfromScriptValue);
245 qScriptRegisterSequenceMetaType<QVector<ParticleID> >(&_engine);243 qScriptRegisterSequenceMetaType<QVector<ParticleID> >(this);
246 244
247 qScriptRegisterMetaType(&_engine, ModelItemPropertiesToScriptValue, ModelItemPropertiesFromScriptValue);245 qScriptRegisterMetaType(this, ModelItemPropertiesToScriptValue, ModelItemPropertiesFromScriptValue);
248 qScriptRegisterMetaType(&_engine, ModelItemIDtoScriptValue, ModelItemIDfromScriptValue);246 qScriptRegisterMetaType(this, ModelItemIDtoScriptValue, ModelItemIDfromScriptValue);
249 qScriptRegisterMetaType(&_engine, RayToModelIntersectionResultToScriptValue, RayToModelIntersectionResultFromScriptValue);247 qScriptRegisterMetaType(this, RayToModelIntersectionResultToScriptValue, RayToModelIntersectionResultFromScriptValue);
250 qScriptRegisterSequenceMetaType<QVector<ModelItemID> >(&_engine);248 qScriptRegisterSequenceMetaType<QVector<ModelItemID> >(this);
251 249
252 qScriptRegisterSequenceMetaType<QVector<glm::vec2> >(&_engine);250 qScriptRegisterSequenceMetaType<QVector<glm::vec2> >(this);
253 qScriptRegisterSequenceMetaType<QVector<glm::quat> >(&_engine);251 qScriptRegisterSequenceMetaType<QVector<glm::quat> >(this);
254 qScriptRegisterSequenceMetaType<QVector<QString> >(&_engine);252 qScriptRegisterSequenceMetaType<QVector<QString> >(this);
255 253
256 QScriptValue xmlHttpRequestConstructorValue = _engine.newFunction(XMLHttpRequestClass::constructor);254 QScriptValue xmlHttpRequestConstructorValue = newFunction(XMLHttpRequestClass::constructor);
257 _engine.globalObject().setProperty("XMLHttpRequest", xmlHttpRequestConstructorValue);255 globalObject().setProperty("XMLHttpRequest", xmlHttpRequestConstructorValue);
258 256
259 QScriptValue printConstructorValue = _engine.newFunction(debugPrint);257 QScriptValue printConstructorValue = newFunction(debugPrint);
260 _engine.globalObject().setProperty("print", printConstructorValue);258 globalObject().setProperty("print", printConstructorValue);
261 259
262 QScriptValue soundConstructorValue = _engine.newFunction(soundConstructor);260 QScriptValue soundConstructorValue = newFunction(soundConstructor);
263 QScriptValue soundMetaObject = _engine.newQMetaObject(&Sound::staticMetaObject, soundConstructorValue);261 QScriptValue soundMetaObject = newQMetaObject(&Sound::staticMetaObject, soundConstructorValue);
264 _engine.globalObject().setProperty("Sound", soundMetaObject);262 globalObject().setProperty("Sound", soundMetaObject);
265 263
266 QScriptValue injectionOptionValue = _engine.scriptValueFromQMetaObject<AudioInjectorOptions>();264 QScriptValue injectionOptionValue = scriptValueFromQMetaObject<AudioInjectorOptions>();
267 _engine.globalObject().setProperty("AudioInjectionOptions", injectionOptionValue);265 globalObject().setProperty("AudioInjectionOptions", injectionOptionValue);
268 266
269 QScriptValue localVoxelsValue = _engine.scriptValueFromQMetaObject<LocalVoxels>();267 QScriptValue localVoxelsValue = scriptValueFromQMetaObject<LocalVoxels>();
270 _engine.globalObject().setProperty("LocalVoxels", localVoxelsValue);268 globalObject().setProperty("LocalVoxels", localVoxelsValue);
271 269
272 qScriptRegisterMetaType(&_engine, injectorToScriptValue, injectorFromScriptValue);270 qScriptRegisterMetaType(this, injectorToScriptValue, injectorFromScriptValue);
273 qScriptRegisterMetaType( &_engine, injectorToScriptValueInputController, injectorFromScriptValueInputController);271 qScriptRegisterMetaType( this, injectorToScriptValueInputController, injectorFromScriptValueInputController);
274 272
275 qScriptRegisterMetaType(&_engine, animationDetailsToScriptValue, animationDetailsFromScriptValue);273 qScriptRegisterMetaType(this, animationDetailsToScriptValue, animationDetailsFromScriptValue);
276 274
277 registerGlobalObject("Script", this);275 registerGlobalObject("Script", this);
278 registerGlobalObject("Audio", &_audioScriptingInterface);276 registerGlobalObject("Audio", &_audioScriptingInterface);
@@ -287,15 +285,14 @@ void ScriptEngine::init() { · 8 unmodified lines
287 registerGlobalObject("Voxels", &_voxelsScriptingInterface);285 registerGlobalObject("Voxels", &_voxelsScriptingInterface);
288 286
289 // constants287 // constants
290 QScriptValue globalObject = _engine.globalObject();288 globalObject().setProperty("TREE_SCALE", newVariant(QVariant(TREE_SCALE)));
291 globalObject.setProperty("TREE_SCALE", _engine.newVariant(QVariant(TREE_SCALE)));289 globalObject().setProperty("COLLISION_GROUP_ENVIRONMENT", newVariant(QVariant(COLLISION_GROUP_ENVIRONMENT)));
292 globalObject.setProperty("COLLISION_GROUP_ENVIRONMENT", _engine.newVariant(QVariant(COLLISION_GROUP_ENVIRONMENT)));290 globalObject().setProperty("COLLISION_GROUP_AVATARS", newVariant(QVariant(COLLISION_GROUP_AVATARS)));
293 globalObject.setProperty("COLLISION_GROUP_AVATARS", _engine.newVariant(QVariant(COLLISION_GROUP_AVATARS)));291 globalObject().setProperty("COLLISION_GROUP_VOXELS", newVariant(QVariant(COLLISION_GROUP_VOXELS)));
294 globalObject.setProperty("COLLISION_GROUP_VOXELS", _engine.newVariant(QVariant(COLLISION_GROUP_VOXELS)));292 globalObject().setProperty("COLLISION_GROUP_PARTICLES", newVariant(QVariant(COLLISION_GROUP_PARTICLES)));
295 globalObject.setProperty("COLLISION_GROUP_PARTICLES", _engine.newVariant(QVariant(COLLISION_GROUP_PARTICLES)));
296 293
297 globalObject.setProperty("AVATAR_MOTION_OBEY_LOCAL_GRAVITY", _engine.newVariant(QVariant(AVATAR_MOTION_OBEY_LOCAL_GRAVITY)));294 globalObject().setProperty("AVATAR_MOTION_OBEY_LOCAL_GRAVITY", newVariant(QVariant(AVATAR_MOTION_OBEY_LOCAL_GRAVITY)));
298 globalObject.setProperty("AVATAR_MOTION_OBEY_ENVIRONMENTAL_GRAVITY", _engine.newVariant(QVariant(AVATAR_MOTION_OBEY_ENVIRONMENTAL_GRAVITY)));295 globalObject().setProperty("AVATAR_MOTION_OBEY_ENVIRONMENTAL_GRAVITY", newVariant(QVariant(AVATAR_MOTION_OBEY_ENVIRONMENTAL_GRAVITY)));
299 296
300 // let the VoxelPacketSender know how frequently we plan to call it297 // let the VoxelPacketSender know how frequently we plan to call it
301 _voxelsScriptingInterface.getVoxelPacketSender()->setProcessCallIntervalHint(SCRIPT_DATA_CALLBACK_USECS);298 _voxelsScriptingInterface.getVoxelPacketSender()->setProcessCallIntervalHint(SCRIPT_DATA_CALLBACK_USECS);
@@ -304,8 +301,8 @@ void ScriptEngine::init() { · 2 unmodified lines
304 301
305QScriptValue ScriptEngine::registerGlobalObject(const QString& name, QObject* object) {302QScriptValue ScriptEngine::registerGlobalObject(const QString& name, QObject* object) {
306 if (object) {303 if (object) {
307 QScriptValue value = _engine.newQObject(object);304 QScriptValue value = newQObject(object);
308 _engine.globalObject().setProperty(name, value);305 globalObject().setProperty(name, value);
309 return value;306 return value;
310 }307 }
311 return QScriptValue::NullValue;308 return QScriptValue::NullValue;
@@ -313,15 +310,15 @@ QScriptValue ScriptEngine::registerGlobalObject(const QString& name, QObject* ob · 1 unmodified line
313 310
314void ScriptEngine::registerGetterSetter(const QString& name, QScriptEngine::FunctionSignature getter,311void ScriptEngine::registerGetterSetter(const QString& name, QScriptEngine::FunctionSignature getter,
315 QScriptEngine::FunctionSignature setter, QScriptValue object) {312 QScriptEngine::FunctionSignature setter, QScriptValue object) {
316 QScriptValue setterFunction = _engine.newFunction(setter, 1);313 QScriptValue setterFunction = newFunction(setter, 1);
317 QScriptValue getterFunction = _engine.newFunction(getter);314 QScriptValue getterFunction = newFunction(getter);
318 315
319 if (!object.isNull()) {316 if (!object.isNull()) {
320 object.setProperty(name, setterFunction, QScriptValue::PropertySetter);317 object.setProperty(name, setterFunction, QScriptValue::PropertySetter);
321 object.setProperty(name, getterFunction, QScriptValue::PropertyGetter);318 object.setProperty(name, getterFunction, QScriptValue::PropertyGetter);
322 } else {319 } else {
323 _engine.globalObject().setProperty(name, setterFunction, QScriptValue::PropertySetter);320 globalObject().setProperty(name, setterFunction, QScriptValue::PropertySetter);
324 _engine.globalObject().setProperty(name, getterFunction, QScriptValue::PropertyGetter);321 globalObject().setProperty(name, getterFunction, QScriptValue::PropertyGetter);
325 }322 }
326}323}
327 324
@@ -330,25 +327,24 @@ void ScriptEngine::evaluate() { · 2 unmodified lines
330 init();327 init();
331 }328 }
332 329
333 QScriptValue result = _engine.evaluate(_scriptContents);330 QScriptValue result = evaluate(_scriptContents);
334 331
335 if (_engine.hasUncaughtException()) {332 if (hasUncaughtException()) {
336 int line = _engine.uncaughtExceptionLineNumber();333 int line = uncaughtExceptionLineNumber();
337 qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << result.toString();334 qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << result.toString();
338 emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + result.toString());335 emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + result.toString());
339 _engine.clearExceptions();336 clearExceptions();
340 }337 }
341}338}
342 339
343QScriptValue ScriptEngine::evaluate(const QString& program, const QString& fileName, int lineNumber) {340QScriptValue ScriptEngine::evaluate(const QString& program, const QString& fileName, int lineNumber) {
344 QScriptValue result = _engine.evaluate(program, fileName, lineNumber);341 QScriptValue result = QScriptEngine::evaluate(program, fileName, lineNumber);
345 bool hasUncaughtException = _engine.hasUncaughtException();342 if (hasUncaughtException()) {
346 if (hasUncaughtException) {343 int line = uncaughtExceptionLineNumber();
347 int line = _engine.uncaughtExceptionLineNumber();
348 qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ": " << result.toString();344 qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ": " << result.toString();
349 }345 }
350 emit evaluationFinished(result, hasUncaughtException);346 emit evaluationFinished(result, hasUncaughtException());
351 _engine.clearExceptions();347 clearExceptions();
352 return result;348 return result;
353}349}
354 350
@@ -372,12 +368,12 @@ void ScriptEngine::run() { · 17 unmodified lines
372 _isFinished = false;368 _isFinished = false;
373 emit runningStateChanged();369 emit runningStateChanged();
374 370
375 QScriptValue result = _engine.evaluate(_scriptContents);371 QScriptValue result = evaluate(_scriptContents);
376 if (_engine.hasUncaughtException()) {372 if (hasUncaughtException()) {
377 int line = _engine.uncaughtExceptionLineNumber();373 int line = uncaughtExceptionLineNumber();
378 qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << result.toString();374 qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << result.toString();
379 emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + result.toString());375 emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + result.toString());
380 _engine.clearExceptions();376 clearExceptions();
381 }377 }
382 378
383 QElapsedTimer startTime;379 QElapsedTimer startTime;
@@ -532,11 +528,11 @@ void ScriptEngine::run() { · 148 unmodified lines
532 qint64 now = usecTimestampNow();528 qint64 now = usecTimestampNow();
533 float deltaTime = (float) (now - lastUpdate) / (float) USECS_PER_SECOND;529 float deltaTime = (float) (now - lastUpdate) / (float) USECS_PER_SECOND;
534 530
535 if (_engine.hasUncaughtException()) {531 if (hasUncaughtException()) {
536 int line = _engine.uncaughtExceptionLineNumber();532 int line = uncaughtExceptionLineNumber();
537 qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << _engine.uncaughtException().toString();533 qDebug() << "Uncaught exception at (" << _fileNameString << ") line" << line << ":" << uncaughtException().toString();
538 emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + _engine.uncaughtException().toString());534 emit errorMessage("Uncaught exception at (" + _fileNameString + ") line" + QString::number(line) + ":" + uncaughtException().toString());
539 _engine.clearExceptions();535 clearExceptions();
540 }536 }
541 537
542 emit update(deltaTime);538 emit update(deltaTime);
@@ -685,24 +681,29 @@ void ScriptEngine::include(const QString& includeFile) { · 142 unmodified lines
685#endif681#endif
686 QFile scriptFile(fileName);682 QFile scriptFile(fileName);
687 if (scriptFile.open(QFile::ReadOnly | QFile::Text)) {683 if (scriptFile.open(QFile::ReadOnly | QFile::Text)) {
688 qDebug() << "Loading file:" << fileName;684 qDebug() << "Including file:" << fileName;
689 QTextStream in(&scriptFile);685 QTextStream in(&scriptFile);
690 includeContents = in.readAll();686 includeContents = in.readAll();
691 } else {687 } else {
692 qDebug() << "ERROR Loading file:" << fileName;688 qDebug() << "ERROR Including file:" << fileName;
693 emit errorMessage("ERROR Loading file:" + fileName);689 emit errorMessage("ERROR Including file:" + fileName);
694 }690 }
695 }691 }
696 692
697 QScriptValue result = _engine.evaluate(includeContents);693 QScriptValue result = evaluate(includeContents);
698 if (_engine.hasUncaughtException()) {694 if (hasUncaughtException()) {
699 int line = _engine.uncaughtExceptionLineNumber();695 int line = uncaughtExceptionLineNumber();
700 qDebug() << "Uncaught exception at (" << includeFile << ") line" << line << ":" << result.toString();696 qDebug() << "Uncaught exception at (" << includeFile << ") line" << line << ":" << result.toString();
701 emit errorMessage("Uncaught exception at (" + includeFile + ") line" + QString::number(line) + ":" + result.toString());697 emit errorMessage("Uncaught exception at (" + includeFile + ") line" + QString::number(line) + ":" + result.toString());
702 _engine.clearExceptions();698 clearExceptions();
703 }699 }
704}700}
705 701
702void ScriptEngine::load(const QString& loadFile) {
703 QUrl url = resolveInclude(loadFile);
704 emit loadScript(url.toString());
705}
706
706void ScriptEngine::nodeKilled(SharedNodePointer node) {707void ScriptEngine::nodeKilled(SharedNodePointer node) {
707 _outgoingScriptAudioSequenceNumbers.remove(node->getUUID());708 _outgoingScriptAudioSequenceNumbers.remove(node->getUUID());
708}709}