Revision control
Copy as Markdown
// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QTest>
#include <QSignalSpy>
#include <QtQuick3D/QQuick3DTextureData>
#include <QtQuick3D/private/qquick3dobject_p.h>
#include <QtQuick3D/private/qquick3dtexture_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrendertexturedata_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrenderimage_p.h>
class tst_QQuick3DTextureData : public QObject
{
Q_OBJECT
private Q_SLOTS:
void testProperties();
};
namespace {
QSSGRenderTextureFormat::Format convertToBackendFormat(QQuick3DTextureData::Format format)
{
switch (format) {
case QQuick3DTextureData::None:
case QQuick3DTextureData::RGBA8:
return QSSGRenderTextureFormat::RGBA8;
case QQuick3DTextureData::RGBA16F:
return QSSGRenderTextureFormat::RGBA16F;
case QQuick3DTextureData::RGBA32F:
return QSSGRenderTextureFormat::RGBA32F;
case QQuick3DTextureData::RGBE8:
return QSSGRenderTextureFormat::RGBE8;
case QQuick3DTextureData::R8:
return QSSGRenderTextureFormat::R8;
case QQuick3DTextureData::R16:
return QSSGRenderTextureFormat::R16;
case QQuick3DTextureData::R16F:
return QSSGRenderTextureFormat::R16F;
case QQuick3DTextureData::R32F:
return QSSGRenderTextureFormat::R32F;
case QQuick3DTextureData::BC1:
return QSSGRenderTextureFormat::BC1;
case QQuick3DTextureData::BC2:
return QSSGRenderTextureFormat::BC2;
case QQuick3DTextureData::BC3:
return QSSGRenderTextureFormat::BC3;
case QQuick3DTextureData::BC4:
return QSSGRenderTextureFormat::BC4;
case QQuick3DTextureData::BC5:
return QSSGRenderTextureFormat::BC5;
case QQuick3DTextureData::BC6H:
return QSSGRenderTextureFormat::BC6H;
case QQuick3DTextureData::BC7:
return QSSGRenderTextureFormat::BC7;
case QQuick3DTextureData::DXT1_RGBA:
return QSSGRenderTextureFormat::RGBA_DXT1;
case QQuick3DTextureData::DXT1_RGB:
return QSSGRenderTextureFormat::RGB_DXT1;
case QQuick3DTextureData::DXT3_RGBA:
return QSSGRenderTextureFormat::RGBA_DXT3;
case QQuick3DTextureData::DXT5_RGBA:
return QSSGRenderTextureFormat::RGBA_DXT5;
case QQuick3DTextureData::ETC2_RGB8:
return QSSGRenderTextureFormat::RGB8_ETC2;
case QQuick3DTextureData::ETC2_RGB8A1:
return QSSGRenderTextureFormat::RGB8_PunchThrough_Alpha1_ETC2;
case QQuick3DTextureData::ETC2_RGBA8:
return QSSGRenderTextureFormat::RGBA8_ETC2_EAC;
case QQuick3DTextureData::ASTC_4x4:
return QSSGRenderTextureFormat::RGBA_ASTC_4x4;
case QQuick3DTextureData::ASTC_5x4:
return QSSGRenderTextureFormat::RGBA_ASTC_5x4;
case QQuick3DTextureData::ASTC_5x5:
return QSSGRenderTextureFormat::RGBA_ASTC_5x5;
case QQuick3DTextureData::ASTC_6x5:
return QSSGRenderTextureFormat::RGBA_ASTC_6x5;
case QQuick3DTextureData::ASTC_6x6:
return QSSGRenderTextureFormat::RGBA_ASTC_6x6;
case QQuick3DTextureData::ASTC_8x5:
return QSSGRenderTextureFormat::RGBA_ASTC_8x5;
case QQuick3DTextureData::ASTC_8x6:
return QSSGRenderTextureFormat::RGBA_ASTC_8x6;
case QQuick3DTextureData::ASTC_8x8:
return QSSGRenderTextureFormat::RGBA_ASTC_8x8;
case QQuick3DTextureData::ASTC_10x5:
return QSSGRenderTextureFormat::RGBA_ASTC_10x5;
case QQuick3DTextureData::ASTC_10x6:
return QSSGRenderTextureFormat::RGBA_ASTC_10x6;
case QQuick3DTextureData::ASTC_10x8:
return QSSGRenderTextureFormat::RGBA_ASTC_10x8;
case QQuick3DTextureData::ASTC_10x10:
return QSSGRenderTextureFormat::RGBA_ASTC_10x10;
case QQuick3DTextureData::ASTC_12x10:
return QSSGRenderTextureFormat::RGBA_ASTC_12x10;
case QQuick3DTextureData::ASTC_12x12:
return QSSGRenderTextureFormat::RGBA_ASTC_12x12;
default:
return QSSGRenderTextureFormat::RGBA8;
}
}
}
void tst_QQuick3DTextureData::testProperties()
{
QQuick3DTextureData textureData;
auto *node = static_cast<QSSGRenderTextureData *>(QQuick3DObjectPrivate::updateSpatialNode(&textureData, nullptr));
const auto originalNode = node; // for comparisons later...
QVERIFY(node);
// test for expected defaults
QVERIFY(textureData.textureData().isNull());
QVERIFY(textureData.size().isEmpty());
QVERIFY(!textureData.hasTransparency());
QVERIFY(textureData.format() == QQuick3DTextureData::RGBA8);
const QSize size(16, 16);
textureData.setSize(size);
node = static_cast<QSSGRenderTextureData *>(QQuick3DObjectPrivate::updateSpatialNode(&textureData, node));
QCOMPARE(originalNode, node);
QCOMPARE(size, node->size());
const bool isTransparent = true;
textureData.setHasTransparency(isTransparent);
node = static_cast<QSSGRenderTextureData *>(QQuick3DObjectPrivate::updateSpatialNode(&textureData, node));
QCOMPARE(originalNode, node);
QCOMPARE(isTransparent, node->hasTransparency());
const QByteArray data(16*16*4, 'x');
textureData.setTextureData(data);
node = static_cast<QSSGRenderTextureData *>(QQuick3DObjectPrivate::updateSpatialNode(&textureData, node));
QCOMPARE(originalNode, node);
QCOMPARE(data, node->textureData());
auto metaEnum = QMetaEnum::fromType<QQuick3DTextureData::Format>();
for (int i = 0; i < metaEnum.keyCount(); i++) {
const auto format = QQuick3DTextureData::Format(metaEnum.value(i));
textureData.setFormat(format);
node = static_cast<QSSGRenderTextureData *>(QQuick3DObjectPrivate::updateSpatialNode(&textureData, node));
QCOMPARE(originalNode, node);
QCOMPARE(int(convertToBackendFormat(format)), int(node->format().format));
}
}
QTEST_APPLESS_MAIN(tst_QQuick3DTextureData)
#include "tst_qquick3dtexturedata.moc"