src/layers/gridlayer.cpp

changeset 263
59b6027b9843
parent 250
2837b549e616
child 264
76a025db4948
equal deleted inserted replaced
262:dc33f8a707c4 263:59b6027b9843
1 /*
2 * LDForge: LDraw parts authoring CAD
3 * Copyright (C) 2020 Teemu Piippo
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 #include "../gl/partrenderer.h"
20 #include "gridlayer.h"
21
22 constexpr char vertexShaderSource[] = R"(
23 #version 330 core
24
25 layout (location = 0) in vec2 in_position;
26 uniform mat4 mvp;
27 smooth out vec2 ex_uv;
28 uniform mat4 grid;
29
30 void main()
31 {
32 gl_Position = mvp * grid * vec4(in_position, 0.0, 1.0);
33 ex_uv = in_position;
34 }
35 )";
36
37 constexpr char fragmentShaderSource[] = R"(
38 #version 330 core
39
40 out vec4 color;
41 smooth in vec2 ex_uv;
42 uniform vec4 gridColor;
43
44 void main(void)
45 {
46 float dx = fract(ex_uv.y);
47 float dy = fract(ex_uv.x);
48 /* fade the grid towards extreme co-ordinates */
49 float d = (1.0f - 0.015 * max(abs(ex_uv.x), abs(ex_uv.y)));
50 color = vec4(gridColor.xyz, gridColor.w * d);
51 }
52 )";
53
54 template<int extent>
55 constexpr auto calcGridData()
56 {
57 std::array<glm::vec2, 8 * extent + 4> result;
58 std::size_t ix = 0;
59 for (int i = -extent; i <= extent; i += 1) {
60 result[ix++] = {i, -extent};
61 result[ix++] = {i, extent};
62 }
63 for (int i = -extent; i <= extent; i += 1) {
64 result[ix++] = {-extent, i};
65 result[ix++] = {extent, i};
66 }
67 return result;
68 }
69
70 void GridLayer::setGridMatrix(const glm::mat4& newGridMatrix)
71 {
72 this->gridMatrix = newGridMatrix;
73 if (this->isInitialized) {
74 this->shader.setUniformMatrix("grid", newGridMatrix);
75 }
76 }
77
78 void GridLayer::setGridColor(const QColor& newGridColor)
79 {
80 this->gridColor = gl::colorToVector4(newGridColor);
81 if (this->isInitialized) {
82 this->shader.setUniformVector("gridColor", this->gridColor);
83 }
84 }
85
86 void GridLayer::settingsChanged()
87 {
88 this->setGridColor(this->renderer->isDark() ? Qt::white : Qt::black);
89 }
90
91 void GridLayer::initializeGL()
92 {
93 this->shader.initialize(
94 ::vertexShaderSource,
95 ::fragmentShaderSource,
96 QOpenGLBuffer::StaticDraw,
97 {
98 GLAttributeSpec{
99 .type = GL_FLOAT,
100 .offset = 0,
101 .tuplesize = 2,
102 .stride = 0,
103 },
104 }
105 );
106 this->isInitialized = true;
107 constexpr auto data = calcGridData<50>();
108 this->shader.setUniformVector("gridColor", this->gridColor);
109 this->setGridMatrix(this->gridMatrix);
110 this->settingsChanged();
111 this->shader.bufferData(data.data(), data.size(), sizeof data[0]);
112 }
113
114 void GridLayer::paintGL()
115 {
116 glLineWidth(1);
117 glEnable(GL_BLEND);
118 glLineStipple(1, 0x8888);
119 glEnable(GL_LINE_STIPPLE);
120 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
121 this->shader.draw(GL_LINES);
122 glDisable(GL_BLEND);
123 glDisable(GL_LINE_STIPPLE);
124 }
125
126 void GridLayer::mvpMatrixChanged(const glm::mat4& mvpMatrix)
127 {
128 this->shader.setMvpMatrix(mvpMatrix);
129 }

mercurial