mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-24 01:14:15 +02:00
add support for getting current animation details for running avatar animations
This commit is contained in:
parent
42fc98161b
commit
a53d007c33
6 changed files with 105 additions and 0 deletions
|
@ -551,6 +551,40 @@ void MyAvatar::stopAnimation(const QString& url) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AnimationDetails MyAvatar::getAnimationDetailsByRole(const QString& role) {
|
||||||
|
AnimationDetails result;
|
||||||
|
if (QThread::currentThread() != thread()) {
|
||||||
|
QMetaObject::invokeMethod(this, "getAnimationDetailsByRole", Qt::BlockingQueuedConnection,
|
||||||
|
Q_RETURN_ARG(AnimationDetails, result),
|
||||||
|
Q_ARG(const QString&, role));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
foreach (const AnimationHandlePointer& handle, _skeletonModel.getRunningAnimations()) {
|
||||||
|
if (handle->getRole() == role) {
|
||||||
|
result = handle->getAnimationDetails();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
AnimationDetails MyAvatar::getAnimationDetails(const QString& url) {
|
||||||
|
AnimationDetails result;
|
||||||
|
if (QThread::currentThread() != thread()) {
|
||||||
|
QMetaObject::invokeMethod(this, "getAnimationDetails", Qt::BlockingQueuedConnection,
|
||||||
|
Q_RETURN_ARG(AnimationDetails, result),
|
||||||
|
Q_ARG(const QString&, url));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
foreach (const AnimationHandlePointer& handle, _skeletonModel.getRunningAnimations()) {
|
||||||
|
if (handle->getURL() == url) {
|
||||||
|
result = handle->getAnimationDetails();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void MyAvatar::saveData(QSettings* settings) {
|
void MyAvatar::saveData(QSettings* settings) {
|
||||||
settings->beginGroup("Avatar");
|
settings->beginGroup("Avatar");
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,9 @@ public:
|
||||||
/// Stops an animation identified by its role.
|
/// Stops an animation identified by its role.
|
||||||
Q_INVOKABLE void stopAnimationByRole(const QString& role);
|
Q_INVOKABLE void stopAnimationByRole(const QString& role);
|
||||||
|
|
||||||
|
Q_INVOKABLE AnimationDetails getAnimationDetailsByRole(const QString& role);
|
||||||
|
Q_INVOKABLE AnimationDetails getAnimationDetails(const QString& url);
|
||||||
|
|
||||||
// get/set avatar data
|
// get/set avatar data
|
||||||
void saveData(QSettings* settings);
|
void saveData(QSettings* settings);
|
||||||
void loadData(QSettings* settings);
|
void loadData(QSettings* settings);
|
||||||
|
|
|
@ -354,6 +354,15 @@ public:
|
||||||
void setRunning(bool running);
|
void setRunning(bool running);
|
||||||
bool isRunning() const { return _running; }
|
bool isRunning() const { return _running; }
|
||||||
|
|
||||||
|
void setFrameIndex(float frameIndex) { _frameIndex = glm::clamp(_frameIndex, _firstFrame, _lastFrame); }
|
||||||
|
float getFrameIndex() const { return _frameIndex; }
|
||||||
|
|
||||||
|
AnimationDetails getAnimationDetails() const {
|
||||||
|
AnimationDetails details(_role, _url, _fps, _priority, _loop, _hold,
|
||||||
|
_startAutomatically, _firstFrame, _lastFrame, _running, _frameIndex);
|
||||||
|
return details;
|
||||||
|
}
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
void runningChanged(bool running);
|
void runningChanged(bool running);
|
||||||
|
|
|
@ -102,3 +102,27 @@ void Animation::downloadFinished(QNetworkReply* reply) {
|
||||||
QThreadPool::globalInstance()->start(new AnimationReader(_self, reply));
|
QThreadPool::globalInstance()->start(new AnimationReader(_self, reply));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QScriptValue animationDetailsToScriptValue(QScriptEngine* engine, const AnimationDetails& details) {
|
||||||
|
QScriptValue obj = engine->newObject();
|
||||||
|
obj.setProperty("role", details.role);
|
||||||
|
obj.setProperty("url", details.url.toString());
|
||||||
|
obj.setProperty("fps", details.fps);
|
||||||
|
obj.setProperty("priority", details.priority);
|
||||||
|
obj.setProperty("loop", details.loop);
|
||||||
|
obj.setProperty("hold", details.hold);
|
||||||
|
obj.setProperty("startAutomatically", details.startAutomatically);
|
||||||
|
obj.setProperty("firstFrame", details.firstFrame);
|
||||||
|
obj.setProperty("lastFrame", details.lastFrame);
|
||||||
|
obj.setProperty("running", details.running);
|
||||||
|
obj.setProperty("frameIndex", details.frameIndex);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
void animationDetailsFromScriptValue(const QScriptValue& object, AnimationDetails& details) {
|
||||||
|
// nothing for now...
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,9 @@
|
||||||
#ifndef hifi_AnimationCache_h
|
#ifndef hifi_AnimationCache_h
|
||||||
#define hifi_AnimationCache_h
|
#define hifi_AnimationCache_h
|
||||||
|
|
||||||
|
#include <QScriptEngine>
|
||||||
|
#include <QScriptValue>
|
||||||
|
|
||||||
#include <ResourceCache.h>
|
#include <ResourceCache.h>
|
||||||
|
|
||||||
#include <FBXReader.h>
|
#include <FBXReader.h>
|
||||||
|
@ -68,4 +71,34 @@ private:
|
||||||
bool _isValid;
|
bool _isValid;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class AnimationDetails {
|
||||||
|
public:
|
||||||
|
AnimationDetails() :
|
||||||
|
role(), url(), fps(0.0f), priority(0.0f), loop(false), hold(false),
|
||||||
|
startAutomatically(false), firstFrame(0.0f), lastFrame(0.0f), running(false), frameIndex(0.0f) { }
|
||||||
|
|
||||||
|
AnimationDetails(QString role, QUrl url, float fps, float priority, bool loop,
|
||||||
|
bool hold, bool startAutomatically, float firstFrame, float lastFrame, bool running, float frameIndex) :
|
||||||
|
role(role), url(url), fps(fps), priority(priority), loop(loop), hold(hold),
|
||||||
|
startAutomatically(startAutomatically), firstFrame(firstFrame), lastFrame(lastFrame),
|
||||||
|
running(running), frameIndex(frameIndex) { }
|
||||||
|
|
||||||
|
QString role;
|
||||||
|
QUrl url;
|
||||||
|
float fps;
|
||||||
|
float priority;
|
||||||
|
bool loop;
|
||||||
|
bool hold;
|
||||||
|
bool startAutomatically;
|
||||||
|
float firstFrame;
|
||||||
|
float lastFrame;
|
||||||
|
bool running;
|
||||||
|
float frameIndex;
|
||||||
|
};
|
||||||
|
Q_DECLARE_METATYPE(AnimationDetails);
|
||||||
|
QScriptValue animationDetailsToScriptValue(QScriptEngine* engine, const AnimationDetails& event);
|
||||||
|
void animationDetailsFromScriptValue(const QScriptValue& object, AnimationDetails& event);
|
||||||
|
|
||||||
|
|
||||||
#endif // hifi_AnimationCache_h
|
#endif // hifi_AnimationCache_h
|
||||||
|
|
|
@ -254,6 +254,8 @@ void ScriptEngine::init() {
|
||||||
|
|
||||||
qScriptRegisterMetaType(&_engine, injectorToScriptValue, injectorFromScriptValue);
|
qScriptRegisterMetaType(&_engine, injectorToScriptValue, injectorFromScriptValue);
|
||||||
|
|
||||||
|
qScriptRegisterMetaType(&_engine, animationDetailsToScriptValue, animationDetailsFromScriptValue);
|
||||||
|
|
||||||
registerGlobalObject("Script", this);
|
registerGlobalObject("Script", this);
|
||||||
registerGlobalObject("Audio", &_audioScriptingInterface);
|
registerGlobalObject("Audio", &_audioScriptingInterface);
|
||||||
registerGlobalObject("Controller", _controllerScriptingInterface);
|
registerGlobalObject("Controller", _controllerScriptingInterface);
|
||||||
|
|
Loading…
Reference in a new issue