| 35 #include "documentmanager.h" |
35 #include "documentmanager.h" |
| 36 #include "grid.h" |
36 #include "grid.h" |
| 37 |
37 |
| 38 const QPen GLRenderer::thinBorderPen {QColor {0, 0, 0, 208}, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin}; |
38 const QPen GLRenderer::thinBorderPen {QColor {0, 0, 0, 208}, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin}; |
| 39 |
39 |
| 40 // ============================================================================= |
40 /* |
| 41 // |
41 * Constructs a GL renderer. |
| |
42 */ |
| 42 GLRenderer::GLRenderer(const Model* model, QWidget* parent) : |
43 GLRenderer::GLRenderer(const Model* model, QWidget* parent) : |
| 43 QGLWidget {parent}, |
44 QGLWidget {parent}, |
| 44 HierarchyElement {parent}, |
45 HierarchyElement {parent}, |
| 45 m_model {model}, |
46 m_model {model}, |
| 46 m_cameras { |
47 m_cameras { |
| 78 } |
79 } |
| 79 |
80 |
| 80 calcCameraIcons(); |
81 calcCameraIcons(); |
| 81 } |
82 } |
| 82 |
83 |
| 83 // ============================================================================= |
84 /* |
| 84 // |
85 * Cleans up the axes VBOs when the renderer is destroyed. |
| |
86 */ |
| 85 GLRenderer::~GLRenderer() |
87 GLRenderer::~GLRenderer() |
| 86 { |
88 { |
| 87 m_compiler->setRenderer (nullptr); |
89 glDeleteBuffers(1, &m_axesVbo); |
| 88 delete m_compiler; |
90 glDeleteBuffers(1, &m_axesColorVbo); |
| 89 glDeleteBuffers (1, &m_axesVbo); |
91 } |
| 90 glDeleteBuffers (1, &m_axesColorVbo); |
92 |
| 91 } |
93 /* |
| 92 |
94 * Calculates the camera icon locations. |
| 93 // ============================================================================= |
95 */ |
| 94 // Calculates the "hitboxes" of the camera icons so that we can tell when the |
|
| 95 // cursor is pointing at the camera icon. |
|
| 96 // |
|
| 97 void GLRenderer::calcCameraIcons() |
96 void GLRenderer::calcCameraIcons() |
| 98 { |
97 { |
| 99 int i = 0; |
98 int i = 0; |
| 100 const int columns = 3; |
99 const int columns = 3; |
| 101 const int firstAtLastRow = countof(m_cameras) - (countof(m_cameras) % columns); |
100 const int firstAtLastRow = countof(m_cameras) - (countof(m_cameras) % columns); |
| 103 for (CameraIcon& cameraIcon : m_cameraIcons) |
102 for (CameraIcon& cameraIcon : m_cameraIcons) |
| 104 { |
103 { |
| 105 int row = i / columns; |
104 int row = i / columns; |
| 106 int column = i % columns; |
105 int column = i % columns; |
| 107 |
106 |
| |
107 // Do right-justifying on the last row. |
| 108 if (i >= firstAtLastRow) |
108 if (i >= firstAtLastRow) |
| 109 column += columns - (countof(m_cameras) % columns); |
109 column += columns - (countof(m_cameras) % columns); |
| 110 |
110 |
| 111 int x1 = width() - 48 + (column * 16) - 1; |
111 int x1 = width() - 48 + (column * 16) - 1; |
| 112 int y1 = (row * 16) + 1; |
112 int y1 = (row * 16) + 1; |
| 122 |
122 |
| 123 ++i; |
123 ++i; |
| 124 } |
124 } |
| 125 } |
125 } |
| 126 |
126 |
| |
127 /* |
| |
128 * Returns the camera currently in use. |
| |
129 */ |
| 127 GLCamera& GLRenderer::currentCamera() |
130 GLCamera& GLRenderer::currentCamera() |
| 128 { |
131 { |
| 129 return m_cameras[static_cast<int>(camera())]; |
132 return m_cameras[static_cast<int>(camera())]; |
| 130 } |
133 } |
| 131 |
134 |
| |
135 /* |
| |
136 * Returns the camera currently in use. |
| |
137 */ |
| 132 const GLCamera& GLRenderer::currentCamera() const |
138 const GLCamera& GLRenderer::currentCamera() const |
| 133 { |
139 { |
| 134 return m_cameras[static_cast<int>(camera())]; |
140 return m_cameras[static_cast<int>(camera())]; |
| 135 } |
141 } |
| 136 |
142 |
| 137 // ============================================================================= |
143 /* |
| 138 // |
144 * Prepares the GL context for rendering. |
| |
145 */ |
| 139 void GLRenderer::initGLData() |
146 void GLRenderer::initGLData() |
| 140 { |
147 { |
| 141 glEnable (GL_BLEND); |
148 glEnable (GL_BLEND); |
| 142 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
149 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| 143 glEnable (GL_POLYGON_OFFSET_FILL); |
150 glEnable (GL_POLYGON_OFFSET_FILL); |
| 158 glDisable (GL_LINE_SMOOTH); |
165 glDisable (GL_LINE_SMOOTH); |
| 159 glDisable (GL_POLYGON_SMOOTH); |
166 glDisable (GL_POLYGON_SMOOTH); |
| 160 } |
167 } |
| 161 } |
168 } |
| 162 |
169 |
| 163 bool GLRenderer::isDrawOnly() const |
170 /* |
| 164 { |
171 * Returns the object currently highlighted by the cursor. |
| 165 return m_isDrawOnly; |
172 */ |
| 166 } |
|
| 167 |
|
| 168 void GLRenderer::setDrawOnly (bool value) |
|
| 169 { |
|
| 170 m_isDrawOnly = value; |
|
| 171 } |
|
| 172 |
|
| 173 GLCompiler* GLRenderer::compiler() const |
|
| 174 { |
|
| 175 return m_compiler; |
|
| 176 } |
|
| 177 |
|
| 178 LDObject* GLRenderer::objectAtCursor() const |
173 LDObject* GLRenderer::objectAtCursor() const |
| 179 { |
174 { |
| 180 return m_objectAtCursor; |
175 return m_objectAtCursor; |
| 181 } |
176 } |
| 182 |
177 |
| 230 glLineWidth (m_config->lineThickness()); |
225 glLineWidth (m_config->lineThickness()); |
| 231 glLineStipple (1, 0x6666); |
226 glLineStipple (1, 0x6666); |
| 232 setAutoFillBackground (false); |
227 setAutoFillBackground (false); |
| 233 setMouseTracking (true); |
228 setMouseTracking (true); |
| 234 setFocusPolicy (Qt::WheelFocus); |
229 setFocusPolicy (Qt::WheelFocus); |
| 235 compiler()->initialize(); |
230 m_compiler->initialize(); |
| 236 initializeAxes(); |
231 initializeAxes(); |
| 237 initializeLighting(); |
232 initializeLighting(); |
| 238 m_initialized = true; |
233 m_initialized = true; |
| 239 // Now that GL is initialized, we can reset angles. |
234 // Now that GL is initialized, we can reset angles. |
| 240 resetAllAngles(); |
235 resetAllAngles(); |