forked from rogii-com/SceneSample
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSceneMaterial.cpp
81 lines (64 loc) · 1.99 KB
/
SceneMaterial.cpp
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
#include "SceneMaterial.hpp"
#include "Scene.hpp"
namespace rogii
{
namespace qt_quick
{
const QMatrix4x4 & SceneShader::SceneRenderState::getCombinedMatrix() const
{
return mCombinedMatrix;
}
SceneShader::SceneRenderState::SceneRenderState(const SceneMaterial & material,
const RenderState & renderState)
: mMaterial(material)
, mCombinedMatrix(mMaterial.getCombinedMatrix())
{
// preserve coefficients for z: they are modified by Qt
mCombinedMatrix(2, 2) = renderState.combinedMatrix()(2, 2);
mCombinedMatrix(2, 3) = renderState.combinedMatrix()(2, 3);
}
SceneShader::SceneShader()
{
}
void SceneShader::updateState(const QSGMaterialShader::RenderState & state,
QSGMaterial * newMaterial,
QSGMaterial * oldMaterial)
{
Q_ASSERT(program()->isLinked());
SceneMaterial * newSceneMaterial(static_cast<SceneMaterial *>(newMaterial));
SceneMaterial * oldSceneMaterial(static_cast<SceneMaterial *>(oldMaterial));
SceneRenderState rs(*newSceneMaterial, state);
updateState(rs, newSceneMaterial, oldSceneMaterial);
}
SceneMaterial::SceneMaterial(const Scene & scene)
: mScene(scene)
, mModelMatrix()
, mCombinedMatrix()
{
setFlag(QSGMaterial::RequiresFullMatrix);
connect(&mScene, &Scene::combinedMatrixChanged, this, &SceneMaterial::onSceneCombinedMatrixChanged);
}
void SceneMaterial::setModelMatrix(const QTransform &m)
{
mModelMatrix = m;
updateOwnCombinedMatrix();
}
const Scene & SceneMaterial::getScene() const
{
return mScene;
}
const QTransform & SceneMaterial::getCombinedMatrix() const
{
return mCombinedMatrix;
}
void SceneMaterial::updateOwnCombinedMatrix()
{
Q_ASSERT(flags().testFlag(QSGMaterial::RequiresFullMatrix));
mCombinedMatrix = mModelMatrix * mScene.getCombinedMatrix();
}
void SceneMaterial::onSceneCombinedMatrixChanged()
{
updateOwnCombinedMatrix();
}
} //~namespace qt_quick
} //~namespace rogii