mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 12:08:54 +02:00
Merge pull request #16551 from ctrlaltdavid/DEV-1943
DEV-1943: Make MyAvatar.getAvatarEntityData() return all properties
This commit is contained in:
commit
2d56d7c026
12 changed files with 97 additions and 15 deletions
|
@ -280,6 +280,17 @@ void ScriptableAvatar::setJointMappingsFromNetworkReply() {
|
||||||
}
|
}
|
||||||
|
|
||||||
AvatarEntityMap ScriptableAvatar::getAvatarEntityData() const {
|
AvatarEntityMap ScriptableAvatar::getAvatarEntityData() const {
|
||||||
|
auto data = getAvatarEntityDataInternal(true);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
AvatarEntityMap ScriptableAvatar::getAvatarEntityDataNonDefault() const {
|
||||||
|
auto data = getAvatarEntityDataInternal(false);
|
||||||
|
return data;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
AvatarEntityMap ScriptableAvatar::getAvatarEntityDataInternal(bool allProperties) const {
|
||||||
// DANGER: Now that we store the AvatarEntityData in packed format this call is potentially Very Expensive!
|
// DANGER: Now that we store the AvatarEntityData in packed format this call is potentially Very Expensive!
|
||||||
// Avoid calling this method if possible.
|
// Avoid calling this method if possible.
|
||||||
AvatarEntityMap data;
|
AvatarEntityMap data;
|
||||||
|
@ -288,9 +299,18 @@ AvatarEntityMap ScriptableAvatar::getAvatarEntityData() const {
|
||||||
for (const auto& itr : _entities) {
|
for (const auto& itr : _entities) {
|
||||||
QUuid id = itr.first;
|
QUuid id = itr.first;
|
||||||
EntityItemPointer entity = itr.second;
|
EntityItemPointer entity = itr.second;
|
||||||
EntityItemProperties properties = entity->getProperties();
|
|
||||||
|
EncodeBitstreamParams params;
|
||||||
|
auto desiredProperties = entity->getEntityProperties(params);
|
||||||
|
desiredProperties += PROP_LOCAL_POSITION;
|
||||||
|
desiredProperties += PROP_LOCAL_ROTATION;
|
||||||
|
desiredProperties += PROP_LOCAL_VELOCITY;
|
||||||
|
desiredProperties += PROP_LOCAL_ANGULAR_VELOCITY;
|
||||||
|
desiredProperties += PROP_LOCAL_DIMENSIONS;
|
||||||
|
EntityItemProperties properties = entity->getProperties(desiredProperties);
|
||||||
|
|
||||||
QByteArray blob;
|
QByteArray blob;
|
||||||
EntityItemProperties::propertiesToBlob(_scriptEngine, sessionID, properties, blob);
|
EntityItemProperties::propertiesToBlob(_scriptEngine, sessionID, properties, blob, allProperties);
|
||||||
data[id] = blob;
|
data[id] = blob;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -173,13 +173,17 @@ public:
|
||||||
* Gets details of all avatar entities.
|
* Gets details of all avatar entities.
|
||||||
* <p><strong>Warning:</strong> Potentially an expensive call. Do not use if possible.</p>
|
* <p><strong>Warning:</strong> Potentially an expensive call. Do not use if possible.</p>
|
||||||
* @function Avatar.getAvatarEntityData
|
* @function Avatar.getAvatarEntityData
|
||||||
* @returns {AvatarEntityMap} Details of the avatar entities.
|
* @returns {AvatarEntityMap} Details of all avatar entities.
|
||||||
* @example <caption>Report the current avatar entities.</caption>
|
* @example <caption>Report the current avatar entities.</caption>
|
||||||
* var avatarEntityData = Avatar.getAvatarEntityData();
|
* var avatarEntityData = Avatar.getAvatarEntityData();
|
||||||
* print("Avatar entities: " + JSON.stringify(avatarEntityData));
|
* print("Avatar entities: " + JSON.stringify(avatarEntityData));
|
||||||
*/
|
*/
|
||||||
Q_INVOKABLE AvatarEntityMap getAvatarEntityData() const override;
|
Q_INVOKABLE AvatarEntityMap getAvatarEntityData() const override;
|
||||||
|
|
||||||
|
AvatarEntityMap getAvatarEntityDataNonDefault() const override;
|
||||||
|
|
||||||
|
AvatarEntityMap getAvatarEntityDataInternal(bool allProperties) const;
|
||||||
|
|
||||||
/**jsdoc
|
/**jsdoc
|
||||||
* Sets all avatar entities from an object.
|
* Sets all avatar entities from an object.
|
||||||
* <p><strong>Warning:</strong> Potentially an expensive call. Do not use if possible.</p>
|
* <p><strong>Warning:</strong> Potentially an expensive call. Do not use if possible.</p>
|
||||||
|
|
|
@ -154,7 +154,7 @@ void AvatarBookmarks::deleteBookmark() {
|
||||||
|
|
||||||
void AvatarBookmarks::updateAvatarEntities(const QVariantList &avatarEntities) {
|
void AvatarBookmarks::updateAvatarEntities(const QVariantList &avatarEntities) {
|
||||||
auto myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
|
auto myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
|
||||||
auto currentAvatarEntities = myAvatar->getAvatarEntityData();
|
auto currentAvatarEntities = myAvatar->getAvatarEntityDataNonDefault();
|
||||||
std::set<QUuid> newAvatarEntities;
|
std::set<QUuid> newAvatarEntities;
|
||||||
|
|
||||||
// Update or add all the new avatar entities
|
// Update or add all the new avatar entities
|
||||||
|
@ -296,7 +296,7 @@ QVariantMap AvatarBookmarks::getAvatarDataToBookmark() {
|
||||||
|
|
||||||
if (entityTree) {
|
if (entityTree) {
|
||||||
QScriptEngine scriptEngine;
|
QScriptEngine scriptEngine;
|
||||||
auto avatarEntities = myAvatar->getAvatarEntityData();
|
auto avatarEntities = myAvatar->getAvatarEntityDataNonDefault();
|
||||||
for (auto entityID : avatarEntities.keys()) {
|
for (auto entityID : avatarEntities.keys()) {
|
||||||
auto entity = entityTree->findEntityByID(entityID);
|
auto entity = entityTree->findEntityByID(entityID);
|
||||||
if (!entity || !isWearableEntity(entity)) {
|
if (!entity || !isWearableEntity(entity)) {
|
||||||
|
|
|
@ -1811,6 +1811,46 @@ void MyAvatar::prepareAvatarEntityDataForReload() {
|
||||||
}
|
}
|
||||||
|
|
||||||
AvatarEntityMap MyAvatar::getAvatarEntityData() const {
|
AvatarEntityMap MyAvatar::getAvatarEntityData() const {
|
||||||
|
// NOTE: the return value is expected to be a map of unfortunately-formatted-binary-blobs
|
||||||
|
AvatarEntityMap data;
|
||||||
|
|
||||||
|
auto treeRenderer = DependencyManager::get<EntityTreeRenderer>();
|
||||||
|
EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr;
|
||||||
|
if (!entityTree) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QUuid> avatarEntityIDs;
|
||||||
|
_avatarEntitiesLock.withReadLock([&] {
|
||||||
|
avatarEntityIDs = _packedAvatarEntityData.keys();
|
||||||
|
});
|
||||||
|
for (const auto& entityID : avatarEntityIDs) {
|
||||||
|
auto entity = entityTree->findEntityByID(entityID);
|
||||||
|
if (!entity) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
EncodeBitstreamParams params;
|
||||||
|
auto desiredProperties = entity->getEntityProperties(params);
|
||||||
|
desiredProperties += PROP_LOCAL_POSITION;
|
||||||
|
desiredProperties += PROP_LOCAL_ROTATION;
|
||||||
|
desiredProperties += PROP_LOCAL_VELOCITY;
|
||||||
|
desiredProperties += PROP_LOCAL_ANGULAR_VELOCITY;
|
||||||
|
desiredProperties += PROP_LOCAL_DIMENSIONS;
|
||||||
|
EntityItemProperties properties = entity->getProperties(desiredProperties);
|
||||||
|
|
||||||
|
QByteArray blob;
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> guard(_scriptEngineLock);
|
||||||
|
EntityItemProperties::propertiesToBlob(*_scriptEngine, getID(), properties, blob, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
data[entityID] = blob;
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
AvatarEntityMap MyAvatar::getAvatarEntityDataNonDefault() const {
|
||||||
// NOTE: the return value is expected to be a map of unfortunately-formatted-binary-blobs
|
// NOTE: the return value is expected to be a map of unfortunately-formatted-binary-blobs
|
||||||
updateStaleAvatarEntityBlobs();
|
updateStaleAvatarEntityBlobs();
|
||||||
AvatarEntityMap result;
|
AvatarEntityMap result;
|
||||||
|
@ -2522,6 +2562,9 @@ QVariantList MyAvatar::getAvatarEntitiesVariant() {
|
||||||
auto desiredProperties = entity->getEntityProperties(params);
|
auto desiredProperties = entity->getEntityProperties(params);
|
||||||
desiredProperties += PROP_LOCAL_POSITION;
|
desiredProperties += PROP_LOCAL_POSITION;
|
||||||
desiredProperties += PROP_LOCAL_ROTATION;
|
desiredProperties += PROP_LOCAL_ROTATION;
|
||||||
|
desiredProperties += PROP_LOCAL_VELOCITY;
|
||||||
|
desiredProperties += PROP_LOCAL_ANGULAR_VELOCITY;
|
||||||
|
desiredProperties += PROP_LOCAL_DIMENSIONS;
|
||||||
QVariantMap avatarEntityData;
|
QVariantMap avatarEntityData;
|
||||||
avatarEntityData["id"] = entityID;
|
avatarEntityData["id"] = entityID;
|
||||||
EntityItemProperties entityProperties = entity->getProperties(desiredProperties);
|
EntityItemProperties entityProperties = entity->getProperties(desiredProperties);
|
||||||
|
|
|
@ -1888,14 +1888,17 @@ public:
|
||||||
|
|
||||||
/**jsdoc
|
/**jsdoc
|
||||||
* Gets details of all avatar entities.
|
* Gets details of all avatar entities.
|
||||||
|
* <p><strong>Warning:</strong> Potentially an expensive call. Do not use if possible.</p>
|
||||||
* @function MyAvatar.getAvatarEntityData
|
* @function MyAvatar.getAvatarEntityData
|
||||||
* @returns {AvatarEntityMap} Details of the avatar entities.
|
* @returns {AvatarEntityMap} Details of all avatar entities.
|
||||||
* @example <caption>Report the current avatar entities.</caption>
|
* @example <caption>Report the current avatar entities.</caption>
|
||||||
* var avatarEntityData = MyAvatar.getAvatarEntityData();
|
* var avatarEntityData = MyAvatar.getAvatarEntityData();
|
||||||
* print("Avatar entities: " + JSON.stringify(avatarEntityData));
|
* print("Avatar entities: " + JSON.stringify(avatarEntityData));
|
||||||
*/
|
*/
|
||||||
AvatarEntityMap getAvatarEntityData() const override;
|
AvatarEntityMap getAvatarEntityData() const override;
|
||||||
|
|
||||||
|
AvatarEntityMap getAvatarEntityDataNonDefault() const override;
|
||||||
|
|
||||||
/**jsdoc
|
/**jsdoc
|
||||||
* Sets all avatar entities from an object.
|
* Sets all avatar entities from an object.
|
||||||
* @function MyAvatar.setAvatarEntityData
|
* @function MyAvatar.setAvatarEntityData
|
||||||
|
|
|
@ -3052,6 +3052,12 @@ AvatarEntityMap AvatarData::getAvatarEntityData() const {
|
||||||
return AvatarEntityMap();
|
return AvatarEntityMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AvatarEntityMap AvatarData::getAvatarEntityDataNonDefault() const {
|
||||||
|
// overridden where needed
|
||||||
|
// NOTE: the return value is expected to be a map of unfortunately-formatted-binary-blobs
|
||||||
|
return AvatarEntityMap();
|
||||||
|
}
|
||||||
|
|
||||||
void AvatarData::setAvatarEntityData(const AvatarEntityMap& avatarEntityData) {
|
void AvatarData::setAvatarEntityData(const AvatarEntityMap& avatarEntityData) {
|
||||||
// overridden where needed
|
// overridden where needed
|
||||||
// avatarEntityData is expected to be a map of QByteArrays
|
// avatarEntityData is expected to be a map of QByteArrays
|
||||||
|
|
|
@ -1390,7 +1390,11 @@ public:
|
||||||
/**jsdoc
|
/**jsdoc
|
||||||
* @comment Documented in derived classes' JSDoc because implementations are different.
|
* @comment Documented in derived classes' JSDoc because implementations are different.
|
||||||
*/
|
*/
|
||||||
Q_INVOKABLE virtual AvatarEntityMap getAvatarEntityData() const;
|
// Get avatar entity data with all property values. Used in API.
|
||||||
|
Q_INVOKABLE virtual AvatarEntityMap getAvatarEntityData() const;
|
||||||
|
|
||||||
|
// Get avatar entity data with non-default property values. Used internally.
|
||||||
|
virtual AvatarEntityMap getAvatarEntityDataNonDefault() const;
|
||||||
|
|
||||||
/**jsdoc
|
/**jsdoc
|
||||||
* @comment Documented in derived classes' JSDoc because implementations are different.
|
* @comment Documented in derived classes' JSDoc because implementations are different.
|
||||||
|
|
|
@ -278,7 +278,7 @@ AvatarEntityMap ScriptAvatarData::getAvatarEntities() const {
|
||||||
AvatarEntityMap scriptEntityData;
|
AvatarEntityMap scriptEntityData;
|
||||||
|
|
||||||
if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) {
|
if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) {
|
||||||
return sharedAvatarData->getAvatarEntityData();
|
return sharedAvatarData->getAvatarEntityDataNonDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
return scriptEntityData;
|
return scriptEntityData;
|
||||||
|
|
|
@ -5120,10 +5120,13 @@ bool EntityItemProperties::blobToProperties(QScriptEngine& scriptEngine, const Q
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityItemProperties::propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID, const EntityItemProperties& properties, QByteArray& blob) {
|
void EntityItemProperties::propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID,
|
||||||
|
const EntityItemProperties& properties, QByteArray& blob, bool allProperties) {
|
||||||
// DANGER: this method is NOT efficient.
|
// DANGER: this method is NOT efficient.
|
||||||
// begin recipe for extracting unfortunately-formatted-binary-blob from EntityItem
|
// begin recipe for extracting unfortunately-formatted-binary-blob from EntityItem
|
||||||
QScriptValue scriptValue = EntityItemNonDefaultPropertiesToScriptValue(&scriptEngine, properties);
|
QScriptValue scriptValue = allProperties
|
||||||
|
? EntityItemPropertiesToScriptValue(&scriptEngine, properties)
|
||||||
|
: EntityItemNonDefaultPropertiesToScriptValue(&scriptEngine, properties);
|
||||||
QVariant variantProperties = scriptValue.toVariant();
|
QVariant variantProperties = scriptValue.toVariant();
|
||||||
QJsonDocument jsonProperties = QJsonDocument::fromVariant(variantProperties);
|
QJsonDocument jsonProperties = QJsonDocument::fromVariant(variantProperties);
|
||||||
// the ID of the parent/avatar changes from session to session. use a special UUID to indicate the avatar
|
// the ID of the parent/avatar changes from session to session. use a special UUID to indicate the avatar
|
||||||
|
|
|
@ -118,7 +118,8 @@ class EntityItemProperties {
|
||||||
friend class MaterialEntityItem;
|
friend class MaterialEntityItem;
|
||||||
public:
|
public:
|
||||||
static bool blobToProperties(QScriptEngine& scriptEngine, const QByteArray& blob, EntityItemProperties& properties);
|
static bool blobToProperties(QScriptEngine& scriptEngine, const QByteArray& blob, EntityItemProperties& properties);
|
||||||
static void propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID, const EntityItemProperties& properties, QByteArray& blob);
|
static void propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID, const EntityItemProperties& properties,
|
||||||
|
QByteArray& blob, bool allProperties = false);
|
||||||
|
|
||||||
EntityItemProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags());
|
EntityItemProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags());
|
||||||
virtual ~EntityItemProperties() = default;
|
virtual ~EntityItemProperties() = default;
|
||||||
|
|
|
@ -28,7 +28,7 @@ QScriptValue variantToScriptValue(QVariant& qValue, QScriptEngine& scriptEngine)
|
||||||
break;
|
break;
|
||||||
case QVariant::String:
|
case QVariant::String:
|
||||||
case QVariant::Url:
|
case QVariant::Url:
|
||||||
return scriptEngine.newVariant(qValue);
|
return qValue.toString();
|
||||||
break;
|
break;
|
||||||
case QVariant::Map: {
|
case QVariant::Map: {
|
||||||
QVariantMap childMap = qValue.toMap();
|
QVariantMap childMap = qValue.toMap();
|
||||||
|
|
|
@ -82,9 +82,7 @@ function calcSpawnInfo(hand, landscape) {
|
||||||
cleanUpOldMaterialEntities = function() {
|
cleanUpOldMaterialEntities = function() {
|
||||||
var avatarEntityData = MyAvatar.getAvatarEntityData();
|
var avatarEntityData = MyAvatar.getAvatarEntityData();
|
||||||
for (var entityID in avatarEntityData) {
|
for (var entityID in avatarEntityData) {
|
||||||
var entityName = Entities.getEntityProperties(entityID, ["name"]).name;
|
if (avatarEntityData[entityID].name === TABLET_MATERIAL_ENTITY_NAME) {
|
||||||
|
|
||||||
if (entityName === TABLET_MATERIAL_ENTITY_NAME) {
|
|
||||||
Entities.deleteEntity(entityID);
|
Entities.deleteEntity(entityID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue