9#include <QtQuick3DRuntimeRender/private/qssgrenderdefaultmaterial_p.h>
10#include <QtQuick3DUtils/private/qssgutils_p.h>
11#include <QtQuick3D/private/qquick3dviewport_p.h>
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
114
115
116
117
118
119
120
121
124
125
126
127
128
129
132
133
134
135
136
137
138
141
142
143
144
145
146
147
148
149
150
151
152
155
156
157
158
159
160
161
164
165
166
167
168
171
172
173
174
175
176
177
180
181
182
183
184
185
186
187
188
189
190
191
194
195
196
197
198
199
200
203
204
205
206
207
210
211
212
213
214
215
216
217
218
219
220
223
224
225
226
227
228
229
232
233
234
235
236
237
238
239
240
241
242
243
246
247
248
249
250
253
254
255
256
257
258
259
260
261
262
265
266
267
268
269
272
273
274
275
276
279
280
281
282
283
284
287
288
289
290
291
292
293
294
295
296
299
300
301
302
303
304
305
306
309
310
311
312
315
316
317
318
319
322
323
324
325
326
327
328
329
332
333
334
335
336
337
338
339
340
341
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
395
396
397
398
399
400
401
402
403
404
405
406
409
410
411
412
413
414
415
416
417
418
419
422
423
424
425
426
427
428
429
430
431
432
433
434
437
438
439
440
441
442
443
444
447
448
449
450
451
452
453
454
455
456
457
460
461
462
463
464
465
466
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
503
504
505
506
507
508
511
512
513
514
515
516
517
520
521
522
523
524
525
526
527
528
529
530
533
534
535
536
537
540
541
542
543
544
545
546
549
550
551
552
553
554
555
556
557
558
559
560
563
564
565
566
567
568
571
572
573
574
575
576
579
580
581
582
583
584
585
586
589
590
591
592
593
594
595
596
597
598
599
600
603
604
605
606
607
608
609
610
611
614
615
616
617
618
619
620
623
624
625
626
627
628
629
630
631
632
633
634
637
638
639
640
641
642
643
646
647
648
649
650
651
652
655
656
657
658
659
662
663
664
665
666
667
668
671
672
673
674
675
676
677
680
681
682
683
684
685
688
689
690
691
692
695
696
697
698
699
700
701
704
705
706
707
708
709
710
713
714
715
716
717
718
721
722
723
724
725
726
727
730
731
732
733
734
735
736
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
819QQuick3DSpecularGlossyMaterial::QQuick3DSpecularGlossyMaterial(QQuick3DObject *parent)
820 : QQuick3DMaterial(*(
new QQuick3DObjectPrivate(QQuick3DObjectPrivate::Type::SpecularGlossyMaterial)), parent)
823QQuick3DSpecularGlossyMaterial::~QQuick3DSpecularGlossyMaterial()
827QQuick3DSpecularGlossyMaterial::Lighting QQuick3DSpecularGlossyMaterial::lighting()
const
832QQuick3DSpecularGlossyMaterial::BlendMode QQuick3DSpecularGlossyMaterial::blendMode()
const
837QColor QQuick3DSpecularGlossyMaterial::albedoColor()
const
842QQuick3DTexture *QQuick3DSpecularGlossyMaterial::albedoMap()
const
847bool QQuick3DSpecularGlossyMaterial::albedoSingleChannelEnabled()
const
849 return m_albedoSingleChannelEnabled;
852QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::albedoChannel()
const
854 return m_albedoChannel;
857bool QQuick3DSpecularGlossyMaterial::specularSingleChannelEnabled()
const
859 return m_specularSingleChannelEnabled;
862QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::specularChannel()
const
864 return m_specularChannel;
867bool QQuick3DSpecularGlossyMaterial::emissiveSingleChannelEnabled()
const
869 return m_emissiveSingleChannelEnabled;
872QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::emissiveChannel()
const
874 return m_emissiveChannel;
877QQuick3DTexture *QQuick3DSpecularGlossyMaterial::emissiveMap()
const
879 return m_emissiveMap;
882QVector3D QQuick3DSpecularGlossyMaterial::emissiveFactor()
const
884 return m_emissiveFactor;
887float QQuick3DSpecularGlossyMaterial::glossiness()
const
892QQuick3DTexture *QQuick3DSpecularGlossyMaterial::glossinessMap()
const
894 return m_glossinessMap;
897bool QQuick3DSpecularGlossyMaterial::invertOpacityMapValue()
const
899 return m_invertOpacityMapValue;
902float QQuick3DSpecularGlossyMaterial::opacity()
const
907QQuick3DTexture *QQuick3DSpecularGlossyMaterial::opacityMap()
const
912QQuick3DTexture *QQuick3DSpecularGlossyMaterial::normalMap()
const
917QColor QQuick3DSpecularGlossyMaterial::specularColor()
const
922QQuick3DTexture *QQuick3DSpecularGlossyMaterial::specularMap()
const
924 return m_specularMap;
927float QQuick3DSpecularGlossyMaterial::normalStrength()
const
929 return m_normalStrength;
932QQuick3DTexture *QQuick3DSpecularGlossyMaterial::occlusionMap()
const
934 return m_occlusionMap;
937float QQuick3DSpecularGlossyMaterial::occlusionAmount()
const
939 return m_occlusionAmount;
942QQuick3DSpecularGlossyMaterial::AlphaMode QQuick3DSpecularGlossyMaterial::alphaMode()
const
947float QQuick3DSpecularGlossyMaterial::alphaCutoff()
const
949 return m_alphaCutoff;
952QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::glossinessChannel()
const
954 return m_glossinessChannel;
957QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::opacityChannel()
const
959 return m_opacityChannel;
962QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::occlusionChannel()
const
964 return m_occlusionChannel;
967float QQuick3DSpecularGlossyMaterial::pointSize()
const
972float QQuick3DSpecularGlossyMaterial::lineWidth()
const
977QQuick3DTexture *QQuick3DSpecularGlossyMaterial::heightMap()
const
982QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::heightChannel()
const
984 return m_heightChannel;
987float QQuick3DSpecularGlossyMaterial::heightAmount()
const
989 return m_heightAmount;
992int QQuick3DSpecularGlossyMaterial::minHeightMapSamples()
const
994 return m_minHeightMapSamples;
997int QQuick3DSpecularGlossyMaterial::maxHeightMapSamples()
const
999 return m_maxHeightMapSamples;
1002void QQuick3DSpecularGlossyMaterial::markAllDirty()
1004 m_dirtyAttributes = 0xffffffff;
1005 QQuick3DMaterial::markAllDirty();
1008void QQuick3DSpecularGlossyMaterial::setLighting(QQuick3DSpecularGlossyMaterial::Lighting lighting)
1010 if (m_lighting == lighting)
1013 m_lighting = lighting;
1014 emit lightingChanged();
1015 markDirty(LightingModeDirty);
1018void QQuick3DSpecularGlossyMaterial::setBlendMode(QQuick3DSpecularGlossyMaterial::BlendMode blendMode)
1020 if (m_blendMode == blendMode)
1023 m_blendMode = blendMode;
1024 emit blendModeChanged();
1025 markDirty(BlendModeDirty);
1028void QQuick3DSpecularGlossyMaterial::setAlbedoColor(
const QColor &diffuseColor)
1030 if (m_albedo == diffuseColor)
1033 m_albedo = diffuseColor;
1034 emit albedoColorChanged();
1035 markDirty(AlbedoDirty);
1038void QQuick3DSpecularGlossyMaterial::setAlbedoMap(QQuick3DTexture *albedoMap)
1040 if (m_albedoMap == albedoMap)
1043 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setAlbedoMap, albedoMap, m_albedoMap);
1045 m_albedoMap = albedoMap;
1046 emit albedoMapChanged();
1047 markDirty(AlbedoDirty);
1050void QQuick3DSpecularGlossyMaterial::setAlbedoSingleChannelEnabled(
bool albedoSingleChannelEnabled)
1052 if (m_albedoSingleChannelEnabled == albedoSingleChannelEnabled)
1055 m_albedoSingleChannelEnabled = albedoSingleChannelEnabled;
1056 emit albedoSingleChannelEnabledChanged();
1057 markDirty(AlbedoDirty);
1060void QQuick3DSpecularGlossyMaterial::setAlbedoChannel(TextureChannelMapping channel)
1062 if (m_albedoChannel == channel)
1065 m_albedoChannel = channel;
1066 emit albedoChannelChanged();
1067 markDirty(AlbedoDirty);
1070void QQuick3DSpecularGlossyMaterial::setSpecularSingleChannelEnabled(
bool specularSingleChannelEnabled)
1072 if (m_specularSingleChannelEnabled == specularSingleChannelEnabled)
1075 m_specularSingleChannelEnabled = specularSingleChannelEnabled;
1076 emit specularSingleChannelEnabledChanged();
1077 markDirty(SpecularDirty);
1080void QQuick3DSpecularGlossyMaterial::setSpecularChannel(TextureChannelMapping channel)
1082 if (m_specularChannel == channel)
1085 m_specularChannel = channel;
1086 emit specularChannelChanged();
1087 markDirty(SpecularDirty);
1090void QQuick3DSpecularGlossyMaterial::setEmissiveSingleChannelEnabled(
bool emissiveSingleChannelEnabled)
1092 if (m_emissiveSingleChannelEnabled == emissiveSingleChannelEnabled)
1095 m_emissiveSingleChannelEnabled = emissiveSingleChannelEnabled;
1096 emit emissiveSingleChannelEnabledChanged();
1097 markDirty(EmissiveDirty);
1100void QQuick3DSpecularGlossyMaterial::setEmissiveChannel(TextureChannelMapping channel)
1102 if (m_emissiveChannel == channel)
1105 m_emissiveChannel = channel;
1106 emit emissiveChannelChanged();
1107 markDirty(EmissiveDirty);
1110void QQuick3DSpecularGlossyMaterial::setEmissiveMap(QQuick3DTexture *emissiveMap)
1112 if (m_emissiveMap == emissiveMap)
1115 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setEmissiveMap, emissiveMap, m_emissiveMap);
1117 m_emissiveMap = emissiveMap;
1118 emit emissiveMapChanged();
1119 markDirty(EmissiveDirty);
1122void QQuick3DSpecularGlossyMaterial::setEmissiveFactor(
const QVector3D &emissiveFactor)
1124 if (m_emissiveFactor == emissiveFactor)
1127 m_emissiveFactor = emissiveFactor;
1128 emit emissiveFactorChanged();
1129 markDirty(EmissiveDirty);
1132void QQuick3DSpecularGlossyMaterial::setGlossiness(
float glossiness)
1134 glossiness = ensureNormalized(glossiness);
1135 if (qFuzzyCompare(m_glossiness, glossiness))
1138 m_glossiness = glossiness;
1139 emit glossinessChanged();
1140 markDirty(GlossyDirty);
1143void QQuick3DSpecularGlossyMaterial::setGlossinessMap(QQuick3DTexture *glossinessMap)
1145 if (m_glossinessMap == glossinessMap)
1148 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setGlossinessMap, glossinessMap, m_glossinessMap);
1150 m_glossinessMap = glossinessMap;
1151 emit glossinessMapChanged();
1152 markDirty(GlossyDirty);
1155void QQuick3DSpecularGlossyMaterial::setInvertOpacityMapValue(
bool invertOpacityMapValue)
1157 if (invertOpacityMapValue == m_invertOpacityMapValue)
1160 m_invertOpacityMapValue = invertOpacityMapValue;
1161 emit invertOpacityMapValueChanged();
1162 markDirty(OpacityDirty);
1165void QQuick3DSpecularGlossyMaterial::setOpacity(
float opacity)
1167 opacity = ensureNormalized(opacity);
1168 if (qFuzzyCompare(m_opacity, opacity))
1171 m_opacity = opacity;
1172 emit opacityChanged();
1173 markDirty(OpacityDirty);
1176void QQuick3DSpecularGlossyMaterial::setOpacityMap(QQuick3DTexture *opacityMap)
1178 if (m_opacityMap == opacityMap)
1181 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setOpacityMap, opacityMap, m_opacityMap);
1183 m_opacityMap = opacityMap;
1184 emit opacityMapChanged();
1185 markDirty(OpacityDirty);
1188void QQuick3DSpecularGlossyMaterial::setNormalMap(QQuick3DTexture *normalMap)
1190 if (m_normalMap == normalMap)
1193 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setNormalMap, normalMap, m_normalMap);
1195 m_normalMap = normalMap;
1196 emit normalMapChanged();
1197 markDirty(NormalDirty);
1200void QQuick3DSpecularGlossyMaterial::setSpecularColor(
const QColor &specular)
1202 if (m_specular == specular)
1205 m_specular = specular;
1206 emit specularColorChanged();
1207 markDirty(SpecularDirty);
1210void QQuick3DSpecularGlossyMaterial::setSpecularMap(QQuick3DTexture *specularMap)
1212 if (m_specularMap == specularMap)
1215 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setSpecularMap, specularMap, m_specularMap);
1217 m_specularMap = specularMap;
1218 emit specularMapChanged();
1219 markDirty(SpecularDirty);
1222void QQuick3DSpecularGlossyMaterial::setNormalStrength(
float factor)
1224 factor = ensureNormalized(factor);
1225 if (qFuzzyCompare(m_normalStrength, factor))
1228 m_normalStrength = factor;
1229 emit normalStrengthChanged();
1230 markDirty(NormalDirty);
1233void QQuick3DSpecularGlossyMaterial::setOcclusionMap(QQuick3DTexture *occlusionMap)
1235 if (m_occlusionMap == occlusionMap)
1238 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setOcclusionMap, occlusionMap, m_occlusionMap);
1240 m_occlusionMap = occlusionMap;
1241 emit occlusionMapChanged();
1242 markDirty(OcclusionDirty);
1245void QQuick3DSpecularGlossyMaterial::setOcclusionAmount(
float occlusionAmount)
1247 if (qFuzzyCompare(m_occlusionAmount, occlusionAmount))
1250 m_occlusionAmount = occlusionAmount;
1251 emit occlusionAmountChanged();
1252 markDirty(OcclusionDirty);
1255void QQuick3DSpecularGlossyMaterial::setAlphaMode(QQuick3DSpecularGlossyMaterial::AlphaMode alphaMode)
1257 if (m_alphaMode == alphaMode)
1260 m_alphaMode = alphaMode;
1261 emit alphaModeChanged();
1262 markDirty(AlphaModeDirty);
1265void QQuick3DSpecularGlossyMaterial::setAlphaCutoff(
float alphaCutoff)
1267 if (qFuzzyCompare(m_alphaCutoff, alphaCutoff))
1270 m_alphaCutoff = alphaCutoff;
1271 emit alphaCutoffChanged();
1272 markDirty(AlphaModeDirty);
1275void QQuick3DSpecularGlossyMaterial::setGlossinessChannel(TextureChannelMapping channel)
1277 if (m_glossinessChannel == channel)
1280 m_glossinessChannel = channel;
1281 emit glossinessChannelChanged();
1282 markDirty(GlossyDirty);
1285void QQuick3DSpecularGlossyMaterial::setOpacityChannel(TextureChannelMapping channel)
1287 if (m_opacityChannel == channel)
1290 m_opacityChannel = channel;
1291 emit opacityChannelChanged();
1292 markDirty(OpacityDirty);
1295void QQuick3DSpecularGlossyMaterial::setOcclusionChannel(TextureChannelMapping channel)
1297 if (m_occlusionChannel == channel)
1300 m_occlusionChannel = channel;
1301 emit occlusionChannelChanged();
1302 markDirty(OcclusionDirty);
1305void QQuick3DSpecularGlossyMaterial::setPointSize(
float size)
1307 if (qFuzzyCompare(m_pointSize, size))
1310 emit pointSizeChanged();
1311 markDirty(PointSizeDirty);
1314void QQuick3DSpecularGlossyMaterial::setLineWidth(
float width)
1316 if (qFuzzyCompare(m_lineWidth, width))
1318 m_lineWidth = width;
1319 emit lineWidthChanged();
1320 markDirty(LineWidthDirty);
1323void QQuick3DSpecularGlossyMaterial::setHeightMap(QQuick3DTexture *heightMap)
1325 if (m_heightMap == heightMap)
1328 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setHeightMap, heightMap, m_heightMap);
1330 m_heightMap = heightMap;
1331 emit heightMapChanged();
1332 markDirty(HeightDirty);
1335void QQuick3DSpecularGlossyMaterial::setHeightChannel(QQuick3DMaterial::TextureChannelMapping channel)
1337 if (m_heightChannel == channel)
1340 m_heightChannel = channel;
1341 emit heightChannelChanged();
1342 markDirty(HeightDirty);
1345void QQuick3DSpecularGlossyMaterial::setHeightAmount(
float heightAmount)
1347 if (qFuzzyCompare(m_heightAmount, heightAmount))
1350 m_heightAmount = heightAmount;
1351 emit heightAmountChanged();
1352 markDirty(HeightDirty);
1355void QQuick3DSpecularGlossyMaterial::setMinHeightMapSamples(
int samples)
1357 if (m_minHeightMapSamples == samples)
1360 m_minHeightMapSamples = samples;
1361 emit minHeightMapSamplesChanged();
1362 markDirty(HeightDirty);
1365void QQuick3DSpecularGlossyMaterial::setMaxHeightMapSamples(
int samples)
1367 if (m_maxHeightMapSamples == samples)
1370 m_maxHeightMapSamples = samples;
1371 emit maxHeightMapSamplesChanged();
1372 markDirty(HeightDirty);
1375QSSGRenderGraphObject *QQuick3DSpecularGlossyMaterial::updateSpatialNode(QSSGRenderGraphObject *node)
1377 static const auto channelMapping = [](TextureChannelMapping mapping) {
1378 return QSSGRenderDefaultMaterial::TextureChannelMapping(mapping);
1383 node =
new QSSGRenderDefaultMaterial(QSSGRenderGraphObject::Type::SpecularGlossyMaterial);
1387 QQuick3DMaterial::updateSpatialNode(node);
1389 QSSGRenderDefaultMaterial *material =
static_cast<QSSGRenderDefaultMaterial *>(node);
1391 material->specularModel = QSSGRenderDefaultMaterial::MaterialSpecularModel::SchlickGGX;
1393 if (m_dirtyAttributes & LightingModeDirty)
1394 material->lighting = QSSGRenderDefaultMaterial::MaterialLighting(m_lighting);
1396 if (m_dirtyAttributes & BlendModeDirty)
1397 material->blendMode = QSSGRenderDefaultMaterial::MaterialBlendMode(m_blendMode);
1399 if (m_dirtyAttributes & AlbedoDirty) {
1401 material->colorMap =
nullptr;
1403 material->colorMap = m_albedoMap->getRenderImage();
1405 material->color = QSSGUtils::color::sRGBToLinear(m_albedo);
1406 material->baseColorSingleChannelEnabled = m_albedoSingleChannelEnabled;
1407 material->baseColorChannel = channelMapping(m_albedoChannel);
1410 if (m_dirtyAttributes & EmissiveDirty) {
1412 material->emissiveMap =
nullptr;
1414 material->emissiveMap = m_emissiveMap->getRenderImage();
1416 material->emissiveColor = m_emissiveFactor;
1417 material->emissiveSingleChannelEnabled = m_emissiveSingleChannelEnabled;
1418 material->emissiveChannel = channelMapping(m_emissiveChannel);
1421 if (m_dirtyAttributes & GlossyDirty) {
1422 if (!m_glossinessMap)
1423 material->roughnessMap =
nullptr;
1425 material->roughnessMap = m_glossinessMap->getRenderImage();
1427 material->specularRoughness = m_glossiness;
1428 material->roughnessChannel = channelMapping(m_glossinessChannel);
1431 if (m_dirtyAttributes & SpecularDirty) {
1433 material->specularMap =
nullptr;
1435 material->specularMap = m_specularMap->getRenderImage();
1437 material->specularTint = QSSGUtils::color::sRGBToLinear(m_specular).toVector3D();
1438 material->fresnelScaleBiasEnabled = m_fresnelScaleBiasEnabled;
1439 material->fresnelScale = m_fresnelScale;
1440 material->fresnelBias = m_fresnelBias;
1441 material->fresnelPower = m_fresnelPower;
1442 material->specularAmountSingleChannelEnabled = m_specularSingleChannelEnabled;
1443 material->specularAmountChannel = channelMapping(m_specularChannel);
1446 if (m_dirtyAttributes & OpacityDirty) {
1448 material->opacityMap =
nullptr;
1450 material->opacityMap = m_opacityMap->getRenderImage();
1452 material->invertOpacityMapValue = m_invertOpacityMapValue;
1453 material->opacity = m_opacity;
1454 material->opacityChannel = channelMapping(m_opacityChannel);
1457 if (m_dirtyAttributes & NormalDirty) {
1459 material->normalMap =
nullptr;
1461 material->normalMap = m_normalMap->getRenderImage();
1463 material->bumpAmount = m_normalStrength;
1466 if (m_dirtyAttributes & OcclusionDirty) {
1467 if (!m_occlusionMap)
1468 material->occlusionMap =
nullptr;
1470 material->occlusionMap = m_occlusionMap->getRenderImage();
1471 material->occlusionAmount = m_occlusionAmount;
1472 material->occlusionChannel = channelMapping(m_occlusionChannel);
1475 if (m_dirtyAttributes & AlphaModeDirty) {
1476 material->alphaMode = QSSGRenderDefaultMaterial::MaterialAlphaMode(m_alphaMode);
1477 material->alphaCutoff = m_alphaCutoff;
1480 if (m_dirtyAttributes & PointSizeDirty)
1481 material->pointSize = m_pointSize;
1483 if (m_dirtyAttributes & LineWidthDirty)
1484 material->lineWidth = m_lineWidth;
1486 if (m_dirtyAttributes & HeightDirty) {
1488 material->heightMap =
nullptr;
1490 material->heightMap = m_heightMap->getRenderImage();
1491 material->heightAmount = m_heightAmount;
1492 material->minHeightSamples = m_minHeightMapSamples;
1493 material->maxHeightSamples = m_maxHeightMapSamples;
1494 material->heightChannel = channelMapping(m_heightChannel);
1497 if (m_dirtyAttributes & ClearcoatDirty) {
1498 material->clearcoatAmount = m_clearcoatAmount;
1499 if (!m_clearcoatMap)
1500 material->clearcoatMap =
nullptr;
1502 material->clearcoatMap = m_clearcoatMap->getRenderImage();
1503 material->clearcoatChannel = channelMapping(m_clearcoatChannel);
1504 material->clearcoatRoughnessAmount = m_clearcoatRoughnessAmount;
1505 if (!m_clearcoatRoughnessMap)
1506 material->clearcoatRoughnessMap =
nullptr;
1508 material->clearcoatRoughnessMap = m_clearcoatRoughnessMap->getRenderImage();
1509 material->clearcoatRoughnessChannel = channelMapping(m_clearcoatRoughnessChannel);
1510 if (!m_clearcoatNormalMap)
1511 material->clearcoatNormalMap =
nullptr;
1513 material->clearcoatNormalMap = m_clearcoatNormalMap->getRenderImage();
1514 material->clearcoatNormalStrength = m_clearcoatNormalStrength;
1515 material->clearcoatFresnelScaleBiasEnabled = m_clearcoatFresnelScaleBiasEnabled;
1516 material->clearcoatFresnelScale = m_clearcoatFresnelScale;
1517 material->clearcoatFresnelBias = m_clearcoatFresnelBias;
1518 material->clearcoatFresnelPower = m_clearcoatFresnelPower;
1521 if (m_dirtyAttributes & TransmissionDirty) {
1522 material->transmissionFactor = m_transmissionFactor;
1523 if (!m_transmissionMap)
1524 material->transmissionMap =
nullptr;
1526 material->transmissionMap = m_transmissionMap->getRenderImage();
1527 material->transmissionChannel = channelMapping(m_transmissionChannel);
1530 if (m_dirtyAttributes & VolumeDirty) {
1531 material->thicknessFactor = m_thicknessFactor;
1532 if (!m_thicknessMap)
1533 material->thicknessMap =
nullptr;
1535 material->thicknessMap = m_thicknessMap->getRenderImage();
1536 material->thicknessChannel = channelMapping(m_thicknessChannel);
1538 material->attenuationDistance = m_attenuationDistance;
1539 material->attenuationColor = QSSGUtils::color::sRGBToLinear(m_attenuationColor).toVector3D();
1542 if (m_dirtyAttributes & VertexColorsDirty) {
1543 material->vertexColorsEnabled = m_vertexColorsEnabled;
1544 material->vertexColorsMaskEnabled = m_vertexColorsMaskEnabled;
1545 material->vertexColorRedMask = QSSGRenderDefaultMaterial::VertexColorMaskFlags::fromInt(m_vertexColorRedMask);
1546 material->vertexColorGreenMask = QSSGRenderDefaultMaterial::VertexColorMaskFlags::fromInt(m_vertexColorGreenMask);
1547 material->vertexColorBlueMask = QSSGRenderDefaultMaterial::VertexColorMaskFlags::fromInt(m_vertexColorBlueMask);
1548 material->vertexColorAlphaMask = QSSGRenderDefaultMaterial::VertexColorMaskFlags::fromInt(m_vertexColorAlphaMask);
1551 m_dirtyAttributes = 0;
1556void QQuick3DSpecularGlossyMaterial::itemChange(QQuick3DObject::ItemChange change,
const QQuick3DObject::ItemChangeData &value)
1558 if (change == QQuick3DObject::ItemSceneChange)
1559 updateSceneManager(value.sceneManager);
1562void QQuick3DSpecularGlossyMaterial::updateSceneManager(QQuick3DSceneManager *sceneManager)
1566 QQuick3DObjectPrivate::refSceneManager(m_albedoMap, *sceneManager);
1567 QQuick3DObjectPrivate::refSceneManager(m_emissiveMap, *sceneManager);
1568 QQuick3DObjectPrivate::refSceneManager(m_glossinessMap, *sceneManager);
1569 QQuick3DObjectPrivate::refSceneManager(m_opacityMap, *sceneManager);
1570 QQuick3DObjectPrivate::refSceneManager(m_normalMap, *sceneManager);
1571 QQuick3DObjectPrivate::refSceneManager(m_specularMap, *sceneManager);
1572 QQuick3DObjectPrivate::refSceneManager(m_occlusionMap, *sceneManager);
1573 QQuick3DObjectPrivate::refSceneManager(m_heightMap, *sceneManager);
1574 QQuick3DObjectPrivate::refSceneManager(m_clearcoatMap, *sceneManager);
1575 QQuick3DObjectPrivate::refSceneManager(m_clearcoatRoughnessMap, *sceneManager);
1576 QQuick3DObjectPrivate::refSceneManager(m_clearcoatNormalMap, *sceneManager);
1577 QQuick3DObjectPrivate::refSceneManager(m_transmissionMap, *sceneManager);
1578 QQuick3DObjectPrivate::refSceneManager(m_thicknessMap, *sceneManager);
1580 QQuick3DObjectPrivate::derefSceneManager(m_albedoMap);
1581 QQuick3DObjectPrivate::derefSceneManager(m_emissiveMap);
1582 QQuick3DObjectPrivate::derefSceneManager(m_glossinessMap);
1583 QQuick3DObjectPrivate::derefSceneManager(m_opacityMap);
1584 QQuick3DObjectPrivate::derefSceneManager(m_normalMap);
1585 QQuick3DObjectPrivate::derefSceneManager(m_specularMap);
1586 QQuick3DObjectPrivate::derefSceneManager(m_occlusionMap);
1587 QQuick3DObjectPrivate::derefSceneManager(m_heightMap);
1588 QQuick3DObjectPrivate::derefSceneManager(m_clearcoatMap);
1589 QQuick3DObjectPrivate::derefSceneManager(m_clearcoatRoughnessMap);
1590 QQuick3DObjectPrivate::derefSceneManager(m_clearcoatNormalMap);
1591 QQuick3DObjectPrivate::derefSceneManager(m_transmissionMap);
1592 QQuick3DObjectPrivate::derefSceneManager(m_thicknessMap);
1596void QQuick3DSpecularGlossyMaterial::markDirty(QQuick3DSpecularGlossyMaterial::DirtyType type)
1598 if (!(m_dirtyAttributes & quint32(type))) {
1599 m_dirtyAttributes |= quint32(type);
1604float QQuick3DSpecularGlossyMaterial::clearcoatAmount()
const
1606 return m_clearcoatAmount;
1609void QQuick3DSpecularGlossyMaterial::setClearcoatAmount(
float newClearcoatAmount)
1611 if (qFuzzyCompare(m_clearcoatAmount, newClearcoatAmount))
1613 m_clearcoatAmount = newClearcoatAmount;
1614 emit clearcoatAmountChanged();
1615 markDirty(ClearcoatDirty);
1618QQuick3DTexture *QQuick3DSpecularGlossyMaterial::clearcoatMap()
const
1620 return m_clearcoatMap;
1623void QQuick3DSpecularGlossyMaterial::setClearcoatMap(QQuick3DTexture *newClearcoatMap)
1625 if (m_clearcoatMap == newClearcoatMap)
1628 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setClearcoatMap, newClearcoatMap, m_clearcoatMap);
1630 m_clearcoatMap = newClearcoatMap;
1631 emit clearcoatMapChanged();
1632 markDirty(ClearcoatDirty);
1635QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::clearcoatChannel()
const
1637 return m_clearcoatChannel;
1640void QQuick3DSpecularGlossyMaterial::setClearcoatChannel(QQuick3DMaterial::TextureChannelMapping newClearcoatChannel)
1642 if (m_clearcoatChannel == newClearcoatChannel)
1644 m_clearcoatChannel = newClearcoatChannel;
1645 emit clearcoatChannelChanged();
1646 markDirty(ClearcoatDirty);
1649float QQuick3DSpecularGlossyMaterial::clearcoatRoughnessAmount()
const
1651 return m_clearcoatRoughnessAmount;
1654void QQuick3DSpecularGlossyMaterial::setClearcoatRoughnessAmount(
float newClearcoatRoughnessAmount)
1656 if (qFuzzyCompare(m_clearcoatRoughnessAmount, newClearcoatRoughnessAmount))
1658 m_clearcoatRoughnessAmount = newClearcoatRoughnessAmount;
1659 emit clearcoatRoughnessAmountChanged();
1660 markDirty(ClearcoatDirty);
1663QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::clearcoatRoughnessChannel()
const
1665 return m_clearcoatRoughnessChannel;
1668void QQuick3DSpecularGlossyMaterial::setClearcoatRoughnessChannel(QQuick3DMaterial::TextureChannelMapping newClearcoatRoughnessChannel)
1670 if (m_clearcoatRoughnessChannel == newClearcoatRoughnessChannel)
1672 m_clearcoatRoughnessChannel = newClearcoatRoughnessChannel;
1673 emit clearcoatRoughnessChannelChanged();
1674 markDirty(ClearcoatDirty);
1677QQuick3DTexture *QQuick3DSpecularGlossyMaterial::clearcoatRoughnessMap()
const
1679 return m_clearcoatRoughnessMap;
1682void QQuick3DSpecularGlossyMaterial::setClearcoatRoughnessMap(QQuick3DTexture *newClearcoatRoughnessMap)
1684 if (m_clearcoatRoughnessMap == newClearcoatRoughnessMap)
1687 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setClearcoatRoughnessMap, newClearcoatRoughnessMap, m_clearcoatRoughnessMap);
1689 m_clearcoatRoughnessMap = newClearcoatRoughnessMap;
1690 emit clearcoatRoughnessMapChanged();
1691 markDirty(ClearcoatDirty);
1694QQuick3DTexture *QQuick3DSpecularGlossyMaterial::clearcoatNormalMap()
const
1696 return m_clearcoatNormalMap;
1699void QQuick3DSpecularGlossyMaterial::setClearcoatNormalMap(QQuick3DTexture *newClearcoatNormalMap)
1701 if (m_clearcoatNormalMap == newClearcoatNormalMap)
1704 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setClearcoatNormalMap, newClearcoatNormalMap, m_clearcoatNormalMap);
1706 m_clearcoatNormalMap = newClearcoatNormalMap;
1707 emit clearcoatNormalMapChanged();
1708 markDirty(ClearcoatDirty);
1711float QQuick3DSpecularGlossyMaterial::clearcoatNormalStrength()
const
1713 return m_clearcoatNormalStrength;
1717void QQuick3DSpecularGlossyMaterial::setClearcoatNormalStrength(
float newClearcoatNormalStrength)
1719 if (qFuzzyCompare(m_clearcoatNormalStrength, newClearcoatNormalStrength))
1721 m_clearcoatNormalStrength = newClearcoatNormalStrength;
1722 emit clearcoatNormalStrengthChanged();
1723 markDirty(ClearcoatDirty);
1726float QQuick3DSpecularGlossyMaterial::transmissionFactor()
const
1728 return m_transmissionFactor;
1731void QQuick3DSpecularGlossyMaterial::setTransmissionFactor(
float newTransmissionFactor)
1733 if (qFuzzyCompare(m_transmissionFactor, newTransmissionFactor))
1735 m_transmissionFactor = newTransmissionFactor;
1736 emit transmissionFactorChanged();
1737 markDirty(TransmissionDirty);
1740QQuick3DTexture *QQuick3DSpecularGlossyMaterial::transmissionMap()
const
1742 return m_transmissionMap;
1745void QQuick3DSpecularGlossyMaterial::setTransmissionMap(QQuick3DTexture *newTransmissionMap)
1747 if (m_transmissionMap == newTransmissionMap)
1750 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setTransmissionMap, newTransmissionMap, m_transmissionMap);
1752 m_transmissionMap = newTransmissionMap;
1753 emit transmissionMapChanged();
1754 markDirty(TransmissionDirty);
1757QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::transmissionChannel()
const
1759 return m_transmissionChannel;
1762void QQuick3DSpecularGlossyMaterial::setTransmissionChannel(QQuick3DMaterial::TextureChannelMapping newTransmissionChannel)
1764 if (m_transmissionChannel == newTransmissionChannel)
1766 m_transmissionChannel = newTransmissionChannel;
1767 emit transmissionChannelChanged();
1768 markDirty(TransmissionDirty);
1771float QQuick3DSpecularGlossyMaterial::thicknessFactor()
const
1773 return m_thicknessFactor;
1776void QQuick3DSpecularGlossyMaterial::setThicknessFactor(
float newThicknessFactor)
1778 if (qFuzzyCompare(m_thicknessFactor, newThicknessFactor))
1780 m_thicknessFactor = newThicknessFactor;
1781 emit thicknessFactorChanged();
1782 markDirty(VolumeDirty);
1785QQuick3DTexture *QQuick3DSpecularGlossyMaterial::thicknessMap()
const
1787 return m_thicknessMap;
1790void QQuick3DSpecularGlossyMaterial::setThicknessMap(QQuick3DTexture *newThicknessMap)
1792 if (m_thicknessMap == newThicknessMap)
1795 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setThicknessMap, newThicknessMap, m_thicknessMap);
1797 m_thicknessMap = newThicknessMap;
1798 emit thicknessMapChanged();
1799 markDirty(VolumeDirty);
1802QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::thicknessChannel()
const
1804 return m_thicknessChannel;
1807void QQuick3DSpecularGlossyMaterial::setThicknessChannel(QQuick3DMaterial::TextureChannelMapping newThicknessChannel)
1809 if (m_thicknessChannel == newThicknessChannel)
1811 m_thicknessChannel = newThicknessChannel;
1812 emit thicknessChannelChanged();
1813 markDirty(VolumeDirty);
1816float QQuick3DSpecularGlossyMaterial::attenuationDistance()
const
1818 return m_attenuationDistance;
1821void QQuick3DSpecularGlossyMaterial::setAttenuationDistance(
float newAttenuationDistance)
1823 if (qFuzzyCompare(m_attenuationDistance, newAttenuationDistance))
1825 m_attenuationDistance = newAttenuationDistance;
1826 emit attenuationDistanceChanged();
1827 markDirty(VolumeDirty);
1830QColor QQuick3DSpecularGlossyMaterial::attenuationColor()
const
1832 return m_attenuationColor;
1835bool QQuick3DSpecularGlossyMaterial::fresnelScaleBiasEnabled()
const
1837 return m_fresnelScaleBiasEnabled;
1840float QQuick3DSpecularGlossyMaterial::fresnelScale()
const
1842 return m_fresnelScale;
1845float QQuick3DSpecularGlossyMaterial::fresnelBias()
const
1847 return m_fresnelBias;
1850float QQuick3DSpecularGlossyMaterial::fresnelPower()
const
1852 return m_fresnelPower;
1855bool QQuick3DSpecularGlossyMaterial::clearcoatFresnelScaleBiasEnabled()
const
1857 return m_clearcoatFresnelScaleBiasEnabled;
1860float QQuick3DSpecularGlossyMaterial::clearcoatFresnelScale()
const
1862 return m_clearcoatFresnelScale;
1865float QQuick3DSpecularGlossyMaterial::clearcoatFresnelBias()
const
1867 return m_clearcoatFresnelBias;
1870float QQuick3DSpecularGlossyMaterial::clearcoatFresnelPower()
const
1872 return m_clearcoatFresnelPower;
1875bool QQuick3DSpecularGlossyMaterial::vertexColorsEnabled()
const
1877 return m_vertexColorsEnabled;
1880void QQuick3DSpecularGlossyMaterial::setAttenuationColor(
const QColor &newAttenuationColor)
1882 if (m_attenuationColor == newAttenuationColor)
1884 m_attenuationColor = newAttenuationColor;
1885 emit attenuationColorChanged();
1886 markDirty(VolumeDirty);
1889void QQuick3DSpecularGlossyMaterial::setFresnelScaleBiasEnabled(
bool fresnelScaleBiasEnabled)
1891 if (m_fresnelScaleBiasEnabled == fresnelScaleBiasEnabled)
1894 m_fresnelScaleBiasEnabled = fresnelScaleBiasEnabled;
1895 emit fresnelScaleBiasEnabledChanged(m_fresnelScaleBiasEnabled);
1896 markDirty(SpecularDirty);
1899void QQuick3DSpecularGlossyMaterial::setFresnelScale(
float fresnelScale)
1901 if (qFuzzyCompare(m_fresnelScale, fresnelScale))
1904 m_fresnelScale = fresnelScale;
1905 emit fresnelScaleChanged(m_fresnelScale);
1906 markDirty(SpecularDirty);
1909void QQuick3DSpecularGlossyMaterial::setFresnelBias(
float fresnelBias)
1911 if (qFuzzyCompare(m_fresnelBias, fresnelBias))
1914 m_fresnelBias = fresnelBias;
1915 emit fresnelBiasChanged(m_fresnelBias);
1916 markDirty(SpecularDirty);
1919void QQuick3DSpecularGlossyMaterial::setFresnelPower(
float fresnelPower)
1921 if (qFuzzyCompare(m_fresnelPower, fresnelPower))
1924 m_fresnelPower = fresnelPower;
1925 emit fresnelPowerChanged(m_fresnelPower);
1926 markDirty(SpecularDirty);
1929void QQuick3DSpecularGlossyMaterial::setClearcoatFresnelScaleBiasEnabled(
bool clearcoatFresnelScaleBiasEnabled)
1931 if (m_clearcoatFresnelScaleBiasEnabled == clearcoatFresnelScaleBiasEnabled)
1934 m_clearcoatFresnelScaleBiasEnabled = clearcoatFresnelScaleBiasEnabled;
1935 emit clearcoatFresnelScaleBiasEnabledChanged(m_clearcoatFresnelScaleBiasEnabled);
1936 markDirty(ClearcoatDirty);
1939void QQuick3DSpecularGlossyMaterial::setClearcoatFresnelScale(
float clearcoatFresnelScale)
1941 if (qFuzzyCompare(m_clearcoatFresnelScale, clearcoatFresnelScale))
1944 m_clearcoatFresnelScale = clearcoatFresnelScale;
1945 emit clearcoatFresnelScaleChanged(m_clearcoatFresnelScale);
1946 markDirty(ClearcoatDirty);
1949void QQuick3DSpecularGlossyMaterial::setClearcoatFresnelBias(
float clearcoatFresnelBias)
1951 if (qFuzzyCompare(m_clearcoatFresnelBias, clearcoatFresnelBias))
1954 m_clearcoatFresnelBias = clearcoatFresnelBias;
1955 emit clearcoatFresnelBiasChanged(m_clearcoatFresnelBias);
1956 markDirty(ClearcoatDirty);
1959void QQuick3DSpecularGlossyMaterial::setClearcoatFresnelPower(
float clearcoatFresnelPower)
1961 if (qFuzzyCompare(m_clearcoatFresnelPower, clearcoatFresnelPower))
1964 m_clearcoatFresnelPower = clearcoatFresnelPower;
1965 emit clearcoatFresnelPowerChanged(m_clearcoatFresnelPower);
1966 markDirty(ClearcoatDirty);
1969void QQuick3DSpecularGlossyMaterial::setVertexColorsEnabled(
bool vertexColors)
1971 if (m_vertexColorsEnabled == vertexColors)
1974 m_vertexColorsEnabled = vertexColors;
1975 emit vertexColorsEnabledChanged(m_vertexColorsEnabled);
1976 markDirty(VertexColorsDirty);
1979bool QQuick3DSpecularGlossyMaterial::vertexColorsMaskEnabled()
const
1981 return m_vertexColorsMaskEnabled;
1984void QQuick3DSpecularGlossyMaterial::setVertexColorsMaskEnabled(
bool vertexColorsMaskEnabled)
1986 if (m_vertexColorsMaskEnabled == vertexColorsMaskEnabled)
1988 m_vertexColorsMaskEnabled = vertexColorsMaskEnabled;
1989 emit vertexColorsMaskEnabledChanged();
1990 markDirty(VertexColorsDirty);
1993QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags QQuick3DSpecularGlossyMaterial::vertexColorRedMask()
const
1995 return m_vertexColorRedMask;
1998void QQuick3DSpecularGlossyMaterial::setVertexColorRedMask(QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags vertexColorRedMask)
2000 if (m_vertexColorRedMask == vertexColorRedMask)
2002 m_vertexColorRedMask = vertexColorRedMask;
2003 emit vertexColorRedMaskChanged();
2004 markDirty(VertexColorsDirty);
2007QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags QQuick3DSpecularGlossyMaterial::vertexColorGreenMask()
const
2009 return m_vertexColorGreenMask;
2012void QQuick3DSpecularGlossyMaterial::setVertexColorGreenMask(QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags vertexColorGreenMask)
2014 if (m_vertexColorGreenMask == vertexColorGreenMask)
2016 m_vertexColorGreenMask = vertexColorGreenMask;
2017 emit vertexColorGreenMaskChanged();
2018 markDirty(VertexColorsDirty);
2021QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags QQuick3DSpecularGlossyMaterial::vertexColorBlueMask()
const
2023 return m_vertexColorBlueMask;
2026void QQuick3DSpecularGlossyMaterial::setVertexColorBlueMask(QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags vertexColorBlueMask)
2028 if (m_vertexColorBlueMask == vertexColorBlueMask)
2030 m_vertexColorBlueMask = vertexColorBlueMask;
2031 emit vertexColorBlueMaskChanged();
2032 markDirty(VertexColorsDirty);
2035QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags QQuick3DSpecularGlossyMaterial::vertexColorAlphaMask()
const
2037 return m_vertexColorAlphaMask;
2040void QQuick3DSpecularGlossyMaterial::setVertexColorAlphaMask(QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags vertexColorAlphaMask)
2042 if (m_vertexColorAlphaMask == vertexColorAlphaMask)
2044 m_vertexColorAlphaMask = vertexColorAlphaMask;
2045 emit vertexColorAlphaMaskChanged();
2046 markDirty(VertexColorsDirty);
Combined button and popup list for selecting options.