Qt 6.x
The Qt SDK
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
715inline static float ensureNormalized(float val) { return qBound(0.0f, val, 1.0f); }
716
719{}
720
722{
723}
724
726{
727 return m_lighting;
728}
729
731{
732 return m_blendMode;
733}
734
736{
737 return m_baseColor;
738}
739
741{
742 return m_baseColorMap;
743}
744
746{
747 return m_emissiveMap;
748}
749
751{
752 return m_emissiveFactor;
753}
754
756{
757 return m_specularReflectionMap;
758}
759
761{
762 return m_specularMap;
763}
764
766{
767 return m_specularTint;
768}
769
771{
772 return m_specularAmount;
773}
774
776{
777 return m_roughness;
778}
779
781{
782 return m_roughnessMap;
783}
784
786{
787 return m_opacity;
788}
789
791{
792 return m_opacityMap;
793}
794
796{
797 return m_normalMap;
798}
799
801{
802 return m_metalnessAmount;
803}
804
806{
807 return m_metalnessMap;
808}
809
811{
812 return m_normalStrength;
813}
814
816{
817 return m_occlusionMap;
818}
819
821{
822 return m_occlusionAmount;
823}
824
826{
827 return m_alphaMode;
828}
829
831{
832 return m_alphaCutoff;
833}
834
836{
837 return m_roughnessChannel;
838}
839
841{
842 return m_opacityChannel;
843}
844
846{
847 return m_metalnessChannel;
848}
849
851{
852 return m_occlusionChannel;
853}
854
856{
857 return m_pointSize;
858}
859
861{
862 return m_lineWidth;
863}
864
866{
867 return m_heightMap;
868}
869
871{
872 return m_heightChannel;
873}
874
876{
877 return m_heightAmount;
878}
879
881{
882 return m_minHeightMapSamples;
883}
884
886{
887 return m_maxHeightMapSamples;
888}
889
891{
892 m_dirtyAttributes = 0xffffffff;
894}
895
897{
898 if (m_lighting == lighting)
899 return;
900
901 m_lighting = lighting;
902 emit lightingChanged(m_lighting);
903 markDirty(LightingModeDirty);
904}
905
907{
908 if (m_blendMode == blendMode)
909 return;
910
911 m_blendMode = blendMode;
912 emit blendModeChanged(m_blendMode);
913 markDirty(BlendModeDirty);
914}
915
917{
918 if (m_baseColor == diffuseColor)
919 return;
920
921 m_baseColor = diffuseColor;
922 emit baseColorChanged(m_baseColor);
923 markDirty(BaseColorDirty);
924}
925
927{
928 if (m_baseColorMap == baseColorMap)
929 return;
930
932
933 m_baseColorMap = baseColorMap;
934 emit baseColorMapChanged(m_baseColorMap);
935 markDirty(BaseColorDirty);
936}
937
939{
940 if (m_emissiveMap == emissiveMap)
941 return;
942
944
945 m_emissiveMap = emissiveMap;
946 emit emissiveMapChanged(m_emissiveMap);
947 markDirty(EmissiveDirty);
948}
949
951{
952 if (m_emissiveFactor == emissiveFactor)
953 return;
954
955 m_emissiveFactor = emissiveFactor;
956 emit emissiveFactorChanged(m_emissiveFactor);
957 markDirty(EmissiveDirty);
958}
959
961{
962 if (m_specularReflectionMap == specularReflectionMap)
963 return;
964
966
967 m_specularReflectionMap = specularReflectionMap;
968 emit specularReflectionMapChanged(m_specularReflectionMap);
969 markDirty(SpecularDirty);
970}
971
973{
974 if (m_specularMap == specularMap)
975 return;
976
978
979 m_specularMap = specularMap;
980 emit specularMapChanged(m_specularMap);
981 markDirty(SpecularDirty);
982}
983
985{
987 if (qFuzzyCompare(m_specularTint, specularTint))
988 return;
989
990 m_specularTint = specularTint;
991 emit specularTintChanged(m_specularTint);
992 markDirty(SpecularDirty);
993}
994
996{
998 if (qFuzzyCompare(m_specularAmount, specularAmount))
999 return;
1000
1001 m_specularAmount = specularAmount;
1002 emit specularAmountChanged(m_specularAmount);
1003 markDirty(SpecularDirty);
1004}
1005
1007{
1009 if (qFuzzyCompare(m_roughness, roughness))
1010 return;
1011
1012 m_roughness = roughness;
1013 emit roughnessChanged(m_roughness);
1014 markDirty(RoughnessDirty);
1015}
1016
1018{
1019 if (m_roughnessMap == roughnessMap)
1020 return;
1021
1023
1024 m_roughnessMap = roughnessMap;
1025 emit roughnessMapChanged(m_roughnessMap);
1026 markDirty(RoughnessDirty);
1027}
1028
1030{
1032 if (qFuzzyCompare(m_opacity, opacity))
1033 return;
1034
1035 m_opacity = opacity;
1036 emit opacityChanged(m_opacity);
1037 markDirty(OpacityDirty);
1038}
1039
1041{
1042 if (m_opacityMap == opacityMap)
1043 return;
1044
1046
1047 m_opacityMap = opacityMap;
1048 emit opacityMapChanged(m_opacityMap);
1049 markDirty(OpacityDirty);
1050}
1051
1053{
1054 if (m_normalMap == normalMap)
1055 return;
1056
1058
1059 m_normalMap = normalMap;
1060 emit normalMapChanged(m_normalMap);
1061 markDirty(NormalDirty);
1062}
1063
1065{
1066 metalnessAmount = ensureNormalized(metalnessAmount);
1067 if (qFuzzyCompare(m_metalnessAmount, metalnessAmount))
1068 return;
1069
1070 m_metalnessAmount = metalnessAmount;
1071 emit metalnessChanged(m_metalnessAmount);
1072 markDirty(MetalnessDirty);
1073}
1074
1076{
1077 if (m_metalnessMap == metallicMap)
1078 return;
1079
1081
1082 m_metalnessMap = metallicMap;
1083 emit metalnessMapChanged(m_metalnessMap);
1084 markDirty(MetalnessDirty);
1085}
1086
1088{
1089 factor = ensureNormalized(factor);
1090 if (qFuzzyCompare(m_normalStrength, factor))
1091 return;
1092
1093 m_normalStrength = factor;
1094 emit normalStrengthChanged(m_normalStrength);
1095 markDirty(NormalDirty);
1096}
1097
1099{
1100 if (m_occlusionMap == occlusionMap)
1101 return;
1102
1104
1105 m_occlusionMap = occlusionMap;
1106 emit occlusionMapChanged(m_occlusionMap);
1107 markDirty(OcclusionDirty);
1108}
1109
1111{
1112 if (qFuzzyCompare(m_occlusionAmount, occlusionAmount))
1113 return;
1114
1115 m_occlusionAmount = occlusionAmount;
1116 emit occlusionAmountChanged(m_occlusionAmount);
1117 markDirty(OcclusionDirty);
1118}
1119
1121{
1122 if (m_alphaMode == alphaMode)
1123 return;
1124
1125 m_alphaMode = alphaMode;
1126 emit alphaModeChanged(m_alphaMode);
1127 markDirty(AlphaModeDirty);
1128}
1129
1131{
1132 if (qFuzzyCompare(m_alphaCutoff, alphaCutoff))
1133 return;
1134
1135 m_alphaCutoff = alphaCutoff;
1136 emit alphaCutoffChanged(m_alphaCutoff);
1137 markDirty(AlphaModeDirty);
1138}
1139
1141{
1142 if (m_metalnessChannel == channel)
1143 return;
1144
1145 m_metalnessChannel = channel;
1147 markDirty(MetalnessDirty);
1148}
1149
1151{
1152 if (m_roughnessChannel == channel)
1153 return;
1154
1155 m_roughnessChannel = channel;
1157 markDirty(RoughnessDirty);
1158}
1159
1161{
1162 if (m_opacityChannel == channel)
1163 return;
1164
1165 m_opacityChannel = channel;
1167 markDirty(OpacityDirty);
1168}
1169
1171{
1172 if (m_occlusionChannel == channel)
1173 return;
1174
1175 m_occlusionChannel = channel;
1177 markDirty(OcclusionDirty);
1178}
1179
1181{
1182 if (qFuzzyCompare(m_pointSize, size))
1183 return;
1184 m_pointSize = size;
1186 markDirty(PointSizeDirty);
1187}
1188
1190{
1191 if (qFuzzyCompare(m_lineWidth, width))
1192 return;
1193 m_lineWidth = width;
1195 markDirty(LineWidthDirty);
1196}
1197
1198void QQuick3DPrincipledMaterial::setHeightMap(QQuick3DTexture *heightMap)
1199{
1200 if (m_heightMap == heightMap)
1201 return;
1202
1203 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DPrincipledMaterial::setHeightMap, heightMap, m_heightMap);
1204
1205 m_heightMap = heightMap;
1206 emit heightMapChanged(m_heightMap);
1207 markDirty(HeightDirty);
1208}
1209
1210void QQuick3DPrincipledMaterial::setHeightChannel(QQuick3DMaterial::TextureChannelMapping channel)
1211{
1212 if (m_heightChannel == channel)
1213 return;
1214
1215 m_heightChannel = channel;
1216 emit heightChannelChanged(m_heightChannel);
1217 markDirty(HeightDirty);
1218}
1219
1220void QQuick3DPrincipledMaterial::setHeightAmount(float heightAmount)
1221{
1222 if (m_heightAmount == heightAmount)
1223 return;
1224
1225 m_heightAmount = heightAmount;
1226 emit heightAmountChanged(m_heightAmount);
1227 markDirty(HeightDirty);
1228}
1229
1230void QQuick3DPrincipledMaterial::setMinHeightMapSamples(int samples)
1231{
1232 if (m_minHeightMapSamples == samples)
1233 return;
1234
1235 m_minHeightMapSamples = samples;
1236 emit minHeightMapSamplesChanged(samples);
1237 markDirty(HeightDirty);
1238}
1239
1240void QQuick3DPrincipledMaterial::setMaxHeightMapSamples(int samples)
1241{
1242 if (m_maxHeightMapSamples == samples)
1243 return;
1244
1245 m_maxHeightMapSamples = samples;
1246 emit maxHeightMapSamplesChanged(samples);
1247 markDirty(HeightDirty);
1248}
1249
1251{
1252 static const auto channelMapping = [](TextureChannelMapping mapping) {
1254 };
1255
1256 if (!node) {
1257 markAllDirty();
1258 node = new QSSGRenderDefaultMaterial(QSSGRenderGraphObject::Type::PrincipledMaterial);
1259 }
1260
1261 // Set common material properties
1263
1264 QSSGRenderDefaultMaterial *material = static_cast<QSSGRenderDefaultMaterial *>(node);
1265
1267
1268 if (m_dirtyAttributes & LightingModeDirty)
1270
1271 if (m_dirtyAttributes & BlendModeDirty)
1273
1274 if (m_dirtyAttributes & BaseColorDirty) {
1275 if (!m_baseColorMap)
1276 material->colorMap = nullptr;
1277 else
1278 material->colorMap = m_baseColorMap->getRenderImage();
1279
1280 material->color = color::sRGBToLinear(m_baseColor);
1281 }
1282
1283 if (m_dirtyAttributes & EmissiveDirty) {
1284 if (!m_emissiveMap)
1285 material->emissiveMap = nullptr;
1286 else
1287 material->emissiveMap = m_emissiveMap->getRenderImage();
1288
1289 material->emissiveColor = m_emissiveFactor;
1290 }
1291
1292 material->fresnelPower = 5.0f;
1293 material->vertexColorsEnabled = false;
1294
1295 if (m_dirtyAttributes & RoughnessDirty) {
1296 if (!m_roughnessMap)
1297 material->roughnessMap = nullptr;
1298 else
1299 material->roughnessMap = m_roughnessMap->getRenderImage();
1300
1301 material->specularRoughness = m_roughness;
1302 material->roughnessChannel = channelMapping(m_roughnessChannel);
1303 }
1304
1305 if (m_dirtyAttributes & MetalnessDirty) {
1306 if (!m_metalnessMap)
1307 material->metalnessMap = nullptr;
1308 else
1309 material->metalnessMap = m_metalnessMap->getRenderImage();
1310
1311 material->metalnessAmount = m_metalnessAmount;
1312 material->metalnessChannel = channelMapping(m_metalnessChannel);
1313
1314 }
1315
1316 if (m_dirtyAttributes & SpecularDirty) {
1317 if (!m_specularReflectionMap)
1318 material->specularReflection = nullptr;
1319 else
1320 material->specularReflection = m_specularReflectionMap->getRenderImage();
1321
1322 if (!m_specularMap) {
1323 material->specularMap = nullptr;
1324 } else {
1325 material->specularMap = m_specularMap->getRenderImage();
1326 }
1327
1328 material->specularAmount = m_specularAmount;
1329 material->specularTint = QVector3D(m_specularTint, m_specularTint, m_specularTint);
1330 material->ior = m_indexOfRefraction;
1331 }
1332
1333 if (m_dirtyAttributes & OpacityDirty) {
1334 material->opacity = m_opacity;
1335 if (!m_opacityMap)
1336 material->opacityMap = nullptr;
1337 else
1338 material->opacityMap = m_opacityMap->getRenderImage();
1339
1340 material->opacity = m_opacity;
1341 material->opacityChannel = channelMapping(m_opacityChannel);
1342 }
1343
1344 if (m_dirtyAttributes & NormalDirty) {
1345 if (!m_normalMap)
1346 material->normalMap = nullptr;
1347 else
1348 material->normalMap = m_normalMap->getRenderImage();
1349
1350 material->bumpAmount = m_normalStrength;
1351 }
1352
1353 if (m_dirtyAttributes & OcclusionDirty) {
1354 if (!m_occlusionMap)
1355 material->occlusionMap = nullptr;
1356 else
1357 material->occlusionMap = m_occlusionMap->getRenderImage();
1358 material->occlusionAmount = m_occlusionAmount;
1359 material->occlusionChannel = channelMapping(m_occlusionChannel);
1360 }
1361
1362 if (m_dirtyAttributes & AlphaModeDirty) {
1364 material->alphaCutoff = m_alphaCutoff;
1365 }
1366
1367 if (m_dirtyAttributes & PointSizeDirty)
1368 material->pointSize = m_pointSize;
1369
1370 if (m_dirtyAttributes & LineWidthDirty)
1371 material->lineWidth = m_lineWidth;
1372
1373 if (m_dirtyAttributes & HeightDirty) {
1374 if (!m_heightMap)
1375 material->heightMap = nullptr;
1376 else
1377 material->heightMap = m_heightMap->getRenderImage();
1378 material->heightAmount = m_heightAmount;
1379 material->minHeightSamples = m_minHeightMapSamples;
1380 material->maxHeightSamples = m_maxHeightMapSamples;
1381 material->heightChannel = channelMapping(m_heightChannel);
1382 }
1383
1384 if (m_dirtyAttributes & ClearcoatDirty) {
1385 material->clearcoatAmount = m_clearcoatAmount;
1386 if (!m_clearcoatMap)
1387 material->clearcoatMap = nullptr;
1388 else
1389 material->clearcoatMap = m_clearcoatMap->getRenderImage();
1390 material->clearcoatChannel = channelMapping(m_clearcoatChannel);
1391 material->clearcoatRoughnessAmount = m_clearcoatRoughnessAmount;
1392 if (!m_clearcoatRoughnessMap)
1393 material->clearcoatRoughnessMap = nullptr;
1394 else
1395 material->clearcoatRoughnessMap = m_clearcoatRoughnessMap->getRenderImage();
1396 material->clearcoatRoughnessChannel = channelMapping(m_clearcoatRoughnessChannel);
1397 if (!m_clearcoatNormalMap)
1398 material->clearcoatNormalMap = nullptr;
1399 else
1400 material->clearcoatNormalMap = m_clearcoatNormalMap->getRenderImage();
1401 }
1402
1403 if (m_dirtyAttributes & TransmissionDirty) {
1404 material->transmissionFactor = m_transmissionFactor;
1405 if (!m_transmissionMap)
1406 material->transmissionMap = nullptr;
1407 else
1408 material->transmissionMap = m_transmissionMap->getRenderImage();
1409 material->transmissionChannel = channelMapping(m_transmissionChannel);
1410 }
1411
1412 if (m_dirtyAttributes & VolumeDirty) {
1413 material->thicknessFactor = m_thicknessFactor;
1414 if (!m_thicknessMap)
1415 material->thicknessMap = nullptr;
1416 else
1417 material->thicknessMap = m_thicknessMap->getRenderImage();
1418 material->thicknessChannel = channelMapping(m_thicknessChannel);
1419
1420 material->attenuationDistance = m_attenuationDistance;
1421 material->attenuationColor = color::sRGBToLinear(m_attenuationColor).toVector3D();
1422 }
1423
1424 if (m_dirtyAttributes & VertexColorsDirty)
1425 material->vertexColorsEnabled = m_vertexColorsEnabled;
1426
1427 m_dirtyAttributes = 0;
1428
1429 return node;
1430}
1431
1432void QQuick3DPrincipledMaterial::itemChange(QQuick3DObject::ItemChange change, const QQuick3DObject::ItemChangeData &value)
1433{
1434 if (change == QQuick3DObject::ItemSceneChange)
1435 updateSceneManager(value.sceneManager);
1436}
1437
1438void QQuick3DPrincipledMaterial::updateSceneManager(QQuick3DSceneManager *sceneManager)
1439{
1440 // Check all the resource value's scene manager, and update as necessary.
1441 if (sceneManager) {
1442 QQuick3DObjectPrivate::refSceneManager(m_baseColorMap, *sceneManager);
1443 QQuick3DObjectPrivate::refSceneManager(m_emissiveMap, *sceneManager);
1444 QQuick3DObjectPrivate::refSceneManager(m_specularReflectionMap, *sceneManager);
1445 QQuick3DObjectPrivate::refSceneManager(m_specularMap, *sceneManager);
1446 QQuick3DObjectPrivate::refSceneManager(m_roughnessMap, *sceneManager);
1447 QQuick3DObjectPrivate::refSceneManager(m_opacityMap, *sceneManager);
1448 QQuick3DObjectPrivate::refSceneManager(m_normalMap, *sceneManager);
1449 QQuick3DObjectPrivate::refSceneManager(m_metalnessMap, *sceneManager);
1450 QQuick3DObjectPrivate::refSceneManager(m_occlusionMap, *sceneManager);
1451 QQuick3DObjectPrivate::refSceneManager(m_heightMap, *sceneManager);
1452 QQuick3DObjectPrivate::refSceneManager(m_clearcoatMap, *sceneManager);
1453 QQuick3DObjectPrivate::refSceneManager(m_clearcoatRoughnessMap, *sceneManager);
1454 QQuick3DObjectPrivate::refSceneManager(m_clearcoatNormalMap, *sceneManager);
1455 QQuick3DObjectPrivate::refSceneManager(m_transmissionMap, *sceneManager);
1456 QQuick3DObjectPrivate::refSceneManager(m_thicknessMap, *sceneManager);
1457 } else {
1460 QQuick3DObjectPrivate::derefSceneManager(m_specularReflectionMap);
1469 QQuick3DObjectPrivate::derefSceneManager(m_clearcoatRoughnessMap);
1470 QQuick3DObjectPrivate::derefSceneManager(m_clearcoatNormalMap);
1473 }
1474}
1475
1476void QQuick3DPrincipledMaterial::markDirty(QQuick3DPrincipledMaterial::DirtyType type)
1477{
1478 if (!(m_dirtyAttributes & quint32(type))) {
1479 m_dirtyAttributes |= quint32(type);
1480 update();
1481 }
1482}
1483
1485{
1486 return m_clearcoatAmount;
1487}
1488
1489void QQuick3DPrincipledMaterial::setClearcoatAmount(float newClearcoatAmount)
1490{
1491 if (qFuzzyCompare(m_clearcoatAmount, newClearcoatAmount))
1492 return;
1493 m_clearcoatAmount = newClearcoatAmount;
1494 emit clearcoatAmountChanged(m_clearcoatAmount);
1495 markDirty(ClearcoatDirty);
1496}
1497
1499{
1500 return m_clearcoatMap;
1501}
1502
1503void QQuick3DPrincipledMaterial::setClearcoatMap(QQuick3DTexture *newClearcoatMap)
1504{
1505 if (m_clearcoatMap == newClearcoatMap)
1506 return;
1507
1508 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DPrincipledMaterial::setClearcoatMap, newClearcoatMap, m_clearcoatMap);
1509
1510 m_clearcoatMap = newClearcoatMap;
1511 emit clearcoatMapChanged(m_clearcoatMap);
1512 markDirty(ClearcoatDirty);
1513}
1514
1516{
1517 return m_clearcoatChannel;
1518}
1519
1520void QQuick3DPrincipledMaterial::setClearcoatChannel(QQuick3DMaterial::TextureChannelMapping newClearcoatChannel)
1521{
1522 if (m_clearcoatChannel == newClearcoatChannel)
1523 return;
1524 m_clearcoatChannel = newClearcoatChannel;
1525 emit clearcoatChannelChanged(m_clearcoatChannel);
1526 markDirty(ClearcoatDirty);
1527}
1528
1530{
1531 return m_clearcoatRoughnessAmount;
1532}
1533
1534void QQuick3DPrincipledMaterial::setClearcoatRoughnessAmount(float newClearcoatRoughnessAmount)
1535{
1536 if (qFuzzyCompare(m_clearcoatRoughnessAmount, newClearcoatRoughnessAmount))
1537 return;
1538 m_clearcoatRoughnessAmount = newClearcoatRoughnessAmount;
1539 emit clearcoatRoughnessAmountChanged(m_clearcoatRoughnessAmount);
1540 markDirty(ClearcoatDirty);
1541}
1542
1544{
1545 return m_clearcoatRoughnessChannel;
1546}
1547
1548void QQuick3DPrincipledMaterial::setClearcoatRoughnessChannel(QQuick3DMaterial::TextureChannelMapping newClearcoatRoughnessChannel)
1549{
1550 if (m_clearcoatRoughnessChannel == newClearcoatRoughnessChannel)
1551 return;
1552 m_clearcoatRoughnessChannel = newClearcoatRoughnessChannel;
1553 emit clearcoatRoughnessChannelChanged(m_clearcoatRoughnessChannel);
1554 markDirty(ClearcoatDirty);
1555}
1556
1558{
1559 return m_clearcoatRoughnessMap;
1560}
1561
1562void QQuick3DPrincipledMaterial::setClearcoatRoughnessMap(QQuick3DTexture *newClearcoatRoughnessMap)
1563{
1564 if (m_clearcoatRoughnessMap == newClearcoatRoughnessMap)
1565 return;
1566
1567 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DPrincipledMaterial::setClearcoatRoughnessMap, newClearcoatRoughnessMap, m_clearcoatRoughnessMap);
1568
1569 m_clearcoatRoughnessMap = newClearcoatRoughnessMap;
1570 emit clearcoatRoughnessMapChanged(m_clearcoatRoughnessMap);
1571 markDirty(ClearcoatDirty);
1572}
1573
1575{
1576 return m_clearcoatNormalMap;
1577}
1578
1579void QQuick3DPrincipledMaterial::setClearcoatNormalMap(QQuick3DTexture *newClearcoatNormalMap)
1580{
1581 if (m_clearcoatNormalMap == newClearcoatNormalMap)
1582 return;
1583
1584 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DPrincipledMaterial::setClearcoatNormalMap, newClearcoatNormalMap, m_clearcoatNormalMap);
1585
1586 m_clearcoatNormalMap = newClearcoatNormalMap;
1587 emit clearcoatNormalMapChanged(m_clearcoatNormalMap);
1588 markDirty(ClearcoatDirty);
1589}
1590
1592{
1593 return m_transmissionFactor;
1594}
1595
1596void QQuick3DPrincipledMaterial::setTransmissionFactor(float newTransmissionFactor)
1597{
1598 if (qFuzzyCompare(m_transmissionFactor, newTransmissionFactor))
1599 return;
1600 m_transmissionFactor = newTransmissionFactor;
1601 emit transmissionFactorChanged(m_transmissionFactor);
1602 markDirty(TransmissionDirty);
1603}
1604
1606{
1607 return m_transmissionMap;
1608}
1609
1610void QQuick3DPrincipledMaterial::setTransmissionMap(QQuick3DTexture *newTransmissionMap)
1611{
1612 if (m_transmissionMap == newTransmissionMap)
1613 return;
1614
1615 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DPrincipledMaterial::setTransmissionMap, newTransmissionMap, m_transmissionMap);
1616
1617 m_transmissionMap = newTransmissionMap;
1618 emit transmissionMapChanged(m_transmissionMap);
1619 markDirty(TransmissionDirty);
1620}
1621
1623{
1624 return m_transmissionChannel;
1625}
1626
1628{
1629 return m_indexOfRefraction;
1630}
1631
1633{
1634 return m_vertexColorsEnabled;
1635}
1636
1637void QQuick3DPrincipledMaterial::setTransmissionChannel(QQuick3DMaterial::TextureChannelMapping newTransmissionChannel)
1638{
1639 if (m_transmissionChannel == newTransmissionChannel)
1640 return;
1641 m_transmissionChannel = newTransmissionChannel;
1642 emit transmissionChannelChanged(m_transmissionChannel);
1643 markDirty(TransmissionDirty);
1644}
1645
1647{
1648 return m_thicknessFactor;
1649}
1650
1651void QQuick3DPrincipledMaterial::setThicknessFactor(float newThicknessFactor)
1652{
1653 if (qFuzzyCompare(m_thicknessFactor, newThicknessFactor))
1654 return;
1655 m_thicknessFactor = newThicknessFactor;
1656 emit thicknessFactorChanged(m_thicknessFactor);
1657 markDirty(VolumeDirty);
1658}
1659
1661{
1662 return m_thicknessMap;
1663}
1664
1665void QQuick3DPrincipledMaterial::setThicknessMap(QQuick3DTexture *newThicknessMap)
1666{
1667 if (m_thicknessMap == newThicknessMap)
1668 return;
1669
1670 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DPrincipledMaterial::setThicknessMap, newThicknessMap, m_thicknessMap);
1671
1672 m_thicknessMap = newThicknessMap;
1673 emit thicknessMapChanged(m_thicknessMap);
1674 markDirty(VolumeDirty);
1675}
1676
1678{
1679 return m_thicknessChannel;
1680}
1681
1682void QQuick3DPrincipledMaterial::setThicknessChannel(const QQuick3DMaterial::TextureChannelMapping &newThicknessChannel)
1683{
1684 if (m_thicknessChannel == newThicknessChannel)
1685 return;
1686 m_thicknessChannel = newThicknessChannel;
1687 emit thicknessChannelChanged(m_thicknessChannel);
1688 markDirty(VolumeDirty);
1689}
1690
1692{
1693 return m_attenuationDistance;
1694}
1695
1696void QQuick3DPrincipledMaterial::setAttenuationDistance(float newAttenuationDistance)
1697{
1698 if (qFuzzyCompare(m_attenuationDistance, newAttenuationDistance))
1699 return;
1700 m_attenuationDistance = newAttenuationDistance;
1701 emit attenuationDistanceChanged(m_attenuationDistance);
1702 markDirty(VolumeDirty);
1703}
1704
1706{
1707 return m_attenuationColor;
1708}
1709
1710void QQuick3DPrincipledMaterial::setAttenuationColor(const QColor &newAttenuationColor)
1711{
1712 if (m_attenuationColor == newAttenuationColor)
1713 return;
1714 m_attenuationColor = newAttenuationColor;
1715 emit attenuationColorChanged(m_attenuationColor);
1716 markDirty(VolumeDirty);
1717}
1718
1719void QQuick3DPrincipledMaterial::setIndexOfRefraction(float indexOfRefraction)
1720{
1721 if (qFuzzyCompare(m_indexOfRefraction, indexOfRefraction))
1722 return;
1723
1724 m_indexOfRefraction = indexOfRefraction;
1725 emit indexOfRefractionChanged(m_indexOfRefraction);
1726 markDirty(SpecularDirty);
1727}
1728
1729void QQuick3DPrincipledMaterial::setVertexColorsEnabled(bool vertexColors)
1730{
1731 if (m_vertexColorsEnabled == vertexColors)
1732 return;
1733
1734 m_vertexColorsEnabled = vertexColors;
1735 emit vertexColorsEnabledChanged(m_vertexColorsEnabled);
1736 markDirty(VertexColorsDirty);
1737}
1738
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)
void setSpecularAmount(float specularAmount)
void setOcclusionMap(QQuick3DTexture *occlusionMap)
QQuick3DMaterial::TextureChannelMapping opacityChannel
void specularTintChanged(float specularTint)
void setLighting(QQuick3DPrincipledMaterial::Lighting lighting)
void opacityChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
void opacityChanged(float opacity)
QQuick3DMaterial::TextureChannelMapping clearcoatRoughnessChannel
void occlusionChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
void setBaseColorMap(QQuick3DTexture *baseColorMap)
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 itemChange(ItemChange, const ItemChangeData &) override
QQuick3DPrincipledMaterial(QQuick3DObject *parent=nullptr)
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)
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 setAlphaMode(QQuick3DPrincipledMaterial::AlphaMode alphaMode)
void setOpacityMap(QQuick3DTexture *opacityMap)
void specularMapChanged(QQuick3DTexture *specularMap)
void setOcclusionChannel(QQuick3DMaterial::TextureChannelMapping channel)
QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node) override
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)
void setOcclusionAmount(float occlusionAmount)
void setSpecularMap(QQuick3DTexture *specularMap)
void setOpacityChannel(QQuick3DMaterial::TextureChannelMapping channel)
void alphaModeChanged(QQuick3DPrincipledMaterial::AlphaMode alphaMode)
QQuick3DMaterial::TextureChannelMapping metalnessChannel
void baseColorChanged(QColor baseColor)
void roughnessChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
void setMetalness(float metalnessAmount)
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:287
constexpr const T & qBound(const T &min, const T &val, const T &max)
Definition qminmax.h:44
GLsizei samples
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei width
GLenum type
GLuint GLfloat * val
GLenum GLenum GLenum GLenum mapping
static QT_BEGIN_NAMESPACE float ensureNormalized(float val)
\qmltype PrincipledMaterial \inherits Material \inqmlmodule QtQuick3D
#define emit
unsigned int quint32
Definition qtypes.h:45
QSSGRenderDefaultMaterial::MaterialSpecularModel specularModel
QSSGRenderDefaultMaterial::MaterialBlendMode blendMode
QSSGRenderDefaultMaterial::MaterialAlphaMode alphaMode
TextureChannelMapping clearcoatRoughnessChannel
Definition moc.h:24
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent