add getFlowData

This commit is contained in:
luiscuenca 2019-03-08 10:36:58 -07:00
parent fcf1e34175
commit e8da6b5a0c
4 changed files with 72 additions and 1 deletions

View file

@ -5331,9 +5331,13 @@ void MyAvatar::addAvatarHandsToFlow(const std::shared_ptr<Avatar>& 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<EntityTreeRenderer>();
EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr;

View file

@ -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

View file

@ -509,6 +509,7 @@ void Flow::calculateConstraints(const std::shared_ptr<AnimSkeleton>& skeleton,
auto flowJoint = FlowJoint(i, parentIndex, -1, name, group, jointSettings);
_flowJointData.insert(std::pair<int, FlowJoint>(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<QString, FlowPhysicsSettings>(group, settings));
} else {
_groupSettings[group] = settings;
}
}

View file

@ -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<FlowCollisionSphere>& getCollisions() const { return _selfCollisions; }
protected:
std::vector<FlowCollisionSphere> _selfCollisions;
std::vector<FlowCollisionSphere> _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<QString, FlowPhysicsSettings>& getGroupSettings() const { return _groupSettings; }
void cleanUp();
signals:
@ -309,6 +311,7 @@ private:
void setJoints(AnimPoseVec& relativePoses, const std::vector<bool>& 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<int, FlowJoint> _flowJointData;
std::map<QString, FlowPhysicsSettings> _groupSettings;
std::vector<FlowThread> _jointThreads;
std::vector<QString> _flowJointKeywords;
FlowCollisionSystem _collisionSystem;