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>
99 const int updateSlotIdx =
mo->indexOfSlot(
"update()");
100 if (updateSlotIdx >= 0)
101 m_updateSlot =
mo->method(updateSlotIdx);
103 qWarning(
"QQuick3DTexture: Failed to find update() slot");
109 if (m_sceneManagerForLayer)
284 return m_mappingMode;
302 return m_tilingModeHorizontal;
321 return m_tilingModeVertical;
568 return m_textureData;
594 return m_generateMipmaps;
630 return m_autoOrientation;
639 m_dirtyFlags.setFlag(DirtyFlag::SourceDirty);
640 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty);
641 m_dirtyFlags.setFlag(DirtyFlag::TextureDataDirty);
646void QQuick3DTexture::trySetSourceParent()
648 if (m_sourceItem->
parentItem() && m_sourceItemRefed)
656 if (m_sourceItemRefed) {
659 const bool hide = m_sourceItemReparented;
660 sourcePrivate->derefFromEffectItem(
hide);
661 m_sourceItemRefed =
false;
665 m_sourceItemReparented =
true;
671 if (!m_sourceItemRefed) {
672 const bool hide = m_sourceItemReparented;
673 sourcePrivate->refFromEffectItem(
hide);
688 const bool hide = m_sourceItemReparented;
690 m_sourceItemRefed =
false;
694 if (m_sourceItemReparented) {
696 m_sourceItemReparented =
false;
703 trySetSourceParent();
712 manager->qsgDynamicTextures.removeAll(m_layer);
713 m_sceneManagerForLayer =
nullptr;
716 m_initializedSourceItem =
nullptr;
717 m_initializedSourceItemSize =
QSize();
719 m_dirtyFlags.setFlag(DirtyFlag::SourceDirty);
720 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty);
721 m_dirtyFlags.setFlag(DirtyFlag::TextureDataDirty);
732 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
743 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
784 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
795 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
806 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
817 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
828 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
835 if (m_flipU ==
flipU)
839 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty);
846 if (m_flipV ==
flipV)
850 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty);
867 m_dirtyFlags.setFlag(DirtyFlag::IndexUVDirty);
885 m_textureDataConnection
887 markDirty(DirtyFlag::TextureDataDirty);
891 m_dirtyFlags.setFlag(DirtyFlag::SourceDirty);
892 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty);
893 m_dirtyFlags.setFlag(DirtyFlag::TextureDataDirty);
904 m_dirtyFlags.setFlag(DirtyFlag::SamplerDirty);
915 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty);
926 m_dirtyFlags.setFlag(DirtyFlag::SamplerDirty);
937 m_dirtyFlags.setFlag(DirtyFlag::SamplerDirty);
948 m_dirtyFlags.setFlag(DirtyFlag::SamplerDirty);
954bool QQuick3DTexture::effectiveFlipV(
const QSSGRenderImage &imageNode)
const
957 if (!m_autoOrientation)
1003 if (
path.contains(separator)) {
1010 resolvedPath.
append(separator);
1011 resolvedPath.
append(mapped);
1029 if (m_dirtyFlags.testFlag(DirtyFlag::TransformDirty)) {
1030 m_dirtyFlags.setFlag(DirtyFlag::TransformDirty,
false);
1042 bool nodeChanged =
false;
1043 if (m_dirtyFlags.testFlag(DirtyFlag::SourceDirty)) {
1044 m_dirtyFlags.setFlag(DirtyFlag::SourceDirty,
false);
1045 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty,
true);
1054 if (m_dirtyFlags.testFlag(DirtyFlag::IndexUVDirty)) {
1055 m_dirtyFlags.setFlag(DirtyFlag::IndexUVDirty,
false);
1065 if (m_dirtyFlags.testFlag(DirtyFlag::SamplerDirty)) {
1066 m_dirtyFlags.setFlag(DirtyFlag::SamplerDirty,
false);
1077 if (m_dirtyFlags.testFlag(DirtyFlag::TextureDataDirty)) {
1078 m_dirtyFlags.setFlag(DirtyFlag::TextureDataDirty,
false);
1079 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty,
true);
1087 if (m_dirtyFlags.testFlag(DirtyFlag::SourceItemDirty)) {
1088 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty,
false);
1089 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty,
true);
1102 qWarning(
"Unable to get window, this will probably not work");
1133 if (sourcePrivate->window) {
1151 m_textureUpdateConnection =
connect(sourcePrivate->window, &QQuickWindow::afterSynchronizing,
this, [
this,
sourceItem]() {
1153 if (m_sourceItem != sourceItem) {
1154 disconnect(m_textureProviderConnection);
1155 disconnect(m_textureUpdateConnection);
1163 if (
t->updateTexture())
1168 qWarning(
"No window for item, texture updates are doomed");
1178 if (m_initializedSourceItem != m_sourceItem || m_initializedSourceItemSize != m_sourceItem->
size()) {
1185 m_initializedSourceItem = m_sourceItem;
1186 m_initializedSourceItemSize = m_sourceItem->
size();
1199 manager->qsgDynamicTextures.removeAll(m_layer);
1212 m_sceneManagerForLayer =
manager;
1225 m_sceneManagerForLayer =
nullptr;
1226 m_initializedSourceItem =
nullptr;
1239 m_textureUpdateConnection =
connect(sourcePrivate->
window, &QQuickWindow::afterSynchronizing,
1245 if (m_sourceItem != sourceItem) {
1246 disconnect(m_textureUpdateConnection);
1261 m_layer->setRect(sourceRect);
1266 textureSize.
rwidth() *= 2;
1269 m_layer->setSize(textureSize);
1272 m_layer->updateTexture();
1281 m_layer->setItem(
nullptr);
1290 if (m_dirtyFlags.testFlag(DirtyFlag::FlipVDirty)) {
1291 m_dirtyFlags.setFlag(DirtyFlag::FlipVDirty,
false);
1292 imageNode->
m_flipV = effectiveFlipV(*imageNode);
1305 if (change == QQuick3DObject::ItemChange::ItemSceneChange) {
1308 disconnect(m_sceneManagerWindowChangeConnection);
1310 if (m_sceneManagerForLayer) {
1312 m_sceneManagerForLayer =
nullptr;
1314 trySetSourceParent();
1315 const auto &sceneManager =
value.sceneManager;
1319 sceneManager->qsgDynamicTextures << m_layer;
1320 m_sceneManagerForLayer = sceneManager;
1334 if (sceneManager && m_sourceItem && !m_sourceItem->
window()) {
1335 if (sceneManager->window()) {
1339 [
this, sceneManager]
1341 if (m_sourceItem && !m_sourceItem->
window() && sceneManager->window())
1348 if (m_textureData) {
1349 const auto &sceneManager =
value.sceneManager;
1364 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty);
1369void QQuick3DTexture::sourceItemDestroyed(
QObject *
item)
1374 m_sourceItem =
nullptr;
1376 m_dirtyFlags.setFlag(DirtyFlag::SourceDirty);
1377 m_dirtyFlags.setFlag(DirtyFlag::SourceItemDirty);
1378 m_dirtyFlags.setFlag(DirtyFlag::TextureDataDirty);
1383void QQuick3DTexture::markDirty(QQuick3DTexture::DirtyFlag
type)
1385 if (!m_dirtyFlags.testFlag(
type)) {
1386 m_dirtyFlags.setFlag(
type,
true);
1399 m_dirtyFlags = DirtyFlags(0xFFFF);
static constexpr QChar fromLatin1(char c) noexcept
Converts the Latin-1 character c to its equivalent QChar.
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 QFile.
QPointer< QQuick3DSceneManager > sceneManager
void refSceneManager(QQuick3DSceneManager &)
static QQuick3DObjectPrivate * get(QQuick3DObject *item)
QSSGRenderGraphObject * spatialNode
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)
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)
void mappingModeChanged()
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
QSGRenderContext * sceneGraphRenderContext() const
void removeItemChangeListener(QQuickItemChangeListener *, ChangeTypes types)
void derefFromEffectItem(bool unhide)
void addItemChangeListener(QQuickItemChangeListener *listener, ChangeTypes types)
void refWindow(QQuickWindow *)
QQuickDeliveryAgent * ensureSubsceneDeliveryAgent()
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
Returns true if the string has no characters; otherwise returns false.
QString & append(QChar c)
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_horizontalTilingMode
QSSGRenderTextureFilterOp m_minFilterType
QSSGRenderTextureCoordOp m_verticalTilingMode
QSSGRenderTextureData * m_rawTextureData
QSSGRenderTextureFilterOp m_magFilterType
QSGTexture * m_qsgTexture
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent