// Main Thread void QPostman::notifyFrontendNode(const QSceneChangePtr &e) { Q_D(QPostman); if (!e.isNull() && d->m_scene != nullptr) { QNode *n = d->m_scene->lookupNode(e->subjectId()); if (n != nullptr) n->sceneChangeEvent(e); } }
void SortMethod::sceneChangeEvent(const QSceneChangePtr &e) { QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e); if (propertyChange->propertyName() == QByteArrayLiteral("sortCriterion")) { QSortCriterion *c = propertyChange->value().value<QSortCriterion *>(); if (c != Q_NULLPTR) { if (e->type() == NodeAdded) m_criteria.append(c->id()); else if (e->type() == NodeRemoved) m_criteria.removeAll(c->id()); } } else if (propertyChange->propertyName() == QByteArrayLiteral("enabled") && e->type() == NodeUpdated) { setEnabled(propertyChange->value().toBool()); } }
// AspectThread bool QPostman::shouldNotifyFrontend(const QSceneChangePtr &e) { Q_D(QPostman); const QPropertyUpdatedChangePtr propertyChange = qSharedPointerDynamicCast<QPropertyUpdatedChange>(e); if (Q_LIKELY(d->m_scene != nullptr) && !propertyChange.isNull()) { const QScene::NodePropertyTrackData propertyTrackData = d->m_scene->lookupNodePropertyTrackData(e->subjectId()); const QNode::PropertyTrackingMode trackMode = propertyTrackData.trackedPropertiesOverrides.value(QLatin1String(propertyChange->propertyName()), propertyTrackData.defaultTrackMode); switch (trackMode) { case QNode::TrackAllValues: return true; case QNode::DontTrackValues: return false; case QNode::TrackFinalValues: { const bool isIntermediate = QPropertyUpdatedChangeBasePrivate::get(propertyChange.data())->m_isIntermediate; return !isIntermediate; } default: Q_UNREACHABLE(); return false; } } return true; }
void RenderMaterial::sceneChangeEvent(const QSceneChangePtr &e) { QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e); switch (e->type()) { case NodeUpdated: { if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) m_enabled = propertyChange->value().toBool(); break; } // Check for shader parameter case NodeAdded: { if (propertyChange->propertyName() == QByteArrayLiteral("parameter")) m_parameterPack.appendParameter(propertyChange->value().value<QNodeId>()); else if (propertyChange->propertyName() == QByteArrayLiteral("effect")) m_effectUuid = propertyChange->value().value<QNodeId>(); break; } case NodeRemoved: { if (propertyChange->propertyName() == QByteArrayLiteral("parameter")) m_parameterPack.removeParameter(propertyChange->value().value<QNodeId>()); else if (propertyChange->propertyName() == QByteArrayLiteral("effect")) m_effectUuid = QNodeId(); break; } default: break; } }
void RenderTextureImage::sceneChangeEvent(const QSceneChangePtr &e) { QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e); if (e->type() == NodeUpdated) { if (propertyChange->propertyName() == QByteArrayLiteral("layer")) { m_layer = propertyChange->value().toInt(); m_dirty = true; } else if (propertyChange->propertyName() == QByteArrayLiteral("mipmapLevel")) { m_mipmapLevel = propertyChange->value().toInt(); m_dirty = true; } else if (propertyChange->propertyName() == QByteArrayLiteral("cubeMapFace")) { m_face = static_cast<QAbstractTextureProvider::CubeMapFace>(propertyChange->value().toInt()); m_dirty = true; } else if (propertyChange->propertyName() == QByteArrayLiteral("dataFunctor")) { m_functor = propertyChange->value().value<QTextureDataFunctorPtr>(); m_dirty = true; } } if (m_dirty) {// Notify the RenderTexture that we were updated and request it to schedule an update job RenderTexture *txt = m_textureManager->data(m_textureProvider); if (txt != Q_NULLPTR) txt->addToPendingTextureJobs(); } }
void ClearBuffer::sceneChangeEvent(const QSceneChangePtr &e) { if (e->type() == NodeUpdated) { QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e); if (propertyChange->propertyName() == QByteArrayLiteral("buffers")) m_type = static_cast<QClearBuffer::BufferType>(propertyChange->value().toInt()); else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) setEnabled(propertyChange->value().toBool()); } }
void MouseInput::sceneChangeEvent(const QSceneChangePtr &e) { if (e->type() == NodeUpdated) { QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e); if (propertyChange->propertyName() == QByteArrayLiteral("controller")) { const QNodeId newId = propertyChange->value().value<QNodeId>(); if (m_mouseController != newId) { setController(newId); } } } }
// Called by the main thread void QNodePrivate::notifyObservers(const QSceneChangePtr &change) { Q_ASSERT(change); // Don't send notifications if we are blocking if (m_blockNotifications && change->type() == PropertyUpdated) return; if (m_changeArbiter != nullptr) { QAbstractPostman *postman = m_changeArbiter->postman(); if (postman != nullptr) postman->notifyBackend(change); } }
void RenderCameraLens::sceneChangeEvent(const QSceneChangePtr &e) { switch (e->type()) { case NodeUpdated: { QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e); if (propertyChange->propertyName() == QByteArrayLiteral("projectionMatrix")) { QMatrix4x4 projectionMatrix = propertyChange->value().value<QMatrix4x4>(); m_projection = projectionMatrix; } else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) { m_enabled = propertyChange->value().toBool(); } } break; default: break; } }
/*! Called when one or more backend aspects sends a notification \a change to the current Qt3DCore::QNode instance. \note This method should be reimplemented in your subclasses to properly handle the \a change. */ void QNode::sceneChangeEvent(const QSceneChangePtr &change) { Q_UNUSED(change); if (change->type() == Qt3DCore::PropertyUpdated) { // TODO: Do this more efficiently. We could pass the metaobject and property // index to the animation aspect via the QChannelMapping. This would // allow us to avoid the propertyIndex lookup here by sending them in // a new subclass of QPropertyUpdateChange. // Try to find property and call setter auto e = qSharedPointerCast<Qt3DCore::QPropertyUpdatedChange>(change); const QMetaObject *mo = metaObject(); const int propertyIndex = mo->indexOfProperty(e->propertyName()); QMetaProperty mp = mo->property(propertyIndex); bool wasBlocked = blockNotifications(true); mp.write(this, e->value()); blockNotifications(wasBlocked); } else { // Nothing is handling this change, warn the user. qWarning() << Q_FUNC_INFO << "sceneChangeEvent should have been subclassed"; } }
void StateSetNode::sceneChangeEvent(const QSceneChangePtr &e) { QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e); switch (e->type()) { case NodeAdded: { if (propertyChange->propertyName() == QByteArrayLiteral("renderState")) { QNodePtr nodePtr = propertyChange->value().value<QNodePtr>(); QRenderState *renderState = static_cast<QRenderState *>(nodePtr.data()); appendRenderState(renderState->id(), RenderState::getOrCreateBackendState(renderState)); } } break; case NodeRemoved: { if (propertyChange->propertyName() == QByteArrayLiteral("renderState")) removeRenderState(propertyChange->value().value<QNodeId>()); } break; default: break; } }
void RenderEntity::sceneChangeEvent(const QSceneChangePtr &e) { QScenePropertyChangePtr propertyChange = qSharedPointerCast<QScenePropertyChange>(e); switch (e->type()) { case ComponentAdded: { QNodePtr nodePtr = propertyChange->value().value<QNodePtr>(); QComponent *component = qobject_cast<QComponent *>(nodePtr.data()); qCDebug(Render::RenderNodes) << Q_FUNC_INFO << "Component Added" << m_objectName << component->objectName(); addComponent(component); break; } case ComponentRemoved: { QNodeId nodeId = propertyChange->value().value<QNodeId>(); qCDebug(Render::RenderNodes) << Q_FUNC_INFO << "Component Removed"; removeComponent(nodeId); break; } default: break; } }