mirror of
https://github.com/overte-org/overte.git
synced 2025-04-16 00:41:16 +02:00
This changes the avatar-animation json so that we have override
animations for the right and left hand, similar to how we have whole body override animations.
This commit is contained in:
parent
1d5f9cc0ec
commit
02d9331603
5 changed files with 2000 additions and 1136 deletions
File diff suppressed because it is too large
Load diff
|
@ -1188,6 +1188,15 @@ void MyAvatar::overrideAnimation(const QString& url, float fps, bool loop, float
|
|||
_skeletonModel->getRig().overrideAnimation(url, fps, loop, firstFrame, lastFrame);
|
||||
}
|
||||
|
||||
void MyAvatar::overrideHandAnimation(bool isLeft, const QString& url, float fps, bool loop, float firstFrame, float lastFrame) {
|
||||
if (QThread::currentThread() != thread()) {
|
||||
QMetaObject::invokeMethod(this, "overrideHandAnimation", Q_ARG(bool, isLeft), Q_ARG(const QString&, url), Q_ARG(float, fps),
|
||||
Q_ARG(bool, loop), Q_ARG(float, firstFrame), Q_ARG(float, lastFrame));
|
||||
return;
|
||||
}
|
||||
_skeletonModel->getRig().overrideHandAnimation(isLeft, url, fps, loop, firstFrame, lastFrame);
|
||||
}
|
||||
|
||||
void MyAvatar::restoreAnimation() {
|
||||
if (QThread::currentThread() != thread()) {
|
||||
QMetaObject::invokeMethod(this, "restoreAnimation");
|
||||
|
@ -1196,6 +1205,14 @@ void MyAvatar::restoreAnimation() {
|
|||
_skeletonModel->getRig().restoreAnimation();
|
||||
}
|
||||
|
||||
void MyAvatar::restoreHandAnimation(bool isLeft) {
|
||||
if (QThread::currentThread() != thread()) {
|
||||
QMetaObject::invokeMethod(this, "restoreHandAnimation", Q_ARG(bool, isLeft));
|
||||
return;
|
||||
}
|
||||
_skeletonModel->getRig().restoreHandAnimation(isLeft);
|
||||
}
|
||||
|
||||
QStringList MyAvatar::getAnimationRoles() {
|
||||
if (QThread::currentThread() != thread()) {
|
||||
QStringList result;
|
||||
|
|
|
@ -576,6 +576,7 @@ public:
|
|||
* }, 3000);
|
||||
*/
|
||||
Q_INVOKABLE void overrideAnimation(const QString& url, float fps, bool loop, float firstFrame, float lastFrame);
|
||||
Q_INVOKABLE void overrideHandAnimation(bool isLeft, const QString& url, float fps, bool loop, float firstFrame, float lastFrame);
|
||||
|
||||
/**jsdoc
|
||||
* Restores the default animations.
|
||||
|
@ -594,6 +595,7 @@ public:
|
|||
* }, 3000);
|
||||
*/
|
||||
Q_INVOKABLE void restoreAnimation();
|
||||
Q_INVOKABLE void restoreHandAnimation(bool isLeft);
|
||||
|
||||
/**jsdoc
|
||||
* Gets the current animation roles.
|
||||
|
|
|
@ -370,6 +370,88 @@ void Rig::restoreAnimation() {
|
|||
}
|
||||
}
|
||||
|
||||
void Rig::overrideHandAnimation(bool isLeft, const QString& url, float fps, bool loop, float firstFrame, float lastFrame) {
|
||||
HandAnimState::ClipNodeEnum clipNodeEnum;
|
||||
if (isLeft) {
|
||||
if (_leftHandAnimState.clipNodeEnum == HandAnimState::None || _leftHandAnimState.clipNodeEnum == HandAnimState::B) {
|
||||
clipNodeEnum = HandAnimState::A;
|
||||
} else {
|
||||
clipNodeEnum = HandAnimState::B;
|
||||
}
|
||||
} else {
|
||||
if (_rightHandAnimState.clipNodeEnum == HandAnimState::None || _rightHandAnimState.clipNodeEnum == HandAnimState::B) {
|
||||
clipNodeEnum = HandAnimState::A;
|
||||
} else {
|
||||
clipNodeEnum = HandAnimState::B;
|
||||
}
|
||||
}
|
||||
|
||||
if (_animNode) {
|
||||
std::shared_ptr<AnimClip> clip;
|
||||
if (isLeft) {
|
||||
if (clipNodeEnum == HandAnimState::A) {
|
||||
clip = std::dynamic_pointer_cast<AnimClip>(_animNode->findByName("leftHandAnimA"));
|
||||
} else {
|
||||
clip = std::dynamic_pointer_cast<AnimClip>(_animNode->findByName("leftHandAnimB"));
|
||||
}
|
||||
} else {
|
||||
if (clipNodeEnum == HandAnimState::A) {
|
||||
clip = std::dynamic_pointer_cast<AnimClip>(_animNode->findByName("rightHandAnimA"));
|
||||
} else {
|
||||
clip = std::dynamic_pointer_cast<AnimClip>(_animNode->findByName("rightHandAnimB"));
|
||||
}
|
||||
}
|
||||
|
||||
if (clip) {
|
||||
// set parameters
|
||||
clip->setLoopFlag(loop);
|
||||
clip->setStartFrame(firstFrame);
|
||||
clip->setEndFrame(lastFrame);
|
||||
const float REFERENCE_FRAMES_PER_SECOND = 30.0f;
|
||||
float timeScale = fps / REFERENCE_FRAMES_PER_SECOND;
|
||||
clip->setTimeScale(timeScale);
|
||||
clip->loadURL(url);
|
||||
}
|
||||
}
|
||||
|
||||
// notify the handAnimStateMachine the desired state.
|
||||
if (isLeft) {
|
||||
// store current hand anim state.
|
||||
_leftHandAnimState = { clipNodeEnum, url, fps, loop, firstFrame, lastFrame };
|
||||
_animVars.set("leftHandAnimNone", false);
|
||||
_animVars.set("leftHandAnimA", clipNodeEnum == HandAnimState::A);
|
||||
_animVars.set("leftHandAnimB", clipNodeEnum == HandAnimState::B);
|
||||
} else {
|
||||
// store current hand anim state.
|
||||
_rightHandAnimState = { clipNodeEnum, url, fps, loop, firstFrame, lastFrame };
|
||||
_animVars.set("rightHandAnimNone", false);
|
||||
_animVars.set("rightHandAnimA", clipNodeEnum == HandAnimState::A);
|
||||
_animVars.set("rightHandAnimB", clipNodeEnum == HandAnimState::B);
|
||||
}
|
||||
}
|
||||
|
||||
void Rig::restoreHandAnimation(bool isLeft) {
|
||||
if (isLeft) {
|
||||
if (_leftHandAnimState.clipNodeEnum != HandAnimState::None) {
|
||||
_leftHandAnimState.clipNodeEnum = HandAnimState::None;
|
||||
|
||||
// notify the handAnimStateMachine the desired state.
|
||||
_animVars.set("leftHandAnimNone", true);
|
||||
_animVars.set("leftHandAnimA", false);
|
||||
_animVars.set("leftHandAnimB", false);
|
||||
}
|
||||
} else {
|
||||
if (_rightHandAnimState.clipNodeEnum != HandAnimState::None) {
|
||||
_rightHandAnimState.clipNodeEnum = HandAnimState::None;
|
||||
|
||||
// notify the handAnimStateMachine the desired state.
|
||||
_animVars.set("rightHandAnimNone", true);
|
||||
_animVars.set("rightHandAnimA", false);
|
||||
_animVars.set("rightHandAnimB", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Rig::overrideNetworkAnimation(const QString& url, float fps, bool loop, float firstFrame, float lastFrame) {
|
||||
|
||||
NetworkAnimState::ClipNodeEnum clipNodeEnum = NetworkAnimState::None;
|
||||
|
|
|
@ -118,6 +118,9 @@ public:
|
|||
void overrideAnimation(const QString& url, float fps, bool loop, float firstFrame, float lastFrame);
|
||||
void restoreAnimation();
|
||||
|
||||
void overrideHandAnimation(bool isLeft, const QString& url, float fps, bool loop, float firstFrame, float lastFrame);
|
||||
void restoreHandAnimation(bool isLeft);
|
||||
|
||||
void overrideNetworkAnimation(const QString& url, float fps, bool loop, float firstFrame, float lastFrame);
|
||||
void triggerNetworkRole(const QString& role);
|
||||
void restoreNetworkAnimation();
|
||||
|
@ -356,6 +359,27 @@ protected:
|
|||
float blendTime;
|
||||
};
|
||||
|
||||
struct HandAnimState {
|
||||
enum ClipNodeEnum {
|
||||
None = 0,
|
||||
A,
|
||||
B
|
||||
};
|
||||
|
||||
HandAnimState() : clipNodeEnum(HandAnimState::None) {}
|
||||
HandAnimState(ClipNodeEnum clipNodeEnumIn, const QString& urlIn, float fpsIn, bool loopIn, float firstFrameIn, float lastFrameIn) :
|
||||
clipNodeEnum(clipNodeEnumIn), url(urlIn), fps(fpsIn), loop(loopIn), firstFrame(firstFrameIn), lastFrame(lastFrameIn) {
|
||||
}
|
||||
|
||||
|
||||
ClipNodeEnum clipNodeEnum;
|
||||
QString url;
|
||||
float fps;
|
||||
bool loop;
|
||||
float firstFrame;
|
||||
float lastFrame;
|
||||
};
|
||||
|
||||
struct UserAnimState {
|
||||
enum ClipNodeEnum {
|
||||
None = 0,
|
||||
|
@ -390,6 +414,8 @@ protected:
|
|||
|
||||
UserAnimState _userAnimState;
|
||||
NetworkAnimState _networkAnimState;
|
||||
HandAnimState _rightHandAnimState;
|
||||
HandAnimState _leftHandAnimState;
|
||||
std::map<QString, RoleAnimState> _roleAnimStates;
|
||||
|
||||
float _leftHandOverlayAlpha { 0.0f };
|
||||
|
|
Loading…
Reference in a new issue