Revision control
Copy as Markdown
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
// Qt-Security score:significant reason:default
#ifndef QSSGIMAGE_H
#define QSSGIMAGE_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtQuick3D/qquick3dobject.h>
#include <QtQuick3D/QQuick3DTextureData>
#include <QtQuick/private/qquickitemchangelistener_p.h>
#include <QtQuick/private/qsgadaptationlayer_p.h>
#include <QtQuick/QQuickItem>
#include <QtQuick/QSGNode>
#include <QtCore/QUrl>
#include <QtCore/QPointer>
QT_BEGIN_NAMESPACE
class QSGLayer;
struct QSSGRenderImage;
class QQuick3DRenderExtension;
class QQuickWindow;
class QQuick3DTextureInternalChange
{
public:
enum class Type {
BackendNode,
};
Type type;
};
class Q_QUICK3D_EXPORT QQuick3DTexture : public QQuick3DObject, public QQuickItemChangeListener
{
Q_OBJECT
Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
Q_PROPERTY(QQuickItem *sourceItem READ sourceItem WRITE setSourceItem NOTIFY sourceItemChanged)
Q_PROPERTY(QQuick3DTextureData *textureData READ textureData WRITE setTextureData NOTIFY textureDataChanged)
Q_PROPERTY(QQuick3DRenderExtension *textureProvider READ textureProvider WRITE setTextureProvider NOTIFY textureProviderChanged FINAL REVISION(6, 7))
Q_PROPERTY(float scaleU READ scaleU WRITE setScaleU NOTIFY scaleUChanged)
Q_PROPERTY(float scaleV READ scaleV WRITE setScaleV NOTIFY scaleVChanged)
Q_PROPERTY(MappingMode mappingMode READ mappingMode WRITE setMappingMode NOTIFY mappingModeChanged)
Q_PROPERTY(TilingMode tilingModeHorizontal READ horizontalTiling WRITE setHorizontalTiling NOTIFY horizontalTilingChanged)
Q_PROPERTY(TilingMode tilingModeVertical READ verticalTiling WRITE setVerticalTiling NOTIFY verticalTilingChanged)
Q_PROPERTY(TilingMode tilingModeDepth READ depthTiling WRITE setDepthTiling NOTIFY depthTilingChanged REVISION(6, 7))
Q_PROPERTY(float rotationUV READ rotationUV WRITE setRotationUV NOTIFY rotationUVChanged)
Q_PROPERTY(float positionU READ positionU WRITE setPositionU NOTIFY positionUChanged)
Q_PROPERTY(float positionV READ positionV WRITE setPositionV NOTIFY positionVChanged)
Q_PROPERTY(float pivotU READ pivotU WRITE setPivotU NOTIFY pivotUChanged)
Q_PROPERTY(float pivotV READ pivotV WRITE setPivotV NOTIFY pivotVChanged)
Q_PROPERTY(bool flipU READ flipU WRITE setFlipU NOTIFY flipUChanged)
Q_PROPERTY(bool flipV READ flipV WRITE setFlipV NOTIFY flipVChanged)
Q_PROPERTY(int indexUV READ indexUV WRITE setIndexUV NOTIFY indexUVChanged)
Q_PROPERTY(Filter magFilter READ magFilter WRITE setMagFilter NOTIFY magFilterChanged)
Q_PROPERTY(Filter minFilter READ minFilter WRITE setMinFilter NOTIFY minFilterChanged)
Q_PROPERTY(Filter mipFilter READ mipFilter WRITE setMipFilter NOTIFY mipFilterChanged)
Q_PROPERTY(bool generateMipmaps READ generateMipmaps WRITE setGenerateMipmaps NOTIFY generateMipmapsChanged)
Q_PROPERTY(bool autoOrientation READ autoOrientation WRITE setAutoOrientation NOTIFY autoOrientationChanged REVISION(6, 2))
QML_NAMED_ELEMENT(Texture)
public:
enum MappingMode
{
UV = 0,
Environment = 1,
LightProbe = 2,
};
Q_ENUM(MappingMode)
enum TilingMode // must match QSSGRenderTextureCoordOp
{
ClampToEdge = 1,
MirroredRepeat,
Repeat
};
Q_ENUM(TilingMode)
enum Filter { // must match QSSGRenderTextureFilterOp
None = 0,
Nearest,
Linear
};
Q_ENUM(Filter)
explicit QQuick3DTexture(QQuick3DObject *parent = nullptr);
~QQuick3DTexture() override;
QUrl source() const;
QQuickItem *sourceItem() const;
float scaleU() const;
float scaleV() const;
MappingMode mappingMode() const;
TilingMode horizontalTiling() const;
TilingMode verticalTiling() const;
Q_REVISION(6, 7) TilingMode depthTiling() const;
float rotationUV() const;
float positionU() const;
float positionV() const;
float pivotU() const;
float pivotV() const;
bool flipU() const;
bool flipV() const;
int indexUV() const;
Filter magFilter() const;
Filter minFilter() const;
Filter mipFilter() const;
QQuick3DTextureData *textureData() const;
bool generateMipmaps() const;
bool autoOrientation() const;
QSSGRenderImage *getRenderImage();
Q_REVISION(6, 7) QQuick3DRenderExtension *textureProvider() const;
Q_REVISION(6, 7) void setTextureProvider(QQuick3DRenderExtension *newRenderTexture);
bool hasSourceData() const
{
return !m_source.isEmpty() || m_sourceItem || m_textureData;
}
public Q_SLOTS:
void setSource(const QUrl &source);
void setSourceItem(QQuickItem *sourceItem);
void setScaleU(float scaleU);
void setScaleV(float scaleV);
void setMappingMode(QQuick3DTexture::MappingMode mappingMode);
void setHorizontalTiling(QQuick3DTexture::TilingMode tilingModeHorizontal);
void setVerticalTiling(QQuick3DTexture::TilingMode tilingModeVertical);
Q_REVISION(6, 7) void setDepthTiling(QQuick3DTexture::TilingMode tilingModeDepth);
void setRotationUV(float rotationUV);
void setPositionU(float positionU);
void setPositionV(float positionV);
void setPivotU(float pivotU);
void setPivotV(float pivotV);
void setFlipU(bool flipU);
void setFlipV(bool flipV);
void setIndexUV(int indexUV);
void setMagFilter(QQuick3DTexture::Filter magFilter);
void setMinFilter(QQuick3DTexture::Filter minFilter);
void setMipFilter(QQuick3DTexture::Filter mipFilter);
void setTextureData(QQuick3DTextureData * textureData);
void setGenerateMipmaps(bool generateMipmaps);
void setAutoOrientation(bool autoOrientation);
Q_SIGNALS:
void sourceChanged();
void sourceItemChanged();
void scaleUChanged();
void scaleVChanged();
void mappingModeChanged();
void horizontalTilingChanged();
void verticalTilingChanged();
Q_REVISION(6, 7) void depthTilingChanged();
void rotationUVChanged();
void positionUChanged();
void positionVChanged();
void pivotUChanged();
void pivotVChanged();
void flipUChanged();
void flipVChanged();
void indexUVChanged();
void magFilterChanged();
void minFilterChanged();
void mipFilterChanged();
void textureDataChanged();
void generateMipmapsChanged();
void autoOrientationChanged();
Q_REVISION(6, 7) void textureProviderChanged();
Q_REVISION(6, 12) void textureInternalChange(QQuick3DTextureInternalChange, QPrivateSignal);
protected:
QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
void markAllDirty() override;
void itemChange(ItemChange change, const ItemChangeData &value) override;
void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &geometry) override;
explicit QQuick3DTexture(QQuick3DObjectPrivate &dd, QQuick3DObject *parent = nullptr);
private Q_SLOTS:
void sourceItemDestroyed(QObject *item);
void sourceItemWindowChanged(QQuickWindow *window);
private:
enum class DirtyFlag {
TransformDirty = (1 << 0),
SourceDirty = (1 << 1),
IndexUVDirty = (1 << 2),
TextureDataDirty = (1 << 3),
SamplerDirty = (1 << 4),
SourceItemDirty = (1 << 5),
FlipVDirty = (1 << 6),
ExtensionDirty = (1 << 7)
};
Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
void markDirty(DirtyFlag type, bool requestSecondaryUpdate = false);
void trySetSourceParent();
bool effectiveFlipV(const QSSGRenderImage &imageNode) const;
QUrl m_source;
QQuickItem *m_sourceItem = nullptr;
bool m_sourceItemReparented = false;
bool m_sourceItemRefed = false;
QSGLayer *m_layer = nullptr;
float m_scaleU = 1.0f;
float m_scaleV = 1.0f;
MappingMode m_mappingMode = UV;
TilingMode m_tilingModeHorizontal = Repeat;
TilingMode m_tilingModeVertical = Repeat;
TilingMode m_tilingModeDepth = Repeat;
float m_rotationUV = 0;
float m_positionU = 0;
float m_positionV = 0;
float m_pivotU = 0;
float m_pivotV = 0;
bool m_flipU = false;
bool m_flipV = false;
int m_indexUV = 0;
Filter m_magFilter = Linear;
Filter m_minFilter = Linear;
Filter m_mipFilter = None;
DirtyFlags m_dirtyFlags = DirtyFlags(DirtyFlag::TransformDirty)
| DirtyFlags(DirtyFlag::SourceDirty)
| DirtyFlags(DirtyFlag::IndexUVDirty)
| DirtyFlags(DirtyFlag::TextureDataDirty);
QMetaObject::Connection m_textureProviderConnection;
QMetaObject::Connection m_textureUpdateConnection;
QQuick3DSceneManager *m_sceneManagerForLayer = nullptr;
QMetaObject::Connection m_sceneManagerWindowChangeConnection;
QQuickItem *m_initializedSourceItem = nullptr;
QSizeF m_initializedSourceItemSize;
QHash<QByteArray, QMetaObject::Connection> m_connections;
QMetaObject::Connection m_textureDataConnection;
QQuick3DTextureData *m_textureData = nullptr;
bool m_generateMipmaps = false;
bool m_autoOrientation = true;
QQuick3DRenderExtension *m_renderExtension = nullptr;
};
QT_END_NAMESPACE
#endif // QSSGIMAGE_H