// Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB). // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qlogicaspect.h" #include "qlogicaspect_p.h" #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE namespace Qt3DLogic { using namespace Qt3DCore; /*! \class Qt3DLogic::QLogicAspect \inherits Qt3DCore::QAbstractAspect \inmodule Qt3DLogic \brief Responsible for handling frame synchronization jobs. \since 5.7 */ QLogicAspectPrivate::QLogicAspectPrivate() : QAbstractAspectPrivate() , m_time(0) , m_manager(new Logic::Manager) , m_executor(new Logic::Executor) , m_callbackJob(new Logic::CallbackJob) { m_callbackJob->setManager(m_manager.data()); m_manager->setExecutor(m_executor.data()); } void QLogicAspectPrivate::onEngineAboutToShutdown() { m_executor->setScene(nullptr); } void QLogicAspectPrivate::registerBackendTypes() { Q_Q(QLogicAspect); q->registerBackendType(QBackendNodeMapperPtr(new Logic::HandlerFunctor(m_manager.data()))); } /*! Constructs a new Qt3DLogic::QLogicAspect instance with \a parent. */ QLogicAspect::QLogicAspect(QObject *parent) : QLogicAspect(*new QLogicAspectPrivate(), parent) {} /*! \internal */ QLogicAspect::QLogicAspect(QLogicAspectPrivate &dd, QObject *parent) : QAbstractAspect(dd, parent) { Q_D(QLogicAspect); setObjectName(QStringLiteral("Logic Aspect")); d->registerBackendTypes(); d_func()->m_manager->setLogicAspect(this); } /*! \internal */ QLogicAspect::~QLogicAspect() { } /*! \internal */ std::vector QLogicAspect::jobsToExecute(qint64 time) { Q_D(QLogicAspect); const qint64 deltaTime = time - d->m_time; const float dt = static_cast(deltaTime) / 1.0e9; d->m_manager->setDeltaTime(dt); d->m_time = time; // Create jobs that will get executed by the threadpool if (d->m_manager->hasFrameActions()) return {d->m_callbackJob}; return {}; } /*! \internal */ void QLogicAspect::onRegistered() { } /*! \internal */ void QLogicAspect::onEngineStartup() { Q_D(QLogicAspect); d->m_executor->setScene(d->m_arbiter->scene()); } } // namespace Qt3DLogic QT_END_NAMESPACE QT3D_REGISTER_NAMESPACED_ASPECT("logic", QT_PREPEND_NAMESPACE(Qt3DLogic), QLogicAspect) #include "moc_qlogicaspect.cpp"