Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquick3ddefaultmaterial.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
12
394 : QQuick3DMaterial(*(new QQuick3DObjectPrivate(QQuick3DObjectPrivate::Type::DefaultMaterial)), parent)
395 , m_diffuseColor(Qt::white)
396 , m_specularTint(Qt::white)
397{}
398
402
407
412
414{
415 return m_diffuseColor;
416}
417
419{
420 return m_diffuseMap;
421}
422
424{
425 return m_emissiveFactor;
426}
427
429{
430 return m_emissiveMap;
431}
432
434{
435 return m_specularReflectionMap;
436}
437
439{
440 return m_specularMap;
441}
442
447
449{
450 return m_specularTint;
451}
452
454{
455 return m_indexOfRefraction;
456}
457
459{
460 return m_fresnelPower;
461}
462
464{
465 return m_specularAmount;
466}
467
469{
470 return m_specularRoughness;
471}
472
474{
475 return m_roughnessMap;
476}
477
479{
480 return m_opacity;
481}
482
484{
485 return m_opacityMap;
486}
487
489{
490 return m_bumpMap;
491}
492
494{
495 return m_bumpAmount;
496}
497
499{
500 return m_normalMap;
501}
502
504{
505 return m_translucencyMap;
506}
507
509{
510 return m_translucentFalloff;
511}
512
514{
515 return m_diffuseLightWrap;
516}
517
519{
520 return m_vertexColorsEnabled;
521}
522
527
532
537
539{
540 return m_pointSize;
541}
542
544{
545 return m_lineWidth;
546}
547
549{
550 m_dirtyAttributes = 0xffffffff;
552}
553
554
556{
557 if (m_lighting == lighting)
558 return;
559
560 m_lighting = lighting;
561 emit lightingChanged(m_lighting);
562 markDirty(LightingModeDirty);
563}
564
566{
567 if (m_blendMode == blendMode)
568 return;
569
570 m_blendMode = blendMode;
571 emit blendModeChanged(m_blendMode);
572 markDirty(BlendModeDirty);
573}
574
576{
577 if (m_diffuseColor == diffuseColor)
578 return;
579
580 m_diffuseColor = diffuseColor;
581 emit diffuseColorChanged(m_diffuseColor);
582 markDirty(DiffuseDirty);
583}
584
586{
587 if (m_diffuseMap == diffuseMap)
588 return;
589
591
592 m_diffuseMap = diffuseMap;
593 emit diffuseMapChanged(m_diffuseMap);
594 markDirty(DiffuseDirty);
595}
596
598{
599 if (m_emissiveFactor == emissiveFactor)
600 return;
601
602 m_emissiveFactor = emissiveFactor;
603 emit emissiveFactorChanged(m_emissiveFactor);
604 markDirty(EmissiveDirty);
605}
606
608{
609 if (m_emissiveMap == emissiveMap)
610 return;
611
613
614 m_emissiveMap = emissiveMap;
615 emit emissiveMapChanged(m_emissiveMap);
616 markDirty(EmissiveDirty);
617}
618
620{
621 if (m_specularReflectionMap == specularReflectionMap)
622 return;
623
625
626 m_specularReflectionMap = specularReflectionMap;
627 emit specularReflectionMapChanged(m_specularReflectionMap);
628 markDirty(SpecularDirty);
629}
630
632{
633 if (m_specularMap == specularMap)
634 return;
635
637
638 m_specularMap = specularMap;
639 emit specularMapChanged(m_specularMap);
640 markDirty(SpecularDirty);
641}
642
644{
645 if (m_specularModel == specularModel)
646 return;
647
648 m_specularModel = specularModel;
649 emit specularModelChanged(m_specularModel);
650 markDirty(SpecularDirty);
651}
652
654{
655 if (m_specularTint == specularTint)
656 return;
657
658 m_specularTint = specularTint;
659 emit specularTintChanged(m_specularTint);
660 markDirty(SpecularDirty);
661}
662
664{
665 if (qFuzzyCompare(m_indexOfRefraction, indexOfRefraction))
666 return;
667
668 m_indexOfRefraction = indexOfRefraction;
669 emit indexOfRefractionChanged(m_indexOfRefraction);
670 markDirty(SpecularDirty);
671}
672
674{
675 if (qFuzzyCompare(m_fresnelPower, fresnelPower))
676 return;
677
678 m_fresnelPower = fresnelPower;
679 emit fresnelPowerChanged(m_fresnelPower);
680 markDirty(SpecularDirty);
681}
682
684{
685 if (qFuzzyCompare(m_specularAmount, specularAmount))
686 return;
687
688 m_specularAmount = specularAmount;
689 emit specularAmountChanged(m_specularAmount);
690 markDirty(SpecularDirty);
691}
692
694{
695 if (qFuzzyCompare(m_specularRoughness, specularRoughness))
696 return;
697
698 m_specularRoughness = specularRoughness;
699 emit specularRoughnessChanged(m_specularRoughness);
700 markDirty(SpecularDirty);
701}
702
704{
705 if (m_roughnessMap == roughnessMap)
706 return;
707
709
710 m_roughnessMap = roughnessMap;
711 emit roughnessMapChanged(m_roughnessMap);
712 markDirty(SpecularDirty);
713}
714
716{
717 if (qFuzzyCompare(m_opacity, opacity))
718 return;
719
720 if (opacity > 1.0f)
721 opacity = 1.0f;
722
723 if (opacity < 0.0f)
724 opacity = 0.0f;
725
726 m_opacity = opacity;
727 emit opacityChanged(m_opacity);
728 markDirty(OpacityDirty);
729}
730
732{
733 if (m_opacityMap == opacityMap)
734 return;
735
737
738 m_opacityMap = opacityMap;
739 emit opacityMapChanged(m_opacityMap);
740 markDirty(OpacityDirty);
741}
742
744{
745 if (m_bumpMap == bumpMap)
746 return;
747
749
750 m_bumpMap = bumpMap;
751 emit bumpMapChanged(m_bumpMap);
752 markDirty(BumpDirty);
753}
754
756{
757 if (qFuzzyCompare(m_bumpAmount, bumpAmount))
758 return;
759
760 m_bumpAmount = bumpAmount;
761 emit bumpAmountChanged(m_bumpAmount);
762 markDirty(BumpDirty);
763}
764
766{
767 if (m_normalMap == normalMap)
768 return;
769
771
772 m_normalMap = normalMap;
773 emit normalMapChanged(m_normalMap);
774 markDirty(NormalDirty);
775}
776
778{
779 if (m_translucencyMap == translucencyMap)
780 return;
781
783
784 m_translucencyMap = translucencyMap;
785 emit translucencyMapChanged(m_translucencyMap);
786 markDirty(TranslucencyDirty);
787}
788
790{
791 if (qFuzzyCompare(m_translucentFalloff, translucentFalloff))
792 return;
793
794 m_translucentFalloff = translucentFalloff;
795 emit translucentFalloffChanged(m_translucentFalloff);
796 markDirty(TranslucencyDirty);
797}
798
800{
801 if (qFuzzyCompare(m_diffuseLightWrap, diffuseLightWrap))
802 return;
803
804 m_diffuseLightWrap = diffuseLightWrap;
805 emit diffuseLightWrapChanged(m_diffuseLightWrap);
806 markDirty(DiffuseDirty);
807}
808
810{
811 if (m_vertexColorsEnabled == vertexColors)
812 return;
813
814 m_vertexColorsEnabled = vertexColors;
815 emit vertexColorsEnabledChanged(m_vertexColorsEnabled);
816 markDirty(VertexColorsDirty);
817}
818
820{
821 if (m_roughnessChannel == channel)
822 return;
823 m_roughnessChannel = channel;
825 markDirty(SpecularDirty);
826}
827
829{
830 if (m_opacityChannel == channel)
831 return;
832 m_opacityChannel = channel;
834 markDirty(OpacityDirty);
835}
836
838{
839 if (m_translucencyChannel == channel)
840 return;
841 m_translucencyChannel = channel;
843 markDirty(TranslucencyDirty);
844}
845
847{
848 if (qFuzzyCompare(m_pointSize, size))
849 return;
850 m_pointSize = size;
852 markDirty(PointSizeDirty);
853}
854
856{
857 if (qFuzzyCompare(m_lineWidth, width))
858 return;
859 m_lineWidth = width;
861 markDirty(LineWidthDirty);
862}
863
865{
866 if (!node) {
867 markAllDirty();
868 node = new QSSGRenderDefaultMaterial(QSSGRenderGraphObject::Type::DefaultMaterial);
869 }
870
871 static const auto channelMapping = [](TextureChannelMapping mapping) {
873 };
874
875 // Set common material properties
877
878 QSSGRenderDefaultMaterial *material = static_cast<QSSGRenderDefaultMaterial *>(node);
879
880 if (m_dirtyAttributes & LightingModeDirty) {
882 // If the lighthing mode changes it affects the emissive property
883 m_dirtyAttributes |= EmissiveDirty;
884 }
885
886 if (m_dirtyAttributes & BlendModeDirty)
888
889 if (m_dirtyAttributes & DiffuseDirty) {
890 material->color = QSSGUtils::color::sRGBToLinear(m_diffuseColor);
891 if (!m_diffuseMap)
892 material->colorMap = nullptr;
893 else
894 material->colorMap = m_diffuseMap->getRenderImage();
895
896 material->diffuseLightWrap = m_diffuseLightWrap;
897 }
898
899 if (m_dirtyAttributes & EmissiveDirty) {
900 if (!m_emissiveMap)
901 material->emissiveMap = nullptr;
902 else
903 material->emissiveMap = m_emissiveMap->getRenderImage();
904
905 material->emissiveColor = m_emissiveFactor;
906 }
907
908 if (m_dirtyAttributes & SpecularDirty) {
909 if (!m_specularReflectionMap)
910 material->specularReflection = nullptr;
911 else
912 material->specularReflection = m_specularReflectionMap->getRenderImage();
913
914 if (!m_specularMap)
915 material->specularMap = nullptr;
916 else
917 material->specularMap = m_specularMap->getRenderImage();
918
920 material->specularTint = QSSGUtils::color::sRGBToLinear(m_specularTint).toVector3D();
921 material->ior = m_indexOfRefraction;
922 material->fresnelPower = m_fresnelPower;
923 material->specularAmount = m_specularAmount;
924 material->specularRoughness = m_specularRoughness;
925 material->roughnessChannel = channelMapping(m_roughnessChannel);
926
927 if (!m_roughnessMap)
928 material->roughnessMap = nullptr;
929 else
930 material->roughnessMap = m_roughnessMap->getRenderImage();
931 }
932
933 if (m_dirtyAttributes & OpacityDirty) {
934 material->opacity = m_opacity;
935 material->opacityChannel = channelMapping(m_opacityChannel);
936 if (!m_opacityMap)
937 material->opacityMap = nullptr;
938 else
939 material->opacityMap = m_opacityMap->getRenderImage();
940 }
941
942 if (m_dirtyAttributes & BumpDirty) {
943 if (!m_bumpMap)
944 material->bumpMap = nullptr;
945 else
946 material->bumpMap = m_bumpMap->getRenderImage();
947 material->bumpAmount = m_bumpAmount;
948 }
949
950 if (m_dirtyAttributes & NormalDirty) {
951 if (!m_normalMap)
952 material->normalMap = nullptr;
953 else
954 material->normalMap = m_normalMap->getRenderImage();
955 }
956
957 if (m_dirtyAttributes & TranslucencyDirty) {
958 if (!m_translucencyMap)
959 material->translucencyMap = nullptr;
960 else
961 material->translucencyMap = m_translucencyMap->getRenderImage();
962 material->translucentFalloff = m_translucentFalloff;
963 material->translucencyChannel = channelMapping(m_translucencyChannel);
964 }
965
966 if (m_dirtyAttributes & VertexColorsDirty)
967 material->vertexColorsEnabled = m_vertexColorsEnabled;
968
969 if (m_dirtyAttributes & PointSizeDirty)
970 material->pointSize = m_pointSize;
971
972 if (m_dirtyAttributes & LineWidthDirty)
973 material->lineWidth = m_lineWidth;
974
975 m_dirtyAttributes = 0;
976
977 return node;
978}
979
980void QQuick3DDefaultMaterial::itemChange(QQuick3DObject::ItemChange change, const QQuick3DObject::ItemChangeData &value)
981{
982 if (change == QQuick3DObject::ItemSceneChange)
983 updateSceneManager(value.sceneManager);
984}
985
986void QQuick3DDefaultMaterial::updateSceneManager(QQuick3DSceneManager *sceneManager)
987{
988 // Check all the resource value's windows, and update as necessary
989 if (sceneManager) {
990 QQuick3DObjectPrivate::refSceneManager(m_diffuseMap, *sceneManager);
991 QQuick3DObjectPrivate::refSceneManager(m_emissiveMap, *sceneManager);
992 QQuick3DObjectPrivate::refSceneManager(m_specularReflectionMap, *sceneManager);
993 QQuick3DObjectPrivate::refSceneManager(m_specularMap, *sceneManager);
994 QQuick3DObjectPrivate::refSceneManager(m_roughnessMap, *sceneManager);
995 QQuick3DObjectPrivate::refSceneManager(m_opacityMap, *sceneManager);
996 QQuick3DObjectPrivate::refSceneManager(m_bumpMap, *sceneManager);
997 QQuick3DObjectPrivate::refSceneManager(m_normalMap, *sceneManager);
998 QQuick3DObjectPrivate::refSceneManager(m_translucencyMap, *sceneManager);
999 } else {
1002 QQuick3DObjectPrivate::derefSceneManager(m_specularReflectionMap);
1009 }
1010}
1011
1012void QQuick3DDefaultMaterial::markDirty(QQuick3DDefaultMaterial::DirtyType type)
1013{
1014 if (!(m_dirtyAttributes & quint32(type))) {
1015 m_dirtyAttributes |= quint32(type);
1016 update();
1017 }
1018}
1019
IOBluetoothL2CAPChannel * channel
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
void setFresnelPower(float fresnelPower)
void setSpecularReflectionMap(QQuick3DTexture *specularReflectionMap)
void opacityChanged(float opacity)
void setSpecularTint(QColor specularTint)
void lightingChanged(QQuick3DDefaultMaterial::Lighting lighting)
QQuick3DDefaultMaterial(QQuick3DObject *parent=nullptr)
\qmltype DefaultMaterial \inherits Material \inqmlmodule QtQuick3D
void setDiffuseLightWrap(float diffuseLightWrap)
void setRoughnessChannel(QQuick3DMaterial::TextureChannelMapping channel)
void setVertexColorsEnabled(bool vertexColorsEnabled)
void diffuseLightWrapChanged(float diffuseLightWrap)
void bumpMapChanged(QQuick3DTexture *bumpMap)
void setTranslucencyChannel(QQuick3DMaterial::TextureChannelMapping channel)
void specularModelChanged(QQuick3DDefaultMaterial::SpecularModel specularModel)
void setLighting(QQuick3DDefaultMaterial::Lighting lighting)
void bumpAmountChanged(float bumpAmount)
void fresnelPowerChanged(float fresnelPower)
void setBumpMap(QQuick3DTexture *bumpMap)
void setEmissiveMap(QQuick3DTexture *emissiveMap)
QQuick3DMaterial::TextureChannelMapping translucencyChannel
void setBumpAmount(float bumpAmount)
void emissiveMapChanged(QQuick3DTexture *emissiveMap)
void diffuseColorChanged(QColor diffuseColor)
void setEmissiveFactor(QVector3D emissiveFactor)
void setOpacityMap(QQuick3DTexture *opacityMap)
void setSpecularRoughness(float specularRoughness)
void setNormalMap(QQuick3DTexture *normalMap)
void normalMapChanged(QQuick3DTexture *normalMap)
void vertexColorsEnabledChanged(bool vertexColorsEnabled)
void itemChange(ItemChange, const ItemChangeData &) override
QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node) override
void setSpecularAmount(float specularAmount)
void specularTintChanged(QColor specularTint)
void indexOfRefractionChanged(float indexOfRefraction)
void roughnessMapChanged(QQuick3DTexture *roughnessMap)
void diffuseMapChanged(QQuick3DTexture *diffuseMap)
void roughnessChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
QQuick3DMaterial::TextureChannelMapping roughnessChannel
void setSpecularModel(QQuick3DDefaultMaterial::SpecularModel specularModel)
void setBlendMode(QQuick3DDefaultMaterial::BlendMode blendMode)
void opacityMapChanged(QQuick3DTexture *opacityMap)
void setRoughnessMap(QQuick3DTexture *roughnessMap)
void setTranslucencyMap(QQuick3DTexture *translucencyMap)
void translucentFalloffChanged(float translucentFalloff)
void setDiffuseMap(QQuick3DTexture *diffuseMap)
void specularRoughnessChanged(float specularRoughness)
void opacityChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
void translucencyChannelChanged(QQuick3DMaterial::TextureChannelMapping channel)
void setOpacityChannel(QQuick3DMaterial::TextureChannelMapping channel)
void setIndexOfRefraction(float indexOfRefraction)
void setSpecularMap(QQuick3DTexture *specularMap)
void setTranslucentFalloff(float translucentFalloff)
void specularMapChanged(QQuick3DTexture *specularMap)
void emissiveFactorChanged(QVector3D emissiveFactor)
void specularAmountChanged(float specularAmount)
void translucencyMapChanged(QQuick3DTexture *translucencyMap)
QQuick3DMaterial::TextureChannelMapping opacityChannel
void setDiffuseColor(QColor diffuseColor)
void blendModeChanged(QQuick3DDefaultMaterial::BlendMode blendMode)
void specularReflectionMapChanged(QQuick3DTexture *specularReflectionMap)
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()
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.
Definition qcompare.h:63
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:333
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei width
GLenum type
GLenum GLenum GLenum GLenum mapping
#define emit
unsigned int quint32
Definition qtypes.h:50
QSSGRenderDefaultMaterial::MaterialSpecularModel specularModel
QSSGRenderDefaultMaterial::MaterialBlendMode blendMode
Definition moc.h:23