From 81dc7cb8cf813b7f0eee35dd1303727a469ed260 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 9 Mar 2015 13:38:18 -0700 Subject: [PATCH 01/41] started on code to persist entities to file as json rather than in the wire protocol --- libraries/entities/src/BoxEntityItem.cpp | 5 +++ libraries/entities/src/BoxEntityItem.h | 2 ++ libraries/entities/src/EntityItem.cpp | 7 ++++ libraries/entities/src/EntityItem.h | 2 ++ libraries/entities/src/EntityTree.cpp | 37 ++++++++++++++++++++ libraries/entities/src/EntityTree.h | 2 ++ libraries/entities/src/EntityTreeElement.cpp | 1 - libraries/entities/src/LightEntityItem.cpp | 4 +++ libraries/entities/src/LightEntityItem.h | 2 ++ libraries/entities/src/ModelEntityItem.cpp | 7 ++++ libraries/entities/src/ModelEntityItem.h | 2 ++ libraries/entities/src/SphereEntityItem.cpp | 4 +++ libraries/entities/src/SphereEntityItem.h | 2 ++ libraries/entities/src/TextEntityItem.cpp | 4 +++ libraries/entities/src/TextEntityItem.h | 2 ++ libraries/octree/src/Octree.h | 5 ++- libraries/octree/src/OctreeElement.h | 6 ++++ libraries/octree/src/OctreePersistThread.cpp | 13 ++++++- 18 files changed, 104 insertions(+), 3 deletions(-) diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 1e8c811122..2add36beea 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -105,3 +105,8 @@ void BoxEntityItem::debugDump() const { qDebug() << " getLastEdited:" << debugTime(getLastEdited(), now); } + + +void BoxEntityItem::writeSubTypeToMap(QVariantMap& map) { + map["type"] = QString("box"); +} diff --git a/libraries/entities/src/BoxEntityItem.h b/libraries/entities/src/BoxEntityItem.h index e8459e7dbb..551a6c3f7a 100644 --- a/libraries/entities/src/BoxEntityItem.h +++ b/libraries/entities/src/BoxEntityItem.h @@ -55,6 +55,8 @@ public: virtual void debugDump() const; + void writeSubTypeToMap(QVariantMap& map); + protected: rgbColor _color; }; diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index d6a3aab970..4c19fdddd5 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1152,3 +1152,10 @@ void EntityItem::updateLifetime(float value) { } } + +QVariantMap BoxEntityItem::writeToMap() { + QVariantMap result; + result["id"] = getID().toString(); + writeSubTypeToMap(result); + return result; +} diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index a26783fc7c..c9e7d9f5fa 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -292,6 +292,8 @@ public: static void setSendPhysicsUpdates(bool value) { _sendPhysicsUpdates = value; } static bool getSendPhysicsUpdates() { return _sendPhysicsUpdates; } + QVariantMap writeToMap(); + virtual void writeSubTypeToMap(QVariantMap& map) = 0; protected: diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 8bb759c1b4..e6cd992445 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -983,6 +983,43 @@ void EntityTree::dumpTree() { recurseTreeWithOperator(&theOperator); } + + + +class ToMapOperator : public RecurseOctreeOperator { +public: + ToMapOperator(QVariantMap& map) : RecurseOctreeOperator(), _map(map) {}; + bool preRecursion(OctreeElement* element) {return true;} + bool postRecursion(OctreeElement* element) { + qDebug() << " in ToMapOperator::preRecursion"; + EntityTreeElement* entityTreeElement = static_cast(element); + const QList& entities = entityTreeElement->getEntities(); + if (!_map.contains("Entities")) { + _map["Entities"] = QVariantList(); + } + // XXX is this causing a lot of copying? + QVariantList entitiesQList = qvariant_cast(_map["Entities"]); + foreach (EntityItem* entityItem, entities) { + entitiesQList << entityItem->writeToMap(); + } + _map["Entities"] = entitiesQList; + return true; + } + private: + QVariantMap& _map; +}; + + + +bool EntityTree::writeToMap(QVariantMap& entityDescription) { + ToMapOperator theOperator(entityDescription); + recurseTreeWithOperator(&theOperator); + return true; +} + + + + class PruneOperator : public RecurseOctreeOperator { public: virtual bool preRecursion(OctreeElement* element) { return true; } diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index d8b9b9f38f..d1df020e0f 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -155,6 +155,8 @@ public: bool wantEditLogging() const { return _wantEditLogging; } void setWantEditLogging(bool value) { _wantEditLogging = value; } + bool writeToMap(QVariantMap& entityDescription); + signals: void deletingEntity(const EntityItemID& entityID); void addingEntity(const EntityItemID& entityID); diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index ecd90e5942..3e280ce728 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -839,4 +839,3 @@ void EntityTreeElement::debugDump() { qDebug() << " NO entities!"; } } - diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index 3265891b18..c29a7bd4da 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -150,3 +150,7 @@ void LightEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit APPEND_ENTITY_PROPERTY(PROP_EXPONENT, appendValue, getExponent()); APPEND_ENTITY_PROPERTY(PROP_CUTOFF, appendValue, getCutoff()); } + +void LightEntityItem::writeSubTypeToMap(QVariantMap& map) { + map["type"] = QString("light"); +} diff --git a/libraries/entities/src/LightEntityItem.h b/libraries/entities/src/LightEntityItem.h index cdbdb59ece..a2865ba8c7 100644 --- a/libraries/entities/src/LightEntityItem.h +++ b/libraries/entities/src/LightEntityItem.h @@ -69,6 +69,8 @@ public: static bool getLightsArePickable() { return _lightsArePickable; } static void setLightsArePickable(bool value) { _lightsArePickable = value; } + + void writeSubTypeToMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index ed76b8c99f..3b8cb239f6 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -400,3 +400,10 @@ QString ModelEntityItem::getAnimationSettings() const { QString jsonByteString(jsonByteArray); return jsonByteString; } + + +QVariantMap ModelEntityItem::writeSubTypeToMap() { + QVariantMap result; + result["type"] = QString("model"); + return result; +} diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index 94d262fc9f..918ff2b981 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -114,6 +114,8 @@ public: void setTextures(const QString& textures) { _textures = textures; } static void cleanupLoadedAnimations(); + + void writeSubTypeToMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 7d5fb83a4e..76b10c36ff 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -130,3 +130,7 @@ void SphereEntityItem::debugDump() const { qDebug() << " getLastEdited:" << debugTime(getLastEdited(), now); } + +void SphereEntityItem::writeSubTypeToMap(QVariantMap& map) { + map["type"] = QString("sphere"); +} diff --git a/libraries/entities/src/SphereEntityItem.h b/libraries/entities/src/SphereEntityItem.h index f79a2db7ff..ad9e82935b 100644 --- a/libraries/entities/src/SphereEntityItem.h +++ b/libraries/entities/src/SphereEntityItem.h @@ -62,6 +62,8 @@ public: virtual void debugDump() const; + void writeSubTypeToMap(QVariantMap& map); + protected: rgbColor _color; diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index ac9a080119..eab1ec1100 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -164,3 +164,7 @@ bool TextEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const } return intersects; } + +void TextEntityItem::writeSubTypeToMap(QVariantMap& map) { + map["type"] = QString("text"); +} diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index d57b5442d6..954ba22440 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -80,6 +80,8 @@ public: _backgroundColor[BLUE_INDEX] = value.blue; } + void writeSubTypeToMap(QVariantMap& map); + protected: QString _text; float _lineHeight; diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 870e18983e..67d4dbb576 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -211,6 +211,7 @@ public: {} }; + class Octree : public QObject { Q_OBJECT public: @@ -319,7 +320,8 @@ public: // these will read/write files that match the wireformat, excluding the 'V' leading void writeToSVOFile(const char* filename, OctreeElement* element = NULL); bool readFromSVOFile(const char* filename); - + + virtual bool writeToMap(QVariantMap& entityDescription) { return true; } unsigned long getOctreeElementsCount(); @@ -353,6 +355,7 @@ public: virtual void dumpTree() { }; virtual void pruneTree() { }; + signals: void importSize(float x, float y, float z); void importProgress(int progress); diff --git a/libraries/octree/src/OctreeElement.h b/libraries/octree/src/OctreeElement.h index 8c83d9976e..5eb0bff4cf 100644 --- a/libraries/octree/src/OctreeElement.h +++ b/libraries/octree/src/OctreeElement.h @@ -49,6 +49,10 @@ public: }; + + + + class OctreeElement { protected: @@ -252,6 +256,8 @@ public: int getMyChildContaining(const AABox& box) const; int getMyChildContainingPoint(const glm::vec3& point) const; + virtual bool writeToMap(QVariantMap& entityDescription) { return true; } + protected: void deleteAllChildren(); diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index 2a563dc50a..51c90dc68d 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -243,7 +244,17 @@ void OctreePersistThread::persist() { qDebug() << "saving Octree lock file created at:" << lockFileName; qDebug() << "saving Octree to file " << _filename << "..."; - + + + QFile persistFile("/tmp/ok.json"); + QVariantMap entityDescription; + bool entityDescriptionSuccess = _tree->writeToMap(entityDescription); + if (entityDescriptionSuccess && persistFile.open(QIODevice::WriteOnly)) { + persistFile.write(QJsonDocument::fromVariant(entityDescription).toJson()); + } else { + qCritical("Could not write to JSON description of entities."); + } + _tree->writeToSVOFile(qPrintable(_filename)); time(&_lastPersistTime); _tree->clearDirtyBit(); // tree is clean after saving From d0bbac2eb69813be863fcd3bcf49999878c96961 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 9 Mar 2015 17:55:58 -0700 Subject: [PATCH 02/41] json writer sort of works. started on reader --- interface/src/ui/ToolWindow.cpp | 5 +- libraries/entities/src/EntityItem.cpp | 51 +++++++++- libraries/entities/src/EntityItem.h | 1 + libraries/entities/src/EntityTree.cpp | 111 ++++++++++++++------- libraries/entities/src/EntityTree.h | 1 + libraries/entities/src/ModelEntityItem.cpp | 7 +- libraries/shared/src/QVariantGLM.cpp | 31 ++++++ libraries/shared/src/QVariantGLM.h | 21 ++++ 8 files changed, 181 insertions(+), 47 deletions(-) create mode 100644 libraries/shared/src/QVariantGLM.cpp create mode 100644 libraries/shared/src/QVariantGLM.h diff --git a/interface/src/ui/ToolWindow.cpp b/interface/src/ui/ToolWindow.cpp index 8774bffc36..8c15d848bd 100644 --- a/interface/src/ui/ToolWindow.cpp +++ b/interface/src/ui/ToolWindow.cpp @@ -22,7 +22,7 @@ ToolWindow::ToolWindow(QWidget* parent) : _hasShown(false), _lastGeometry() { - setDockOptions(QMainWindow::ForceTabbedDocks); + // setDockOptions(QMainWindow::ForceTabbedDocks); Application::getInstance()->installEventFilter(this); } @@ -53,6 +53,7 @@ bool ToolWindow::event(QEvent* event) { } bool ToolWindow::eventFilter(QObject* sender, QEvent* event) { +#if 0 switch (event->type()) { case QEvent::WindowStateChange: if (Application::getInstance()->getWindow()->isMinimized()) { @@ -77,7 +78,7 @@ bool ToolWindow::eventFilter(QObject* sender, QEvent* event) { default: break; } - +#endif return false; } diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 4c19fdddd5..c026e2310a 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -21,6 +21,7 @@ #include "EntityScriptingInterface.h" #include "EntityItem.h" #include "EntityTree.h" +#include "QVariantGLM.h" bool EntityItem::_sendPhysicsUpdates = true; @@ -1152,10 +1153,54 @@ void EntityItem::updateLifetime(float value) { } } - -QVariantMap BoxEntityItem::writeToMap() { +QVariantMap EntityItem::writeToMap() { QVariantMap result; - result["id"] = getID().toString(); + // result["id"] = getID().toString(); + result["type"] = _type; + // result["animation-update-delta"] = getLastUpdated() <= getLastEdited() ? 0 : getLastUpdated() - getLastEdited(); + // result["simulation-update-delta"] = getLastSimulated() <= getLastEdited() ? 0 : getLastSimulated() - getLastEdited(); + result["created"] = _created; + result["last-edited"] = _lastEdited; + result["last-updated"] = _lastUpdated; + result["dimensions"] = glmToQList(_dimensions); + result["rotation"] = glmToQList(_rotation); + result["density"] = _density; + result["gravity"] = glmToQList(_gravity); + result["damping"] = _damping; + result["lifetime"] = _lifetime; + result["script"] = _script; + result["registration-point"] = glmToQList(_registrationPoint); + result["angular-velocity"] = glmToQList(_angularVelocity); + result["angular-damping"] = _angularDamping; + result["visible"] = _visible; + result["ignore-for-collisions"] = _ignoreForCollisions; + result["collisions-will-move"] = _collisionsWillMove; + result["locked"] = _locked; + result["userData"] = _userData; + writeSubTypeToMap(result); return result; } + + +void EntityItem::readFromMap(QVariantMap map) { + _type = EntityTypes::getEntityTypeFromName(map["type"].toString()); + _created = map["created"].toULongLong(); + _lastEdited = map["last-edited"].toULongLong(); + _lastUpdated = map["last-updated"].toULongLong(); + _dimensions = qListToGlmVec3(map["dimensions"]); + _rotation = qListToGlmQuat(map["rotation"]); + _density = map["density"].toFloat(); + _gravity = qListToGlmVec3(map["gravity"]); + _damping = map["damping"].toFloat(); + _lifetime = map["lifetime"].toFloat(); + _script = map["script"].toString(); + _registrationPoint = qListToGlmVec3(map["registration-point"]); + _angularVelocity = qListToGlmVec3(map["angular-velocity"]); + _angularDamping = map["angular-damping"].toFloat(); + _visible = map["visible"].toBool(); + _ignoreForCollisions = map["ignore-for-collisions"].toBool(); + _collisionsWillMove = map["collisions-will-move"].toBool(); + _locked = map["locked"].toBool(); + _userData = map["userData"].toString(); +} diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index c9e7d9f5fa..d6c1f1d63f 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -294,6 +294,7 @@ public: QVariantMap writeToMap(); virtual void writeSubTypeToMap(QVariantMap& map) = 0; + void readFromMap(QVariantMap map); protected: diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index e6cd992445..1752e76975 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -983,43 +983,6 @@ void EntityTree::dumpTree() { recurseTreeWithOperator(&theOperator); } - - - -class ToMapOperator : public RecurseOctreeOperator { -public: - ToMapOperator(QVariantMap& map) : RecurseOctreeOperator(), _map(map) {}; - bool preRecursion(OctreeElement* element) {return true;} - bool postRecursion(OctreeElement* element) { - qDebug() << " in ToMapOperator::preRecursion"; - EntityTreeElement* entityTreeElement = static_cast(element); - const QList& entities = entityTreeElement->getEntities(); - if (!_map.contains("Entities")) { - _map["Entities"] = QVariantList(); - } - // XXX is this causing a lot of copying? - QVariantList entitiesQList = qvariant_cast(_map["Entities"]); - foreach (EntityItem* entityItem, entities) { - entitiesQList << entityItem->writeToMap(); - } - _map["Entities"] = entitiesQList; - return true; - } - private: - QVariantMap& _map; -}; - - - -bool EntityTree::writeToMap(QVariantMap& entityDescription) { - ToMapOperator theOperator(entityDescription); - recurseTreeWithOperator(&theOperator); - return true; -} - - - - class PruneOperator : public RecurseOctreeOperator { public: virtual bool preRecursion(OctreeElement* element) { return true; } @@ -1071,3 +1034,77 @@ bool EntityTree::sendEntitiesOperation(OctreeElement* element, void* extraData) return true; } + +class ToMapOperator : public RecurseOctreeOperator { +public: + ToMapOperator(QVariantMap& map) : RecurseOctreeOperator(), _map(map) {}; + bool preRecursion(OctreeElement* element) {return true;} + bool postRecursion(OctreeElement* element) { + qDebug() << " in ToMapOperator::preRecursion"; + EntityTreeElement* entityTreeElement = static_cast(element); + const QList& entities = entityTreeElement->getEntities(); + // XXX is this causing a lot of copying? + QVariantList entitiesQList = qvariant_cast(_map["Entities"]); + foreach (EntityItem* entityItem, entities) { + entitiesQList << entityItem->writeToMap(); + } + _map["Entities"] = entitiesQList; + return true; + } + private: + QVariantMap& _map; +}; + + + +bool EntityTree::writeToMap(QVariantMap& entityDescription) { + entityDescription["Entities"] = QVariantList(); + ToMapOperator theOperator(entityDescription); + recurseTreeWithOperator(&theOperator); + return true; +} + + +bool EntityTree::readFromMap(QVariantMap& map) { + + + QVariantList entitiesQList = map["Entities"].toList(); + + foreach (QVariant entityQ, entitiesQList) { + QVariantMap entityMap = entityQ.toMap(); + EntityTypes::EntityType entityType = EntityTypes::getEntityTypeFromName(entityMap["type"].toString()); + + if (entityType == EntityTypes::Unknown) { + qDebug() << "unknown entity type" << entityMap["type"]; + } + + const EntityItemID entityItemID(); + const EntityItemProperties entityItemProperties(); + EntityItem *entityItem = EntityTypes::constructEntityItem(entityType, entityItemID, entityItemProperties); + + // switch (entityType) { + // case EntityType::Model: + // ei = ModelEntityItem(); + // break; + // case EntityType::Box: + // ei = BoxEntityItem(); + // break; + // case EntityType::Sphere: + // ei = SphereEntityItem(); + // break; + // case EntityType::Light: + // ei = LightEntityItem(); + // break; + // case EntityType::Text: + // ei = TextEntityItem(); + // break; + // default: + // break; + // } + } + + + // EntityItem* addEntity(const EntityItemID& entityID, const EntityItemProperties& properties); + + return true; +} diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index d1df020e0f..b1116f57b0 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -156,6 +156,7 @@ public: void setWantEditLogging(bool value) { _wantEditLogging = value; } bool writeToMap(QVariantMap& entityDescription); + bool readFromMap(QVariantMap& entityDescription); signals: void deletingEntity(const EntityItemID& entityID); diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 3b8cb239f6..2442d41496 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -401,9 +401,6 @@ QString ModelEntityItem::getAnimationSettings() const { return jsonByteString; } - -QVariantMap ModelEntityItem::writeSubTypeToMap() { - QVariantMap result; - result["type"] = QString("model"); - return result; +void ModelEntityItem::writeSubTypeToMap(QVariantMap& map) { + map["type"] = QString("model"); } diff --git a/libraries/shared/src/QVariantGLM.cpp b/libraries/shared/src/QVariantGLM.cpp new file mode 100644 index 0000000000..b445392e16 --- /dev/null +++ b/libraries/shared/src/QVariantGLM.cpp @@ -0,0 +1,31 @@ +// +// QVariantGLM.cpp +// libraries/shared/src +// +// Created by Seth Alves on 3/9/15. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "QVariantGLM.h" + +QVariantList glmToQList(const glm::vec3& g) { + return QVariantList() << g[0] << g[1] << g[2]; +} + +QVariantList glmToQList(const glm::quat& g) { + return QVariantList() << g[0] << g[1] << g[2] << g[3]; +} + +glm::vec3 qListToGlmVec3(const QVariant q) { + QVariantList qList = q.toList(); + return glm::vec3(qList[0].toFloat(), qList[1].toFloat(), qList[2].toFloat()); +} + +glm::quat qListToGlmQuat(const QVariant q) { + QVariantList qList = q.toList(); + return glm::quat(qList[0].toFloat(), qList[1].toFloat(), qList[2].toFloat(), qList[3].toFloat()); +} + diff --git a/libraries/shared/src/QVariantGLM.h b/libraries/shared/src/QVariantGLM.h new file mode 100644 index 0000000000..10679fccd9 --- /dev/null +++ b/libraries/shared/src/QVariantGLM.h @@ -0,0 +1,21 @@ +// +// QVariantGLM.h +// libraries/shared/src +// +// Created by Seth Alves on 3/9/15. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include +#include +#include +#include +#include + +QVariantList glmToQList(const glm::vec3& g); +QVariantList glmToQList(const glm::quat& g); +glm::vec3 qListToGlmVec3(const QVariant q); +glm::quat qListToGlmQuat(const QVariant q); From 2076de91534d09e4e91f6a710e9ba4a84928e403 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 10 Mar 2015 10:12:29 -0700 Subject: [PATCH 03/41] started on reading entities from json file --- libraries/entities/src/BoxEntityItem.cpp | 9 ++- libraries/entities/src/BoxEntityItem.h | 1 + libraries/entities/src/EntityItem.cpp | 10 +++ libraries/entities/src/EntityItem.h | 3 + libraries/entities/src/EntityTree.cpp | 75 +++++++++++++------- libraries/entities/src/LightEntityItem.cpp | 14 +++- libraries/entities/src/LightEntityItem.h | 1 + libraries/entities/src/ModelEntityItem.cpp | 26 ++++++- libraries/entities/src/ModelEntityItem.h | 1 + libraries/entities/src/SphereEntityItem.cpp | 9 ++- libraries/entities/src/SphereEntityItem.h | 1 + libraries/entities/src/TextEntityItem.cpp | 15 +++- libraries/entities/src/TextEntityItem.h | 1 + libraries/octree/src/Octree.cpp | 19 +++++ libraries/octree/src/Octree.h | 5 ++ libraries/octree/src/OctreePersistThread.cpp | 3 +- libraries/shared/src/QVariantGLM.cpp | 15 +++- libraries/shared/src/QVariantGLM.h | 5 ++ 18 files changed, 182 insertions(+), 31 deletions(-) diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 2add36beea..deafe7ade6 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -17,6 +17,7 @@ #include "BoxEntityItem.h" #include "EntityTree.h" #include "EntityTreeElement.h" +#include "QVariantGLM.h" EntityItem* BoxEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { @@ -108,5 +109,11 @@ void BoxEntityItem::debugDump() const { void BoxEntityItem::writeSubTypeToMap(QVariantMap& map) { - map["type"] = QString("box"); + map["type"] = QString("Box"); + map["color"] = rgbColorToQList(_color); +} + + +void BoxEntityItem::readSubTypeFromMap(QVariantMap& map) { + qListtoRgbColor(map["color"], _color); } diff --git a/libraries/entities/src/BoxEntityItem.h b/libraries/entities/src/BoxEntityItem.h index 551a6c3f7a..aae8da48c6 100644 --- a/libraries/entities/src/BoxEntityItem.h +++ b/libraries/entities/src/BoxEntityItem.h @@ -56,6 +56,7 @@ public: virtual void debugDump() const; void writeSubTypeToMap(QVariantMap& map); + void readSubTypeFromMap(QVariantMap& map); protected: rgbColor _color; diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index c026e2310a..04a23b04ac 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1178,12 +1178,16 @@ QVariantMap EntityItem::writeToMap() { result["locked"] = _locked; result["userData"] = _userData; + // XXX glow? + writeSubTypeToMap(result); return result; } void EntityItem::readFromMap(QVariantMap map) { + // XXX +#if 0 _type = EntityTypes::getEntityTypeFromName(map["type"].toString()); _created = map["created"].toULongLong(); _lastEdited = map["last-edited"].toULongLong(); @@ -1203,4 +1207,10 @@ void EntityItem::readFromMap(QVariantMap map) { _collisionsWillMove = map["collisions-will-move"].toBool(); _locked = map["locked"].toBool(); _userData = map["userData"].toString(); + + // XXX glow? + +#endif + + readSubTypeFromMap(map); } diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index d6c1f1d63f..534ba338be 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -294,7 +294,10 @@ public: QVariantMap writeToMap(); virtual void writeSubTypeToMap(QVariantMap& map) = 0; + void readFromMap(QVariantMap map); + virtual void readSubTypeFromMap(QVariantMap& map) = 0; + protected: diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 1752e76975..d20df0546d 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -17,6 +17,7 @@ #include "AddEntityOperator.h" #include "MovingEntitiesOperator.h" #include "UpdateEntityOperator.h" +#include "QVariantGLM.h" EntityTree::EntityTree(bool shouldReaverage) : Octree(shouldReaverage), @@ -1067,44 +1068,70 @@ bool EntityTree::writeToMap(QVariantMap& entityDescription) { bool EntityTree::readFromMap(QVariantMap& map) { - QVariantList entitiesQList = map["Entities"].toList(); + qDebug() << "\n\n\nEntityTree::readFromMap --" << entitiesQList.count(); + + foreach (QVariant entityQ, entitiesQList) { QVariantMap entityMap = entityQ.toMap(); EntityTypes::EntityType entityType = EntityTypes::getEntityTypeFromName(entityMap["type"].toString()); + qDebug() << "found entity of type" << entityType; + if (entityType == EntityTypes::Unknown) { qDebug() << "unknown entity type" << entityMap["type"]; + continue; } - const EntityItemID entityItemID(); - const EntityItemProperties entityItemProperties(); - EntityItem *entityItem = EntityTypes::constructEntityItem(entityType, entityItemID, entityItemProperties); - // switch (entityType) { - // case EntityType::Model: - // ei = ModelEntityItem(); - // break; - // case EntityType::Box: - // ei = BoxEntityItem(); - // break; - // case EntityType::Sphere: - // ei = SphereEntityItem(); - // break; - // case EntityType::Light: - // ei = LightEntityItem(); - // break; - // case EntityType::Text: - // ei = TextEntityItem(); - // break; - // default: - // break; - // } + EntityItemProperties properties; + + + qDebug() << "------------------------------------------------------"; + for(QVariantMap::const_iterator iter = entityMap.begin(); iter != entityMap.end(); ++iter) { + qDebug() << iter.key() << iter.value(); + } + + + // const EntityItemID entityItemID = assignEntityID(entityItemID); + // EntityItem *entityItem = EntityTypes::constructEntityItem(entityType, entityItemID, properties); + + const EntityItemID entityItemID(QUuid::createUuid()); + + properties.setCreated(entityMap["created"].toULongLong()); + QString typeString = entityMap["type"].toString(); + // const char *typeCString = typeString.data(); + + QByteArray typeByteArray = typeString.toLocal8Bit(); + const char *typeCString = typeByteArray.data(); + properties.setType(EntityTypes::getEntityTypeFromName(typeCString)); + + properties.setDimensions(qListToGlmVec3(map["dimensions"])); + properties.setRotation(qListToGlmQuat(map["rotation"])); + properties.setDensity(map["density"].toFloat()); + properties.setVelocity(qListToGlmVec3(map["angular-velocity"])); + properties.setGravity(qListToGlmVec3(map["gravity"])); + properties.setDamping(map["damping"].toFloat()); + properties.setLifetime(map["lifetime"].toFloat()); + properties.setScript(map["script"].toString()); + properties.setRegistrationPoint(qListToGlmVec3(map["registration-point"])); + properties.setAngularVelocity(qListToGlmVec3(map["angular-velocity"])); + properties.setAngularDamping(map["angular-damping"].toFloat()); + properties.setGlowLevel(map["glow"].toFloat()); + properties.setLocalRenderAlpha(map["alpha"].toFloat()); + properties.setVisible(map["visible"].toBool()); + properties.setIgnoreForCollisions(map["ignore-for-collisions"].toBool()); + properties.setCollisionsWillMove(map["collisions-will-move"].toBool()); + properties.setLocked(map["locked"].toBool()); + properties.setUserData(map["userData"].toString()); + + EntityItem* newEntity = addEntity(entityItemID, properties); + newEntity->readFromMap(entityMap); } - // EntityItem* addEntity(const EntityItemID& entityID, const EntityItemProperties& properties); + return true; } diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index c29a7bd4da..778d3d5c5d 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -18,6 +18,7 @@ #include "EntityTree.h" #include "EntityTreeElement.h" #include "LightEntityItem.h" +#include "QVariantGLM.h" bool LightEntityItem::_lightsArePickable = false; @@ -152,5 +153,16 @@ void LightEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit } void LightEntityItem::writeSubTypeToMap(QVariantMap& map) { - map["type"] = QString("light"); + map["type"] = QString("Light"); + map["color"] = rgbColorToQList(_color); + map["intensity"] = _intensity; + map["exponent"] = _exponent; + map["cutoff"] = _cutoff; +} + +void LightEntityItem::readSubTypeFromMap(QVariantMap& map) { + qListtoRgbColor(map["color"], _color); + _intensity = map["intensity"].toFloat(); + _exponent = map["exponent"].toFloat(); + _cutoff = map["cutoff"].toFloat(); } diff --git a/libraries/entities/src/LightEntityItem.h b/libraries/entities/src/LightEntityItem.h index a2865ba8c7..616820a1ff 100644 --- a/libraries/entities/src/LightEntityItem.h +++ b/libraries/entities/src/LightEntityItem.h @@ -71,6 +71,7 @@ public: static void setLightsArePickable(bool value) { _lightsArePickable = value; } void writeSubTypeToMap(QVariantMap& map); + void readSubTypeFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 2442d41496..c4c69d39c8 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -17,6 +17,7 @@ #include "EntityTree.h" #include "EntityTreeElement.h" #include "ModelEntityItem.h" +#include "QVariantGLM.h" const QString ModelEntityItem::DEFAULT_MODEL_URL = QString(""); const QString ModelEntityItem::DEFAULT_ANIMATION_URL = QString(""); @@ -402,5 +403,28 @@ QString ModelEntityItem::getAnimationSettings() const { } void ModelEntityItem::writeSubTypeToMap(QVariantMap& map) { - map["type"] = QString("model"); + map["type"] = QString("Model"); + map["color"] = rgbColorToQList(_color); + map["model-url"] = _modelURL; + map["animation-url"] = _animationURL; + map["animation-fps"] = getAnimationFPS(); + map["animation-frame-index"] = getAnimationFrameIndex(); + map["animation-is-playing"] = getAnimationIsPlaying(); + map["textures"] = _textures; + map["animation-settings"] = getAnimationSettings(); + map["shape-type"] = _shapeType; +} + + +void ModelEntityItem::readSubTypeFromMap(QVariantMap& map) { + qListtoRgbColor(map["color"], _color); + + _modelURL = map["model-url"].toString(); + _animationURL = map["animation-url"].toString(); + setAnimationFPS(map["animation-fps"].toFloat()); + setAnimationFrameIndex(map["animation-frame-index"].toFloat()); + setAnimationIsPlaying(map["animation-is-playing"].toBool()); + _textures = map["textures"].toString(); + setAnimationSettings(map["animation-settings"].toString()); + _shapeType = (ShapeType)(map["shape-type"].toInt()); } diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index 918ff2b981..9df237baf8 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -116,6 +116,7 @@ public: static void cleanupLoadedAnimations(); void writeSubTypeToMap(QVariantMap& map); + void readSubTypeFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 76b10c36ff..3eb86740d5 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -20,6 +20,7 @@ #include "EntityTree.h" #include "EntityTreeElement.h" #include "SphereEntityItem.h" +#include "QVariantGLM.h" EntityItem* SphereEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { @@ -132,5 +133,11 @@ void SphereEntityItem::debugDump() const { void SphereEntityItem::writeSubTypeToMap(QVariantMap& map) { - map["type"] = QString("sphere"); + map["type"] = QString("Sphere"); + map["color"] = rgbColorToQList(_color); +} + + +void SphereEntityItem::readSubTypeFromMap(QVariantMap& map) { + qListtoRgbColor(map["color"], _color); } diff --git a/libraries/entities/src/SphereEntityItem.h b/libraries/entities/src/SphereEntityItem.h index ad9e82935b..484b1c5853 100644 --- a/libraries/entities/src/SphereEntityItem.h +++ b/libraries/entities/src/SphereEntityItem.h @@ -63,6 +63,7 @@ public: virtual void debugDump() const; void writeSubTypeToMap(QVariantMap& map); + void readSubTypeFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index eab1ec1100..b989ed0bb4 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -20,6 +20,7 @@ #include "EntityTree.h" #include "EntityTreeElement.h" #include "TextEntityItem.h" +#include "QVariantGLM.h" const QString TextEntityItem::DEFAULT_TEXT(""); @@ -166,5 +167,17 @@ bool TextEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const } void TextEntityItem::writeSubTypeToMap(QVariantMap& map) { - map["type"] = QString("text"); + map["type"] = QString("Text"); + map["text"] = _text; + map["line-height"] = _lineHeight; + map["text-color"] = rgbColorToQList(_textColor); + map["background-color"] = rgbColorToQList(_backgroundColor); +} + + +void TextEntityItem::readSubTypeFromMap(QVariantMap& map) { + _text = map["text"].toString(); + _lineHeight = map["line-height"].toFloat(); + qListtoRgbColor(map["text-color"], _textColor); + qListtoRgbColor(map["background-color"], _backgroundColor); } diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index 954ba22440..ae2a9b0def 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -81,6 +81,7 @@ public: } void writeSubTypeToMap(QVariantMap& map); + void readSubTypeFromMap(QVariantMap& map); protected: QString _text; diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index e925ea5aba..9df3382d28 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -20,6 +20,8 @@ #include #include +#include +#include #include #include @@ -1849,6 +1851,23 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, return bytesAtThisLevel; } + +bool Octree::readFromJSONFile(const char* fileName) { + QFile file; + file.setFileName("/tmp/ok.json"); + file.open(QIODevice::ReadOnly | QIODevice::Text); + QString val = file.readAll(); + file.close(); + qWarning() << val; + QJsonDocument d = QJsonDocument::fromJson(val.toUtf8()); + QVariant v = d.toVariant(); + QVariantMap m = v.toMap(); + + readFromMap(m); + return true; +} + + bool Octree::readFromSVOFile(const char* fileName) { bool fileOk = false; diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 67d4dbb576..e6a30f71bf 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -321,6 +321,9 @@ public: void writeToSVOFile(const char* filename, OctreeElement* element = NULL); bool readFromSVOFile(const char* filename); + bool readFromJSONFile(const char* fileName); + + virtual bool writeToMap(QVariantMap& entityDescription) { return true; } unsigned long getOctreeElementsCount(); @@ -356,6 +359,8 @@ public: virtual void pruneTree() { }; + virtual bool readFromMap(QVariantMap& entityDescription) = 0; + signals: void importSize(float x, float y, float z); void importProgress(int progress); diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index 51c90dc68d..8ac75494db 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -141,7 +141,8 @@ bool OctreePersistThread::process() { qDebug() << "Loading Octree... lock file removed:" << lockFileName; } - persistantFileRead = _tree->readFromSVOFile(_filename.toLocal8Bit().constData()); + // persistantFileRead = _tree->readFromSVOFile(_filename.toLocal8Bit().constData()); + persistantFileRead = _tree->readFromJSONFile(_filename.toLocal8Bit().constData()); _tree->pruneTree(); } _tree->unlock(); diff --git a/libraries/shared/src/QVariantGLM.cpp b/libraries/shared/src/QVariantGLM.cpp index b445392e16..77d4767dcc 100644 --- a/libraries/shared/src/QVariantGLM.cpp +++ b/libraries/shared/src/QVariantGLM.cpp @@ -10,6 +10,7 @@ // #include "QVariantGLM.h" +#include "OctalCode.h" QVariantList glmToQList(const glm::vec3& g) { return QVariantList() << g[0] << g[1] << g[2]; @@ -19,9 +20,15 @@ QVariantList glmToQList(const glm::quat& g) { return QVariantList() << g[0] << g[1] << g[2] << g[3]; } +QVariantList rgbColorToQList(rgbColor& v) { + return QVariantList() << (int)(v[0]) << (int)(v[1]) << (int)(v[2]); +} + + + glm::vec3 qListToGlmVec3(const QVariant q) { QVariantList qList = q.toList(); - return glm::vec3(qList[0].toFloat(), qList[1].toFloat(), qList[2].toFloat()); + return glm::vec3(qList[RED_INDEX].toFloat(), qList[GREEN_INDEX].toFloat(), qList[BLUE_INDEX].toFloat()); } glm::quat qListToGlmQuat(const QVariant q) { @@ -29,3 +36,9 @@ glm::quat qListToGlmQuat(const QVariant q) { return glm::quat(qList[0].toFloat(), qList[1].toFloat(), qList[2].toFloat(), qList[3].toFloat()); } +void qListtoRgbColor(const QVariant q, rgbColor returnValue) { + QVariantList qList = q.toList(); + returnValue[RED_INDEX] = qList[RED_INDEX].toInt(); + returnValue[GREEN_INDEX] = qList[GREEN_INDEX].toInt(); + returnValue[BLUE_INDEX] = qList[BLUE_INDEX].toInt(); +} diff --git a/libraries/shared/src/QVariantGLM.h b/libraries/shared/src/QVariantGLM.h index 10679fccd9..4cc1d038a1 100644 --- a/libraries/shared/src/QVariantGLM.h +++ b/libraries/shared/src/QVariantGLM.h @@ -15,7 +15,12 @@ #include #include +#include "SharedUtil.h" + QVariantList glmToQList(const glm::vec3& g); QVariantList glmToQList(const glm::quat& g); +QVariantList rgbColorToQList(rgbColor& v); + glm::vec3 qListToGlmVec3(const QVariant q); glm::quat qListToGlmQuat(const QVariant q); +void qListtoRgbColor(const QVariant q, rgbColor returnValue); From 088e23ad5497c43cc9e71eee8f493b81407d1d35 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 10 Mar 2015 11:31:48 -0700 Subject: [PATCH 04/41] saving and loading largely works. still some rough edges --- libraries/entities/src/EntityItem.cpp | 42 +++++++++------- libraries/entities/src/EntityTree.cpp | 49 +++++++++++-------- .../entities/src/ParticleEffectEntityItem.cpp | 34 +++++++++++++ .../entities/src/ParticleEffectEntityItem.h | 3 ++ libraries/shared/src/QVariantGLM.cpp | 8 ++- 5 files changed, 95 insertions(+), 41 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 0353ffc172..0b04ed7168 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1144,28 +1144,32 @@ QVariantMap EntityItem::writeToMap() { QVariantMap result; // result["id"] = getID().toString(); result["type"] = _type; + + result["created"] = _created; + result["last-edited"] = getLastEdited(); + result["last-updated"] = _lastUpdated; // result["animation-update-delta"] = getLastUpdated() <= getLastEdited() ? 0 : getLastUpdated() - getLastEdited(); // result["simulation-update-delta"] = getLastSimulated() <= getLastEdited() ? 0 : getLastSimulated() - getLastEdited(); - result["created"] = _created; - result["last-edited"] = _lastEdited; - result["last-updated"] = _lastUpdated; - result["dimensions"] = glmToQList(_dimensions); - result["rotation"] = glmToQList(_rotation); - result["density"] = _density; - result["gravity"] = glmToQList(_gravity); - result["damping"] = _damping; - result["lifetime"] = _lifetime; - result["script"] = _script; - result["registration-point"] = glmToQList(_registrationPoint); - result["angular-velocity"] = glmToQList(_angularVelocity); - result["angular-damping"] = _angularDamping; - result["visible"] = _visible; - result["ignore-for-collisions"] = _ignoreForCollisions; - result["collisions-will-move"] = _collisionsWillMove; - result["locked"] = _locked; - result["userData"] = _userData; - // XXX glow? + result["position"] = glmToQList(getPosition()); + result["dimensions"] = glmToQList(getDimensions()); + result["rotation"] = glmToQList(getRotation()); + result["density"] = getDensity(); + result["velocity"] = glmToQList(getVelocity()); + result["gravity"] = glmToQList(getGravity()); + result["damping"] = getDamping(); + result["lifetime"] = getLifetime(); + result["script"] = getScript(); + result["registration-point"] = glmToQList(getRegistrationPoint()); + result["angular-velocity"] = glmToQList(getAngularVelocity()); + result["angular-damping"] = getAngularDamping(); + result["visible"] = getVisible(); + result["ignore-for-collisions"] = getIgnoreForCollisions(); + result["collisions-will-move"] = getCollisionsWillMove(); + result["locked"] = getLocked(); + result["userData"] = getUserData(); + result["glow-level"] = getGlowLevel(); + writeSubTypeToMap(result); return result; diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 0873e9b823..5ec59049ce 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1109,27 +1109,36 @@ bool EntityTree::readFromMap(QVariantMap& map) { const char *typeCString = typeByteArray.data(); properties.setType(EntityTypes::getEntityTypeFromName(typeCString)); - properties.setDimensions(qListToGlmVec3(map["dimensions"])); - properties.setRotation(qListToGlmQuat(map["rotation"])); - properties.setDensity(map["density"].toFloat()); - properties.setVelocity(qListToGlmVec3(map["angular-velocity"])); - properties.setGravity(qListToGlmVec3(map["gravity"])); - properties.setDamping(map["damping"].toFloat()); - properties.setLifetime(map["lifetime"].toFloat()); - properties.setScript(map["script"].toString()); - properties.setRegistrationPoint(qListToGlmVec3(map["registration-point"])); - properties.setAngularVelocity(qListToGlmVec3(map["angular-velocity"])); - properties.setAngularDamping(map["angular-damping"].toFloat()); - properties.setGlowLevel(map["glow"].toFloat()); - properties.setLocalRenderAlpha(map["alpha"].toFloat()); - properties.setVisible(map["visible"].toBool()); - properties.setIgnoreForCollisions(map["ignore-for-collisions"].toBool()); - properties.setCollisionsWillMove(map["collisions-will-move"].toBool()); - properties.setLocked(map["locked"].toBool()); - properties.setUserData(map["userData"].toString()); + - EntityItem* newEntity = addEntity(entityItemID, properties); - newEntity->readFromMap(entityMap); + properties.setPosition(qListToGlmVec3(entityMap["position"])); + properties.setDimensions(qListToGlmVec3(entityMap["dimensions"])); + properties.setRotation(qListToGlmQuat(entityMap["rotation"])); + properties.setDensity(entityMap["density"].toFloat()); + properties.setVelocity(qListToGlmVec3(entityMap["angular-velocity"])); + properties.setGravity(qListToGlmVec3(entityMap["gravity"])); + properties.setDamping(entityMap["damping"].toFloat()); + properties.setLifetime(entityMap["lifetime"].toFloat()); + properties.setScript(entityMap["script"].toString()); + properties.setRegistrationPoint(qListToGlmVec3(entityMap["registration-point"])); + properties.setAngularVelocity(qListToGlmVec3(entityMap["angular-velocity"])); + properties.setAngularDamping(entityMap["angular-damping"].toFloat()); + properties.setGlowLevel(entityMap["glow"].toFloat()); + properties.setLocalRenderAlpha(entityMap["alpha"].toFloat()); + properties.setVisible(entityMap["visible"].toBool()); + properties.setIgnoreForCollisions(entityMap["ignore-for-collisions"].toBool()); + properties.setCollisionsWillMove(entityMap["collisions-will-move"].toBool()); + properties.setLocked(entityMap["locked"].toBool()); + properties.setUserData(entityMap["userData"].toString()); + + EntityItem* entity = addEntity(entityItemID, properties); + // EntityItem* entity = getOrCreateEntityItem(entityItemID, properties); + entity->readFromMap(entityMap); + postAddEntity(entity); + update(); + qDebug() << "\n\n\n"; + dumpTree(); + qDebug() << "\n\n\n"; } diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index b902dd63b8..76613053fe 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -43,6 +43,7 @@ #include "EntityTree.h" #include "EntityTreeElement.h" #include "ParticleEffectEntityItem.h" +#include "QVariantGLM.h" const float ParticleEffectEntityItem::DEFAULT_ANIMATION_FRAME_INDEX = 0.0f; const bool ParticleEffectEntityItem::DEFAULT_ANIMATION_IS_PLAYING = false; @@ -510,3 +511,36 @@ void ParticleEffectEntityItem::resetSimulation() { srand(_randSeed); } + +void ParticleEffectEntityItem::writeSubTypeToMap(QVariantMap& map) { + map["type"] = QString("Box"); + map["color"] = rgbColorToQList(_color); + map["max-particles"] = _maxParticles; + map["lifespan"] = _lifespan; + map["emit-rate"] = _emitRate; + map["emit-direction"] = glmToQList(_emitDirection); + map["emit-strength"] = _emitStrength; + map["local-gravity"] = _localGravity; + map["particle-radius"] = _particleRadius; + map["last-animatged"] = _lastAnimated; + // XXX animation-loop + map["animation-settings"] = _animationSettings; + map["shape-type"] = _shapeType; +} + + +void ParticleEffectEntityItem::readSubTypeFromMap(QVariantMap& map) { + qListtoRgbColor(map["color"], _color); + + _maxParticles = map["max-particles"].toFloat(); + _lifespan = map["lifespan"].toFloat(); + _emitRate = map["emit-rate"].toFloat(); + _emitDirection = qListToGlmVec3(map["emit-direction"]); + _emitStrength = map["emit-strength"].toFloat(); + _localGravity = map["local-gravity"].toFloat(); + _particleRadius = map["particle-radius"].toFloat(); + _lastAnimated = map["last-animated"].toULongLong(); + // XXX animation-loop + _animationSettings = map["animation-settings"].toString(); + _shapeType = (ShapeType)(map["shape-type"].toInt()); +} diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index b00eb94685..48fc6fbf67 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -141,6 +141,9 @@ public: float getAnimationFPS() const { return _animationLoop.getFPS(); } QString getAnimationSettings() const; + void writeSubTypeToMap(QVariantMap& map); + void readSubTypeFromMap(QVariantMap& map); + protected: bool isAnimatingSomething() const; diff --git a/libraries/shared/src/QVariantGLM.cpp b/libraries/shared/src/QVariantGLM.cpp index 77d4767dcc..aa8fa40593 100644 --- a/libraries/shared/src/QVariantGLM.cpp +++ b/libraries/shared/src/QVariantGLM.cpp @@ -17,7 +17,7 @@ QVariantList glmToQList(const glm::vec3& g) { } QVariantList glmToQList(const glm::quat& g) { - return QVariantList() << g[0] << g[1] << g[2] << g[3]; + return QVariantList() << g.x << g.y << g.z << g.w; } QVariantList rgbColorToQList(rgbColor& v) { @@ -33,7 +33,11 @@ glm::vec3 qListToGlmVec3(const QVariant q) { glm::quat qListToGlmQuat(const QVariant q) { QVariantList qList = q.toList(); - return glm::quat(qList[0].toFloat(), qList[1].toFloat(), qList[2].toFloat(), qList[3].toFloat()); + float x = qList[0].toFloat(); + float y = qList[1].toFloat(); + float z = qList[2].toFloat(); + float w = qList[3].toFloat(); + return glm::quat(w, x, y, z); } void qListtoRgbColor(const QVariant q, rgbColor returnValue) { From 291f239727bcf8d8509f85b629339547bb043114 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 10 Mar 2015 11:55:20 -0700 Subject: [PATCH 05/41] if we read an entity with no id, create a random one for it --- libraries/entities/src/EntityItem.cpp | 46 ++++++++++++--------------- libraries/entities/src/EntityTree.cpp | 42 ++++++++++-------------- 2 files changed, 37 insertions(+), 51 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 0b04ed7168..913f2fb816 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1142,7 +1142,7 @@ void EntityItem::updateLifetime(float value) { QVariantMap EntityItem::writeToMap() { QVariantMap result; - // result["id"] = getID().toString(); + result["id"] = getID().toString(); result["type"] = _type; result["created"] = _created; @@ -1177,31 +1177,25 @@ QVariantMap EntityItem::writeToMap() { void EntityItem::readFromMap(QVariantMap map) { - // XXX -#if 0 - _type = EntityTypes::getEntityTypeFromName(map["type"].toString()); - _created = map["created"].toULongLong(); - _lastEdited = map["last-edited"].toULongLong(); - _lastUpdated = map["last-updated"].toULongLong(); - _dimensions = qListToGlmVec3(map["dimensions"]); - _rotation = qListToGlmQuat(map["rotation"]); - _density = map["density"].toFloat(); - _gravity = qListToGlmVec3(map["gravity"]); - _damping = map["damping"].toFloat(); - _lifetime = map["lifetime"].toFloat(); - _script = map["script"].toString(); - _registrationPoint = qListToGlmVec3(map["registration-point"]); - _angularVelocity = qListToGlmVec3(map["angular-velocity"]); - _angularDamping = map["angular-damping"].toFloat(); - _visible = map["visible"].toBool(); - _ignoreForCollisions = map["ignore-for-collisions"].toBool(); - _collisionsWillMove = map["collisions-will-move"].toBool(); - _locked = map["locked"].toBool(); - _userData = map["userData"].toString(); - - // XXX glow? - -#endif + // _type = EntityTypes::getEntityTypeFromName(map["type"].toString()); + // _created = map["created"].toULongLong(); + // _lastEdited = map["last-edited"].toULongLong(); + // _lastUpdated = map["last-updated"].toULongLong(); + // _dimensions = qListToGlmVec3(map["dimensions"]); + // _rotation = qListToGlmQuat(map["rotation"]); + // _density = map["density"].toFloat(); + // _gravity = qListToGlmVec3(map["gravity"]); + // _damping = map["damping"].toFloat(); + // _lifetime = map["lifetime"].toFloat(); + // _script = map["script"].toString(); + // _registrationPoint = qListToGlmVec3(map["registration-point"]); + // _angularVelocity = qListToGlmVec3(map["angular-velocity"]); + // _angularDamping = map["angular-damping"].toFloat(); + // _visible = map["visible"].toBool(); + // _ignoreForCollisions = map["ignore-for-collisions"].toBool(); + // _collisionsWillMove = map["collisions-will-move"].toBool(); + // _locked = map["locked"].toBool(); + // _userData = map["userData"].toString(); readSubTypeFromMap(map); } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 5ec59049ce..88e3fdee44 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1077,40 +1077,32 @@ bool EntityTree::readFromMap(QVariantMap& map) { foreach (QVariant entityQ, entitiesQList) { QVariantMap entityMap = entityQ.toMap(); - EntityTypes::EntityType entityType = EntityTypes::getEntityTypeFromName(entityMap["type"].toString()); - qDebug() << "found entity of type" << entityType; + // EntityTypes::EntityType entityType = EntityTypes::getEntityTypeFromName(entityMap["type"].toString()); - if (entityType == EntityTypes::Unknown) { - qDebug() << "unknown entity type" << entityMap["type"]; - continue; - } + // qDebug() << "found entity of type" << entityType; + + // if (entityType == EntityTypes::Unknown) { + // qDebug() << "unknown entity type" << entityMap["type"]; + // continue; + // } EntityItemProperties properties; - - qDebug() << "------------------------------------------------------"; - for(QVariantMap::const_iterator iter = entityMap.begin(); iter != entityMap.end(); ++iter) { - qDebug() << iter.key() << iter.value(); + EntityItemID entityItemID; + if (entityMap.contains("id")) { + entityItemID = EntityItemID(QUuid(entityMap["id"].toString())); + } else { + entityItemID = EntityItemID(QUuid::createUuid()); } - - // const EntityItemID entityItemID = assignEntityID(entityItemID); - // EntityItem *entityItem = EntityTypes::constructEntityItem(entityType, entityItemID, properties); - - const EntityItemID entityItemID(QUuid::createUuid()); - properties.setCreated(entityMap["created"].toULongLong()); QString typeString = entityMap["type"].toString(); - // const char *typeCString = typeString.data(); - QByteArray typeByteArray = typeString.toLocal8Bit(); const char *typeCString = typeByteArray.data(); properties.setType(EntityTypes::getEntityTypeFromName(typeCString)); - - properties.setPosition(qListToGlmVec3(entityMap["position"])); properties.setDimensions(qListToGlmVec3(entityMap["dimensions"])); properties.setRotation(qListToGlmQuat(entityMap["rotation"])); @@ -1134,11 +1126,11 @@ bool EntityTree::readFromMap(QVariantMap& map) { EntityItem* entity = addEntity(entityItemID, properties); // EntityItem* entity = getOrCreateEntityItem(entityItemID, properties); entity->readFromMap(entityMap); - postAddEntity(entity); - update(); - qDebug() << "\n\n\n"; - dumpTree(); - qDebug() << "\n\n\n"; + // postAddEntity(entity); + // update(); + // qDebug() << "\n\n\n"; + // dumpTree(); + // qDebug() << "\n\n\n"; } From 2a06816f71e1eeec012318bc8ef4651f8eba9e5d Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 11 Mar 2015 23:09:15 -0700 Subject: [PATCH 06/41] added persist-as-json checkbox to domain settings. File extension of persist file is automatically adjusted when entity server saves. When loading, if both a json and svo file exist, the newer one is used. This is regardless of the persistAsJson setting --- assignment-client/src/octree/OctreeServer.cpp | 9 +- assignment-client/src/octree/OctreeServer.h | 1 + .../resources/describe-settings.json | 8 ++ interface/src/Application.cpp | 2 +- libraries/entities/src/BoxEntityItem.cpp | 2 +- libraries/entities/src/BoxEntityItem.h | 2 +- libraries/entities/src/EntityItem.cpp | 25 ---- libraries/entities/src/EntityItem.h | 3 +- libraries/entities/src/EntityTree.cpp | 22 +-- libraries/entities/src/EntityTree.h | 2 +- libraries/entities/src/LightEntityItem.cpp | 2 +- libraries/entities/src/LightEntityItem.h | 2 +- libraries/entities/src/ModelEntityItem.cpp | 2 +- libraries/entities/src/ModelEntityItem.h | 2 +- .../entities/src/ParticleEffectEntityItem.cpp | 2 +- .../entities/src/ParticleEffectEntityItem.h | 2 +- libraries/entities/src/SphereEntityItem.cpp | 2 +- libraries/entities/src/SphereEntityItem.h | 2 +- libraries/entities/src/TextEntityItem.cpp | 2 +- libraries/entities/src/TextEntityItem.h | 2 +- libraries/octree/src/Octree.cpp | 127 +++++++++++++++--- libraries/octree/src/Octree.h | 16 ++- libraries/octree/src/OctreeElement.h | 2 - libraries/octree/src/OctreePersistThread.cpp | 23 +--- libraries/octree/src/OctreePersistThread.h | 6 +- 25 files changed, 167 insertions(+), 103 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 85d4749b27..3501fe4a6a 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1036,6 +1036,13 @@ void OctreeServer::readConfiguration() { strcpy(_persistFilename, qPrintable(persistFilename)); qDebug("persistFilename=%s", _persistFilename); + bool persistAsJson; + if (!readOptionBool(QString("persistAsJson"), settingsSectionObject, persistAsJson)) { + persistAsJson = false; + } + _persistAsJson = persistAsJson; + qDebug() << "persistAsJson=" << _persistAsJson; + _persistInterval = OctreePersistThread::DEFAULT_PERSIST_INTERVAL; readOptionInt(QString("persistInterval"), settingsSectionObject, _persistInterval); qDebug() << "persistInterval=" << _persistInterval; @@ -1131,7 +1138,7 @@ void OctreeServer::run() { // now set up PersistThread _persistThread = new OctreePersistThread(_tree, _persistFilename, _persistInterval, - _wantBackup, _settings, _debugTimestampNow); + _wantBackup, _settings, _debugTimestampNow, _persistAsJson); if (_persistThread) { _persistThread->initialize(true); } diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 0f90c2941e..aa7a565964 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -157,6 +157,7 @@ protected: QString _statusHost; char _persistFilename[MAX_FILENAME_LENGTH]; + bool _persistAsJson; int _packetsPerClientPerInterval; int _packetsTotalPerInterval; Octree* _tree; // this IS a reaveraging tree diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index fdaede8c44..b3940528ca 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -325,6 +325,14 @@ "default": "resources/models.svo", "advanced": true }, + { + "name": "persistAsJson", + "type": "checkbox", + "label": "Encode persist file as JSON:", + "help": "Entity server will save entities as JSON rather than SVO", + "default": false, + "advanced": true + }, { "name": "persistInterval", "label": "Save Check Interval", diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1e21144546..21f3c113c6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1786,7 +1786,7 @@ bool Application::importEntities(const QString& urlOrFilename) { url = QUrl::fromLocalFile(urlOrFilename); } - bool success = _entityClipboard.readFromSVOURL(url.toString()); + bool success = _entityClipboard.readFromURL(url.toString()); if (success) { _entityClipboard.reaverageOctreeElements(); } diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index deafe7ade6..881e9b6169 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -114,6 +114,6 @@ void BoxEntityItem::writeSubTypeToMap(QVariantMap& map) { } -void BoxEntityItem::readSubTypeFromMap(QVariantMap& map) { +void BoxEntityItem::readFromMap(QVariantMap& map) { qListtoRgbColor(map["color"], _color); } diff --git a/libraries/entities/src/BoxEntityItem.h b/libraries/entities/src/BoxEntityItem.h index aae8da48c6..4fd3b718c5 100644 --- a/libraries/entities/src/BoxEntityItem.h +++ b/libraries/entities/src/BoxEntityItem.h @@ -56,7 +56,7 @@ public: virtual void debugDump() const; void writeSubTypeToMap(QVariantMap& map); - void readSubTypeFromMap(QVariantMap& map); + void readFromMap(QVariantMap& map); protected: rgbColor _color; diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 913f2fb816..18cd095fea 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1174,28 +1174,3 @@ QVariantMap EntityItem::writeToMap() { writeSubTypeToMap(result); return result; } - - -void EntityItem::readFromMap(QVariantMap map) { - // _type = EntityTypes::getEntityTypeFromName(map["type"].toString()); - // _created = map["created"].toULongLong(); - // _lastEdited = map["last-edited"].toULongLong(); - // _lastUpdated = map["last-updated"].toULongLong(); - // _dimensions = qListToGlmVec3(map["dimensions"]); - // _rotation = qListToGlmQuat(map["rotation"]); - // _density = map["density"].toFloat(); - // _gravity = qListToGlmVec3(map["gravity"]); - // _damping = map["damping"].toFloat(); - // _lifetime = map["lifetime"].toFloat(); - // _script = map["script"].toString(); - // _registrationPoint = qListToGlmVec3(map["registration-point"]); - // _angularVelocity = qListToGlmVec3(map["angular-velocity"]); - // _angularDamping = map["angular-damping"].toFloat(); - // _visible = map["visible"].toBool(); - // _ignoreForCollisions = map["ignore-for-collisions"].toBool(); - // _collisionsWillMove = map["collisions-will-move"].toBool(); - // _locked = map["locked"].toBool(); - // _userData = map["userData"].toString(); - - readSubTypeFromMap(map); -} diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 527c091480..0f9d1358db 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -298,8 +298,7 @@ public: QVariantMap writeToMap(); virtual void writeSubTypeToMap(QVariantMap& map) = 0; - void readFromMap(QVariantMap map); - virtual void readSubTypeFromMap(QVariantMap& map) = 0; + virtual void readFromMap(QVariantMap& map) = 0; protected: diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 88e3fdee44..b2823f54ee 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1060,7 +1060,9 @@ public: -bool EntityTree::writeToMap(QVariantMap& entityDescription) { +bool EntityTree::writeToMap(QVariantMap& entityDescription, OctreeElement* element) { + + // XXX how can I make the RecurseOctreeOperator start with element? entityDescription["Entities"] = QVariantList(); ToMapOperator theOperator(entityDescription); recurseTreeWithOperator(&theOperator); @@ -1078,16 +1080,6 @@ bool EntityTree::readFromMap(QVariantMap& map) { foreach (QVariant entityQ, entitiesQList) { QVariantMap entityMap = entityQ.toMap(); - // EntityTypes::EntityType entityType = EntityTypes::getEntityTypeFromName(entityMap["type"].toString()); - - // qDebug() << "found entity of type" << entityType; - - // if (entityType == EntityTypes::Unknown) { - // qDebug() << "unknown entity type" << entityMap["type"]; - // continue; - // } - - EntityItemProperties properties; EntityItemID entityItemID; @@ -1101,6 +1093,7 @@ bool EntityTree::readFromMap(QVariantMap& map) { QString typeString = entityMap["type"].toString(); QByteArray typeByteArray = typeString.toLocal8Bit(); const char *typeCString = typeByteArray.data(); + properties.setType(EntityTypes::getEntityTypeFromName(typeCString)); properties.setPosition(qListToGlmVec3(entityMap["position"])); @@ -1124,13 +1117,8 @@ bool EntityTree::readFromMap(QVariantMap& map) { properties.setUserData(entityMap["userData"].toString()); EntityItem* entity = addEntity(entityItemID, properties); - // EntityItem* entity = getOrCreateEntityItem(entityItemID, properties); + entity->readFromMap(entityMap); - // postAddEntity(entity); - // update(); - // qDebug() << "\n\n\n"; - // dumpTree(); - // qDebug() << "\n\n\n"; } diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 599bdfdb7b..5f7b89950b 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -158,7 +158,7 @@ public: bool wantEditLogging() const { return _wantEditLogging; } void setWantEditLogging(bool value) { _wantEditLogging = value; } - bool writeToMap(QVariantMap& entityDescription); + bool writeToMap(QVariantMap& entityDescription, OctreeElement* element); bool readFromMap(QVariantMap& entityDescription); signals: diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index 778d3d5c5d..f85aea12d5 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -160,7 +160,7 @@ void LightEntityItem::writeSubTypeToMap(QVariantMap& map) { map["cutoff"] = _cutoff; } -void LightEntityItem::readSubTypeFromMap(QVariantMap& map) { +void LightEntityItem::readFromMap(QVariantMap& map) { qListtoRgbColor(map["color"], _color); _intensity = map["intensity"].toFloat(); _exponent = map["exponent"].toFloat(); diff --git a/libraries/entities/src/LightEntityItem.h b/libraries/entities/src/LightEntityItem.h index 616820a1ff..8e3c89e917 100644 --- a/libraries/entities/src/LightEntityItem.h +++ b/libraries/entities/src/LightEntityItem.h @@ -71,7 +71,7 @@ public: static void setLightsArePickable(bool value) { _lightsArePickable = value; } void writeSubTypeToMap(QVariantMap& map); - void readSubTypeFromMap(QVariantMap& map); + void readFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 477ce0d3fb..32a83c4af4 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -427,7 +427,7 @@ void ModelEntityItem::writeSubTypeToMap(QVariantMap& map) { } -void ModelEntityItem::readSubTypeFromMap(QVariantMap& map) { +void ModelEntityItem::readFromMap(QVariantMap& map) { qListtoRgbColor(map["color"], _color); _modelURL = map["model-url"].toString(); diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index a0b095e205..528469b715 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -121,7 +121,7 @@ public: static void cleanupLoadedAnimations(); void writeSubTypeToMap(QVariantMap& map); - void readSubTypeFromMap(QVariantMap& map); + void readFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 76613053fe..8932f99fb8 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -529,7 +529,7 @@ void ParticleEffectEntityItem::writeSubTypeToMap(QVariantMap& map) { } -void ParticleEffectEntityItem::readSubTypeFromMap(QVariantMap& map) { +void ParticleEffectEntityItem::readFromMap(QVariantMap& map) { qListtoRgbColor(map["color"], _color); _maxParticles = map["max-particles"].toFloat(); diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index 48fc6fbf67..fdc1f2d078 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -142,7 +142,7 @@ public: QString getAnimationSettings() const; void writeSubTypeToMap(QVariantMap& map); - void readSubTypeFromMap(QVariantMap& map); + void readFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 561c05d959..d954156bff 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -135,6 +135,6 @@ void SphereEntityItem::writeSubTypeToMap(QVariantMap& map) { } -void SphereEntityItem::readSubTypeFromMap(QVariantMap& map) { +void SphereEntityItem::readFromMap(QVariantMap& map) { qListtoRgbColor(map["color"], _color); } diff --git a/libraries/entities/src/SphereEntityItem.h b/libraries/entities/src/SphereEntityItem.h index 484b1c5853..85f66f8d49 100644 --- a/libraries/entities/src/SphereEntityItem.h +++ b/libraries/entities/src/SphereEntityItem.h @@ -63,7 +63,7 @@ public: virtual void debugDump() const; void writeSubTypeToMap(QVariantMap& map); - void readSubTypeFromMap(QVariantMap& map); + void readFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index 45aa80ee24..21194284ee 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -181,7 +181,7 @@ void TextEntityItem::writeSubTypeToMap(QVariantMap& map) { } -void TextEntityItem::readSubTypeFromMap(QVariantMap& map) { +void TextEntityItem::readFromMap(QVariantMap& map) { _text = map["text"].toString(); _lineHeight = map["line-height"].toFloat(); qListtoRgbColor(map["text-color"], _textColor); diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index bc45715e6e..524e698bb4 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -82,7 +82,7 @@ public: } void writeSubTypeToMap(QVariantMap& map); - void readSubTypeFromMap(QVariantMap& map); + void readFromMap(QVariantMap& map); protected: QString _text; diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 1cd3dfcbf7..1adc374c70 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include @@ -1844,37 +1846,52 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, } -bool Octree::readFromJSONFile(const char* fileName) { - QFile file; - file.setFileName("/tmp/ok.json"); - file.open(QIODevice::ReadOnly | QIODevice::Text); - QString val = file.readAll(); - file.close(); - qWarning() << val; - QJsonDocument d = QJsonDocument::fromJson(val.toUtf8()); - QVariant v = d.toVariant(); - QVariantMap m = v.toMap(); - - readFromMap(m); - return true; +QString withoutFileExtension(const QString& fileName) { + return fileName.left(fileName.lastIndexOf(".")); } -bool Octree::readFromSVOFile(const char* fileName) { +bool Octree::readFromFile(const char* fileName) { bool fileOk = false; - QFile file(fileName); + // try to ease migration from svo to json or back + QString svoFileName = withoutFileExtension(QString(fileName)) + ".svo"; + QFileInfo svoFileInfo(svoFileName); + QString jsonFileName = withoutFileExtension(QString(fileName)) + ".json"; + QFileInfo jsonFileInfo(jsonFileName); + QString qFileName; + QFileInfo fileInfo; + + if (jsonFileInfo.exists() && svoFileInfo.exists()) { + if (jsonFileInfo.lastModified() >= svoFileInfo.lastModified()) { + qFileName = jsonFileName; + fileInfo = jsonFileInfo; + } else { + qFileName = svoFileName; + fileInfo = svoFileInfo; + } + } else if (jsonFileInfo.exists()) { + qFileName = jsonFileName; + fileInfo = jsonFileInfo; + } else if (svoFileInfo.exists()) { + qFileName = svoFileName; + fileInfo = svoFileInfo; + } else { + qDebug() << "failed to read Octree from nonexistant file:" << fileName; + return false; + } + + QFile file(qFileName); fileOk = file.open(QIODevice::ReadOnly); if(fileOk) { QDataStream fileInputStream(&file); - QFileInfo fileInfo(fileName); unsigned long fileLength = fileInfo.size(); emit importSize(1.0f, 1.0f, 1.0f); emit importProgress(0); - qDebug("Loading file %s...", fileName); + qDebug() << "Loading file" << qFileName << "..."; fileOk = readFromStream(fileLength, fileInputStream); @@ -1885,14 +1902,14 @@ bool Octree::readFromSVOFile(const char* fileName) { return fileOk; } -bool Octree::readFromSVOURL(const QString& urlString) { +bool Octree::readFromURL(const QString& urlString) { bool readOk = false; // determine if this is a local file or a network resource QUrl url(urlString); if (url.isLocalFile()) { - readOk = readFromSVOFile(qPrintable(url.toLocalFile())); + readOk = readFromFile(qPrintable(url.toLocalFile())); } else { QNetworkRequest request; request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); @@ -1918,6 +1935,23 @@ bool Octree::readFromSVOURL(const QString& urlString) { bool Octree::readFromStream(unsigned long streamLength, QDataStream& inputStream) { + + // decide if this is SVO or JSON + QIODevice *device = inputStream.device(); + char firstChar; + device->getChar(&firstChar); + device->ungetChar(firstChar); + + if (firstChar == (char) PacketTypeEntityData) { + return readSVOFromStream(streamLength, inputStream); + } else { + return readJSONFromStream(streamLength, inputStream); + } +} + + +bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStream) { + bool fileOk = false; PacketVersion gotVersion = 0; @@ -2045,6 +2079,61 @@ bool Octree::readFromStream(unsigned long streamLength, QDataStream& inputStream return fileOk; } +bool Octree::readJSONFromStream(unsigned long streamLength, QDataStream& inputStream) { + // QFile file; + // file.setFileName("/tmp/ok.json"); + // file.open(QIODevice::ReadOnly | QIODevice::Text); + // QString val = file.readAll(); + // file.close(); + + char rawData[streamLength]; + inputStream.readRawData(rawData, streamLength); + + // QJsonDocument d = QJsonDocument::fromJson(val.toUtf8()); + QJsonDocument d = QJsonDocument::fromJson(rawData); + QVariant v = d.toVariant(); + QVariantMap m = v.toMap(); + + readFromMap(m); + return true; +} + +void Octree::writeToFile(const char* fileName, OctreeElement* element, bool persistAsJson) { + if (persistAsJson) { + // make the sure file extension is correct. This isn't great, but it allows a user with + // an existing .svo save to migrate. + QString qFileName = withoutFileExtension(QString(fileName)) + ".json"; + QByteArray byteArray = qFileName.toUtf8(); + const char* cFileName = byteArray.constData(); + writeToJSONFile(cFileName, element); + } else { + writeToSVOFile(fileName, element); + } +} + + +void Octree::writeToJSONFile(const char* fileName, OctreeElement* element) { + QFile persistFile(fileName); + QVariantMap entityDescription; + + qDebug("Saving to file %s...", fileName); + + OctreeElement* top; + if (element) { + top = element; + } else { + top = _rootElement; + } + + bool entityDescriptionSuccess = writeToMap(entityDescription, top); + if (entityDescriptionSuccess && persistFile.open(QIODevice::WriteOnly)) { + persistFile.write(QJsonDocument::fromVariant(entityDescription).toJson()); + } else { + qCritical("Could not write to JSON description of entities."); + } +} + + void Octree::writeToSVOFile(const char* fileName, OctreeElement* element) { std::ofstream file(fileName, std::ios::out|std::ios::binary); diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 3002c42375..8ad59e8592 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -326,12 +326,20 @@ public: void loadOctreeFile(const char* fileName, bool wantColorRandomizer); // these will read/write files that match the wireformat, excluding the 'V' leading + void writeToFile(const char* filename, OctreeElement* element = NULL, bool persistAsJson = false); + void writeToJSONFile(const char* filename, OctreeElement* element = NULL); void writeToSVOFile(const char* filename, OctreeElement* element = NULL); - bool readFromSVOFile(const char* filename); - bool readFromSVOURL(const QString& url); // will support file urls as well... + virtual bool writeToMap(QVariantMap& entityDescription, OctreeElement* element) = 0; + + + bool readFromFile(const char* filename); + bool readFromURL(const QString& url); // will support file urls as well... + bool readFromStream(unsigned long streamLength, QDataStream& inputStream); - bool readFromJSONFile(const char* fileName); - virtual bool writeToMap(QVariantMap& entityDescription) { return true; } + bool readSVOFromStream(unsigned long streamLength, QDataStream& inputStream); + bool readJSONFromStream(unsigned long streamLength, QDataStream& inputStream); + + unsigned long getOctreeElementsCount(); diff --git a/libraries/octree/src/OctreeElement.h b/libraries/octree/src/OctreeElement.h index ba84900fab..40951e2e6e 100644 --- a/libraries/octree/src/OctreeElement.h +++ b/libraries/octree/src/OctreeElement.h @@ -260,8 +260,6 @@ public: int getMyChildContaining(const AABox& box) const; int getMyChildContainingPoint(const glm::vec3& point) const; - virtual bool writeToMap(QVariantMap& entityDescription) { return true; } - protected: void deleteAllChildren(); diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index 8ac75494db..dfe6e26b92 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -30,7 +30,8 @@ const int OctreePersistThread::DEFAULT_PERSIST_INTERVAL = 1000 * 30; // every 30 seconds OctreePersistThread::OctreePersistThread(Octree* tree, const QString& filename, int persistInterval, - bool wantBackup, const QJsonObject& settings, bool debugTimestampNow) : + bool wantBackup, const QJsonObject& settings, bool debugTimestampNow, + bool persistAsJson) : _tree(tree), _filename(filename), _persistInterval(persistInterval), @@ -39,7 +40,8 @@ OctreePersistThread::OctreePersistThread(Octree* tree, const QString& filename, _lastCheck(0), _wantBackup(wantBackup), _debugTimestampNow(debugTimestampNow), - _lastTimeDebug(0) + _lastTimeDebug(0), + _persistAsJson(persistAsJson) { parseSettings(settings); } @@ -141,8 +143,7 @@ bool OctreePersistThread::process() { qDebug() << "Loading Octree... lock file removed:" << lockFileName; } - // persistantFileRead = _tree->readFromSVOFile(_filename.toLocal8Bit().constData()); - persistantFileRead = _tree->readFromJSONFile(_filename.toLocal8Bit().constData()); + persistantFileRead = _tree->readFromFile(_filename.toLocal8Bit().constData()); _tree->pruneTree(); } _tree->unlock(); @@ -244,19 +245,7 @@ void OctreePersistThread::persist() { if(lockFile.is_open()) { qDebug() << "saving Octree lock file created at:" << lockFileName; - qDebug() << "saving Octree to file " << _filename << "..."; - - - QFile persistFile("/tmp/ok.json"); - QVariantMap entityDescription; - bool entityDescriptionSuccess = _tree->writeToMap(entityDescription); - if (entityDescriptionSuccess && persistFile.open(QIODevice::WriteOnly)) { - persistFile.write(QJsonDocument::fromVariant(entityDescription).toJson()); - } else { - qCritical("Could not write to JSON description of entities."); - } - - _tree->writeToSVOFile(qPrintable(_filename)); + _tree->writeToFile(qPrintable(_filename), NULL, _persistAsJson); time(&_lastPersistTime); _tree->clearDirtyBit(); // tree is clean after saving qDebug() << "DONE saving Octree to file..."; diff --git a/libraries/octree/src/OctreePersistThread.h b/libraries/octree/src/OctreePersistThread.h index 374de79f0a..21733dfbe7 100644 --- a/libraries/octree/src/OctreePersistThread.h +++ b/libraries/octree/src/OctreePersistThread.h @@ -34,8 +34,8 @@ public: static const int DEFAULT_PERSIST_INTERVAL; OctreePersistThread(Octree* tree, const QString& filename, int persistInterval = DEFAULT_PERSIST_INTERVAL, - bool wantBackup = false, const QJsonObject& settings = QJsonObject(), - bool debugTimestampNow = false); + bool wantBackup = false, const QJsonObject& settings = QJsonObject(), + bool debugTimestampNow = false, bool persistAsJson=false); bool isInitialLoadComplete() const { return _initialLoadComplete; } quint64 getLoadElapsedTime() const { return _loadTimeUSecs; } @@ -72,6 +72,8 @@ private: bool _debugTimestampNow; quint64 _lastTimeDebug; + + bool _persistAsJson; }; #endif // hifi_OctreePersistThread_h From fb93d08dd8b35f62a974a7539875fab88fc9966d Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 12 Mar 2015 09:13:29 -0700 Subject: [PATCH 07/41] change how tool window acts on linux --- interface/src/ui/ToolWindow.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/interface/src/ui/ToolWindow.cpp b/interface/src/ui/ToolWindow.cpp index 8c15d848bd..3d9735ea32 100644 --- a/interface/src/ui/ToolWindow.cpp +++ b/interface/src/ui/ToolWindow.cpp @@ -22,7 +22,9 @@ ToolWindow::ToolWindow(QWidget* parent) : _hasShown(false), _lastGeometry() { - // setDockOptions(QMainWindow::ForceTabbedDocks); +# ifndef LINUX + setDockOptions(QMainWindow::ForceTabbedDocks); +# endif Application::getInstance()->installEventFilter(this); } @@ -53,7 +55,7 @@ bool ToolWindow::event(QEvent* event) { } bool ToolWindow::eventFilter(QObject* sender, QEvent* event) { -#if 0 +# ifndef LINUX switch (event->type()) { case QEvent::WindowStateChange: if (Application::getInstance()->getWindow()->isMinimized()) { @@ -78,8 +80,8 @@ bool ToolWindow::eventFilter(QObject* sender, QEvent* event) { default: break; } -#endif return false; +# endif } void ToolWindow::onChildVisibilityUpdated(bool visible) { From ac882f86e2fd7aa9426e8ed71e18262999f27b16 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 12 Mar 2015 09:13:53 -0700 Subject: [PATCH 08/41] backup code is now aware of possible file extension differences --- libraries/entities/src/EntityTree.cpp | 26 ++++++-- libraries/octree/src/Octree.cpp | 66 ++++++++++---------- libraries/octree/src/Octree.h | 9 +++ libraries/octree/src/OctreePersistThread.cpp | 12 +++- 4 files changed, 74 insertions(+), 39 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index b2823f54ee..486cd0792d 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1040,8 +1040,21 @@ bool EntityTree::sendEntitiesOperation(OctreeElement* element, void* extraData) class ToMapOperator : public RecurseOctreeOperator { public: - ToMapOperator(QVariantMap& map) : RecurseOctreeOperator(), _map(map) {}; - bool preRecursion(OctreeElement* element) {return true;} + ToMapOperator(QVariantMap& map, OctreeElement *top) : RecurseOctreeOperator(), _map(map), _top(top) { + // if some element "top" was given, only save information for that element and it's children. + if (_top) { + _withinTop = false; + } else { + // top was NULL, export entire tree. + _withinTop = true; + } + }; + bool preRecursion(OctreeElement* element) { + if (element == _top) { + _withinTop = true; + } + return true; + } bool postRecursion(OctreeElement* element) { qDebug() << " in ToMapOperator::preRecursion"; EntityTreeElement* entityTreeElement = static_cast(element); @@ -1052,19 +1065,22 @@ public: entitiesQList << entityItem->writeToMap(); } _map["Entities"] = entitiesQList; + if (element == _top) { + _withinTop = false; + } return true; } private: QVariantMap& _map; + OctreeElement *_top; + bool _withinTop; }; bool EntityTree::writeToMap(QVariantMap& entityDescription, OctreeElement* element) { - - // XXX how can I make the RecurseOctreeOperator start with element? entityDescription["Entities"] = QVariantList(); - ToMapOperator theOperator(entityDescription); + ToMapOperator theOperator(entityDescription, element); recurseTreeWithOperator(&theOperator); return true; } diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 1adc374c70..68b1a3bc3c 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -46,6 +46,9 @@ #include "Octree.h" #include "ViewFrustum.h" + +QVector persistExtensions = {"svo", "json"}; + float boundaryDistanceForRenderLevel(unsigned int renderLevel, float voxelSizeScale) { return voxelSizeScale / powf(2, renderLevel); } @@ -1846,44 +1849,18 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, } -QString withoutFileExtension(const QString& fileName) { - return fileName.left(fileName.lastIndexOf(".")); -} - - bool Octree::readFromFile(const char* fileName) { bool fileOk = false; - // try to ease migration from svo to json or back - QString svoFileName = withoutFileExtension(QString(fileName)) + ".svo"; - QFileInfo svoFileInfo(svoFileName); - QString jsonFileName = withoutFileExtension(QString(fileName)) + ".json"; - QFileInfo jsonFileInfo(jsonFileName); - QString qFileName; - QFileInfo fileInfo; - - if (jsonFileInfo.exists() && svoFileInfo.exists()) { - if (jsonFileInfo.lastModified() >= svoFileInfo.lastModified()) { - qFileName = jsonFileName; - fileInfo = jsonFileInfo; - } else { - qFileName = svoFileName; - fileInfo = svoFileInfo; - } - } else if (jsonFileInfo.exists()) { - qFileName = jsonFileName; - fileInfo = jsonFileInfo; - } else if (svoFileInfo.exists()) { - qFileName = svoFileName; - fileInfo = svoFileInfo; - } else { - qDebug() << "failed to read Octree from nonexistant file:" << fileName; - return false; - } + QString qFileName = findMostRecentPersist(fileName); + // QByteArray byteArray = qFileName.toUtf8(); + // const char* cFileName = byteArray.constData(); QFile file(qFileName); fileOk = file.open(QIODevice::ReadOnly); + QFileInfo fileInfo(qFileName); + if(fileOk) { QDataStream fileInputStream(&file); unsigned long fileLength = fileInfo.size(); @@ -2102,7 +2079,7 @@ void Octree::writeToFile(const char* fileName, OctreeElement* element, bool pers if (persistAsJson) { // make the sure file extension is correct. This isn't great, but it allows a user with // an existing .svo save to migrate. - QString qFileName = withoutFileExtension(QString(fileName)) + ".json"; + QString qFileName = fileNameWithoutExtension(QString(fileName), persistExtensions) + ".json"; QByteArray byteArray = qFileName.toUtf8(); const char* cFileName = byteArray.constData(); writeToJSONFile(cFileName, element); @@ -2231,3 +2208,28 @@ void Octree::cancelImport() { _stopImport = true; } +QString fileNameWithoutExtension(const QString& fileName, const QVector possibleExtensions) { + foreach (const QString possibleExtension, possibleExtensions) { + if (fileName.endsWith(possibleExtension) || + fileName.endsWith(possibleExtension.toUpper()) || + fileName.endsWith(possibleExtension.toLower())) { + return fileName.left(fileName.count() - possibleExtension.count() - 1); + } + } + return fileName; +} + +QString findMostRecentPersist(const QString& originalFileName) { + QString sansExt = fileNameWithoutExtension(originalFileName, persistExtensions); + QString newestFileName = originalFileName; + QDateTime newestTime = QDateTime::fromMSecsSinceEpoch(0); + foreach (QString possibleExtension, persistExtensions) { + QString fileName = sansExt + "." + possibleExtension; + QFileInfo fileInfo(fileName); + if (fileInfo.exists() && fileInfo.lastModified() > newestTime) { + newestFileName = fileName; + newestTime = fileInfo.lastModified(); + } + } + return newestFileName; +} diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 8ad59e8592..3a39ccfb42 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -35,6 +35,9 @@ class Shape; #include #include + +extern QVector persistExtensions; + /// derive from this class to use the Octree::recurseTreeWithOperator() method class RecurseOctreeOperator { public: @@ -410,4 +413,10 @@ protected: float boundaryDistanceForRenderLevel(unsigned int renderLevel, float voxelSizeScale); + +QString fileNameWithoutExtension(const QString& fileName, const QVector possibleExtensions); + +// XXX rename this +QString findMostRecentPersist(const QString& originalFileName); + #endif // hifi_Octree_h diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index dfe6e26b92..ee6ada7050 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -44,6 +44,14 @@ OctreePersistThread::OctreePersistThread(Octree* tree, const QString& filename, _persistAsJson(persistAsJson) { parseSettings(settings); + + QString sansExt = fileNameWithoutExtension(_filename, persistExtensions); + if (_persistAsJson) { + _filename = sansExt + "." + "json"; + } else { + _filename = sansExt + "." + "svo"; + } + } void OctreePersistThread::parseSettings(const QJsonObject& settings) { @@ -347,8 +355,8 @@ void OctreePersistThread::rollOldBackupVersions(const BackupRule& rule) { QString backupExtensionNplusOne = rule.extensionFormat; backupExtensionN.replace(QString("%N"), QString::number(n)); backupExtensionNplusOne.replace(QString("%N"), QString::number(n+1)); - - QString backupFilenameN = _filename + backupExtensionN; + + QString backupFilenameN = findMostRecentPersist(_filename) + backupExtensionN; QString backupFilenameNplusOne = _filename + backupExtensionNplusOne; QFile backupFileN(backupFilenameN); From 3bc85c2531302aef41f5eafb1997b833a815841c Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 12 Mar 2015 09:34:01 -0700 Subject: [PATCH 09/41] instead of a json checkbox, a dropdown to chose the file type --- assignment-client/src/octree/OctreeServer.cpp | 12 +++---- assignment-client/src/octree/OctreeServer.h | 2 +- .../resources/describe-settings.json | 20 ++++++++--- libraries/octree/src/Octree.cpp | 36 ++++++------------- libraries/octree/src/Octree.h | 14 +++----- libraries/octree/src/OctreeElement.h | 4 --- libraries/octree/src/OctreePersistThread.cpp | 14 +++----- libraries/octree/src/OctreePersistThread.h | 4 +-- 8 files changed, 44 insertions(+), 62 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 3501fe4a6a..7cca9d3ef5 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1036,12 +1036,12 @@ void OctreeServer::readConfiguration() { strcpy(_persistFilename, qPrintable(persistFilename)); qDebug("persistFilename=%s", _persistFilename); - bool persistAsJson; - if (!readOptionBool(QString("persistAsJson"), settingsSectionObject, persistAsJson)) { - persistAsJson = false; + QString persistAsFileType; + if (!readOptionString(QString("persistAsFileType"), settingsSectionObject, persistAsFileType)) { + persistAsFileType = "svo"; } - _persistAsJson = persistAsJson; - qDebug() << "persistAsJson=" << _persistAsJson; + _persistAsFileType = persistAsFileType; + qDebug() << "persistAsFileType=" << _persistAsFileType; _persistInterval = OctreePersistThread::DEFAULT_PERSIST_INTERVAL; readOptionInt(QString("persistInterval"), settingsSectionObject, _persistInterval); @@ -1138,7 +1138,7 @@ void OctreeServer::run() { // now set up PersistThread _persistThread = new OctreePersistThread(_tree, _persistFilename, _persistInterval, - _wantBackup, _settings, _debugTimestampNow, _persistAsJson); + _wantBackup, _settings, _debugTimestampNow, _persistAsFileType); if (_persistThread) { _persistThread->initialize(true); } diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index aa7a565964..41cd3259cf 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -157,7 +157,7 @@ protected: QString _statusHost; char _persistFilename[MAX_FILENAME_LENGTH]; - bool _persistAsJson; + QString _persistAsFileType; int _packetsPerClientPerInterval; int _packetsTotalPerInterval; Octree* _tree; // this IS a reaveraging tree diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index b3940528ca..e406df6937 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -326,11 +326,21 @@ "advanced": true }, { - "name": "persistAsJson", - "type": "checkbox", - "label": "Encode persist file as JSON:", - "help": "Entity server will save entities as JSON rather than SVO", - "default": false, + "name": "persistAsFileType", + "label": "File format for entity server's persistent data", + "help": "This defines how the entity server will save entities to disk.", + "default": "svo", + "type": "select", + "options": [ + { + "value": "svo", + "label": "Entity server persists data as SVO" + }, + { + "value": "json", + "label": "Entity server persists data as JSON" + } + ] "advanced": true }, { diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 68b1a3bc3c..17c6e26b05 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -1848,21 +1848,16 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, return bytesAtThisLevel; } - bool Octree::readFromFile(const char* fileName) { bool fileOk = false; QString qFileName = findMostRecentPersist(fileName); - // QByteArray byteArray = qFileName.toUtf8(); - // const char* cFileName = byteArray.constData(); - QFile file(qFileName); fileOk = file.open(QIODevice::ReadOnly); - QFileInfo fileInfo(qFileName); - if(fileOk) { QDataStream fileInputStream(&file); + QFileInfo fileInfo(qFileName); unsigned long fileLength = fileInfo.size(); emit importSize(1.0f, 1.0f, 1.0f); @@ -2057,38 +2052,30 @@ bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStr } bool Octree::readJSONFromStream(unsigned long streamLength, QDataStream& inputStream) { - // QFile file; - // file.setFileName("/tmp/ok.json"); - // file.open(QIODevice::ReadOnly | QIODevice::Text); - // QString val = file.readAll(); - // file.close(); - char rawData[streamLength]; inputStream.readRawData(rawData, streamLength); - - // QJsonDocument d = QJsonDocument::fromJson(val.toUtf8()); QJsonDocument d = QJsonDocument::fromJson(rawData); QVariant v = d.toVariant(); QVariantMap m = v.toMap(); - readFromMap(m); return true; } -void Octree::writeToFile(const char* fileName, OctreeElement* element, bool persistAsJson) { - if (persistAsJson) { - // make the sure file extension is correct. This isn't great, but it allows a user with - // an existing .svo save to migrate. - QString qFileName = fileNameWithoutExtension(QString(fileName), persistExtensions) + ".json"; - QByteArray byteArray = qFileName.toUtf8(); - const char* cFileName = byteArray.constData(); +void Octree::writeToFile(const char* fileName, OctreeElement* element, QString persistAsFileType) { + // make the sure file extension makes sense + QString qFileName = fileNameWithoutExtension(QString(fileName), persistExtensions) + "." + persistAsFileType; + QByteArray byteArray = qFileName.toUtf8(); + const char* cFileName = byteArray.constData(); + + if (persistAsFileType == "svo") { + writeToSVOFile(fileName, element); + } else if (persistAsFileType == "json") { writeToJSONFile(cFileName, element); } else { - writeToSVOFile(fileName, element); + qDebug() << "unable to write octree to file of type" << persistAsFileType; } } - void Octree::writeToJSONFile(const char* fileName, OctreeElement* element) { QFile persistFile(fileName); QVariantMap entityDescription; @@ -2110,7 +2097,6 @@ void Octree::writeToJSONFile(const char* fileName, OctreeElement* element) { } } - void Octree::writeToSVOFile(const char* fileName, OctreeElement* element) { std::ofstream file(fileName, std::ios::out|std::ios::binary); diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 3a39ccfb42..fff6a89570 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -214,7 +214,6 @@ public: {} }; - class Octree : public QObject { Q_OBJECT public: @@ -328,21 +327,19 @@ public: // Note: this assumes the fileFormat is the HIO individual voxels code files void loadOctreeFile(const char* fileName, bool wantColorRandomizer); - // these will read/write files that match the wireformat, excluding the 'V' leading - void writeToFile(const char* filename, OctreeElement* element = NULL, bool persistAsJson = false); + // Octree exporters + 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; - + // Octree importers bool readFromFile(const char* filename); bool readFromURL(const QString& url); // will support file urls as well... - bool readFromStream(unsigned long streamLength, QDataStream& inputStream); bool readSVOFromStream(unsigned long streamLength, QDataStream& inputStream); bool readJSONFromStream(unsigned long streamLength, QDataStream& inputStream); - - + virtual bool readFromMap(QVariantMap& entityDescription) = 0; unsigned long getOctreeElementsCount(); @@ -373,9 +370,6 @@ public: virtual void dumpTree() { }; virtual void pruneTree() { }; - - virtual bool readFromMap(QVariantMap& entityDescription) = 0; - signals: void importSize(float x, float y, float z); void importProgress(int progress); diff --git a/libraries/octree/src/OctreeElement.h b/libraries/octree/src/OctreeElement.h index 40951e2e6e..e2229b2214 100644 --- a/libraries/octree/src/OctreeElement.h +++ b/libraries/octree/src/OctreeElement.h @@ -49,10 +49,6 @@ public: }; - - - - class OctreeElement { protected: diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index ee6ada7050..24db400891 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -31,7 +31,7 @@ const int OctreePersistThread::DEFAULT_PERSIST_INTERVAL = 1000 * 30; // every 30 OctreePersistThread::OctreePersistThread(Octree* tree, const QString& filename, int persistInterval, bool wantBackup, const QJsonObject& settings, bool debugTimestampNow, - bool persistAsJson) : + QString persistAsFileType) : _tree(tree), _filename(filename), _persistInterval(persistInterval), @@ -41,17 +41,13 @@ OctreePersistThread::OctreePersistThread(Octree* tree, const QString& filename, _wantBackup(wantBackup), _debugTimestampNow(debugTimestampNow), _lastTimeDebug(0), - _persistAsJson(persistAsJson) + _persistAsFileType(persistAsFileType) { parseSettings(settings); + // in case the persist filename has an extension that doesn't match the file type QString sansExt = fileNameWithoutExtension(_filename, persistExtensions); - if (_persistAsJson) { - _filename = sansExt + "." + "json"; - } else { - _filename = sansExt + "." + "svo"; - } - + _filename = sansExt + "." + _persistAsFileType; } void OctreePersistThread::parseSettings(const QJsonObject& settings) { @@ -253,7 +249,7 @@ void OctreePersistThread::persist() { if(lockFile.is_open()) { qDebug() << "saving Octree lock file created at:" << lockFileName; - _tree->writeToFile(qPrintable(_filename), NULL, _persistAsJson); + _tree->writeToFile(qPrintable(_filename), NULL, _persistAsFileType); time(&_lastPersistTime); _tree->clearDirtyBit(); // tree is clean after saving qDebug() << "DONE saving Octree to file..."; diff --git a/libraries/octree/src/OctreePersistThread.h b/libraries/octree/src/OctreePersistThread.h index 21733dfbe7..e756c13f59 100644 --- a/libraries/octree/src/OctreePersistThread.h +++ b/libraries/octree/src/OctreePersistThread.h @@ -35,7 +35,7 @@ public: OctreePersistThread(Octree* tree, const QString& filename, int persistInterval = DEFAULT_PERSIST_INTERVAL, bool wantBackup = false, const QJsonObject& settings = QJsonObject(), - bool debugTimestampNow = false, bool persistAsJson=false); + bool debugTimestampNow = false, QString persistAsFileType="svo"); bool isInitialLoadComplete() const { return _initialLoadComplete; } quint64 getLoadElapsedTime() const { return _loadTimeUSecs; } @@ -73,7 +73,7 @@ private: bool _debugTimestampNow; quint64 _lastTimeDebug; - bool _persistAsJson; + QString _persistAsFileType; }; #endif // hifi_OctreePersistThread_h From 90f6b798b1a3e8374ddc6668d746eabe20d55db6 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 12 Mar 2015 10:11:37 -0700 Subject: [PATCH 10/41] don't mess with tools window in this branch --- interface/src/ui/ToolWindow.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/interface/src/ui/ToolWindow.cpp b/interface/src/ui/ToolWindow.cpp index 3d9735ea32..cf94802f0c 100644 --- a/interface/src/ui/ToolWindow.cpp +++ b/interface/src/ui/ToolWindow.cpp @@ -22,9 +22,7 @@ ToolWindow::ToolWindow(QWidget* parent) : _hasShown(false), _lastGeometry() { -# ifndef LINUX setDockOptions(QMainWindow::ForceTabbedDocks); -# endif Application::getInstance()->installEventFilter(this); } @@ -55,7 +53,6 @@ bool ToolWindow::event(QEvent* event) { } bool ToolWindow::eventFilter(QObject* sender, QEvent* event) { -# ifndef LINUX switch (event->type()) { case QEvent::WindowStateChange: if (Application::getInstance()->getWindow()->isMinimized()) { @@ -81,7 +78,6 @@ bool ToolWindow::eventFilter(QObject* sender, QEvent* event) { break; } return false; -# endif } void ToolWindow::onChildVisibilityUpdated(bool visible) { From b431ce289cd9103685f8f0e6b43bac79302d2eec Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 12 Mar 2015 10:11:46 -0700 Subject: [PATCH 11/41] missed a comma --- domain-server/resources/describe-settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index e406df6937..9af44f6a1b 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -340,7 +340,7 @@ "value": "json", "label": "Entity server persists data as JSON" } - ] + ], "advanced": true }, { From 9e6c289ab8a51921e2d6da58c922f694ed2243f9 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 12 Mar 2015 10:23:57 -0700 Subject: [PATCH 12/41] move filename utils into shared library --- libraries/octree/src/Octree.cpp | 33 +++----------------- libraries/octree/src/Octree.h | 8 +---- libraries/octree/src/OctreePersistThread.cpp | 5 +-- libraries/shared/src/PathUtils.cpp | 30 ++++++++++++++++++ libraries/shared/src/PathUtils.h | 5 ++- 5 files changed, 42 insertions(+), 39 deletions(-) diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 17c6e26b05..dafbda4ef0 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include "CoverageMap.h" #include "OctreeConstants.h" @@ -47,7 +48,7 @@ #include "ViewFrustum.h" -QVector persistExtensions = {"svo", "json"}; +QVector PERSIST_EXTENSIONS = {"svo", "json"}; float boundaryDistanceForRenderLevel(unsigned int renderLevel, float voxelSizeScale) { return voxelSizeScale / powf(2, renderLevel); @@ -1851,7 +1852,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, bool Octree::readFromFile(const char* fileName) { bool fileOk = false; - QString qFileName = findMostRecentPersist(fileName); + QString qFileName = findMostRecentFileExtension(fileName, PERSIST_EXTENSIONS); QFile file(qFileName); fileOk = file.open(QIODevice::ReadOnly); @@ -2063,7 +2064,7 @@ bool Octree::readJSONFromStream(unsigned long streamLength, QDataStream& inputSt void Octree::writeToFile(const char* fileName, OctreeElement* element, QString persistAsFileType) { // make the sure file extension makes sense - QString qFileName = fileNameWithoutExtension(QString(fileName), persistExtensions) + "." + persistAsFileType; + QString qFileName = fileNameWithoutExtension(QString(fileName), PERSIST_EXTENSIONS) + "." + persistAsFileType; QByteArray byteArray = qFileName.toUtf8(); const char* cFileName = byteArray.constData(); @@ -2193,29 +2194,3 @@ bool Octree::countOctreeElementsOperation(OctreeElement* element, void* extraDat void Octree::cancelImport() { _stopImport = true; } - -QString fileNameWithoutExtension(const QString& fileName, const QVector possibleExtensions) { - foreach (const QString possibleExtension, possibleExtensions) { - if (fileName.endsWith(possibleExtension) || - fileName.endsWith(possibleExtension.toUpper()) || - fileName.endsWith(possibleExtension.toLower())) { - return fileName.left(fileName.count() - possibleExtension.count() - 1); - } - } - return fileName; -} - -QString findMostRecentPersist(const QString& originalFileName) { - QString sansExt = fileNameWithoutExtension(originalFileName, persistExtensions); - QString newestFileName = originalFileName; - QDateTime newestTime = QDateTime::fromMSecsSinceEpoch(0); - foreach (QString possibleExtension, persistExtensions) { - QString fileName = sansExt + "." + possibleExtension; - QFileInfo fileInfo(fileName); - if (fileInfo.exists() && fileInfo.lastModified() > newestTime) { - newestFileName = fileName; - newestTime = fileInfo.lastModified(); - } - } - return newestFileName; -} diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index fff6a89570..21c3efc01d 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -36,7 +36,7 @@ class Shape; #include -extern QVector persistExtensions; +extern QVector PERSIST_EXTENSIONS; /// derive from this class to use the Octree::recurseTreeWithOperator() method class RecurseOctreeOperator { @@ -407,10 +407,4 @@ protected: float boundaryDistanceForRenderLevel(unsigned int renderLevel, float voxelSizeScale); - -QString fileNameWithoutExtension(const QString& fileName, const QVector possibleExtensions); - -// XXX rename this -QString findMostRecentPersist(const QString& originalFileName); - #endif // hifi_Octree_h diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index 24db400891..c2645f0207 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -24,6 +24,7 @@ #include #include +#include #include "OctreePersistThread.h" @@ -46,7 +47,7 @@ OctreePersistThread::OctreePersistThread(Octree* tree, const QString& filename, parseSettings(settings); // in case the persist filename has an extension that doesn't match the file type - QString sansExt = fileNameWithoutExtension(_filename, persistExtensions); + QString sansExt = fileNameWithoutExtension(_filename, PERSIST_EXTENSIONS); _filename = sansExt + "." + _persistAsFileType; } @@ -352,7 +353,7 @@ void OctreePersistThread::rollOldBackupVersions(const BackupRule& rule) { backupExtensionN.replace(QString("%N"), QString::number(n)); backupExtensionNplusOne.replace(QString("%N"), QString::number(n+1)); - QString backupFilenameN = findMostRecentPersist(_filename) + backupExtensionN; + QString backupFilenameN = findMostRecentFileExtension(_filename, PERSIST_EXTENSIONS) + backupExtensionN; QString backupFilenameNplusOne = _filename + backupExtensionNplusOne; QFile backupFileN(backupFilenameN); diff --git a/libraries/shared/src/PathUtils.cpp b/libraries/shared/src/PathUtils.cpp index 0b99f22228..545183e8f5 100644 --- a/libraries/shared/src/PathUtils.cpp +++ b/libraries/shared/src/PathUtils.cpp @@ -11,6 +11,9 @@ #include #include +#include +#include +#include #include "PathUtils.h" @@ -23,3 +26,30 @@ QString& PathUtils::resourcesPath() { #endif return staticResourcePath; } + + +QString fileNameWithoutExtension(const QString& fileName, const QVector possibleExtensions) { + foreach (const QString possibleExtension, possibleExtensions) { + if (fileName.endsWith(possibleExtension) || + fileName.endsWith(possibleExtension.toUpper()) || + fileName.endsWith(possibleExtension.toLower())) { + return fileName.left(fileName.count() - possibleExtension.count() - 1); + } + } + return fileName; +} + +QString findMostRecentFileExtension(const QString& originalFileName, QVector possibleExtensions) { + QString sansExt = fileNameWithoutExtension(originalFileName, possibleExtensions); + QString newestFileName = originalFileName; + QDateTime newestTime = QDateTime::fromMSecsSinceEpoch(0); + foreach (QString possibleExtension, possibleExtensions) { + QString fileName = sansExt + "." + possibleExtension; + QFileInfo fileInfo(fileName); + if (fileInfo.exists() && fileInfo.lastModified() > newestTime) { + newestFileName = fileName; + newestTime = fileInfo.lastModified(); + } + } + return newestFileName; +} diff --git a/libraries/shared/src/PathUtils.h b/libraries/shared/src/PathUtils.h index 71cabc727d..6b6893574b 100644 --- a/libraries/shared/src/PathUtils.h +++ b/libraries/shared/src/PathUtils.h @@ -19,4 +19,7 @@ namespace PathUtils { QString& resourcesPath(); } -#endif // hifi_PathUtils_h \ No newline at end of file +QString fileNameWithoutExtension(const QString& fileName, const QVector possibleExtensions); +QString findMostRecentFileExtension(const QString& originalFileName, QVector possibleExtensions); + +#endif // hifi_PathUtils_h From 4aa7b0eb0f8006d11d80d2df91eb271ce8151159 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 12 Mar 2015 11:19:47 -0700 Subject: [PATCH 13/41] provide defaults for anything entity properties read from a map --- interface/src/ui/ToolWindow.cpp | 1 + libraries/entities/src/BoxEntityItem.cpp | 2 +- libraries/entities/src/EntityItem.cpp | 6 +-- .../src/EntityItemPropertiesDefaults.h | 1 + libraries/entities/src/EntityTree.cpp | 53 +++++++++++-------- libraries/entities/src/LightEntityItem.cpp | 8 +-- libraries/entities/src/ModelEntityItem.cpp | 19 ++++--- .../entities/src/ParticleEffectEntityItem.cpp | 27 +++++----- libraries/entities/src/SphereEntityItem.cpp | 2 +- libraries/entities/src/TextEntityItem.cpp | 9 ++-- 10 files changed, 66 insertions(+), 62 deletions(-) diff --git a/interface/src/ui/ToolWindow.cpp b/interface/src/ui/ToolWindow.cpp index cf94802f0c..8774bffc36 100644 --- a/interface/src/ui/ToolWindow.cpp +++ b/interface/src/ui/ToolWindow.cpp @@ -77,6 +77,7 @@ bool ToolWindow::eventFilter(QObject* sender, QEvent* event) { default: break; } + return false; } diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 881e9b6169..2291cda350 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -115,5 +115,5 @@ void BoxEntityItem::writeSubTypeToMap(QVariantMap& map) { void BoxEntityItem::readFromMap(QVariantMap& map) { - qListtoRgbColor(map["color"], _color); + qListtoRgbColor(map.value("color", QVariantList() << 255 << 255 << 255), _color); } diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 18cd095fea..674e4b99a2 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1148,9 +1148,6 @@ QVariantMap EntityItem::writeToMap() { result["created"] = _created; result["last-edited"] = getLastEdited(); result["last-updated"] = _lastUpdated; - // result["animation-update-delta"] = getLastUpdated() <= getLastEdited() ? 0 : getLastUpdated() - getLastEdited(); - // result["simulation-update-delta"] = getLastSimulated() <= getLastEdited() ? 0 : getLastSimulated() - getLastEdited(); - result["position"] = glmToQList(getPosition()); result["dimensions"] = glmToQList(getDimensions()); result["rotation"] = glmToQList(getRotation()); @@ -1167,10 +1164,9 @@ QVariantMap EntityItem::writeToMap() { result["ignore-for-collisions"] = getIgnoreForCollisions(); result["collisions-will-move"] = getCollisionsWillMove(); result["locked"] = getLocked(); - result["userData"] = getUserData(); + result["user-data"] = getUserData(); result["glow-level"] = getGlowLevel(); - writeSubTypeToMap(result); return result; } diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index b184d510b3..ec23a96f3e 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -33,6 +33,7 @@ const glm::vec3 ENTITY_ITEM_DEFAULT_REGISTRATION_POINT = glm::vec3(0.5f, 0.5f, 0 const float ENTITY_ITEM_IMMORTAL_LIFETIME = -1.0f; /// special lifetime which means the entity lives for ever const float ENTITY_ITEM_DEFAULT_LIFETIME = ENTITY_ITEM_IMMORTAL_LIFETIME; +const glm::vec3 ENTITY_ITEM_DEFAULT_POSITION = glm::vec3(100); const glm::quat ENTITY_ITEM_DEFAULT_ROTATION; const float ENTITY_ITEM_DEFAULT_WIDTH = 0.1f; const glm::vec3 ENTITY_ITEM_DEFAULT_DIMENSIONS = glm::vec3(ENTITY_ITEM_DEFAULT_WIDTH); diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 486cd0792d..2a8b28ab4b 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -10,6 +10,7 @@ // #include +#include #include "EntityTree.h" #include "EntitySimulation.h" @@ -1105,32 +1106,40 @@ bool EntityTree::readFromMap(QVariantMap& map) { entityItemID = EntityItemID(QUuid::createUuid()); } - properties.setCreated(entityMap["created"].toULongLong()); - QString typeString = entityMap["type"].toString(); + if (!entityMap.contains("type")) { + // forget it. + return false; + } + + QString typeString = entityMap.value("type").toString(); QByteArray typeByteArray = typeString.toLocal8Bit(); const char *typeCString = typeByteArray.data(); - properties.setType(EntityTypes::getEntityTypeFromName(typeCString)); - properties.setPosition(qListToGlmVec3(entityMap["position"])); - properties.setDimensions(qListToGlmVec3(entityMap["dimensions"])); - properties.setRotation(qListToGlmQuat(entityMap["rotation"])); - properties.setDensity(entityMap["density"].toFloat()); - properties.setVelocity(qListToGlmVec3(entityMap["angular-velocity"])); - properties.setGravity(qListToGlmVec3(entityMap["gravity"])); - properties.setDamping(entityMap["damping"].toFloat()); - properties.setLifetime(entityMap["lifetime"].toFloat()); - properties.setScript(entityMap["script"].toString()); - properties.setRegistrationPoint(qListToGlmVec3(entityMap["registration-point"])); - properties.setAngularVelocity(qListToGlmVec3(entityMap["angular-velocity"])); - properties.setAngularDamping(entityMap["angular-damping"].toFloat()); - properties.setGlowLevel(entityMap["glow"].toFloat()); - properties.setLocalRenderAlpha(entityMap["alpha"].toFloat()); - properties.setVisible(entityMap["visible"].toBool()); - properties.setIgnoreForCollisions(entityMap["ignore-for-collisions"].toBool()); - properties.setCollisionsWillMove(entityMap["collisions-will-move"].toBool()); - properties.setLocked(entityMap["locked"].toBool()); - properties.setUserData(entityMap["userData"].toString()); + properties.setCreated(entityMap.value("created", usecTimestampNow()).toULongLong()); + properties.setPosition(qListToGlmVec3(entityMap.value("position", glmToQList(ENTITY_ITEM_DEFAULT_POSITION)))); + properties.setDimensions(qListToGlmVec3(entityMap.value("dimensions", glmToQList(ENTITY_ITEM_DEFAULT_DIMENSIONS)))); + properties.setRotation(qListToGlmQuat(entityMap.value("rotation", glmToQList(ENTITY_ITEM_DEFAULT_ROTATION)))); + properties.setDensity(entityMap.value("density", 1.0).toFloat()); + properties.setVelocity(qListToGlmVec3(entityMap.value("velocity", glmToQList(ENTITY_ITEM_DEFAULT_VELOCITY)))); + properties.setGravity(qListToGlmVec3(entityMap.value("gravity", glmToQList(ENTITY_ITEM_DEFAULT_GRAVITY)))); + properties.setDamping(entityMap.value("damping", ENTITY_ITEM_DEFAULT_DAMPING).toFloat()); + properties.setLifetime(entityMap.value("lifetime", ENTITY_ITEM_DEFAULT_LIFETIME).toFloat()); + properties.setScript(entityMap.value("script", ENTITY_ITEM_DEFAULT_SCRIPT).toString()); + properties.setRegistrationPoint(qListToGlmVec3(entityMap.value("registration-point", + glmToQList(ENTITY_ITEM_DEFAULT_REGISTRATION_POINT)))); + properties.setAngularVelocity(qListToGlmVec3(entityMap.value("angular-velocity", + glmToQList(ENTITY_ITEM_DEFAULT_ANGULAR_VELOCITY)))); + properties.setAngularDamping(entityMap.value("angular-damping", ENTITY_ITEM_DEFAULT_ANGULAR_DAMPING).toFloat()); + properties.setGlowLevel(entityMap.value("glow", ENTITY_ITEM_DEFAULT_GLOW_LEVEL).toFloat()); + properties.setLocalRenderAlpha(entityMap.value("alpha", ENTITY_ITEM_DEFAULT_LOCAL_RENDER_ALPHA).toFloat()); + properties.setVisible(entityMap.value("visible", ENTITY_ITEM_DEFAULT_VISIBLE).toBool()); + properties.setIgnoreForCollisions(entityMap.value("ignore-for-collisions", + ENTITY_ITEM_DEFAULT_IGNORE_FOR_COLLISIONS).toBool()); + properties.setCollisionsWillMove(entityMap.value("collisions-will-move", + ENTITY_ITEM_DEFAULT_COLLISIONS_WILL_MOVE).toBool()); + properties.setLocked(entityMap.value("locked", ENTITY_ITEM_DEFAULT_LOCKED).toBool()); + properties.setUserData(entityMap.value("user-data", ENTITY_ITEM_DEFAULT_USER_DATA).toString()); EntityItem* entity = addEntity(entityItemID, properties); diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index f85aea12d5..0812066918 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -161,8 +161,8 @@ void LightEntityItem::writeSubTypeToMap(QVariantMap& map) { } void LightEntityItem::readFromMap(QVariantMap& map) { - qListtoRgbColor(map["color"], _color); - _intensity = map["intensity"].toFloat(); - _exponent = map["exponent"].toFloat(); - _cutoff = map["cutoff"].toFloat(); + qListtoRgbColor(map.value("color", QVariantList() << 255 << 255 << 255), _color); + _intensity = map.value("intensity", 1.0f).toFloat(); + _exponent = map.value("exponent", 0.0f).toFloat(); + _cutoff = map.value("cutoff", PI).toFloat(); } diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 32a83c4af4..2334cca8e4 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -428,14 +428,13 @@ void ModelEntityItem::writeSubTypeToMap(QVariantMap& map) { void ModelEntityItem::readFromMap(QVariantMap& map) { - qListtoRgbColor(map["color"], _color); - - _modelURL = map["model-url"].toString(); - _animationURL = map["animation-url"].toString(); - setAnimationFPS(map["animation-fps"].toFloat()); - setAnimationFrameIndex(map["animation-frame-index"].toFloat()); - setAnimationIsPlaying(map["animation-is-playing"].toBool()); - _textures = map["textures"].toString(); - setAnimationSettings(map["animation-settings"].toString()); - _shapeType = (ShapeType)(map["shape-type"].toInt()); + qListtoRgbColor(map.value("color", QVariantList() << 255 << 255 << 255), _color); + _modelURL = map.value("model-url", "").toString(); + _animationURL = map.value("animation-url", "").toString(); + setAnimationFPS(map.value("animation-fps", 0.0f).toFloat()); + setAnimationFrameIndex(map.value("animation-frame-index", 0.0f).toFloat()); + setAnimationIsPlaying(map.value("animation-is-playing", false).toBool()); + _textures = map.value("textures", "").toString(); + setAnimationSettings(map.value("animation-settings", "").toString()); + _shapeType = (ShapeType)(map.value("shape-type", SHAPE_TYPE_NONE).toInt()); } diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 8932f99fb8..8155b13665 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -523,24 +523,23 @@ void ParticleEffectEntityItem::writeSubTypeToMap(QVariantMap& map) { map["local-gravity"] = _localGravity; map["particle-radius"] = _particleRadius; map["last-animatged"] = _lastAnimated; - // XXX animation-loop + map["animation-last"] = getAnimationLoop(); map["animation-settings"] = _animationSettings; map["shape-type"] = _shapeType; } void ParticleEffectEntityItem::readFromMap(QVariantMap& map) { - qListtoRgbColor(map["color"], _color); - - _maxParticles = map["max-particles"].toFloat(); - _lifespan = map["lifespan"].toFloat(); - _emitRate = map["emit-rate"].toFloat(); - _emitDirection = qListToGlmVec3(map["emit-direction"]); - _emitStrength = map["emit-strength"].toFloat(); - _localGravity = map["local-gravity"].toFloat(); - _particleRadius = map["particle-radius"].toFloat(); - _lastAnimated = map["last-animated"].toULongLong(); - // XXX animation-loop - _animationSettings = map["animation-settings"].toString(); - _shapeType = (ShapeType)(map["shape-type"].toInt()); + qListtoRgbColor(map.value("color", QVariantList() << 255 << 255 << 255), _color); + _maxParticles = map.value("max-particles", DEFAULT_MAX_PARTICLES).toFloat(); + _lifespan = map.value("lifespan", DEFAULT_LIFESPAN).toFloat(); + _emitRate = map.value("emit-rate", DEFAULT_EMIT_RATE).toFloat(); + _emitDirection = qListToGlmVec3(map.value("emit-direction", glmToQList(DEFAULT_EMIT_DIRECTION))); + _emitStrength = map.value("emit-strength", DEFAULT_EMIT_STRENGTH).toFloat(); + _localGravity = map.value("local-gravity", DEFAULT_LOCAL_GRAVITY).toFloat(); + _particleRadius = map.value("particle-radius", DEFAULT_PARTICLE_RADIUS).toFloat(); + _lastAnimated = map.value("last-animated", usecTimestampNow()).toULongLong(); + setAnimationLoop (map.value("animation-loop", true).toBool()); + _animationSettings = map.value("animation-settings", "").toString(); + _shapeType = (ShapeType)(map.value("shape-type", SHAPE_TYPE_NONE).toInt()); } diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index d954156bff..67bc19b910 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -136,5 +136,5 @@ void SphereEntityItem::writeSubTypeToMap(QVariantMap& map) { void SphereEntityItem::readFromMap(QVariantMap& map) { - qListtoRgbColor(map["color"], _color); + qListtoRgbColor(map.value("color", QVariantList() << 255 << 255 << 255), _color); } diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index 21194284ee..bdda92be9e 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -180,10 +180,9 @@ void TextEntityItem::writeSubTypeToMap(QVariantMap& map) { map["background-color"] = rgbColorToQList(_backgroundColor); } - void TextEntityItem::readFromMap(QVariantMap& map) { - _text = map["text"].toString(); - _lineHeight = map["line-height"].toFloat(); - qListtoRgbColor(map["text-color"], _textColor); - qListtoRgbColor(map["background-color"], _backgroundColor); + _text = map.value("text", "").toString(); + _lineHeight = map.value("line-height", TextEntityItem::DEFAULT_LINE_HEIGHT).toFloat(); + qListtoRgbColor(map.value("text-color", QVariantList() << 255 << 255 << 255), _textColor); + qListtoRgbColor(map.value("background-color", QVariantList() << 0 << 0 << 0), _backgroundColor); } From e66ac7f982c28c5e6822895d38c98a3c440d1005 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 12 Mar 2015 11:29:47 -0700 Subject: [PATCH 14/41] formatting --- libraries/entities/src/EntityTree.cpp | 7 +------ libraries/entities/src/EntityTreeElement.cpp | 1 + 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 2a8b28ab4b..8a72a4e969 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -452,7 +452,7 @@ bool EntityTree::findNearPointOperation(OctreeElement* element, void* extraData) return true; // keep searching in case children have closer entities } - // if this element doesn't contain the point, then none of it's children can contain the point, so stop searching + // if this element doesn't contain the point, then none of its children can contain the point, so stop searching return false; } @@ -1088,12 +1088,7 @@ bool EntityTree::writeToMap(QVariantMap& entityDescription, OctreeElement* eleme bool EntityTree::readFromMap(QVariantMap& map) { - QVariantList entitiesQList = map["Entities"].toList(); - - qDebug() << "\n\n\nEntityTree::readFromMap --" << entitiesQList.count(); - - foreach (QVariant entityQ, entitiesQList) { QVariantMap entityMap = entityQ.toMap(); diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index c7fc405c6e..543ccc875f 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -836,3 +836,4 @@ void EntityTreeElement::debugDump() { qDebug() << " NO entities!"; } } + From 6903904267de5f7ca80f3f344d4a7df0b350569c Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 12 Mar 2015 11:31:57 -0700 Subject: [PATCH 15/41] formatting --- libraries/entities/src/EntityTreeElement.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 543ccc875f..223a4eb478 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -836,4 +836,4 @@ void EntityTreeElement::debugDump() { qDebug() << " NO entities!"; } } - + From c9eacd2197dae17f9076375383b7b133c55e69e3 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 12 Mar 2015 11:37:53 -0700 Subject: [PATCH 16/41] remove unneeded debug print --- libraries/entities/src/EntityTree.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 8a72a4e969..9cbd1ce070 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1057,7 +1057,6 @@ public: return true; } bool postRecursion(OctreeElement* element) { - qDebug() << " in ToMapOperator::preRecursion"; EntityTreeElement* entityTreeElement = static_cast(element); const QList& entities = entityTreeElement->getEntities(); // XXX is this causing a lot of copying? From 08c95555dd281449bbbca4eaa60940b20c9e37fd Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 14 Mar 2015 09:47:47 -0700 Subject: [PATCH 17/41] Calculate head height based on model mesh rather than joints This fixes the problem of some head models having display names rendering through them. --- interface/src/avatar/Avatar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 75d77b780a..ad5dda9f18 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -1013,7 +1013,7 @@ float Avatar::getSkeletonHeight() const { } float Avatar::getHeadHeight() const { - Extents extents = getHead()->getFaceModel().getBindExtents(); + Extents extents = getHead()->getFaceModel().getMeshExtents(); if (!extents.isEmpty()) { return extents.maximum.y - extents.minimum.y; } From c5010c4d5541b93c73e8147582c7186ca7a290a2 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 16 Mar 2015 14:19:24 +0100 Subject: [PATCH 18/41] Hide cursor at MainWindow level when in VRMode --- interface/src/Application.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0c27ecb7de..d674c5dcc9 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2138,9 +2138,9 @@ void Application::updateCursor(float deltaTime) { void Application::updateCursorVisibility() { if (!_cursorVisible || Menu::getInstance()->isOptionChecked(MenuOption::EnableVRMode)) { - _glWidget->setCursor(Qt::BlankCursor); + _window->setCursor(Qt::BlankCursor); } else { - _glWidget->unsetCursor(); + _window->unsetCursor(); } } From 32c79f617272b498510ce810808e997e31e2fdd4 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 16 Mar 2015 09:17:32 -0700 Subject: [PATCH 19/41] bounce json's QVariants through QScripts before making them into properties, in order to take advantage of existing conversion code --- libraries/entities/src/BoxEntityItem.cpp | 8 +- libraries/entities/src/BoxEntityItem.h | 2 +- libraries/entities/src/EntityItem.cpp | 31 ------ libraries/entities/src/EntityItem.h | 3 +- .../entities/src/EntityScriptingInterface.cpp | 38 ++++++++ .../entities/src/EntityScriptingInterface.h | 1 + libraries/entities/src/EntityTree.cpp | 94 +++++++++---------- libraries/entities/src/LightEntityItem.cpp | 14 +-- libraries/entities/src/LightEntityItem.h | 2 +- libraries/entities/src/ModelEntityItem.cpp | 24 ++--- libraries/entities/src/ModelEntityItem.h | 2 +- .../entities/src/ParticleEffectEntityItem.cpp | 30 +++--- .../entities/src/ParticleEffectEntityItem.h | 2 +- libraries/entities/src/SphereEntityItem.cpp | 8 +- libraries/entities/src/SphereEntityItem.h | 2 +- libraries/entities/src/TextEntityItem.cpp | 14 +-- libraries/entities/src/TextEntityItem.h | 2 +- 17 files changed, 140 insertions(+), 137 deletions(-) diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 2291cda350..0e795ecb27 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -108,10 +108,10 @@ void BoxEntityItem::debugDump() const { -void BoxEntityItem::writeSubTypeToMap(QVariantMap& map) { - map["type"] = QString("Box"); - map["color"] = rgbColorToQList(_color); -} +// void BoxEntityItem::writeSubTypeToMap(QVariantMap& map) { +// map["type"] = QString("Box"); +// map["color"] = rgbColorToQList(_color); +// } void BoxEntityItem::readFromMap(QVariantMap& map) { diff --git a/libraries/entities/src/BoxEntityItem.h b/libraries/entities/src/BoxEntityItem.h index 4fd3b718c5..a73d80f849 100644 --- a/libraries/entities/src/BoxEntityItem.h +++ b/libraries/entities/src/BoxEntityItem.h @@ -55,7 +55,7 @@ public: virtual void debugDump() const; - void writeSubTypeToMap(QVariantMap& map); + // void writeSubTypeToMap(QVariantMap& map); void readFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 674e4b99a2..b7713d08c8 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1139,34 +1139,3 @@ void EntityItem::updateLifetime(float value) { _dirtyFlags |= EntityItem::DIRTY_LIFETIME; } } - -QVariantMap EntityItem::writeToMap() { - QVariantMap result; - result["id"] = getID().toString(); - result["type"] = _type; - - result["created"] = _created; - result["last-edited"] = getLastEdited(); - result["last-updated"] = _lastUpdated; - result["position"] = glmToQList(getPosition()); - result["dimensions"] = glmToQList(getDimensions()); - result["rotation"] = glmToQList(getRotation()); - result["density"] = getDensity(); - result["velocity"] = glmToQList(getVelocity()); - result["gravity"] = glmToQList(getGravity()); - result["damping"] = getDamping(); - result["lifetime"] = getLifetime(); - result["script"] = getScript(); - result["registration-point"] = glmToQList(getRegistrationPoint()); - result["angular-velocity"] = glmToQList(getAngularVelocity()); - result["angular-damping"] = getAngularDamping(); - result["visible"] = getVisible(); - result["ignore-for-collisions"] = getIgnoreForCollisions(); - result["collisions-will-move"] = getCollisionsWillMove(); - result["locked"] = getLocked(); - result["user-data"] = getUserData(); - result["glow-level"] = getGlowLevel(); - - writeSubTypeToMap(result); - return result; -} diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 0f9d1358db..6fadcacd11 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -295,8 +295,7 @@ public: static void setSendPhysicsUpdates(bool value) { _sendPhysicsUpdates = value; } static bool getSendPhysicsUpdates() { return _sendPhysicsUpdates; } - QVariantMap writeToMap(); - virtual void writeSubTypeToMap(QVariantMap& map) = 0; + // virtual void writeSubTypeToMap(QVariantMap& map) = 0; virtual void readFromMap(QVariantMap& map) = 0; diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 639798527a..32d6f6bb02 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -369,3 +369,41 @@ void RayToEntityIntersectionResultFromScriptValue(const QScriptValue& object, Ra vec3FromScriptValue(intersection, value.intersection); } } + + +// XXX why can't I find a call that does this? +QScriptValue variantMapToQScriptValue(QVariantMap& variantMap, QScriptEngine& scriptEngine) { + QScriptValue scriptValue = scriptEngine.newObject(); + + for (QVariantMap::const_iterator iter = variantMap.begin(); iter != variantMap.end(); ++iter) { + QString key = iter.key(); + QVariant qValue = iter.value(); + + qDebug() << key << "=" << qValue; + + switch(qValue.type()) { + case QVariant::Bool: + scriptValue.setProperty(key, qValue.toBool()); + break; + case QVariant::Int: + scriptValue.setProperty(key, qValue.toInt()); + break; + case QVariant::Double: + scriptValue.setProperty(key, qValue.toDouble()); + break; + case QVariant::String: { + scriptValue.setProperty(key, scriptEngine.newVariant(qValue)); + break; + } + case QVariant::Map: { + QVariantMap childMap = qValue.toMap(); + scriptValue.setProperty(key, variantMapToQScriptValue(childMap, scriptEngine)); + break; + } + default: + qDebug() << "unhandled QScript type" << qValue.type(); + } + } + + return scriptValue; +} diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 9300149a98..6af0828bd7 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -46,6 +46,7 @@ Q_DECLARE_METATYPE(RayToEntityIntersectionResult) QScriptValue RayToEntityIntersectionResultToScriptValue(QScriptEngine* engine, const RayToEntityIntersectionResult& results); void RayToEntityIntersectionResultFromScriptValue(const QScriptValue& object, RayToEntityIntersectionResult& results); +QScriptValue variantMapToQScriptValue(QVariantMap& variantMap, QScriptEngine& scriptEngine); /// handles scripting of Entity commands from JS passed to assigned clients diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index aee34e12c7..4d23734a71 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -11,9 +11,11 @@ #include #include +#include #include "EntityTree.h" #include "EntitySimulation.h" +#include "EntityScriptingInterface.h" #include "AddEntityOperator.h" #include "MovingEntitiesOperator.h" @@ -1043,7 +1045,12 @@ bool EntityTree::sendEntitiesOperation(OctreeElement* element, void* extraData) class ToMapOperator : public RecurseOctreeOperator { public: - ToMapOperator(QVariantMap& map, OctreeElement *top) : RecurseOctreeOperator(), _map(map), _top(top) { + ToMapOperator(QVariantMap& map, OctreeElement *top, QScriptEngine *engine) : + RecurseOctreeOperator(), + _map(map), + _top(top), + _engine(engine) + { // if some element "top" was given, only save information for that element and it's children. if (_top) { _withinTop = false; @@ -1059,12 +1066,31 @@ public: return true; } bool postRecursion(OctreeElement* element) { + EntityTreeElement* entityTreeElement = static_cast(element); const QList& entities = entityTreeElement->getEntities(); - // XXX is this causing a lot of copying? + QVariantList entitiesQList = qvariant_cast(_map["Entities"]); + foreach (EntityItem* entityItem, entities) { - entitiesQList << entityItem->writeToMap(); + EntityItemProperties properties = entityItem->getProperties(); + + // XXX this is copied out of EntityScriptingInterface::getEntityProperties + // is it needed here? + + // if (entityItem->getType() == EntityTypes::Model) { + // const FBXGeometry* geometry = getGeometryForEntity(entityItem); + // if (geometry) { + // properties.setSittingPoints(geometry->sittingPoints); + // Extents meshExtents = geometry->getUnscaledMeshExtents(); + // properties.setNaturalDimensions(meshExtents.maximum - meshExtents.minimum); + // } + // } + + QScriptValue qScriptValues = + EntityItemPropertiesToScriptValue(_engine, properties); + + entitiesQList << qScriptValues.toVariant(); } _map["Entities"] = entitiesQList; if (element == _top) { @@ -1075,25 +1101,32 @@ public: private: QVariantMap& _map; OctreeElement *_top; + QScriptEngine *_engine; bool _withinTop; }; - - bool EntityTree::writeToMap(QVariantMap& entityDescription, OctreeElement* element) { entityDescription["Entities"] = QVariantList(); - ToMapOperator theOperator(entityDescription, element); + QScriptEngine scriptEngine; + ToMapOperator theOperator(entityDescription, element, &scriptEngine); recurseTreeWithOperator(&theOperator); return true; } - bool EntityTree::readFromMap(QVariantMap& map) { + // map will have a top-level list keyed as "Entities". This will be extracted + // and iterated over. Each member of this list is converted to a QVariantMap, then + // to a QScriptValue, and then to EntityItemProperties. These properties are used + // to add the new entity to the EnitytTree. QVariantList entitiesQList = map["Entities"].toList(); - foreach (QVariant entityQ, entitiesQList) { - QVariantMap entityMap = entityQ.toMap(); + QScriptEngine scriptEngine; + foreach (QVariant entityVariant, entitiesQList) { + // QVariantMap --> QScriptValue --> EntityItemProperties --> Entity + QVariantMap entityMap = entityVariant.toMap(); + QScriptValue entityScriptValue = variantMapToQScriptValue(entityMap, scriptEngine); EntityItemProperties properties; + EntityItemPropertiesFromScriptValue(entityScriptValue, properties); EntityItemID entityItemID; if (entityMap.contains("id")) { @@ -1102,48 +1135,11 @@ bool EntityTree::readFromMap(QVariantMap& map) { entityItemID = EntityItemID(QUuid::createUuid()); } - if (!entityMap.contains("type")) { - // forget it. - return false; - } - - QString typeString = entityMap.value("type").toString(); - QByteArray typeByteArray = typeString.toLocal8Bit(); - const char *typeCString = typeByteArray.data(); - properties.setType(EntityTypes::getEntityTypeFromName(typeCString)); - - properties.setCreated(entityMap.value("created", usecTimestampNow()).toULongLong()); - properties.setPosition(qListToGlmVec3(entityMap.value("position", glmToQList(ENTITY_ITEM_DEFAULT_POSITION)))); - properties.setDimensions(qListToGlmVec3(entityMap.value("dimensions", glmToQList(ENTITY_ITEM_DEFAULT_DIMENSIONS)))); - properties.setRotation(qListToGlmQuat(entityMap.value("rotation", glmToQList(ENTITY_ITEM_DEFAULT_ROTATION)))); - properties.setDensity(entityMap.value("density", 1.0).toFloat()); - properties.setVelocity(qListToGlmVec3(entityMap.value("velocity", glmToQList(ENTITY_ITEM_DEFAULT_VELOCITY)))); - properties.setGravity(qListToGlmVec3(entityMap.value("gravity", glmToQList(ENTITY_ITEM_DEFAULT_GRAVITY)))); - properties.setDamping(entityMap.value("damping", ENTITY_ITEM_DEFAULT_DAMPING).toFloat()); - properties.setLifetime(entityMap.value("lifetime", ENTITY_ITEM_DEFAULT_LIFETIME).toFloat()); - properties.setScript(entityMap.value("script", ENTITY_ITEM_DEFAULT_SCRIPT).toString()); - properties.setRegistrationPoint(qListToGlmVec3(entityMap.value("registration-point", - glmToQList(ENTITY_ITEM_DEFAULT_REGISTRATION_POINT)))); - properties.setAngularVelocity(qListToGlmVec3(entityMap.value("angular-velocity", - glmToQList(ENTITY_ITEM_DEFAULT_ANGULAR_VELOCITY)))); - properties.setAngularDamping(entityMap.value("angular-damping", ENTITY_ITEM_DEFAULT_ANGULAR_DAMPING).toFloat()); - properties.setGlowLevel(entityMap.value("glow", ENTITY_ITEM_DEFAULT_GLOW_LEVEL).toFloat()); - properties.setLocalRenderAlpha(entityMap.value("alpha", ENTITY_ITEM_DEFAULT_LOCAL_RENDER_ALPHA).toFloat()); - properties.setVisible(entityMap.value("visible", ENTITY_ITEM_DEFAULT_VISIBLE).toBool()); - properties.setIgnoreForCollisions(entityMap.value("ignore-for-collisions", - ENTITY_ITEM_DEFAULT_IGNORE_FOR_COLLISIONS).toBool()); - properties.setCollisionsWillMove(entityMap.value("collisions-will-move", - ENTITY_ITEM_DEFAULT_COLLISIONS_WILL_MOVE).toBool()); - properties.setLocked(entityMap.value("locked", ENTITY_ITEM_DEFAULT_LOCKED).toBool()); - properties.setUserData(entityMap.value("user-data", ENTITY_ITEM_DEFAULT_USER_DATA).toString()); - EntityItem* entity = addEntity(entityItemID, properties); - - entity->readFromMap(entityMap); + if (!entity) { + qDebug() << "adding Entity failed:" << entityItemID << entity->getType(); + } } - - - return true; } diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index 4568949f0e..8e1d0a9794 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -151,13 +151,13 @@ void LightEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit APPEND_ENTITY_PROPERTY(PROP_CUTOFF, appendValue, getCutoff()); } -void LightEntityItem::writeSubTypeToMap(QVariantMap& map) { - map["type"] = QString("Light"); - map["color"] = rgbColorToQList(_color); - map["intensity"] = _intensity; - map["exponent"] = _exponent; - map["cutoff"] = _cutoff; -} +// void LightEntityItem::writeSubTypeToMap(QVariantMap& map) { +// map["type"] = QString("Light"); +// map["color"] = rgbColorToQList(_color); +// map["intensity"] = _intensity; +// map["exponent"] = _exponent; +// map["cutoff"] = _cutoff; +// } void LightEntityItem::readFromMap(QVariantMap& map) { qListtoRgbColor(map.value("color", QVariantList() << 255 << 255 << 255), _color); diff --git a/libraries/entities/src/LightEntityItem.h b/libraries/entities/src/LightEntityItem.h index 8e3c89e917..068cb24069 100644 --- a/libraries/entities/src/LightEntityItem.h +++ b/libraries/entities/src/LightEntityItem.h @@ -70,7 +70,7 @@ public: static bool getLightsArePickable() { return _lightsArePickable; } static void setLightsArePickable(bool value) { _lightsArePickable = value; } - void writeSubTypeToMap(QVariantMap& map); + // void writeSubTypeToMap(QVariantMap& map); void readFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 2334cca8e4..d585bbf58c 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -413,18 +413,18 @@ QString ModelEntityItem::getAnimationSettings() const { return jsonByteString; } -void ModelEntityItem::writeSubTypeToMap(QVariantMap& map) { - map["type"] = QString("Model"); - map["color"] = rgbColorToQList(_color); - map["model-url"] = _modelURL; - map["animation-url"] = _animationURL; - map["animation-fps"] = getAnimationFPS(); - map["animation-frame-index"] = getAnimationFrameIndex(); - map["animation-is-playing"] = getAnimationIsPlaying(); - map["textures"] = _textures; - map["animation-settings"] = getAnimationSettings(); - map["shape-type"] = _shapeType; -} +// void ModelEntityItem::writeSubTypeToMap(QVariantMap& map) { +// map["type"] = QString("Model"); +// map["color"] = rgbColorToQList(_color); +// map["model-url"] = _modelURL; +// map["animation-url"] = _animationURL; +// map["animation-fps"] = getAnimationFPS(); +// map["animation-frame-index"] = getAnimationFrameIndex(); +// map["animation-is-playing"] = getAnimationIsPlaying(); +// map["textures"] = _textures; +// map["animation-settings"] = getAnimationSettings(); +// map["shape-type"] = _shapeType; +// } void ModelEntityItem::readFromMap(QVariantMap& map) { diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index 528469b715..6a5636e5e4 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -120,7 +120,7 @@ public: static void cleanupLoadedAnimations(); - void writeSubTypeToMap(QVariantMap& map); + // void writeSubTypeToMap(QVariantMap& map); void readFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 8155b13665..b1c0b7aa17 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -512,21 +512,21 @@ void ParticleEffectEntityItem::resetSimulation() { } -void ParticleEffectEntityItem::writeSubTypeToMap(QVariantMap& map) { - map["type"] = QString("Box"); - map["color"] = rgbColorToQList(_color); - map["max-particles"] = _maxParticles; - map["lifespan"] = _lifespan; - map["emit-rate"] = _emitRate; - map["emit-direction"] = glmToQList(_emitDirection); - map["emit-strength"] = _emitStrength; - map["local-gravity"] = _localGravity; - map["particle-radius"] = _particleRadius; - map["last-animatged"] = _lastAnimated; - map["animation-last"] = getAnimationLoop(); - map["animation-settings"] = _animationSettings; - map["shape-type"] = _shapeType; -} +// void ParticleEffectEntityItem::writeSubTypeToMap(QVariantMap& map) { +// map["type"] = QString("Box"); +// map["color"] = rgbColorToQList(_color); +// map["max-particles"] = _maxParticles; +// map["lifespan"] = _lifespan; +// map["emit-rate"] = _emitRate; +// map["emit-direction"] = glmToQList(_emitDirection); +// map["emit-strength"] = _emitStrength; +// map["local-gravity"] = _localGravity; +// map["particle-radius"] = _particleRadius; +// map["last-animatged"] = _lastAnimated; +// map["animation-last"] = getAnimationLoop(); +// map["animation-settings"] = _animationSettings; +// map["shape-type"] = _shapeType; +// } void ParticleEffectEntityItem::readFromMap(QVariantMap& map) { diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index fdc1f2d078..e76b086154 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -141,7 +141,7 @@ public: float getAnimationFPS() const { return _animationLoop.getFPS(); } QString getAnimationSettings() const; - void writeSubTypeToMap(QVariantMap& map); + // void writeSubTypeToMap(QVariantMap& map); void readFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 67bc19b910..589ff8c571 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -129,10 +129,10 @@ void SphereEntityItem::debugDump() const { } -void SphereEntityItem::writeSubTypeToMap(QVariantMap& map) { - map["type"] = QString("Sphere"); - map["color"] = rgbColorToQList(_color); -} +// void SphereEntityItem::writeSubTypeToMap(QVariantMap& map) { +// map["type"] = QString("Sphere"); +// map["color"] = rgbColorToQList(_color); +// } void SphereEntityItem::readFromMap(QVariantMap& map) { diff --git a/libraries/entities/src/SphereEntityItem.h b/libraries/entities/src/SphereEntityItem.h index 85f66f8d49..ba73d9c888 100644 --- a/libraries/entities/src/SphereEntityItem.h +++ b/libraries/entities/src/SphereEntityItem.h @@ -62,7 +62,7 @@ public: virtual void debugDump() const; - void writeSubTypeToMap(QVariantMap& map); + // void writeSubTypeToMap(QVariantMap& map); void readFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index bdda92be9e..7c8539cb7c 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -172,13 +172,13 @@ bool TextEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const return intersects; } -void TextEntityItem::writeSubTypeToMap(QVariantMap& map) { - map["type"] = QString("Text"); - map["text"] = _text; - map["line-height"] = _lineHeight; - map["text-color"] = rgbColorToQList(_textColor); - map["background-color"] = rgbColorToQList(_backgroundColor); -} +// void TextEntityItem::writeSubTypeToMap(QVariantMap& map) { +// map["type"] = QString("Text"); +// map["text"] = _text; +// map["line-height"] = _lineHeight; +// map["text-color"] = rgbColorToQList(_textColor); +// map["background-color"] = rgbColorToQList(_backgroundColor); +// } void TextEntityItem::readFromMap(QVariantMap& map) { _text = map.value("text", "").toString(); diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index 524e698bb4..03e64497a1 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -81,7 +81,7 @@ public: _backgroundColor[BLUE_INDEX] = value.blue; } - void writeSubTypeToMap(QVariantMap& map); + // void writeSubTypeToMap(QVariantMap& map); void readFromMap(QVariantMap& map); protected: From a874f933c6a7add0347ec6268373736d54ee6f1f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 16 Mar 2015 11:00:04 -0700 Subject: [PATCH 20/41] go to sandbox if location not present in settings --- libraries/networking/src/AddressManager.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index f6abfa0d44..0458a5e912 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -27,8 +27,7 @@ const QString ADDRESS_MANAGER_SETTINGS_GROUP = "AddressManager"; const QString SETTINGS_CURRENT_ADDRESS_KEY = "address"; -Setting::Handle currentAddressHandle(QStringList() << ADDRESS_MANAGER_SETTINGS_GROUP << "address"); - +Setting::Handle currentAddressHandle(QStringList() << ADDRESS_MANAGER_SETTINGS_GROUP << "address", DEFAULT_HIFI_ADDRESS); AddressManager::AddressManager() : _rootPlaceName(), From 7ddd54b78215bda8f63726b30eb899ac64ac732a Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 16 Mar 2015 11:11:07 -0700 Subject: [PATCH 21/41] dont report deleteEntity warnings in client for delete messages coming back from server --- libraries/entities/src/EntityTree.cpp | 35 ++++++++++++++++++--------- libraries/entities/src/EntityTree.h | 4 +-- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index e5a7fbee2f..65f85b06ce 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -236,21 +236,28 @@ void EntityTree::setSimulation(EntitySimulation* simulation) { _simulation = simulation; } -void EntityTree::deleteEntity(const EntityItemID& entityID, bool force) { +void EntityTree::deleteEntity(const EntityItemID& entityID, bool force, bool ignoreWarnings) { EntityTreeElement* containingElement = getContainingElement(entityID); if (!containingElement) { - qDebug() << "UNEXPECTED!!!! EntityTree::deleteEntity() entityID doesn't exist!!! entityID=" << entityID; + if (!ignoreWarnings) { + qDebug() << "UNEXPECTED!!!! EntityTree::deleteEntity() entityID doesn't exist!!! entityID=" << entityID; + } return; } EntityItem* existingEntity = containingElement->getEntityWithEntityItemID(entityID); if (!existingEntity) { - qDebug() << "UNEXPECTED!!!! don't call EntityTree::deleteEntity() on entity items that don't exist. entityID=" << entityID; + if (!ignoreWarnings) { + qDebug() << "UNEXPECTED!!!! don't call EntityTree::deleteEntity() on entity items that don't exist. " + "entityID=" << entityID; + } return; } if (existingEntity->getLocked() && !force) { - qDebug() << "ERROR! EntityTree::deleteEntity() trying to delete locked entity. entityID=" << entityID; + if (!ignoreWarnings) { + qDebug() << "ERROR! EntityTree::deleteEntity() trying to delete locked entity. entityID=" << entityID; + } return; } @@ -263,24 +270,31 @@ void EntityTree::deleteEntity(const EntityItemID& entityID, bool force) { _isDirty = true; } -void EntityTree::deleteEntities(QSet entityIDs, bool force) { +void EntityTree::deleteEntities(QSet entityIDs, bool force, bool ignoreWarnings) { // NOTE: callers must lock the tree before using this method DeleteEntityOperator theOperator(this); foreach(const EntityItemID& entityID, entityIDs) { EntityTreeElement* containingElement = getContainingElement(entityID); if (!containingElement) { - qDebug() << "UNEXPECTED!!!! EntityTree::deleteEntities() entityID doesn't exist!!! entityID=" << entityID; + if (!ignoreWarnings) { + qDebug() << "UNEXPECTED!!!! EntityTree::deleteEntities() entityID doesn't exist!!! entityID=" << entityID; + } continue; } EntityItem* existingEntity = containingElement->getEntityWithEntityItemID(entityID); if (!existingEntity) { - qDebug() << "UNEXPECTED!!!! don't call EntityTree::deleteEntities() on entity items that don't exist. entityID=" << entityID; + if (!ignoreWarnings) { + qDebug() << "UNEXPECTED!!!! don't call EntityTree::deleteEntities() on entity items that don't exist. " + "entityID=" << entityID; + } continue; } if (existingEntity->getLocked() && !force) { - qDebug() << "ERROR! EntityTree::deleteEntities() trying to delete locked entity. entityID=" << entityID; + if (!ignoreWarnings) { + qDebug() << "ERROR! EntityTree::deleteEntities() trying to delete locked entity. entityID=" << entityID; + } continue; } @@ -849,10 +863,9 @@ int EntityTree::processEraseMessage(const QByteArray& dataByteArray, const Share EntityItemID entityItemID(entityID); entityItemIDsToDelete << entityItemID; } - deleteEntities(entityItemIDsToDelete); + deleteEntities(entityItemIDsToDelete, true, true); } unlock(); - return processedBytes; } @@ -889,7 +902,7 @@ int EntityTree::processEraseMessageDetails(const QByteArray& dataByteArray, cons EntityItemID entityItemID(entityID); entityItemIDsToDelete << entityItemID; } - deleteEntities(entityItemIDsToDelete); + deleteEntities(entityItemIDsToDelete, true, true); } return processedBytes; } diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 5126682a99..7b85f64849 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -92,8 +92,8 @@ public: // use this method if you have a pointer to the entity (avoid an extra entity lookup) bool updateEntity(EntityItem* entity, const EntityItemProperties& properties, bool allowLockChange); - void deleteEntity(const EntityItemID& entityID, bool force = false); - void deleteEntities(QSet entityIDs, bool force = false); + void deleteEntity(const EntityItemID& entityID, bool force = false, bool ignoreWarnings = false); + void deleteEntities(QSet entityIDs, bool force = false, bool ignoreWarnings = false); void removeEntityFromSimulation(EntityItem* entity); /// \param position point of query in world-frame (meters) From ecb958687d94138e6adebc42dcd51e42b11230d1 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 16 Mar 2015 11:53:47 -0700 Subject: [PATCH 22/41] don't crash if we encounter an unknown shape type --- libraries/entities/src/EntityItemProperties.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 2b8e82d28f..2353ade2a6 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -187,7 +187,9 @@ void buildStringToShapeTypeLookup() { } QString EntityItemProperties::getShapeTypeAsString() const { - return QString(shapeTypeNames[_shapeType]); + if (_shapeType < sizeof(shapeTypeNames) / sizeof(char *)) + return QString(shapeTypeNames[_shapeType]); + return QString("none"); } void EntityItemProperties::setShapeTypeFromString(const QString& shapeName) { From 109271de3d29cc5275d90fedf44a62bcd387fbcf Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 16 Mar 2015 11:54:06 -0700 Subject: [PATCH 23/41] remove unused constant --- libraries/entities/src/EntityItemPropertiesDefaults.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index ec23a96f3e..b184d510b3 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -33,7 +33,6 @@ const glm::vec3 ENTITY_ITEM_DEFAULT_REGISTRATION_POINT = glm::vec3(0.5f, 0.5f, 0 const float ENTITY_ITEM_IMMORTAL_LIFETIME = -1.0f; /// special lifetime which means the entity lives for ever const float ENTITY_ITEM_DEFAULT_LIFETIME = ENTITY_ITEM_IMMORTAL_LIFETIME; -const glm::vec3 ENTITY_ITEM_DEFAULT_POSITION = glm::vec3(100); const glm::quat ENTITY_ITEM_DEFAULT_ROTATION; const float ENTITY_ITEM_DEFAULT_WIDTH = 0.1f; const glm::vec3 ENTITY_ITEM_DEFAULT_DIMENSIONS = glm::vec3(ENTITY_ITEM_DEFAULT_WIDTH); From 2d4a95c63487ae7552f64192b15aed5a49804b61 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 16 Mar 2015 11:54:50 -0700 Subject: [PATCH 24/41] move to-map recurse operator class to its own file --- libraries/entities/src/EntityTree.cpp | 66 +----------------- .../src/RecurseOctreeToMapOperator.cpp | 69 +++++++++++++++++++ .../entities/src/RecurseOctreeToMapOperator.h | 24 +++++++ 3 files changed, 95 insertions(+), 64 deletions(-) create mode 100644 libraries/entities/src/RecurseOctreeToMapOperator.cpp create mode 100644 libraries/entities/src/RecurseOctreeToMapOperator.h diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 4d23734a71..c13d216219 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -21,6 +21,7 @@ #include "MovingEntitiesOperator.h" #include "UpdateEntityOperator.h" #include "QVariantGLM.h" +#include "RecurseOctreeToMapOperator.h" EntityTree::EntityTree(bool shouldReaverage) : Octree(shouldReaverage), @@ -1042,73 +1043,10 @@ bool EntityTree::sendEntitiesOperation(OctreeElement* element, void* extraData) return true; } - -class ToMapOperator : public RecurseOctreeOperator { -public: - ToMapOperator(QVariantMap& map, OctreeElement *top, QScriptEngine *engine) : - RecurseOctreeOperator(), - _map(map), - _top(top), - _engine(engine) - { - // if some element "top" was given, only save information for that element and it's children. - if (_top) { - _withinTop = false; - } else { - // top was NULL, export entire tree. - _withinTop = true; - } - }; - bool preRecursion(OctreeElement* element) { - if (element == _top) { - _withinTop = true; - } - return true; - } - bool postRecursion(OctreeElement* element) { - - EntityTreeElement* entityTreeElement = static_cast(element); - const QList& entities = entityTreeElement->getEntities(); - - QVariantList entitiesQList = qvariant_cast(_map["Entities"]); - - foreach (EntityItem* entityItem, entities) { - EntityItemProperties properties = entityItem->getProperties(); - - // XXX this is copied out of EntityScriptingInterface::getEntityProperties - // is it needed here? - - // if (entityItem->getType() == EntityTypes::Model) { - // const FBXGeometry* geometry = getGeometryForEntity(entityItem); - // if (geometry) { - // properties.setSittingPoints(geometry->sittingPoints); - // Extents meshExtents = geometry->getUnscaledMeshExtents(); - // properties.setNaturalDimensions(meshExtents.maximum - meshExtents.minimum); - // } - // } - - QScriptValue qScriptValues = - EntityItemPropertiesToScriptValue(_engine, properties); - - entitiesQList << qScriptValues.toVariant(); - } - _map["Entities"] = entitiesQList; - if (element == _top) { - _withinTop = false; - } - return true; - } - private: - QVariantMap& _map; - OctreeElement *_top; - QScriptEngine *_engine; - bool _withinTop; -}; - bool EntityTree::writeToMap(QVariantMap& entityDescription, OctreeElement* element) { entityDescription["Entities"] = QVariantList(); QScriptEngine scriptEngine; - ToMapOperator theOperator(entityDescription, element, &scriptEngine); + RecurseOctreeToMapOperator theOperator(entityDescription, element, &scriptEngine); recurseTreeWithOperator(&theOperator); return true; } diff --git a/libraries/entities/src/RecurseOctreeToMapOperator.cpp b/libraries/entities/src/RecurseOctreeToMapOperator.cpp new file mode 100644 index 0000000000..9df5c207a7 --- /dev/null +++ b/libraries/entities/src/RecurseOctreeToMapOperator.cpp @@ -0,0 +1,69 @@ +// +// RecurseOctreeToMapOperator.cpp +// libraries/entities/src +// +// Created by Seth Alves on 3/6/15. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "RecurseOctreeToMapOperator.h" + + +RecurseOctreeToMapOperator::RecurseOctreeToMapOperator(QVariantMap& map, OctreeElement *top, QScriptEngine *engine) : + RecurseOctreeOperator(), + _map(map), + _top(top), + _engine(engine) +{ + // if some element "top" was given, only save information for that element and it's children. + if (_top) { + _withinTop = false; + } else { + // top was NULL, export entire tree. + _withinTop = true; + } +}; + +bool RecurseOctreeToMapOperator::preRecursion(OctreeElement* element) { + if (element == _top) { + _withinTop = true; + } + return true; +} + +bool RecurseOctreeToMapOperator::postRecursion(OctreeElement* element) { + + EntityTreeElement* entityTreeElement = static_cast(element); + const QList& entities = entityTreeElement->getEntities(); + + QVariantList entitiesQList = qvariant_cast(_map["Entities"]); + + foreach (EntityItem* entityItem, entities) { + EntityItemProperties properties = entityItem->getProperties(); + + // XXX this is copied out of EntityScriptingInterface::getEntityProperties + // is it needed here? + + // if (entityItem->getType() == EntityTypes::Model) { + // const FBXGeometry* geometry = getGeometryForEntity(entityItem); + // if (geometry) { + // properties.setSittingPoints(geometry->sittingPoints); + // Extents meshExtents = geometry->getUnscaledMeshExtents(); + // properties.setNaturalDimensions(meshExtents.maximum - meshExtents.minimum); + // } + // } + + QScriptValue qScriptValues = + EntityItemPropertiesToScriptValue(_engine, properties); + + entitiesQList << qScriptValues.toVariant(); + } + _map["Entities"] = entitiesQList; + if (element == _top) { + _withinTop = false; + } + return true; +} diff --git a/libraries/entities/src/RecurseOctreeToMapOperator.h b/libraries/entities/src/RecurseOctreeToMapOperator.h new file mode 100644 index 0000000000..16a413a128 --- /dev/null +++ b/libraries/entities/src/RecurseOctreeToMapOperator.h @@ -0,0 +1,24 @@ +// +// RecurseOctreeToMapOperator.h +// libraries/entities/src +// +// Created by Seth Alves on 3/6/15. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "EntityTree.h" + +class RecurseOctreeToMapOperator : public RecurseOctreeOperator { +public: + RecurseOctreeToMapOperator(QVariantMap& map, OctreeElement *top, QScriptEngine *engine); + bool preRecursion(OctreeElement* element); + bool postRecursion(OctreeElement* element); + private: + QVariantMap& _map; + OctreeElement *_top; + QScriptEngine *_engine; + bool _withinTop; +}; From 1e50d9438418cad15ed099032b4350ea01ec9b37 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 16 Mar 2015 11:59:30 -0700 Subject: [PATCH 25/41] don't put arbitrarily large array on stack --- libraries/octree/src/Octree.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index dafbda4ef0..18857c5c6d 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -2053,12 +2053,13 @@ bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStr } bool Octree::readJSONFromStream(unsigned long streamLength, QDataStream& inputStream) { - char rawData[streamLength]; + char *rawData = new char[streamLength]; inputStream.readRawData(rawData, streamLength); QJsonDocument d = QJsonDocument::fromJson(rawData); QVariant v = d.toVariant(); QVariantMap m = v.toMap(); readFromMap(m); + delete rawData; return true; } From 999324bcaf85ff791f390dabe54c412edbba3502 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 16 Mar 2015 12:06:27 -0700 Subject: [PATCH 26/41] remove unused code --- libraries/entities/src/BoxEntityItem.cpp | 12 ------- libraries/entities/src/BoxEntityItem.h | 3 -- libraries/entities/src/EntityItem.h | 5 --- .../entities/src/EntityScriptingInterface.cpp | 2 -- libraries/entities/src/LightEntityItem.cpp | 15 --------- libraries/entities/src/LightEntityItem.h | 3 -- libraries/entities/src/ModelEntityItem.cpp | 26 --------------- libraries/entities/src/ModelEntityItem.h | 3 -- .../entities/src/ParticleEffectEntityItem.cpp | 33 ------------------- .../entities/src/ParticleEffectEntityItem.h | 3 -- libraries/entities/src/SphereEntityItem.cpp | 11 ------- libraries/entities/src/SphereEntityItem.h | 3 -- libraries/entities/src/TextEntityItem.cpp | 15 --------- libraries/entities/src/TextEntityItem.h | 3 -- 14 files changed, 137 deletions(-) diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 0e795ecb27..031856fbdf 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -105,15 +105,3 @@ void BoxEntityItem::debugDump() const { qDebug() << " dimensions:" << debugTreeVector(_dimensions); qDebug() << " getLastEdited:" << debugTime(getLastEdited(), now); } - - - -// void BoxEntityItem::writeSubTypeToMap(QVariantMap& map) { -// map["type"] = QString("Box"); -// map["color"] = rgbColorToQList(_color); -// } - - -void BoxEntityItem::readFromMap(QVariantMap& map) { - qListtoRgbColor(map.value("color", QVariantList() << 255 << 255 << 255), _color); -} diff --git a/libraries/entities/src/BoxEntityItem.h b/libraries/entities/src/BoxEntityItem.h index a73d80f849..e8459e7dbb 100644 --- a/libraries/entities/src/BoxEntityItem.h +++ b/libraries/entities/src/BoxEntityItem.h @@ -55,9 +55,6 @@ public: virtual void debugDump() const; - // void writeSubTypeToMap(QVariantMap& map); - void readFromMap(QVariantMap& map); - protected: rgbColor _color; }; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 6fadcacd11..580f3e95ab 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -295,11 +295,6 @@ public: static void setSendPhysicsUpdates(bool value) { _sendPhysicsUpdates = value; } static bool getSendPhysicsUpdates() { return _sendPhysicsUpdates; } - // virtual void writeSubTypeToMap(QVariantMap& map) = 0; - - virtual void readFromMap(QVariantMap& map) = 0; - - protected: static bool _sendPhysicsUpdates; diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 32d6f6bb02..f5c029a398 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -379,8 +379,6 @@ QScriptValue variantMapToQScriptValue(QVariantMap& variantMap, QScriptEngine& sc QString key = iter.key(); QVariant qValue = iter.value(); - qDebug() << key << "=" << qValue; - switch(qValue.type()) { case QVariant::Bool: scriptValue.setProperty(key, qValue.toBool()); diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index 8e1d0a9794..9b4b8611ef 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -150,18 +150,3 @@ void LightEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit APPEND_ENTITY_PROPERTY(PROP_EXPONENT, appendValue, getExponent()); APPEND_ENTITY_PROPERTY(PROP_CUTOFF, appendValue, getCutoff()); } - -// void LightEntityItem::writeSubTypeToMap(QVariantMap& map) { -// map["type"] = QString("Light"); -// map["color"] = rgbColorToQList(_color); -// map["intensity"] = _intensity; -// map["exponent"] = _exponent; -// map["cutoff"] = _cutoff; -// } - -void LightEntityItem::readFromMap(QVariantMap& map) { - qListtoRgbColor(map.value("color", QVariantList() << 255 << 255 << 255), _color); - _intensity = map.value("intensity", 1.0f).toFloat(); - _exponent = map.value("exponent", 0.0f).toFloat(); - _cutoff = map.value("cutoff", PI).toFloat(); -} diff --git a/libraries/entities/src/LightEntityItem.h b/libraries/entities/src/LightEntityItem.h index 068cb24069..cdbdb59ece 100644 --- a/libraries/entities/src/LightEntityItem.h +++ b/libraries/entities/src/LightEntityItem.h @@ -69,9 +69,6 @@ public: static bool getLightsArePickable() { return _lightsArePickable; } static void setLightsArePickable(bool value) { _lightsArePickable = value; } - - // void writeSubTypeToMap(QVariantMap& map); - void readFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index d585bbf58c..dd3206bf4b 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -412,29 +412,3 @@ QString ModelEntityItem::getAnimationSettings() const { QString jsonByteString(jsonByteArray); return jsonByteString; } - -// void ModelEntityItem::writeSubTypeToMap(QVariantMap& map) { -// map["type"] = QString("Model"); -// map["color"] = rgbColorToQList(_color); -// map["model-url"] = _modelURL; -// map["animation-url"] = _animationURL; -// map["animation-fps"] = getAnimationFPS(); -// map["animation-frame-index"] = getAnimationFrameIndex(); -// map["animation-is-playing"] = getAnimationIsPlaying(); -// map["textures"] = _textures; -// map["animation-settings"] = getAnimationSettings(); -// map["shape-type"] = _shapeType; -// } - - -void ModelEntityItem::readFromMap(QVariantMap& map) { - qListtoRgbColor(map.value("color", QVariantList() << 255 << 255 << 255), _color); - _modelURL = map.value("model-url", "").toString(); - _animationURL = map.value("animation-url", "").toString(); - setAnimationFPS(map.value("animation-fps", 0.0f).toFloat()); - setAnimationFrameIndex(map.value("animation-frame-index", 0.0f).toFloat()); - setAnimationIsPlaying(map.value("animation-is-playing", false).toBool()); - _textures = map.value("textures", "").toString(); - setAnimationSettings(map.value("animation-settings", "").toString()); - _shapeType = (ShapeType)(map.value("shape-type", SHAPE_TYPE_NONE).toInt()); -} diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index 6a5636e5e4..081cb429ed 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -119,9 +119,6 @@ public: void setTextures(const QString& textures) { _textures = textures; } static void cleanupLoadedAnimations(); - - // void writeSubTypeToMap(QVariantMap& map); - void readFromMap(QVariantMap& map); protected: diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index b1c0b7aa17..e5b1124d20 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -510,36 +510,3 @@ void ParticleEffectEntityItem::resetSimulation() { srand(_randSeed); } - - -// void ParticleEffectEntityItem::writeSubTypeToMap(QVariantMap& map) { -// map["type"] = QString("Box"); -// map["color"] = rgbColorToQList(_color); -// map["max-particles"] = _maxParticles; -// map["lifespan"] = _lifespan; -// map["emit-rate"] = _emitRate; -// map["emit-direction"] = glmToQList(_emitDirection); -// map["emit-strength"] = _emitStrength; -// map["local-gravity"] = _localGravity; -// map["particle-radius"] = _particleRadius; -// map["last-animatged"] = _lastAnimated; -// map["animation-last"] = getAnimationLoop(); -// map["animation-settings"] = _animationSettings; -// map["shape-type"] = _shapeType; -// } - - -void ParticleEffectEntityItem::readFromMap(QVariantMap& map) { - qListtoRgbColor(map.value("color", QVariantList() << 255 << 255 << 255), _color); - _maxParticles = map.value("max-particles", DEFAULT_MAX_PARTICLES).toFloat(); - _lifespan = map.value("lifespan", DEFAULT_LIFESPAN).toFloat(); - _emitRate = map.value("emit-rate", DEFAULT_EMIT_RATE).toFloat(); - _emitDirection = qListToGlmVec3(map.value("emit-direction", glmToQList(DEFAULT_EMIT_DIRECTION))); - _emitStrength = map.value("emit-strength", DEFAULT_EMIT_STRENGTH).toFloat(); - _localGravity = map.value("local-gravity", DEFAULT_LOCAL_GRAVITY).toFloat(); - _particleRadius = map.value("particle-radius", DEFAULT_PARTICLE_RADIUS).toFloat(); - _lastAnimated = map.value("last-animated", usecTimestampNow()).toULongLong(); - setAnimationLoop (map.value("animation-loop", true).toBool()); - _animationSettings = map.value("animation-settings", "").toString(); - _shapeType = (ShapeType)(map.value("shape-type", SHAPE_TYPE_NONE).toInt()); -} diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index e76b086154..b00eb94685 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -141,9 +141,6 @@ public: float getAnimationFPS() const { return _animationLoop.getFPS(); } QString getAnimationSettings() const; - // void writeSubTypeToMap(QVariantMap& map); - void readFromMap(QVariantMap& map); - protected: bool isAnimatingSomething() const; diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 589ff8c571..12d1090533 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -127,14 +127,3 @@ void SphereEntityItem::debugDump() const { qDebug() << " dimensions:" << debugTreeVector(_dimensions); qDebug() << " getLastEdited:" << debugTime(getLastEdited(), now); } - - -// void SphereEntityItem::writeSubTypeToMap(QVariantMap& map) { -// map["type"] = QString("Sphere"); -// map["color"] = rgbColorToQList(_color); -// } - - -void SphereEntityItem::readFromMap(QVariantMap& map) { - qListtoRgbColor(map.value("color", QVariantList() << 255 << 255 << 255), _color); -} diff --git a/libraries/entities/src/SphereEntityItem.h b/libraries/entities/src/SphereEntityItem.h index ba73d9c888..f79a2db7ff 100644 --- a/libraries/entities/src/SphereEntityItem.h +++ b/libraries/entities/src/SphereEntityItem.h @@ -62,9 +62,6 @@ public: virtual void debugDump() const; - // void writeSubTypeToMap(QVariantMap& map); - void readFromMap(QVariantMap& map); - protected: rgbColor _color; diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index 7c8539cb7c..89f79e275c 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -171,18 +171,3 @@ bool TextEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const } return intersects; } - -// void TextEntityItem::writeSubTypeToMap(QVariantMap& map) { -// map["type"] = QString("Text"); -// map["text"] = _text; -// map["line-height"] = _lineHeight; -// map["text-color"] = rgbColorToQList(_textColor); -// map["background-color"] = rgbColorToQList(_backgroundColor); -// } - -void TextEntityItem::readFromMap(QVariantMap& map) { - _text = map.value("text", "").toString(); - _lineHeight = map.value("line-height", TextEntityItem::DEFAULT_LINE_HEIGHT).toFloat(); - qListtoRgbColor(map.value("text-color", QVariantList() << 255 << 255 << 255), _textColor); - qListtoRgbColor(map.value("background-color", QVariantList() << 0 << 0 << 0), _backgroundColor); -} diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index 03e64497a1..044975bdc8 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -81,9 +81,6 @@ public: _backgroundColor[BLUE_INDEX] = value.blue; } - // void writeSubTypeToMap(QVariantMap& map); - void readFromMap(QVariantMap& map); - protected: QString _text; float _lineHeight; From 5bc2d88ea6b8ce59f3e0fe3f4a94eb7a678447a9 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 16 Mar 2015 12:11:41 -0700 Subject: [PATCH 27/41] diff minimization --- libraries/entities/src/EntityItem.h | 1 + libraries/entities/src/LightEntityItem.cpp | 1 - libraries/entities/src/ModelEntityItem.cpp | 1 - libraries/entities/src/ParticleEffectEntityItem.cpp | 2 +- libraries/entities/src/RecurseOctreeToMapOperator.cpp | 2 +- libraries/entities/src/RecurseOctreeToMapOperator.h | 2 +- libraries/entities/src/SphereEntityItem.cpp | 2 +- libraries/entities/src/TextEntityItem.cpp | 1 - libraries/octree/src/Octree.cpp | 1 + 9 files changed, 6 insertions(+), 7 deletions(-) diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 580f3e95ab..5193aa4490 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -295,6 +295,7 @@ public: static void setSendPhysicsUpdates(bool value) { _sendPhysicsUpdates = value; } static bool getSendPhysicsUpdates() { return _sendPhysicsUpdates; } + protected: static bool _sendPhysicsUpdates; diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index 9b4b8611ef..62a44c7e21 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -18,7 +18,6 @@ #include "EntityTree.h" #include "EntityTreeElement.h" #include "LightEntityItem.h" -#include "QVariantGLM.h" bool LightEntityItem::_lightsArePickable = false; diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index dd3206bf4b..d2a2714982 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -17,7 +17,6 @@ #include "EntityTree.h" #include "EntityTreeElement.h" #include "ModelEntityItem.h" -#include "QVariantGLM.h" const QString ModelEntityItem::DEFAULT_MODEL_URL = QString(""); const QString ModelEntityItem::DEFAULT_COLLISION_MODEL_URL = QString(""); diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index e5b1124d20..b902dd63b8 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -43,7 +43,6 @@ #include "EntityTree.h" #include "EntityTreeElement.h" #include "ParticleEffectEntityItem.h" -#include "QVariantGLM.h" const float ParticleEffectEntityItem::DEFAULT_ANIMATION_FRAME_INDEX = 0.0f; const bool ParticleEffectEntityItem::DEFAULT_ANIMATION_IS_PLAYING = false; @@ -510,3 +509,4 @@ void ParticleEffectEntityItem::resetSimulation() { srand(_randSeed); } + diff --git a/libraries/entities/src/RecurseOctreeToMapOperator.cpp b/libraries/entities/src/RecurseOctreeToMapOperator.cpp index 9df5c207a7..4017078118 100644 --- a/libraries/entities/src/RecurseOctreeToMapOperator.cpp +++ b/libraries/entities/src/RecurseOctreeToMapOperator.cpp @@ -2,7 +2,7 @@ // RecurseOctreeToMapOperator.cpp // libraries/entities/src // -// Created by Seth Alves on 3/6/15. +// Created by Seth Alves on 3/16/15. // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/entities/src/RecurseOctreeToMapOperator.h b/libraries/entities/src/RecurseOctreeToMapOperator.h index 16a413a128..6bd44f3cbf 100644 --- a/libraries/entities/src/RecurseOctreeToMapOperator.h +++ b/libraries/entities/src/RecurseOctreeToMapOperator.h @@ -2,7 +2,7 @@ // RecurseOctreeToMapOperator.h // libraries/entities/src // -// Created by Seth Alves on 3/6/15. +// Created by Seth Alves on 3/16/15. // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 12d1090533..483323ba4b 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -20,7 +20,6 @@ #include "EntityTree.h" #include "EntityTreeElement.h" #include "SphereEntityItem.h" -#include "QVariantGLM.h" EntityItem* SphereEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { @@ -127,3 +126,4 @@ void SphereEntityItem::debugDump() const { qDebug() << " dimensions:" << debugTreeVector(_dimensions); qDebug() << " getLastEdited:" << debugTime(getLastEdited(), now); } + diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index 89f79e275c..2b35ee9a59 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -20,7 +20,6 @@ #include "EntityTree.h" #include "EntityTreeElement.h" #include "TextEntityItem.h" -#include "QVariantGLM.h" const QString TextEntityItem::DEFAULT_TEXT(""); diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 18857c5c6d..85ea09b5ef 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -2195,3 +2195,4 @@ bool Octree::countOctreeElementsOperation(OctreeElement* element, void* extraDat void Octree::cancelImport() { _stopImport = true; } + From fe658c0ed042dac56a84c9fe42eb51ae9bfe95fb Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 16 Mar 2015 12:13:16 -0700 Subject: [PATCH 28/41] diff minimization --- libraries/entities/src/BoxEntityItem.cpp | 2 +- libraries/entities/src/EntityItem.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 031856fbdf..1e8c811122 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -17,7 +17,6 @@ #include "BoxEntityItem.h" #include "EntityTree.h" #include "EntityTreeElement.h" -#include "QVariantGLM.h" EntityItem* BoxEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { @@ -105,3 +104,4 @@ void BoxEntityItem::debugDump() const { qDebug() << " dimensions:" << debugTreeVector(_dimensions); qDebug() << " getLastEdited:" << debugTime(getLastEdited(), now); } + diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index b7713d08c8..4f74438a45 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -21,7 +21,6 @@ #include "EntityScriptingInterface.h" #include "EntityItem.h" #include "EntityTree.h" -#include "QVariantGLM.h" bool EntityItem::_sendPhysicsUpdates = true; @@ -1139,3 +1138,4 @@ void EntityItem::updateLifetime(float value) { _dirtyFlags |= EntityItem::DIRTY_LIFETIME; } } + From fd29f72bfeb11ae9753be8695f6879be099fc280 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 16 Mar 2015 12:59:41 -0700 Subject: [PATCH 29/41] Making nsight usage optional (still defaults to on) --- CMakeLists.txt | 1 + interface/CMakeLists.txt | 18 ++++++++++-------- libraries/gpu/CMakeLists.txt | 16 +++++++++------- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3242d981ac..1555321c32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -158,6 +158,7 @@ option(GET_GLM "Get GLM library automatically as external project" 1) option(GET_GVERB "Get Gverb library automatically as external project" 1) option(GET_SOXR "Get Soxr library automatically as external project" 1) option(GET_TBB "Get Threading Building Blocks library automatically as external project" 1) +option(USE_NSIGHT "Attempt to find the nSight libraries" 1) if (WIN32) option(GET_GLEW "Get GLEW library automatically as external project" 1) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 62e12d88b1..dfe9689b27 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -220,15 +220,17 @@ else (APPLE) find_package(GLEW REQUIRED) target_include_directories(${TARGET_NAME} PRIVATE ${GLEW_INCLUDE_DIRS}) - target_link_libraries(${TARGET_NAME} ${GLEW_LIBRARIES} ${NSIGHT_LIBRARIES} wsock32.lib opengl32.lib Winmm.lib) + target_link_libraries(${TARGET_NAME} ${GLEW_LIBRARIES} wsock32.lib opengl32.lib Winmm.lib) - # try to find the Nsight package and add it to the build if we find it - find_package(NSIGHT) - if (NSIGHT_FOUND) - include_directories(${NSIGHT_INCLUDE_DIRS}) - add_definitions(-DNSIGHT_FOUND) - target_link_libraries(${TARGET_NAME} "${NSIGHT_LIBRARIES}") - endif () + if (USE_NSIGHT) + # try to find the Nsight package and add it to the build if we find it + find_package(NSIGHT) + if (NSIGHT_FOUND) + include_directories(${NSIGHT_INCLUDE_DIRS}) + add_definitions(-DNSIGHT_FOUND) + target_link_libraries(${TARGET_NAME} "${NSIGHT_LIBRARIES}") + endif () + endif() endif() endif (APPLE) diff --git a/libraries/gpu/CMakeLists.txt b/libraries/gpu/CMakeLists.txt index 4a23631dfb..30949b83e1 100644 --- a/libraries/gpu/CMakeLists.txt +++ b/libraries/gpu/CMakeLists.txt @@ -19,13 +19,15 @@ elseif (WIN32) target_link_libraries(${TARGET_NAME} ${GLEW_LIBRARIES} opengl32.lib) - # try to find the Nsight package and add it to the build if we find it - find_package(NSIGHT) - if (NSIGHT_FOUND) - include_directories(${NSIGHT_INCLUDE_DIRS}) - add_definitions(-DNSIGHT_FOUND) - target_link_libraries(${TARGET_NAME} "${NSIGHT_LIBRARIES}") - endif () + if (USE_NSIGHT) + # try to find the Nsight package and add it to the build if we find it + find_package(NSIGHT) + if (NSIGHT_FOUND) + include_directories(${NSIGHT_INCLUDE_DIRS}) + add_definitions(-DNSIGHT_FOUND) + target_link_libraries(${TARGET_NAME} "${NSIGHT_LIBRARIES}") + endif () + endif() elseif (ANDROID) target_link_libraries(${TARGET_NAME} "-lGLESv3" "-lEGL") else () From bed37ef49aca1f0d930c9c508a3276d5fbdc9f59 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 16 Mar 2015 13:57:22 -0700 Subject: [PATCH 30/41] incorporate code review feedback --- .../entities/src/EntityScriptingInterface.cpp | 38 +-------------- .../entities/src/EntityScriptingInterface.h | 1 - libraries/entities/src/EntityTree.cpp | 4 +- .../src/RecurseOctreeToMapOperator.cpp | 17 +------ libraries/octree/src/OctreePersistThread.cpp | 2 +- .../shared/src/VariantMapToScriptValue.cpp | 47 +++++++++++++++++++ .../shared/src/VariantMapToScriptValue.h | 16 +++++++ 7 files changed, 69 insertions(+), 56 deletions(-) create mode 100644 libraries/shared/src/VariantMapToScriptValue.cpp create mode 100644 libraries/shared/src/VariantMapToScriptValue.h diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 08743cc56c..5624e0765b 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -9,6 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include + #include "EntityScriptingInterface.h" #include "EntityTree.h" #include "LightEntityItem.h" @@ -383,39 +385,3 @@ void RayToEntityIntersectionResultFromScriptValue(const QScriptValue& object, Ra vec3FromScriptValue(intersection, value.intersection); } } - - -// XXX why can't I find a call that does this? -QScriptValue variantMapToQScriptValue(QVariantMap& variantMap, QScriptEngine& scriptEngine) { - QScriptValue scriptValue = scriptEngine.newObject(); - - for (QVariantMap::const_iterator iter = variantMap.begin(); iter != variantMap.end(); ++iter) { - QString key = iter.key(); - QVariant qValue = iter.value(); - - switch(qValue.type()) { - case QVariant::Bool: - scriptValue.setProperty(key, qValue.toBool()); - break; - case QVariant::Int: - scriptValue.setProperty(key, qValue.toInt()); - break; - case QVariant::Double: - scriptValue.setProperty(key, qValue.toDouble()); - break; - case QVariant::String: { - scriptValue.setProperty(key, scriptEngine.newVariant(qValue)); - break; - } - case QVariant::Map: { - QVariantMap childMap = qValue.toMap(); - scriptValue.setProperty(key, variantMapToQScriptValue(childMap, scriptEngine)); - break; - } - default: - qDebug() << "unhandled QScript type" << qValue.type(); - } - } - - return scriptValue; -} diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index c42633001f..5e75e2ae0d 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -46,7 +46,6 @@ Q_DECLARE_METATYPE(RayToEntityIntersectionResult) QScriptValue RayToEntityIntersectionResultToScriptValue(QScriptEngine* engine, const RayToEntityIntersectionResult& results); void RayToEntityIntersectionResultFromScriptValue(const QScriptValue& object, RayToEntityIntersectionResult& results); -QScriptValue variantMapToQScriptValue(QVariantMap& variantMap, QScriptEngine& scriptEngine); /// handles scripting of Entity commands from JS passed to assigned clients diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 42e74f0ca8..916e95e99d 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -15,7 +15,7 @@ #include "EntityTree.h" #include "EntitySimulation.h" -#include "EntityScriptingInterface.h" +#include "VariantMapToScriptValue.h" #include "AddEntityOperator.h" #include "MovingEntitiesOperator.h" @@ -1091,7 +1091,7 @@ bool EntityTree::readFromMap(QVariantMap& map) { foreach (QVariant entityVariant, entitiesQList) { // QVariantMap --> QScriptValue --> EntityItemProperties --> Entity QVariantMap entityMap = entityVariant.toMap(); - QScriptValue entityScriptValue = variantMapToQScriptValue(entityMap, scriptEngine); + QScriptValue entityScriptValue = variantMapToScriptValue(entityMap, scriptEngine); EntityItemProperties properties; EntityItemPropertiesFromScriptValue(entityScriptValue, properties); diff --git a/libraries/entities/src/RecurseOctreeToMapOperator.cpp b/libraries/entities/src/RecurseOctreeToMapOperator.cpp index 4017078118..afe28e17e0 100644 --- a/libraries/entities/src/RecurseOctreeToMapOperator.cpp +++ b/libraries/entities/src/RecurseOctreeToMapOperator.cpp @@ -43,22 +43,7 @@ bool RecurseOctreeToMapOperator::postRecursion(OctreeElement* element) { foreach (EntityItem* entityItem, entities) { EntityItemProperties properties = entityItem->getProperties(); - - // XXX this is copied out of EntityScriptingInterface::getEntityProperties - // is it needed here? - - // if (entityItem->getType() == EntityTypes::Model) { - // const FBXGeometry* geometry = getGeometryForEntity(entityItem); - // if (geometry) { - // properties.setSittingPoints(geometry->sittingPoints); - // Extents meshExtents = geometry->getUnscaledMeshExtents(); - // properties.setNaturalDimensions(meshExtents.maximum - meshExtents.minimum); - // } - // } - - QScriptValue qScriptValues = - EntityItemPropertiesToScriptValue(_engine, properties); - + QScriptValue qScriptValues = EntityItemPropertiesToScriptValue(_engine, properties); entitiesQList << qScriptValues.toVariant(); } _map["Entities"] = entitiesQList; diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index c2645f0207..02f46ee64b 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -148,7 +148,7 @@ bool OctreePersistThread::process() { qDebug() << "Loading Octree... lock file removed:" << lockFileName; } - persistantFileRead = _tree->readFromFile(_filename.toLocal8Bit().constData()); + persistantFileRead = _tree->readFromFile(qPrintable(_filename.toLocal8Bit())); _tree->pruneTree(); } _tree->unlock(); diff --git a/libraries/shared/src/VariantMapToScriptValue.cpp b/libraries/shared/src/VariantMapToScriptValue.cpp new file mode 100644 index 0000000000..6fa3fd04e6 --- /dev/null +++ b/libraries/shared/src/VariantMapToScriptValue.cpp @@ -0,0 +1,47 @@ +// +// VariantMapToScriptValue.cpp +// libraries/shared/src/ +// +// Created by Brad Hefta-Gaub on 12/6/13. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include +#include "VariantMapToScriptValue.h" + +QScriptValue variantMapToScriptValue(QVariantMap& variantMap, QScriptEngine& scriptEngine) { + QScriptValue scriptValue = scriptEngine.newObject(); + + for (QVariantMap::const_iterator iter = variantMap.begin(); iter != variantMap.end(); ++iter) { + QString key = iter.key(); + QVariant qValue = iter.value(); + + switch(qValue.type()) { + case QVariant::Bool: + scriptValue.setProperty(key, qValue.toBool()); + break; + case QVariant::Int: + scriptValue.setProperty(key, qValue.toInt()); + break; + case QVariant::Double: + scriptValue.setProperty(key, qValue.toDouble()); + break; + case QVariant::String: { + scriptValue.setProperty(key, scriptEngine.newVariant(qValue)); + break; + } + case QVariant::Map: { + QVariantMap childMap = qValue.toMap(); + scriptValue.setProperty(key, variantMapToScriptValue(childMap, scriptEngine)); + break; + } + default: + qDebug() << "unhandled QScript type" << qValue.type(); + } + } + + return scriptValue; +} diff --git a/libraries/shared/src/VariantMapToScriptValue.h b/libraries/shared/src/VariantMapToScriptValue.h new file mode 100644 index 0000000000..503f8c6490 --- /dev/null +++ b/libraries/shared/src/VariantMapToScriptValue.h @@ -0,0 +1,16 @@ +// +// VariantMapToScriptValue.h +// libraries/shared/src/ +// +// Created by Brad Hefta-Gaub on 12/6/13. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include +#include +#include + +QScriptValue variantMapToScriptValue(QVariantMap& variantMap, QScriptEngine& scriptEngine); From 913527eaa3a50923540b928e714dc51ecd7d2536 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 16 Mar 2015 15:47:54 -0700 Subject: [PATCH 31/41] Calculate head height based on skeleton model mesh if no head model This fixes the problem of some skeleton models with heads having display names rendering through them. --- interface/src/avatar/Avatar.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index ad5dda9f18..a340a4622c 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -1017,10 +1017,11 @@ float Avatar::getHeadHeight() const { if (!extents.isEmpty()) { return extents.maximum.y - extents.minimum.y; } + + extents = _skeletonModel.getMeshExtents(); glm::vec3 neckPosition; - glm::vec3 headPosition; - if (_skeletonModel.getNeckPosition(neckPosition) && _skeletonModel.getHeadPosition(headPosition)) { - return glm::distance(neckPosition, headPosition); + if (!extents.isEmpty() && _skeletonModel.getNeckPosition(neckPosition)) { + return extents.maximum.y / 2.0f - neckPosition.y + _position.y; } const float DEFAULT_HEAD_HEIGHT = 0.1f; return DEFAULT_HEAD_HEIGHT; From d08a25f1a32b539bfb17dbb9b7760f599fc7d259 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 16 Mar 2015 15:48:10 -0700 Subject: [PATCH 32/41] A more realistic default head height --- interface/src/avatar/Avatar.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index a340a4622c..6d57660f37 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -1023,7 +1023,8 @@ float Avatar::getHeadHeight() const { if (!extents.isEmpty() && _skeletonModel.getNeckPosition(neckPosition)) { return extents.maximum.y / 2.0f - neckPosition.y + _position.y; } - const float DEFAULT_HEAD_HEIGHT = 0.1f; + + const float DEFAULT_HEAD_HEIGHT = 0.25f; return DEFAULT_HEAD_HEIGHT; } From 1f8a874ce63b6b3aee6bfae38ac56f29ad5fee8d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 17 Mar 2015 12:34:13 +0100 Subject: [PATCH 33/41] Hide cursor in 3D TV mode too --- interface/src/Application.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d674c5dcc9..184d1bf940 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2137,7 +2137,9 @@ void Application::updateCursor(float deltaTime) { } void Application::updateCursorVisibility() { - if (!_cursorVisible || Menu::getInstance()->isOptionChecked(MenuOption::EnableVRMode)) { + if (!_cursorVisible || + Menu::getInstance()->isOptionChecked(MenuOption::EnableVRMode) || + Menu::getInstance()->isOptionChecked(MenuOption::Enable3DTVMode)) { _window->setCursor(Qt::BlankCursor); } else { _window->unsetCursor(); From b0fd28beebb8e9b1bb1174e90c8555684c265f36 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 17 Mar 2015 16:16:25 +0100 Subject: [PATCH 34/41] Typo --- libraries/avatars/src/Player.cpp | 6 +++--- libraries/avatars/src/Player.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/avatars/src/Player.cpp b/libraries/avatars/src/Player.cpp index 2b92acb189..172d43c530 100644 --- a/libraries/avatars/src/Player.cpp +++ b/libraries/avatars/src/Player.cpp @@ -309,7 +309,7 @@ void Player::setCurrentFrame(int currentFrame) { if (isPlaying()) { _timer.start(); - setAudionInjectorPosition(); + setAudioInjectorPosition(); } else { _pausedFrame = _currentFrame; } @@ -354,7 +354,7 @@ void Player::setCurrentTime(int currentTime) { if (isPlaying()) { _timer.start(); - setAudionInjectorPosition(); + setAudioInjectorPosition(); } else { _pausedFrame = lowestBound; } @@ -372,7 +372,7 @@ void Player::setAudioOffset(int audioOffset) { _audioOffset = audioOffset; } -void Player::setAudionInjectorPosition() { +void Player::setAudioInjectorPosition() { int MSEC_PER_SEC = 1000; int SAMPLE_SIZE = 2; // 16 bits int CHANNEL_COUNT = 1; diff --git a/libraries/avatars/src/Player.h b/libraries/avatars/src/Player.h index 7ed76fa495..96f3cbc268 100644 --- a/libraries/avatars/src/Player.h +++ b/libraries/avatars/src/Player.h @@ -61,7 +61,7 @@ private: void setupAudioThread(); void cleanupAudioThread(); void loopRecording(); - void setAudionInjectorPosition(); + void setAudioInjectorPosition(); bool computeCurrentFrame(); AvatarData* _avatar; From 7121126e6fec26102fc5caa8b8dc1e3c63ffb751 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 17 Mar 2015 16:17:31 +0100 Subject: [PATCH 35/41] Wrong byte array size in audio client --- libraries/audio-client/src/AudioClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index c083fbc085..0dcab2c81b 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -812,7 +812,7 @@ void AudioClient::handleAudioInput() { } emit inputReceived(QByteArray(reinterpret_cast(networkAudioSamples), - AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL)); + AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * sizeof(AudioConstants::AudioSample))); } else { // our input loudness is 0, since we're muted From 3a11ed0574b937fd8fb51cae67f4f0be4231f86b Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 17 Mar 2015 16:34:50 +0100 Subject: [PATCH 36/41] Account for stereo audio in recorder --- libraries/avatars/src/Player.cpp | 16 ++++------------ libraries/avatars/src/Recording.cpp | 9 +++++++++ libraries/avatars/src/Recording.h | 1 + 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/libraries/avatars/src/Player.cpp b/libraries/avatars/src/Player.cpp index 172d43c530..b5cca61461 100644 --- a/libraries/avatars/src/Player.cpp +++ b/libraries/avatars/src/Player.cpp @@ -169,6 +169,8 @@ void Player::setupAudioThread() { _audioThread->setObjectName("Player Audio Thread"); _options.position = _avatar->getPosition(); _options.orientation = _avatar->getOrientation(); + _options.stereo = _recording->numberAudioChannel() == 2; + _injector.reset(new AudioInjector(_recording->getAudioData(), _options), &QObject::deleteLater); _injector->moveToThread(_audioThread); _audioThread->start(); @@ -349,15 +351,7 @@ void Player::setCurrentTime(int currentTime) { } } - _currentFrame = lowestBound; - _timerOffset = _recording->getFrameTimestamp(lowestBound); - - if (isPlaying()) { - _timer.start(); - setAudioInjectorPosition(); - } else { - _pausedFrame = lowestBound; - } + setCurrentFrame(lowestBound); } void Player::setVolume(float volume) { @@ -374,9 +368,7 @@ void Player::setAudioOffset(int audioOffset) { void Player::setAudioInjectorPosition() { int MSEC_PER_SEC = 1000; - int SAMPLE_SIZE = 2; // 16 bits - int CHANNEL_COUNT = 1; - int FRAME_SIZE = SAMPLE_SIZE * CHANNEL_COUNT; + int FRAME_SIZE = sizeof(AudioConstants::AudioSample) * _recording->numberAudioChannel(); int currentAudioFrame = elapsed() * FRAME_SIZE * (AudioConstants::SAMPLE_RATE / MSEC_PER_SEC); _injector->setCurrentSendPosition(currentAudioFrame); } diff --git a/libraries/avatars/src/Recording.cpp b/libraries/avatars/src/Recording.cpp index 7fa8b79bda..6901e5e10d 100644 --- a/libraries/avatars/src/Recording.cpp +++ b/libraries/avatars/src/Recording.cpp @@ -65,6 +65,15 @@ const RecordingFrame& Recording::getFrame(int i) const { return _frames[i]; } + +int Recording::numberAudioChannel() const { + // Check for stereo audio + int MSEC_PER_SEC = 1000; + int channelLength = (getLength() / MSEC_PER_SEC) * + AudioConstants::SAMPLE_RATE * sizeof(AudioConstants::AudioSample); + return glm::round((float)channelLength / (float)getAudioData().size()); +} + void Recording::addFrame(int timestamp, RecordingFrame &frame) { _timestamps << timestamp; _frames << frame; diff --git a/libraries/avatars/src/Recording.h b/libraries/avatars/src/Recording.h index d1da77560c..49d12ec5b5 100644 --- a/libraries/avatars/src/Recording.h +++ b/libraries/avatars/src/Recording.h @@ -56,6 +56,7 @@ public: qint32 getFrameTimestamp(int i) const; const RecordingFrame& getFrame(int i) const; const QByteArray& getAudioData() const { return _audioData; } + int numberAudioChannel() const; protected: void addFrame(int timestamp, RecordingFrame& frame); From 71e59cfa88c6563749594e25494102fe01db38e9 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 17 Mar 2015 13:15:15 -0700 Subject: [PATCH 37/41] Fix: Mini-mirror doesn't render avatar head when in first person mode --- interface/src/Application.cpp | 65 ++--------------------------------- 1 file changed, 3 insertions(+), 62 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 184d1bf940..fc9e5c101b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3113,16 +3113,8 @@ void Application::renderRearViewMirror(const QRect& region, bool billboard) { } else { // HEAD zoom level _mirrorCamera.setFieldOfView(MIRROR_FIELD_OF_VIEW); // degrees - if (_myAvatar->getSkeletonModel().isActive() && _myAvatar->getHead()->getFaceModel().isActive()) { - // as a hack until we have a better way of dealing with coordinate precision issues, reposition the - // face/body so that the average eye position lies at the origin - eyeRelativeCamera = true; - _mirrorCamera.setPosition(_myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_REARVIEW_DISTANCE * _myAvatar->getScale()); - - } else { - _mirrorCamera.setPosition(_myAvatar->getHead()->getEyePosition() + - _myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_REARVIEW_DISTANCE * _myAvatar->getScale()); - } + _mirrorCamera.setPosition(_myAvatar->getHead()->getEyePosition() + + _myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_REARVIEW_DISTANCE * _myAvatar->getScale()); } _mirrorCamera.setAspectRatio((float)region.width() / region.height()); @@ -3149,58 +3141,7 @@ void Application::renderRearViewMirror(const QRect& region, bool billboard) { // render rear mirror view glPushMatrix(); - if (eyeRelativeCamera) { - // save absolute translations - glm::vec3 absoluteSkeletonTranslation = _myAvatar->getSkeletonModel().getTranslation(); - glm::vec3 absoluteFaceTranslation = _myAvatar->getHead()->getFaceModel().getTranslation(); - - // get the neck position so we can translate the face relative to it - glm::vec3 neckPosition; - _myAvatar->getSkeletonModel().setTranslation(glm::vec3()); - _myAvatar->getSkeletonModel().getNeckPosition(neckPosition); - - // get the eye position relative to the body - glm::vec3 eyePosition = _myAvatar->getHead()->getEyePosition(); - float eyeHeight = eyePosition.y - _myAvatar->getPosition().y; - - // set the translation of the face relative to the neck position - _myAvatar->getHead()->getFaceModel().setTranslation(neckPosition - glm::vec3(0, eyeHeight, 0)); - - // translate the neck relative to the face - _myAvatar->getSkeletonModel().setTranslation(_myAvatar->getHead()->getFaceModel().getTranslation() - - neckPosition); - - // update the attachments to match - QVector absoluteAttachmentTranslations; - glm::vec3 delta = _myAvatar->getSkeletonModel().getTranslation() - absoluteSkeletonTranslation; - foreach (Model* attachment, _myAvatar->getAttachmentModels()) { - absoluteAttachmentTranslations.append(attachment->getTranslation()); - attachment->setTranslation(attachment->getTranslation() + delta); - } - - // and lo, even the shadow matrices - glm::mat4 savedShadowMatrices[CASCADED_SHADOW_MATRIX_COUNT]; - for (int i = 0; i < CASCADED_SHADOW_MATRIX_COUNT; i++) { - savedShadowMatrices[i] = _shadowMatrices[i]; - _shadowMatrices[i] = glm::transpose(glm::transpose(_shadowMatrices[i]) * glm::translate(-delta)); - } - - displaySide(_mirrorCamera, true); - - // restore absolute translations - _myAvatar->getSkeletonModel().setTranslation(absoluteSkeletonTranslation); - _myAvatar->getHead()->getFaceModel().setTranslation(absoluteFaceTranslation); - for (int i = 0; i < absoluteAttachmentTranslations.size(); i++) { - _myAvatar->getAttachmentModels().at(i)->setTranslation(absoluteAttachmentTranslations.at(i)); - } - - // restore the shadow matrices - for (int i = 0; i < CASCADED_SHADOW_MATRIX_COUNT; i++) { - _shadowMatrices[i] = savedShadowMatrices[i]; - } - } else { - displaySide(_mirrorCamera, true); - } + displaySide(_mirrorCamera, true); glPopMatrix(); if (!billboard) { From c88f6f8f0718c143bab0dcb02788de6e09143ab9 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 17 Mar 2015 13:49:06 -0700 Subject: [PATCH 38/41] Adding some documentation on the change --- interface/src/Application.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fc9e5c101b..571cf493bd 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3112,6 +3112,22 @@ void Application::renderRearViewMirror(const QRect& region, bool billboard) { _myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_REARVIEW_BODY_DISTANCE * _myAvatar->getScale()); } else { // HEAD zoom level + // FIXME note that the positioing of the camera relative to the avatar can suffer limited + // precision as the user's position moves further away from the origin. Thus at + // /1e7,1e7,1e7 (well outside the buildable volume) the mirror camera veers and sways + // wildly as you rotate your avatar because the floating point values are becoming + // larger, squeezing out the available digits of precision you have available at the + // human scale for camera positioning. + + // Previously there was a hack to correct this using the mechanism of repositioning + // the avatar at the origin of the world for the purposes of rendering the mirror, + // but it resulted in failing to render the avatar's head model in the mirror view + // when in first person mode. Presumably this was because of some missed culling logic + // that was not accounted for in the hack. + + // This was removed in commit 71e59cfa88c6563749594e25494102fe01db38e9 but could be further + // investigated in order to adapt the technique while fixing the head rendering issue, + // but the complexity of the hack suggests that a better approach _mirrorCamera.setFieldOfView(MIRROR_FIELD_OF_VIEW); // degrees _mirrorCamera.setPosition(_myAvatar->getHead()->getEyePosition() + _myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_REARVIEW_DISTANCE * _myAvatar->getScale()); From 895a0d7b85272999248ddaf5311759a50d8359db Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 17 Mar 2015 16:14:35 -0700 Subject: [PATCH 39/41] Correcting frustum usage by the avatar renderer that was causing aspect ratio problem --- interface/src/Application.h | 4 ++++ interface/src/avatar/Avatar.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index b013692393..a200e56d74 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -174,7 +174,11 @@ public: bool isThrottleRendering() const { return _glWidget->isThrottleRendering(); } Camera* getCamera() { return &_myCamera; } + // Represents the current view frustum of the avatar. ViewFrustum* getViewFrustum() { return &_viewFrustum; } + // Represents the view frustum of the current rendering pass, + // which might be different from the viewFrustum, i.e. shadowmap + // passes, mirror window passes, etc ViewFrustum* getDisplayViewFrustum() { return &_displayViewFrustum; } ViewFrustum* getShadowViewFrustum() { return &_shadowViewFrustum; } const OctreePacketProcessor& getOctreePacketProcessor() const { return _octreeProcessor; } diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 75d77b780a..d2f0f815df 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -338,7 +338,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool // simple frustum check float boundingRadius = getBillboardSize(); ViewFrustum* frustum = (renderMode == Avatar::SHADOW_RENDER_MODE) ? - Application::getInstance()->getShadowViewFrustum() : Application::getInstance()->getViewFrustum(); + Application::getInstance()->getShadowViewFrustum() : Application::getInstance()->getDisplayViewFrustum(); if (frustum->sphereInFrustum(getPosition(), boundingRadius) == ViewFrustum::OUTSIDE) { return; } From e6163089114d269e2fa205c9232871761fd3adbb Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 17 Mar 2015 16:28:44 -0700 Subject: [PATCH 40/41] Adding runtime check to ensure that the correct frustum is fetched during rendering --- interface/src/Application.cpp | 19 +++++++++++++++++++ interface/src/Application.h | 4 ++-- interface/src/ui/overlays/Overlays.cpp | 2 +- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 184d1bf940..24cf06e684 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2795,7 +2795,25 @@ QImage Application::renderAvatarBillboard() { return image; } + +static QThread * activeRenderingThread = nullptr; + +ViewFrustum* Application::getViewFrustum() { + if (QThread::currentThread() == activeRenderingThread) { + qWarning() << "Calling Application::getViewFrustum() from the active rendering thread, did you mean Application::getDisplayViewFrustum()?"; + } + return &_viewFrustum; +} + +ViewFrustum* Application::getDisplayViewFrustum() { + if (QThread::currentThread() != activeRenderingThread) { + qWarning() << "Calling Application::getDisplayViewFrustum() from outside the active rendering thread or outside rendering, did you mean Application::getViewFrustum()?"; + } + return &_displayViewFrustum; +} + void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs::RenderSide renderSide) { + activeRenderingThread = QThread::currentThread(); PROFILE_RANGE(__FUNCTION__); PerformanceTimer perfTimer("display"); PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide()"); @@ -3020,6 +3038,7 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs glClear(GL_DEPTH_BUFFER_BIT); _overlays.renderWorld(true); } + activeRenderingThread = nullptr; } void Application::updateUntranslatedViewMatrix(const glm::vec3& viewMatrixTranslation) { diff --git a/interface/src/Application.h b/interface/src/Application.h index a200e56d74..ae68374fed 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -175,11 +175,11 @@ public: Camera* getCamera() { return &_myCamera; } // Represents the current view frustum of the avatar. - ViewFrustum* getViewFrustum() { return &_viewFrustum; } + ViewFrustum* getViewFrustum(); // Represents the view frustum of the current rendering pass, // which might be different from the viewFrustum, i.e. shadowmap // passes, mirror window passes, etc - ViewFrustum* getDisplayViewFrustum() { return &_displayViewFrustum; } + ViewFrustum* getDisplayViewFrustum(); ViewFrustum* getShadowViewFrustum() { return &_shadowViewFrustum; } const OctreePacketProcessor& getOctreePacketProcessor() const { return _octreeProcessor; } EntityTreeRenderer* getEntities() { return &_entities; } diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index c7b350f100..158deb00ff 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -122,7 +122,7 @@ void Overlays::renderWorld(bool drawFront, RenderArgs::RenderMode renderMode, Re float myAvatarScale = 1.0f; auto lodManager = DependencyManager::get(); - RenderArgs args = { NULL, Application::getInstance()->getViewFrustum(), + RenderArgs args = { NULL, Application::getInstance()->getDisplayViewFrustum(), lodManager->getOctreeSizeScale(), lodManager->getBoundaryLevelAdjust(), renderMode, renderSide, From 1662230289e45fe09ebfa3414c192fd978262eb7 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 17 Mar 2015 16:44:29 -0700 Subject: [PATCH 41/41] Adding some fixmes to the code, since globals are evil and such checks should be confined to debug mode only --- interface/src/Application.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 24cf06e684..0ed4495034 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2795,11 +2795,12 @@ QImage Application::renderAvatarBillboard() { return image; } - +// FIXME, preprocessor guard this check to occur only in DEBUG builds static QThread * activeRenderingThread = nullptr; ViewFrustum* Application::getViewFrustum() { if (QThread::currentThread() == activeRenderingThread) { + // FIXME, should this be an assert? qWarning() << "Calling Application::getViewFrustum() from the active rendering thread, did you mean Application::getDisplayViewFrustum()?"; } return &_viewFrustum; @@ -2807,6 +2808,7 @@ ViewFrustum* Application::getViewFrustum() { ViewFrustum* Application::getDisplayViewFrustum() { if (QThread::currentThread() != activeRenderingThread) { + // FIXME, should this be an assert? qWarning() << "Calling Application::getDisplayViewFrustum() from outside the active rendering thread or outside rendering, did you mean Application::getViewFrustum()?"; } return &_displayViewFrustum;