diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 2764fd4031..32cecd3801 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -499,8 +499,8 @@ void Agent::processAgentAvatar() { if (!_scriptEngine->isFinished() && _isAvatar) { auto scriptedAvatar = DependencyManager::get(); - AvatarData::AvatarDataDetail dataDetail = (randFloat() < AVATAR_SEND_FULL_UPDATE_RATIO) ? AvatarData::SendAllData : AvatarData::CullSmallData; - //AvatarData::AvatarDataDetail dataDetail = AvatarData::SendAllData; + //AvatarData::AvatarDataDetail dataDetail = (randFloat() < AVATAR_SEND_FULL_UPDATE_RATIO) ? AvatarData::SendAllData : AvatarData::CullSmallData; + AvatarData::AvatarDataDetail dataDetail = AvatarData::SendAllData; quint64 lastSentTime = 0; QVector& lastSentJointData = scriptedAvatar->getLastSentJointData(); bool distanceAdjust = false; diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 59b8429683..ab9d024556 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -416,7 +416,7 @@ void AvatarMixer::broadcastAvatarData() { nodeData->incrementAvatarOutOfView(); } else { detail = distribution(generator) < AVATAR_SEND_FULL_UPDATE_RATIO - ? AvatarData::SendAllData : AvatarData::IncludeSmallData; + ? AvatarData::SendAllData : AvatarData::CullSmallData; nodeData->incrementAvatarInView(); } @@ -424,7 +424,7 @@ void AvatarMixer::broadcastAvatarData() { auto lastEncodeForOther = nodeData->getLastOtherAvatarEncodeTime(otherNode->getUUID()); auto lastSentJointsForOther = nodeData->getLastOtherAvatarSentJoints(otherNode->getUUID()); bool distanceAdjust = true; - glm::vec3 viewerPosition = otherAvatar.getPosition(); + glm::vec3 viewerPosition = nodeData->getPosition(); auto bytes = otherAvatar.toByteArray(detail, lastEncodeForOther, lastSentJointsForOther, distanceAdjust, viewerPosition); numAvatarDataBytes += avatarPacketList->write(bytes); diff --git a/assignment-client/src/avatars/ScriptableAvatar.cpp b/assignment-client/src/avatars/ScriptableAvatar.cpp index 989904ca7b..d4d5b470b8 100644 --- a/assignment-client/src/avatars/ScriptableAvatar.cpp +++ b/assignment-client/src/avatars/ScriptableAvatar.cpp @@ -57,18 +57,26 @@ void ScriptableAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { _bind.reset(); _animSkeleton.reset(); AvatarData::setSkeletonModelURL(skeletonModelURL); + //qDebug() << "skeletonModelURL:" << skeletonModelURL; + //qDebug() << "_skeletonFBXURL:" << _skeletonFBXURL; } void ScriptableAvatar::update(float deltatime) { + //qDebug() << __FUNCTION__ << "delta:" << deltatime; if (_bind.isNull() && !_skeletonFBXURL.isEmpty()) { // AvatarData will parse the .fst, but not get the .fbx skeleton. _bind = DependencyManager::get()->getAnimation(_skeletonFBXURL); + //qDebug() << "_skeletonFBXURL:" << _skeletonFBXURL; } + //qDebug() << "bind:" << _bind << "isLoaded:" << (!_bind.isNull() && _bind->isLoaded()); + //qDebug() << "_animation:" << _animation << "isLoaded:" << (_animation && _animation->isLoaded()); + // Run animation if (_animation && _animation->isLoaded() && _animation->getFrames().size() > 0 && !_bind.isNull() && _bind->isLoaded()) { if (!_animSkeleton) { _animSkeleton = std::make_shared(_bind->getGeometry()); } float currentFrame = _animationDetails.currentFrame + deltatime * _animationDetails.fps; + //qDebug() << "currentFrame:" << currentFrame; if (_animationDetails.loop || currentFrame < _animationDetails.lastFrame) { while (currentFrame >= _animationDetails.lastFrame) { currentFrame -= (_animationDetails.lastFrame - _animationDetails.firstFrame); @@ -107,6 +115,7 @@ void ScriptableAvatar::update(float deltatime) { if (data.rotation != pose.rot()) { data.rotation = pose.rot(); data.rotationSet = true; + //qDebug() << "joint[" << i << "].rotation:" << data.rotation; } } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 3e7b087224..e7262bb38c 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -194,7 +194,18 @@ bool AvatarData::faceTrackerInfoChangedSince(quint64 time) { } float AvatarData::getDistanceBasedMinRotationDOT(glm::vec3 viewerPosition) { - return AVATAR_MIN_ROTATION_DOT; // FIXME + auto distance = glm::distance(_globalPosition, viewerPosition); + //qDebug() << "_globalPosition:" << _globalPosition << "viewerPosition:" << viewerPosition << "distance:" << distance; + float result = ROTATION_90D_DOT; // assume worst + if (distance < 1.0f) { + result = AVATAR_MIN_ROTATION_DOT; + } else if (distance < 5.0f) { + result = ROTATION_15D_DOT; + } else if (distance < 10.0f) { + result = ROTATION_45D_DOT; + } + //qDebug() << __FUNCTION__ << "result:" << result; + return result; } float AvatarData::getDistanceBasedMinTranslationDistance(glm::vec3 viewerPosition) { @@ -241,7 +252,6 @@ QByteArray AvatarData::toByteArray(AvatarDataDetail dataDetail, quint64 lastSent // this is an iFrame issue... what to do about that? // // BUG -- Resizing avatar seems to "take too long"... the avatar doesn't redraw at smaller size right away - // BUG -- summoned avatars seem low? // // TODO - @@ -448,13 +458,17 @@ QByteArray AvatarData::toByteArray(AvatarDataDetail dataDetail, quint64 lastSent lastSentJointData.resize(_jointData.size()); float minRotationDOT = !distanceAdjust ? AVATAR_MIN_ROTATION_DOT : getDistanceBasedMinRotationDOT(viewerPosition); + //qDebug() << "sendAll:" << sendAll << "cullSmallChanges:" << cullSmallChanges; for (int i = 0; i < _jointData.size(); i++) { const JointData& data = _jointData[i]; + //qDebug() << "joint[" << i << "].dot:" << fabsf(glm::dot(data.rotation, lastSentJointData[i].rotation)); + + if (sendAll || lastSentJointData[i].rotation != data.rotation) { if (sendAll || !cullSmallChanges || - fabsf(glm::dot(data.rotation, lastSentJointData[i].rotation)) <= minRotationDOT) { + fabsf(glm::dot(data.rotation, lastSentJointData[i].rotation)) > minRotationDOT) { if (data.rotationSet) { validity |= (1 << validityBit); #if 1 //def WANT_DEBUG @@ -1484,6 +1498,9 @@ void AvatarData::detachAll(const QString& modelURL, const QString& jointName) { } void AvatarData::setJointMappingsFromNetworkReply() { + + //qDebug() << __FUNCTION__ << "_skeletonModelURL:" << _skeletonModelURL; + QNetworkReply* networkReply = static_cast(sender()); { @@ -1577,6 +1594,9 @@ void AvatarData::updateJointMappings() { } if (_skeletonModelURL.fileName().toLower().endsWith(".fst")) { + + //qDebug() << __FUNCTION__ << "_skeletonModelURL:" << _skeletonModelURL; + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest networkRequest = QNetworkRequest(_skeletonModelURL); networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 5652ccd705..cfac697df3 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -258,6 +258,9 @@ const float AVATAR_SEND_FULL_UPDATE_RATIO = 0.02f; const float AVATAR_MIN_ROTATION_DOT = 0.9999999f; const float AVATAR_MIN_TRANSLATION = 0.0001f; +const float ROTATION_15D_DOT = 0.9914449f; +const float ROTATION_45D_DOT = 0.9238795f; +const float ROTATION_90D_DOT = 0.7071068f; // Where one's own Avatar begins in the world (will be overwritten if avatar data file is found). // This is the start location in the Sandbox (xyz: 6270, 211, 6000).