/**************************************************************************** ** ** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt3D module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL3$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPLv3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or later as published by the Free ** Software Foundation and appearing in the file LICENSE.GPL included in ** the packaging of this file. Please review the following information to ** ensure the GNU General Public License version 2.0 requirements will be ** met: http://www.gnu.org/licenses/gpl-2.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "buildblendtreesjob_p.h" #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE namespace Qt3DAnimation { namespace Animation { BuildBlendTreesJob::BuildBlendTreesJob() : Qt3DCore::QAspectJob() { SET_JOB_RUN_STAT_TYPE(this, JobTypes::BuildBlendTree, 0); } void BuildBlendTreesJob::setBlendedClipAnimators(const QVector &blendedClipAnimatorHandles) { m_blendedClipAnimatorHandles = blendedClipAnimatorHandles; } // Note this job is run once for all stopped blended animators that have been marked dirty // We assume that the structure of blend node tree does not change once a BlendClipAnimator has been set to running void BuildBlendTreesJob::run() { for (const HBlendedClipAnimator blendedClipAnimatorHandle : qAsConst(m_blendedClipAnimatorHandles)) { // Retrieve BlendTree node BlendedClipAnimator *blendClipAnimator = m_handler->blendedClipAnimatorManager()->data(blendedClipAnimatorHandle); Q_ASSERT(blendClipAnimator); const bool canRun = blendClipAnimator->canRun(); m_handler->setBlendedClipAnimatorRunning(blendedClipAnimatorHandle, canRun); if (!canRun) continue; // Build the format for clip results that should be used by nodes in the blend // tree when used with this animator const ChannelMapper *mapper = m_handler->channelMapperManager()->lookupResource(blendClipAnimator->mapperId()); Q_ASSERT(mapper); QVector channelNamesAndTypes = buildRequiredChannelsAndTypes(m_handler, mapper); QVector channelComponentIndices = assignChannelComponentIndices(channelNamesAndTypes); // Find the leaf value nodes of the blend tree and for each of them // create a set of format indices that can later be used to map the // raw ClipResults resulting from evaluating an animation clip to the // layout used by the blend tree for this animator const QVector valueNodeIds = gatherValueNodesToEvaluate(m_handler, blendClipAnimator->blendTreeRootId()); for (const auto valueNodeId : valueNodeIds) { ClipBlendValue *valueNode = static_cast(m_handler->clipBlendNodeManager()->lookupNode(valueNodeId)); Q_ASSERT(valueNode); const Qt3DCore::QNodeId clipId = valueNode->clipId(); const AnimationClip *clip = m_handler->animationClipLoaderManager()->lookupResource(clipId); Q_ASSERT(clip); const ComponentIndices formatIndices = generateClipFormatIndices(channelNamesAndTypes, channelComponentIndices, clip); valueNode->setFormatIndices(blendClipAnimator->peerId(), formatIndices); } // Finally, build the mapping data vector for this blended clip animator. This // gets used during the final stage of evaluation when sending the property changes // out to the targets of the animation. We do the costly work once up front. const QVector channelMappingIds = mapper->mappingIds(); QVector channelMappings; channelMappings.reserve(channelMappingIds.size()); for (const auto mappingId : channelMappingIds) { ChannelMapping *mapping = m_handler->channelMappingManager()->lookupResource(mappingId); Q_ASSERT(mapping); channelMappings.push_back(mapping); } const QVector mappingDataVec = buildPropertyMappings(channelMappings, channelNamesAndTypes, channelComponentIndices); blendClipAnimator->setMappingData(mappingDataVec); } } } // Animation } // Qt3DAnimation QT_END_NAMESPACE