From e8da6b5a0cf9c388f70ae9c04fabe26601fff944 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Fri, 8 Mar 2019 10:36:58 -0700 Subject: [PATCH] add getFlowData --- interface/src/avatar/MyAvatar.cpp | 57 ++++++++++++++++++++++++++++++- interface/src/avatar/MyAvatar.h | 2 ++ libraries/animation/src/Flow.cpp | 10 ++++++ libraries/animation/src/Flow.h | 4 +++ 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index faa9f88ae9..8d499cd8db 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -5331,9 +5331,13 @@ void MyAvatar::addAvatarHandsToFlow(const std::shared_ptr& otherAvatar) void MyAvatar::useFlow(bool isActive, bool isCollidable, const QVariantMap& physicsConfig, const QVariantMap& collisionsConfig) { if (_skeletonModel->isLoaded()) { - _skeletonModel->getRig().initFlow(isActive); auto &flow = _skeletonModel->getRig().getFlow(); auto &collisionSystem = flow.getCollisionSystem(); + if (!flow.isInitialized() && isActive) { + _skeletonModel->getRig().initFlow(true); + } else { + flow.setActive(isActive); + } collisionSystem.setActive(isCollidable); auto physicsGroups = physicsConfig.keys(); if (physicsGroups.size() > 0) { @@ -5384,6 +5388,57 @@ void MyAvatar::useFlow(bool isActive, bool isCollidable, const QVariantMap& phys } } +QVariantMap MyAvatar::getFlowData() { + QVariantMap flowData; + if (_skeletonModel->isLoaded()) { + auto jointNames = getJointNames(); + auto &flow = _skeletonModel->getRig().getFlow(); + auto &collisionSystem = flow.getCollisionSystem(); + bool initialized = flow.isInitialized(); + flowData.insert("initialized", initialized); + flowData.insert("active", flow.getActive()); + flowData.insert("colliding", collisionSystem.getActive()); + QVariantMap physicsData; + QVariantMap collisionsData; + QVariantMap threadData; + auto &groups = flow.getGroupSettings(); + for (auto &group : groups) { + QVariantMap settingsObject; + QString groupName = group.first; + FlowPhysicsSettings groupSettings = group.second; + settingsObject.insert("active", groupSettings._active); + settingsObject.insert("damping", groupSettings._damping); + settingsObject.insert("delta", groupSettings._delta); + settingsObject.insert("gravity", groupSettings._gravity); + settingsObject.insert("inertia", groupSettings._inertia); + settingsObject.insert("radius", groupSettings._radius); + settingsObject.insert("stiffness", groupSettings._stiffness); + physicsData.insert(groupName, settingsObject); + } + auto &collisions = collisionSystem.getCollisions(); + for (auto &collision : collisions) { + QVariantMap collisionObject; + collisionObject.insert("offset", vec3toVariant(collision._offset)); + collisionObject.insert("radius", collision._radius); + collisionObject.insert("jointIndex", collision._jointIndex); + QString jointName = jointNames.size() > collision._jointIndex ? jointNames[collision._jointIndex] : "unknown"; + collisionsData.insert(jointName, collisionObject); + } + int count = 0; + for (auto &thread : flow.getThreads()) { + QVariantList indices; + for (int index : thread._joints) { + indices.append(index); + } + threadData.insert(thread._jointsPointer->at(thread._joints[0]).getName(), indices); + } + flowData.insert("physics", physicsData); + flowData.insert("collisions", collisionsData); + flowData.insert("threads", threadData); + } + return flowData; +} + void MyAvatar::sendPacket(const QUuid& entityID, const EntityItemProperties& properties) const { auto treeRenderer = DependencyManager::get(); EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr; diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 2c8dedd430..26aea8bf6e 100755 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1198,6 +1198,8 @@ public: */ Q_INVOKABLE void useFlow(bool isActive, bool isCollidable, const QVariantMap& physicsConfig = QVariantMap(), const QVariantMap& collisionsConfig = QVariantMap()); + Q_INVOKABLE QVariantMap getFlowData(); + public slots: /**jsdoc diff --git a/libraries/animation/src/Flow.cpp b/libraries/animation/src/Flow.cpp index 3bb80b9375..ddc3354a2f 100644 --- a/libraries/animation/src/Flow.cpp +++ b/libraries/animation/src/Flow.cpp @@ -509,6 +509,7 @@ void Flow::calculateConstraints(const std::shared_ptr& skeleton, auto flowJoint = FlowJoint(i, parentIndex, -1, name, group, jointSettings); _flowJointData.insert(std::pair(i, flowJoint)); } + updateGroupSettings(group, jointSettings); } } else { if (PRESET_COLLISION_DATA.find(name) != PRESET_COLLISION_DATA.end()) { @@ -727,6 +728,7 @@ void Flow::setPhysicsSettingsForGroup(const QString& group, const FlowPhysicsSet joint.second.setSettings(settings); } } + updateGroupSettings(group, settings); } bool Flow::getJointPositionInWorldFrame(const AnimPoseVec& absolutePoses, int jointIndex, glm::vec3& position, glm::vec3 translation, glm::quat rotation) const { @@ -780,4 +782,12 @@ Flow& Flow::operator=(const Flow& otherFlow) { } } return *this; +} + +void Flow::updateGroupSettings(const QString& group, const FlowPhysicsSettings& settings) { + if (_groupSettings.find(group) != _groupSettings.end()) { + _groupSettings.insert(std::pair(group, settings)); + } else { + _groupSettings[group] = settings; + } } \ No newline at end of file diff --git a/libraries/animation/src/Flow.h b/libraries/animation/src/Flow.h index 35464e9420..d2eaaa22d9 100644 --- a/libraries/animation/src/Flow.h +++ b/libraries/animation/src/Flow.h @@ -149,6 +149,7 @@ public: void setCollisionSettingsByJoint(int jointIndex, const FlowCollisionSettings& settings); void setActive(bool active) { _active = active; } bool getActive() const { return _active; } + const std::vector& getCollisions() const { return _selfCollisions; } protected: std::vector _selfCollisions; std::vector _othersCollisions; @@ -293,6 +294,7 @@ public: void setOthersCollision(const QUuid& otherId, int jointIndex, const glm::vec3& position); FlowCollisionSystem& getCollisionSystem() { return _collisionSystem; } void setPhysicsSettingsForGroup(const QString& group, const FlowPhysicsSettings& settings); + const std::map& getGroupSettings() const { return _groupSettings; } void cleanUp(); signals: @@ -309,6 +311,7 @@ private: void setJoints(AnimPoseVec& relativePoses, const std::vector& overrideFlags); void updateJoints(AnimPoseVec& relativePoses, AnimPoseVec& absolutePoses); bool updateRootFramePositions(const AnimPoseVec& absolutePoses, size_t threadIndex); + void updateGroupSettings(const QString& group, const FlowPhysicsSettings& settings); void setScale(float scale); float _scale { 1.0f }; @@ -316,6 +319,7 @@ private: glm::vec3 _entityPosition; glm::quat _entityRotation; std::map _flowJointData; + std::map _groupSettings; std::vector _jointThreads; std::vector _flowJointKeywords; FlowCollisionSystem _collisionSystem;