blob: 57fbdb920c1426aeaf334026bb70128dbf5b3cba [file] [log] [blame]
/****************************************************************************
**
** 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 "clipblendnode_p.h"
#include <Qt3DAnimation/qclipblendnodecreatedchange.h>
#include <Qt3DAnimation/qabstractanimationclip.h>
QT_BEGIN_NAMESPACE
namespace Qt3DAnimation {
namespace Animation {
ClipBlendNode::ClipBlendNode(BlendType blendType)
: BackendNode(ReadOnly) // Makes sense for now at least
, m_manager(nullptr)
, m_blendType(blendType)
{
}
ClipBlendNode::~ClipBlendNode()
{
}
void ClipBlendNode::setClipBlendNodeManager(ClipBlendNodeManager *manager)
{
m_manager = manager;
}
void ClipBlendNode::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change)
{
Q_UNUSED(change);
}
ClipBlendNode::BlendType Animation::ClipBlendNode::blendType() const
{
return m_blendType;
}
void ClipBlendNode::setClipResults(Qt3DCore::QNodeId animatorId, const ClipResults &clipResults)
{
// Do we already have an entry for this animator?
const int animatorIndex = m_animatorIds.indexOf(animatorId);
if (animatorIndex == -1) {
// Nope, add it
m_animatorIds.push_back(animatorId);
m_clipResults.push_back(clipResults);
} else {
m_clipResults[animatorIndex] = clipResults;
}
}
ClipResults ClipBlendNode::clipResults(Qt3DCore::QNodeId animatorId) const
{
const int animatorIndex = m_animatorIds.indexOf(animatorId);
if (animatorIndex != -1)
return m_clipResults[animatorIndex];
return ClipResults();
}
/*
\fn QVector<Qt3DCore::QNodeId> ClipBlendNode::currentDependencyIds() const
\internal
Each subclass of ClipBlendNode must implement this function such that it
returns a vector of the ids of ClipBlendNodes upon which is it dependent
in order to be able to evaluate given its current internal state.
For example, a subclass implementing a simple lerp blend between two
other nodes, would always return the ids of the nodes between which it
is lerping.
A more generalised lerp node that is capable of lerping between a
series of nodes would return the ids of the two nodes that correspond
to the blend values which sandwich the currently set blend value.
The animation handler will submit a job that uses this function to
build a list of clips that must be evaluated in order to later
evaluate the entire blend tree. In this way, the clips can all be
evaluated in one pass, and the tree in a subsequent pass.
*/
/*
\fn QVector<Qt3DCore::QNodeId> ClipBlendNode::allDependencyIds() const
\internal
Similar to currentDependencyIds() but returns the ids of all potential
dependency nodes, not just those that are dependencies given the current
internal state. For example a generalised lerp node would return the ids
of all nodes that can participate in the lerp for any value of the blend
parameter. Not just those bounding the current blend value.
*/
/*
\internal
Fetches the ClipResults from the nodes listed in the dependencyIds
and passes them to the doBlend() virtual function which should be
implemented in subclasses to perform the actual blend operation.
The results are then inserted into the clip results for this blend
node indexed by the \a animatorId.
*/
void ClipBlendNode::blend(Qt3DCore::QNodeId animatorId)
{
// Obtain the clip results from each of the dependencies
const QVector<Qt3DCore::QNodeId> dependencyNodeIds = currentDependencyIds();
const int dependencyCount = dependencyNodeIds.size();
QVector<ClipResults> blendData;
blendData.reserve(dependencyCount);
for (const auto dependencyId : dependencyNodeIds) {
ClipBlendNode *dependencyNode = clipBlendNodeManager()->lookupNode(dependencyId);
ClipResults blendDataElement = dependencyNode->clipResults(animatorId);
blendData.push_back(blendDataElement);
}
// Ask the blend node to perform the actual blend operation on the data
// from the dependencies
ClipResults blendedResults = doBlend(blendData);
setClipResults(animatorId, blendedResults);
}
} // Animation
} // Qt3DAnimation
QT_END_NAMESPACE