MyAvatar saving to settings works again

This commit is contained in:
Andrew Meadows 2018-12-07 10:44:09 -08:00
parent e37b5b52f0
commit 0ed936520d
2 changed files with 26 additions and 39 deletions

View file

@ -1252,7 +1252,7 @@ void MyAvatar::saveAvatarUrl() {
} }
} }
void MyAvatar::resizeAvatarEntitySettingHandles(unsigned int avatarEntityIndex) { void MyAvatar::resizeAvatarEntitySettingHandles(uint32_t maxIndex) {
// The original Settings interface saved avatar-entity array data like this: // The original Settings interface saved avatar-entity array data like this:
// Avatar/avatarEntityData/size: 5 // Avatar/avatarEntityData/size: 5
// Avatar/avatarEntityData/1/id: ... // Avatar/avatarEntityData/1/id: ...
@ -1262,14 +1262,15 @@ void MyAvatar::resizeAvatarEntitySettingHandles(unsigned int avatarEntityIndex)
// Avatar/avatarEntityData/5/properties: ... // Avatar/avatarEntityData/5/properties: ...
// //
// Create Setting::Handles to mimic this. // Create Setting::Handles to mimic this.
uint32_t settingsIndex = _avatarEntityIDSettings.size() + 1;
while (_avatarEntityIDSettings.size() <= avatarEntityIndex) { while (settingsIndex <= maxIndex) {
Setting::Handle<QString> idHandle(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "avatarEntityData" Setting::Handle<QString> idHandle(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "avatarEntityData"
<< QString::number(avatarEntityIndex + 1) << "id", QUuid().toString()); << QString::number(settingsIndex) << "id", QUuid().toString());
_avatarEntityIDSettings.push_back(idHandle); _avatarEntityIDSettings.push_back(idHandle);
Setting::Handle<QString> dataHandle(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "avatarEntityData" Setting::Handle<QString> dataHandle(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "avatarEntityData"
<< QString::number(avatarEntityIndex + 1) << "properties", QString()); << QString::number(settingsIndex) << "properties", QString());
_avatarEntityDataSettings.push_back(dataHandle); _avatarEntityDataSettings.push_back(dataHandle);
settingsIndex++;
} }
} }
@ -1303,41 +1304,23 @@ void MyAvatar::saveData() {
} }
void MyAvatar::saveAvatarEntityDataToSettings() { void MyAvatar::saveAvatarEntityDataToSettings() {
uint32_t numEntities = _avatarEntityData.size(); // save new settings
uint32_t numEntities = _avatarEntitiesAsPropertiesStrings.size();
_avatarEntityCountSetting.set(numEntities);
uint32_t prevNumEntities = _avatarEntityCountSetting.get(0); uint32_t prevNumEntities = _avatarEntityCountSetting.get(0);
resizeAvatarEntitySettingHandles(std::max<uint32_t>(numEntities, prevNumEntities)); resizeAvatarEntitySettingHandles(std::max<uint32_t>(numEntities, prevNumEntities));
if (numEntities > 0) { if (numEntities > 0) {
_avatarEntitiesLock.withReadLock([&] { _avatarEntitiesLock.withReadLock([&] {
uint32_t i = 0;
// Note: this roundabout path from AvatarEntityData to JSON string is NOT efficient for (const auto& mapEntry : _avatarEntitiesAsPropertiesStrings) {
//QScriptEngine engine; _avatarEntityDataSettings[i].set(mapEntry.second);
//QScriptValue toStringMethod = engine.evaluate("(function() { return JSON.stringify(this) })"); _avatarEntityIDSettings[i].set(mapEntry.first.toString());
AvatarEntityMap::const_iterator itr = _avatarEntityData.begin(); ++i;
numEntities = 0;
while (itr != _avatarEntityData.end()) {
EntityItemProperties properties;
QByteArray buffer = itr.value();
/* TODO: fix this to read data from elsewhere
if (properties.constructFromBuffer((uint8_t*)buffer.data(), buffer.size())) {
if (properties.getParentID() == getSessionUUID()) {
properties.setParentID(AVATAR_SELF_ID);
}
QScriptValue scriptValue = EntityItemPropertiesToScriptValue(&engine, properties);
scriptValue.setProperty("toString", toStringMethod);
_avatarEntityDataSettings[numEntities].set(scriptValue.toString());
_avatarEntityIDSettings[numEntities].set(itr.key().toString());
++numEntities;
} else {
// buffer is corrupt --> skip it
} }
*/ });
++numEntities;
++itr;
}
});
} }
_avatarEntityCountSetting.set(numEntities);
// remove old settings if any
if (numEntities < prevNumEntities) { if (numEntities < prevNumEntities) {
uint32_t numEntitiesToRemove = prevNumEntities - numEntities; uint32_t numEntitiesToRemove = prevNumEntities - numEntities;
for (uint32_t i = 0; i < numEntitiesToRemove; ++i) { for (uint32_t i = 0; i < numEntitiesToRemove; ++i) {
@ -1468,7 +1451,6 @@ void MyAvatar::updateAvatarEntity(const QUuid& entityID, const EntityItemPropert
OctreePacketData packetData(false, AvatarTraits::MAXIMUM_TRAIT_SIZE); OctreePacketData packetData(false, AvatarTraits::MAXIMUM_TRAIT_SIZE);
EncodeBitstreamParams params; EncodeBitstreamParams params;
EntityTreeElementExtraEncodeDataPointer extra { nullptr }; EntityTreeElementExtraEncodeDataPointer extra { nullptr };
QUuid parentID = entity->getParentID();
OctreeElement::AppendState appendState = entity->appendEntityData(&packetData, params, extra); OctreeElement::AppendState appendState = entity->appendEntityData(&packetData, params, extra);
if (appendState != OctreeElement::COMPLETED) { if (appendState != OctreeElement::COMPLETED) {
@ -1571,12 +1553,10 @@ void MyAvatar::loadAvatarEntityDataFromSettings() {
} }
QScriptEngine scriptEngine; QScriptEngine scriptEngine;
std::vector<EntityItemProperties> entitiesToLoad; std::vector<EntityItemProperties> entitiesToLoad;
entitiesToLoad.resize(numEntities); entitiesToLoad.resize(numEntities);
resizeAvatarEntitySettingHandles(numEntities);
for (int i = 0; i < numEntities; i++) { for (int i = 0; i < numEntities; i++) {
resizeAvatarEntitySettingHandles(i);
// NOTE: this path from EntityItemProperties JSON string to EntityItemProperties is NOT efficient // NOTE: this path from EntityItemProperties JSON string to EntityItemProperties is NOT efficient
QString propertiesString = _avatarEntityDataSettings[i].get(); QString propertiesString = _avatarEntityDataSettings[i].get();
QJsonDocument propertiesDoc = QJsonDocument::fromJson(propertiesString.toUtf8()); QJsonDocument propertiesDoc = QJsonDocument::fromJson(propertiesString.toUtf8());
@ -1584,13 +1564,15 @@ void MyAvatar::loadAvatarEntityDataFromSettings() {
QVariant propertiesVariant(propertiesObj); QVariant propertiesVariant(propertiesObj);
QVariantMap propertiesMap = propertiesVariant.toMap(); QVariantMap propertiesMap = propertiesVariant.toMap();
QScriptValue propertiesScriptValue = variantMapToScriptValue(propertiesMap, scriptEngine); QScriptValue propertiesScriptValue = variantMapToScriptValue(propertiesMap, scriptEngine);
// NOTE: we grab properties by reference and wrangle it:
EntityItemProperties& properties = entitiesToLoad[i]; EntityItemProperties& properties = entitiesToLoad[i];
EntityItemPropertiesFromScriptValueIgnoreReadOnly(propertiesScriptValue, properties); EntityItemPropertiesFromScriptValueIgnoreReadOnly(propertiesScriptValue, properties);
// the ClientOnly property can get stripped out elsewhere so we need to always set it true here // the ClientOnly property can get stripped out elsewhere so we need to always set it true here
properties.setClientOnly(true); properties.setClientOnly(true);
} }
_avatarEntitiesAsPropertiesStrings.clear();
auto entityTreeRenderer = qApp->getEntities(); auto entityTreeRenderer = qApp->getEntities();
EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr;
if (entityTree) { if (entityTree) {
@ -1606,13 +1588,17 @@ void MyAvatar::loadAvatarEntityDataFromSettings() {
// use the entity to build the data payload // use the entity to build the data payload
OctreeElement::AppendState appendState = entity->appendEntityData(&packetData, params, extra); OctreeElement::AppendState appendState = entity->appendEntityData(&packetData, params, extra);
if (appendState == OctreeElement::COMPLETED) { if (appendState == OctreeElement::COMPLETED) {
// only remember an AvatarEntity that successfully loads
QByteArray tempArray = QByteArray::fromRawData((const char*)packetData.getUncompressedData(), packetData.getUncompressedSize()); QByteArray tempArray = QByteArray::fromRawData((const char*)packetData.getUncompressedData(), packetData.getUncompressedSize());
storeAvatarEntityDataPayload(entityID, tempArray); storeAvatarEntityDataPayload(entityID, tempArray);
_avatarEntitiesAsPropertiesStrings[entityID] = _avatarEntityDataSettings[i].get();
} }
packetData.reset(); packetData.reset();
} }
}); });
} }
} else {
// TODO? handle this case: try to load AvatatEntityData from settings again later?
} }
} }

View file

@ -576,7 +576,7 @@ public:
float getHMDRollControlRate() const { return _hmdRollControlRate; } float getHMDRollControlRate() const { return _hmdRollControlRate; }
// get/set avatar data // get/set avatar data
void resizeAvatarEntitySettingHandles(unsigned int avatarEntityIndex); void resizeAvatarEntitySettingHandles(uint32_t maxIndex);
void saveData(); void saveData();
void saveAvatarEntityDataToSettings(); void saveAvatarEntityDataToSettings();
void loadData(); void loadData();
@ -1945,6 +1945,7 @@ private:
Setting::Handle<bool> _allowTeleportingSetting { "allowTeleporting", true }; Setting::Handle<bool> _allowTeleportingSetting { "allowTeleporting", true };
std::vector<Setting::Handle<QString>> _avatarEntityIDSettings; std::vector<Setting::Handle<QString>> _avatarEntityIDSettings;
std::vector<Setting::Handle<QString>> _avatarEntityDataSettings; std::vector<Setting::Handle<QString>> _avatarEntityDataSettings;
std::map<QUuid, QString> _avatarEntitiesAsPropertiesStrings;
}; };
QScriptValue audioListenModeToScriptValue(QScriptEngine* engine, const AudioListenerMode& audioListenerMode); QScriptValue audioListenModeToScriptValue(QScriptEngine* engine, const AudioListenerMode& audioListenerMode);