7#include <QtQuick3DRuntimeRender/private/qssgrenderdefaultmaterial_p.h>
8#include <QtQuick3DUtils/private/qssgutils_p.h>
9#include <QtQuick3D/private/qquick3dviewport_p.h>
14
15
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
81
82
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
112
113
114
115
116
117
118
119
122
123
124
125
126
127
130
131
132
133
134
135
136
139
140
141
142
143
144
145
146
147
148
149
150
153
154
155
156
157
158
159
162
163
164
165
166
169
170
171
172
173
174
175
178
179
180
181
182
183
184
185
186
187
188
189
192
193
194
195
196
197
198
201
202
203
204
205
208
209
210
211
212
213
214
215
216
217
218
221
222
223
224
225
226
227
230
231
232
233
234
235
236
237
238
239
240
241
244
245
246
247
248
251
252
253
254
255
256
257
258
259
260
263
264
265
266
267
270
271
272
273
274
277
278
279
280
281
282
285
286
287
288
289
290
291
292
293
294
297
298
299
300
301
302
303
304
307
308
309
310
313
314
315
316
317
320
321
322
323
324
325
326
327
330
331
332
333
334
335
336
337
338
339
342
343
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
393
394
395
396
397
398
399
400
401
402
403
404
407
408
409
410
411
412
413
414
415
416
417
420
421
422
423
424
425
426
427
428
429
430
431
432
435
436
437
438
439
440
441
442
445
446
447
448
449
450
451
452
453
454
455
458
459
460
461
462
463
464
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
501
502
503
504
505
506
509
510
511
512
513
514
515
518
519
520
521
522
523
524
525
526
527
528
531
532
533
534
535
538
539
540
541
542
543
544
547
548
549
550
551
552
553
554
555
556
557
558
561
562
563
564
565
566
569
570
571
572
573
574
577
578
579
580
581
582
583
584
587
588
589
590
591
592
593
594
595
596
597
598
601
602
603
604
605
606
607
608
609
612
613
614
615
616
617
618
621
622
623
624
625
626
627
628
629
630
631
632
635
636
637
638
639
640
641
644
645
646
647
648
649
650
653
654
655
656
657
660
661
662
663
664
665
666
669
670
671
672
673
674
675
678
679
680
681
682
683
686
687
688
689
690
693
694
695
696
697
698
699
702
703
704
705
706
707
708
711
712
713
714
715
716
719
720
721
722
723
724
725
728
729
730
731
732
733
734
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
817QQuick3DSpecularGlossyMaterial::QQuick3DSpecularGlossyMaterial(QQuick3DObject *parent)
818 : QQuick3DMaterial(*(
new QQuick3DObjectPrivate(QQuick3DObjectPrivate::Type::SpecularGlossyMaterial)), parent)
821QQuick3DSpecularGlossyMaterial::~QQuick3DSpecularGlossyMaterial()
825QQuick3DSpecularGlossyMaterial::Lighting QQuick3DSpecularGlossyMaterial::lighting()
const
830QQuick3DSpecularGlossyMaterial::BlendMode QQuick3DSpecularGlossyMaterial::blendMode()
const
835QColor QQuick3DSpecularGlossyMaterial::albedoColor()
const
840QQuick3DTexture *QQuick3DSpecularGlossyMaterial::albedoMap()
const
845bool QQuick3DSpecularGlossyMaterial::albedoSingleChannelEnabled()
const
847 return m_albedoSingleChannelEnabled;
850QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::albedoChannel()
const
852 return m_albedoChannel;
855bool QQuick3DSpecularGlossyMaterial::specularSingleChannelEnabled()
const
857 return m_specularSingleChannelEnabled;
860QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::specularChannel()
const
862 return m_specularChannel;
865bool QQuick3DSpecularGlossyMaterial::emissiveSingleChannelEnabled()
const
867 return m_emissiveSingleChannelEnabled;
870QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::emissiveChannel()
const
872 return m_emissiveChannel;
875QQuick3DTexture *QQuick3DSpecularGlossyMaterial::emissiveMap()
const
877 return m_emissiveMap;
880QVector3D QQuick3DSpecularGlossyMaterial::emissiveFactor()
const
882 return m_emissiveFactor;
885float QQuick3DSpecularGlossyMaterial::glossiness()
const
890QQuick3DTexture *QQuick3DSpecularGlossyMaterial::glossinessMap()
const
892 return m_glossinessMap;
895bool QQuick3DSpecularGlossyMaterial::invertOpacityMapValue()
const
897 return m_invertOpacityMapValue;
900float QQuick3DSpecularGlossyMaterial::opacity()
const
905QQuick3DTexture *QQuick3DSpecularGlossyMaterial::opacityMap()
const
910QQuick3DTexture *QQuick3DSpecularGlossyMaterial::normalMap()
const
915QColor QQuick3DSpecularGlossyMaterial::specularColor()
const
920QQuick3DTexture *QQuick3DSpecularGlossyMaterial::specularMap()
const
922 return m_specularMap;
925float QQuick3DSpecularGlossyMaterial::normalStrength()
const
927 return m_normalStrength;
930QQuick3DTexture *QQuick3DSpecularGlossyMaterial::occlusionMap()
const
932 return m_occlusionMap;
935float QQuick3DSpecularGlossyMaterial::occlusionAmount()
const
937 return m_occlusionAmount;
940QQuick3DSpecularGlossyMaterial::AlphaMode QQuick3DSpecularGlossyMaterial::alphaMode()
const
945float QQuick3DSpecularGlossyMaterial::alphaCutoff()
const
947 return m_alphaCutoff;
950QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::glossinessChannel()
const
952 return m_glossinessChannel;
955QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::opacityChannel()
const
957 return m_opacityChannel;
960QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::occlusionChannel()
const
962 return m_occlusionChannel;
965float QQuick3DSpecularGlossyMaterial::pointSize()
const
970float QQuick3DSpecularGlossyMaterial::lineWidth()
const
975QQuick3DTexture *QQuick3DSpecularGlossyMaterial::heightMap()
const
980QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::heightChannel()
const
982 return m_heightChannel;
985float QQuick3DSpecularGlossyMaterial::heightAmount()
const
987 return m_heightAmount;
990int QQuick3DSpecularGlossyMaterial::minHeightMapSamples()
const
992 return m_minHeightMapSamples;
995int QQuick3DSpecularGlossyMaterial::maxHeightMapSamples()
const
997 return m_maxHeightMapSamples;
1000void QQuick3DSpecularGlossyMaterial::markAllDirty()
1002 m_dirtyAttributes = 0xffffffff;
1003 QQuick3DMaterial::markAllDirty();
1006void QQuick3DSpecularGlossyMaterial::setLighting(QQuick3DSpecularGlossyMaterial::Lighting lighting)
1008 if (m_lighting == lighting)
1011 m_lighting = lighting;
1012 emit lightingChanged();
1013 markDirty(LightingModeDirty);
1016void QQuick3DSpecularGlossyMaterial::setBlendMode(QQuick3DSpecularGlossyMaterial::BlendMode blendMode)
1018 if (m_blendMode == blendMode)
1021 m_blendMode = blendMode;
1022 emit blendModeChanged();
1023 markDirty(BlendModeDirty);
1026void QQuick3DSpecularGlossyMaterial::setAlbedoColor(
const QColor &diffuseColor)
1028 if (m_albedo == diffuseColor)
1031 m_albedo = diffuseColor;
1032 emit albedoColorChanged();
1033 markDirty(AlbedoDirty);
1036void QQuick3DSpecularGlossyMaterial::setAlbedoMap(QQuick3DTexture *albedoMap)
1038 if (m_albedoMap == albedoMap)
1041 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setAlbedoMap, albedoMap, m_albedoMap);
1043 m_albedoMap = albedoMap;
1044 emit albedoMapChanged();
1045 markDirty(AlbedoDirty);
1048void QQuick3DSpecularGlossyMaterial::setAlbedoSingleChannelEnabled(
bool albedoSingleChannelEnabled)
1050 if (m_albedoSingleChannelEnabled == albedoSingleChannelEnabled)
1053 m_albedoSingleChannelEnabled = albedoSingleChannelEnabled;
1054 emit albedoSingleChannelEnabledChanged();
1055 markDirty(AlbedoDirty);
1058void QQuick3DSpecularGlossyMaterial::setAlbedoChannel(TextureChannelMapping channel)
1060 if (m_albedoChannel == channel)
1063 m_albedoChannel = channel;
1064 emit albedoChannelChanged();
1065 markDirty(AlbedoDirty);
1068void QQuick3DSpecularGlossyMaterial::setSpecularSingleChannelEnabled(
bool specularSingleChannelEnabled)
1070 if (m_specularSingleChannelEnabled == specularSingleChannelEnabled)
1073 m_specularSingleChannelEnabled = specularSingleChannelEnabled;
1074 emit specularSingleChannelEnabledChanged();
1075 markDirty(SpecularDirty);
1078void QQuick3DSpecularGlossyMaterial::setSpecularChannel(TextureChannelMapping channel)
1080 if (m_specularChannel == channel)
1083 m_specularChannel = channel;
1084 emit specularChannelChanged();
1085 markDirty(SpecularDirty);
1088void QQuick3DSpecularGlossyMaterial::setEmissiveSingleChannelEnabled(
bool emissiveSingleChannelEnabled)
1090 if (m_emissiveSingleChannelEnabled == emissiveSingleChannelEnabled)
1093 m_emissiveSingleChannelEnabled = emissiveSingleChannelEnabled;
1094 emit emissiveSingleChannelEnabledChanged();
1095 markDirty(EmissiveDirty);
1098void QQuick3DSpecularGlossyMaterial::setEmissiveChannel(TextureChannelMapping channel)
1100 if (m_emissiveChannel == channel)
1103 m_emissiveChannel = channel;
1104 emit emissiveChannelChanged();
1105 markDirty(EmissiveDirty);
1108void QQuick3DSpecularGlossyMaterial::setEmissiveMap(QQuick3DTexture *emissiveMap)
1110 if (m_emissiveMap == emissiveMap)
1113 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setEmissiveMap, emissiveMap, m_emissiveMap);
1115 m_emissiveMap = emissiveMap;
1116 emit emissiveMapChanged();
1117 markDirty(EmissiveDirty);
1120void QQuick3DSpecularGlossyMaterial::setEmissiveFactor(
const QVector3D &emissiveFactor)
1122 if (m_emissiveFactor == emissiveFactor)
1125 m_emissiveFactor = emissiveFactor;
1126 emit emissiveFactorChanged();
1127 markDirty(EmissiveDirty);
1130void QQuick3DSpecularGlossyMaterial::setGlossiness(
float glossiness)
1132 glossiness = ensureNormalized(glossiness);
1133 if (qFuzzyCompare(m_glossiness, glossiness))
1136 m_glossiness = glossiness;
1137 emit glossinessChanged();
1138 markDirty(GlossyDirty);
1141void QQuick3DSpecularGlossyMaterial::setGlossinessMap(QQuick3DTexture *glossinessMap)
1143 if (m_glossinessMap == glossinessMap)
1146 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setGlossinessMap, glossinessMap, m_glossinessMap);
1148 m_glossinessMap = glossinessMap;
1149 emit glossinessMapChanged();
1150 markDirty(GlossyDirty);
1153void QQuick3DSpecularGlossyMaterial::setInvertOpacityMapValue(
bool invertOpacityMapValue)
1155 if (invertOpacityMapValue == m_invertOpacityMapValue)
1158 m_invertOpacityMapValue = invertOpacityMapValue;
1159 emit invertOpacityMapValueChanged();
1160 markDirty(OpacityDirty);
1163void QQuick3DSpecularGlossyMaterial::setOpacity(
float opacity)
1165 opacity = ensureNormalized(opacity);
1166 if (qFuzzyCompare(m_opacity, opacity))
1169 m_opacity = opacity;
1170 emit opacityChanged();
1171 markDirty(OpacityDirty);
1174void QQuick3DSpecularGlossyMaterial::setOpacityMap(QQuick3DTexture *opacityMap)
1176 if (m_opacityMap == opacityMap)
1179 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setOpacityMap, opacityMap, m_opacityMap);
1181 m_opacityMap = opacityMap;
1182 emit opacityMapChanged();
1183 markDirty(OpacityDirty);
1186void QQuick3DSpecularGlossyMaterial::setNormalMap(QQuick3DTexture *normalMap)
1188 if (m_normalMap == normalMap)
1191 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setNormalMap, normalMap, m_normalMap);
1193 m_normalMap = normalMap;
1194 emit normalMapChanged();
1195 markDirty(NormalDirty);
1198void QQuick3DSpecularGlossyMaterial::setSpecularColor(
const QColor &specular)
1200 if (m_specular == specular)
1203 m_specular = specular;
1204 emit specularColorChanged();
1205 markDirty(SpecularDirty);
1208void QQuick3DSpecularGlossyMaterial::setSpecularMap(QQuick3DTexture *specularMap)
1210 if (m_specularMap == specularMap)
1213 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setSpecularMap, specularMap, m_specularMap);
1215 m_specularMap = specularMap;
1216 emit specularMapChanged();
1217 markDirty(SpecularDirty);
1220void QQuick3DSpecularGlossyMaterial::setNormalStrength(
float factor)
1222 factor = ensureNormalized(factor);
1223 if (qFuzzyCompare(m_normalStrength, factor))
1226 m_normalStrength = factor;
1227 emit normalStrengthChanged();
1228 markDirty(NormalDirty);
1231void QQuick3DSpecularGlossyMaterial::setOcclusionMap(QQuick3DTexture *occlusionMap)
1233 if (m_occlusionMap == occlusionMap)
1236 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setOcclusionMap, occlusionMap, m_occlusionMap);
1238 m_occlusionMap = occlusionMap;
1239 emit occlusionMapChanged();
1240 markDirty(OcclusionDirty);
1243void QQuick3DSpecularGlossyMaterial::setOcclusionAmount(
float occlusionAmount)
1245 if (qFuzzyCompare(m_occlusionAmount, occlusionAmount))
1248 m_occlusionAmount = occlusionAmount;
1249 emit occlusionAmountChanged();
1250 markDirty(OcclusionDirty);
1253void QQuick3DSpecularGlossyMaterial::setAlphaMode(QQuick3DSpecularGlossyMaterial::AlphaMode alphaMode)
1255 if (m_alphaMode == alphaMode)
1258 m_alphaMode = alphaMode;
1259 emit alphaModeChanged();
1260 markDirty(AlphaModeDirty);
1263void QQuick3DSpecularGlossyMaterial::setAlphaCutoff(
float alphaCutoff)
1265 if (qFuzzyCompare(m_alphaCutoff, alphaCutoff))
1268 m_alphaCutoff = alphaCutoff;
1269 emit alphaCutoffChanged();
1270 markDirty(AlphaModeDirty);
1273void QQuick3DSpecularGlossyMaterial::setGlossinessChannel(TextureChannelMapping channel)
1275 if (m_glossinessChannel == channel)
1278 m_glossinessChannel = channel;
1279 emit glossinessChannelChanged();
1280 markDirty(GlossyDirty);
1283void QQuick3DSpecularGlossyMaterial::setOpacityChannel(TextureChannelMapping channel)
1285 if (m_opacityChannel == channel)
1288 m_opacityChannel = channel;
1289 emit opacityChannelChanged();
1290 markDirty(OpacityDirty);
1293void QQuick3DSpecularGlossyMaterial::setOcclusionChannel(TextureChannelMapping channel)
1295 if (m_occlusionChannel == channel)
1298 m_occlusionChannel = channel;
1299 emit occlusionChannelChanged();
1300 markDirty(OcclusionDirty);
1303void QQuick3DSpecularGlossyMaterial::setPointSize(
float size)
1305 if (qFuzzyCompare(m_pointSize, size))
1308 emit pointSizeChanged();
1309 markDirty(PointSizeDirty);
1312void QQuick3DSpecularGlossyMaterial::setLineWidth(
float width)
1314 if (qFuzzyCompare(m_lineWidth, width))
1316 m_lineWidth = width;
1317 emit lineWidthChanged();
1318 markDirty(LineWidthDirty);
1321void QQuick3DSpecularGlossyMaterial::setHeightMap(QQuick3DTexture *heightMap)
1323 if (m_heightMap == heightMap)
1326 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setHeightMap, heightMap, m_heightMap);
1328 m_heightMap = heightMap;
1329 emit heightMapChanged();
1330 markDirty(HeightDirty);
1333void QQuick3DSpecularGlossyMaterial::setHeightChannel(QQuick3DMaterial::TextureChannelMapping channel)
1335 if (m_heightChannel == channel)
1338 m_heightChannel = channel;
1339 emit heightChannelChanged();
1340 markDirty(HeightDirty);
1343void QQuick3DSpecularGlossyMaterial::setHeightAmount(
float heightAmount)
1345 if (qFuzzyCompare(m_heightAmount, heightAmount))
1348 m_heightAmount = heightAmount;
1349 emit heightAmountChanged();
1350 markDirty(HeightDirty);
1353void QQuick3DSpecularGlossyMaterial::setMinHeightMapSamples(
int samples)
1355 if (m_minHeightMapSamples == samples)
1358 m_minHeightMapSamples = samples;
1359 emit minHeightMapSamplesChanged();
1360 markDirty(HeightDirty);
1363void QQuick3DSpecularGlossyMaterial::setMaxHeightMapSamples(
int samples)
1365 if (m_maxHeightMapSamples == samples)
1368 m_maxHeightMapSamples = samples;
1369 emit maxHeightMapSamplesChanged();
1370 markDirty(HeightDirty);
1373QSSGRenderGraphObject *QQuick3DSpecularGlossyMaterial::updateSpatialNode(QSSGRenderGraphObject *node)
1375 static const auto channelMapping = [](TextureChannelMapping mapping) {
1376 return QSSGRenderDefaultMaterial::TextureChannelMapping(mapping);
1381 node =
new QSSGRenderDefaultMaterial(QSSGRenderGraphObject::Type::SpecularGlossyMaterial);
1385 QQuick3DMaterial::updateSpatialNode(node);
1387 QSSGRenderDefaultMaterial *material =
static_cast<QSSGRenderDefaultMaterial *>(node);
1389 material->specularModel = QSSGRenderDefaultMaterial::MaterialSpecularModel::SchlickGGX;
1391 if (m_dirtyAttributes & LightingModeDirty)
1392 material->lighting = QSSGRenderDefaultMaterial::MaterialLighting(m_lighting);
1394 if (m_dirtyAttributes & BlendModeDirty)
1395 material->blendMode = QSSGRenderDefaultMaterial::MaterialBlendMode(m_blendMode);
1397 if (m_dirtyAttributes & AlbedoDirty) {
1399 material->colorMap =
nullptr;
1401 material->colorMap = m_albedoMap->getRenderImage();
1403 material->color = QSSGUtils::color::sRGBToLinear(m_albedo);
1404 material->baseColorSingleChannelEnabled = m_albedoSingleChannelEnabled;
1405 material->baseColorChannel = channelMapping(m_albedoChannel);
1408 if (m_dirtyAttributes & EmissiveDirty) {
1410 material->emissiveMap =
nullptr;
1412 material->emissiveMap = m_emissiveMap->getRenderImage();
1414 material->emissiveColor = m_emissiveFactor;
1415 material->emissiveSingleChannelEnabled = m_emissiveSingleChannelEnabled;
1416 material->emissiveChannel = channelMapping(m_emissiveChannel);
1419 if (m_dirtyAttributes & GlossyDirty) {
1420 if (!m_glossinessMap)
1421 material->roughnessMap =
nullptr;
1423 material->roughnessMap = m_glossinessMap->getRenderImage();
1425 material->specularRoughness = m_glossiness;
1426 material->roughnessChannel = channelMapping(m_glossinessChannel);
1429 if (m_dirtyAttributes & SpecularDirty) {
1431 material->specularMap =
nullptr;
1433 material->specularMap = m_specularMap->getRenderImage();
1435 material->specularTint = QSSGUtils::color::sRGBToLinear(m_specular).toVector3D();
1436 material->fresnelScaleBiasEnabled = m_fresnelScaleBiasEnabled;
1437 material->fresnelScale = m_fresnelScale;
1438 material->fresnelBias = m_fresnelBias;
1439 material->fresnelPower = m_fresnelPower;
1440 material->specularAmountSingleChannelEnabled = m_specularSingleChannelEnabled;
1441 material->specularAmountChannel = channelMapping(m_specularChannel);
1444 if (m_dirtyAttributes & OpacityDirty) {
1446 material->opacityMap =
nullptr;
1448 material->opacityMap = m_opacityMap->getRenderImage();
1450 material->invertOpacityMapValue = m_invertOpacityMapValue;
1451 material->opacity = m_opacity;
1452 material->opacityChannel = channelMapping(m_opacityChannel);
1455 if (m_dirtyAttributes & NormalDirty) {
1457 material->normalMap =
nullptr;
1459 material->normalMap = m_normalMap->getRenderImage();
1461 material->bumpAmount = m_normalStrength;
1464 if (m_dirtyAttributes & OcclusionDirty) {
1465 if (!m_occlusionMap)
1466 material->occlusionMap =
nullptr;
1468 material->occlusionMap = m_occlusionMap->getRenderImage();
1469 material->occlusionAmount = m_occlusionAmount;
1470 material->occlusionChannel = channelMapping(m_occlusionChannel);
1473 if (m_dirtyAttributes & AlphaModeDirty) {
1474 material->alphaMode = QSSGRenderDefaultMaterial::MaterialAlphaMode(m_alphaMode);
1475 material->alphaCutoff = m_alphaCutoff;
1478 if (m_dirtyAttributes & PointSizeDirty)
1479 material->pointSize = m_pointSize;
1481 if (m_dirtyAttributes & LineWidthDirty)
1482 material->lineWidth = m_lineWidth;
1484 if (m_dirtyAttributes & HeightDirty) {
1486 material->heightMap =
nullptr;
1488 material->heightMap = m_heightMap->getRenderImage();
1489 material->heightAmount = m_heightAmount;
1490 material->minHeightSamples = m_minHeightMapSamples;
1491 material->maxHeightSamples = m_maxHeightMapSamples;
1492 material->heightChannel = channelMapping(m_heightChannel);
1495 if (m_dirtyAttributes & ClearcoatDirty) {
1496 material->clearcoatAmount = m_clearcoatAmount;
1497 if (!m_clearcoatMap)
1498 material->clearcoatMap =
nullptr;
1500 material->clearcoatMap = m_clearcoatMap->getRenderImage();
1501 material->clearcoatChannel = channelMapping(m_clearcoatChannel);
1502 material->clearcoatRoughnessAmount = m_clearcoatRoughnessAmount;
1503 if (!m_clearcoatRoughnessMap)
1504 material->clearcoatRoughnessMap =
nullptr;
1506 material->clearcoatRoughnessMap = m_clearcoatRoughnessMap->getRenderImage();
1507 material->clearcoatRoughnessChannel = channelMapping(m_clearcoatRoughnessChannel);
1508 if (!m_clearcoatNormalMap)
1509 material->clearcoatNormalMap =
nullptr;
1511 material->clearcoatNormalMap = m_clearcoatNormalMap->getRenderImage();
1512 material->clearcoatNormalStrength = m_clearcoatNormalStrength;
1513 material->clearcoatFresnelScaleBiasEnabled = m_clearcoatFresnelScaleBiasEnabled;
1514 material->clearcoatFresnelScale = m_clearcoatFresnelScale;
1515 material->clearcoatFresnelBias = m_clearcoatFresnelBias;
1516 material->clearcoatFresnelPower = m_clearcoatFresnelPower;
1519 if (m_dirtyAttributes & TransmissionDirty) {
1520 material->transmissionFactor = m_transmissionFactor;
1521 if (!m_transmissionMap)
1522 material->transmissionMap =
nullptr;
1524 material->transmissionMap = m_transmissionMap->getRenderImage();
1525 material->transmissionChannel = channelMapping(m_transmissionChannel);
1528 if (m_dirtyAttributes & VolumeDirty) {
1529 material->thicknessFactor = m_thicknessFactor;
1530 if (!m_thicknessMap)
1531 material->thicknessMap =
nullptr;
1533 material->thicknessMap = m_thicknessMap->getRenderImage();
1534 material->thicknessChannel = channelMapping(m_thicknessChannel);
1536 material->attenuationDistance = m_attenuationDistance;
1537 material->attenuationColor = QSSGUtils::color::sRGBToLinear(m_attenuationColor).toVector3D();
1540 if (m_dirtyAttributes & VertexColorsDirty) {
1541 material->vertexColorsEnabled = m_vertexColorsEnabled;
1542 material->vertexColorsMaskEnabled = m_vertexColorsMaskEnabled;
1543 material->vertexColorRedMask = QSSGRenderDefaultMaterial::VertexColorMaskFlags::fromInt(m_vertexColorRedMask);
1544 material->vertexColorGreenMask = QSSGRenderDefaultMaterial::VertexColorMaskFlags::fromInt(m_vertexColorGreenMask);
1545 material->vertexColorBlueMask = QSSGRenderDefaultMaterial::VertexColorMaskFlags::fromInt(m_vertexColorBlueMask);
1546 material->vertexColorAlphaMask = QSSGRenderDefaultMaterial::VertexColorMaskFlags::fromInt(m_vertexColorAlphaMask);
1549 m_dirtyAttributes = 0;
1554void QQuick3DSpecularGlossyMaterial::itemChange(QQuick3DObject::ItemChange change,
const QQuick3DObject::ItemChangeData &value)
1556 if (change == QQuick3DObject::ItemSceneChange)
1557 updateSceneManager(value.sceneManager);
1560void QQuick3DSpecularGlossyMaterial::updateSceneManager(QQuick3DSceneManager *sceneManager)
1564 QQuick3DObjectPrivate::refSceneManager(m_albedoMap, *sceneManager);
1565 QQuick3DObjectPrivate::refSceneManager(m_emissiveMap, *sceneManager);
1566 QQuick3DObjectPrivate::refSceneManager(m_glossinessMap, *sceneManager);
1567 QQuick3DObjectPrivate::refSceneManager(m_opacityMap, *sceneManager);
1568 QQuick3DObjectPrivate::refSceneManager(m_normalMap, *sceneManager);
1569 QQuick3DObjectPrivate::refSceneManager(m_specularMap, *sceneManager);
1570 QQuick3DObjectPrivate::refSceneManager(m_occlusionMap, *sceneManager);
1571 QQuick3DObjectPrivate::refSceneManager(m_heightMap, *sceneManager);
1572 QQuick3DObjectPrivate::refSceneManager(m_clearcoatMap, *sceneManager);
1573 QQuick3DObjectPrivate::refSceneManager(m_clearcoatRoughnessMap, *sceneManager);
1574 QQuick3DObjectPrivate::refSceneManager(m_clearcoatNormalMap, *sceneManager);
1575 QQuick3DObjectPrivate::refSceneManager(m_transmissionMap, *sceneManager);
1576 QQuick3DObjectPrivate::refSceneManager(m_thicknessMap, *sceneManager);
1578 QQuick3DObjectPrivate::derefSceneManager(m_albedoMap);
1579 QQuick3DObjectPrivate::derefSceneManager(m_emissiveMap);
1580 QQuick3DObjectPrivate::derefSceneManager(m_glossinessMap);
1581 QQuick3DObjectPrivate::derefSceneManager(m_opacityMap);
1582 QQuick3DObjectPrivate::derefSceneManager(m_normalMap);
1583 QQuick3DObjectPrivate::derefSceneManager(m_specularMap);
1584 QQuick3DObjectPrivate::derefSceneManager(m_occlusionMap);
1585 QQuick3DObjectPrivate::derefSceneManager(m_heightMap);
1586 QQuick3DObjectPrivate::derefSceneManager(m_clearcoatMap);
1587 QQuick3DObjectPrivate::derefSceneManager(m_clearcoatRoughnessMap);
1588 QQuick3DObjectPrivate::derefSceneManager(m_clearcoatNormalMap);
1589 QQuick3DObjectPrivate::derefSceneManager(m_transmissionMap);
1590 QQuick3DObjectPrivate::derefSceneManager(m_thicknessMap);
1594void QQuick3DSpecularGlossyMaterial::markDirty(QQuick3DSpecularGlossyMaterial::DirtyType type)
1596 if (!(m_dirtyAttributes & quint32(type))) {
1597 m_dirtyAttributes |= quint32(type);
1602float QQuick3DSpecularGlossyMaterial::clearcoatAmount()
const
1604 return m_clearcoatAmount;
1607void QQuick3DSpecularGlossyMaterial::setClearcoatAmount(
float newClearcoatAmount)
1609 if (qFuzzyCompare(m_clearcoatAmount, newClearcoatAmount))
1611 m_clearcoatAmount = newClearcoatAmount;
1612 emit clearcoatAmountChanged();
1613 markDirty(ClearcoatDirty);
1616QQuick3DTexture *QQuick3DSpecularGlossyMaterial::clearcoatMap()
const
1618 return m_clearcoatMap;
1621void QQuick3DSpecularGlossyMaterial::setClearcoatMap(QQuick3DTexture *newClearcoatMap)
1623 if (m_clearcoatMap == newClearcoatMap)
1626 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setClearcoatMap, newClearcoatMap, m_clearcoatMap);
1628 m_clearcoatMap = newClearcoatMap;
1629 emit clearcoatMapChanged();
1630 markDirty(ClearcoatDirty);
1633QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::clearcoatChannel()
const
1635 return m_clearcoatChannel;
1638void QQuick3DSpecularGlossyMaterial::setClearcoatChannel(QQuick3DMaterial::TextureChannelMapping newClearcoatChannel)
1640 if (m_clearcoatChannel == newClearcoatChannel)
1642 m_clearcoatChannel = newClearcoatChannel;
1643 emit clearcoatChannelChanged();
1644 markDirty(ClearcoatDirty);
1647float QQuick3DSpecularGlossyMaterial::clearcoatRoughnessAmount()
const
1649 return m_clearcoatRoughnessAmount;
1652void QQuick3DSpecularGlossyMaterial::setClearcoatRoughnessAmount(
float newClearcoatRoughnessAmount)
1654 if (qFuzzyCompare(m_clearcoatRoughnessAmount, newClearcoatRoughnessAmount))
1656 m_clearcoatRoughnessAmount = newClearcoatRoughnessAmount;
1657 emit clearcoatRoughnessAmountChanged();
1658 markDirty(ClearcoatDirty);
1661QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::clearcoatRoughnessChannel()
const
1663 return m_clearcoatRoughnessChannel;
1666void QQuick3DSpecularGlossyMaterial::setClearcoatRoughnessChannel(QQuick3DMaterial::TextureChannelMapping newClearcoatRoughnessChannel)
1668 if (m_clearcoatRoughnessChannel == newClearcoatRoughnessChannel)
1670 m_clearcoatRoughnessChannel = newClearcoatRoughnessChannel;
1671 emit clearcoatRoughnessChannelChanged();
1672 markDirty(ClearcoatDirty);
1675QQuick3DTexture *QQuick3DSpecularGlossyMaterial::clearcoatRoughnessMap()
const
1677 return m_clearcoatRoughnessMap;
1680void QQuick3DSpecularGlossyMaterial::setClearcoatRoughnessMap(QQuick3DTexture *newClearcoatRoughnessMap)
1682 if (m_clearcoatRoughnessMap == newClearcoatRoughnessMap)
1685 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setClearcoatRoughnessMap, newClearcoatRoughnessMap, m_clearcoatRoughnessMap);
1687 m_clearcoatRoughnessMap = newClearcoatRoughnessMap;
1688 emit clearcoatRoughnessMapChanged();
1689 markDirty(ClearcoatDirty);
1692QQuick3DTexture *QQuick3DSpecularGlossyMaterial::clearcoatNormalMap()
const
1694 return m_clearcoatNormalMap;
1697void QQuick3DSpecularGlossyMaterial::setClearcoatNormalMap(QQuick3DTexture *newClearcoatNormalMap)
1699 if (m_clearcoatNormalMap == newClearcoatNormalMap)
1702 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setClearcoatNormalMap, newClearcoatNormalMap, m_clearcoatNormalMap);
1704 m_clearcoatNormalMap = newClearcoatNormalMap;
1705 emit clearcoatNormalMapChanged();
1706 markDirty(ClearcoatDirty);
1709float QQuick3DSpecularGlossyMaterial::clearcoatNormalStrength()
const
1711 return m_clearcoatNormalStrength;
1715void QQuick3DSpecularGlossyMaterial::setClearcoatNormalStrength(
float newClearcoatNormalStrength)
1717 if (qFuzzyCompare(m_clearcoatNormalStrength, newClearcoatNormalStrength))
1719 m_clearcoatNormalStrength = newClearcoatNormalStrength;
1720 emit clearcoatNormalStrengthChanged();
1721 markDirty(ClearcoatDirty);
1724float QQuick3DSpecularGlossyMaterial::transmissionFactor()
const
1726 return m_transmissionFactor;
1729void QQuick3DSpecularGlossyMaterial::setTransmissionFactor(
float newTransmissionFactor)
1731 if (qFuzzyCompare(m_transmissionFactor, newTransmissionFactor))
1733 m_transmissionFactor = newTransmissionFactor;
1734 emit transmissionFactorChanged();
1735 markDirty(TransmissionDirty);
1738QQuick3DTexture *QQuick3DSpecularGlossyMaterial::transmissionMap()
const
1740 return m_transmissionMap;
1743void QQuick3DSpecularGlossyMaterial::setTransmissionMap(QQuick3DTexture *newTransmissionMap)
1745 if (m_transmissionMap == newTransmissionMap)
1748 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setTransmissionMap, newTransmissionMap, m_transmissionMap);
1750 m_transmissionMap = newTransmissionMap;
1751 emit transmissionMapChanged();
1752 markDirty(TransmissionDirty);
1755QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::transmissionChannel()
const
1757 return m_transmissionChannel;
1760void QQuick3DSpecularGlossyMaterial::setTransmissionChannel(QQuick3DMaterial::TextureChannelMapping newTransmissionChannel)
1762 if (m_transmissionChannel == newTransmissionChannel)
1764 m_transmissionChannel = newTransmissionChannel;
1765 emit transmissionChannelChanged();
1766 markDirty(TransmissionDirty);
1769float QQuick3DSpecularGlossyMaterial::thicknessFactor()
const
1771 return m_thicknessFactor;
1774void QQuick3DSpecularGlossyMaterial::setThicknessFactor(
float newThicknessFactor)
1776 if (qFuzzyCompare(m_thicknessFactor, newThicknessFactor))
1778 m_thicknessFactor = newThicknessFactor;
1779 emit thicknessFactorChanged();
1780 markDirty(VolumeDirty);
1783QQuick3DTexture *QQuick3DSpecularGlossyMaterial::thicknessMap()
const
1785 return m_thicknessMap;
1788void QQuick3DSpecularGlossyMaterial::setThicknessMap(QQuick3DTexture *newThicknessMap)
1790 if (m_thicknessMap == newThicknessMap)
1793 QQuick3DObjectPrivate::attachWatcher(
this, &QQuick3DSpecularGlossyMaterial::setThicknessMap, newThicknessMap, m_thicknessMap);
1795 m_thicknessMap = newThicknessMap;
1796 emit thicknessMapChanged();
1797 markDirty(VolumeDirty);
1800QQuick3DMaterial::TextureChannelMapping QQuick3DSpecularGlossyMaterial::thicknessChannel()
const
1802 return m_thicknessChannel;
1805void QQuick3DSpecularGlossyMaterial::setThicknessChannel(QQuick3DMaterial::TextureChannelMapping newThicknessChannel)
1807 if (m_thicknessChannel == newThicknessChannel)
1809 m_thicknessChannel = newThicknessChannel;
1810 emit thicknessChannelChanged();
1811 markDirty(VolumeDirty);
1814float QQuick3DSpecularGlossyMaterial::attenuationDistance()
const
1816 return m_attenuationDistance;
1819void QQuick3DSpecularGlossyMaterial::setAttenuationDistance(
float newAttenuationDistance)
1821 if (qFuzzyCompare(m_attenuationDistance, newAttenuationDistance))
1823 m_attenuationDistance = newAttenuationDistance;
1824 emit attenuationDistanceChanged();
1825 markDirty(VolumeDirty);
1828QColor QQuick3DSpecularGlossyMaterial::attenuationColor()
const
1830 return m_attenuationColor;
1833bool QQuick3DSpecularGlossyMaterial::fresnelScaleBiasEnabled()
const
1835 return m_fresnelScaleBiasEnabled;
1838float QQuick3DSpecularGlossyMaterial::fresnelScale()
const
1840 return m_fresnelScale;
1843float QQuick3DSpecularGlossyMaterial::fresnelBias()
const
1845 return m_fresnelBias;
1848float QQuick3DSpecularGlossyMaterial::fresnelPower()
const
1850 return m_fresnelPower;
1853bool QQuick3DSpecularGlossyMaterial::clearcoatFresnelScaleBiasEnabled()
const
1855 return m_clearcoatFresnelScaleBiasEnabled;
1858float QQuick3DSpecularGlossyMaterial::clearcoatFresnelScale()
const
1860 return m_clearcoatFresnelScale;
1863float QQuick3DSpecularGlossyMaterial::clearcoatFresnelBias()
const
1865 return m_clearcoatFresnelBias;
1868float QQuick3DSpecularGlossyMaterial::clearcoatFresnelPower()
const
1870 return m_clearcoatFresnelPower;
1873bool QQuick3DSpecularGlossyMaterial::vertexColorsEnabled()
const
1875 return m_vertexColorsEnabled;
1878void QQuick3DSpecularGlossyMaterial::setAttenuationColor(
const QColor &newAttenuationColor)
1880 if (m_attenuationColor == newAttenuationColor)
1882 m_attenuationColor = newAttenuationColor;
1883 emit attenuationColorChanged();
1884 markDirty(VolumeDirty);
1887void QQuick3DSpecularGlossyMaterial::setFresnelScaleBiasEnabled(
bool fresnelScaleBiasEnabled)
1889 if (m_fresnelScaleBiasEnabled == fresnelScaleBiasEnabled)
1892 m_fresnelScaleBiasEnabled = fresnelScaleBiasEnabled;
1893 emit fresnelScaleBiasEnabledChanged(m_fresnelScaleBiasEnabled);
1894 markDirty(SpecularDirty);
1897void QQuick3DSpecularGlossyMaterial::setFresnelScale(
float fresnelScale)
1899 if (qFuzzyCompare(m_fresnelScale, fresnelScale))
1902 m_fresnelScale = fresnelScale;
1903 emit fresnelScaleChanged(m_fresnelScale);
1904 markDirty(SpecularDirty);
1907void QQuick3DSpecularGlossyMaterial::setFresnelBias(
float fresnelBias)
1909 if (qFuzzyCompare(m_fresnelBias, fresnelBias))
1912 m_fresnelBias = fresnelBias;
1913 emit fresnelBiasChanged(m_fresnelBias);
1914 markDirty(SpecularDirty);
1917void QQuick3DSpecularGlossyMaterial::setFresnelPower(
float fresnelPower)
1919 if (qFuzzyCompare(m_fresnelPower, fresnelPower))
1922 m_fresnelPower = fresnelPower;
1923 emit fresnelPowerChanged(m_fresnelPower);
1924 markDirty(SpecularDirty);
1927void QQuick3DSpecularGlossyMaterial::setClearcoatFresnelScaleBiasEnabled(
bool clearcoatFresnelScaleBiasEnabled)
1929 if (m_clearcoatFresnelScaleBiasEnabled == clearcoatFresnelScaleBiasEnabled)
1932 m_clearcoatFresnelScaleBiasEnabled = clearcoatFresnelScaleBiasEnabled;
1933 emit clearcoatFresnelScaleBiasEnabledChanged(m_clearcoatFresnelScaleBiasEnabled);
1934 markDirty(ClearcoatDirty);
1937void QQuick3DSpecularGlossyMaterial::setClearcoatFresnelScale(
float clearcoatFresnelScale)
1939 if (qFuzzyCompare(m_clearcoatFresnelScale, clearcoatFresnelScale))
1942 m_clearcoatFresnelScale = clearcoatFresnelScale;
1943 emit clearcoatFresnelScaleChanged(m_clearcoatFresnelScale);
1944 markDirty(ClearcoatDirty);
1947void QQuick3DSpecularGlossyMaterial::setClearcoatFresnelBias(
float clearcoatFresnelBias)
1949 if (qFuzzyCompare(m_clearcoatFresnelBias, clearcoatFresnelBias))
1952 m_clearcoatFresnelBias = clearcoatFresnelBias;
1953 emit clearcoatFresnelBiasChanged(m_clearcoatFresnelBias);
1954 markDirty(ClearcoatDirty);
1957void QQuick3DSpecularGlossyMaterial::setClearcoatFresnelPower(
float clearcoatFresnelPower)
1959 if (qFuzzyCompare(m_clearcoatFresnelPower, clearcoatFresnelPower))
1962 m_clearcoatFresnelPower = clearcoatFresnelPower;
1963 emit clearcoatFresnelPowerChanged(m_clearcoatFresnelPower);
1964 markDirty(ClearcoatDirty);
1967void QQuick3DSpecularGlossyMaterial::setVertexColorsEnabled(
bool vertexColors)
1969 if (m_vertexColorsEnabled == vertexColors)
1972 m_vertexColorsEnabled = vertexColors;
1973 emit vertexColorsEnabledChanged(m_vertexColorsEnabled);
1974 markDirty(VertexColorsDirty);
1977bool QQuick3DSpecularGlossyMaterial::vertexColorsMaskEnabled()
const
1979 return m_vertexColorsMaskEnabled;
1982void QQuick3DSpecularGlossyMaterial::setVertexColorsMaskEnabled(
bool vertexColorsMaskEnabled)
1984 if (m_vertexColorsMaskEnabled == vertexColorsMaskEnabled)
1986 m_vertexColorsMaskEnabled = vertexColorsMaskEnabled;
1987 emit vertexColorsMaskEnabledChanged();
1988 markDirty(VertexColorsDirty);
1991QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags QQuick3DSpecularGlossyMaterial::vertexColorRedMask()
const
1993 return m_vertexColorRedMask;
1996void QQuick3DSpecularGlossyMaterial::setVertexColorRedMask(QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags vertexColorRedMask)
1998 if (m_vertexColorRedMask == vertexColorRedMask)
2000 m_vertexColorRedMask = vertexColorRedMask;
2001 emit vertexColorRedMaskChanged();
2002 markDirty(VertexColorsDirty);
2005QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags QQuick3DSpecularGlossyMaterial::vertexColorGreenMask()
const
2007 return m_vertexColorGreenMask;
2010void QQuick3DSpecularGlossyMaterial::setVertexColorGreenMask(QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags vertexColorGreenMask)
2012 if (m_vertexColorGreenMask == vertexColorGreenMask)
2014 m_vertexColorGreenMask = vertexColorGreenMask;
2015 emit vertexColorGreenMaskChanged();
2016 markDirty(VertexColorsDirty);
2019QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags QQuick3DSpecularGlossyMaterial::vertexColorBlueMask()
const
2021 return m_vertexColorBlueMask;
2024void QQuick3DSpecularGlossyMaterial::setVertexColorBlueMask(QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags vertexColorBlueMask)
2026 if (m_vertexColorBlueMask == vertexColorBlueMask)
2028 m_vertexColorBlueMask = vertexColorBlueMask;
2029 emit vertexColorBlueMaskChanged();
2030 markDirty(VertexColorsDirty);
2033QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags QQuick3DSpecularGlossyMaterial::vertexColorAlphaMask()
const
2035 return m_vertexColorAlphaMask;
2038void QQuick3DSpecularGlossyMaterial::setVertexColorAlphaMask(QQuick3DSpecularGlossyMaterial::VertexColorMaskFlags vertexColorAlphaMask)
2040 if (m_vertexColorAlphaMask == vertexColorAlphaMask)
2042 m_vertexColorAlphaMask = vertexColorAlphaMask;
2043 emit vertexColorAlphaMaskChanged();
2044 markDirty(VertexColorsDirty);