Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquick3dprincipledmaterial.cpp
Go to the documentation of this file.
1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
5#include "qquick3dobject_p.h"
6
7#include <QtQuick3DRuntimeRender/private/qssgrenderdefaultmaterial_p.h>
8#include <QtQuick3DUtils/private/qssgutils_p.h>
9
11
965
969
974
979
981{
982 return m_baseColor;
983}
984
986{
987 return m_baseColorMap;
988}
989
991{
992 return m_baseColorSingleChannelEnabled;
993}
994
999
1001{
1002 return m_specularSingleChannelEnabled;
1003}
1004
1009
1011{
1012 return m_emissiveSingleChannelEnabled;
1013}
1014
1019
1021{
1022 return m_emissiveMap;
1023}
1024
1026{
1027 return m_emissiveFactor;
1028}
1029
1031{
1032 return m_specularReflectionMap;
1033}
1034
1036{
1037 return m_specularMap;
1038}
1039
1041{
1042 return m_specularTint;
1043}
1044
1046{
1047 return m_specularAmount;
1048}
1049
1051{
1052 return m_roughness;
1053}
1054
1056{
1057 return m_roughnessMap;
1058}
1059
1061{
1062 return m_invertOpacityMapValue;
1063}
1064
1066{
1067 return m_opacity;
1068}
1069
1071{
1072 return m_opacityMap;
1073}
1074
1076{
1077 return m_normalMap;
1078}
1079
1081{
1082 return m_metalnessAmount;
1083}
1084
1086{
1087 return m_metalnessMap;
1088}
1089
1091{
1092 return m_normalStrength;
1093}
1094
1096{
1097 return m_occlusionMap;
1098}
1099
1101{
1102 return m_occlusionAmount;
1103}
1104
1109
1111{
1112 return m_alphaCutoff;
1113}
1114
1119
1124
1129
1134
1136{
1137 return m_pointSize;
1138}
1139
1141{
1142 return m_lineWidth;
1143}
1144
1146{
1147 return m_heightMap;
1148}
1149
1151{
1152 return m_heightChannel;
1153}
1154
1156{
1157 return m_heightAmount;
1158}
1159
1161{
1162 return m_minHeightMapSamples;
1163}
1164
1166{
1167 return m_maxHeightMapSamples;
1168}
1169
1171{
1172 m_dirtyAttributes = 0xffffffff;
1174}
1175
1177{
1178 if (m_lighting == lighting)
1179 return;
1180
1181 m_lighting = lighting;
1182 emit lightingChanged(m_lighting);
1183 markDirty(LightingModeDirty);
1184}
1185
1187{
1188 if (m_blendMode == blendMode)
1189 return;
1190
1191 m_blendMode = blendMode;
1192 emit blendModeChanged(m_blendMode);
1193 markDirty(BlendModeDirty);
1194}
1195
1197{
1198 if (m_baseColor == diffuseColor)
1199 return;
1200
1201 m_baseColor = diffuseColor;
1202 emit baseColorChanged(m_baseColor);
1203 markDirty(BaseColorDirty);
1204}
1205
1207{
1208 if (m_baseColorMap == baseColorMap)
1209 return;
1210
1212
1213 m_baseColorMap = baseColorMap;
1214 emit baseColorMapChanged(m_baseColorMap);
1215 markDirty(BaseColorDirty);
1216}
1217
1219{
1220 if (m_baseColorSingleChannelEnabled == baseColorSingleChannelEnabled)
1221 return;
1222
1223 m_baseColorSingleChannelEnabled = baseColorSingleChannelEnabled;
1225 markDirty(BaseColorDirty);
1226}
1227
1229{
1230 if (m_baseColorChannel == channel)
1231 return;
1232
1233 m_baseColorChannel = channel;
1235 markDirty(BaseColorDirty);
1236}
1237
1239{
1240 if (m_specularSingleChannelEnabled == specularSingleChannelEnabled)
1241 return;
1242
1243 m_specularSingleChannelEnabled = specularSingleChannelEnabled;
1245 markDirty(SpecularDirty);
1246}
1247
1249{
1250 if (m_specularChannel == channel)
1251 return;
1252
1253 m_specularChannel = channel;
1255 markDirty(SpecularDirty);
1256}
1257
1259{
1260 if (m_emissiveSingleChannelEnabled == emissiveSingleChannelEnabled)
1261 return;
1262
1263 m_emissiveSingleChannelEnabled = emissiveSingleChannelEnabled;
1265 markDirty(EmissiveDirty);
1266}
1267
1269{
1270 if (m_emissiveChannel == channel)
1271 return;
1272
1273 m_emissiveChannel = channel;
1275 markDirty(EmissiveDirty);
1276}
1277
1279{
1280 if (m_emissiveMap == emissiveMap)
1281 return;
1282
1284
1285 m_emissiveMap = emissiveMap;
1286 emit emissiveMapChanged(m_emissiveMap);
1287 markDirty(EmissiveDirty);
1288}
1289
1291{
1292 if (m_emissiveFactor == emissiveFactor)
1293 return;
1294
1295 m_emissiveFactor = emissiveFactor;
1296 emit emissiveFactorChanged(m_emissiveFactor);
1297 markDirty(EmissiveDirty);
1298}
1299
1301{
1302 if (m_specularReflectionMap == specularReflectionMap)
1303 return;
1304
1306
1307 m_specularReflectionMap = specularReflectionMap;
1308 emit specularReflectionMapChanged(m_specularReflectionMap);
1309 markDirty(SpecularDirty);
1310}
1311
1313{
1314 if (m_specularMap == specularMap)
1315 return;
1316
1318
1319 m_specularMap = specularMap;
1320 emit specularMapChanged(m_specularMap);
1321 markDirty(SpecularDirty);
1322}
1323
1325{
1326 specularTint = ensureNormalized(specularTint);
1327 if (qFuzzyCompare(m_specularTint, specularTint))
1328 return;
1329
1330 m_specularTint = specularTint;
1331 emit specularTintChanged(m_specularTint);
1332 markDirty(SpecularDirty);
1333}
1334
1336{
1337 specularAmount = ensureNormalized(specularAmount);
1338 if (qFuzzyCompare(m_specularAmount, specularAmount))
1339 return;
1340
1341 m_specularAmount = specularAmount;
1342 emit specularAmountChanged(m_specularAmount);
1343 markDirty(SpecularDirty);
1344}
1345
1347{
1348 roughness = ensureNormalized(roughness);
1349 if (qFuzzyCompare(m_roughness, roughness))
1350 return;
1351
1352 m_roughness = roughness;
1353 emit roughnessChanged(m_roughness);
1354 markDirty(RoughnessDirty);
1355}
1356
1358{
1359 if (m_roughnessMap == roughnessMap)
1360 return;
1361
1363
1364 m_roughnessMap = roughnessMap;
1365 emit roughnessMapChanged(m_roughnessMap);
1366 markDirty(RoughnessDirty);
1367}
1368
1370{
1371 if (invertOpacityMapValue == m_invertOpacityMapValue)
1372 return;
1373
1374 m_invertOpacityMapValue = invertOpacityMapValue;
1375 emit invertOpacityMapValueChanged(m_invertOpacityMapValue);
1376 markDirty(OpacityDirty);
1377}
1378
1380{
1381 opacity = ensureNormalized(opacity);
1382 if (qFuzzyCompare(m_opacity, opacity))
1383 return;
1384
1385 m_opacity = opacity;
1386 emit opacityChanged(m_opacity);
1387 markDirty(OpacityDirty);
1388}
1389
1391{
1392 if (m_opacityMap == opacityMap)
1393 return;
1394
1396
1397 m_opacityMap = opacityMap;
1398 emit opacityMapChanged(m_opacityMap);
1399 markDirty(OpacityDirty);
1400}
1401
1403{
1404 if (m_normalMap == normalMap)
1405 return;
1406
1408
1409 m_normalMap = normalMap;
1410 emit normalMapChanged(m_normalMap);
1411 markDirty(NormalDirty);
1412}
1413
1415{
1416 metalnessAmount = ensureNormalized(metalnessAmount);
1417 if (qFuzzyCompare(m_metalnessAmount, metalnessAmount))
1418 return;
1419
1420 m_metalnessAmount = metalnessAmount;
1421 emit metalnessChanged(m_metalnessAmount);
1422 markDirty(MetalnessDirty);
1423}
1424
1426{
1427 if (m_metalnessMap == metallicMap)
1428 return;
1429
1431
1432 m_metalnessMap = metallicMap;
1433 emit metalnessMapChanged(m_metalnessMap);
1434 markDirty(MetalnessDirty);
1435}
1436
1438{
1439 factor = ensureNormalized(factor);
1440 if (qFuzzyCompare(m_normalStrength, factor))
1441 return;
1442
1443 m_normalStrength = factor;
1444 emit normalStrengthChanged(m_normalStrength);
1445 markDirty(NormalDirty);
1446}
1447
1449{
1450 if (m_occlusionMap == occlusionMap)
1451 return;
1452
1454
1455 m_occlusionMap = occlusionMap;
1456 emit occlusionMapChanged(m_occlusionMap);
1457 markDirty(OcclusionDirty);
1458}
1459
1461{
1462 if (qFuzzyCompare(m_occlusionAmount, occlusionAmount))
1463 return;
1464
1465 m_occlusionAmount = occlusionAmount;
1466 emit occlusionAmountChanged(m_occlusionAmount);
1467 markDirty(OcclusionDirty);
1468}
1469
1471{
1472 if (m_alphaMode == alphaMode)
1473 return;
1474
1475 m_alphaMode = alphaMode;
1476 emit alphaModeChanged(m_alphaMode);
1477 markDirty(AlphaModeDirty);
1478}
1479
1481{
1482 if (qFuzzyCompare(m_alphaCutoff, alphaCutoff))
1483 return;
1484
1485 m_alphaCutoff = alphaCutoff;
1486 emit alphaCutoffChanged(m_alphaCutoff);
1487 markDirty(AlphaModeDirty);
1488}
1489
1491{
1492 if (m_metalnessChannel == channel)
1493 return;
1494
1495 m_metalnessChannel = channel;
1497 markDirty(MetalnessDirty);
1498}
1499
1501{
1502 if (m_roughnessChannel == channel)
1503 return;
1504
1505 m_roughnessChannel = channel;
1507 markDirty(RoughnessDirty);
1508}
1509
1511{
1512 if (m_opacityChannel == channel)
1513 return;
1514
1515 m_opacityChannel = channel;
1517 markDirty(OpacityDirty);
1518}
1519
1521{
1522 if (m_occlusionChannel == channel)
1523 return;
1524
1525 m_occlusionChannel = channel;
1527 markDirty(OcclusionDirty);
1528}
1529
1531{
1532 if (qFuzzyCompare(m_pointSize, size))
1533 return;
1534 m_pointSize = size;
1536 markDirty(PointSizeDirty);
1537}
1538
1540{
1541 if (qFuzzyCompare(m_lineWidth, width))
1542 return;
1543 m_lineWidth = width;
1545 markDirty(LineWidthDirty);
1546}
1547
1548void QQuick3DPrincipledMaterial::setHeightMap(QQuick3DTexture *heightMap)
1549{
1550 if (m_heightMap == heightMap)
1551 return;
1552
1553 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DPrincipledMaterial::setHeightMap, heightMap, m_heightMap);
1554
1555 m_heightMap = heightMap;
1556 emit heightMapChanged(m_heightMap);
1557 markDirty(HeightDirty);
1558}
1559
1560void QQuick3DPrincipledMaterial::setHeightChannel(QQuick3DMaterial::TextureChannelMapping channel)
1561{
1562 if (m_heightChannel == channel)
1563 return;
1564
1565 m_heightChannel = channel;
1566 emit heightChannelChanged(m_heightChannel);
1567 markDirty(HeightDirty);
1568}
1569
1570void QQuick3DPrincipledMaterial::setHeightAmount(float heightAmount)
1571{
1572 if (m_heightAmount == heightAmount)
1573 return;
1574
1575 m_heightAmount = heightAmount;
1576 emit heightAmountChanged(m_heightAmount);
1577 markDirty(HeightDirty);
1578}
1579
1580void QQuick3DPrincipledMaterial::setMinHeightMapSamples(int samples)
1581{
1582 if (m_minHeightMapSamples == samples)
1583 return;
1584
1585 m_minHeightMapSamples = samples;
1586 emit minHeightMapSamplesChanged(samples);
1587 markDirty(HeightDirty);
1588}
1589
1590void QQuick3DPrincipledMaterial::setMaxHeightMapSamples(int samples)
1591{
1592 if (m_maxHeightMapSamples == samples)
1593 return;
1594
1595 m_maxHeightMapSamples = samples;
1596 emit maxHeightMapSamplesChanged(samples);
1597 markDirty(HeightDirty);
1598}
1599
1601{
1602 static const auto channelMapping = [](TextureChannelMapping mapping) {
1604 };
1605
1606 if (!node) {
1607 markAllDirty();
1608 node = new QSSGRenderDefaultMaterial(QSSGRenderGraphObject::Type::PrincipledMaterial);
1609 }
1610
1611 // Set common material properties
1613
1614 QSSGRenderDefaultMaterial *material = static_cast<QSSGRenderDefaultMaterial *>(node);
1615
1617
1618 if (m_dirtyAttributes & LightingModeDirty)
1620
1621 if (m_dirtyAttributes & BlendModeDirty)
1623
1624 if (m_dirtyAttributes & BaseColorDirty) {
1625 if (!m_baseColorMap)
1626 material->colorMap = nullptr;
1627 else
1628 material->colorMap = m_baseColorMap->getRenderImage();
1629
1630 material->color = QSSGUtils::color::sRGBToLinear(m_baseColor);
1631 material->baseColorSingleChannelEnabled = m_baseColorSingleChannelEnabled;
1632 material->baseColorChannel = channelMapping(m_baseColorChannel);
1633 }
1634
1635 if (m_dirtyAttributes & EmissiveDirty) {
1636 if (!m_emissiveMap)
1637 material->emissiveMap = nullptr;
1638 else
1639 material->emissiveMap = m_emissiveMap->getRenderImage();
1640
1641 material->emissiveColor = m_emissiveFactor;
1642 material->emissiveSingleChannelEnabled = m_emissiveSingleChannelEnabled;
1643 material->emissiveChannel = channelMapping(m_emissiveChannel);
1644 }
1645
1646 if (m_dirtyAttributes & RoughnessDirty) {
1647 if (!m_roughnessMap)
1648 material->roughnessMap = nullptr;
1649 else
1650 material->roughnessMap = m_roughnessMap->getRenderImage();
1651
1652 material->specularRoughness = m_roughness;
1653 material->roughnessChannel = channelMapping(m_roughnessChannel);
1654 }
1655
1656 if (m_dirtyAttributes & MetalnessDirty) {
1657 if (!m_metalnessMap)
1658 material->metalnessMap = nullptr;
1659 else
1660 material->metalnessMap = m_metalnessMap->getRenderImage();
1661
1662 material->metalnessAmount = m_metalnessAmount;
1663 material->metalnessChannel = channelMapping(m_metalnessChannel);
1664
1665 }
1666
1667 if (m_dirtyAttributes & SpecularDirty) {
1668 if (!m_specularReflectionMap)
1669 material->specularReflection = nullptr;
1670 else
1671 material->specularReflection = m_specularReflectionMap->getRenderImage();
1672
1673 if (!m_specularMap) {
1674 material->specularMap = nullptr;
1675 } else {
1676 material->specularMap = m_specularMap->getRenderImage();
1677 }
1678
1679 material->specularAmount = m_specularAmount;
1680 material->specularTint = QVector3D(m_specularTint, m_specularTint, m_specularTint);
1681 material->ior = m_indexOfRefraction;
1682 material->fresnelScaleBiasEnabled = m_fresnelScaleBiasEnabled;
1683 material->fresnelScale = m_fresnelScale;
1684 material->fresnelBias = m_fresnelBias;
1685 material->fresnelPower = m_fresnelPower;
1686 material->specularAmountSingleChannelEnabled = m_specularSingleChannelEnabled;
1687 material->specularAmountChannel = channelMapping(m_specularChannel);
1688 }
1689
1690 if (m_dirtyAttributes & OpacityDirty) {
1691 material->opacity = m_opacity;
1692 if (!m_opacityMap)
1693 material->opacityMap = nullptr;
1694 else
1695 material->opacityMap = m_opacityMap->getRenderImage();
1696
1697 material->invertOpacityMapValue = m_invertOpacityMapValue;
1698 material->opacity = m_opacity;
1699 material->opacityChannel = channelMapping(m_opacityChannel);
1700 }
1701
1702 if (m_dirtyAttributes & NormalDirty) {
1703 if (!m_normalMap)
1704 material->normalMap = nullptr;
1705 else
1706 material->normalMap = m_normalMap->getRenderImage();
1707
1708 material->bumpAmount = m_normalStrength;
1709 }
1710
1711 if (m_dirtyAttributes & OcclusionDirty) {
1712 if (!m_occlusionMap)
1713 material->occlusionMap = nullptr;
1714 else
1715 material->occlusionMap = m_occlusionMap->getRenderImage();
1716 material->occlusionAmount = m_occlusionAmount;
1717 material->occlusionChannel = channelMapping(m_occlusionChannel);
1718 }
1719
1720 if (m_dirtyAttributes & AlphaModeDirty) {
1722 material->alphaCutoff = m_alphaCutoff;
1723 }
1724
1725 if (m_dirtyAttributes & PointSizeDirty)
1726 material->pointSize = m_pointSize;
1727
1728 if (m_dirtyAttributes & LineWidthDirty)
1729 material->lineWidth = m_lineWidth;
1730
1731 if (m_dirtyAttributes & HeightDirty) {
1732 if (!m_heightMap)
1733 material->heightMap = nullptr;
1734 else
1735 material->heightMap = m_heightMap->getRenderImage();
1736 material->heightAmount = m_heightAmount;
1737 material->minHeightSamples = m_minHeightMapSamples;
1738 material->maxHeightSamples = m_maxHeightMapSamples;
1739 material->heightChannel = channelMapping(m_heightChannel);
1740 }
1741
1742 if (m_dirtyAttributes & ClearcoatDirty) {
1743 material->clearcoatAmount = m_clearcoatAmount;
1744 if (!m_clearcoatMap)
1745 material->clearcoatMap = nullptr;
1746 else
1747 material->clearcoatMap = m_clearcoatMap->getRenderImage();
1748 material->clearcoatChannel = channelMapping(m_clearcoatChannel);
1749 material->clearcoatRoughnessAmount = m_clearcoatRoughnessAmount;
1750 if (!m_clearcoatRoughnessMap)
1751 material->clearcoatRoughnessMap = nullptr;
1752 else
1753 material->clearcoatRoughnessMap = m_clearcoatRoughnessMap->getRenderImage();
1754 material->clearcoatRoughnessChannel = channelMapping(m_clearcoatRoughnessChannel);
1755 if (!m_clearcoatNormalMap)
1756 material->clearcoatNormalMap = nullptr;
1757 else
1758 material->clearcoatNormalMap = m_clearcoatNormalMap->getRenderImage();
1759 material->clearcoatNormalStrength = m_clearcoatNormalStrength;
1760 material->clearcoatFresnelScaleBiasEnabled = m_clearcoatFresnelScaleBiasEnabled;
1761 material->clearcoatFresnelScale = m_clearcoatFresnelScale;
1762 material->clearcoatFresnelBias = m_clearcoatFresnelBias;
1763 material->clearcoatFresnelPower = m_clearcoatFresnelPower;
1764 }
1765
1766 if (m_dirtyAttributes & TransmissionDirty) {
1767 material->transmissionFactor = m_transmissionFactor;
1768 if (!m_transmissionMap)
1769 material->transmissionMap = nullptr;
1770 else
1771 material->transmissionMap = m_transmissionMap->getRenderImage();
1772 material->transmissionChannel = channelMapping(m_transmissionChannel);
1773 }
1774
1775 if (m_dirtyAttributes & VolumeDirty) {
1776 material->thicknessFactor = m_thicknessFactor;
1777 if (!m_thicknessMap)
1778 material->thicknessMap = nullptr;
1779 else
1780 material->thicknessMap = m_thicknessMap->getRenderImage();
1781 material->thicknessChannel = channelMapping(m_thicknessChannel);
1782
1783 material->attenuationDistance = m_attenuationDistance;
1784 material->attenuationColor = QSSGUtils::color::sRGBToLinear(m_attenuationColor).toVector3D();
1785 }
1786
1787 if (m_dirtyAttributes & VertexColorsDirty) {
1788 material->vertexColorsEnabled = m_vertexColorsEnabled;
1789 material->vertexColorsMaskEnabled = m_vertexColorsMaskEnabled;
1790 material->vertexColorRedMask = QSSGRenderDefaultMaterial::VertexColorMaskFlags::fromInt(m_vertexColorRedMask);
1791 material->vertexColorGreenMask = QSSGRenderDefaultMaterial::VertexColorMaskFlags::fromInt(m_vertexColorGreenMask);
1792 material->vertexColorBlueMask = QSSGRenderDefaultMaterial::VertexColorMaskFlags::fromInt(m_vertexColorBlueMask);
1793 material->vertexColorAlphaMask = QSSGRenderDefaultMaterial::VertexColorMaskFlags::fromInt(m_vertexColorAlphaMask);
1794 }
1795
1796 m_dirtyAttributes = 0;
1797
1798 return node;
1799}
1800
1801void QQuick3DPrincipledMaterial::itemChange(QQuick3DObject::ItemChange change, const QQuick3DObject::ItemChangeData &value)
1802{
1803 if (change == QQuick3DObject::ItemSceneChange)
1804 updateSceneManager(value.sceneManager);
1805}
1806
1807void QQuick3DPrincipledMaterial::updateSceneManager(QQuick3DSceneManager *sceneManager)
1808{
1809 // Check all the resource value's scene manager, and update as necessary.
1810 if (sceneManager) {
1811 QQuick3DObjectPrivate::refSceneManager(m_baseColorMap, *sceneManager);
1812 QQuick3DObjectPrivate::refSceneManager(m_emissiveMap, *sceneManager);
1813 QQuick3DObjectPrivate::refSceneManager(m_specularReflectionMap, *sceneManager);
1814 QQuick3DObjectPrivate::refSceneManager(m_specularMap, *sceneManager);
1815 QQuick3DObjectPrivate::refSceneManager(m_roughnessMap, *sceneManager);
1816 QQuick3DObjectPrivate::refSceneManager(m_opacityMap, *sceneManager);
1817 QQuick3DObjectPrivate::refSceneManager(m_normalMap, *sceneManager);
1818 QQuick3DObjectPrivate::refSceneManager(m_metalnessMap, *sceneManager);
1819 QQuick3DObjectPrivate::refSceneManager(m_occlusionMap, *sceneManager);
1820 QQuick3DObjectPrivate::refSceneManager(m_heightMap, *sceneManager);
1821 QQuick3DObjectPrivate::refSceneManager(m_clearcoatMap, *sceneManager);
1822 QQuick3DObjectPrivate::refSceneManager(m_clearcoatRoughnessMap, *sceneManager);
1823 QQuick3DObjectPrivate::refSceneManager(m_clearcoatNormalMap, *sceneManager);
1824 QQuick3DObjectPrivate::refSceneManager(m_transmissionMap, *sceneManager);
1825 QQuick3DObjectPrivate::refSceneManager(m_thicknessMap, *sceneManager);
1826 } else {
1829 QQuick3DObjectPrivate::derefSceneManager(m_specularReflectionMap);
1838 QQuick3DObjectPrivate::derefSceneManager(m_clearcoatRoughnessMap);
1839 QQuick3DObjectPrivate::derefSceneManager(m_clearcoatNormalMap);
1842 }
1843}
1844
1845void QQuick3DPrincipledMaterial::markDirty(QQuick3DPrincipledMaterial::DirtyType type)
1846{
1847 if (!(m_dirtyAttributes & quint32(type))) {
1848 m_dirtyAttributes |= quint32(type);
1849 update();
1850 }
1851}
1852
1854{
1855 return m_clearcoatAmount;
1856}
1857
1858void QQuick3DPrincipledMaterial::setClearcoatAmount(float newClearcoatAmount)
1859{
1860 if (qFuzzyCompare(m_clearcoatAmount, newClearcoatAmount))
1861 return;
1862 m_clearcoatAmount = newClearcoatAmount;
1863 emit clearcoatAmountChanged(m_clearcoatAmount);
1864 markDirty(ClearcoatDirty);
1865}
1866
1868{
1869 return m_clearcoatMap;
1870}
1871
1872void QQuick3DPrincipledMaterial::setClearcoatMap(QQuick3DTexture *newClearcoatMap)
1873{
1874 if (m_clearcoatMap == newClearcoatMap)
1875 return;
1876
1877 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DPrincipledMaterial::setClearcoatMap, newClearcoatMap, m_clearcoatMap);
1878
1879 m_clearcoatMap = newClearcoatMap;
1880 emit clearcoatMapChanged(m_clearcoatMap);
1881 markDirty(ClearcoatDirty);
1882}
1883
1885{
1886 return m_clearcoatChannel;
1887}
1888
1889void QQuick3DPrincipledMaterial::setClearcoatChannel(QQuick3DMaterial::TextureChannelMapping newClearcoatChannel)
1890{
1891 if (m_clearcoatChannel == newClearcoatChannel)
1892 return;
1893 m_clearcoatChannel = newClearcoatChannel;
1894 emit clearcoatChannelChanged(m_clearcoatChannel);
1895 markDirty(ClearcoatDirty);
1896}
1897
1899{
1900 return m_clearcoatRoughnessAmount;
1901}
1902
1903void QQuick3DPrincipledMaterial::setClearcoatRoughnessAmount(float newClearcoatRoughnessAmount)
1904{
1905 if (qFuzzyCompare(m_clearcoatRoughnessAmount, newClearcoatRoughnessAmount))
1906 return;
1907 m_clearcoatRoughnessAmount = newClearcoatRoughnessAmount;
1908 emit clearcoatRoughnessAmountChanged(m_clearcoatRoughnessAmount);
1909 markDirty(ClearcoatDirty);
1910}
1911
1913{
1914 return m_clearcoatRoughnessChannel;
1915}
1916
1917void QQuick3DPrincipledMaterial::setClearcoatRoughnessChannel(QQuick3DMaterial::TextureChannelMapping newClearcoatRoughnessChannel)
1918{
1919 if (m_clearcoatRoughnessChannel == newClearcoatRoughnessChannel)
1920 return;
1921 m_clearcoatRoughnessChannel = newClearcoatRoughnessChannel;
1922 emit clearcoatRoughnessChannelChanged(m_clearcoatRoughnessChannel);
1923 markDirty(ClearcoatDirty);
1924}
1925
1927{
1928 return m_clearcoatRoughnessMap;
1929}
1930
1931void QQuick3DPrincipledMaterial::setClearcoatRoughnessMap(QQuick3DTexture *newClearcoatRoughnessMap)
1932{
1933 if (m_clearcoatRoughnessMap == newClearcoatRoughnessMap)
1934 return;
1935
1936 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DPrincipledMaterial::setClearcoatRoughnessMap, newClearcoatRoughnessMap, m_clearcoatRoughnessMap);
1937
1938 m_clearcoatRoughnessMap = newClearcoatRoughnessMap;
1939 emit clearcoatRoughnessMapChanged(m_clearcoatRoughnessMap);
1940 markDirty(ClearcoatDirty);
1941}
1942
1944{
1945 return m_clearcoatNormalMap;
1946}
1947
1948void QQuick3DPrincipledMaterial::setClearcoatNormalMap(QQuick3DTexture *newClearcoatNormalMap)
1949{
1950 if (m_clearcoatNormalMap == newClearcoatNormalMap)
1951 return;
1952
1953 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DPrincipledMaterial::setClearcoatNormalMap, newClearcoatNormalMap, m_clearcoatNormalMap);
1954
1955 m_clearcoatNormalMap = newClearcoatNormalMap;
1956 emit clearcoatNormalMapChanged(m_clearcoatNormalMap);
1957 markDirty(ClearcoatDirty);
1958}
1959
1960
1962{
1963 return m_clearcoatNormalStrength;
1964}
1965
1966void QQuick3DPrincipledMaterial::setClearcoatNormalStrength(float newClearcoatNormalStrength)
1967{
1968 if (qFuzzyCompare(m_clearcoatNormalStrength, newClearcoatNormalStrength))
1969 return;
1970
1971 m_clearcoatNormalStrength = newClearcoatNormalStrength;
1972 emit clearcoatNormalStrengthChanged(m_clearcoatNormalStrength);
1973 markDirty(ClearcoatDirty);
1974}
1975
1977{
1978 return m_transmissionFactor;
1979}
1980
1981void QQuick3DPrincipledMaterial::setTransmissionFactor(float newTransmissionFactor)
1982{
1983 if (qFuzzyCompare(m_transmissionFactor, newTransmissionFactor))
1984 return;
1985 m_transmissionFactor = newTransmissionFactor;
1986 emit transmissionFactorChanged(m_transmissionFactor);
1987 markDirty(TransmissionDirty);
1988}
1989
1991{
1992 return m_transmissionMap;
1993}
1994
1995void QQuick3DPrincipledMaterial::setTransmissionMap(QQuick3DTexture *newTransmissionMap)
1996{
1997 if (m_transmissionMap == newTransmissionMap)
1998 return;
1999
2000 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DPrincipledMaterial::setTransmissionMap, newTransmissionMap, m_transmissionMap);
2001
2002 m_transmissionMap = newTransmissionMap;
2003 emit transmissionMapChanged(m_transmissionMap);
2004 markDirty(TransmissionDirty);
2005}
2006
2008{
2009 return m_transmissionChannel;
2010}
2011
2013{
2014 return m_indexOfRefraction;
2015}
2016
2018{
2019 return m_fresnelScaleBiasEnabled;
2020}
2021
2023{
2024 return m_fresnelScale;
2025}
2026
2028{
2029 return m_fresnelBias;
2030}
2031
2033{
2034 return m_fresnelPower;
2035}
2036
2038{
2039 return m_clearcoatFresnelScaleBiasEnabled;
2040}
2041
2043{
2044 return m_clearcoatFresnelScale;
2045}
2046
2048{
2049 return m_clearcoatFresnelBias;
2050}
2051
2053{
2054 return m_clearcoatFresnelPower;
2055}
2056
2058{
2059 return m_vertexColorsEnabled;
2060}
2061
2062void QQuick3DPrincipledMaterial::setTransmissionChannel(QQuick3DMaterial::TextureChannelMapping newTransmissionChannel)
2063{
2064 if (m_transmissionChannel == newTransmissionChannel)
2065 return;
2066 m_transmissionChannel = newTransmissionChannel;
2067 emit transmissionChannelChanged(m_transmissionChannel);
2068 markDirty(TransmissionDirty);
2069}
2070
2072{
2073 return m_thicknessFactor;
2074}
2075
2076void QQuick3DPrincipledMaterial::setThicknessFactor(float newThicknessFactor)
2077{
2078 if (qFuzzyCompare(m_thicknessFactor, newThicknessFactor))
2079 return;
2080 m_thicknessFactor = newThicknessFactor;
2081 emit thicknessFactorChanged(m_thicknessFactor);
2082 markDirty(VolumeDirty);
2083}
2084
2086{
2087 return m_thicknessMap;
2088}
2089
2090void QQuick3DPrincipledMaterial::setThicknessMap(QQuick3DTexture *newThicknessMap)
2091{
2092 if (m_thicknessMap == newThicknessMap)
2093 return;
2094
2095 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DPrincipledMaterial::setThicknessMap, newThicknessMap, m_thicknessMap);
2096
2097 m_thicknessMap = newThicknessMap;
2098 emit thicknessMapChanged(m_thicknessMap);
2099 markDirty(VolumeDirty);
2100}
2101
2103{
2104 return m_thicknessChannel;
2105}
2106
2107void QQuick3DPrincipledMaterial::setThicknessChannel(const QQuick3DMaterial::TextureChannelMapping &newThicknessChannel)
2108{
2109 if (m_thicknessChannel == newThicknessChannel)
2110 return;
2111 m_thicknessChannel = newThicknessChannel;
2112 emit thicknessChannelChanged(m_thicknessChannel);
2113 markDirty(VolumeDirty);
2114}
2115
2117{
2118 return m_attenuationDistance;
2119}
2120
2121void QQuick3DPrincipledMaterial::setAttenuationDistance(float newAttenuationDistance)
2122{
2123 if (qFuzzyCompare(m_attenuationDistance, newAttenuationDistance))
2124 return;
2125 m_attenuationDistance = newAttenuationDistance;
2126 emit attenuationDistanceChanged(m_attenuationDistance);
2127 markDirty(VolumeDirty);
2128}
2129
2131{
2132 return m_attenuationColor;
2133}
2134
2135void QQuick3DPrincipledMaterial::setAttenuationColor(const QColor &newAttenuationColor)
2136{
2137 if (m_attenuationColor == newAttenuationColor)
2138 return;
2139 m_attenuationColor = newAttenuationColor;
2140 emit attenuationColorChanged(m_attenuationColor);
2141 markDirty(VolumeDirty);
2142}
2143
2144void QQuick3DPrincipledMaterial::setIndexOfRefraction(float indexOfRefraction)
2145{
2146 if (qFuzzyCompare(m_indexOfRefraction, indexOfRefraction))
2147 return;
2148
2149 m_indexOfRefraction = indexOfRefraction;
2150 emit indexOfRefractionChanged(m_indexOfRefraction);
2151 markDirty(SpecularDirty);
2152}
2153
2154void QQuick3DPrincipledMaterial::setFresnelScaleBiasEnabled(bool fresnelScaleBiasEnabled)
2155{
2156 if (m_fresnelScaleBiasEnabled == fresnelScaleBiasEnabled)
2157 return;
2158
2159 m_fresnelScaleBiasEnabled = fresnelScaleBiasEnabled;
2160 emit fresnelScaleBiasEnabledChanged(m_fresnelScaleBiasEnabled);
2161 markDirty(SpecularDirty);
2162}
2163
2164void QQuick3DPrincipledMaterial::setFresnelScale(float fresnelScale)
2165{
2166 if (qFuzzyCompare(m_fresnelScale, fresnelScale))
2167 return;
2168
2169 m_fresnelScale = fresnelScale;
2170 emit fresnelScaleChanged(m_fresnelScale);
2171 markDirty(SpecularDirty);
2172}
2173
2174void QQuick3DPrincipledMaterial::setFresnelBias(float fresnelBias)
2175{
2176 if (qFuzzyCompare(m_fresnelBias, fresnelBias))
2177 return;
2178
2179 m_fresnelBias = fresnelBias;
2180 emit fresnelBiasChanged(m_fresnelBias);
2181 markDirty(SpecularDirty);
2182}
2183
2184void QQuick3DPrincipledMaterial::setFresnelPower(float fresnelPower)
2185{
2186 if (qFuzzyCompare(m_fresnelPower, fresnelPower))
2187 return;
2188
2189 m_fresnelPower = fresnelPower;
2190 emit fresnelPowerChanged(m_fresnelPower);
2191 markDirty(SpecularDirty);
2192}
2193
2194void QQuick3DPrincipledMaterial::setClearcoatFresnelScaleBiasEnabled(bool clearcoatFresnelScaleBiasEnabled)
2195{
2196 if (m_clearcoatFresnelScaleBiasEnabled == clearcoatFresnelScaleBiasEnabled)
2197 return;
2198
2199 m_clearcoatFresnelScaleBiasEnabled = clearcoatFresnelScaleBiasEnabled;
2200 emit clearcoatFresnelScaleBiasEnabledChanged(m_clearcoatFresnelScaleBiasEnabled);
2201 markDirty(ClearcoatDirty);
2202}
2203
2204void QQuick3DPrincipledMaterial::setClearcoatFresnelScale(float clearcoatFresnelScale)
2205{
2206 if (qFuzzyCompare(m_clearcoatFresnelScale, clearcoatFresnelScale))
2207 return;
2208
2209 m_clearcoatFresnelScale = clearcoatFresnelScale;
2210 emit clearcoatFresnelScaleChanged(m_clearcoatFresnelScale);
2211 markDirty(ClearcoatDirty);
2212}
2213
2214void QQuick3DPrincipledMaterial::setClearcoatFresnelBias(float clearcoatFresnelBias)
2215{
2216 if (qFuzzyCompare(m_clearcoatFresnelBias, clearcoatFresnelBias))
2217 return;
2218
2219 m_clearcoatFresnelBias = clearcoatFresnelBias;
2220 emit clearcoatFresnelBiasChanged(m_clearcoatFresnelBias);
2221 markDirty(ClearcoatDirty);
2222}
2223
2224void QQuick3DPrincipledMaterial::setClearcoatFresnelPower(float clearcoatFresnelPower)
2225{
2226 if (qFuzzyCompare(m_clearcoatFresnelPower, clearcoatFresnelPower))
2227 return;
2228
2229 m_clearcoatFresnelPower = clearcoatFresnelPower;
2230 emit clearcoatFresnelPowerChanged(m_clearcoatFresnelPower);
2231 markDirty(ClearcoatDirty);
2232}
2233
2234void QQuick3DPrincipledMaterial::setVertexColorsEnabled(bool vertexColors)
2235{
2236 if (m_vertexColorsEnabled == vertexColors)
2237 return;
2238
2239 m_vertexColorsEnabled = vertexColors;
2240 emit vertexColorsEnabledChanged(m_vertexColorsEnabled);
2241 markDirty(VertexColorsDirty);
2242}
2243
2245{
2246 return m_vertexColorsMaskEnabled;
2247}
2248
2249void QQuick3DPrincipledMaterial::setVertexColorsMaskEnabled(bool vertexColorsMaskEnabled)
2250{
2251 if (m_vertexColorsMaskEnabled == vertexColorsMaskEnabled)
2252 return;
2253 m_vertexColorsMaskEnabled = vertexColorsMaskEnabled;
2254 emit vertexColorsMaskEnabledChanged();
2255 markDirty(VertexColorsDirty);
2256}
2257
2258QQuick3DPrincipledMaterial::VertexColorMaskFlags QQuick3DPrincipledMaterial::vertexColorRedMask() const
2259{
2260 return m_vertexColorRedMask;
2261}
2262
2263void QQuick3DPrincipledMaterial::setVertexColorRedMask(QQuick3DPrincipledMaterial::VertexColorMaskFlags vertexColorRedMask)
2264{
2265 if (m_vertexColorRedMask == vertexColorRedMask)
2266 return;
2267 m_vertexColorRedMask = vertexColorRedMask;
2268 emit vertexColorRedMaskChanged();
2269 markDirty(VertexColorsDirty);
2270}
2271
2272QQuick3DPrincipledMaterial::VertexColorMaskFlags QQuick3DPrincipledMaterial::vertexColorGreenMask() const
2273{
2274 return m_vertexColorGreenMask;
2275}
2276
2277void QQuick3DPrincipledMaterial::setVertexColorGreenMask(QQuick3DPrincipledMaterial::VertexColorMaskFlags vertexColorGreenMask)
2278{
2279 if (m_vertexColorGreenMask == vertexColorGreenMask)
2280 return;
2281 m_vertexColorGreenMask = vertexColorGreenMask;
2282 emit vertexColorGreenMaskChanged();
2283 markDirty(VertexColorsDirty);
2284}
2285
2286QQuick3DPrincipledMaterial::VertexColorMaskFlags QQuick3DPrincipledMaterial::vertexColorBlueMask() const
2287{
2288 return m_vertexColorBlueMask;
2289}
2290
2291void QQuick3DPrincipledMaterial::setVertexColorBlueMask(QQuick3DPrincipledMaterial::VertexColorMaskFlags vertexColorBlueMask)
2292{
2293 if (m_vertexColorBlueMask == vertexColorBlueMask)
2294 return;
2295 m_vertexColorBlueMask = vertexColorBlueMask;
2296 emit vertexColorBlueMaskChanged();
2297 markDirty(VertexColorsDirty);
2298}
2299
2300QQuick3DPrincipledMaterial::VertexColorMaskFlags QQuick3DPrincipledMaterial::vertexColorAlphaMask() const
2301{
2302 return m_vertexColorAlphaMask;
2303}
2304
2305void QQuick3DPrincipledMaterial::setVertexColorAlphaMask(QQuick3DPrincipledMaterial::VertexColorMaskFlags vertexColorAlphaMask)
2306{
2307 if (m_vertexColorAlphaMask == vertexColorAlphaMask)
2308 return;
2309 m_vertexColorAlphaMask = vertexColorAlphaMask;
2310 emit vertexColorAlphaMaskChanged();
2311 markDirty(VertexColorsDirty);
2312}
2313
2315
IOBluetoothL2CAPChannel * channel
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node) override
void refSceneManager(QQuick3DSceneManager &)
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 void markAllDirty()
void opacityMapChanged(QQuick3DTexture *opacityMap)
QQuick3DMaterial::TextureChannelMapping emissiveChannel
void setBaseColorSingleChannelEnabled(bool baseColorSingleChannelEnabled)
void setSpecularSingleChannelEnabled(bool specularSingleChannelEnabled)
void setSpecularAmount(float specularAmount)
void setOcclusionMap(QQuick3DTexture *occlusionMap)
QQuick3DMaterial::TextureChannelMapping opacityChannel
void specularTintChanged(float specularTint)
void setSpecularChannel(QQuick3DMaterial::TextureChannelMapping channel)
void setLighting(QQuick3DPrincipledMaterial::Lighting lighting)
void opacityChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
void opacityChanged(float opacity)
QQuick3DMaterial::TextureChannelMapping clearcoatRoughnessChannel
void baseColorSingleChannelEnabledChanged(bool baseColorSingleChannelEnabled)
void occlusionChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
void setBaseColorMap(QQuick3DTexture *baseColorMap)
void setEmissiveChannel(QQuick3DMaterial::TextureChannelMapping channel)
void metalnessChanged(float metalness)
void metalnessMapChanged(QQuick3DTexture *metalnessMap)
void roughnessMapChanged(QQuick3DTexture *roughnessMap)
void setMetalnessMap(QQuick3DTexture *metalnessMap)
void metalnessChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
QQuick3DMaterial::TextureChannelMapping roughnessChannel
void setBaseColorChannel(QQuick3DMaterial::TextureChannelMapping channel)
void itemChange(ItemChange, const ItemChangeData &) override
void normalMapChanged(QQuick3DTexture *normalMap)
QQuick3DMaterial::TextureChannelMapping thicknessChannel
void roughnessChanged(float roughness)
void occlusionMapChanged(QQuick3DTexture *occlusionMap)
QQuick3DMaterial::TextureChannelMapping occlusionChannel
void setNormalStrength(float normalStrength)
void lightingChanged(QQuick3DPrincipledMaterial::Lighting lighting)
void setMetalnessChannel(QQuick3DMaterial::TextureChannelMapping channel)
void occlusionAmountChanged(float occlusionAmount)
QQuick3DMaterial::TextureChannelMapping heightChannel
void setEmissiveMap(QQuick3DTexture *emissiveMap)
void setInvertOpacityMapValue(bool invertOpacityMapValue)
QQuick3DMaterial::TextureChannelMapping transmissionChannel
void setRoughnessChannel(QQuick3DMaterial::TextureChannelMapping channel)
void normalStrengthChanged(float normalStrength)
void specularReflectionMapChanged(QQuick3DTexture *specularReflectionMap)
void baseColorMapChanged(QQuick3DTexture *baseColorMap)
void specularAmountChanged(float specularAmount)
void setSpecularReflectionMap(QQuick3DTexture *specularReflectionMap)
void baseColorChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
QQuick3DMaterial::TextureChannelMapping specularChannel
void setAlphaMode(QQuick3DPrincipledMaterial::AlphaMode alphaMode)
void setOpacityMap(QQuick3DTexture *opacityMap)
void emissiveSingleChannelEnabledChanged(bool emissiveColorSingleChannelEnabled)
void specularSingleChannelEnabledChanged(bool specularColorSingleChannelEnabled)
void specularMapChanged(QQuick3DTexture *specularMap)
void setOcclusionChannel(QQuick3DMaterial::TextureChannelMapping channel)
QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node) override
void invertOpacityMapValueChanged(bool invertOpacityMapValue)
void setRoughnessMap(QQuick3DTexture *roughnessMap)
void emissiveFactorChanged(QVector3D emissiveFactor)
void blendModeChanged(QQuick3DPrincipledMaterial::BlendMode blendMode)
void setNormalMap(QQuick3DTexture *normalMap)
void setEmissiveFactor(QVector3D emissiveFactor)
void emissiveMapChanged(QQuick3DTexture *emissiveMap)
void setBlendMode(QQuick3DPrincipledMaterial::BlendMode blendMode)
void alphaCutoffChanged(float alphaCutoff)
QQuick3DMaterial::TextureChannelMapping baseColorChannel
void setOcclusionAmount(float occlusionAmount)
void specularChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
void setSpecularMap(QQuick3DTexture *specularMap)
void setOpacityChannel(QQuick3DMaterial::TextureChannelMapping channel)
QQuick3DPrincipledMaterial(QQuick3DObject *parent=nullptr)
\qmltype PrincipledMaterial \inherits Material \inqmlmodule QtQuick3D
void alphaModeChanged(QQuick3DPrincipledMaterial::AlphaMode alphaMode)
QQuick3DMaterial::TextureChannelMapping metalnessChannel
void baseColorChanged(QColor baseColor)
void roughnessChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
void setEmissiveSingleChannelEnabled(bool emissiveSingleChannelEnabled)
void setMetalness(float metalnessAmount)
void emissiveChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
QQuick3DMaterial::TextureChannelMapping clearcoatChannel
QSSGRenderImage * getRenderImage()
The QVector3D class represents a vector or vertex in 3D space.
Definition qvectornd.h:171
constexpr QVector3D toVector3D() const noexcept
Returns the 3D vector form of this 4D vector, dropping the w coordinate.
Definition qvectornd.h:1011
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:333
GLsizei samples
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei width
GLenum type
GLenum GLenum GLenum GLenum mapping
#define emit
unsigned int quint32
Definition qtypes.h:50
QSSGRenderDefaultMaterial::MaterialSpecularModel specularModel
QSSGRenderDefaultMaterial::MaterialBlendMode blendMode
TextureChannelMapping specularAmountChannel
QSSGRenderDefaultMaterial::MaterialAlphaMode alphaMode
TextureChannelMapping clearcoatRoughnessChannel
Definition moc.h:23