From fe2ee68b79bcf9a4f53795cdc30ae9582305edd2 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 7 Dec 2018 13:49:48 -0800 Subject: [PATCH] add EntityItemProperties::copyFromJSONString() --- interface/src/avatar/MyAvatar.cpp | 36 ++++++++----------- interface/src/avatar/MyAvatar.h | 6 ++-- .../entities/src/EntityItemProperties.cpp | 14 +++++++- libraries/entities/src/EntityItemProperties.h | 1 + 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index ce70d40c74..7d6318ddbb 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -50,7 +50,6 @@ #include #include #include -#include #include "MyHead.h" #include "MySkeletonModel.h" @@ -1305,14 +1304,14 @@ void MyAvatar::saveData() { void MyAvatar::saveAvatarEntityDataToSettings() { // save new settings - uint32_t numEntities = _avatarEntitiesAsPropertiesStrings.size(); + uint32_t numEntities = _avatarEntityStrings.size(); _avatarEntityCountSetting.set(numEntities); uint32_t prevNumEntities = _avatarEntityCountSetting.get(0); resizeAvatarEntitySettingHandles(std::max(numEntities, prevNumEntities)); if (numEntities > 0) { _avatarEntitiesLock.withReadLock([&] { uint32_t i = 0; - for (const auto& mapEntry : _avatarEntitiesAsPropertiesStrings) { + for (const auto& mapEntry : _avatarEntityStrings) { _avatarEntityDataSettings[i].set(mapEntry.second); _avatarEntityIDSettings[i].set(mapEntry.first.toString()); ++i; @@ -1430,7 +1429,13 @@ void MyAvatar::setEnableInverseKinematics(bool isEnabled) { _skeletonModel->getRig().setEnableInverseKinematics(isEnabled); } -void MyAvatar::updateAvatarEntity(const QUuid& entityID, const EntityItemProperties& properties) { +void MyAvatar::updateAvatarEntity(const QUuid& entityID, const QString& entityPropertiesString) { + /* TODO: implement this so JS can add/update (and delete?) AvatarEntitieskj:w + // convert string to properties + // NOTE: this path from EntityItemProperties JSON string to EntityItemProperties is NOT efficient + EntityItemProperties properties; + properties.copyFromJSONString(scriptEngine, entityPropertiesString); + auto entityTreeRenderer = qApp->getEntities(); EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; EntityItemPointer entity; @@ -1460,12 +1465,9 @@ void MyAvatar::updateAvatarEntity(const QUuid& entityID, const EntityItemPropert return; } - //QByteArray tempArray = QByteArray::fromRawData((const char*)packetData.getUncompressedData(), packetData.getUncompressedSize()); - QByteArray tempArray((const char*)packetData.getUncompressedData(), packetData.getUncompressedSize()); - for (int i = 0; i < 4; ++i) { - tempArray[i] = (uint8_t)(0xff); - } + QByteArray tempArray = QByteArray::fromRawData((const char*)packetData.getUncompressedData(), packetData.getUncompressedSize()); storeAvatarEntityDataPayload(entity->getID(), tempArray); + */ } void MyAvatar::updateAvatarEntities() { @@ -1558,22 +1560,14 @@ void MyAvatar::loadAvatarEntityDataFromSettings() { entitiesToLoad.resize(numEntities); resizeAvatarEntitySettingHandles(numEntities); for (int i = 0; i < numEntities; i++) { - // NOTE: this path from EntityItemProperties JSON string to EntityItemProperties is NOT efficient - QString propertiesString = _avatarEntityDataSettings[i].get(); - QJsonDocument propertiesDoc = QJsonDocument::fromJson(propertiesString.toUtf8()); - QJsonObject propertiesObj = propertiesDoc.object(); - QVariant propertiesVariant(propertiesObj); - QVariantMap propertiesMap = propertiesVariant.toMap(); - QScriptValue propertiesScriptValue = variantMapToScriptValue(propertiesMap, scriptEngine); - - // NOTE: we grab properties by reference and wrangle it: + // DANGER: this JSONString --> EntityItemProperties operation is expensive EntityItemProperties& properties = entitiesToLoad[i]; - EntityItemPropertiesFromScriptValueIgnoreReadOnly(propertiesScriptValue, properties); + properties.copyFromJSONString(scriptEngine, _avatarEntityDataSettings[i].get()); // the ClientOnly property can get stripped out elsewhere so we need to always set it true here properties.setClientOnly(true); } - _avatarEntitiesAsPropertiesStrings.clear(); + _avatarEntityStrings.clear(); auto entityTreeRenderer = qApp->getEntities(); EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; if (entityTree) { @@ -1592,7 +1586,7 @@ void MyAvatar::loadAvatarEntityDataFromSettings() { // only remember an AvatarEntity that successfully loads and can be packed QByteArray tempArray = QByteArray::fromRawData((const char*)packetData.getUncompressedData(), packetData.getUncompressedSize()); storeAvatarEntityDataPayload(entityID, tempArray); - _avatarEntitiesAsPropertiesStrings[entityID] = _avatarEntityDataSettings[i].get(); + _avatarEntityStrings[entityID] = _avatarEntityDataSettings[i].get(); } packetData.reset(); } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index a6df4de7bf..b05d9ed875 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1407,8 +1407,7 @@ public slots: */ bool getEnableMeshVisible() const override; - // TODO: make this invokable, probably also move down to AvatarData - void updateAvatarEntity(const QUuid& entityID, const EntityItemProperties& properties); + void updateAvatarEntity(const QUuid& entityID, const QString& entityPropertiesString) override; /**jsdoc * Set whether or not your avatar mesh is visible. @@ -1947,7 +1946,8 @@ private: Setting::Handle _allowTeleportingSetting { "allowTeleporting", true }; std::vector> _avatarEntityIDSettings; std::vector> _avatarEntityDataSettings; - std::map _avatarEntitiesAsPropertiesStrings; + std::map _avatarEntityStrings; + std::map _avatarEntityProperties; }; QScriptValue audioListenModeToScriptValue(QScriptEngine* engine, const AudioListenerMode& audioListenerMode); diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 0badd00bc3..6ba4c84985 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "EntitiesLogging.h" #include "EntityItem.h" @@ -2033,6 +2034,18 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool _lastEdited = usecTimestampNow(); } +void EntityItemProperties::copyFromJSONString(QScriptEngine& scriptEngine, const QString& jsonString) { + // DANGER: this method is expensive + QJsonDocument propertiesDoc = QJsonDocument::fromJson(jsonString.toUtf8()); + QJsonObject propertiesObj = propertiesDoc.object(); + QVariant propertiesVariant(propertiesObj); + QVariantMap propertiesMap = propertiesVariant.toMap(); + QScriptValue propertiesScriptValue = variantMapToScriptValue(propertiesMap, scriptEngine); + bool honorReadOnly = true; + copyFromScriptValue(propertiesScriptValue, honorReadOnly); +} + + void EntityItemProperties::merge(const EntityItemProperties& other) { // Core COPY_PROPERTY_IF_CHANGED(simulationOwner); @@ -2262,7 +2275,6 @@ void EntityItemPropertiesFromScriptValueHonorReadOnly(const QScriptValue &object properties.copyFromScriptValue(object, true); } - QScriptValue EntityPropertyFlagsToScriptValue(QScriptEngine* engine, const EntityPropertyFlags& flags) { return EntityItemProperties::entityPropertyFlagsToScriptValue(engine, flags); } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 4a9729f5fe..48f4aa333e 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -109,6 +109,7 @@ public: virtual QScriptValue copyToScriptValue(QScriptEngine* engine, bool skipDefaults, bool allowUnknownCreateTime = false, bool strictSemantics = false, EntityPsuedoPropertyFlags psueudoPropertyFlags = EntityPsuedoPropertyFlags()) const; virtual void copyFromScriptValue(const QScriptValue& object, bool honorReadOnly); + void copyFromJSONString(QScriptEngine& scriptEngine, const QString& jsonString); static QScriptValue entityPropertyFlagsToScriptValue(QScriptEngine* engine, const EntityPropertyFlags& flags); static void entityPropertyFlagsFromScriptValue(const QScriptValue& object, EntityPropertyFlags& flags);