aboutsummaryrefslogtreecommitdiffstats
path: root/tests/manual/shaderpoker/shaderpoker.h
blob: 0f7989b1bb51c6351c80dc277965165251a8c409 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#ifndef SHADERPOKER_H
#define SHADERPOKER_H

#include <QObject>
#include <QQmlEngine>

#include <QtQuick3DRuntimeRender/private/qssgrenderer_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrendershaderkeys_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrhicontext_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrendershadercodegenerator_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrendershaderlibrarymanager_p.h>

#include "defaultmaterialshaderproperties.h"

class ShaderPoker : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int shaderIndex READ shaderIndex WRITE setShaderIndex NOTIFY shaderIndexChanged FINAL)
    Q_PROPERTY(QString vertexShader READ vertexShader NOTIFY vertexShaderChanged)
    Q_PROPERTY(QString fragmentShader READ fragmentShader NOTIFY fragmentShaderChanged)
    Q_PROPERTY(QString shaderKey READ shaderKey NOTIFY shaderKeyChanged)
    Q_PROPERTY(QStringList shaderKeysList READ shaderKeysList NOTIFY shaderKeysListChanged)
    Q_PROPERTY(MaterialType materialType READ materialType WRITE setMaterialType NOTIFY materialTypeChanged)
    Q_PROPERTY(quint32 featureBitfield READ featureBitfield WRITE setFeatureBitfield NOTIFY featureBitfieldChanged)
    Q_PROPERTY(QStringList availableShadersList READ availableShadersList NOTIFY availableShadersListChanged FINAL)
    Q_PROPERTY(DefaultMaterialShaderProperties* shaderProperties READ shaderProperties WRITE setShaderProperties NOTIFY shaderPropertiesChanged FINAL)
    QML_ELEMENT
public:

    enum class MaterialType {
        Default,
        Principled,
        SpecularGlossy
    };
    Q_ENUM(MaterialType);

    explicit ShaderPoker(QObject *parent = nullptr);
    ~ShaderPoker() override;

    Q_INVOKABLE void generateShader();

    QString vertexShader() const;
    QString fragmentShader() const;
    QString shaderKey() const;

    QStringList shaderKeysList() const;

    MaterialType materialType() const;
    void setMaterialType(const MaterialType &newMaterialType);

    quint32 featureBitfield() const;
    void setFeatureBitfield(quint32 newFeatureBitfield);

    QStringList availableShadersList() const;

    int shaderIndex() const;
    void setShaderIndex(int newShaderIndex);

    DefaultMaterialShaderProperties *shaderProperties() const;
    void setShaderProperties(DefaultMaterialShaderProperties *newShaderProperties);

signals:
    void vertexShaderChanged();
    void fragmentShaderChanged();
    void shaderKeyChanged();
    void shaderKeysListChanged();
    void materialTypeChanged();
    void featureBitfieldChanged();
    void availableShadersListChanged();
    void shaderIndexChanged();
    void shaderPropertiesChanged();

private slots:
    void shaderPropertiesDirty();

private:
    void updateAvailableShadersList();

    QRhi *m_rhi = nullptr;
    std::shared_ptr<QSSGRenderContextInterface> m_renderContext;

    QSSGShaderFeatures m_featureSet;
    DefaultMaterialShaderProperties m_builtinProperties;
    DefaultMaterialShaderProperties *m_shaderProperties;
    QMetaObject::Connection m_shaderPropertiesDirtyConnection;
    QSSGRenderDefaultMaterial *m_material = nullptr;
    QString m_vertexShader;
    QString m_fragmentShader;
    QString m_shaderKey;
    QStringList m_shaderKeysList;
    MaterialType m_materialType = MaterialType::Default;
    quint32 m_featureBitfield = 0;

    QHash<QSSGShaderCacheKey, std::pair<QString, QString>> m_generatedShaderCodeCache;
    std::shared_ptr<QSSGRhiShaderPipeline> m_currentShaderPipeline;
    QStringList m_availableShadersList;
    int m_shaderIndex = 0;
};

#endif // SHADERPOKER_H