diff --git a/assignment-client/src/avatars/ScriptableAvatar.cpp b/assignment-client/src/avatars/ScriptableAvatar.cpp index 25cf702b22..8e88d6c236 100644 --- a/assignment-client/src/avatars/ScriptableAvatar.cpp +++ b/assignment-client/src/avatars/ScriptableAvatar.cpp @@ -252,7 +252,8 @@ void ScriptableAvatar::setHasAudioEnabledFaceMovement(bool hasAudioEnabledFaceMo _headData->setHasAudioEnabledFaceMovement(hasAudioEnabledFaceMovement); } -void ScriptableAvatar::updateAvatarEntity(const QUuid& id, const QScriptValue& data) { +void ScriptableAvatar::updateAvatarEntity(const QUuid& id, const QByteArray& data) { + /* TODO: fix this if (data.isNull()) { // interpret this as a DELETE std::map::iterator itr = _entities.find(id); @@ -299,4 +300,5 @@ void ScriptableAvatar::updateAvatarEntity(const QUuid& id, const QScriptValue& d } } } + */ } diff --git a/assignment-client/src/avatars/ScriptableAvatar.h b/assignment-client/src/avatars/ScriptableAvatar.h index f56d7c66b0..b0e41d28eb 100644 --- a/assignment-client/src/avatars/ScriptableAvatar.h +++ b/assignment-client/src/avatars/ScriptableAvatar.h @@ -185,7 +185,7 @@ public: bool getHasProceduralEyeFaceMovement() const override { return _headData->getHasProceduralEyeFaceMovement(); } void setHasAudioEnabledFaceMovement(bool hasAudioEnabledFaceMovement); bool getHasAudioEnabledFaceMovement() const override { return _headData->getHasAudioEnabledFaceMovement(); } - void updateAvatarEntity(const QUuid& id, const QScriptValue& data) override; + void updateAvatarEntity(const QUuid& id, const QByteArray& data) override; public slots: void update(float deltatime); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 051aab4cdf..a59560860d 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1772,16 +1772,23 @@ void MyAvatar::setAvatarEntityData(const AvatarEntityMap& avatarEntityData) { return; } + if (!avatarEntityData.empty() && !_cachedAvatarEntityBlobs.empty()) { + _needToSaveAvatarEntitySettings = true; + } _avatarEntitiesLock.withWriteLock([&] { // find new and updated IDs AvatarEntityMap::const_iterator constItr = avatarEntityData.begin(); + std::vector blobsToCache; + blobsToCache.reserve(avatarEntityData.size()); while (constItr != avatarEntityData.end()) { QUuid id = constItr.key(); if (_cachedAvatarEntityBlobs.find(id) == _cachedAvatarEntityBlobs.end()) { _entitiesToAdd.push_back(id); + blobsToCache.push_back(id); } else { _entitiesToUpdate.push_back(id); } + ++constItr; } // find and erase deleted IDs from _cachedAvatarEntityBlobs std::vector deletedIDs; @@ -1795,6 +1802,12 @@ void MyAvatar::setAvatarEntityData(const AvatarEntityMap& avatarEntityData) { ++itr; } } + // now that we've 'deleted' unknown ids, copy over the new ones + constItr = avatarEntityData.begin(); + while (constItr != avatarEntityData.end()) { + _cachedAvatarEntityBlobs.insert(constItr.key(), constItr.value()); + ++constItr; + } // erase deleted IDs from _packedAvatarEntityData for (const auto& id : deletedIDs) { itr = _packedAvatarEntityData.find(id); @@ -2296,10 +2309,6 @@ void MyAvatar::clearJointsData() { _skeletonModel->getRig().clearJointStates(); } -void MyAvatar::updateAvatarEntity(const QUuid& id, const QScriptValue& data) { - // TODO: implement this -} - void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { _skeletonModelChangeCount++; int skeletonModelChangeCount = _skeletonModelChangeCount; diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index a20908e7cb..3804df977e 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -851,8 +851,6 @@ public: virtual void clearJointData(const QString& name) override; virtual void clearJointsData() override; - void updateAvatarEntity(const QUuid& id, const QScriptValue& data) override; - /**jsdoc * @function MyAvatar.pinJoint * @param {number} index diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 2b356675be..97218ac3c1 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -235,8 +235,6 @@ public: void updateDisplayNameAlpha(bool showDisplayName); virtual void setSessionDisplayName(const QString& sessionDisplayName) override { }; // no-op - virtual void updateAvatarEntity(const QUuid& entityID, const QScriptValue& entityData) override { }; // no-op - virtual int parseDataFromBuffer(const QByteArray& buffer) override; static void renderJointConnectingCone(gpu::Batch& batch, glm::vec3 position1, glm::vec3 position2, diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 3d22c50e1a..e0f2b02d51 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -2561,7 +2561,7 @@ void AvatarData::fromJson(const QJsonObject& json, bool useFrameSkeleton) { QVariantMap entityData = attachmentJson.toObject().toVariantMap(); QUuid id = entityData.value("id").toUuid(); QByteArray data = QByteArray::fromBase64(entityData.value("properties").toByteArray()); - updateAvatarEntityData(id, data); + updateAvatarEntity(id, data); } } } @@ -2764,11 +2764,7 @@ void AvatarData::storeAvatarEntityDataPayload(const QUuid& entityID, const QByte } } -void AvatarData::updateAvatarEntity(const QUuid& id, const QScriptValue& scriptValue) { - // overridden where needed -} - -void AvatarData::updateAvatarEntityData(const QUuid& id, const QByteArray& data) { +void AvatarData::updateAvatarEntity(const QUuid& entityID, const QByteArray& entityData) { // overridden where needed // NOTE: expects 'data' to be an unfortunately-formatted-binary-blob } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 787f92f5db..0fea5a541e 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -960,10 +960,9 @@ public: /**jsdoc * @function MyAvatar.updateAvatarEntity * @param {Uuid} entityID - * @param {object} entityData + * @param {string} entityData */ - Q_INVOKABLE virtual void updateAvatarEntity(const QUuid& id, const QScriptValue& scriptValue); - virtual void updateAvatarEntityData(const QUuid& id, const QByteArray& data); + Q_INVOKABLE virtual void updateAvatarEntity(const QUuid& entityID, const QByteArray& entityData); /**jsdoc * @function MyAvatar.clearAvatarEntity