Update ScriptEngine::entityScriptingInterface to be static pointer

Statically allocating the EntityScriptingInterface means we can't make
sure it is initialized AFTER NodeList has been initialized
This commit is contained in:
Ryan Huffman 2015-03-02 10:40:46 -08:00
parent 9a302eebed
commit a443157dd7
2 changed files with 21 additions and 13 deletions

View file

@ -44,7 +44,7 @@
#include "MIDIEvent.h" #include "MIDIEvent.h"
EntityScriptingInterface ScriptEngine::_entityScriptingInterface; EntityScriptingInterface* ScriptEngine::_entityScriptingInterface;
static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine){ static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine){
qDebug() << "script:print()<<" << context->argument(0).toString(); qDebug() << "script:print()<<" << context->argument(0).toString();
@ -73,6 +73,13 @@ void inputControllerFromScriptValue(const QScriptValue &object, AbstractInputCon
out = qobject_cast<AbstractInputController*>(object.toQObject()); out = qobject_cast<AbstractInputController*>(object.toQObject());
} }
EntityScriptingInterface* ScriptEngine::getEntityScriptingInterface() {
if (ScriptEngine::_entityScriptingInterface == nullptr) {
ScriptEngine::_entityScriptingInterface = new EntityScriptingInterface();
}
return ScriptEngine::_entityScriptingInterface;
}
ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNameString, ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNameString,
AbstractControllerScriptingInterface* controllerScriptingInterface) : AbstractControllerScriptingInterface* controllerScriptingInterface) :
@ -97,6 +104,7 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNam
_isUserLoaded(false), _isUserLoaded(false),
_arrayBufferClass(new ArrayBufferClass(this)) _arrayBufferClass(new ArrayBufferClass(this))
{ {
getEntityScriptingInterface();
_allScriptsMutex.lock(); _allScriptsMutex.lock();
_allKnownScriptEngines.insert(this); _allKnownScriptEngines.insert(this);
_allScriptsMutex.unlock(); _allScriptsMutex.unlock();
@ -314,7 +322,7 @@ void ScriptEngine::init() {
auto sceneScriptingInterface = DependencyManager::set<SceneScriptingInterface>(); auto sceneScriptingInterface = DependencyManager::set<SceneScriptingInterface>();
_entityScriptingInterface.init(); _entityScriptingInterface->init();
// register various meta-types // register various meta-types
registerMetaTypes(this); registerMetaTypes(this);
@ -352,7 +360,7 @@ void ScriptEngine::init() {
registerGlobalObject("Script", this); registerGlobalObject("Script", this);
registerGlobalObject("Audio", &AudioScriptingInterface::getInstance()); registerGlobalObject("Audio", &AudioScriptingInterface::getInstance());
registerGlobalObject("Controller", _controllerScriptingInterface); registerGlobalObject("Controller", _controllerScriptingInterface);
registerGlobalObject("Entities", &_entityScriptingInterface); registerGlobalObject("Entities", _entityScriptingInterface);
registerGlobalObject("Quat", &_quatLibrary); registerGlobalObject("Quat", &_quatLibrary);
registerGlobalObject("Vec3", &_vec3Library); registerGlobalObject("Vec3", &_vec3Library);
registerGlobalObject("Uuid", &_uuidLibrary); registerGlobalObject("Uuid", &_uuidLibrary);
@ -489,13 +497,13 @@ void ScriptEngine::run() {
break; break;
} }
if (!_isFinished && _entityScriptingInterface.getEntityPacketSender()->serversExist()) { if (!_isFinished && _entityScriptingInterface->getEntityPacketSender()->serversExist()) {
// release the queue of edit entity messages. // release the queue of edit entity messages.
_entityScriptingInterface.getEntityPacketSender()->releaseQueuedMessages(); _entityScriptingInterface->getEntityPacketSender()->releaseQueuedMessages();
// since we're in non-threaded mode, call process so that the packets are sent // since we're in non-threaded mode, call process so that the packets are sent
if (!_entityScriptingInterface.getEntityPacketSender()->isThreaded()) { if (!_entityScriptingInterface->getEntityPacketSender()->isThreaded()) {
_entityScriptingInterface.getEntityPacketSender()->process(); _entityScriptingInterface->getEntityPacketSender()->process();
} }
} }
@ -622,13 +630,13 @@ void ScriptEngine::run() {
// kill the avatar identity timer // kill the avatar identity timer
delete _avatarIdentityTimer; delete _avatarIdentityTimer;
if (_entityScriptingInterface.getEntityPacketSender()->serversExist()) { if (_entityScriptingInterface->getEntityPacketSender()->serversExist()) {
// release the queue of edit entity messages. // release the queue of edit entity messages.
_entityScriptingInterface.getEntityPacketSender()->releaseQueuedMessages(); _entityScriptingInterface->getEntityPacketSender()->releaseQueuedMessages();
// since we're in non-threaded mode, call process so that the packets are sent // since we're in non-threaded mode, call process so that the packets are sent
if (!_entityScriptingInterface.getEntityPacketSender()->isThreaded()) { if (!_entityScriptingInterface->getEntityPacketSender()->isThreaded()) {
_entityScriptingInterface.getEntityPacketSender()->process(); _entityScriptingInterface->getEntityPacketSender()->process();
} }
} }

View file

@ -47,7 +47,7 @@ public:
~ScriptEngine(); ~ScriptEngine();
/// Access the EntityScriptingInterface in order to initialize it with a custom packet sender and jurisdiction listener /// Access the EntityScriptingInterface in order to initialize it with a custom packet sender and jurisdiction listener
static EntityScriptingInterface* getEntityScriptingInterface() { return &_entityScriptingInterface; } static EntityScriptingInterface* getEntityScriptingInterface();
ArrayBufferClass* getArrayBufferClass() { return _arrayBufferClass; } ArrayBufferClass* getArrayBufferClass() { return _arrayBufferClass; }
@ -153,7 +153,7 @@ private:
QObject* setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot); QObject* setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot);
void stopTimer(QTimer* timer); void stopTimer(QTimer* timer);
static EntityScriptingInterface _entityScriptingInterface; static EntityScriptingInterface* _entityScriptingInterface;
AbstractControllerScriptingInterface* _controllerScriptingInterface; AbstractControllerScriptingInterface* _controllerScriptingInterface;
AvatarData* _avatarData; AvatarData* _avatarData;