void ModelEntityItem::setJointTranslationsSet(const QVector<bool>& translationsSet) { _jointDataLock.withWriteLock([&] { _jointTranslationsExplicitlySet = translationsSet.size() > 0; resizeJointArrays(translationsSet.size()); for (int index = 0; index < translationsSet.size(); index++) { _localJointTranslationsSet[index] = translationsSet[index]; } }); }
void ModelEntityItem::setJointTranslations(const QVector<glm::vec3>& translations) { _jointDataLock.withWriteLock([&] { _jointTranslationsExplicitlySet = translations.size() > 0; resizeJointArrays(translations.size()); for (int index = 0; index < translations.size(); index++) { if (_localJointTranslationsSet[index]) { _localJointTranslations[index] = translations[index]; _localJointTranslationsSet[index] = true; } } }); }
void ModelEntityItem::setJointRotations(const QVector<glm::quat>& rotations) { _jointDataLock.withWriteLock([&] { _jointRotationsExplicitlySet = rotations.size() > 0; resizeJointArrays(rotations.size()); for (int index = 0; index < rotations.size(); index++) { if (_localJointRotationsSet[index]) { _localJointRotations[index] = rotations[index]; _localJointRotationsDirty[index] = true; } } }); }
bool RenderableModelEntityItem::setAbsoluteJointTranslationInObjectFrame(int index, const glm::vec3& translation) { bool result = false; _jointDataLock.withWriteLock([&] { resizeJointArrays(); if (index >= 0 && index < _absoluteJointTranslationsInObjectFrame.size() && _absoluteJointTranslationsInObjectFrame[index] != translation) { _absoluteJointTranslationsInObjectFrame[index] = translation; _absoluteJointTranslationsInObjectFrameSet[index] = true; _absoluteJointTranslationsInObjectFrameDirty[index] = true; result = true; } }); return result; }
bool RenderableModelEntityItem::getAnimationFrame() { bool newFrame = false; if (!_model || !_model->isActive() || !_model->isLoaded() || _needsInitialSimulation) { return false; } if (!hasAnimation() || !_jointMappingCompleted) { return false; } AnimationPointer myAnimation = getAnimation(_animationProperties.getURL()); // FIXME: this could be optimized if (myAnimation && myAnimation->isLoaded()) { const QVector<FBXAnimationFrame>& frames = myAnimation->getFramesReference(); // NOTE: getFrames() is too heavy auto& fbxJoints = myAnimation->getGeometry().joints; int frameCount = frames.size(); if (frameCount > 0) { int animationCurrentFrame = (int)(glm::floor(getAnimationCurrentFrame())) % frameCount; if (animationCurrentFrame < 0 || animationCurrentFrame > frameCount) { animationCurrentFrame = 0; } if (animationCurrentFrame != _lastKnownCurrentFrame) { _lastKnownCurrentFrame = animationCurrentFrame; newFrame = true; resizeJointArrays(); if (_jointMapping.size() != _model->getJointStateCount()) { qDebug() << "RenderableModelEntityItem::getAnimationFrame -- joint count mismatch" << _jointMapping.size() << _model->getJointStateCount(); assert(false); return false; } const QVector<glm::quat>& rotations = frames[animationCurrentFrame].rotations; const QVector<glm::vec3>& translations = frames[animationCurrentFrame].translations; for (int j = 0; j < _jointMapping.size(); j++) { int index = _jointMapping[j]; if (index >= 0) { glm::mat4 translationMat; if (index < translations.size()) { translationMat = glm::translate(translations[index]); } glm::mat4 rotationMat(glm::mat4::_null); if (index < rotations.size()) { rotationMat = glm::mat4_cast(fbxJoints[index].preRotation * rotations[index] * fbxJoints[index].postRotation); } else { rotationMat = glm::mat4_cast(fbxJoints[index].preRotation * fbxJoints[index].postRotation); } glm::mat4 finalMat = (translationMat * fbxJoints[index].preTransform * rotationMat * fbxJoints[index].postTransform); _absoluteJointTranslationsInObjectFrame[j] = extractTranslation(finalMat); _absoluteJointTranslationsInObjectFrameSet[j] = true; _absoluteJointTranslationsInObjectFrameDirty[j] = true; _absoluteJointRotationsInObjectFrame[j] = glmExtractRotation(finalMat); _absoluteJointRotationsInObjectFrameSet[j] = true; _absoluteJointRotationsInObjectFrameDirty[j] = true; } } } } } return newFrame; }