mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-24 01:34:08 +02:00
Merge pull request #12239 from druiz17/fix-camera-update
Do not override sensorToWorldMatrix if animGraph is loading or failed to load
This commit is contained in:
commit
309c2ecba1
5 changed files with 29 additions and 20 deletions
|
@ -1460,10 +1460,23 @@ void MyAvatar::clearJointsData() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) {
|
void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) {
|
||||||
|
_skeletonModelChangeCount++;
|
||||||
|
int skeletonModelChangeCount = _skeletonModelChangeCount;
|
||||||
Avatar::setSkeletonModelURL(skeletonModelURL);
|
Avatar::setSkeletonModelURL(skeletonModelURL);
|
||||||
_skeletonModel->setVisibleInScene(true, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE);
|
_skeletonModel->setVisibleInScene(true, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE);
|
||||||
_headBoneSet.clear();
|
_headBoneSet.clear();
|
||||||
_cauterizationNeedsUpdate = true;
|
_cauterizationNeedsUpdate = true;
|
||||||
|
|
||||||
|
std::shared_ptr<QMetaObject::Connection> skeletonConnection = std::make_shared<QMetaObject::Connection>();
|
||||||
|
*skeletonConnection = QObject::connect(_skeletonModel.get(), &SkeletonModel::skeletonLoaded, [this, skeletonModelChangeCount, skeletonConnection]() {
|
||||||
|
if (skeletonModelChangeCount == _skeletonModelChangeCount) {
|
||||||
|
initHeadBones();
|
||||||
|
_skeletonModel->setCauterizeBoneSet(_headBoneSet);
|
||||||
|
_fstAnimGraphOverrideUrl = _skeletonModel->getGeometry()->getAnimGraphOverrideUrl();
|
||||||
|
initAnimGraph();
|
||||||
|
}
|
||||||
|
QObject::disconnect(*skeletonConnection);
|
||||||
|
});
|
||||||
saveAvatarUrl();
|
saveAvatarUrl();
|
||||||
emit skeletonChanged();
|
emit skeletonChanged();
|
||||||
|
|
||||||
|
@ -1872,9 +1885,7 @@ void MyAvatar::setAnimGraphUrl(const QUrl& url) {
|
||||||
|
|
||||||
_currentAnimGraphUrl.set(url);
|
_currentAnimGraphUrl.set(url);
|
||||||
_skeletonModel->getRig().initAnimGraph(url);
|
_skeletonModel->getRig().initAnimGraph(url);
|
||||||
|
connect(&(_skeletonModel->getRig()), SIGNAL(onLoadComplete()), this, SLOT(animGraphLoaded()));
|
||||||
_bodySensorMatrix = deriveBodyFromHMDSensor(); // Based on current cached HMD position/rotation..
|
|
||||||
updateSensorToWorldMatrix(); // Uses updated position/orientation and _bodySensorMatrix changes
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyAvatar::initAnimGraph() {
|
void MyAvatar::initAnimGraph() {
|
||||||
|
@ -1889,28 +1900,24 @@ void MyAvatar::initAnimGraph() {
|
||||||
|
|
||||||
_skeletonModel->getRig().initAnimGraph(graphUrl);
|
_skeletonModel->getRig().initAnimGraph(graphUrl);
|
||||||
_currentAnimGraphUrl.set(graphUrl);
|
_currentAnimGraphUrl.set(graphUrl);
|
||||||
|
connect(&(_skeletonModel->getRig()), SIGNAL(onLoadComplete()), this, SLOT(animGraphLoaded()));
|
||||||
_bodySensorMatrix = deriveBodyFromHMDSensor(); // Based on current cached HMD position/rotation..
|
|
||||||
updateSensorToWorldMatrix(); // Uses updated position/orientation and _bodySensorMatrix changes
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyAvatar::destroyAnimGraph() {
|
void MyAvatar::destroyAnimGraph() {
|
||||||
_skeletonModel->getRig().destroyAnimGraph();
|
_skeletonModel->getRig().destroyAnimGraph();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MyAvatar::animGraphLoaded() {
|
||||||
|
_bodySensorMatrix = deriveBodyFromHMDSensor(); // Based on current cached HMD position/rotation..
|
||||||
|
updateSensorToWorldMatrix(); // Uses updated position/orientation and _bodySensorMatrix changes
|
||||||
|
_isAnimatingScale = true;
|
||||||
|
_cauterizationNeedsUpdate = true;
|
||||||
|
disconnect(&(_skeletonModel->getRig()), SIGNAL(onLoadComplete()), this, SLOT(animGraphLoaded()));
|
||||||
|
}
|
||||||
|
|
||||||
void MyAvatar::postUpdate(float deltaTime, const render::ScenePointer& scene) {
|
void MyAvatar::postUpdate(float deltaTime, const render::ScenePointer& scene) {
|
||||||
|
|
||||||
Avatar::postUpdate(deltaTime, scene);
|
Avatar::postUpdate(deltaTime, scene);
|
||||||
|
|
||||||
if (_skeletonModel->isLoaded() && !_skeletonModel->getRig().getAnimNode()) {
|
|
||||||
initHeadBones();
|
|
||||||
_skeletonModel->setCauterizeBoneSet(_headBoneSet);
|
|
||||||
_fstAnimGraphOverrideUrl = _skeletonModel->getGeometry()->getAnimGraphOverrideUrl();
|
|
||||||
initAnimGraph();
|
|
||||||
_isAnimatingScale = true;
|
|
||||||
_cauterizationNeedsUpdate = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_enableDebugDrawDefaultPose || _enableDebugDrawAnimPose) {
|
if (_enableDebugDrawDefaultPose || _enableDebugDrawAnimPose) {
|
||||||
|
|
||||||
auto animSkeleton = _skeletonModel->getRig().getAnimSkeleton();
|
auto animSkeleton = _skeletonModel->getRig().getAnimSkeleton();
|
||||||
|
|
|
@ -569,6 +569,7 @@ public slots:
|
||||||
void increaseSize();
|
void increaseSize();
|
||||||
void decreaseSize();
|
void decreaseSize();
|
||||||
void resetSize();
|
void resetSize();
|
||||||
|
void animGraphLoaded();
|
||||||
|
|
||||||
void setGravity(float gravity);
|
void setGravity(float gravity);
|
||||||
float getGravity();
|
float getGravity();
|
||||||
|
@ -654,6 +655,7 @@ private:
|
||||||
bool isMyAvatar() const override { return true; }
|
bool isMyAvatar() const override { return true; }
|
||||||
virtual int parseDataFromBuffer(const QByteArray& buffer) override;
|
virtual int parseDataFromBuffer(const QByteArray& buffer) override;
|
||||||
virtual glm::vec3 getSkeletonPosition() const override;
|
virtual glm::vec3 getSkeletonPosition() const override;
|
||||||
|
int _skeletonModelChangeCount { 0 };
|
||||||
|
|
||||||
void saveAvatarScale();
|
void saveAvatarScale();
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,8 @@ static AnimNode::Pointer loadManipulatorNode(const QJsonObject& jsonObj, const Q
|
||||||
static AnimNode::Pointer loadInverseKinematicsNode(const QJsonObject& jsonObj, const QString& id, const QUrl& jsonUrl);
|
static AnimNode::Pointer loadInverseKinematicsNode(const QJsonObject& jsonObj, const QString& id, const QUrl& jsonUrl);
|
||||||
static AnimNode::Pointer loadDefaultPoseNode(const QJsonObject& jsonObj, const QString& id, const QUrl& jsonUrl);
|
static AnimNode::Pointer loadDefaultPoseNode(const QJsonObject& jsonObj, const QString& id, const QUrl& jsonUrl);
|
||||||
|
|
||||||
|
static const float ANIM_GRAPH_LOAD_PRIORITY = 10.0f;
|
||||||
|
|
||||||
// called after children have been loaded
|
// called after children have been loaded
|
||||||
// returns node on success, nullptr on failure.
|
// returns node on success, nullptr on failure.
|
||||||
static bool processDoNothing(AnimNode::Pointer node, const QJsonObject& jsonObj, const QString& id, const QUrl& jsonUrl) { return true; }
|
static bool processDoNothing(AnimNode::Pointer node, const QJsonObject& jsonObj, const QString& id, const QUrl& jsonUrl) { return true; }
|
||||||
|
@ -653,6 +655,7 @@ AnimNodeLoader::AnimNodeLoader(const QUrl& url) :
|
||||||
{
|
{
|
||||||
_resource = QSharedPointer<Resource>::create(url);
|
_resource = QSharedPointer<Resource>::create(url);
|
||||||
_resource->setSelf(_resource);
|
_resource->setSelf(_resource);
|
||||||
|
_resource->setLoadPriority(this, ANIM_GRAPH_LOAD_PRIORITY);
|
||||||
connect(_resource.data(), &Resource::loaded, this, &AnimNodeLoader::onRequestDone);
|
connect(_resource.data(), &Resource::loaded, this, &AnimNodeLoader::onRequestDone);
|
||||||
connect(_resource.data(), &Resource::failed, this, &AnimNodeLoader::onRequestError);
|
connect(_resource.data(), &Resource::failed, this, &AnimNodeLoader::onRequestError);
|
||||||
_resource->ensureLoading();
|
_resource->ensureLoading();
|
||||||
|
|
|
@ -1585,14 +1585,13 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rig::initAnimGraph(const QUrl& url) {
|
void Rig::initAnimGraph(const QUrl& url) {
|
||||||
if (_animGraphURL != url || (!_animNode && !_animLoading)) {
|
if (_animGraphURL != url || !_animNode) {
|
||||||
_animGraphURL = url;
|
_animGraphURL = url;
|
||||||
|
|
||||||
_animNode.reset();
|
_animNode.reset();
|
||||||
|
|
||||||
// load the anim graph
|
// load the anim graph
|
||||||
_animLoader.reset(new AnimNodeLoader(url));
|
_animLoader.reset(new AnimNodeLoader(url));
|
||||||
_animLoading = true;
|
|
||||||
std::weak_ptr<AnimSkeleton> weakSkeletonPtr = _animSkeleton;
|
std::weak_ptr<AnimSkeleton> weakSkeletonPtr = _animSkeleton;
|
||||||
connect(_animLoader.get(), &AnimNodeLoader::success, [this, weakSkeletonPtr](AnimNode::Pointer nodeIn) {
|
connect(_animLoader.get(), &AnimNodeLoader::success, [this, weakSkeletonPtr](AnimNode::Pointer nodeIn) {
|
||||||
_animNode = nodeIn;
|
_animNode = nodeIn;
|
||||||
|
@ -1617,7 +1616,6 @@ void Rig::initAnimGraph(const QUrl& url) {
|
||||||
auto roleState = roleAnimState.second;
|
auto roleState = roleAnimState.second;
|
||||||
overrideRoleAnimation(roleState.role, roleState.url, roleState.fps, roleState.loop, roleState.firstFrame, roleState.lastFrame);
|
overrideRoleAnimation(roleState.role, roleState.url, roleState.fps, roleState.loop, roleState.firstFrame, roleState.lastFrame);
|
||||||
}
|
}
|
||||||
_animLoading = false;
|
|
||||||
|
|
||||||
emit onLoadComplete();
|
emit onLoadComplete();
|
||||||
});
|
});
|
||||||
|
|
|
@ -283,7 +283,6 @@ protected:
|
||||||
std::shared_ptr<AnimNode> _animNode;
|
std::shared_ptr<AnimNode> _animNode;
|
||||||
std::shared_ptr<AnimSkeleton> _animSkeleton;
|
std::shared_ptr<AnimSkeleton> _animSkeleton;
|
||||||
std::unique_ptr<AnimNodeLoader> _animLoader;
|
std::unique_ptr<AnimNodeLoader> _animLoader;
|
||||||
bool _animLoading { false };
|
|
||||||
AnimVariantMap _animVars;
|
AnimVariantMap _animVars;
|
||||||
enum class RigRole {
|
enum class RigRole {
|
||||||
Idle = 0,
|
Idle = 0,
|
||||||
|
|
Loading…
Reference in a new issue