From b9fecb8b92daa7cee2be643fac465a7dba4abec5 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 9 May 2014 14:34:13 -0700 Subject: [PATCH 1/4] Wait for scripts to finish before restarting them. --- interface/src/Application.cpp | 126 ++++++++++++++++------------------ interface/src/Application.h | 4 +- 2 files changed, 63 insertions(+), 67 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 61666ccdeb..1f7ddb616a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3374,71 +3374,6 @@ void Application::saveScripts() { _settings->endArray(); } -void Application::stopAllScripts() { - // stops all current running scripts - for (int i = 0; i < _scriptEnginesHash.size(); ++i) { - _scriptEnginesHash.values().at(i)->stop(); - qDebug() << "stopping script..." << getRunningScripts().at(i); - } - _scriptEnginesHash.clear(); - _runningScriptsWidget->setRunningScripts(getRunningScripts()); - bumpSettings(); -} - -void Application::stopScript(const QString &scriptName) { - if (_scriptEnginesHash.contains(scriptName)) { - _scriptEnginesHash.value(scriptName)->stop(); - qDebug() << "stopping script..." << scriptName; - _scriptEnginesHash.remove(scriptName); - _runningScriptsWidget->setRunningScripts(getRunningScripts()); - bumpSettings(); - } -} - -void Application::reloadAllScripts() { - // remember all the current scripts so we can reload them - QStringList reloadList = getRunningScripts(); - // reloads all current running scripts - stopAllScripts(); - - foreach (QString scriptName, reloadList){ - qDebug() << "reloading script..." << scriptName; - loadScript(scriptName); - } -} - -void Application::manageRunningScriptsWidgetVisibility(bool shown) { - if (_runningScriptsWidgetWasVisible && shown) { - _runningScriptsWidget->show(); - } else if (_runningScriptsWidgetWasVisible && !shown) { - _runningScriptsWidget->hide(); - } -} - -void Application::toggleRunningScriptsWidget() { - if (_runningScriptsWidgetWasVisible) { - _runningScriptsWidget->hide(); - _runningScriptsWidgetWasVisible = false; - } else { - _runningScriptsWidget->setBoundary(QRect(_window->geometry().topLeft(), - _window->size())); - _runningScriptsWidget->show(); - _runningScriptsWidgetWasVisible = true; - } -} - -void Application::uploadHead() { - uploadModel(HEAD_MODEL); -} - -void Application::uploadSkeleton() { - uploadModel(SKELETON_MODEL); -} - -void Application::uploadAttachment() { - uploadModel(ATTACHMENT_MODEL); -} - ScriptEngine* Application::loadScript(const QString& scriptName, bool loadScriptFromEditor) { if(loadScriptFromEditor && _scriptEnginesHash.contains(scriptName) && !_scriptEnginesHash[scriptName]->isFinished()){ return _scriptEnginesHash[scriptName]; @@ -3518,6 +3453,67 @@ ScriptEngine* Application::loadScript(const QString& scriptName, bool loadScript return scriptEngine; } +void Application::stopAllScripts(bool restart) { + // stops all current running scripts + for (QHash::const_iterator it = _scriptEnginesHash.constBegin(); + it != _scriptEnginesHash.constEnd(); it++) { + if (restart) { + connect(it.value(), SIGNAL(finished(const QString&)), SLOT(loadScript(const QString&))); + } + it.value()->stop(); + qDebug() << "stopping script..." << it.key(); + } + _scriptEnginesHash.clear(); + _runningScriptsWidget->setRunningScripts(getRunningScripts()); + bumpSettings(); +} + +void Application::stopScript(const QString &scriptName) { + if (_scriptEnginesHash.contains(scriptName)) { + _scriptEnginesHash.value(scriptName)->stop(); + qDebug() << "stopping script..." << scriptName; + _scriptEnginesHash.remove(scriptName); + _runningScriptsWidget->setRunningScripts(getRunningScripts()); + bumpSettings(); + } +} + +void Application::reloadAllScripts() { + stopAllScripts(true); +} + +void Application::manageRunningScriptsWidgetVisibility(bool shown) { + if (_runningScriptsWidgetWasVisible && shown) { + _runningScriptsWidget->show(); + } else if (_runningScriptsWidgetWasVisible && !shown) { + _runningScriptsWidget->hide(); + } +} + +void Application::toggleRunningScriptsWidget() { + if (_runningScriptsWidgetWasVisible) { + _runningScriptsWidget->hide(); + _runningScriptsWidgetWasVisible = false; + } else { + _runningScriptsWidget->setBoundary(QRect(_window->geometry().topLeft(), + _window->size())); + _runningScriptsWidget->show(); + _runningScriptsWidgetWasVisible = true; + } +} + +void Application::uploadHead() { + uploadModel(HEAD_MODEL); +} + +void Application::uploadSkeleton() { + uploadModel(SKELETON_MODEL); +} + +void Application::uploadAttachment() { + uploadModel(ATTACHMENT_MODEL); +} + QString Application::getPreviousScriptLocation() { QString suggestedName; if (_previousScriptLocation.isEmpty()) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 91a7ebd29b..ea0de764b9 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -126,7 +126,6 @@ public: ~Application(); void restoreSizeAndPosition(); - ScriptEngine* loadScript(const QString& fileNameString, bool loadScriptFromEditor = false); void loadScripts(); QString getPreviousScriptLocation(); void setPreviousScriptLocation(const QString& previousScriptLocation); @@ -291,7 +290,8 @@ public slots: void loadScriptURLDialog(); void toggleLogDialog(); void initAvatarAndViewFrustum(); - void stopAllScripts(); + ScriptEngine* loadScript(const QString& fileNameString, bool loadScriptFromEditor = false); + void stopAllScripts(bool restart = false); void stopScript(const QString& scriptName); void reloadAllScripts(); void toggleRunningScriptsWidget(); From e1717b1c53f0fed9af37246d51854e510344954a Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Fri, 9 May 2014 15:02:47 -0700 Subject: [PATCH 2/4] Fix bug with mirror settings not initialized --- interface/src/Application.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 61666ccdeb..c9b14d50a1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -152,6 +152,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _mirrorViewRect(QRect(MIRROR_VIEW_LEFT_PADDING, MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT)), _cameraPushback(0.0f), _scaleMirror(1.0f), + _rotateMirror(0.0f), + _raiseMirror(0.0f), _mouseX(0), _mouseY(0), _lastMouseMove(usecTimestampNow()), From 0474375a39568fbe719cc3ffdd957cd093e727c4 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 9 May 2014 15:13:58 -0700 Subject: [PATCH 3/4] Don't render head attachments in first person mode. --- interface/src/avatar/Avatar.cpp | 8 +++++--- interface/src/avatar/Avatar.h | 2 +- interface/src/avatar/MyAvatar.cpp | 19 ++++++++++++++++++- interface/src/avatar/MyAvatar.h | 3 +++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 4de608fc6b..32df49ca0f 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -353,7 +353,7 @@ void Avatar::renderBody(RenderMode renderMode, float glowLevel) { return; } _skeletonModel.render(1.0f, modelRenderMode); - renderAttachments(modelRenderMode); + renderAttachments(renderMode); getHand()->render(false, modelRenderMode); } getHead()->render(1.0f, modelRenderMode); @@ -380,9 +380,11 @@ void Avatar::simulateAttachments(float deltaTime) { } } -void Avatar::renderAttachments(Model::RenderMode renderMode) { +void Avatar::renderAttachments(RenderMode renderMode) { + Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? + Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; foreach (Model* model, _attachmentModels) { - model->render(1.0f, renderMode); + model->render(1.0f, modelRenderMode); } } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index edd53e4b8f..289a0500d0 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -192,7 +192,7 @@ protected: virtual bool shouldRenderHead(const glm::vec3& cameraPosition, RenderMode renderMode) const; void simulateAttachments(float deltaTime); - void renderAttachments(Model::RenderMode renderMode); + virtual void renderAttachments(RenderMode renderMode); virtual void updateJointMappings(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 6ce362071b..52eff6e2ce 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -669,7 +669,7 @@ void MyAvatar::renderBody(RenderMode renderMode, float glowLevel) { Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; _skeletonModel.render(1.0f, modelRenderMode); - renderAttachments(modelRenderMode); + renderAttachments(renderMode); // Render head so long as the camera isn't inside it if (shouldRenderHead(Application::getInstance()->getCamera()->getPosition(), renderMode)) { @@ -1489,6 +1489,23 @@ void MyAvatar::updateMotionBehaviorsFromMenu() { } } +void MyAvatar::renderAttachments(RenderMode renderMode) { + if (!Application::getInstance()->getCamera()->getMode() == CAMERA_MODE_FIRST_PERSON || renderMode == MIRROR_RENDER_MODE) { + Avatar::renderAttachments(renderMode); + return; + } + const FBXGeometry& geometry = _skeletonModel.getGeometry()->getFBXGeometry(); + QString headJointName = (geometry.headJointIndex == -1) ? QString() : geometry.joints.at(geometry.headJointIndex).name; + Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? + Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; + for (int i = 0; i < _attachmentData.size(); i++) { + const QString& jointName = _attachmentData.at(i).jointName; + if (jointName != headJointName && jointName != "Head") { + _attachmentModels.at(i)->render(1.0f, modelRenderMode); + } + } +} + void MyAvatar::setCollisionGroups(quint32 collisionGroups) { Avatar::setCollisionGroups(collisionGroups & VALID_COLLISION_GROUPS); Menu* menu = Menu::getInstance(); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 96249aec33..2e47d9c973 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -121,6 +121,9 @@ public slots: signals: void transformChanged(); +protected: + virtual void renderAttachments(RenderMode renderMode); + private: bool _mousePressed; float _bodyPitchDelta; // degrees From 3329cb7638d114ac4aa91cec49ae325da1c7e797 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 9 May 2014 15:25:48 -0700 Subject: [PATCH 4/4] Set the LOD distance on attachments (controls the load priority, too). --- interface/src/avatar/Avatar.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 32df49ca0f..b74adee55a 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -370,6 +370,9 @@ void Avatar::simulateAttachments(float deltaTime) { int jointIndex = getJointIndex(attachment.jointName); glm::vec3 jointPosition; glm::quat jointRotation; + if (!isMyAvatar()) { + model->setLODDistance(getLODDistance()); + } if (_skeletonModel.getJointPosition(jointIndex, jointPosition) && _skeletonModel.getJointRotation(jointIndex, jointRotation)) { model->setTranslation(jointPosition + jointRotation * attachment.translation * _scale);