Revision control

++ // Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB).
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++
++ #include "qabstracttexture.h"
++ #include "qabstracttexture_p.h"
++ #include <Qt3DRender/qabstracttextureimage.h>
++
++ QT_BEGIN_NAMESPACE
++
++
++ namespace Qt3DRender {
++
++ using namespace Qt3DCore;
++
++ QAbstractTexturePrivate::QAbstractTexturePrivate()
++ : QNodePrivate()
++ , m_target(QAbstractTexture::Target2D)
++ , m_format(QAbstractTexture::Automatic)
++ , m_width(1)
++ , m_height(1)
++ , m_depth(1)
++ , m_autoMipMap(false)
++ , m_minFilter(QAbstractTexture::Nearest)
++ , m_magFilter(QAbstractTexture::Nearest)
++ , m_status(QAbstractTexture::None)
++ , m_maximumAnisotropy(1.0f)
++ , m_comparisonFunction(QAbstractTexture::CompareLessEqual)
++ , m_comparisonMode(QAbstractTexture::CompareNone)
++ , m_layers(1)
++ , m_samples(1)
++ , m_mipmapLevels(1)
++ , m_sharedTextureId(-1)
++ , m_handleType(QAbstractTexture::NoHandle)
++ , m_handle(QVariant())
++ {
++ }
++
++ QTextureGeneratorPtr QAbstractTexturePrivate::dataFunctor() const
++ {
++ return m_dataFunctor;
++ }
++
++ void QAbstractTexturePrivate::setDataFunctor(const QTextureGeneratorPtr &generator)
++ {
++ if (generator != m_dataFunctor) {
++ m_dataFunctor = generator;
++ update();
++ }
++ }
++
++ void QAbstractTexturePrivate::setStatus(QAbstractTexture::Status status)
++ {
++ Q_Q(QAbstractTexture);
++ if (m_status != status) {
++ m_status = status;
++ const bool blocked = q->blockNotifications(true);
++ q->statusChanged(status);
++ q->blockNotifications(blocked);
++ }
++ }
++
++ void QAbstractTexturePrivate::setHandle(const QVariant &handle)
++ {
++ Q_Q(QAbstractTexture);
++ if (m_handle != handle) {
++ m_handle = handle;
++ const bool blocked = q->blockNotifications(true);
++ emit q->handleChanged(handle);
++ q->blockNotifications(blocked);
++ }
++ }
++
++ void QAbstractTexturePrivate::setHandleType(QAbstractTexture::HandleType type)
++ {
++ Q_Q(QAbstractTexture);
++ if (m_handleType != type) {
++ m_handleType = type;
++ const bool blocked = q->blockNotifications(true);
++ emit q->handleTypeChanged(type);
++ q->blockNotifications(blocked);
++ }
++ }
++
++ /*!
++ \class Qt3DRender::QAbstractTexture
++ \inmodule Qt3DRender
++ \since 5.5
++ \brief A base class to be used to provide textures.
++
++ The QAbstractTexture class shouldn't be used directly but rather through
++ one of its subclasses. Each subclass implements a given texture target (2D,
++ 2DArray, 3D, CubeMap ...) Each subclass provides a set of functors for each
++ layer, cube map face and mipmap level. In turn the backend uses those
++ functor to properly fill a corresponding OpenGL texture with data. It is
++ expected the functor does as minimal processing as possible so as not
++ to slow down textures generation and upload. If the content of a texture is
++ the result of a slow procedural generation process, it is recommended not
++ to implement this directly in a functor.
++
++ All textures are unique. If you instantiate twice the same texture this
++ will create 2 identical textures on the GPU, no sharing will take place.
++ */
++
++ /*!
++ \qmltype AbstractTexture
++ \nativetype Qt3DRender::QAbstractTexture
++ \inqmlmodule Qt3D.Render
++ \since 5.5
++ \brief A base class to be used to provide textures.
++
++ The AbstractTexture class shouldn't be used directly but rather through one
++ of its subclasses. Each subclass implements a given texture target (2D,
++ 2DArray, 3D, CubeMap ...) Each subclass provides a set of functors for each
++ layer, cube map face and mipmap level. In turn the backend uses those
++ functor to properly fill a corresponding OpenGL texture with data. It is
++ expected the functor does as minimal processing as possible so as not to
++ slow down textures generation and upload. If the content of a texture is
++ the result of a slow procedural generation process, it is recommended not
++ to implement this directly in a functor.
++
++ All textures are unique. If you instantiate twice the same texture this
++ will create 2 identical textures on the GPU, no sharing will take place.
++ */
++
++ /*!
++ \enum Qt3DRender::QAbstractTexture::CubeMapFace
++
++ This enum identifies the faces of a cube map texture
++ \value CubeMapPositiveX Specify the positive X face of a cube map
++ \value CubeMapNegativeX Specify the negative X face of a cube map
++ \value CubeMapPositiveY Specify the positive Y face of a cube map
++ \value CubeMapNegativeY Specify the negative Y face of a cube map
++ \value CubeMapPositiveZ Specify the positive Z face of a cube map
++ \value CubeMapNegativeZ Specify the negative Z face of a cube map
++ \value AllFaces Specify all the faces of a cube map
++
++ \note AllFaces should only be used when a behavior needs to be applied to
++ all the faces of a cubemap. This is the case for example when using a cube
++ map as a texture attachment. Using AllFaces in the attachment specfication
++ would result in all faces being bound to the attachment point. On the other
++ hand, if a specific face is specified, the attachment would only be using
++ the specified face.
++ */
++
++ /*!
++ \enum Qt3DRender::QAbstractTexture::TextureFormat
++
++ This list describes all possible texture formats
++
++ \value NoFormat
++ GL_NONE
++ \value Automatic
++ automatically_determines_format
++ \value R8_UNorm
++ GL_R8
++ \value RG8_UNorm
++ GL_RG8
++ \value RGB8_UNorm
++ GL_RGB8
++ \value RGBA8_UNorm
++ GL_RGBA8
++ \value R16_UNorm
++ GL_R16
++ \value RG16_UNorm
++ GL_RG16
++ \value RGB16_UNorm
++ GL_RGB16
++ \value RGBA16_UNorm
++ GL_RGBA16
++ \value R8_SNorm
++ GL_R8_SNORM
++ \value RG8_SNorm
++ GL_RG8_SNORM
++ \value RGB8_SNorm
++ GL_RGB8_SNORM
++ \value RGBA8_SNorm
++ GL_RGBA8_SNORM
++ \value R16_SNorm
++ GL_R16_SNORM
++ \value RG16_SNorm
++ GL_RG16_SNORM
++ \value RGB16_SNorm
++ GL_RGB16_SNORM
++ \value RGBA16_SNorm
++ GL_RGBA16_SNORM
++ \value R8U
++ GL_R8UI
++ \value RG8U
++ GL_RG8UI
++ \value RGB8U
++ GL_RGB8UI
++ \value RGBA8U
++ GL_RGBA8UI
++ \value R16U
++ GL_R16UI
++ \value RG16U
++ GL_RG16UI
++ \value RGB16U
++ GL_RGB16UI
++ \value RGBA16U
++ GL_RGBA16UI
++ \value R32U
++ GL_R32UI
++ \value RG32U
++ GL_RG32UI
++ \value RGB32U
++ GL_RGB32UI
++ \value RGBA32U
++ GL_RGBA32UI
++ \value R8I
++ GL_R8I
++ \value RG8I
++ GL_RG8I
++ \value RGB8I
++ GL_RGB8I
++ \value RGBA8I
++ GL_RGBA8I
++ \value R16I
++ GL_R16I
++ \value RG16I
++ GL_RG16I
++ \value RGB16I
++ GL_RGB16I
++ \value RGBA16I
++ GL_RGBA16I
++ \value R32I
++ GL_R32I
++ \value RG32I
++ GL_RG32I
++ \value RGB32I
++ GL_RGB32I
++ \value RGBA32I
++ GL_RGBA32I
++ \value R16F
++ GL_R16F
++ \value RG16F
++ GL_RG16F
++ \value RGB16F
++ GL_RGB16F
++ \value RGBA16F
++ GL_RGBA16F
++ \value R32F
++ GL_R32F
++ \value RG32F
++ GL_RG32F
++ \value RGB32F
++ GL_RGB32F
++ \value RGBA32F
++ GL_RGBA32F
++ \value RGB9E5
++ GL_RGB9_E5
++ \value RG11B10F
++ GL_R11F_G11F_B10F
++ \value RG3B2
++ GL_R3_G3_B2
++ \value R5G6B5
++ GL_RGB565
++ \value RGB5A1
++ GL_RGB5_A1
++ \value RGBA4
++ GL_RGBA4
++ \value RGB10A2
++ GL_RGB10_A2
++ \value RGB10A2U
++ GL_RGB10_A2UI
++ \value D16
++ GL_DEPTH_COMPONENT16
++ \value D24
++ GL_DEPTH_COMPONENT24
++ \value D24S8
++ GL_DEPTH24_STENCIL8
++ \value D32
++ GL_DEPTH_COMPONENT32
++ \value D32F
++ GL_DEPTH_COMPONENT32F
++ \value D32FS8X24
++ GL_DEPTH32F_STENCIL8
++ \value RGB_DXT1
++ GL_COMPRESSED_RGB_S3TC_DXT1_EXT
++ \value RGBA_DXT1
++ GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
++ \value RGBA_DXT3
++ GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
++ \value RGBA_DXT5
++ GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
++ \value R_ATI1N_UNorm
++ GL_COMPRESSED_RED_RGTC1
++ \value R_ATI1N_SNorm
++ GL_COMPRESSED_SIGNED_RED_RGTC1
++ \value RG_ATI2N_UNorm
++ GL_COMPRESSED_RG_RGTC2
++ \value RG_ATI2N_SNorm
++ GL_COMPRESSED_SIGNED_RG_RGTC2
++ \value RGB_BP_UNSIGNED_FLOAT
++ GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
++ \value RGB_BP_SIGNED_FLOAT
++ GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
++ \value RGB_BP_UNorm
++ GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
++ \value R11_EAC_UNorm
++ GL_COMPRESSED_R11_EAC
++ \value R11_EAC_SNorm
++ GL_COMPRESSED_SIGNED_R11_EAC
++ \value RG11_EAC_UNorm
++ GL_COMPRESSED_RG11_EAC
++ \value RG11_EAC_SNorm
++ GL_COMPRESSED_SIGNED_RG11_EAC
++ \value RGB8_ETC2
++ GL_COMPRESSED_RGB8_ETC2
++ \value SRGB8_ETC2
++ GL_COMPRESSED_SRGB8_ETC2
++ \value RGB8_PunchThrough_Alpha1_ETC2
++ GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
++ \value SRGB8_PunchThrough_Alpha1_ETC2
++ GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
++ \value RGBA8_ETC2_EAC
++ GL_COMPRESSED_RGBA8_ETC2_EAC
++ \value SRGB8_Alpha8_ETC2_EAC
++ GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
++ \value RGB8_ETC1
++ GL_ETC1_RGB8_OES
++ \value SRGB8
++ GL_SRGB8
++ \value SRGB8_Alpha8
++ GL_SRGB8_ALPHA8
++ \value SRGB_DXT1
++ GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
++ \value SRGB_Alpha_DXT1
++ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
++ \value SRGB_Alpha_DXT3
++ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
++ \value SRGB_Alpha_DXT5
++ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
++ \value SRGB_BP_UNorm
++ GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
++ \value DepthFormat
++ GL_DEPTH_COMPONENT
++ \value AlphaFormat
++ GL_ALPHA
++ \value RGBFormat
++ GL_RGB
++ \value RGBAFormat
++ GL_RGBA
++ \value LuminanceFormat
++ GL_LUMINANCE
++ \value LuminanceAlphaFormat
++ 0x190A
++ */
++
++ /*!
++ * The constructor creates a new QAbstractTexture::QAbstractTexture
++ * instance with the specified \a parent.
++ */
++ QAbstractTexture::QAbstractTexture(QNode *parent)
++ : QNode(*new QAbstractTexturePrivate, parent)
++ {
++ }
++
++ /*!
++ * The constructor creates a new QAbstractTexture::QAbstractTexture
++ * instance with the specified \a target and \a parent.
++ */
++ QAbstractTexture::QAbstractTexture(Target target, QNode *parent)
++ : QNode(*new QAbstractTexturePrivate, parent)
++ {
++ d_func()->m_target = target;
++ }
++
++ /*! \internal */
++ QAbstractTexture::~QAbstractTexture()
++ {
++ }
++
++ /*! \internal */
++ QAbstractTexture::QAbstractTexture(QAbstractTexturePrivate &dd, QNode *parent)
++ : QNode(dd, parent)
++ {
++ }
++
++ /*!
++ Sets the size of the texture provider to width \a w, height \a h and depth \a d.
++ */
++ void QAbstractTexture::setSize(int w, int h, int d)
++ {
++ setWidth(w);
++ setHeight(h);
++ setDepth(d);
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::width
++
++ Holds the width of the texture provider.
++ */
++ /*!
++ \qmlproperty int Qt3D.Render::AbstractTexture::width
++
++ Holds the width of the texture provider.
++ */
++
++ /*!
++ Set the width of the texture provider to \a width.
++ */
++ void QAbstractTexture::setWidth(int width)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_width != width) {
++ d->m_width = width;
++ emit widthChanged(width);
++ }
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::height
++
++ Holds the height of the texture provider.
++ */
++ /*!
++ \qmlproperty int Qt3D.Render::AbstractTexture::height
++
++ Holds the height of the texture provider.
++ */
++ /*!
++ Set the height to \a height.
++ */
++ void QAbstractTexture::setHeight(int height)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_height != height) {
++ d->m_height = height;
++ emit heightChanged(height);
++ }
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::depth
++
++ Holds the depth of the texture provider.
++ */
++ /*!
++ \qmlproperty int Qt3D.Render::AbstractTexture::depth
++
++ Holds the depth of the texture provider.
++ */
++ /*!
++ Set the depth of the texture to \a depth.
++ */
++ void QAbstractTexture::setDepth(int depth)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_depth != depth) {
++ d->m_depth = depth;
++ emit depthChanged(depth);
++ }
++ }
++
++ /*!
++ * Returns the width of the texture
++ */
++ int QAbstractTexture::width() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_width;
++ }
++
++ /*!
++ * Returns the height of the texture
++ */
++ int QAbstractTexture::height() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_height;
++ }
++
++ /*!
++ * Returns the depth of the texture
++ */
++ int QAbstractTexture::depth() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_depth;
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::layers
++
++ Holds the maximum layer count of the texture provider. By default, the
++ maximum layer count is 1.
++
++ \note this has a meaning only for texture providers that have 3D or
++ array target formats.
++ */
++ /*!
++ \qmlproperty int Qt3D.Render::AbstractTexture::layers
++
++ Holds the maximum layer count of the texture provider. By default, the
++ maximum layer count is 1.
++
++ \note this has a meaning only for texture providers that have 3D or
++ array target formats.
++ */
++ /*!
++ Set the maximum layer count to \a layers.
++ */
++ void QAbstractTexture::setLayers(int layers)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_layers != layers) {
++ d->m_layers = layers;
++ emit layersChanged(layers);
++ }
++ }
++
++ /*!
++ Returns the maximum number of layers for the texture provider.
++
++ \note this has a meaning only for texture providers that have 3D or
++ array target formats.
++ */
++ int QAbstractTexture::layers() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_layers;
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::samples
++
++ Holds the number of samples per texel for the texture provider.
++ By default, the number of samples is 1.
++
++ \note this has a meaning only for texture providers that have multisample
++ formats.
++ */
++ /*!
++ \qmlproperty int Qt3D.Render::AbstractTexture::samples
++
++ Holds the number of samples per texel for the texture provider.
++ By default, the number of samples is 1.
++
++ \note this has a meaning only for texture providers that have multisample
++ formats.
++ */
++ /*!
++ Set the number of samples per texel to \a samples.
++ */
++ void QAbstractTexture::setSamples(int samples)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_samples != samples) {
++ d->m_samples = samples;
++ emit samplesChanged(samples);
++ }
++ }
++
++ void QAbstractTexture::setMipLevels(int mipLevels)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_mipmapLevels != mipLevels) {
++ d->m_mipmapLevels = mipLevels;
++ emit mipLevelsChanged(mipLevels);
++ }
++ }
++
++ /*!
++ Returns the number of samples per texel for the texture provider.
++
++ \note this has a meaning only for texture providers that have multisample
++ formats.
++ */
++ int QAbstractTexture::samples() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_samples;
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::mipLevels
++
++ Holds the mipmap levels of the texture provider.
++ */
++ int QAbstractTexture::mipLevels() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_mipmapLevels;
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::format
++
++ Holds the format of the texture provider.
++ */
++ /*!
++ \qmlproperty TextureFormat Qt3D.Render::AbstractTexture::format
++
++ Holds the format of the texture provider.
++ */
++ /*!
++ Set the texture format to \a format.
++ */
++ void QAbstractTexture::setFormat(TextureFormat format)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_format != format) {
++ d->m_format = format;
++ emit formatChanged(format);
++ }
++ }
++
++ /*!
++ Returns the texture provider's format.
++ */
++ QAbstractTexture::TextureFormat QAbstractTexture::format() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_format;
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::status readonly
++
++ Holds the current status of the texture provider.
++ */
++ /*!
++ \qmlproperty Status Qt3D.Render::AbstractTexture::status readonly
++
++ Holds the current status of the texture provider.
++ */
++
++ /*!
++ \enum Qt3DRender::QAbstractTexture::Status
++
++ Contains the status of the texture provider.
++
++ \value None
++ \value Loading
++ \value Ready
++ \value Error
++ */
++ /*!
++ Set the status of the texture provider to the specified \a status.
++ */
++ void QAbstractTexture::setStatus(Status status)
++ {
++ Q_D(QAbstractTexture);
++ if (status != d->m_status) {
++ d->m_status = status;
++ const bool blocked = blockNotifications(true);
++ emit statusChanged(status);
++ blockNotifications(blocked);
++ }
++ }
++
++ /*!
++ * \internal
++ */
++ void QAbstractTexture::setHandle(const QVariant &handle)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_handle != handle) {
++ d->m_handle = handle;
++ const bool blocked = blockNotifications(true);
++ emit handleChanged(handle);
++ blockNotifications(blocked);
++ }
++ }
++
++ /*!
++ * \internal
++ */
++ void QAbstractTexture::setHandleType(QAbstractTexture::HandleType type)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_handleType != type) {
++ d->m_handleType = type;
++ const bool blocked = blockNotifications(true);
++ emit handleTypeChanged(type);
++ blockNotifications(blocked);
++ }
++ }
++
++ /*!
++ * Returns the current status of the texture provider.
++ */
++ QAbstractTexture::Status QAbstractTexture::status() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_status;
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::target readonly
++
++ Holds the target format of the texture provider.
++
++ \note The target format can only be set once.
++ */
++ /*!
++ \qmlproperty Target Qt3D.Render::AbstractTexture::target readonly
++
++ Holds the target format of the texture provider.
++
++ \note The target format can only be set once.
++ */
++ /*!
++ \enum Qt3DRender::QAbstractTexture::Target
++
++ \value TargetAutomatic
++ Target will be determined by the Qt3D engine
++ \value Target1D
++ GL_TEXTURE_1D
++ \value Target1DArray
++ GL_TEXTURE_1D_ARRAY
++ \value Target2D
++ GL_TEXTURE_2D
++ \value Target2DArray
++ GL_TEXTURE_2D_ARRAY
++ \value Target3D
++ GL_TEXTURE_3D
++ \value TargetCubeMap
++ GL_TEXTURE_CUBE_MAP
++ \value TargetCubeMapArray
++ GL_TEXTURE_CUBE_MAP_ARRAY
++ \value Target2DMultisample
++ GL_TEXTURE_2D_MULTISAMPLE
++ \value Target2DMultisampleArray
++ GL_TEXTURE_2D_MULTISAMPLE_ARRAY
++ \value TargetRectangle
++ GL_TEXTURE_RECTANGLE
++ \value TargetBuffer
++ GL_TEXTURE_BUFFER
++ */
++
++ /*!
++ Returns the target format of the texture provider.
++ */
++ QAbstractTexture::Target QAbstractTexture::target() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_target;
++ }
++
++ /*!
++ Adds a new Qt3DCore::QAbstractTextureImage \a textureImage to the texture provider.
++
++ \note Qt3DRender::QAbstractTextureImage should never be shared between multiple
++ Qt3DRender::QAbstractTexture instances.
++ */
++ void QAbstractTexture::addTextureImage(QAbstractTextureImage *textureImage)
++ {
++ Q_ASSERT(textureImage);
++ Q_D(QAbstractTexture);
++ if (!d->m_textureImages.contains(textureImage)) {
++ d->m_textureImages.append(textureImage);
++
++ // Ensures proper bookkeeping
++ d->registerDestructionHelper(textureImage, &QAbstractTexture::removeTextureImage, d->m_textureImages);
++
++ // We need to add it as a child of the current node if it has been declared inline
++ // Or not previously added as a child of the current node so that
++ // 1) The backend gets notified about it's creation
++ // 2) When the current node is destroyed, it gets destroyed as well
++ if (!textureImage->parent())
++ textureImage->setParent(this);
++
++ d->update();
++ }
++ }
++
++ /*!
++ Removes a Qt3DCore::QAbstractTextureImage \a textureImage from the texture provider.
++ */
++ void QAbstractTexture::removeTextureImage(QAbstractTextureImage *textureImage)
++ {
++ Q_ASSERT(textureImage);
++ Q_D(QAbstractTexture);
++ if (!d->m_textureImages.removeOne(textureImage))
++ return;
++ d->update();
++ // Remove bookkeeping connection
++ d->unregisterDestructionHelper(textureImage);
++ }
++
++ /*!
++ Returns a list of pointers to QAbstractTextureImage objects contained in
++ the texture provider.
++ */
++ QList<QAbstractTextureImage *> QAbstractTexture::textureImages() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_textureImages;
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::generateMipMaps
++
++ Holds whether the texture provider should auto generate mipmaps.
++ */
++ /*!
++ \qmlproperty bool Qt3D.Render::AbstractTexture::generateMipMaps
++
++ Holds whether the texture provider should auto generate mipmaps.
++ */
++ /*!
++ Boolean parameter \a gen sets a flag indicating whether the
++ texture provider should generate mipmaps or not.
++ */
++ void QAbstractTexture::setGenerateMipMaps(bool gen)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_autoMipMap != gen) {
++ d->m_autoMipMap = gen;
++ emit generateMipMapsChanged(gen);
++ }
++ }
++
++ bool QAbstractTexture::generateMipMaps() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_autoMipMap;
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::minificationFilter
++
++ Holds the minification filter of the texture provider.
++ */
++ /*!
++ \qmlproperty Filter Qt3D.Render::AbstractTexture::minificationFilter
++
++ Holds the minification filter of the texture provider.
++ */
++ /*!
++ Set the minification filter to the specified value \a f.
++ */
++ void QAbstractTexture::setMinificationFilter(Filter f)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_minFilter != f) {
++ d->m_minFilter = f;
++ emit minificationFilterChanged(f);
++ }
++ }
++ /*!
++ \enum Qt3DRender::QAbstractTexture::Filter
++
++ Holds the filter type of the texture provider.
++
++ \value Nearest
++ GL_NEAREST
++ \value Linear
++ GL_LINEAR
++ \value NearestMipMapNearest
++ GL_NEAREST_MIPMAP_NEAREST
++ \value NearestMipMapLinear
++ GL_NEAREST_MIPMAP_LINEAR
++ \value LinearMipMapNearest
++ GL_LINEAR_MIPMAP_NEAREST
++ \value LinearMipMapLinear
++ GL_LINEAR_MIPMAP_LINEAR
++ */
++ /*!
++ \property Qt3DRender::QAbstractTexture::magnificationFilter
++
++ Holds the magnification filter of the texture provider.
++ */
++ /*!
++ \qmlproperty Filter Qt3D.Render::AbstractTexture::magnificationFilter
++
++ Holds the magnification filter of the texture provider.
++ */
++ /*!
++ Set the magnification filter to \a f.
++ */
++ void QAbstractTexture::setMagnificationFilter(Filter f)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_magFilter != f) {
++ d->m_magFilter = f;
++ emit magnificationFilterChanged(f);
++ }
++ }
++
++ QAbstractTexture::Filter QAbstractTexture::minificationFilter() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_minFilter;
++ }
++
++ QAbstractTexture::Filter QAbstractTexture::magnificationFilter() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_magFilter;
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::wrapMode
++
++ Holds the wrap mode of the texture provider.
++ */
++ /*!
++ \qmlproperty QTextureWrapMode Qt3D.Render::AbstractTexture::wrapMode
++
++ Holds the wrap mode of the texture provider.
++ */
++ /*!
++ Set the wrapmode to the value specified in \a wrapMode.
++ */
++ void QAbstractTexture::setWrapMode(const QTextureWrapMode &wrapMode)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_wrapMode.x() != wrapMode.x()) {
++ d->m_wrapMode.setX(wrapMode.x());
++ d->update();
++ }
++ if (d->m_wrapMode.y() != wrapMode.y()) {
++ d->m_wrapMode.setY(wrapMode.y());
++ d->update();
++ }
++ if (d->m_wrapMode.z() != wrapMode.z()) {
++ d->m_wrapMode.setZ(wrapMode.z());
++ d->update();
++ }
++ }
++
++ QTextureWrapMode *QAbstractTexture::wrapMode()
++ {
++ Q_D(QAbstractTexture);
++ return &d->m_wrapMode;
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::maximumAnisotropy
++
++ Holds the maximum anisotropy of the texture provider.
++ */
++ /*!
++ \qmlproperty bool Qt3D.Render::AbstractTexture::maximumAnisotropy
++
++ Holds the maximum anisotropy of the texture provider.
++ */
++ /*!
++ Sets the maximum anisotropy to \a anisotropy.
++ */
++ void QAbstractTexture::setMaximumAnisotropy(float anisotropy)
++ {
++ Q_D(QAbstractTexture);
++ if (!qFuzzyCompare(d->m_maximumAnisotropy, anisotropy)) {
++ d->m_maximumAnisotropy = anisotropy;
++ emit maximumAnisotropyChanged(anisotropy);
++ }
++ }
++
++ /*!
++ * Returns the current maximum anisotropy
++ */
++ float QAbstractTexture::maximumAnisotropy() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_maximumAnisotropy;
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::comparisonFunction
++
++ Holds the comparison function of the texture provider.
++ */
++ /*!
++ \qmlproperty ComparisonFunction Qt3D.Render::AbstractTexture::ComparisonFunction
++
++ Holds the comparison function of the texture provider.
++ */
++ /*!
++ Set the comparison function to \a function.
++ */
++ void QAbstractTexture::setComparisonFunction(QAbstractTexture::ComparisonFunction function)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_comparisonFunction != function) {
++ d->m_comparisonFunction = function;
++ emit comparisonFunctionChanged(function);
++ }
++ }
++
++ /*!
++ * Returns the current comparison function.
++ */
++ QAbstractTexture::ComparisonFunction QAbstractTexture::comparisonFunction() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_comparisonFunction;
++ }
++
++ /*!
++ \property Qt3DRender::QAbstractTexture::comparisonMode
++
++ Holds the comparison mode of the texture provider.
++ */
++
++ /*!
++ \qmlproperty ComparisonMode Qt3D.Render::AbstractTexture::ComparisonMode
++
++ Holds the comparison mode of the texture provider.
++ */
++ /*!
++ Set the comparison mode to \a mode.
++ */
++ void QAbstractTexture::setComparisonMode(QAbstractTexture::ComparisonMode mode)
++ {
++ Q_D(QAbstractTexture);
++ if (d->m_comparisonMode != mode) {
++ d->m_comparisonMode = mode;
++ emit comparisonModeChanged(mode);
++ }
++ }
++
++ /*!
++ * Returns the current comparison mode.
++ */
++ QAbstractTexture::ComparisonMode QAbstractTexture::comparisonMode() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_comparisonMode;
++ }
++
++ /*!
++ * \property Qt3DRender::QAbstractTexture::handleType
++ *
++ * Holds the current texture handle type.
++ */
++
++ /*!
++ * \qmlproperty enumeration AbstractTexture::handleType
++ *
++ * Holds the current texture handle type.
++ *
++ * \value AbstractTexture.NoHandle
++ * \value AbstractTexture.OpenGLTextureId
++ */
++
++ /*!
++ * \return the current texture handle type.
++ * \since 5.13
++ */
++ QAbstractTexture::HandleType QAbstractTexture::handleType() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_handleType;
++ }
++
++ /*!
++ * \property Qt3DRender::QAbstractTexture::handle
++ *
++ * Holds the current texture handle, if Qt 3D is using the OpenGL renderer,
++ * handle is a texture id integer.
++ */
++
++ /*!
++ * \qmlproperty var AbstractTexture::handle
++ *
++ * Holds the current texture handle, if Qt 3D is using the OpenGL renderer,
++ * handle is a texture id integer.
++ */
++
++ /*!
++ * \return the current texture handle, if Qt 3D is using the OpenGL renderer,
++ * handle is a texture id integer.
++ *
++ * \since 5.13
++ */
++ QVariant QAbstractTexture::handle() const
++ {
++ Q_D(const QAbstractTexture);
++ return d->m_handle;
++ }
++
++ /*!
++ * Updates a sub region of the texture, defined by \a update, without having
++ * to change the data generator or rely on adding or removing texture images.
++ * \since 5.14
++ */
++ void QAbstractTexture::updateData(const QTextureDataUpdate &update)
++ {
++ Q_D(QAbstractTexture);
++
++ d->m_pendingDataUpdates.push_back(update);
++ d->update();
++ }
++
++ } // namespace Qt3DRender
++
++ QT_END_NAMESPACE
++
++ #include "moc_qabstracttexture.cpp"