| /**************************************************************************** |
| ** |
| ** 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 "updateskinningpalettejob_p.h" |
| #include <Qt3DRender/private/nodemanagers_p.h> |
| #include <Qt3DRender/private/managers_p.h> |
| #include <Qt3DRender/private/handle_types_p.h> |
| #include <Qt3DRender/private/job_common_p.h> |
| |
| QT_BEGIN_NAMESPACE |
| |
| namespace Qt3DRender { |
| namespace Render { |
| |
| UpdateSkinningPaletteJob::UpdateSkinningPaletteJob() |
| : Qt3DCore::QAspectJob() |
| , m_nodeManagers(nullptr) |
| , m_root() |
| { |
| SET_JOB_RUN_STAT_TYPE(this, JobTypes::UpdateSkinningPalette, 0); |
| } |
| |
| UpdateSkinningPaletteJob::~UpdateSkinningPaletteJob() |
| { |
| } |
| |
| void UpdateSkinningPaletteJob::run() |
| { |
| auto armatureManager = m_nodeManagers->armatureManager(); |
| if (armatureManager->count() == 0) |
| return; |
| |
| // TODO: Decompose this job across several jobs, say one per skeleton so |
| // that it can be done in parallel |
| |
| // Update the local pose transforms of JointInfo's in Skeletons from |
| // the set of dirty joints. |
| for (const auto &jointHandle : qAsConst(m_dirtyJoints)) { |
| Joint *joint = m_nodeManagers->jointManager()->data(jointHandle); |
| Q_ASSERT(joint); |
| Skeleton *skeleton = m_nodeManagers->skeletonManager()->data(joint->owningSkeleton()); |
| Q_ASSERT(skeleton); |
| if (skeleton->isEnabled() && joint->isEnabled()) |
| skeleton->setLocalPose(jointHandle, joint->localPose()); |
| } |
| |
| // Find all the armature components and update their skinning palettes |
| QVector<HArmature> dirtyArmatures; |
| m_root->traverse([&dirtyArmatures](Entity *entity) { |
| const auto armatureHandle = entity->componentHandle<Armature>(); |
| if (!armatureHandle.isNull() && !dirtyArmatures.contains(armatureHandle)) |
| dirtyArmatures.push_back(armatureHandle); |
| }); |
| |
| // Update the skeleton for each dirty armature |
| auto skeletonManager = m_nodeManagers->skeletonManager(); |
| for (const auto &armatureHandle : qAsConst(dirtyArmatures)) { |
| auto armature = armatureManager->data(armatureHandle); |
| Q_ASSERT(armature); |
| |
| auto skeletonId = armature->skeletonId(); |
| auto skeleton = skeletonManager->lookupResource(skeletonId); |
| Q_ASSERT(skeleton); |
| |
| const QVector<QMatrix4x4> skinningPalette = skeleton->calculateSkinningMatrixPalette(); |
| armature->skinningPaletteUniform().setData(skinningPalette); |
| } |
| } |
| |
| } // namespace Render |
| } // namespace Qt3DRender |
| |
| QT_END_NAMESPACE |