Skip to content

Commit 2d56d7c

Browse files
authored
Merge pull request #16551 from ctrlaltdavid/DEV-1943
DEV-1943: Make MyAvatar.getAvatarEntityData() return all properties
2 parents 80572e7 + 91581ef commit 2d56d7c

File tree

12 files changed

+97
-15
lines changed

12 files changed

+97
-15
lines changed

assignment-client/src/avatars/ScriptableAvatar.cpp

+22-2
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,17 @@ void ScriptableAvatar::setJointMappingsFromNetworkReply() {
280280
}
281281

282282
AvatarEntityMap ScriptableAvatar::getAvatarEntityData() const {
283+
auto data = getAvatarEntityDataInternal(true);
284+
return data;
285+
}
286+
287+
AvatarEntityMap ScriptableAvatar::getAvatarEntityDataNonDefault() const {
288+
auto data = getAvatarEntityDataInternal(false);
289+
return data;
290+
291+
}
292+
293+
AvatarEntityMap ScriptableAvatar::getAvatarEntityDataInternal(bool allProperties) const {
283294
// DANGER: Now that we store the AvatarEntityData in packed format this call is potentially Very Expensive!
284295
// Avoid calling this method if possible.
285296
AvatarEntityMap data;
@@ -288,9 +299,18 @@ AvatarEntityMap ScriptableAvatar::getAvatarEntityData() const {
288299
for (const auto& itr : _entities) {
289300
QUuid id = itr.first;
290301
EntityItemPointer entity = itr.second;
291-
EntityItemProperties properties = entity->getProperties();
302+
303+
EncodeBitstreamParams params;
304+
auto desiredProperties = entity->getEntityProperties(params);
305+
desiredProperties += PROP_LOCAL_POSITION;
306+
desiredProperties += PROP_LOCAL_ROTATION;
307+
desiredProperties += PROP_LOCAL_VELOCITY;
308+
desiredProperties += PROP_LOCAL_ANGULAR_VELOCITY;
309+
desiredProperties += PROP_LOCAL_DIMENSIONS;
310+
EntityItemProperties properties = entity->getProperties(desiredProperties);
311+
292312
QByteArray blob;
293-
EntityItemProperties::propertiesToBlob(_scriptEngine, sessionID, properties, blob);
313+
EntityItemProperties::propertiesToBlob(_scriptEngine, sessionID, properties, blob, allProperties);
294314
data[id] = blob;
295315
}
296316
});

assignment-client/src/avatars/ScriptableAvatar.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,17 @@ class ScriptableAvatar : public AvatarData, public Dependency {
173173
* Gets details of all avatar entities.
174174
* <p><strong>Warning:</strong> Potentially an expensive call. Do not use if possible.</p>
175175
* @function Avatar.getAvatarEntityData
176-
* @returns {AvatarEntityMap} Details of the avatar entities.
176+
* @returns {AvatarEntityMap} Details of all avatar entities.
177177
* @example <caption>Report the current avatar entities.</caption>
178178
* var avatarEntityData = Avatar.getAvatarEntityData();
179179
* print("Avatar entities: " + JSON.stringify(avatarEntityData));
180180
*/
181181
Q_INVOKABLE AvatarEntityMap getAvatarEntityData() const override;
182182

183+
AvatarEntityMap getAvatarEntityDataNonDefault() const override;
184+
185+
AvatarEntityMap getAvatarEntityDataInternal(bool allProperties) const;
186+
183187
/**jsdoc
184188
* Sets all avatar entities from an object.
185189
* <p><strong>Warning:</strong> Potentially an expensive call. Do not use if possible.</p>

interface/src/AvatarBookmarks.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ void AvatarBookmarks::deleteBookmark() {
154154

155155
void AvatarBookmarks::updateAvatarEntities(const QVariantList &avatarEntities) {
156156
auto myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
157-
auto currentAvatarEntities = myAvatar->getAvatarEntityData();
157+
auto currentAvatarEntities = myAvatar->getAvatarEntityDataNonDefault();
158158
std::set<QUuid> newAvatarEntities;
159159

160160
// Update or add all the new avatar entities
@@ -296,7 +296,7 @@ QVariantMap AvatarBookmarks::getAvatarDataToBookmark() {
296296

297297
if (entityTree) {
298298
QScriptEngine scriptEngine;
299-
auto avatarEntities = myAvatar->getAvatarEntityData();
299+
auto avatarEntities = myAvatar->getAvatarEntityDataNonDefault();
300300
for (auto entityID : avatarEntities.keys()) {
301301
auto entity = entityTree->findEntityByID(entityID);
302302
if (!entity || !isWearableEntity(entity)) {

interface/src/avatar/MyAvatar.cpp

+43
Original file line numberDiff line numberDiff line change
@@ -1811,6 +1811,46 @@ void MyAvatar::prepareAvatarEntityDataForReload() {
18111811
}
18121812

18131813
AvatarEntityMap MyAvatar::getAvatarEntityData() const {
1814+
// NOTE: the return value is expected to be a map of unfortunately-formatted-binary-blobs
1815+
AvatarEntityMap data;
1816+
1817+
auto treeRenderer = DependencyManager::get<EntityTreeRenderer>();
1818+
EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr;
1819+
if (!entityTree) {
1820+
return data;
1821+
}
1822+
1823+
QList<QUuid> avatarEntityIDs;
1824+
_avatarEntitiesLock.withReadLock([&] {
1825+
avatarEntityIDs = _packedAvatarEntityData.keys();
1826+
});
1827+
for (const auto& entityID : avatarEntityIDs) {
1828+
auto entity = entityTree->findEntityByID(entityID);
1829+
if (!entity) {
1830+
continue;
1831+
}
1832+
1833+
EncodeBitstreamParams params;
1834+
auto desiredProperties = entity->getEntityProperties(params);
1835+
desiredProperties += PROP_LOCAL_POSITION;
1836+
desiredProperties += PROP_LOCAL_ROTATION;
1837+
desiredProperties += PROP_LOCAL_VELOCITY;
1838+
desiredProperties += PROP_LOCAL_ANGULAR_VELOCITY;
1839+
desiredProperties += PROP_LOCAL_DIMENSIONS;
1840+
EntityItemProperties properties = entity->getProperties(desiredProperties);
1841+
1842+
QByteArray blob;
1843+
{
1844+
std::lock_guard<std::mutex> guard(_scriptEngineLock);
1845+
EntityItemProperties::propertiesToBlob(*_scriptEngine, getID(), properties, blob, true);
1846+
}
1847+
1848+
data[entityID] = blob;
1849+
}
1850+
return data;
1851+
}
1852+
1853+
AvatarEntityMap MyAvatar::getAvatarEntityDataNonDefault() const {
18141854
// NOTE: the return value is expected to be a map of unfortunately-formatted-binary-blobs
18151855
updateStaleAvatarEntityBlobs();
18161856
AvatarEntityMap result;
@@ -2522,6 +2562,9 @@ QVariantList MyAvatar::getAvatarEntitiesVariant() {
25222562
auto desiredProperties = entity->getEntityProperties(params);
25232563
desiredProperties += PROP_LOCAL_POSITION;
25242564
desiredProperties += PROP_LOCAL_ROTATION;
2565+
desiredProperties += PROP_LOCAL_VELOCITY;
2566+
desiredProperties += PROP_LOCAL_ANGULAR_VELOCITY;
2567+
desiredProperties += PROP_LOCAL_DIMENSIONS;
25252568
QVariantMap avatarEntityData;
25262569
avatarEntityData["id"] = entityID;
25272570
EntityItemProperties entityProperties = entity->getProperties(desiredProperties);

interface/src/avatar/MyAvatar.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -1888,14 +1888,17 @@ class MyAvatar : public Avatar {
18881888

18891889
/**jsdoc
18901890
* Gets details of all avatar entities.
1891+
* <p><strong>Warning:</strong> Potentially an expensive call. Do not use if possible.</p>
18911892
* @function MyAvatar.getAvatarEntityData
1892-
* @returns {AvatarEntityMap} Details of the avatar entities.
1893+
* @returns {AvatarEntityMap} Details of all avatar entities.
18931894
* @example <caption>Report the current avatar entities.</caption>
18941895
* var avatarEntityData = MyAvatar.getAvatarEntityData();
18951896
* print("Avatar entities: " + JSON.stringify(avatarEntityData));
18961897
*/
18971898
AvatarEntityMap getAvatarEntityData() const override;
18981899

1900+
AvatarEntityMap getAvatarEntityDataNonDefault() const override;
1901+
18991902
/**jsdoc
19001903
* Sets all avatar entities from an object.
19011904
* @function MyAvatar.setAvatarEntityData

libraries/avatars/src/AvatarData.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -3052,6 +3052,12 @@ AvatarEntityMap AvatarData::getAvatarEntityData() const {
30523052
return AvatarEntityMap();
30533053
}
30543054

3055+
AvatarEntityMap AvatarData::getAvatarEntityDataNonDefault() const {
3056+
// overridden where needed
3057+
// NOTE: the return value is expected to be a map of unfortunately-formatted-binary-blobs
3058+
return AvatarEntityMap();
3059+
}
3060+
30553061
void AvatarData::setAvatarEntityData(const AvatarEntityMap& avatarEntityData) {
30563062
// overridden where needed
30573063
// avatarEntityData is expected to be a map of QByteArrays

libraries/avatars/src/AvatarData.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -1390,7 +1390,11 @@ class AvatarData : public QObject, public SpatiallyNestable {
13901390
/**jsdoc
13911391
* @comment Documented in derived classes' JSDoc because implementations are different.
13921392
*/
1393-
Q_INVOKABLE virtual AvatarEntityMap getAvatarEntityData() const;
1393+
// Get avatar entity data with all property values. Used in API.
1394+
Q_INVOKABLE virtual AvatarEntityMap getAvatarEntityData() const;
1395+
1396+
// Get avatar entity data with non-default property values. Used internally.
1397+
virtual AvatarEntityMap getAvatarEntityDataNonDefault() const;
13941398

13951399
/**jsdoc
13961400
* @comment Documented in derived classes' JSDoc because implementations are different.

libraries/avatars/src/ScriptAvatarData.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ AvatarEntityMap ScriptAvatarData::getAvatarEntities() const {
278278
AvatarEntityMap scriptEntityData;
279279

280280
if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) {
281-
return sharedAvatarData->getAvatarEntityData();
281+
return sharedAvatarData->getAvatarEntityDataNonDefault();
282282
}
283283

284284
return scriptEntityData;

libraries/entities/src/EntityItemProperties.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -5120,10 +5120,13 @@ bool EntityItemProperties::blobToProperties(QScriptEngine& scriptEngine, const Q
51205120
return true;
51215121
}
51225122

5123-
void EntityItemProperties::propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID, const EntityItemProperties& properties, QByteArray& blob) {
5123+
void EntityItemProperties::propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID,
5124+
const EntityItemProperties& properties, QByteArray& blob, bool allProperties) {
51245125
// DANGER: this method is NOT efficient.
51255126
// begin recipe for extracting unfortunately-formatted-binary-blob from EntityItem
5126-
QScriptValue scriptValue = EntityItemNonDefaultPropertiesToScriptValue(&scriptEngine, properties);
5127+
QScriptValue scriptValue = allProperties
5128+
? EntityItemPropertiesToScriptValue(&scriptEngine, properties)
5129+
: EntityItemNonDefaultPropertiesToScriptValue(&scriptEngine, properties);
51275130
QVariant variantProperties = scriptValue.toVariant();
51285131
QJsonDocument jsonProperties = QJsonDocument::fromVariant(variantProperties);
51295132
// the ID of the parent/avatar changes from session to session. use a special UUID to indicate the avatar

libraries/entities/src/EntityItemProperties.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ class EntityItemProperties {
118118
friend class MaterialEntityItem;
119119
public:
120120
static bool blobToProperties(QScriptEngine& scriptEngine, const QByteArray& blob, EntityItemProperties& properties);
121-
static void propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID, const EntityItemProperties& properties, QByteArray& blob);
121+
static void propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID, const EntityItemProperties& properties,
122+
QByteArray& blob, bool allProperties = false);
122123

123124
EntityItemProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags());
124125
virtual ~EntityItemProperties() = default;

libraries/shared/src/VariantMapToScriptValue.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ QScriptValue variantToScriptValue(QVariant& qValue, QScriptEngine& scriptEngine)
2828
break;
2929
case QVariant::String:
3030
case QVariant::Url:
31-
return scriptEngine.newVariant(qValue);
31+
return qValue.toString();
3232
break;
3333
case QVariant::Map: {
3434
QVariantMap childMap = qValue.toMap();

scripts/system/libraries/WebTablet.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,7 @@ function calcSpawnInfo(hand, landscape) {
8282
cleanUpOldMaterialEntities = function() {
8383
var avatarEntityData = MyAvatar.getAvatarEntityData();
8484
for (var entityID in avatarEntityData) {
85-
var entityName = Entities.getEntityProperties(entityID, ["name"]).name;
86-
87-
if (entityName === TABLET_MATERIAL_ENTITY_NAME) {
85+
if (avatarEntityData[entityID].name === TABLET_MATERIAL_ENTITY_NAME) {
8886
Entities.deleteEntity(entityID);
8987
}
9088
}

0 commit comments

Comments
 (0)