aboutsummaryrefslogtreecommitdiffstats
path: root/tools/materialeditor/materialadapter.h
blob: ef22b912728abff0c1a3f3c3bd59e14c5dfa093a (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#ifndef MATERIALADAPTER_H
#define MATERIALADAPTER_H

#include <QtCore/qstring.h>
#include <QtCore/qvariant.h>
#include <QtCore/qobject.h>
#include <QtCore/qpointer.h>

#include <QtQml/qqmlregistration.h>

#include <ssg/qssgrenderbasetypes.h>
#include <QtQuick3DRuntimeRender/private/qssgrendercustommaterial_p.h>

#include <QtQuick3D/private/qquick3dcustommaterial_p.h>
#include <QtQuick3D/private/qquick3dmodel_p.h>

#include <QtCore/qabstractitemmodel.h>
#include <QtCore/qstringlistmodel.h>

#include <QtQuick3DAssetUtils/private/qssgscenedesc_p.h>

#include "custommaterial.h"
#include "buildmessage.h"
#include "uniformmodel.h"

QT_BEGIN_NAMESPACE

class MaterialAdapter : public QObject
{
    Q_OBJECT

    using CullMode = QQuick3DCustomMaterial::CullMode;
    using DepthDrawMode = QQuick3DCustomMaterial::DepthDrawMode;
    using ShadingMode = QQuick3DCustomMaterial::ShadingMode;
    using BlendMode = QQuick3DCustomMaterial::BlendMode;

    Q_PROPERTY(QQuick3DCustomMaterial * material READ material NOTIFY materialChanged)
    Q_PROPERTY(QQuick3DNode * rootNode READ rootNode WRITE setRootNode NOTIFY rootNodeChanged)
    Q_PROPERTY(QString fragmentShader READ fragmentShader WRITE setFragmentShader NOTIFY fragmentShaderChanged)
    Q_PROPERTY(QString vertexShader READ vertexShader WRITE setVertexShader NOTIFY vertexShaderChanged)
    Q_PROPERTY(ShaderBuildMessage vertexStatus READ vertexStatus NOTIFY vertexStatusChanged)
    Q_PROPERTY(ShaderBuildMessage fragmentStatus READ fragmentStatus NOTIFY fragmentStatusChanged)
    Q_PROPERTY(UniformModel * uniformModel READ uniformModel WRITE setUniformModel NOTIFY uniformModelChanged)
    Q_PROPERTY(bool unsavedChanges READ unsavedChanges WRITE setUnsavedChanges NOTIFY unsavedChangesChanged)
    Q_PROPERTY(QUrl materialSaveFile READ materialSaveFile WRITE setMaterialSaveFile NOTIFY materialSaveFileChanged)

    Q_PROPERTY(QQuick3DMaterial::CullMode cullMode READ cullMode WRITE setCullMode NOTIFY cullModeChanged)
    Q_PROPERTY(QQuick3DMaterial::DepthDrawMode depthDrawMode READ depthDrawMode WRITE setDepthDrawMode NOTIFY depthDrawModeChanged)
    Q_PROPERTY(QQuick3DCustomMaterial::ShadingMode shadingMode READ shadingMode WRITE setShadingMode NOTIFY shadingModeChanged)
    Q_PROPERTY(QQuick3DCustomMaterial::BlendMode sourceBlend READ srcBlend WRITE setSrcBlend NOTIFY srcBlendChanged)
    Q_PROPERTY(QQuick3DCustomMaterial::BlendMode destinationBlend READ dstBlend WRITE setDstBlend NOTIFY dstBlendChanged)

    QML_ELEMENT
public:
    explicit MaterialAdapter(QObject *parent = nullptr);

    QQuick3DCustomMaterial *material() const;
    QString fragmentShader() const;
    void setFragmentShader(const QString &newFragmentShader);

    QString vertexShader() const;
    void setVertexShader(const QString &newVertexShader);

    UniformModel *uniformModel() const;

    ShaderBuildMessage vertexStatus() const;
    ShaderBuildMessage fragmentStatus() const;

    bool unsavedChanges() const;
    void setUnsavedChanges(bool newUnsavedChanges);

    const QUrl &materialSaveFile() const;
    void setMaterialSaveFile(const QUrl &newMaterialSaveFile);

    QQuick3DNode *rootNode() const;
    void setRootNode(QQuick3DNode *newResourceNode);

    CullMode cullMode() const;
    void setCullMode(CullMode newCullMode);

    DepthDrawMode depthDrawMode() const;
    void setDepthDrawMode(DepthDrawMode newDepthDrawMode);

    ShadingMode shadingMode() const;
    void setShadingMode(ShadingMode newShadingMode);

    BlendMode srcBlend() const;
    void setSrcBlend(BlendMode newSourceBlend);

    BlendMode dstBlend() const;
    void setDstBlend(BlendMode newDestinationBlend);

    void setUniformModel(UniformModel *newUniformModel);

    Q_INVOKABLE QString getSupportedImageFormatsFilter() const;

public Q_SLOTS:
    void importFragmentShader(const QUrl &shaderFile);
    void importVertexShader(const QUrl &shaderFile);
    bool save();
    bool saveMaterial(const QUrl &materialFile);
    bool loadMaterial(const QUrl &materialFile);
    bool exportQmlComponent(const QUrl &componentFile, const QString &vertName, const QString &fragName);
    void reset();

Q_SIGNALS:
    void materialChanged();
    void fragmentShaderChanged();
    void vertexShaderChanged();
    void vertexStatusChanged();
    void uniformModelChanged();
    void fragmentStatusChanged();
    void unsavedChangesChanged();
    void materialSaveFileChanged();

    void errorOccurred();
    void postMaterialSaved();
    void rootNodeChanged();
    void cullModeChanged();
    void depthDrawModeChanged();
    void shadingModeChanged();
    void srcBlendChanged();
    void dstBlendChanged();

private:
    static void updateShader(QQuick3DMaterial &target);
    static void bakerStatusCallback(const QByteArray &descKey, QtQuick3DEditorHelpers::ShaderBaker::Status status, const QString &err, QShader::Stage stage);
    void updateMaterialDescription(CustomMaterial::Shaders shaders);
    void updateMaterialDescription();

    QString importShader(const QUrl &shaderFile);
    QFile resolveFileFromUrl(const QUrl &fileUrl);
    QPointer<QQuick3DCustomMaterial> m_material;
    UniformModel *m_uniformModel = nullptr;
    QUrl m_vertexUrl;
    QUrl m_fragUrl;
    QString m_fragmentShader;
    QString m_vertexShader;
    ShaderBuildMessage m_vertexMsg;
    ShaderBuildMessage m_fragmentMsg;
    bool m_unsavedChanges = true;
    QUrl m_materialSaveFile;
    QPointer<QQuick3DNode> m_rootNode;
    CustomMaterial m_materialDescr;
    CustomMaterial::UniformTable uniformTable;
    CustomMaterial::Properties m_properties;
};

QT_END_NAMESPACE

#endif // MATERIALADAPTER_H