/**************************************************************************** ** ** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt3D module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:COMM$ ** ** 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 https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** $QT_END_LICENSE$ ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ****************************************************************************/ #include "qbackendnode.h" #include "qbackendnode_p.h" #include #include #include #include #include QT_BEGIN_NAMESPACE namespace Qt3DCore { /*! \internal */ QBackendNodeMapper::~QBackendNodeMapper() { } QBackendNodePrivate::QBackendNodePrivate(QBackendNode::Mode mode) : q_ptr(nullptr) , m_mode(mode) , m_arbiter(nullptr) , m_enabled(false) { } // Called by backend thread (renderer or other) while we are locked to sync changes void QBackendNodePrivate::setArbiter(QLockableObserverInterface *arbiter) { Q_ASSERT(m_mode == QBackendNode::ReadWrite); m_arbiter = arbiter; } // Called by backend thread/worker threads. We don't need locking // as setting/unsetting the arbiter cannot happen at that time void QBackendNodePrivate::notifyObservers(const QSceneChangePtr &e) { Q_ASSERT(m_mode == QBackendNode::ReadWrite); if (m_arbiter != nullptr) m_arbiter->sceneChangeEvent(e); } void QBackendNodePrivate::sceneChangeEvent(const QSceneChangePtr &e) { q_func()->sceneChangeEvent(e); } void QBackendNodePrivate::setEnabled(bool enabled) { m_enabled = enabled; } QBackendNodePrivate *QBackendNodePrivate::get(QBackendNode *n) { return n->d_func(); } void QBackendNodePrivate::addedToEntity(QNode *frontend) { Q_UNUSED(frontend) } void QBackendNodePrivate::removedFromEntity(QNode *frontend) { Q_UNUSED(frontend) } void QBackendNodePrivate::componentAdded(QNode *frontend) { Q_UNUSED(frontend) } void QBackendNodePrivate::componentRemoved(QNode *frontend) { Q_UNUSED(frontend) } /*! * \class Qt3DCore::QBackendNodeMapper * \inheaderfile Qt3DCore/QBackendNodeMapper * \inmodule Qt3DCore * * \brief Creates and maps backend nodes to their respective frontend nodes. */ /*! * \fn Qt3DCore::QBackendNode *Qt3DCore::QBackendNodeMapper::create(const Qt3DCore::QNodeCreatedChangeBasePtr &change) const * * \TODO * * \a change * * \return created node. */ /*! * \fn Qt3DCore::QBackendNode * Qt3DCore::QBackendNodeMapper::get(Qt3DCore::QNodeId id) const * * \return backend node for the given node \a id. */ /*! * \fn void Qt3DCore::QBackendNodeMapper::destroy(Qt3DCore::QNodeId id) const * * Destroys the backend node for the given node \a id. */ /*! * \class Qt3DCore::QBackendNode * \inheaderfile Qt3DCore/QBackendNode * \inmodule Qt3DCore * * \brief The base class for all Qt3D backend nodes. */ /*! * \enum Qt3DCore::QBackendNode::Mode * * The mode for the backend node. * * \value ReadOnly * \value ReadWrite */ QBackendNode::QBackendNode(QBackendNode::Mode mode) : d_ptr(new QBackendNodePrivate(mode)) { d_ptr->q_ptr = this; } QBackendNode::~QBackendNode() { delete d_ptr; } /*! * Sets the peer \a id. */ void QBackendNode::setPeerId(QNodeId id) Q_DECL_NOTHROW { Q_D(QBackendNode); d->m_peerId = id; } /*! * \return the peer id of the backend node. */ QNodeId QBackendNode::peerId() const Q_DECL_NOTHROW { Q_D(const QBackendNode); return d->m_peerId; } /*! * \return \c true if the backend node is enabled. */ bool QBackendNode::isEnabled() const Q_DECL_NOTHROW { Q_D(const QBackendNode); return d->m_enabled; } /*! * \return the mode of the backend mode. */ QBackendNode::Mode QBackendNode::mode() const Q_DECL_NOTHROW { Q_D(const QBackendNode); return d->m_mode; } /*! * \internal */ QBackendNode::QBackendNode(QBackendNodePrivate &dd) : d_ptr(&dd) { d_ptr->q_ptr = this; } /*! * Notifies observers of scene change \a e. * \obsolete */ void QBackendNode::notifyObservers(const QSceneChangePtr &e) { Q_D(QBackendNode); d->notifyObservers(e); } /*! \obsolete Send the command named \a name with contents \a data, and specify \a replyTo as the command id to which the reply needs to be sent. */ QNodeCommand::CommandId QBackendNode::sendCommand(const QString &name, const QVariant &data, QNodeCommand::CommandId replyTo) { auto e = QNodeCommandPtr::create(peerId()); e->setName(name); e->setData(data); e->setReplyToCommandId(replyTo); e->setDeliveryFlags(QSceneChange::Nodes); notifyObservers(e); return e->commandId(); } /*! Send the reply to \a command. \obsolete */ void QBackendNode::sendReply(const QNodeCommandPtr &command) { command->setDeliveryFlags(QSceneChange::Nodes); notifyObservers(command); } /*! * \obsolete */ void QBackendNode::initializeFromPeer(const QNodeCreatedChangeBasePtr &change) { Q_UNUSED(change) qCDebug(Nodes) << Q_FUNC_INFO << change->metaObject()->className() << "does not override"; } /*! * Enables or disables the backend node by \a enabled. */ void QBackendNode::setEnabled(bool enabled) Q_DECL_NOTHROW { Q_D(QBackendNode); d->m_enabled = enabled; } /*! * \obsolete */ void QBackendNode::sceneChangeEvent(const QSceneChangePtr &e) { Q_D(QBackendNode); switch (e->type()) { case PropertyUpdated: { auto propertyChange = qSharedPointerCast(e); if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) d->m_enabled = propertyChange->value().toBool(); break; } default: break; } } } // Qt3D QT_END_NAMESPACE