mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-08 21:17:08 +02:00
Merge pull request #12188 from hyperlogic/feature/small-anim-refactor
Remove dangerous "Use Anim Pre and Post Rotations" menu item
This commit is contained in:
commit
33c586de60
16 changed files with 6 additions and 206 deletions
|
@ -574,8 +574,6 @@ Menu::Menu() {
|
||||||
avatar.get(), SLOT(setEnableMeshVisible(bool)));
|
avatar.get(), SLOT(setEnableMeshVisible(bool)));
|
||||||
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::DisableEyelidAdjustment, 0, false);
|
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::DisableEyelidAdjustment, 0, false);
|
||||||
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::TurnWithHead, 0, false);
|
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::TurnWithHead, 0, false);
|
||||||
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::UseAnimPreAndPostRotations, 0, true,
|
|
||||||
avatar.get(), SLOT(setUseAnimPreAndPostRotations(bool)));
|
|
||||||
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::EnableInverseKinematics, 0, true,
|
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::EnableInverseKinematics, 0, true,
|
||||||
avatar.get(), SLOT(setEnableInverseKinematics(bool)));
|
avatar.get(), SLOT(setEnableInverseKinematics(bool)));
|
||||||
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderSensorToWorldMatrix, 0, false,
|
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderSensorToWorldMatrix, 0, false,
|
||||||
|
|
|
@ -194,7 +194,6 @@ namespace MenuOption {
|
||||||
const QString TurnWithHead = "Turn using Head";
|
const QString TurnWithHead = "Turn using Head";
|
||||||
const QString UseAudioForMouth = "Use Audio for Mouth";
|
const QString UseAudioForMouth = "Use Audio for Mouth";
|
||||||
const QString UseCamera = "Use Camera";
|
const QString UseCamera = "Use Camera";
|
||||||
const QString UseAnimPreAndPostRotations = "Use Anim Pre and Post Rotations";
|
|
||||||
const QString VelocityFilter = "Velocity Filter";
|
const QString VelocityFilter = "Velocity Filter";
|
||||||
const QString VisibleToEveryone = "Everyone";
|
const QString VisibleToEveryone = "Everyone";
|
||||||
const QString VisibleToFriends = "Friends";
|
const QString VisibleToFriends = "Friends";
|
||||||
|
|
|
@ -1062,11 +1062,6 @@ void MyAvatar::setEnableMeshVisible(bool isEnabled) {
|
||||||
_skeletonModel->setVisibleInScene(isEnabled, qApp->getMain3DScene());
|
_skeletonModel->setVisibleInScene(isEnabled, qApp->getMain3DScene());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyAvatar::setUseAnimPreAndPostRotations(bool isEnabled) {
|
|
||||||
AnimClip::usePreAndPostPoseFromAnim = isEnabled;
|
|
||||||
reset(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MyAvatar::setEnableInverseKinematics(bool isEnabled) {
|
void MyAvatar::setEnableInverseKinematics(bool isEnabled) {
|
||||||
_skeletonModel->getRig().setEnableInverseKinematics(isEnabled);
|
_skeletonModel->getRig().setEnableInverseKinematics(isEnabled);
|
||||||
}
|
}
|
||||||
|
|
|
@ -594,7 +594,6 @@ public slots:
|
||||||
|
|
||||||
bool getEnableMeshVisible() const { return _skeletonModel->isVisible(); }
|
bool getEnableMeshVisible() const { return _skeletonModel->isVisible(); }
|
||||||
void setEnableMeshVisible(bool isEnabled);
|
void setEnableMeshVisible(bool isEnabled);
|
||||||
void setUseAnimPreAndPostRotations(bool isEnabled);
|
|
||||||
void setEnableInverseKinematics(bool isEnabled);
|
void setEnableInverseKinematics(bool isEnabled);
|
||||||
|
|
||||||
QUrl getAnimGraphOverrideUrl() const; // thread-safe
|
QUrl getAnimGraphOverrideUrl() const; // thread-safe
|
||||||
|
|
|
@ -13,8 +13,6 @@
|
||||||
#include "AnimationLogging.h"
|
#include "AnimationLogging.h"
|
||||||
#include "AnimUtil.h"
|
#include "AnimUtil.h"
|
||||||
|
|
||||||
bool AnimClip::usePreAndPostPoseFromAnim = true;
|
|
||||||
|
|
||||||
AnimClip::AnimClip(const QString& id, const QString& url, float startFrame, float endFrame, float timeScale, bool loopFlag, bool mirrorFlag) :
|
AnimClip::AnimClip(const QString& id, const QString& url, float startFrame, float endFrame, float timeScale, bool loopFlag, bool mirrorFlag) :
|
||||||
AnimNode(AnimNode::Type::Clip, id),
|
AnimNode(AnimNode::Type::Clip, id),
|
||||||
_startFrame(startFrame),
|
_startFrame(startFrame),
|
||||||
|
@ -138,14 +136,8 @@ void AnimClip::copyFromNetworkAnim() {
|
||||||
if (skeletonJoint >= 0 && skeletonJoint < skeletonJointCount) {
|
if (skeletonJoint >= 0 && skeletonJoint < skeletonJointCount) {
|
||||||
|
|
||||||
AnimPose preRot, postRot;
|
AnimPose preRot, postRot;
|
||||||
if (usePreAndPostPoseFromAnim) {
|
preRot = animSkeleton.getPreRotationPose(animJoint);
|
||||||
preRot = animSkeleton.getPreRotationPose(animJoint);
|
postRot = animSkeleton.getPostRotationPose(animJoint);
|
||||||
postRot = animSkeleton.getPostRotationPose(animJoint);
|
|
||||||
} else {
|
|
||||||
// In order to support Blender, which does not have preRotation FBX support, we use the models defaultPose as the reference frame for the animations.
|
|
||||||
preRot = AnimPose(glm::vec3(1.0f), _skeleton->getRelativeBindPose(skeletonJoint).rot(), glm::vec3());
|
|
||||||
postRot = AnimPose::identity;
|
|
||||||
}
|
|
||||||
|
|
||||||
// cancel out scale
|
// cancel out scale
|
||||||
preRot.scale() = glm::vec3(1.0f);
|
preRot.scale() = glm::vec3(1.0f);
|
||||||
|
|
|
@ -25,8 +25,6 @@ class AnimClip : public AnimNode {
|
||||||
public:
|
public:
|
||||||
friend class AnimTests;
|
friend class AnimTests;
|
||||||
|
|
||||||
static bool usePreAndPostPoseFromAnim;
|
|
||||||
|
|
||||||
AnimClip(const QString& id, const QString& url, float startFrame, float endFrame, float timeScale, bool loopFlag, bool mirrorFlag);
|
AnimClip(const QString& id, const QString& url, float startFrame, float endFrame, float timeScale, bool loopFlag, bool mirrorFlag);
|
||||||
virtual ~AnimClip() override;
|
virtual ~AnimClip() override;
|
||||||
|
|
||||||
|
|
|
@ -1255,7 +1255,7 @@ void AnimInverseKinematics::initConstraints() {
|
||||||
// / /
|
// / /
|
||||||
// O--O O--O
|
// O--O O--O
|
||||||
|
|
||||||
loadDefaultPoses(_skeleton->getRelativeBindPoses());
|
loadDefaultPoses(_skeleton->getRelativeDefaultPoses());
|
||||||
|
|
||||||
int numJoints = (int)_defaultRelativePoses.size();
|
int numJoints = (int)_defaultRelativePoses.size();
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ AnimManipulator::~AnimManipulator() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const AnimPoseVec& AnimManipulator::evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) {
|
const AnimPoseVec& AnimManipulator::evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) {
|
||||||
return overlay(animVars, context, dt, triggersOut, _skeleton->getRelativeBindPoses());
|
return overlay(animVars, context, dt, triggersOut, _skeleton->getRelativeDefaultPoses());
|
||||||
}
|
}
|
||||||
|
|
||||||
const AnimPoseVec& AnimManipulator::overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) {
|
const AnimPoseVec& AnimManipulator::overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) {
|
||||||
|
|
|
@ -56,14 +56,6 @@ int AnimSkeleton::getChainDepth(int jointIndex) const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const AnimPose& AnimSkeleton::getAbsoluteBindPose(int jointIndex) const {
|
|
||||||
return _absoluteBindPoses[jointIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
const AnimPose& AnimSkeleton::getRelativeBindPose(int jointIndex) const {
|
|
||||||
return _relativeBindPoses[jointIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
const AnimPose& AnimSkeleton::getRelativeDefaultPose(int jointIndex) const {
|
const AnimPose& AnimSkeleton::getRelativeDefaultPose(int jointIndex) const {
|
||||||
return _relativeDefaultPoses[jointIndex];
|
return _relativeDefaultPoses[jointIndex];
|
||||||
}
|
}
|
||||||
|
@ -164,8 +156,6 @@ void AnimSkeleton::buildSkeletonFromJoints(const std::vector<FBXJoint>& joints)
|
||||||
_joints = joints;
|
_joints = joints;
|
||||||
_jointsSize = (int)joints.size();
|
_jointsSize = (int)joints.size();
|
||||||
// build a cache of bind poses
|
// build a cache of bind poses
|
||||||
_absoluteBindPoses.reserve(_jointsSize);
|
|
||||||
_relativeBindPoses.reserve(_jointsSize);
|
|
||||||
|
|
||||||
// build a chache of default poses
|
// build a chache of default poses
|
||||||
_absoluteDefaultPoses.reserve(_jointsSize);
|
_absoluteDefaultPoses.reserve(_jointsSize);
|
||||||
|
@ -192,28 +182,6 @@ void AnimSkeleton::buildSkeletonFromJoints(const std::vector<FBXJoint>& joints)
|
||||||
} else {
|
} else {
|
||||||
_absoluteDefaultPoses.push_back(relDefaultPose);
|
_absoluteDefaultPoses.push_back(relDefaultPose);
|
||||||
}
|
}
|
||||||
|
|
||||||
// build relative and absolute bind poses
|
|
||||||
if (_joints[i].bindTransformFoundInCluster) {
|
|
||||||
// Use the FBXJoint::bindTransform, which is absolute model coordinates
|
|
||||||
// i.e. not relative to it's parent.
|
|
||||||
AnimPose absoluteBindPose(_joints[i].bindTransform);
|
|
||||||
_absoluteBindPoses.push_back(absoluteBindPose);
|
|
||||||
if (parentIndex >= 0) {
|
|
||||||
AnimPose inverseParentAbsoluteBindPose = _absoluteBindPoses[parentIndex].inverse();
|
|
||||||
_relativeBindPoses.push_back(inverseParentAbsoluteBindPose * absoluteBindPose);
|
|
||||||
} else {
|
|
||||||
_relativeBindPoses.push_back(absoluteBindPose);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// use default transform instead
|
|
||||||
_relativeBindPoses.push_back(relDefaultPose);
|
|
||||||
if (parentIndex >= 0) {
|
|
||||||
_absoluteBindPoses.push_back(_absoluteBindPoses[parentIndex] * relDefaultPose);
|
|
||||||
} else {
|
|
||||||
_absoluteBindPoses.push_back(relDefaultPose);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < _jointsSize; i++) {
|
for (int i = 0; i < _jointsSize; i++) {
|
||||||
|
@ -251,8 +219,6 @@ void AnimSkeleton::dump(bool verbose) const {
|
||||||
qCDebug(animation) << " {";
|
qCDebug(animation) << " {";
|
||||||
qCDebug(animation) << " index =" << i;
|
qCDebug(animation) << " index =" << i;
|
||||||
qCDebug(animation) << " name =" << getJointName(i);
|
qCDebug(animation) << " name =" << getJointName(i);
|
||||||
qCDebug(animation) << " absBindPose =" << getAbsoluteBindPose(i);
|
|
||||||
qCDebug(animation) << " relBindPose =" << getRelativeBindPose(i);
|
|
||||||
qCDebug(animation) << " absDefaultPose =" << getAbsoluteDefaultPose(i);
|
qCDebug(animation) << " absDefaultPose =" << getAbsoluteDefaultPose(i);
|
||||||
qCDebug(animation) << " relDefaultPose =" << getRelativeDefaultPose(i);
|
qCDebug(animation) << " relDefaultPose =" << getRelativeDefaultPose(i);
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
|
@ -287,8 +253,6 @@ void AnimSkeleton::dump(const AnimPoseVec& poses) const {
|
||||||
qCDebug(animation) << " {";
|
qCDebug(animation) << " {";
|
||||||
qCDebug(animation) << " index =" << i;
|
qCDebug(animation) << " index =" << i;
|
||||||
qCDebug(animation) << " name =" << getJointName(i);
|
qCDebug(animation) << " name =" << getJointName(i);
|
||||||
qCDebug(animation) << " absBindPose =" << getAbsoluteBindPose(i);
|
|
||||||
qCDebug(animation) << " relBindPose =" << getRelativeBindPose(i);
|
|
||||||
qCDebug(animation) << " absDefaultPose =" << getAbsoluteDefaultPose(i);
|
qCDebug(animation) << " absDefaultPose =" << getAbsoluteDefaultPose(i);
|
||||||
qCDebug(animation) << " relDefaultPose =" << getRelativeDefaultPose(i);
|
qCDebug(animation) << " relDefaultPose =" << getRelativeDefaultPose(i);
|
||||||
qCDebug(animation) << " pose =" << poses[i];
|
qCDebug(animation) << " pose =" << poses[i];
|
||||||
|
|
|
@ -30,13 +30,6 @@ public:
|
||||||
int getNumJoints() const;
|
int getNumJoints() const;
|
||||||
int getChainDepth(int jointIndex) const;
|
int getChainDepth(int jointIndex) const;
|
||||||
|
|
||||||
// absolute pose, not relative to parent
|
|
||||||
const AnimPose& getAbsoluteBindPose(int jointIndex) const;
|
|
||||||
|
|
||||||
// relative to parent pose
|
|
||||||
const AnimPose& getRelativeBindPose(int jointIndex) const;
|
|
||||||
const AnimPoseVec& getRelativeBindPoses() const { return _relativeBindPoses; }
|
|
||||||
|
|
||||||
// the default poses are the orientations of the joints on frame 0.
|
// the default poses are the orientations of the joints on frame 0.
|
||||||
const AnimPose& getRelativeDefaultPose(int jointIndex) const;
|
const AnimPose& getRelativeDefaultPose(int jointIndex) const;
|
||||||
const AnimPoseVec& getRelativeDefaultPoses() const { return _relativeDefaultPoses; }
|
const AnimPoseVec& getRelativeDefaultPoses() const { return _relativeDefaultPoses; }
|
||||||
|
@ -72,8 +65,6 @@ protected:
|
||||||
|
|
||||||
std::vector<FBXJoint> _joints;
|
std::vector<FBXJoint> _joints;
|
||||||
int _jointsSize { 0 };
|
int _jointsSize { 0 };
|
||||||
AnimPoseVec _absoluteBindPoses;
|
|
||||||
AnimPoseVec _relativeBindPoses;
|
|
||||||
AnimPoseVec _relativeDefaultPoses;
|
AnimPoseVec _relativeDefaultPoses;
|
||||||
AnimPoseVec _absoluteDefaultPoses;
|
AnimPoseVec _absoluteDefaultPoses;
|
||||||
AnimPoseVec _relativePreRotationPoses;
|
AnimPoseVec _relativePreRotationPoses;
|
||||||
|
|
|
@ -179,7 +179,7 @@ void Rig::restoreRoleAnimation(const QString& role) {
|
||||||
} else {
|
} else {
|
||||||
qCWarning(animation) << "Rig::restoreRoleAnimation could not find role " << role;
|
qCWarning(animation) << "Rig::restoreRoleAnimation could not find role " << role;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto statesIter = _roleAnimStates.find(role);
|
auto statesIter = _roleAnimStates.find(role);
|
||||||
if (statesIter != _roleAnimStates.end()) {
|
if (statesIter != _roleAnimStates.end()) {
|
||||||
_roleAnimStates.erase(statesIter);
|
_roleAnimStates.erase(statesIter);
|
||||||
|
@ -1050,52 +1050,6 @@ void Rig::updateAnimations(float deltaTime, const glm::mat4& rootTransform, cons
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rig::inverseKinematics(int endIndex, glm::vec3 targetPosition, const glm::quat& targetRotation, float priority,
|
|
||||||
const QVector<int>& freeLineage, glm::mat4 rootTransform) {
|
|
||||||
ASSERT(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Rig::restoreJointPosition(int jointIndex, float fraction, float priority, const QVector<int>& freeLineage) {
|
|
||||||
ASSERT(false);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
float Rig::getLimbLength(int jointIndex, const QVector<int>& freeLineage,
|
|
||||||
const glm::vec3 scale, const QVector<FBXJoint>& fbxJoints) const {
|
|
||||||
ASSERT(false);
|
|
||||||
return 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::quat Rig::setJointRotationInBindFrame(int jointIndex, const glm::quat& rotation, float priority) {
|
|
||||||
ASSERT(false);
|
|
||||||
return glm::quat();
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::vec3 Rig::getJointDefaultTranslationInConstrainedFrame(int jointIndex) {
|
|
||||||
ASSERT(false);
|
|
||||||
return glm::vec3();
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::quat Rig::setJointRotationInConstrainedFrame(int jointIndex, glm::quat targetRotation, float priority, float mix) {
|
|
||||||
ASSERT(false);
|
|
||||||
return glm::quat();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Rig::getJointRotationInConstrainedFrame(int jointIndex, glm::quat& quatOut) const {
|
|
||||||
ASSERT(false);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Rig::clearJointStatePriorities() {
|
|
||||||
ASSERT(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::quat Rig::getJointDefaultRotationInParentFrame(int jointIndex) {
|
|
||||||
ASSERT(false);
|
|
||||||
return glm::quat();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Rig::updateFromEyeParameters(const EyeParameters& params) {
|
void Rig::updateFromEyeParameters(const EyeParameters& params) {
|
||||||
updateEyeJoint(params.leftEyeJointIndex, params.modelTranslation, params.modelRotation, params.eyeLookAt, params.eyeSaccade);
|
updateEyeJoint(params.leftEyeJointIndex, params.modelTranslation, params.modelRotation, params.eyeLookAt, params.eyeSaccade);
|
||||||
updateEyeJoint(params.rightEyeJointIndex, params.modelTranslation, params.modelRotation, params.eyeLookAt, params.eyeSaccade);
|
updateEyeJoint(params.rightEyeJointIndex, params.modelTranslation, params.modelRotation, params.eyeLookAt, params.eyeSaccade);
|
||||||
|
|
|
@ -172,36 +172,6 @@ public:
|
||||||
// Regardless of who started the animations or how many, update the joints.
|
// Regardless of who started the animations or how many, update the joints.
|
||||||
void updateAnimations(float deltaTime, const glm::mat4& rootTransform, const glm::mat4& rigToWorldTransform);
|
void updateAnimations(float deltaTime, const glm::mat4& rootTransform, const glm::mat4& rigToWorldTransform);
|
||||||
|
|
||||||
// legacy
|
|
||||||
void inverseKinematics(int endIndex, glm::vec3 targetPosition, const glm::quat& targetRotation, float priority,
|
|
||||||
const QVector<int>& freeLineage, glm::mat4 rootTransform);
|
|
||||||
|
|
||||||
// legacy
|
|
||||||
bool restoreJointPosition(int jointIndex, float fraction, float priority, const QVector<int>& freeLineage);
|
|
||||||
|
|
||||||
// legacy
|
|
||||||
float getLimbLength(int jointIndex, const QVector<int>& freeLineage,
|
|
||||||
const glm::vec3 scale, const QVector<FBXJoint>& fbxJoints) const;
|
|
||||||
|
|
||||||
// legacy
|
|
||||||
glm::quat setJointRotationInBindFrame(int jointIndex, const glm::quat& rotation, float priority);
|
|
||||||
|
|
||||||
// legacy
|
|
||||||
glm::vec3 getJointDefaultTranslationInConstrainedFrame(int jointIndex);
|
|
||||||
|
|
||||||
// legacy
|
|
||||||
glm::quat setJointRotationInConstrainedFrame(int jointIndex, glm::quat targetRotation,
|
|
||||||
float priority, float mix = 1.0f);
|
|
||||||
|
|
||||||
// legacy
|
|
||||||
bool getJointRotationInConstrainedFrame(int jointIndex, glm::quat& rotOut) const;
|
|
||||||
|
|
||||||
// legacy
|
|
||||||
glm::quat getJointDefaultRotationInParentFrame(int jointIndex);
|
|
||||||
|
|
||||||
// legacy
|
|
||||||
void clearJointStatePriorities();
|
|
||||||
|
|
||||||
void updateFromControllerParameters(const ControllerParameters& params, float dt);
|
void updateFromControllerParameters(const ControllerParameters& params, float dt);
|
||||||
void updateFromEyeParameters(const EyeParameters& params);
|
void updateFromEyeParameters(const EyeParameters& params);
|
||||||
|
|
||||||
|
@ -345,7 +315,7 @@ protected:
|
||||||
float firstFrame;
|
float firstFrame;
|
||||||
float lastFrame;
|
float lastFrame;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RoleAnimState {
|
struct RoleAnimState {
|
||||||
RoleAnimState() {}
|
RoleAnimState() {}
|
||||||
RoleAnimState(const QString& roleId, const QString& urlIn, float fpsIn, bool loopIn, float firstFrameIn, float lastFrameIn) :
|
RoleAnimState(const QString& roleId, const QString& urlIn, float fpsIn, bool loopIn, float firstFrameIn, float lastFrameIn) :
|
||||||
|
|
|
@ -237,30 +237,14 @@ bool SkeletonModel::getRightHandPosition(glm::vec3& position) const {
|
||||||
return getJointPositionInWorldFrame(getRightHandJointIndex(), position);
|
return getJointPositionInWorldFrame(getRightHandJointIndex(), position);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SkeletonModel::restoreLeftHandPosition(float fraction, float priority) {
|
|
||||||
return restoreJointPosition(getLeftHandJointIndex(), fraction, priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SkeletonModel::getLeftShoulderPosition(glm::vec3& position) const {
|
bool SkeletonModel::getLeftShoulderPosition(glm::vec3& position) const {
|
||||||
return getJointPositionInWorldFrame(getLastFreeJointIndex(getLeftHandJointIndex()), position);
|
return getJointPositionInWorldFrame(getLastFreeJointIndex(getLeftHandJointIndex()), position);
|
||||||
}
|
}
|
||||||
|
|
||||||
float SkeletonModel::getLeftArmLength() const {
|
|
||||||
return getLimbLength(getLeftHandJointIndex());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SkeletonModel::restoreRightHandPosition(float fraction, float priority) {
|
|
||||||
return restoreJointPosition(getRightHandJointIndex(), fraction, priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SkeletonModel::getRightShoulderPosition(glm::vec3& position) const {
|
bool SkeletonModel::getRightShoulderPosition(glm::vec3& position) const {
|
||||||
return getJointPositionInWorldFrame(getLastFreeJointIndex(getRightHandJointIndex()), position);
|
return getJointPositionInWorldFrame(getLastFreeJointIndex(getRightHandJointIndex()), position);
|
||||||
}
|
}
|
||||||
|
|
||||||
float SkeletonModel::getRightArmLength() const {
|
|
||||||
return getLimbLength(getRightHandJointIndex());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SkeletonModel::getHeadPosition(glm::vec3& headPosition) const {
|
bool SkeletonModel::getHeadPosition(glm::vec3& headPosition) const {
|
||||||
return isActive() && getJointPositionInWorldFrame(getFBXGeometry().headJointIndex, headPosition);
|
return isActive() && getJointPositionInWorldFrame(getFBXGeometry().headJointIndex, headPosition);
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,11 +57,6 @@ public:
|
||||||
/// \return true whether or not the position was found
|
/// \return true whether or not the position was found
|
||||||
bool getRightHandPosition(glm::vec3& position) const;
|
bool getRightHandPosition(glm::vec3& position) const;
|
||||||
|
|
||||||
/// Restores some fraction of the default position of the left hand.
|
|
||||||
/// \param fraction the fraction of the default position to restore
|
|
||||||
/// \return whether or not the left hand joint was found
|
|
||||||
bool restoreLeftHandPosition(float fraction = 1.0f, float priority = 1.0f);
|
|
||||||
|
|
||||||
/// Gets the position of the left shoulder.
|
/// Gets the position of the left shoulder.
|
||||||
/// \return whether or not the left shoulder joint was found
|
/// \return whether or not the left shoulder joint was found
|
||||||
bool getLeftShoulderPosition(glm::vec3& position) const;
|
bool getLeftShoulderPosition(glm::vec3& position) const;
|
||||||
|
@ -69,18 +64,10 @@ public:
|
||||||
/// Returns the extended length from the left hand to its last free ancestor.
|
/// Returns the extended length from the left hand to its last free ancestor.
|
||||||
float getLeftArmLength() const;
|
float getLeftArmLength() const;
|
||||||
|
|
||||||
/// Restores some fraction of the default position of the right hand.
|
|
||||||
/// \param fraction the fraction of the default position to restore
|
|
||||||
/// \return whether or not the right hand joint was found
|
|
||||||
bool restoreRightHandPosition(float fraction = 1.0f, float priority = 1.0f);
|
|
||||||
|
|
||||||
/// Gets the position of the right shoulder.
|
/// Gets the position of the right shoulder.
|
||||||
/// \return whether or not the right shoulder joint was found
|
/// \return whether or not the right shoulder joint was found
|
||||||
bool getRightShoulderPosition(glm::vec3& position) const;
|
bool getRightShoulderPosition(glm::vec3& position) const;
|
||||||
|
|
||||||
/// Returns the extended length from the right hand to its first free ancestor.
|
|
||||||
float getRightArmLength() const;
|
|
||||||
|
|
||||||
/// Returns the position of the head joint.
|
/// Returns the position of the head joint.
|
||||||
/// \return whether or not the head was found
|
/// \return whether or not the head was found
|
||||||
bool getHeadPosition(glm::vec3& headPosition) const;
|
bool getHeadPosition(glm::vec3& headPosition) const;
|
||||||
|
|
|
@ -1265,25 +1265,6 @@ void Model::updateClusterMatrices() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::inverseKinematics(int endIndex, glm::vec3 targetPosition, const glm::quat& targetRotation, float priority) {
|
|
||||||
const FBXGeometry& geometry = getFBXGeometry();
|
|
||||||
const QVector<int>& freeLineage = geometry.joints.at(endIndex).freeLineage;
|
|
||||||
glm::mat4 parentTransform = glm::scale(_scale) * glm::translate(_offset);
|
|
||||||
_rig.inverseKinematics(endIndex, targetPosition, targetRotation, priority, freeLineage, parentTransform);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::restoreJointPosition(int jointIndex, float fraction, float priority) {
|
|
||||||
const FBXGeometry& geometry = getFBXGeometry();
|
|
||||||
const QVector<int>& freeLineage = geometry.joints.at(jointIndex).freeLineage;
|
|
||||||
return _rig.restoreJointPosition(jointIndex, fraction, priority, freeLineage);
|
|
||||||
}
|
|
||||||
|
|
||||||
float Model::getLimbLength(int jointIndex) const {
|
|
||||||
const FBXGeometry& geometry = getFBXGeometry();
|
|
||||||
const QVector<int>& freeLineage = geometry.joints.at(jointIndex).freeLineage;
|
|
||||||
return _rig.getLimbLength(jointIndex, freeLineage, _scale, geometry.joints);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::maybeStartBlender() {
|
bool Model::maybeStartBlender() {
|
||||||
if (isLoaded()) {
|
if (isLoaded()) {
|
||||||
const FBXGeometry& fbxGeometry = getFBXGeometry();
|
const FBXGeometry& fbxGeometry = getFBXGeometry();
|
||||||
|
|
|
@ -199,8 +199,6 @@ public:
|
||||||
/// Returns the index of the parent of the indexed joint, or -1 if not found.
|
/// Returns the index of the parent of the indexed joint, or -1 if not found.
|
||||||
int getParentJointIndex(int jointIndex) const;
|
int getParentJointIndex(int jointIndex) const;
|
||||||
|
|
||||||
void inverseKinematics(int jointIndex, glm::vec3 position, const glm::quat& rotation, float priority);
|
|
||||||
|
|
||||||
/// Returns the extents of the model in its bind pose.
|
/// Returns the extents of the model in its bind pose.
|
||||||
Extents getBindExtents() const;
|
Extents getBindExtents() const;
|
||||||
|
|
||||||
|
@ -376,16 +374,6 @@ protected:
|
||||||
void computeMeshPartLocalBounds();
|
void computeMeshPartLocalBounds();
|
||||||
virtual void updateRig(float deltaTime, glm::mat4 parentTransform);
|
virtual void updateRig(float deltaTime, glm::mat4 parentTransform);
|
||||||
|
|
||||||
/// Restores the indexed joint to its default position.
|
|
||||||
/// \param fraction the fraction of the default position to apply (i.e., 0.25f to slerp one fourth of the way to
|
|
||||||
/// the original position
|
|
||||||
/// \return true if the joint was found
|
|
||||||
bool restoreJointPosition(int jointIndex, float fraction = 1.0f, float priority = 0.0f);
|
|
||||||
|
|
||||||
/// Computes and returns the extended length of the limb terminating at the specified joint and starting at the joint's
|
|
||||||
/// first free ancestor.
|
|
||||||
float getLimbLength(int jointIndex) const;
|
|
||||||
|
|
||||||
/// Allow sub classes to force invalidating the bboxes
|
/// Allow sub classes to force invalidating the bboxes
|
||||||
void invalidCalculatedMeshBoxes() {
|
void invalidCalculatedMeshBoxes() {
|
||||||
_triangleSetsValid = false;
|
_triangleSetsValid = false;
|
||||||
|
|
Loading…
Reference in a new issue