32 #include "glcompiler.h" |
32 #include "glcompiler.h" |
33 #include "primitives.h" |
33 #include "primitives.h" |
34 #include "documentmanager.h" |
34 #include "documentmanager.h" |
35 #include "grid.h" |
35 #include "grid.h" |
36 |
36 |
37 const QPen GLRenderer::thinBorderPen {QColor {0, 0, 0, 208}, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin}; |
|
38 |
|
39 // Transformation matrices for the fixed cameras. |
|
40 const QMatrix4x4 GLRenderer::topCameraMatrix = QMatrix4x4 {}; |
|
41 const QMatrix4x4 GLRenderer::frontCameraMatrix = {1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1}; |
|
42 const QMatrix4x4 GLRenderer::leftCameraMatrix = {0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 1}; |
|
43 const QMatrix4x4 GLRenderer::bottomCameraMatrix = {1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1}; |
|
44 const QMatrix4x4 GLRenderer::backCameraMatrix = {-1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1}; |
|
45 const QMatrix4x4 GLRenderer::rightCameraMatrix = {0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1}; |
|
46 |
|
47 // Conversion matrix from LDraw to OpenGL coordinates. |
|
48 const QMatrix4x4 GLRenderer::ldrawToGLAdapterMatrix = {1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1}; |
|
49 |
|
50 /* |
37 /* |
51 * Constructs a GL renderer. |
38 * Constructs a GL renderer. |
52 */ |
39 */ |
53 GLRenderer::GLRenderer(const Model* model, QWidget* parent) : |
40 gl::Renderer::Renderer(const Model* model, QWidget* parent) : |
54 QGLWidget {parent}, |
41 QGLWidget {parent}, |
55 HierarchyElement {parent}, |
42 HierarchyElement {parent}, |
56 m_model {model}, |
43 m_model {model}, |
57 m_cameras { |
44 m_cameras { |
58 {"Top camera", {topCameraMatrix, X, Z, false, false, false}}, // top |
45 {"Top camera", {topCameraMatrix, X, Z, false, false, false}}, // top |
63 {"Right camera", {rightCameraMatrix, Z, Y, false, true, true}}, // right |
50 {"Right camera", {rightCameraMatrix, Z, Y, false, true, true}}, // right |
64 {"Free camera", GLCamera::FreeCamera}, // free |
51 {"Free camera", GLCamera::FreeCamera}, // free |
65 } |
52 } |
66 { |
53 { |
67 Q_ASSERT(model != nullptr); |
54 Q_ASSERT(model != nullptr); |
68 m_camera = (Camera) config::camera(); |
55 m_camera = (gl::CameraType) config::camera(); |
69 m_compiler = new GLCompiler (this); |
56 m_compiler = new gl::Compiler (this); |
70 m_toolTipTimer = new QTimer (this); |
57 m_toolTipTimer = new QTimer (this); |
71 m_toolTipTimer->setSingleShot (true); |
58 m_toolTipTimer->setSingleShot (true); |
72 setAcceptDrops (true); |
59 setAcceptDrops (true); |
73 connect (m_toolTipTimer, SIGNAL (timeout()), this, SLOT (showCameraIconTooltip())); |
60 connect (m_toolTipTimer, SIGNAL (timeout()), this, SLOT (showCameraIconTooltip())); |
74 resetAllAngles(); |
61 resetAllAngles(); |
75 m_needZoomToFit = true; |
62 m_needZoomToFit = true; |
76 |
63 |
77 // Init camera icons |
64 // Init camera icons |
78 for (Camera camera : iterateEnum<Camera>()) |
65 for (gl::CameraType camera : iterateEnum<gl::CameraType>()) |
79 { |
66 { |
80 const char* cameraIconNames[EnumLimits<Camera>::Count] = |
67 const char* cameraIconNames[EnumLimits<gl::CameraType>::Count] = |
81 { |
68 { |
82 "camera-top", "camera-front", "camera-left", |
69 "camera-top", "camera-front", "camera-left", |
83 "camera-bottom", "camera-back", "camera-right", |
70 "camera-bottom", "camera-back", "camera-right", |
84 "camera-free" |
71 "camera-free" |
85 }; |
72 }; |
89 info->camera = camera; |
76 info->camera = camera; |
90 } |
77 } |
91 |
78 |
92 connect( |
79 connect( |
93 this->m_compiler, |
80 this->m_compiler, |
94 &GLCompiler::sceneChanged, |
81 &gl::Compiler::sceneChanged, |
95 this, |
82 this, |
96 qOverload<>(&GLRenderer::update) |
83 qOverload<>(&gl::Renderer::update) |
97 ); |
84 ); |
98 |
85 |
99 calcCameraIcons(); |
86 calcCameraIcons(); |
100 } |
87 } |
101 |
88 |
102 /* |
89 /* |
103 * Destructs the GL renderer. |
90 * Destructs the GL renderer. |
104 */ |
91 */ |
105 GLRenderer::~GLRenderer() |
92 gl::Renderer::~Renderer() |
106 { |
93 { |
107 freeAxes(); |
94 freeAxes(); |
108 } |
95 } |
109 |
96 |
110 /* |
97 /* |
111 * Deletes the axes VBOs |
98 * Deletes the axes VBOs |
112 */ |
99 */ |
113 void GLRenderer::freeAxes() |
100 void gl::Renderer::freeAxes() |
114 { |
101 { |
115 if (m_axesInitialized) |
102 if (m_axesInitialized) |
116 { |
103 { |
117 glDeleteBuffers(1, &m_axesVbo); |
104 glDeleteBuffers(1, &m_axesVbo); |
118 glDeleteBuffers(1, &m_axesColorVbo); |
105 glDeleteBuffers(1, &m_axesColorVbo); |
155 } |
142 } |
156 |
143 |
157 /* |
144 /* |
158 * Returns the camera currently in use. |
145 * Returns the camera currently in use. |
159 */ |
146 */ |
160 GLCamera& GLRenderer::currentCamera() |
147 GLCamera& gl::Renderer::currentCamera() |
161 { |
148 { |
162 return m_cameras[static_cast<int>(camera())]; |
149 return m_cameras[static_cast<int>(camera())]; |
163 } |
150 } |
164 |
151 |
165 /* |
152 /* |
166 * Returns the camera currently in use. |
153 * Returns the camera currently in use. |
167 */ |
154 */ |
168 const GLCamera& GLRenderer::currentCamera() const |
155 const GLCamera& gl::Renderer::currentCamera() const |
169 { |
156 { |
170 return m_cameras[static_cast<int>(camera())]; |
157 return m_cameras[static_cast<int>(camera())]; |
171 } |
158 } |
172 |
159 |
173 /* |
160 /* |
174 * Prepares the GL context for rendering. |
161 * Prepares the GL context for rendering. |
175 */ |
162 */ |
176 void GLRenderer::initGLData() |
163 void gl::Renderer::initGLData() |
177 { |
164 { |
178 glEnable (GL_BLEND); |
165 glEnable (GL_BLEND); |
179 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
166 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
180 glEnable (GL_POLYGON_OFFSET_FILL); |
167 glEnable (GL_POLYGON_OFFSET_FILL); |
181 glPolygonOffset (1.0f, 1.0f); |
168 glPolygonOffset (1.0f, 1.0f); |
195 } |
182 } |
196 |
183 |
197 /* |
184 /* |
198 * Returns the object currently highlighted by the cursor. |
185 * Returns the object currently highlighted by the cursor. |
199 */ |
186 */ |
200 QPersistentModelIndex GLRenderer::objectAtCursor() const |
187 QPersistentModelIndex gl::Renderer::objectAtCursor() const |
201 { |
188 { |
202 return m_objectAtCursor; |
189 return m_objectAtCursor; |
203 } |
190 } |
204 |
191 |
205 // ============================================================================= |
192 // ============================================================================= |
206 // |
193 // |
207 void GLRenderer::needZoomToFit() |
194 void gl::Renderer::needZoomToFit() |
208 { |
195 { |
209 m_needZoomToFit = true; |
196 m_needZoomToFit = true; |
210 } |
197 } |
211 |
198 |
212 // ============================================================================= |
199 // ============================================================================= |
213 // |
200 // |
214 void GLRenderer::resetAngles() |
201 void gl::Renderer::resetAngles() |
215 { |
202 { |
216 if (m_initialized) |
203 if (m_initialized) |
217 { |
204 { |
218 m_rotation = QQuaternion::fromAxisAndAngle({1, 0, 0}, 30); |
205 m_rotation = QQuaternion::fromAxisAndAngle({1, 0, 0}, 30); |
219 m_rotation *= QQuaternion::fromAxisAndAngle({0, 1, 0}, 330); |
206 m_rotation *= QQuaternion::fromAxisAndAngle({0, 1, 0}, 330); |
222 needZoomToFit(); |
209 needZoomToFit(); |
223 } |
210 } |
224 |
211 |
225 // ============================================================================= |
212 // ============================================================================= |
226 // |
213 // |
227 void GLRenderer::resetAllAngles() |
214 void gl::Renderer::resetAllAngles() |
228 { |
215 { |
229 Camera oldCamera = camera(); |
216 gl::CameraType const oldCamera = camera(); |
230 |
217 |
231 for (Camera camera : iterateEnum<Camera>()) |
218 for (gl::CameraType camera : iterateEnum<gl::CameraType>()) |
232 { |
219 { |
233 setCamera(camera); |
220 setCamera(camera); |
234 resetAngles(); |
221 resetAngles(); |
235 } |
222 } |
236 |
223 |
237 setCamera(oldCamera); |
224 setCamera(oldCamera); |
238 } |
225 } |
239 |
226 |
240 // ============================================================================= |
227 // ============================================================================= |
241 // |
228 // |
242 void GLRenderer::initializeGL() |
229 void gl::Renderer::initializeGL() |
243 { |
230 { |
244 initializeOpenGLFunctions(); |
231 initializeOpenGLFunctions(); |
245 |
232 |
246 if (glGetError() != GL_NO_ERROR) |
233 if (glGetError() != GL_NO_ERROR) |
247 { |
234 { |
260 m_initialized = true; |
247 m_initialized = true; |
261 // Now that GL is initialized, we can reset angles. |
248 // Now that GL is initialized, we can reset angles. |
262 resetAllAngles(); |
249 resetAllAngles(); |
263 } |
250 } |
264 |
251 |
265 void GLRenderer::initializeLighting() |
252 void gl::Renderer::initializeLighting() |
266 { |
253 { |
267 GLfloat materialShininess[] = {5.0}; |
254 GLfloat materialShininess[] = {5.0}; |
268 GLfloat lightPosition[] = {1.0, 1.0, 1.0, 0.0}; |
255 GLfloat lightPosition[] = {1.0, 1.0, 1.0, 0.0}; |
269 GLfloat ambientLightingLevel[] = {0.5, 0.5, 0.5, 1.0}; |
256 GLfloat ambientLightingLevel[] = {0.5, 0.5, 0.5, 1.0}; |
270 glShadeModel(GL_SMOOTH); |
257 glShadeModel(GL_SMOOTH); |
334 // The picking scene requires a black background. |
321 // The picking scene requires a black background. |
335 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); |
322 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); |
336 } |
323 } |
337 } |
324 } |
338 |
325 |
339 QColor GLRenderer::backgroundColor() const |
326 QColor gl::Renderer::backgroundColor() const |
340 { |
327 { |
341 return m_backgroundColor; |
328 return m_backgroundColor; |
342 } |
329 } |
343 |
330 |
344 // ============================================================================= |
331 // ============================================================================= |
345 // |
332 // |
346 void GLRenderer::resizeGL (int width, int height) |
333 void gl::Renderer::resizeGL (int width, int height) |
347 { |
334 { |
348 calcCameraIcons(); |
335 calcCameraIcons(); |
349 glViewport (0, 0, width, height); |
336 glViewport (0, 0, width, height); |
350 glMatrixMode (GL_PROJECTION); |
337 glMatrixMode (GL_PROJECTION); |
351 glLoadIdentity(); |
338 glLoadIdentity(); |
485 * |
472 * |
486 * Parameters: |
473 * Parameters: |
487 * - surface determines what kind of surface to draw (triangles, quadrilaterals, edges or conditional edges) |
474 * - surface determines what kind of surface to draw (triangles, quadrilaterals, edges or conditional edges) |
488 * - colors determines what VBO subclass to use for colors |
475 * - colors determines what VBO subclass to use for colors |
489 */ |
476 */ |
490 void GLRenderer::drawVbos(VboClass surface, VboSubclass colors) |
477 void gl::Renderer::drawVbos(VboClass surface, VboSubclass colors) |
491 { |
478 { |
492 // Filter this through some configuration options |
479 // Filter this through some configuration options |
493 if ((isOneOf(surface, VboClass::Quads, VboClass::Triangles) and config::drawSurfaces() == false) |
480 if ((isOneOf(surface, VboClass::Quads, VboClass::Triangles) and config::drawSurfaces() == false) |
494 or (surface == VboClass::Lines and config::drawEdgeLines() == false) |
481 or (surface == VboClass::Lines and config::drawEdgeLines() == false) |
495 or (surface == VboClass::ConditionalLines and config::drawConditionalLines() == false)) |
482 or (surface == VboClass::ConditionalLines and config::drawConditionalLines() == false)) |
572 QPainter painter {this}; |
559 QPainter painter {this}; |
573 painter.setRenderHint(QPainter::Antialiasing); |
560 painter.setRenderHint(QPainter::Antialiasing); |
574 overpaint(painter); |
561 overpaint(painter); |
575 } |
562 } |
576 |
563 |
577 void GLRenderer::overpaint(QPainter &painter) |
564 void gl::Renderer::overpaint(QPainter &painter) |
578 { |
565 { |
579 // Draw a background for the selected camera |
566 // Draw a background for the selected camera |
580 painter.setPen(thinBorderPen); |
567 painter.setPen(thinBorderPen); |
581 painter.setBrush(QBrush {QColor {0, 128, 160, 128}}); |
568 painter.setBrush(QBrush {QColor {0, 128, 160, 128}}); |
582 painter.drawRect(m_cameraIcons[static_cast<int>(camera())].hitRect); |
569 painter.drawRect(m_cameraIcons[static_cast<int>(camera())].hitRect); |
583 |
570 |
584 // Draw the camera icons |
571 // Draw the camera icons |
585 for (const CameraIcon& info : m_cameraIcons) |
572 for (const CameraIcon& info : m_cameraIcons) |
586 { |
573 { |
587 // Don't draw the free camera icon when we can't use the free camera |
574 // Don't draw the free camera icon when we can't use the free camera |
588 if (info.camera == Camera::Free and not freeCameraAllowed()) |
575 if (info.camera == gl::FreeCamera and not freeCameraAllowed()) |
589 continue; |
576 continue; |
590 |
577 |
591 painter.drawPixmap(info.targetRect, info.image, info.sourceRect); |
578 painter.drawPixmap(info.targetRect, info.image, info.sourceRect); |
592 } |
579 } |
593 |
580 |
624 m_totalMouseMove = 0; |
611 m_totalMouseMove = 0; |
625 } |
612 } |
626 |
613 |
627 // ============================================================================= |
614 // ============================================================================= |
628 // |
615 // |
629 void GLRenderer::mousePressEvent(QMouseEvent* event) |
616 void gl::Renderer::mousePressEvent(QMouseEvent* event) |
630 { |
617 { |
631 m_lastButtons = event->buttons(); |
618 m_lastButtons = event->buttons(); |
632 m_totalMouseMove = 0; |
619 m_totalMouseMove = 0; |
633 } |
620 } |
634 |
621 |
635 // ============================================================================= |
622 // ============================================================================= |
636 // |
623 // |
637 void GLRenderer::mouseMoveEvent(QMouseEvent* event) |
624 void gl::Renderer::mouseMoveEvent(QMouseEvent* event) |
638 { |
625 { |
639 int xMove = event->x() - m_mousePosition.x(); |
626 int xMove = event->x() - m_mousePosition.x(); |
640 int yMove = event->y() - m_mousePosition.y(); |
627 int yMove = event->y() - m_mousePosition.y(); |
641 m_totalMouseMove += qAbs(xMove) + qAbs(yMove); |
628 m_totalMouseMove += qAbs(xMove) + qAbs(yMove); |
642 m_isCameraMoving = false; |
629 m_isCameraMoving = false; |
649 { |
636 { |
650 currentCamera().pan(xMove, yMove); |
637 currentCamera().pan(xMove, yMove); |
651 m_panning = true; |
638 m_panning = true; |
652 m_isCameraMoving = true; |
639 m_isCameraMoving = true; |
653 } |
640 } |
654 else if (left and camera() == Camera::Free and (xMove != 0 or yMove != 0)) |
641 else if (left and camera() == gl::FreeCamera and (xMove != 0 or yMove != 0)) |
655 { |
642 { |
656 QQuaternion versor = QQuaternion::fromAxisAndAngle(yMove, xMove, 0, 0.6 * hypot(xMove, yMove)); |
643 QQuaternion versor = QQuaternion::fromAxisAndAngle(yMove, xMove, 0, 0.6 * hypot(xMove, yMove)); |
657 m_rotation = versor * m_rotation; |
644 m_rotation = versor * m_rotation; |
658 m_isCameraMoving = true; |
645 m_isCameraMoving = true; |
659 } |
646 } |
671 event->accept(); |
658 event->accept(); |
672 } |
659 } |
673 |
660 |
674 // ============================================================================= |
661 // ============================================================================= |
675 // |
662 // |
676 void GLRenderer::keyPressEvent(QKeyEvent* event) |
663 void gl::Renderer::keyPressEvent(QKeyEvent* event) |
677 { |
664 { |
678 m_currentKeyboardModifiers = event->modifiers(); |
665 m_currentKeyboardModifiers = event->modifiers(); |
679 } |
666 } |
680 |
667 |
681 // ============================================================================= |
668 // ============================================================================= |
682 // |
669 // |
683 void GLRenderer::keyReleaseEvent(QKeyEvent* event) |
670 void gl::Renderer::keyReleaseEvent(QKeyEvent* event) |
684 { |
671 { |
685 m_currentKeyboardModifiers = event->modifiers(); |
672 m_currentKeyboardModifiers = event->modifiers(); |
686 update(); |
673 update(); |
687 } |
674 } |
688 |
675 |
689 // ============================================================================= |
676 // ============================================================================= |
690 // |
677 // |
691 void GLRenderer::wheelEvent(QWheelEvent* ev) |
678 void gl::Renderer::wheelEvent(QWheelEvent* ev) |
692 { |
679 { |
693 makeCurrent(); |
680 makeCurrent(); |
694 currentCamera().zoomNotch(ev->delta() > 0); |
681 currentCamera().zoomNotch(ev->delta() > 0); |
695 m_isCameraMoving = true; |
682 m_isCameraMoving = true; |
696 update(); |
683 update(); |
697 ev->accept(); |
684 ev->accept(); |
698 } |
685 } |
699 |
686 |
700 // ============================================================================= |
687 // ============================================================================= |
701 // |
688 // |
702 void GLRenderer::leaveEvent(QEvent*) |
689 void gl::Renderer::leaveEvent(QEvent*) |
703 { |
690 { |
704 m_toolTipTimer->stop(); |
691 m_toolTipTimer->stop(); |
705 update(); |
692 update(); |
706 } |
693 } |
707 |
694 |
708 // ============================================================================= |
695 // ============================================================================= |
709 // |
696 // |
710 void GLRenderer::setCamera(Camera camera) |
697 void gl::Renderer::setCamera(gl::CameraType camera) |
711 { |
698 { |
712 // The edit mode may forbid the free camera. |
699 // The edit mode may forbid the free camera. |
713 if (freeCameraAllowed() or camera != Camera::Free) |
700 if (freeCameraAllowed() or camera != gl::FreeCamera) |
714 { |
701 { |
715 m_camera = camera; |
702 m_camera = camera; |
716 config::setCamera(static_cast<int>(camera)); |
703 config::setCamera(static_cast<int>(camera)); |
717 } |
704 } |
718 } |
705 } |
985 } |
972 } |
986 |
973 |
987 update(); |
974 update(); |
988 } |
975 } |
989 |
976 |
990 bool GLRenderer::mouseHasMoved() const |
977 bool gl::Renderer::mouseHasMoved() const |
991 { |
978 { |
992 return m_totalMouseMove >= 10; |
979 return m_totalMouseMove >= 10; |
993 } |
980 } |
994 |
981 |
995 QPoint const& GLRenderer::mousePosition() const |
982 QPoint const& gl::Renderer::mousePosition() const |
996 { |
983 { |
997 return m_mousePosition; |
984 return m_mousePosition; |
998 } |
985 } |
999 |
986 |
1000 QPointF const& GLRenderer::mousePositionF() const |
987 QPointF const& gl::Renderer::mousePositionF() const |
1001 { |
988 { |
1002 return m_mousePositionF; |
989 return m_mousePositionF; |
1003 } |
990 } |
1004 |
991 |
1005 Qt::KeyboardModifiers GLRenderer::keyboardModifiers() const |
992 Qt::KeyboardModifiers gl::Renderer::keyboardModifiers() const |
1006 { |
993 { |
1007 return m_currentKeyboardModifiers; |
994 return m_currentKeyboardModifiers; |
1008 } |
995 } |
1009 |
996 |
1010 Camera GLRenderer::camera() const |
997 gl::CameraType gl::Renderer::camera() const |
1011 { |
998 { |
1012 return m_camera; |
999 return m_camera; |
1013 } |
1000 } |
1014 |
1001 |
1015 double GLRenderer::panning (Axis ax) const |
1002 double gl::Renderer::panning (Axis ax) const |
1016 { |
1003 { |
1017 return (ax == X) ? currentCamera().panningX() : currentCamera().panningY(); |
1004 return (ax == X) ? currentCamera().panningX() : currentCamera().panningY(); |
1018 } |
1005 } |
1019 |
1006 |
1020 double GLRenderer::zoom() |
1007 double gl::Renderer::zoom() |
1021 { |
1008 { |
1022 return currentCamera().zoom(); |
1009 return currentCamera().zoom(); |
1023 } |
1010 } |
1024 |
1011 |
1025 bool GLRenderer::isDrawingSelectionScene() const |
1012 bool gl::Renderer::isDrawingSelectionScene() const |
1026 { |
1013 { |
1027 return m_isDrawingSelectionScene; |
1014 return m_isDrawingSelectionScene; |
1028 } |
1015 } |
1029 |
1016 |
1030 Qt::MouseButtons GLRenderer::lastButtons() const |
1017 Qt::MouseButtons gl::Renderer::lastButtons() const |
1031 { |
1018 { |
1032 return m_lastButtons; |
1019 return m_lastButtons; |
1033 } |
1020 } |
1034 |
1021 |
1035 const Model* GLRenderer::model() const |
1022 const Model* gl::Renderer::model() const |
1036 { |
1023 { |
1037 return m_model; |
1024 return m_model; |
1038 } |
1025 } |
1039 |
1026 |
1040 /* |
1027 /* |
1041 * This virtual function lets derivative classes render something to the fixed camera |
1028 * This virtual function lets derivative classes render something to the fixed camera |
1042 * before the main brick is rendered. |
1029 * before the main brick is rendered. |
1043 */ |
1030 */ |
1044 void GLRenderer::drawFixedCameraBackdrop() {} |
1031 void gl::Renderer::drawFixedCameraBackdrop() {} |
1045 |
1032 |
1046 QItemSelectionModel* GLRenderer::selectionModel() const |
1033 QItemSelectionModel* gl::Renderer::selectionModel() const |
1047 { |
1034 { |
1048 return m_compiler->selectionModel(); |
1035 return m_compiler->selectionModel(); |
1049 } |
1036 } |
1050 |
1037 |
1051 void GLRenderer::setSelectionModel(QItemSelectionModel* selectionModel) |
1038 void gl::Renderer::setSelectionModel(QItemSelectionModel* selectionModel) |
1052 { |
1039 { |
1053 this->m_compiler->setSelectionModel(selectionModel); |
1040 this->m_compiler->setSelectionModel(selectionModel); |
1054 } |
1041 } |
1055 |
1042 |
1056 void GLRenderer::fullUpdate() |
1043 void gl::Renderer::fullUpdate() |
1057 { |
1044 { |
1058 this->m_compiler->fullUpdate(); |
1045 this->m_compiler->fullUpdate(); |
1059 update(); |
1046 update(); |
1060 } |
1047 } |