Qt 6.x
The Qt SDK
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
389 , m_diffuseColor(Qt::white)
390 , m_specularTint(Qt::white)
391{}
392
394{
395}
396
398{
399 return m_lighting;
400}
401
403{
404 return m_blendMode;
405}
406
408{
409 return m_diffuseColor;
410}
411
413{
414 return m_diffuseMap;
415}
416
418{
419 return m_emissiveFactor;
420}
421
423{
424 return m_emissiveMap;
425}
426
428{
429 return m_specularReflectionMap;
430}
431
433{
434 return m_specularMap;
435}
436
438{
439 return m_specularModel;
440}
441
443{
444 return m_specularTint;
445}
446
448{
449 return m_indexOfRefraction;
450}
451
453{
454 return m_fresnelPower;
455}
456
458{
459 return m_specularAmount;
460}
461
463{
464 return m_specularRoughness;
465}
466
468{
469 return m_roughnessMap;
470}
471
473{
474 return m_opacity;
475}
476
478{
479 return m_opacityMap;
480}
481
483{
484 return m_bumpMap;
485}
486
488{
489 return m_bumpAmount;
490}
491
493{
494 return m_normalMap;
495}
496
498{
499 return m_translucencyMap;
500}
501
503{
504 return m_translucentFalloff;
505}
506
508{
509 return m_diffuseLightWrap;
510}
511
513{
514 return m_vertexColorsEnabled;
515}
516
518{
519 return m_roughnessChannel;
520}
521
523{
524 return m_opacityChannel;
525}
526
528{
529 return m_translucencyChannel;
530}
531
533{
534 return m_pointSize;
535}
536
538{
539 return m_lineWidth;
540}
541
543{
544 m_dirtyAttributes = 0xffffffff;
546}
547
548
550{
551 if (m_lighting == lighting)
552 return;
553
554 m_lighting = lighting;
555 emit lightingChanged(m_lighting);
556 markDirty(LightingModeDirty);
557}
558
560{
561 if (m_blendMode == blendMode)
562 return;
563
564 m_blendMode = blendMode;
565 emit blendModeChanged(m_blendMode);
566 markDirty(BlendModeDirty);
567}
568
570{
571 if (m_diffuseColor == diffuseColor)
572 return;
573
574 m_diffuseColor = diffuseColor;
575 emit diffuseColorChanged(m_diffuseColor);
576 markDirty(DiffuseDirty);
577}
578
580{
581 if (m_diffuseMap == diffuseMap)
582 return;
583
585
586 m_diffuseMap = diffuseMap;
587 emit diffuseMapChanged(m_diffuseMap);
588 markDirty(DiffuseDirty);
589}
590
592{
593 if (m_emissiveFactor == emissiveFactor)
594 return;
595
596 m_emissiveFactor = emissiveFactor;
597 emit emissiveFactorChanged(m_emissiveFactor);
598 markDirty(EmissiveDirty);
599}
600
602{
603 if (m_emissiveMap == emissiveMap)
604 return;
605
607
608 m_emissiveMap = emissiveMap;
609 emit emissiveMapChanged(m_emissiveMap);
610 markDirty(EmissiveDirty);
611}
612
614{
615 if (m_specularReflectionMap == specularReflectionMap)
616 return;
617
619
620 m_specularReflectionMap = specularReflectionMap;
621 emit specularReflectionMapChanged(m_specularReflectionMap);
622 markDirty(SpecularDirty);
623}
624
626{
627 if (m_specularMap == specularMap)
628 return;
629
631
632 m_specularMap = specularMap;
633 emit specularMapChanged(m_specularMap);
634 markDirty(SpecularDirty);
635}
636
638{
639 if (m_specularModel == specularModel)
640 return;
641
642 m_specularModel = specularModel;
643 emit specularModelChanged(m_specularModel);
644 markDirty(SpecularDirty);
645}
646
648{
649 if (m_specularTint == specularTint)
650 return;
651
652 m_specularTint = specularTint;
653 emit specularTintChanged(m_specularTint);
654 markDirty(SpecularDirty);
655}
656
658{
659 if (qFuzzyCompare(m_indexOfRefraction, indexOfRefraction))
660 return;
661
662 m_indexOfRefraction = indexOfRefraction;
663 emit indexOfRefractionChanged(m_indexOfRefraction);
664 markDirty(SpecularDirty);
665}
666
668{
669 if (qFuzzyCompare(m_fresnelPower, fresnelPower))
670 return;
671
672 m_fresnelPower = fresnelPower;
673 emit fresnelPowerChanged(m_fresnelPower);
674 markDirty(SpecularDirty);
675}
676
678{
679 if (qFuzzyCompare(m_specularAmount, specularAmount))
680 return;
681
682 m_specularAmount = specularAmount;
683 emit specularAmountChanged(m_specularAmount);
684 markDirty(SpecularDirty);
685}
686
688{
689 if (qFuzzyCompare(m_specularRoughness, specularRoughness))
690 return;
691
692 m_specularRoughness = specularRoughness;
693 emit specularRoughnessChanged(m_specularRoughness);
694 markDirty(SpecularDirty);
695}
696
698{
699 if (m_roughnessMap == roughnessMap)
700 return;
701
703
704 m_roughnessMap = roughnessMap;
705 emit roughnessMapChanged(m_roughnessMap);
706 markDirty(SpecularDirty);
707}
708
710{
711 if (qFuzzyCompare(m_opacity, opacity))
712 return;
713
714 if (opacity > 1.0f)
715 opacity = 1.0f;
716
717 if (opacity < 0.0f)
718 opacity = 0.0f;
719
720 m_opacity = opacity;
721 emit opacityChanged(m_opacity);
722 markDirty(OpacityDirty);
723}
724
726{
727 if (m_opacityMap == opacityMap)
728 return;
729
731
732 m_opacityMap = opacityMap;
733 emit opacityMapChanged(m_opacityMap);
734 markDirty(OpacityDirty);
735}
736
738{
739 if (m_bumpMap == bumpMap)
740 return;
741
743
744 m_bumpMap = bumpMap;
745 emit bumpMapChanged(m_bumpMap);
746 markDirty(BumpDirty);
747}
748
750{
751 if (qFuzzyCompare(m_bumpAmount, bumpAmount))
752 return;
753
754 m_bumpAmount = bumpAmount;
755 emit bumpAmountChanged(m_bumpAmount);
756 markDirty(BumpDirty);
757}
758
760{
761 if (m_normalMap == normalMap)
762 return;
763
765
766 m_normalMap = normalMap;
767 emit normalMapChanged(m_normalMap);
768 markDirty(NormalDirty);
769}
770
772{
773 if (m_translucencyMap == translucencyMap)
774 return;
775
777
778 m_translucencyMap = translucencyMap;
779 emit translucencyMapChanged(m_translucencyMap);
780 markDirty(TranslucencyDirty);
781}
782
784{
785 if (qFuzzyCompare(m_translucentFalloff, translucentFalloff))
786 return;
787
788 m_translucentFalloff = translucentFalloff;
789 emit translucentFalloffChanged(m_translucentFalloff);
790 markDirty(TranslucencyDirty);
791}
792
794{
795 if (qFuzzyCompare(m_diffuseLightWrap, diffuseLightWrap))
796 return;
797
798 m_diffuseLightWrap = diffuseLightWrap;
799 emit diffuseLightWrapChanged(m_diffuseLightWrap);
800 markDirty(DiffuseDirty);
801}
802
804{
805 if (m_vertexColorsEnabled == vertexColors)
806 return;
807
808 m_vertexColorsEnabled = vertexColors;
809 emit vertexColorsEnabledChanged(m_vertexColorsEnabled);
810 markDirty(VertexColorsDirty);
811}
812
814{
815 if (m_roughnessChannel == channel)
816 return;
817 m_roughnessChannel = channel;
819 markDirty(SpecularDirty);
820}
821
823{
824 if (m_opacityChannel == channel)
825 return;
826 m_opacityChannel = channel;
828 markDirty(OpacityDirty);
829}
830
832{
833 if (m_translucencyChannel == channel)
834 return;
835 m_translucencyChannel = channel;
837 markDirty(TranslucencyDirty);
838}
839
841{
842 if (qFuzzyCompare(m_pointSize, size))
843 return;
844 m_pointSize = size;
846 markDirty(PointSizeDirty);
847}
848
850{
851 if (qFuzzyCompare(m_lineWidth, width))
852 return;
853 m_lineWidth = width;
855 markDirty(LineWidthDirty);
856}
857
859{
860 if (!node) {
861 markAllDirty();
862 node = new QSSGRenderDefaultMaterial(QSSGRenderGraphObject::Type::DefaultMaterial);
863 }
864
865 static const auto channelMapping = [](TextureChannelMapping mapping) {
867 };
868
869 // Set common material properties
871
872 QSSGRenderDefaultMaterial *material = static_cast<QSSGRenderDefaultMaterial *>(node);
873
874 if (m_dirtyAttributes & LightingModeDirty) {
876 // If the lighthing mode changes it affects the emissive property
877 m_dirtyAttributes |= EmissiveDirty;
878 }
879
880 if (m_dirtyAttributes & BlendModeDirty)
882
883 if (m_dirtyAttributes & DiffuseDirty) {
884 material->color = color::sRGBToLinear(m_diffuseColor);
885 if (!m_diffuseMap)
886 material->colorMap = nullptr;
887 else
888 material->colorMap = m_diffuseMap->getRenderImage();
889
890 material->diffuseLightWrap = m_diffuseLightWrap;
891 }
892
893 if (m_dirtyAttributes & EmissiveDirty) {
894 if (!m_emissiveMap)
895 material->emissiveMap = nullptr;
896 else
897 material->emissiveMap = m_emissiveMap->getRenderImage();
898
899 material->emissiveColor = m_emissiveFactor;
900 }
901
902 if (m_dirtyAttributes & SpecularDirty) {
903 if (!m_specularReflectionMap)
904 material->specularReflection = nullptr;
905 else
906 material->specularReflection = m_specularReflectionMap->getRenderImage();
907
908 if (!m_specularMap)
909 material->specularMap = nullptr;
910 else
911 material->specularMap = m_specularMap->getRenderImage();
912
914 material->specularTint = color::sRGBToLinear(m_specularTint).toVector3D();
915 material->ior = m_indexOfRefraction;
916 material->fresnelPower = m_fresnelPower;
917 material->specularAmount = m_specularAmount;
918 material->specularRoughness = m_specularRoughness;
919 material->roughnessChannel = channelMapping(m_roughnessChannel);
920
921 if (!m_roughnessMap)
922 material->roughnessMap = nullptr;
923 else
924 material->roughnessMap = m_roughnessMap->getRenderImage();
925 }
926
927 if (m_dirtyAttributes & OpacityDirty) {
928 material->opacity = m_opacity;
929 material->opacityChannel = channelMapping(m_opacityChannel);
930 if (!m_opacityMap)
931 material->opacityMap = nullptr;
932 else
933 material->opacityMap = m_opacityMap->getRenderImage();
934 }
935
936 if (m_dirtyAttributes & BumpDirty) {
937 if (!m_bumpMap)
938 material->bumpMap = nullptr;
939 else
940 material->bumpMap = m_bumpMap->getRenderImage();
941 material->bumpAmount = m_bumpAmount;
942 }
943
944 if (m_dirtyAttributes & NormalDirty) {
945 if (!m_normalMap)
946 material->normalMap = nullptr;
947 else
948 material->normalMap = m_normalMap->getRenderImage();
949 }
950
951 if (m_dirtyAttributes & TranslucencyDirty) {
952 if (!m_translucencyMap)
953 material->translucencyMap = nullptr;
954 else
955 material->translucencyMap = m_translucencyMap->getRenderImage();
956 material->translucentFalloff = m_translucentFalloff;
957 material->translucencyChannel = channelMapping(m_translucencyChannel);
958 }
959
960 if (m_dirtyAttributes & VertexColorsDirty)
961 material->vertexColorsEnabled = m_vertexColorsEnabled;
962
963 if (m_dirtyAttributes & PointSizeDirty)
964 material->pointSize = m_pointSize;
965
966 if (m_dirtyAttributes & LineWidthDirty)
967 material->lineWidth = m_lineWidth;
968
969 m_dirtyAttributes = 0;
970
971 return node;
972}
973
974void QQuick3DDefaultMaterial::itemChange(QQuick3DObject::ItemChange change, const QQuick3DObject::ItemChangeData &value)
975{
976 if (change == QQuick3DObject::ItemSceneChange)
977 updateSceneManager(value.sceneManager);
978}
979
980void QQuick3DDefaultMaterial::updateSceneManager(QQuick3DSceneManager *sceneManager)
981{
982 // Check all the resource value's windows, and update as necessary
983 if (sceneManager) {
984 QQuick3DObjectPrivate::refSceneManager(m_diffuseMap, *sceneManager);
985 QQuick3DObjectPrivate::refSceneManager(m_emissiveMap, *sceneManager);
986 QQuick3DObjectPrivate::refSceneManager(m_specularReflectionMap, *sceneManager);
987 QQuick3DObjectPrivate::refSceneManager(m_specularMap, *sceneManager);
988 QQuick3DObjectPrivate::refSceneManager(m_roughnessMap, *sceneManager);
989 QQuick3DObjectPrivate::refSceneManager(m_opacityMap, *sceneManager);
990 QQuick3DObjectPrivate::refSceneManager(m_bumpMap, *sceneManager);
991 QQuick3DObjectPrivate::refSceneManager(m_normalMap, *sceneManager);
992 QQuick3DObjectPrivate::refSceneManager(m_translucencyMap, *sceneManager);
993 } else {
996 QQuick3DObjectPrivate::derefSceneManager(m_specularReflectionMap);
1003 }
1004}
1005
1006void QQuick3DDefaultMaterial::markDirty(QQuick3DDefaultMaterial::DirtyType type)
1007{
1008 if (!(m_dirtyAttributes & quint32(type))) {
1009 m_dirtyAttributes |= quint32(type);
1010 update();
1011 }
1012}
1013
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.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:287
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei width
GLenum type
GLenum GLenum GLenum GLenum mapping
#define emit
unsigned int quint32
Definition qtypes.h:45
QSSGRenderDefaultMaterial::MaterialSpecularModel specularModel
QSSGRenderDefaultMaterial::MaterialBlendMode blendMode
Definition moc.h:24
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent