forked from rogii-com/SceneSample
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSceneMaterial.hpp
97 lines (71 loc) · 2.34 KB
/
SceneMaterial.hpp
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
#pragma once
#include "SceneCamera.hpp"
#include <QSGMaterial>
#include <QSGMaterialShader>
namespace rogii
{
namespace qt_quick
{
class SceneMaterial;
/** Documentation says that in void QSGMaterialShader::initialize() the shader program
* is not bound. Check docs for details.
* However the default OpenGL QtQuick-backend binds program before calling this
* method. See sources for details: 'void QSGDefaultRenderContext::initializeShader'
* in 5.9.6 qtdeclarative\src\quick\scenegraph\qsgdefaultrendercontext.cpp +275
* So we don't have to bind the program too.
*/
class SceneShader : public QSGMaterialShader
{
public:
class SceneRenderState
{
public:
const QMatrix4x4 & getCombinedMatrix() const;
private:
friend class SceneShader;
friend class SceneMaterial;
private:
SceneRenderState(const SceneMaterial & material,
const RenderState & renderState);
const SceneMaterial & mMaterial;
QMatrix4x4 mCombinedMatrix;
};
public:
SceneShader();
void updateState(const RenderState & state, QSGMaterial * newMaterial, QSGMaterial * oldMaterial) override;
virtual void updateState(const SceneRenderState & renderState, SceneMaterial * newMaterial, SceneMaterial * oldMaterial) = 0;
public:
SceneShader(const SceneShader &) = delete;
SceneShader(SceneShader &&) = delete;
SceneShader & operator=(const SceneShader &) = delete;
SceneShader & operator=(SceneShader &&) = delete;
};
class SceneMaterial : public QObject, public QSGMaterial
{
Q_OBJECT
public:
SceneMaterial(const Scene & scene);
void setModelMatrix(const QTransform & m);
const Scene & getScene() const;
public:
SceneMaterial(const SceneMaterial &) = delete;
SceneMaterial(SceneMaterial &&) = delete;
SceneMaterial & operator=(const SceneMaterial &) = delete;
SceneMaterial & operator=(SceneMaterial &&) = delete;
private:
friend class SceneShader::SceneRenderState;
// Interface for SceneShader::SceneRenderState
//@{
const QTransform & getCombinedMatrix() const;
//@}
private:
void updateOwnCombinedMatrix();
private Q_SLOTS:
void onSceneCombinedMatrixChanged();
private:
const Scene & mScene;
QTransform mModelMatrix;
QTransform mCombinedMatrix;
};
} //~namespace qt_quick
} //~namespace rogii