mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 23:09:52 +02:00
Cache more values in AnimSkeleton
This commit is contained in:
parent
e5e9ab42ea
commit
dc75894293
2 changed files with 25 additions and 20 deletions
|
@ -31,16 +31,15 @@ AnimSkeleton::AnimSkeleton(const std::vector<FBXJoint>& joints) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int AnimSkeleton::nameToJointIndex(const QString& jointName) const {
|
int AnimSkeleton::nameToJointIndex(const QString& jointName) const {
|
||||||
for (int i = 0; i < (int)_joints.size(); i++) {
|
auto itr = _jointIndicesByName.find(jointName);
|
||||||
if (_joints[i].name == jointName) {
|
if (_jointIndicesByName.end() == itr) {
|
||||||
return i;
|
return -1;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return -1;
|
return itr.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
int AnimSkeleton::getNumJoints() const {
|
int AnimSkeleton::getNumJoints() const {
|
||||||
return (int)_joints.size();
|
return _jointsSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
const AnimPose& AnimSkeleton::getAbsoluteBindPose(int jointIndex) const {
|
const AnimPose& AnimSkeleton::getAbsoluteBindPose(int jointIndex) const {
|
||||||
|
@ -78,7 +77,7 @@ const QString& AnimSkeleton::getJointName(int jointIndex) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
AnimPose AnimSkeleton::getAbsolutePose(int jointIndex, const AnimPoseVec& poses) const {
|
AnimPose AnimSkeleton::getAbsolutePose(int jointIndex, const AnimPoseVec& poses) const {
|
||||||
if (jointIndex < 0 || jointIndex >= (int)poses.size() || jointIndex >= (int)_joints.size()) {
|
if (jointIndex < 0 || jointIndex >= (int)poses.size() || jointIndex >= _jointsSize) {
|
||||||
return AnimPose::identity;
|
return AnimPose::identity;
|
||||||
} else {
|
} else {
|
||||||
return getAbsolutePose(_joints[jointIndex].parentIndex, poses) * poses[jointIndex];
|
return getAbsolutePose(_joints[jointIndex].parentIndex, poses) * poses[jointIndex];
|
||||||
|
@ -87,7 +86,7 @@ AnimPose AnimSkeleton::getAbsolutePose(int jointIndex, const AnimPoseVec& poses)
|
||||||
|
|
||||||
void AnimSkeleton::convertRelativePosesToAbsolute(AnimPoseVec& poses) const {
|
void AnimSkeleton::convertRelativePosesToAbsolute(AnimPoseVec& poses) const {
|
||||||
// poses start off relative and leave in absolute frame
|
// poses start off relative and leave in absolute frame
|
||||||
int lastIndex = std::min((int)poses.size(), (int)_joints.size());
|
int lastIndex = std::min((int)poses.size(), _jointsSize);
|
||||||
for (int i = 0; i < lastIndex; ++i) {
|
for (int i = 0; i < lastIndex; ++i) {
|
||||||
int parentIndex = _joints[i].parentIndex;
|
int parentIndex = _joints[i].parentIndex;
|
||||||
if (parentIndex != -1) {
|
if (parentIndex != -1) {
|
||||||
|
@ -98,7 +97,7 @@ void AnimSkeleton::convertRelativePosesToAbsolute(AnimPoseVec& poses) const {
|
||||||
|
|
||||||
void AnimSkeleton::convertAbsolutePosesToRelative(AnimPoseVec& poses) const {
|
void AnimSkeleton::convertAbsolutePosesToRelative(AnimPoseVec& poses) const {
|
||||||
// poses start off absolute and leave in relative frame
|
// poses start off absolute and leave in relative frame
|
||||||
int lastIndex = std::min((int)poses.size(), (int)_joints.size());
|
int lastIndex = std::min((int)poses.size(), _jointsSize);
|
||||||
for (int i = lastIndex - 1; i >= 0; --i) {
|
for (int i = lastIndex - 1; i >= 0; --i) {
|
||||||
int parentIndex = _joints[i].parentIndex;
|
int parentIndex = _joints[i].parentIndex;
|
||||||
if (parentIndex != -1) {
|
if (parentIndex != -1) {
|
||||||
|
@ -109,7 +108,7 @@ void AnimSkeleton::convertAbsolutePosesToRelative(AnimPoseVec& poses) const {
|
||||||
|
|
||||||
void AnimSkeleton::convertAbsoluteRotationsToRelative(std::vector<glm::quat>& rotations) const {
|
void AnimSkeleton::convertAbsoluteRotationsToRelative(std::vector<glm::quat>& rotations) const {
|
||||||
// poses start off absolute and leave in relative frame
|
// poses start off absolute and leave in relative frame
|
||||||
int lastIndex = std::min((int)rotations.size(), (int)_joints.size());
|
int lastIndex = std::min((int)rotations.size(), _jointsSize);
|
||||||
for (int i = lastIndex - 1; i >= 0; --i) {
|
for (int i = lastIndex - 1; i >= 0; --i) {
|
||||||
int parentIndex = _joints[i].parentIndex;
|
int parentIndex = _joints[i].parentIndex;
|
||||||
if (parentIndex != -1) {
|
if (parentIndex != -1) {
|
||||||
|
@ -149,19 +148,19 @@ void AnimSkeleton::mirrorAbsolutePoses(AnimPoseVec& poses) const {
|
||||||
|
|
||||||
void AnimSkeleton::buildSkeletonFromJoints(const std::vector<FBXJoint>& joints) {
|
void AnimSkeleton::buildSkeletonFromJoints(const std::vector<FBXJoint>& joints) {
|
||||||
_joints = joints;
|
_joints = joints;
|
||||||
|
_jointsSize = (int)joints.size();
|
||||||
// build a cache of bind poses
|
// build a cache of bind poses
|
||||||
_absoluteBindPoses.reserve(joints.size());
|
_absoluteBindPoses.reserve(_jointsSize);
|
||||||
_relativeBindPoses.reserve(joints.size());
|
_relativeBindPoses.reserve(_jointsSize);
|
||||||
|
|
||||||
// build a chache of default poses
|
// build a chache of default poses
|
||||||
_absoluteDefaultPoses.reserve(joints.size());
|
_absoluteDefaultPoses.reserve(_jointsSize);
|
||||||
_relativeDefaultPoses.reserve(joints.size());
|
_relativeDefaultPoses.reserve(_jointsSize);
|
||||||
_relativePreRotationPoses.reserve(joints.size());
|
_relativePreRotationPoses.reserve(_jointsSize);
|
||||||
_relativePostRotationPoses.reserve(joints.size());
|
_relativePostRotationPoses.reserve(_jointsSize);
|
||||||
|
|
||||||
// iterate over FBXJoints and extract the bind pose information.
|
// iterate over FBXJoints and extract the bind pose information.
|
||||||
for (int i = 0; i < (int)joints.size(); i++) {
|
for (int i = 0; i < _jointsSize; i++) {
|
||||||
|
|
||||||
// build pre and post transforms
|
// build pre and post transforms
|
||||||
glm::mat4 preRotationTransform = _joints[i].preTransform * glm::mat4_cast(_joints[i].preRotation);
|
glm::mat4 preRotationTransform = _joints[i].preTransform * glm::mat4_cast(_joints[i].preRotation);
|
||||||
|
@ -205,8 +204,8 @@ void AnimSkeleton::buildSkeletonFromJoints(const std::vector<FBXJoint>& joints)
|
||||||
|
|
||||||
// build mirror map.
|
// build mirror map.
|
||||||
_nonMirroredIndices.clear();
|
_nonMirroredIndices.clear();
|
||||||
_mirrorMap.reserve(_joints.size());
|
_mirrorMap.reserve(_jointsSize);
|
||||||
for (int i = 0; i < (int)joints.size(); i++) {
|
for (int i = 0; i < _jointsSize; i++) {
|
||||||
if (_joints[i].name.endsWith("tEye")) {
|
if (_joints[i].name.endsWith("tEye")) {
|
||||||
// HACK: we don't want to mirror some joints so we remember their indices
|
// HACK: we don't want to mirror some joints so we remember their indices
|
||||||
// so we can restore them after a future mirror operation
|
// so we can restore them after a future mirror operation
|
||||||
|
@ -226,6 +225,10 @@ void AnimSkeleton::buildSkeletonFromJoints(const std::vector<FBXJoint>& joints)
|
||||||
_mirrorMap.push_back(i);
|
_mirrorMap.push_back(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < _jointsSize; i++) {
|
||||||
|
_jointIndicesByName[_joints[i].name] = i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimSkeleton::dump(bool verbose) const {
|
void AnimSkeleton::dump(bool verbose) const {
|
||||||
|
|
|
@ -70,6 +70,7 @@ protected:
|
||||||
void buildSkeletonFromJoints(const std::vector<FBXJoint>& joints);
|
void buildSkeletonFromJoints(const std::vector<FBXJoint>& joints);
|
||||||
|
|
||||||
std::vector<FBXJoint> _joints;
|
std::vector<FBXJoint> _joints;
|
||||||
|
int _jointsSize { 0 };
|
||||||
AnimPoseVec _absoluteBindPoses;
|
AnimPoseVec _absoluteBindPoses;
|
||||||
AnimPoseVec _relativeBindPoses;
|
AnimPoseVec _relativeBindPoses;
|
||||||
AnimPoseVec _relativeDefaultPoses;
|
AnimPoseVec _relativeDefaultPoses;
|
||||||
|
@ -79,6 +80,7 @@ protected:
|
||||||
mutable AnimPoseVec _nonMirroredPoses;
|
mutable AnimPoseVec _nonMirroredPoses;
|
||||||
std::vector<int> _nonMirroredIndices;
|
std::vector<int> _nonMirroredIndices;
|
||||||
std::vector<int> _mirrorMap;
|
std::vector<int> _mirrorMap;
|
||||||
|
QHash<QString, int> _jointIndicesByName;
|
||||||
|
|
||||||
// no copies
|
// no copies
|
||||||
AnimSkeleton(const AnimSkeleton&) = delete;
|
AnimSkeleton(const AnimSkeleton&) = delete;
|
||||||
|
|
Loading…
Reference in a new issue