5#include <QtQuick3DRuntimeRender/private/qssgrenderimage_p.h>
6#include <QtQuick3DRuntimeRender/private/qssgrendertexturedata_p.h>
7#include <QtQuick3DRuntimeRender/private/qssgrenderloadedtexture_p.h>
8#include <QtQml/QQmlFile>
9#include <QtQuick/QQuickItem>
10#include <QtQuick/private/qquickitem_p.h>
11#include <QtCore/qmath.h>
13#include <ssg/qssgrenderextensions.h>
103 const int updateSlotIdx =
mo->indexOfSlot(
"update()");
104 if (updateSlotIdx >= 0)
105 m_updateSlot =
mo->method(updateSlotIdx);
107 qWarning(
"QQuick3DTexture: Failed to find update() slot");
113 if (m_sceneManagerForLayer)
288 return m_mappingMode;
306 return m_tilingModeHorizontal;
325 return m_tilingModeVertical;
342 return m_tilingModeDepth;
589 return m_textureData;
615 return m_generateMipmaps;
651 return m_autoOrientation;
670 return m_renderExtension;
679 m_dirtyFlags.setFlag(DirtyFlag::SourceDirty);
680 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty);
681 m_dirtyFlags.setFlag(DirtyFlag::TextureDataDirty);
686void QQuick3DTexture::trySetSourceParent()
688 if (m_sourceItem->
parentItem() && m_sourceItemRefed)
696 if (m_sourceItemRefed) {
699 const bool hide = m_sourceItemReparented;
700 sourcePrivate->derefFromEffectItem(
hide);
701 m_sourceItemRefed =
false;
705 m_sourceItemReparented =
true;
711 if (!m_sourceItemRefed) {
712 const bool hide = m_sourceItemReparented;
713 sourcePrivate->refFromEffectItem(
hide);
728 const bool hide = m_sourceItemReparented;
729 sourcePrivate->derefFromEffectItem(
hide);
730 m_sourceItemRefed =
false;
734 if (m_sourceItemReparented) {
736 m_sourceItemReparented =
false;
743 trySetSourceParent();
747 sourcePrivate->ensureSubsceneDeliveryAgent();
752 manager->qsgDynamicTextures.removeAll(m_layer);
753 m_sceneManagerForLayer =
nullptr;
756 m_initializedSourceItem =
nullptr;
757 m_initializedSourceItemSize =
QSize();
759 m_dirtyFlags.setFlag(DirtyFlag::SourceDirty);
760 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty);
761 m_dirtyFlags.setFlag(DirtyFlag::TextureDataDirty);
772 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
783 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
823 emit depthTilingChanged();
833 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
844 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
855 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
866 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
877 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
884 if (m_flipU ==
flipU)
888 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
895 if (m_flipV ==
flipV)
899 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty);
916 m_dirtyFlags.setFlag(DirtyFlag::IndexUVDirty);
934 m_textureDataConnection
936 markDirty(DirtyFlag::TextureDataDirty);
940 m_dirtyFlags.setFlag(DirtyFlag::SourceDirty);
941 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty);
942 m_dirtyFlags.setFlag(DirtyFlag::TextureDataDirty);
953 m_dirtyFlags.setFlag(DirtyFlag::SamplerDirty);
964 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty);
975 m_dirtyFlags.setFlag(DirtyFlag::SamplerDirty);
986 m_dirtyFlags.setFlag(DirtyFlag::SamplerDirty);
997 m_dirtyFlags.setFlag(DirtyFlag::SamplerDirty);
1003bool QQuick3DTexture::effectiveFlipV(
const QSSGRenderImage &imageNode)
const
1006 if (!m_autoOrientation)
1025 if (m_textureData || m_renderExtension)
1051 QChar separator = QChar::fromLatin1(
';');
1052 if (
path.contains(separator)) {
1059 resolvedPath.append(separator);
1060 resolvedPath.append(mapped);
1078 if (m_dirtyFlags.testFlag(DirtyFlag::TransformDirty)) {
1079 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty,
false);
1091 bool nodeChanged =
false;
1092 if (m_dirtyFlags.testFlag(DirtyFlag::SourceDirty)) {
1093 m_dirtyFlags.setFlag(DirtyFlag::SourceDirty,
false);
1094 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty,
true);
1103 if (m_dirtyFlags.testFlag(DirtyFlag::IndexUVDirty)) {
1104 m_dirtyFlags.setFlag(DirtyFlag::IndexUVDirty,
false);
1116 if (m_dirtyFlags.testFlag(DirtyFlag::SamplerDirty)) {
1117 m_dirtyFlags.setFlag(DirtyFlag::SamplerDirty,
false);
1128 if (m_dirtyFlags.testFlag(DirtyFlag::TextureDataDirty)) {
1129 m_dirtyFlags.setFlag(DirtyFlag::TextureDataDirty,
false);
1130 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty,
true);
1138 if (m_dirtyFlags.testFlag(DirtyFlag::ExtensionDirty)) {
1139 bool extDirty =
false;
1140 if (m_renderExtension) {
1144 extDirty = (sn ==
nullptr);
1145 if (sn &&
QSSG_GUARD(sn->type == QSSGRenderGraphObject::Type::RenderExtension))
1149 m_dirtyFlags.setFlag(DirtyFlag::ExtensionDirty, extDirty);
1150 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty,
true);
1155 if (m_dirtyFlags.testFlag(DirtyFlag::SourceItemDirty)) {
1156 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty,
false);
1157 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty,
true);
1170 qWarning(
"Unable to get window, this will probably not work");
1176 const bool isHiddenView3D = !m_sourceItem->
isVisible() && (qobject_cast<QQuick3DViewport *>(m_sourceItem) !=
nullptr);
1206 if (sourcePrivate->window) {
1224 m_textureUpdateConnection =
connect(sourcePrivate->window, &QQuickWindow::afterSynchronizing,
this, [
this,
sourceItem]() {
1226 if (m_sourceItem != sourceItem) {
1227 disconnect(m_textureProviderConnection);
1228 disconnect(m_textureUpdateConnection);
1236 if (
t->updateTexture())
1241 qWarning(
"No window for item, texture updates are doomed");
1251 if (m_initializedSourceItem != m_sourceItem || m_initializedSourceItemSize != m_sourceItem->
size()) {
1258 m_initializedSourceItem = m_sourceItem;
1259 m_initializedSourceItemSize = m_sourceItem->
size();
1272 manager->qsgDynamicTextures.removeAll(m_layer);
1285 m_sceneManagerForLayer =
manager;
1298 m_sceneManagerForLayer =
nullptr;
1299 m_initializedSourceItem =
nullptr;
1312 m_textureUpdateConnection =
connect(sourcePrivate->window, &QQuickWindow::afterSynchronizing,
1318 if (m_sourceItem != sourceItem) {
1319 disconnect(m_textureUpdateConnection);
1334 m_layer->setRect(sourceRect);
1339 textureSize.
rwidth() *= 2;
1342 m_layer->setSize(textureSize);
1345 m_layer->updateTexture();
1354 m_layer->setItem(
nullptr);
1363 if (m_dirtyFlags.testFlag(DirtyFlag::FlipVDirty)) {
1364 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty,
false);
1365 imageNode->
m_flipV = effectiveFlipV(*imageNode);
1378 if (change == QQuick3DObject::ItemChange::ItemSceneChange) {
1381 disconnect(m_sceneManagerWindowChangeConnection);
1383 if (m_sceneManagerForLayer) {
1385 m_sceneManagerForLayer =
nullptr;
1387 trySetSourceParent();
1388 const auto &sceneManager =
value.sceneManager;
1392 sceneManager->qsgDynamicTextures << m_layer;
1393 m_sceneManagerForLayer = sceneManager;
1407 if (sceneManager && m_sourceItem && !m_sourceItem->
window()) {
1408 if (sceneManager->window()) {
1412 [
this, sceneManager]
1414 if (m_sourceItem && !m_sourceItem->
window() && sceneManager->window())
1421 if (m_textureData) {
1422 const auto &sceneManager =
value.sceneManager;
1437 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty);
1442void QQuick3DTexture::sourceItemDestroyed(
QObject *
item)
1447 m_sourceItem =
nullptr;
1449 m_dirtyFlags.setFlag(DirtyFlag::SourceDirty);
1450 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty);
1451 m_dirtyFlags.setFlag(DirtyFlag::TextureDataDirty);
1456void QQuick3DTexture::markDirty(QQuick3DTexture::DirtyFlag
type)
1458 if (!m_dirtyFlags.testFlag(
type)) {
1459 m_dirtyFlags.setFlag(
type,
true);
1472 m_dirtyFlags = DirtyFlags(0xFFFF);
1485 m_dirtyFlags.setFlag(DirtyFlag::SourceDirty);
1486 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty);
1487 m_dirtyFlags.setFlag(DirtyFlag::TextureDataDirty);
1488 m_dirtyFlags.setFlag(DirtyFlag::ExtensionDirty);
1490 emit textureProviderChanged();
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
QThread * thread() const
Returns the thread in which the object lives.
void destroyed(QObject *=nullptr)
This signal is emitted immediately before the object obj is destroyed, after any instances of QPointe...
void deleteLater()
\threadsafe
The QQmlContext class defines a context within a QML engine.
static QString urlToLocalFileOrQrc(const QString &)
If url is a local file returns a path suitable for passing to \l{QFile}.
void refSceneManager(QQuick3DSceneManager &)
static QQuick3DObjectPrivate * get(QQuick3DObject *item)
static void attachWatcher(Context *context, Setter setter, Object3D *newO, Object3D *oldO)
Attach a object-destroyed-watcher to an object that's not owned.
\qmltype Object3D \inqmlmodule QtQuick3D \instantiates QQuick3DObject \inherits QtObject
virtual QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node)
virtual void itemChange(ItemChange, const ItemChangeData &)
virtual void markAllDirty()
QVector< QSGDynamicTexture * > qsgDynamicTextures
\qmltype TextureData \inherits Object3D \inqmlmodule QtQuick3D \instantiates QQuick3DTextureData
void textureDataNodeDirty()
void setPivotV(float pivotV)
void setScaleV(float scaleV)
void setHorizontalTiling(QQuick3DTexture::TilingMode tilingModeHorizontal)
void setAutoOrientation(bool autoOrientation)
TilingMode tilingModeVertical
void setPivotU(float pivotU)
Q_REVISION(6, 7) void setDepthTiling(QQuick3DTexture void setRotationUV(float rotationUV)
void autoOrientationChanged()
void setTextureData(QQuick3DTextureData *textureData)
void setMipFilter(QQuick3DTexture::Filter mipFilter)
TilingMode tilingModeHorizontal
void setSourceItem(QQuickItem *sourceItem)
void itemChange(ItemChange change, const ItemChangeData &value) override
void horizontalTilingChanged()
void setVerticalTiling(QQuick3DTexture::TilingMode tilingModeVertical)
void verticalTilingChanged()
void markAllDirty() override
void setGenerateMipmaps(bool generateMipmaps)
QQuick3DTextureData * textureData
void generateMipmapsChanged()
void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &geometry) override
void setIndexUV(int indexUV)
void setPositionU(float positionU)
QQuick3DRenderExtension * textureProvider
\qmlproperty RenderExtension QtQuick3D::Texture::textureProvider
void mappingModeChanged()
TilingMode tilingModeDepth
void setPositionV(float positionV)
~QQuick3DTexture() override
void setSource(const QUrl &source)
void setFlipV(bool flipV)
QQuick3DTexture(QQuick3DObject *parent=nullptr)
\qmltype Texture \inherits Object3D \inqmlmodule QtQuick3D
QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node) override
void setMagFilter(QQuick3DTexture::Filter magFilter)
void setMappingMode(QQuick3DTexture::MappingMode mappingMode)
QSSGRenderImage * getRenderImage()
void setMinFilter(QQuick3DTexture::Filter minFilter)
TilingMode verticalTiling() const
\qmlproperty enumeration QtQuick3D::Texture::tilingModeVertical
void setFlipU(bool flipU)
void setScaleU(float scaleU)
void textureDataChanged()
TilingMode horizontalTiling() const
\qmlproperty enumeration QtQuick3D::Texture::tilingModeHorizontal
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
void setParentItem(QQuickItem *parent)
virtual QSGTextureProvider * textureProvider() const
Returns the texture provider for an item.
QQuickWindow * window() const
Returns the window in which this item is rendered.
qreal width
This property holds the width of this item.
QQuickItem * parentItem() const
qreal height
This property holds the height of this item.
\qmltype Window \instantiates QQuickWindow \inqmlmodule QtQuick
\inmodule QtCore\reentrant
constexpr qreal height() const noexcept
Returns the height of the rectangle.
constexpr qreal width() const noexcept
Returns the width of the rectangle.
constexpr void setWidth(qreal w) noexcept
Sets the width of the rectangle to the given finite width.
constexpr void setHeight(qreal h) noexcept
Sets the height of the rectangle to the given finite height.
virtual QSGLayer * createLayer(QSGRenderContext *renderContext)=0
The QSGDynamicTexture class serves as a baseclass for dynamically changing textures,...
virtual bool updateTexture()=0
Call this function to explicitly update the dynamic texture.
virtual void setItem(QSGNode *item)=0
QSGContext * sceneGraphContext() const
The QSGTextureProvider class encapsulates texture based entities in QML.
void textureChanged()
This signal is emitted when the texture changes.
constexpr int height() const noexcept
Returns the height.
constexpr int width() const noexcept
Returns the width.
constexpr int & rheight() noexcept
Returns a reference to the height.
constexpr int & rwidth() noexcept
Returns a reference to the width.
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
static QThread * currentThread()
bool isRelative() const
Returns true if the URL is relative; otherwise returns false.
bool isEmpty() const
Returns true if the URL has no data; otherwise returns false.
QString path(ComponentFormattingOptions options=FullyDecoded) const
Returns the path of the URL.
The QVector2D class represents a vector or vertex in 2D space.
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
bool qFuzzyIsNull(qfloat16 f) noexcept
constexpr T qAbs(const T &t)
GLsizei const GLuint * paths
GLsizei GLsizei GLchar * source
GLsizei const GLchar *const * path
QQmlContext * qmlContext(const QObject *obj)
static QSSGRenderPath resolveImagePath(const QUrl &url, const QQmlContext *context)
QT_BEGIN_NAMESPACE bool qUpdateIfNeeded(T &orig, T updated)
static const QSize minTextureSize
QSSGRenderTextureFilterOp
static FileType fileType(const QFileInfo &fi)
if(qFloatDistance(a, b)<(1<< 7))
[0]
QUrl url("example.com")
[constructor-url-reference]
obj metaObject() -> className()
myObject disconnect()
[26]
QNetworkAccessManager manager
QSSGRenderTextureFilterOp m_mipFilterType
MappingModes m_mappingMode
QSSGRenderPath m_imagePath
QSSGRenderTextureCoordOp m_depthTilingMode
QSSGRenderTextureCoordOp m_horizontalTilingMode
QSSGRenderTextureFilterOp m_minFilterType
QSSGRenderExtension * m_extensionsSource
QSSGRenderTextureCoordOp m_verticalTilingMode
QSSGRenderTextureData * m_rawTextureData
QSSGRenderTextureFilterOp m_magFilterType
QSGTexture * m_qsgTexture