From b8dea4b86955781f6b1a7d641a6513bdd8223be1 Mon Sep 17 00:00:00 2001 From: Angus Antley Date: Tue, 26 Jun 2018 06:27:01 +0100 Subject: [PATCH] adding changes to add the orb when an avatar is processed by the avatar mixer and when a new model is being loaded for an avatar. The orb is removed when the geometry has loaded. --- interface/src/avatar/AvatarManager.cpp | 8 +++++ .../src/avatars-renderer/Avatar.cpp | 31 +++++++++++++++++++ .../src/avatars-renderer/Avatar.h | 8 ++++- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index c63095a204..0b03a660bc 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -193,6 +193,14 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { const SortableAvatar& sortData = sortedAvatars.top(); const auto avatar = std::static_pointer_cast(sortData.getAvatar()); + //if the geometry is loaded then turn off the orb + if (avatar->getSkeletonModel()->isLoaded()) { + //remove the orb if it is there + avatar->removeOrb(); + } else { + avatar->updateOrbPosition(); + } + bool ignoring = DependencyManager::get()->isPersonalMutingNode(avatar->getID()); if (ignoring) { sortedAvatars.pop(); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index a99838d810..6d23b524d3 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -34,6 +34,7 @@ #include #include "ModelEntityItem.h" #include "RenderableModelEntityItem.h" +#include "../../interface/src/Application.h" #include @@ -1338,6 +1339,27 @@ void Avatar::scaleVectorRelativeToPosition(glm::vec3 &positionToScale) const { } void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { + if (!isMyAvatar()) { + if (_purpleOrbMeshPlaceholderID == UNKNOWN_OVERLAY_ID || + !qApp->getOverlays().isAddedOverlay(_purpleOrbMeshPlaceholderID)) { + qCWarning(avatars_renderer) << "change model add the purple orb************************"; + _purpleOrbMeshPlaceholder = std::make_shared(); + _purpleOrbMeshPlaceholder->setAlpha(1.0f); + _purpleOrbMeshPlaceholder->setColor({ 0xFF, 0x00, 0xFF }); + _purpleOrbMeshPlaceholder->setIsSolid(false); + _purpleOrbMeshPlaceholder->setPulseMin(0.5); + _purpleOrbMeshPlaceholder->setPulseMax(1.0); + _purpleOrbMeshPlaceholder->setColorPulse(1.0); + _purpleOrbMeshPlaceholder->setIgnoreRayIntersection(true); + _purpleOrbMeshPlaceholder->setDrawInFront(false); + _purpleOrbMeshPlaceholderID = qApp->getOverlays().addOverlay(_purpleOrbMeshPlaceholder); + // Position focus + _purpleOrbMeshPlaceholder->setWorldOrientation(glm::quat(0.0f, 0.0f, 0.0f, 1.0)); + _purpleOrbMeshPlaceholder->setWorldPosition(getHead()->getPosition()); + _purpleOrbMeshPlaceholder->setDimensions(glm::vec3(0.5f, 0.5f, 0.5f)); + _purpleOrbMeshPlaceholder->setVisible(true); + } + } AvatarData::setSkeletonModelURL(skeletonModelURL); if (QThread::currentThread() == thread()) { _skeletonModel->setURL(_skeletonModelURL); @@ -1869,7 +1891,16 @@ void Avatar::processMaterials() { } } } +void Avatar::removeOrb() { + if (qApp->getOverlays().isAddedOverlay(_purpleOrbMeshPlaceholderID)) { + qApp->getOverlays().deleteOverlay(_purpleOrbMeshPlaceholderID); + qCWarning(avatars_renderer) << "remove the purple orb***************************"; + } +} +void Avatar::updateOrbPosition() { + _purpleOrbMeshPlaceholder->setWorldPosition(getHead()->getPosition()); +} scriptable::ScriptableModelBase Avatar::getScriptableModel() { if (!_skeletonModel || !_skeletonModel->isLoaded()) { return scriptable::ScriptableModelBase(); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 98246330c4..c480c5905e 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -27,6 +27,9 @@ #include "Head.h" #include "SkeletonModel.h" #include "Rig.h" +#include "../../interface/src/ui/overlays/Overlays.h" +#include "../../interface/src/ui/overlays/Sphere3DOverlay.h" + #include namespace render { @@ -364,7 +367,10 @@ public: void removeMaterial(graphics::MaterialPointer material, const std::string& parentMaterialName) override; virtual scriptable::ScriptableModelBase getScriptableModel() override; - + void removeOrb(); + void updateOrbPosition(); + std::shared_ptr _purpleOrbMeshPlaceholder{ nullptr }; + OverlayID _purpleOrbMeshPlaceholderID{ UNKNOWN_OVERLAY_ID }; public slots: // FIXME - these should be migrated to use Pose data instead