mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 18:13:05 +02:00
faster math when unpacking JointData rotations
This commit is contained in:
parent
8ab6974233
commit
3f687887b9
1 changed files with 4 additions and 9 deletions
|
@ -1274,14 +1274,13 @@ void Rig::copyJointsFromJointData(const QVector<JointData>& jointDataVec) {
|
||||||
if (_animSkeleton && jointDataVec.size() == (int)_internalPoseSet._overrideFlags.size()) {
|
if (_animSkeleton && jointDataVec.size() == (int)_internalPoseSet._overrideFlags.size()) {
|
||||||
|
|
||||||
// transform all the default poses into rig space.
|
// transform all the default poses into rig space.
|
||||||
const AnimPose geometryToRigPose(_geometryToRigTransform);
|
|
||||||
std::vector<bool> overrideFlags(_internalPoseSet._overridePoses.size(), false);
|
std::vector<bool> overrideFlags(_internalPoseSet._overridePoses.size(), false);
|
||||||
|
|
||||||
// start with the default rotations in absolute rig frame
|
// start with the default rotations in absolute rig frame
|
||||||
std::vector<glm::quat> rotations;
|
std::vector<glm::quat> rotations;
|
||||||
rotations.reserve(_animSkeleton->getAbsoluteDefaultPoses().size());
|
rotations.reserve(_animSkeleton->getAbsoluteDefaultPoses().size());
|
||||||
for (auto& pose : _animSkeleton->getAbsoluteDefaultPoses()) {
|
for (auto& pose : _animSkeleton->getAbsoluteDefaultPoses()) {
|
||||||
rotations.push_back(geometryToRigPose.rot * pose.rot);
|
rotations.push_back(pose.rot);
|
||||||
}
|
}
|
||||||
|
|
||||||
// start translations in relative frame but scaled to meters.
|
// start translations in relative frame but scaled to meters.
|
||||||
|
@ -1294,12 +1293,14 @@ void Rig::copyJointsFromJointData(const QVector<JointData>& jointDataVec) {
|
||||||
ASSERT(overrideFlags.size() == rotations.size());
|
ASSERT(overrideFlags.size() == rotations.size());
|
||||||
|
|
||||||
// copy over rotations from the jointDataVec, which is also in absolute rig frame
|
// copy over rotations from the jointDataVec, which is also in absolute rig frame
|
||||||
|
const glm::quat rigToGeometryRot(glmExtractRotation(_rigToGeometryTransform));
|
||||||
for (int i = 0; i < jointDataVec.size(); i++) {
|
for (int i = 0; i < jointDataVec.size(); i++) {
|
||||||
if (isIndexValid(i)) {
|
if (isIndexValid(i)) {
|
||||||
const JointData& data = jointDataVec.at(i);
|
const JointData& data = jointDataVec.at(i);
|
||||||
if (data.rotationSet) {
|
if (data.rotationSet) {
|
||||||
overrideFlags[i] = true;
|
overrideFlags[i] = true;
|
||||||
rotations[i] = data.rotation;
|
// JointData rotations are in rig frame
|
||||||
|
rotations[i] = rigToGeometryRot * data.rotation;
|
||||||
}
|
}
|
||||||
if (data.translationSet) {
|
if (data.translationSet) {
|
||||||
overrideFlags[i] = true;
|
overrideFlags[i] = true;
|
||||||
|
@ -1310,12 +1311,6 @@ void Rig::copyJointsFromJointData(const QVector<JointData>& jointDataVec) {
|
||||||
|
|
||||||
ASSERT(_internalPoseSet._overrideFlags.size() == _internalPoseSet._overridePoses.size());
|
ASSERT(_internalPoseSet._overrideFlags.size() == _internalPoseSet._overridePoses.size());
|
||||||
|
|
||||||
// convert resulting rotations into geometry space.
|
|
||||||
const glm::quat rigToGeometryRot(glmExtractRotation(_rigToGeometryTransform));
|
|
||||||
for (auto& rot : rotations) {
|
|
||||||
rot = rigToGeometryRot * rot;
|
|
||||||
}
|
|
||||||
|
|
||||||
// convert all rotations from absolute to parent relative.
|
// convert all rotations from absolute to parent relative.
|
||||||
_animSkeleton->convertAbsoluteRotationsToRelative(rotations);
|
_animSkeleton->convertAbsoluteRotationsToRelative(rotations);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue