Merge branch 'master' of github.com:highfidelity/hifi into tablet-ui

This commit is contained in:
Seth Alves 2017-03-21 14:04:58 -07:00
commit 91cac892d2
8 changed files with 64 additions and 49 deletions

View file

@ -58,6 +58,8 @@ EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssig
DependencyManager::registerInheritance<SpatialParentFinder, AssignmentParentFinder>(); DependencyManager::registerInheritance<SpatialParentFinder, AssignmentParentFinder>();
DependencyManager::set<AudioScriptingInterface>();
DependencyManager::set<ResourceCacheSharedItems>(); DependencyManager::set<ResourceCacheSharedItems>();
DependencyManager::set<SoundCache>(); DependencyManager::set<SoundCache>();
DependencyManager::set<AudioInjectorManager>(); DependencyManager::set<AudioInjectorManager>();
@ -324,7 +326,26 @@ void EntityScriptServer::nodeActivated(SharedNodePointer activatedNode) {
void EntityScriptServer::nodeKilled(SharedNodePointer killedNode) { void EntityScriptServer::nodeKilled(SharedNodePointer killedNode) {
switch (killedNode->getType()) { switch (killedNode->getType()) {
case NodeType::EntityServer: { case NodeType::EntityServer: {
clear(); // Before we clear, make sure this was our only entity server.
// Otherwise we're assuming that we have "trading" entity servers
// (an old one going away and a new one coming onboard)
// and that we shouldn't clear here because we're still doing work.
bool hasAnotherEntityServer = false;
auto nodeList = DependencyManager::get<NodeList>();
nodeList->eachNodeBreakable([&hasAnotherEntityServer, &killedNode](const SharedNodePointer& node){
if (node->getType() == NodeType::EntityServer && node->getUUID() != killedNode->getUUID()) {
// we're talking to > 1 entity servers, we know we won't clear
hasAnotherEntityServer = true;
return false;
}
return true;
});
if (!hasAnotherEntityServer) {
clear();
}
break; break;
} }
@ -395,7 +416,8 @@ void EntityScriptServer::selectAudioFormat(const QString& selectedCodecName) {
void EntityScriptServer::resetEntitiesScriptEngine() { void EntityScriptServer::resetEntitiesScriptEngine() {
auto engineName = QString("about:Entities %1").arg(++_entitiesScriptEngineCount); auto engineName = QString("about:Entities %1").arg(++_entitiesScriptEngineCount);
auto newEngine = QSharedPointer<ScriptEngine>(new ScriptEngine(ScriptEngine::ENTITY_SERVER_SCRIPT, NO_SCRIPT, engineName)); auto newEngine = QSharedPointer<ScriptEngine>(new ScriptEngine(ScriptEngine::ENTITY_SERVER_SCRIPT, NO_SCRIPT, engineName),
&ScriptEngine::deleteLater);
auto webSocketServerConstructorValue = newEngine->newFunction(WebSocketServerClass::constructor); auto webSocketServerConstructorValue = newEngine->newFunction(WebSocketServerClass::constructor);
newEngine->globalObject().setProperty("WebSocketServer", webSocketServerConstructorValue); newEngine->globalObject().setProperty("WebSocketServer", webSocketServerConstructorValue);

View file

@ -745,23 +745,24 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
} }
}); });
auto& audioScriptingInterface = AudioScriptingInterface::getInstance(); auto audioScriptingInterface = DependencyManager::set<AudioScriptingInterface>();
connect(audioThread, &QThread::started, audioIO.data(), &AudioClient::start); connect(audioThread, &QThread::started, audioIO.data(), &AudioClient::start);
connect(audioIO.data(), &AudioClient::destroyed, audioThread, &QThread::quit); connect(audioIO.data(), &AudioClient::destroyed, audioThread, &QThread::quit);
connect(audioThread, &QThread::finished, audioThread, &QThread::deleteLater); connect(audioThread, &QThread::finished, audioThread, &QThread::deleteLater);
connect(audioIO.data(), &AudioClient::muteToggled, this, &Application::audioMuteToggled); connect(audioIO.data(), &AudioClient::muteToggled, this, &Application::audioMuteToggled);
connect(audioIO.data(), &AudioClient::mutedByMixer, &audioScriptingInterface, &AudioScriptingInterface::mutedByMixer); connect(audioIO.data(), &AudioClient::mutedByMixer, audioScriptingInterface.data(), &AudioScriptingInterface::mutedByMixer);
connect(audioIO.data(), &AudioClient::receivedFirstPacket, &audioScriptingInterface, &AudioScriptingInterface::receivedFirstPacket); connect(audioIO.data(), &AudioClient::receivedFirstPacket, audioScriptingInterface.data(), &AudioScriptingInterface::receivedFirstPacket);
connect(audioIO.data(), &AudioClient::disconnected, &audioScriptingInterface, &AudioScriptingInterface::disconnected); connect(audioIO.data(), &AudioClient::disconnected, audioScriptingInterface.data(), &AudioScriptingInterface::disconnected);
connect(audioIO.data(), &AudioClient::muteEnvironmentRequested, [](glm::vec3 position, float radius) { connect(audioIO.data(), &AudioClient::muteEnvironmentRequested, [](glm::vec3 position, float radius) {
auto audioClient = DependencyManager::get<AudioClient>(); auto audioClient = DependencyManager::get<AudioClient>();
auto audioScriptingInterface = DependencyManager::get<AudioScriptingInterface>();
auto myAvatarPosition = DependencyManager::get<AvatarManager>()->getMyAvatar()->getPosition(); auto myAvatarPosition = DependencyManager::get<AvatarManager>()->getMyAvatar()->getPosition();
float distance = glm::distance(myAvatarPosition, position); float distance = glm::distance(myAvatarPosition, position);
bool shouldMute = !audioClient->isMuted() && (distance < radius); bool shouldMute = !audioClient->isMuted() && (distance < radius);
if (shouldMute) { if (shouldMute) {
audioClient->toggleMute(); audioClient->toggleMute();
AudioScriptingInterface::getInstance().environmentMuted(); audioScriptingInterface->environmentMuted();
} }
}); });
@ -1189,10 +1190,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
// set the local loopback interface for local sounds // set the local loopback interface for local sounds
AudioInjector::setLocalAudioInterface(audioIO.data()); AudioInjector::setLocalAudioInterface(audioIO.data());
AudioScriptingInterface::getInstance().setLocalAudioInterface(audioIO.data()); audioScriptingInterface->setLocalAudioInterface(audioIO.data());
connect(audioIO.data(), &AudioClient::noiseGateOpened, &AudioScriptingInterface::getInstance(), &AudioScriptingInterface::noiseGateOpened); connect(audioIO.data(), &AudioClient::noiseGateOpened, audioScriptingInterface.data(), &AudioScriptingInterface::noiseGateOpened);
connect(audioIO.data(), &AudioClient::noiseGateClosed, &AudioScriptingInterface::getInstance(), &AudioScriptingInterface::noiseGateClosed); connect(audioIO.data(), &AudioClient::noiseGateClosed, audioScriptingInterface.data(), &AudioScriptingInterface::noiseGateClosed);
connect(audioIO.data(), &AudioClient::inputReceived, &AudioScriptingInterface::getInstance(), &AudioScriptingInterface::inputReceived); connect(audioIO.data(), &AudioClient::inputReceived, audioScriptingInterface.data(), &AudioScriptingInterface::inputReceived);
this->installEventFilter(this); this->installEventFilter(this);
@ -1956,7 +1957,7 @@ void Application::initializeUi() {
// For some reason there is already an "Application" object in the QML context, // For some reason there is already an "Application" object in the QML context,
// though I can't find it. Hence, "ApplicationInterface" // though I can't find it. Hence, "ApplicationInterface"
rootContext->setContextProperty("ApplicationInterface", this); rootContext->setContextProperty("ApplicationInterface", this);
rootContext->setContextProperty("Audio", &AudioScriptingInterface::getInstance()); rootContext->setContextProperty("Audio", DependencyManager::get<AudioScriptingInterface>().data());
rootContext->setContextProperty("AudioStats", DependencyManager::get<AudioClient>()->getStats().data()); rootContext->setContextProperty("AudioStats", DependencyManager::get<AudioClient>()->getStats().data());
rootContext->setContextProperty("AudioScope", DependencyManager::get<AudioScope>().data()); rootContext->setContextProperty("AudioScope", DependencyManager::get<AudioScope>().data());

View file

@ -19,11 +19,6 @@ void registerAudioMetaTypes(QScriptEngine* engine) {
qScriptRegisterMetaType(engine, soundSharedPointerToScriptValue, soundSharedPointerFromScriptValue); qScriptRegisterMetaType(engine, soundSharedPointerToScriptValue, soundSharedPointerFromScriptValue);
} }
AudioScriptingInterface& AudioScriptingInterface::getInstance() {
static AudioScriptingInterface staticInstance;
return staticInstance;
}
AudioScriptingInterface::AudioScriptingInterface() : AudioScriptingInterface::AudioScriptingInterface() :
_localAudioInterface(NULL) _localAudioInterface(NULL)
{ {

View file

@ -14,18 +14,20 @@
#include <AbstractAudioInterface.h> #include <AbstractAudioInterface.h>
#include <AudioInjector.h> #include <AudioInjector.h>
#include <DependencyManager.h>
#include <Sound.h> #include <Sound.h>
class ScriptAudioInjector; class ScriptAudioInjector;
class AudioScriptingInterface : public QObject { class AudioScriptingInterface : public QObject, public Dependency {
Q_OBJECT Q_OBJECT
public: SINGLETON_DEPENDENCY
static AudioScriptingInterface& getInstance();
public:
void setLocalAudioInterface(AbstractAudioInterface* audioInterface) { _localAudioInterface = audioInterface; } void setLocalAudioInterface(AbstractAudioInterface* audioInterface) { _localAudioInterface = audioInterface; }
protected: protected:
// this method is protected to stop C++ callers from calling, but invokable from script // this method is protected to stop C++ callers from calling, but invokable from script
Q_INVOKABLE ScriptAudioInjector* playSound(SharedSoundPointer sound, const AudioInjectorOptions& injectorOptions = AudioInjectorOptions()); Q_INVOKABLE ScriptAudioInjector* playSound(SharedSoundPointer sound, const AudioInjectorOptions& injectorOptions = AudioInjectorOptions());
@ -42,6 +44,7 @@ signals:
private: private:
AudioScriptingInterface(); AudioScriptingInterface();
AbstractAudioInterface* _localAudioInterface; AbstractAudioInterface* _localAudioInterface;
}; };

View file

@ -464,17 +464,17 @@ void ScriptEngine::loadURL(const QUrl& scriptURL, bool reload) {
void ScriptEngine::scriptErrorMessage(const QString& message) { void ScriptEngine::scriptErrorMessage(const QString& message) {
qCCritical(scriptengine) << qPrintable(message); qCCritical(scriptengine) << qPrintable(message);
emit errorMessage(message); emit errorMessage(message, getFilename());
} }
void ScriptEngine::scriptWarningMessage(const QString& message) { void ScriptEngine::scriptWarningMessage(const QString& message) {
qCWarning(scriptengine) << message; qCWarning(scriptengine) << message;
emit warningMessage(message); emit warningMessage(message, getFilename());
} }
void ScriptEngine::scriptInfoMessage(const QString& message) { void ScriptEngine::scriptInfoMessage(const QString& message) {
qCInfo(scriptengine) << message; qCInfo(scriptengine) << message;
emit infoMessage(message); emit infoMessage(message, getFilename());
} }
// Even though we never pass AnimVariantMap directly to and from javascript, the queued invokeMethod of // Even though we never pass AnimVariantMap directly to and from javascript, the queued invokeMethod of
@ -627,6 +627,9 @@ void ScriptEngine::init() {
qScriptRegisterMetaType(this, qWSCloseCodeToScriptValue, qWSCloseCodeFromScriptValue); qScriptRegisterMetaType(this, qWSCloseCodeToScriptValue, qWSCloseCodeFromScriptValue);
qScriptRegisterMetaType(this, wscReadyStateToScriptValue, wscReadyStateFromScriptValue); qScriptRegisterMetaType(this, wscReadyStateToScriptValue, wscReadyStateFromScriptValue);
// NOTE: You do not want to end up creating new instances of singletons here. They will be on the ScriptEngine thread
// and are likely to be unusable if we "reset" the ScriptEngine by creating a new one (on a whole new thread).
registerGlobalObject("Script", this); registerGlobalObject("Script", this);
{ {
@ -638,7 +641,8 @@ void ScriptEngine::init() {
resetModuleCache(); resetModuleCache();
} }
registerGlobalObject("Audio", &AudioScriptingInterface::getInstance()); registerGlobalObject("Audio", DependencyManager::get<AudioScriptingInterface>().data());
registerGlobalObject("Entities", entityScriptingInterface.data()); registerGlobalObject("Entities", entityScriptingInterface.data());
registerGlobalObject("Quat", &_quatLibrary); registerGlobalObject("Quat", &_quatLibrary);
registerGlobalObject("Vec3", &_vec3Library); registerGlobalObject("Vec3", &_vec3Library);
@ -1347,7 +1351,7 @@ QUrl ScriptEngine::resourcesPath() const {
} }
void ScriptEngine::print(const QString& message) { void ScriptEngine::print(const QString& message) {
emit printedMessage(message); emit printedMessage(message, getFilename());
} }
// Script.require.resolve -- like resolvePath, but performs more validation and throws exceptions on invalid module identifiers (for consistency with Node.js) // Script.require.resolve -- like resolvePath, but performs more validation and throws exceptions on invalid module identifiers (for consistency with Node.js)

View file

@ -236,10 +236,10 @@ signals:
void scriptEnding(); void scriptEnding();
void finished(const QString& fileNameString, ScriptEngine* engine); void finished(const QString& fileNameString, ScriptEngine* engine);
void cleanupMenuItem(const QString& menuItemString); void cleanupMenuItem(const QString& menuItemString);
void printedMessage(const QString& message); void printedMessage(const QString& message, const QString& scriptName);
void errorMessage(const QString& message); void errorMessage(const QString& message, const QString& scriptName);
void warningMessage(const QString& message); void warningMessage(const QString& message, const QString& scriptName);
void infoMessage(const QString& message); void infoMessage(const QString& message, const QString& scriptName);
void runningStateChanged(); void runningStateChanged();
void loadScript(const QString& scriptName, bool isUserLoaded); void loadScript(const QString& scriptName, bool isUserLoaded);
void reloadScript(const QString& scriptName, bool isUserLoaded); void reloadScript(const QString& scriptName, bool isUserLoaded);

View file

@ -34,34 +34,24 @@ ScriptsModel& getScriptsModel() {
return scriptsModel; return scriptsModel;
} }
void ScriptEngines::onPrintedMessage(const QString& message) { void ScriptEngines::onPrintedMessage(const QString& message, const QString& scriptName) {
auto scriptEngine = qobject_cast<ScriptEngine*>(sender());
auto scriptName = scriptEngine ? scriptEngine->getFilename() : "";
emit printedMessage(message, scriptName); emit printedMessage(message, scriptName);
} }
void ScriptEngines::onErrorMessage(const QString& message) { void ScriptEngines::onErrorMessage(const QString& message, const QString& scriptName) {
auto scriptEngine = qobject_cast<ScriptEngine*>(sender());
auto scriptName = scriptEngine ? scriptEngine->getFilename() : "";
emit errorMessage(message, scriptName); emit errorMessage(message, scriptName);
} }
void ScriptEngines::onWarningMessage(const QString& message) { void ScriptEngines::onWarningMessage(const QString& message, const QString& scriptName) {
auto scriptEngine = qobject_cast<ScriptEngine*>(sender());
auto scriptName = scriptEngine ? scriptEngine->getFilename() : "";
emit warningMessage(message, scriptName); emit warningMessage(message, scriptName);
} }
void ScriptEngines::onInfoMessage(const QString& message) { void ScriptEngines::onInfoMessage(const QString& message, const QString& scriptName) {
auto scriptEngine = qobject_cast<ScriptEngine*>(sender());
auto scriptName = scriptEngine ? scriptEngine->getFilename() : "";
emit infoMessage(message, scriptName); emit infoMessage(message, scriptName);
} }
void ScriptEngines::onErrorLoadingScript(const QString& url) { void ScriptEngines::onErrorLoadingScript(const QString& url) {
auto scriptEngine = qobject_cast<ScriptEngine*>(sender()); emit errorLoadingScript(url);
auto scriptName = scriptEngine ? scriptEngine->getFilename() : "";
emit errorLoadingScript(url, scriptName);
} }
ScriptEngines::ScriptEngines(ScriptEngine::Context context) ScriptEngines::ScriptEngines(ScriptEngine::Context context)

View file

@ -79,13 +79,13 @@ signals:
void errorMessage(const QString& message, const QString& engineName); void errorMessage(const QString& message, const QString& engineName);
void warningMessage(const QString& message, const QString& engineName); void warningMessage(const QString& message, const QString& engineName);
void infoMessage(const QString& message, const QString& engineName); void infoMessage(const QString& message, const QString& engineName);
void errorLoadingScript(const QString& url, const QString& engineName); void errorLoadingScript(const QString& url);
public slots: public slots:
void onPrintedMessage(const QString& message); void onPrintedMessage(const QString& message, const QString& scriptName);
void onErrorMessage(const QString& message); void onErrorMessage(const QString& message, const QString& scriptName);
void onWarningMessage(const QString& message); void onWarningMessage(const QString& message, const QString& scriptName);
void onInfoMessage(const QString& message); void onInfoMessage(const QString& message, const QString& scriptName);
void onErrorLoadingScript(const QString& url); void onErrorLoadingScript(const QString& url);
protected slots: protected slots: