From f75b599288b29c1f9073b38c21de5a88e27f0568 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 30 Apr 2015 11:28:27 -0700 Subject: [PATCH] don't save default values in json file --- interface/resources/qml/controls/Dialog.qml | 2 +- .../entities/src/EntityItemProperties.cpp | 71 +++++++++++-------- libraries/entities/src/EntityItemProperties.h | 3 +- .../entities/src/EntityItemPropertiesMacros.h | 35 ++++++--- libraries/entities/src/EntityTree.cpp | 4 +- libraries/entities/src/EntityTree.h | 2 +- .../src/RecurseOctreeToMapOperator.cpp | 17 ++++- .../entities/src/RecurseOctreeToMapOperator.h | 3 +- libraries/fbx/src/FBXReader.h | 10 +++ libraries/octree/src/Octree.cpp | 6 +- libraries/octree/src/Octree.h | 2 +- libraries/shared/src/SharedUtil.h | 11 +++ 12 files changed, 115 insertions(+), 51 deletions(-) diff --git a/interface/resources/qml/controls/Dialog.qml b/interface/resources/qml/controls/Dialog.qml index 46add1dc07..f32b4e2e66 100644 --- a/interface/resources/qml/controls/Dialog.qml +++ b/interface/resources/qml/controls/Dialog.qml @@ -66,7 +66,7 @@ DialogBase { // our close function performs the same way as the OffscreenUI class: // don't do anything but manipulate the enabled flag and let the other - // mechanisms decide if the window should be destoryed after the close + // mechanisms decide if the window should be destroyed after the close // animation completes function close() { if (destroyOnCloseButton) { diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 734f7897bb..267cf75a11 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -295,20 +295,23 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { return changedProperties; } -QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine) const { +QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool skipDefaults) const { QScriptValue properties = engine->newObject(); + EntityItemProperties defaultEntityProperties; if (_idSet) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(id, _id.toString()); - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(isKnownID, (_id != UNKNOWN_ENTITY_ID)); + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(isKnownID, (_id != UNKNOWN_ENTITY_ID)); } else { - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(isKnownID, false); + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(isKnownID, false); } COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(type, EntityTypes::getEntityTypeName(_type)); COPY_PROPERTY_TO_QSCRIPTVALUE_VEC3(position); COPY_PROPERTY_TO_QSCRIPTVALUE_VEC3(dimensions); - COPY_PROPERTY_TO_QSCRIPTVALUE_VEC3(naturalDimensions); // gettable, but not settable + if (!skipDefaults) { + COPY_PROPERTY_TO_QSCRIPTVALUE_VEC3(naturalDimensions); // gettable, but not settable + } COPY_PROPERTY_TO_QSCRIPTVALUE_QUAT(rotation); COPY_PROPERTY_TO_QSCRIPTVALUE_VEC3(velocity); COPY_PROPERTY_TO_QSCRIPTVALUE_VEC3(gravity); @@ -316,8 +319,10 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine) cons COPY_PROPERTY_TO_QSCRIPTVALUE(damping); COPY_PROPERTY_TO_QSCRIPTVALUE(density); COPY_PROPERTY_TO_QSCRIPTVALUE(lifetime); - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(age, getAge()); // gettable, but not settable - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(ageAsText, formatSecondsElapsed(getAge())); // gettable, but not settable + if (!skipDefaults) { + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(age, getAge()); // gettable, but not settable + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(ageAsText, formatSecondsElapsed(getAge())); // gettable, but not settable + } COPY_PROPERTY_TO_QSCRIPTVALUE(script); COPY_PROPERTY_TO_QSCRIPTVALUE_VEC3(registrationPoint); COPY_PROPERTY_TO_QSCRIPTVALUE_VEC3(angularVelocity); @@ -369,31 +374,37 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine) cons COPY_PROPERTY_TO_QSCRIPTVALUE(stageHour); // Sitting properties support - QScriptValue sittingPoints = engine->newObject(); - for (int i = 0; i < _sittingPoints.size(); ++i) { - QScriptValue sittingPoint = engine->newObject(); - sittingPoint.setProperty("name", _sittingPoints.at(i).name); - sittingPoint.setProperty("position", vec3toScriptValue(engine, _sittingPoints.at(i).position)); - sittingPoint.setProperty("rotation", quatToScriptValue(engine, _sittingPoints.at(i).rotation)); - sittingPoints.setProperty(i, sittingPoint); + if (!skipDefaults) { + QScriptValue sittingPoints = engine->newObject(); + for (int i = 0; i < _sittingPoints.size(); ++i) { + QScriptValue sittingPoint = engine->newObject(); + sittingPoint.setProperty("name", _sittingPoints.at(i).name); + sittingPoint.setProperty("position", vec3toScriptValue(engine, _sittingPoints.at(i).position)); + sittingPoint.setProperty("rotation", quatToScriptValue(engine, _sittingPoints.at(i).rotation)); + sittingPoints.setProperty(i, sittingPoint); + } + sittingPoints.setProperty("length", _sittingPoints.size()); + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(sittingPoints, sittingPoints); // gettable, but not settable } - sittingPoints.setProperty("length", _sittingPoints.size()); - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(sittingPoints, sittingPoints); // gettable, but not settable - AABox aaBox = getAABox(); - QScriptValue boundingBox = engine->newObject(); - QScriptValue bottomRightNear = vec3toScriptValue(engine, aaBox.getCorner()); - QScriptValue topFarLeft = vec3toScriptValue(engine, aaBox.calcTopFarLeft()); - QScriptValue center = vec3toScriptValue(engine, aaBox.calcCenter()); - QScriptValue boundingBoxDimensions = vec3toScriptValue(engine, aaBox.getDimensions()); - boundingBox.setProperty("brn", bottomRightNear); - boundingBox.setProperty("tfl", topFarLeft); - boundingBox.setProperty("center", center); - boundingBox.setProperty("dimensions", boundingBoxDimensions); - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(boundingBox, boundingBox); // gettable, but not settable + if (!skipDefaults) { + AABox aaBox = getAABox(); + QScriptValue boundingBox = engine->newObject(); + QScriptValue bottomRightNear = vec3toScriptValue(engine, aaBox.getCorner()); + QScriptValue topFarLeft = vec3toScriptValue(engine, aaBox.calcTopFarLeft()); + QScriptValue center = vec3toScriptValue(engine, aaBox.calcCenter()); + QScriptValue boundingBoxDimensions = vec3toScriptValue(engine, aaBox.getDimensions()); + boundingBox.setProperty("brn", bottomRightNear); + boundingBox.setProperty("tfl", topFarLeft); + boundingBox.setProperty("center", center); + boundingBox.setProperty("dimensions", boundingBoxDimensions); + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(boundingBox, boundingBox); // gettable, but not settable + } QString textureNamesList = _textureNames.join(",\n"); - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(originalTextures, textureNamesList); // gettable, but not settable + if (!skipDefaults) { + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(originalTextures, textureNamesList); // gettable, but not settable + } return properties; } @@ -467,7 +478,11 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object) { } QScriptValue EntityItemPropertiesToScriptValue(QScriptEngine* engine, const EntityItemProperties& properties) { - return properties.copyToScriptValue(engine); + return properties.copyToScriptValue(engine, false); +} + +QScriptValue EntityItemNonDefaultPropertiesToScriptValue(QScriptEngine* engine, const EntityItemProperties& properties) { + return properties.copyToScriptValue(engine, true); } void EntityItemPropertiesFromScriptValue(const QScriptValue &object, EntityItemProperties& properties) { diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index faec9e1206..9a1c8ad5a6 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -159,7 +159,7 @@ public: EntityTypes::EntityType getType() const { return _type; } void setType(EntityTypes::EntityType type) { _type = type; } - virtual QScriptValue copyToScriptValue(QScriptEngine* engine) const; + virtual QScriptValue copyToScriptValue(QScriptEngine* engine, bool skipDefaults) const; virtual void copyFromScriptValue(const QScriptValue& object); // editing related features supported by all entities @@ -307,6 +307,7 @@ private: }; Q_DECLARE_METATYPE(EntityItemProperties); QScriptValue EntityItemPropertiesToScriptValue(QScriptEngine* engine, const EntityItemProperties& properties); +QScriptValue EntityItemNonDefaultPropertiesToScriptValue(QScriptEngine* engine, const EntityItemProperties& properties); void EntityItemPropertiesFromScriptValue(const QScriptValue &object, EntityItemProperties& properties); diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 33714f4ea2..3fc6cfa85f 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -198,26 +198,41 @@ #define COPY_PROPERTY_TO_QSCRIPTVALUE_VEC3(P) \ - QScriptValue P = vec3toScriptValue(engine, _##P); \ - properties.setProperty(#P, P); + if (!skipDefaults || defaultEntityProperties._##P != _##P) { \ + QScriptValue P = vec3toScriptValue(engine, _##P); \ + properties.setProperty(#P, P); \ + } #define COPY_PROPERTY_TO_QSCRIPTVALUE_QUAT(P) \ - QScriptValue P = quatToScriptValue(engine, _##P); \ - properties.setProperty(#P, P); + if (!skipDefaults || defaultEntityProperties._##P != _##P) { \ + QScriptValue P = quatToScriptValue(engine, _##P); \ + properties.setProperty(#P, P); \ + } #define COPY_PROPERTY_TO_QSCRIPTVALUE_COLOR(P) \ - QScriptValue P = xColorToScriptValue(engine, _##P); \ - properties.setProperty(#P, P); + if (!skipDefaults || defaultEntityProperties._##P != _##P) { \ + QScriptValue P = xColorToScriptValue(engine, _##P); \ + properties.setProperty(#P, P); \ + } #define COPY_PROPERTY_TO_QSCRIPTVALUE_COLOR_GETTER(P,G) \ - QScriptValue P = xColorToScriptValue(engine, G); \ - properties.setProperty(#P, P); + if (!skipDefaults || defaultEntityProperties._##P != _##P) { \ + QScriptValue P = xColorToScriptValue(engine, G); \ + properties.setProperty(#P, P); \ + } -#define COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(P, G) \ +#define COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(P, G) \ properties.setProperty(#P, G); +#define COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(P, G) \ + if (!skipDefaults || defaultEntityProperties._##P != _##P) { \ + properties.setProperty(#P, G); \ + } + #define COPY_PROPERTY_TO_QSCRIPTVALUE(P) \ - properties.setProperty(#P, _##P); + if (!skipDefaults || defaultEntityProperties._##P != _##P) { \ + properties.setProperty(#P, _##P); \ + } #define COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(P, S) \ QScriptValue P = object.property(#P); \ diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 436339b3fe..f8f94f8d17 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1137,10 +1137,10 @@ bool EntityTree::sendEntitiesOperation(OctreeElement* element, void* extraData) return true; } -bool EntityTree::writeToMap(QVariantMap& entityDescription, OctreeElement* element) { +bool EntityTree::writeToMap(QVariantMap& entityDescription, OctreeElement* element, bool skipDefaultValues) { entityDescription["Entities"] = QVariantList(); QScriptEngine scriptEngine; - RecurseOctreeToMapOperator theOperator(entityDescription, element, &scriptEngine); + RecurseOctreeToMapOperator theOperator(entityDescription, element, &scriptEngine, skipDefaultValues); recurseTreeWithOperator(&theOperator); return true; } diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 3f01dec408..3880d67eda 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -163,7 +163,7 @@ public: bool wantEditLogging() const { return _wantEditLogging; } void setWantEditLogging(bool value) { _wantEditLogging = value; } - bool writeToMap(QVariantMap& entityDescription, OctreeElement* element); + bool writeToMap(QVariantMap& entityDescription, OctreeElement* element, bool skipDefaultValues); bool readFromMap(QVariantMap& entityDescription); signals: diff --git a/libraries/entities/src/RecurseOctreeToMapOperator.cpp b/libraries/entities/src/RecurseOctreeToMapOperator.cpp index afe28e17e0..daa01c203e 100644 --- a/libraries/entities/src/RecurseOctreeToMapOperator.cpp +++ b/libraries/entities/src/RecurseOctreeToMapOperator.cpp @@ -12,11 +12,15 @@ #include "RecurseOctreeToMapOperator.h" -RecurseOctreeToMapOperator::RecurseOctreeToMapOperator(QVariantMap& map, OctreeElement *top, QScriptEngine *engine) : +RecurseOctreeToMapOperator::RecurseOctreeToMapOperator(QVariantMap& map, + OctreeElement *top, + QScriptEngine *engine, + bool skipDefaultValues) : RecurseOctreeOperator(), _map(map), _top(top), - _engine(engine) + _engine(engine), + _skipDefaultValues(skipDefaultValues) { // if some element "top" was given, only save information for that element and it's children. if (_top) { @@ -36,6 +40,8 @@ bool RecurseOctreeToMapOperator::preRecursion(OctreeElement* element) { bool RecurseOctreeToMapOperator::postRecursion(OctreeElement* element) { + EntityItemProperties defaultProperties; + EntityTreeElement* entityTreeElement = static_cast(element); const QList& entities = entityTreeElement->getEntities(); @@ -43,7 +49,12 @@ bool RecurseOctreeToMapOperator::postRecursion(OctreeElement* element) { foreach (EntityItem* entityItem, entities) { EntityItemProperties properties = entityItem->getProperties(); - QScriptValue qScriptValues = EntityItemPropertiesToScriptValue(_engine, properties); + QScriptValue qScriptValues; + if (_skipDefaultValues) { + qScriptValues = EntityItemNonDefaultPropertiesToScriptValue(_engine, properties); + } else { + qScriptValues = EntityItemPropertiesToScriptValue(_engine, properties); + } entitiesQList << qScriptValues.toVariant(); } _map["Entities"] = entitiesQList; diff --git a/libraries/entities/src/RecurseOctreeToMapOperator.h b/libraries/entities/src/RecurseOctreeToMapOperator.h index 6bd44f3cbf..bfa5024b09 100644 --- a/libraries/entities/src/RecurseOctreeToMapOperator.h +++ b/libraries/entities/src/RecurseOctreeToMapOperator.h @@ -13,7 +13,7 @@ class RecurseOctreeToMapOperator : public RecurseOctreeOperator { public: - RecurseOctreeToMapOperator(QVariantMap& map, OctreeElement *top, QScriptEngine *engine); + RecurseOctreeToMapOperator(QVariantMap& map, OctreeElement *top, QScriptEngine *engine, bool skipDefaultValues); bool preRecursion(OctreeElement* element); bool postRecursion(OctreeElement* element); private: @@ -21,4 +21,5 @@ public: OctreeElement *_top; QScriptEngine *_engine; bool _withinTop; + bool _skipDefaultValues; }; diff --git a/libraries/fbx/src/FBXReader.h b/libraries/fbx/src/FBXReader.h index 871f3d0581..648c47c975 100644 --- a/libraries/fbx/src/FBXReader.h +++ b/libraries/fbx/src/FBXReader.h @@ -203,6 +203,16 @@ public: glm::quat rotation; // relative orientation }; +inline bool operator==(const SittingPoint& lhs, const SittingPoint& rhs) +{ + return (lhs.name == rhs.name) && (lhs.position == rhs.position) && (lhs.rotation == rhs.rotation); +} + +inline bool operator!=(const SittingPoint& lhs, const SittingPoint& rhs) +{ + return (lhs.name != rhs.name) || (lhs.position != rhs.position) || (lhs.rotation != rhs.rotation); +} + /// A set of meshes extracted from an FBX document. class FBXGeometry { public: diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 059c0e5bbc..d53d29e444 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -2087,7 +2087,7 @@ void Octree::writeToJSONFile(const char* fileName, OctreeElement* element) { QFile persistFile(fileName); QVariantMap entityDescription; - qCDebug(octree, "Saving to file %s...", fileName); + qCDebug(octree, "Saving JSON SVO to file %s...", fileName); OctreeElement* top; if (element) { @@ -2096,7 +2096,7 @@ void Octree::writeToJSONFile(const char* fileName, OctreeElement* element) { top = _rootElement; } - bool entityDescriptionSuccess = writeToMap(entityDescription, top); + bool entityDescriptionSuccess = writeToMap(entityDescription, top, true); if (entityDescriptionSuccess && persistFile.open(QIODevice::WriteOnly)) { persistFile.write(QJsonDocument::fromVariant(entityDescription).toJson()); } else { @@ -2108,7 +2108,7 @@ void Octree::writeToSVOFile(const char* fileName, OctreeElement* element) { std::ofstream file(fileName, std::ios::out|std::ios::binary); if(file.is_open()) { - qCDebug(octree, "Saving to file %s...", fileName); + qCDebug(octree, "Saving binary SVO to file %s...", fileName); PacketType expectedType = expectedDataPacketType(); PacketVersion expectedVersion = versionForPacketType(expectedType); diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 21c3efc01d..d7fc58699f 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -331,7 +331,7 @@ public: void writeToFile(const char* filename, OctreeElement* element = NULL, QString persistAsFileType = "svo"); void writeToJSONFile(const char* filename, OctreeElement* element = NULL); void writeToSVOFile(const char* filename, OctreeElement* element = NULL); - virtual bool writeToMap(QVariantMap& entityDescription, OctreeElement* element) = 0; + virtual bool writeToMap(QVariantMap& entityDescription, OctreeElement* element, bool skipDefaultValues) = 0; // Octree importers bool readFromFile(const char* filename); diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index 9cf76dd1dc..8d55a0f82b 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -43,6 +43,17 @@ inline QDebug& operator<<(QDebug& dbg, const xColor& c) { return dbg; } +inline bool operator==(const xColor& lhs, const xColor& rhs) +{ + return (lhs.red == rhs.red) && (lhs.green == rhs.green) && (lhs.blue == rhs.blue); +} + +inline bool operator!=(const xColor& lhs, const xColor& rhs) +{ + return (lhs.red != rhs.red) || (lhs.green != rhs.green) || (lhs.blue != rhs.blue); +} + + static const float ZERO = 0.0f; static const float ONE = 1.0f; static const float ONE_HALF = 0.5f;