src/glRenderer.h

changeset 1144
4f226fd97826
parent 1143
2008959603c9
child 1145
02264bf0108d
equal deleted inserted replaced
1143:2008959603c9 1144:4f226fd97826
1 /*
2 * LDForge: LDraw parts authoring CAD
3 * Copyright (C) 2013 - 2017 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 #pragma once
20 #include <QGLWidget>
21 #include "main.h"
22 #include "model.h"
23 #include "glShared.h"
24 #include "glcamera.h"
25
26 class GLCompiler;
27 class MessageManager;
28 class QDialogButtonBox;
29 class RadioGroup;
30 class QDoubleSpinBox;
31 class QSpinBox;
32 class QLineEdit;
33 class QTimer;
34 class MagicWandMode;
35
36 struct CameraInfo
37 {
38 CameraInfo(const CameraInfo&) = delete;
39
40 int glrotate[3];
41 Axis localX;
42 Axis localY;
43 bool negatedX;
44 bool negatedY;
45 bool negatedDepth; // is greater depth value closer to camera?
46 };
47
48 enum class Camera
49 {
50 Top,
51 Front,
52 Left,
53 Bottom,
54 Back,
55 Right,
56 Free,
57 _End
58 };
59
60 struct CameraIcon
61 {
62 QPixmap image;
63 QRect sourceRect;
64 QRect targetRect;
65 QRect hitRect;
66 Camera camera;
67 };
68
69 MAKE_ITERABLE_ENUM(Camera)
70
71 // The main renderer object, draws the brick on the screen, manages the camera and selection picking.
72 class GLRenderer : public QGLWidget, protected QOpenGLFunctions, public HierarchyElement
73 {
74 Q_OBJECT
75
76 public:
77 GLRenderer(const Model* model, QWidget* parent = nullptr);
78 ~GLRenderer();
79
80 QColor backgroundColor() const;
81 Camera camera() const;
82 QByteArray capturePixels();
83 GLCamera& currentCamera();
84 const GLCamera& currentCamera() const;
85 void drawGLScene();
86 void forgetObject(LDObject* obj);
87 void highlightCursorObject();
88 void initGLData();
89 bool isPicking() const;
90 Qt::KeyboardModifiers keyboardModifiers() const;
91 const Model* model() const;
92 bool mouseHasMoved() const;
93 QPoint const& mousePosition() const;
94 QPointF const& mousePositionF() const;
95 void needZoomToFit();
96 LDObject* objectAtCursor() const;
97 QSet<LDObject*> pick(const QRect& range);
98 LDObject* pick(int mouseX, int mouseY);
99 void refresh();
100 void resetAllAngles();
101 void resetAngles();
102 void setBackground();
103 void setCamera(Camera cam);
104 void setPicking(bool a);
105 QPen textPen() const;
106
107 static const QPen thinBorderPen;
108
109 signals:
110 void objectHighlightingChanged(LDObject* object);
111
112 protected:
113 void initializeGL();
114 void keyPressEvent(QKeyEvent* event);
115 void keyReleaseEvent(QKeyEvent* event);
116 void leaveEvent(QEvent* event);
117 void mousePressEvent(QMouseEvent* event);
118 void mouseMoveEvent(QMouseEvent* ev);
119 void mouseReleaseEvent(QMouseEvent* ev);
120 void paintEvent(QPaintEvent*);
121 void resizeGL(int w, int h);
122 void wheelEvent(QWheelEvent* ev);
123
124 virtual void overpaint(QPainter& painter);
125 virtual bool freeCameraAllowed() const;
126 bool isDrawingSelectionScene() const;
127 Qt::MouseButtons lastButtons() const;
128 double panning (Axis ax) const;
129 const QGenericMatrix<4, 4, GLfloat>& rotationMatrix() const;
130 double zoom();
131
132 template<typename... Args>
133 QString format (QString fmtstr, Args... args)
134 {
135 return ::format (fmtstr, args...);
136 }
137
138 private:
139 const Model* const m_model;
140 GLCompiler* m_compiler;
141 LDObject* m_objectAtCursor = nullptr;
142 CameraIcon m_cameraIcons[7];
143 QTimer* m_toolTipTimer;
144 Qt::MouseButtons m_lastButtons;
145 Qt::KeyboardModifiers m_currentKeyboardModifiers;
146 QGenericMatrix<4, 4, GLfloat> m_rotationMatrix;
147 GLCamera m_cameras[7];
148 bool m_useDarkBackground = false;
149 bool m_takingScreenCapture = false;
150 bool m_panning = false;
151 bool m_initialized = false;
152 bool m_isDrawingSelectionScene = false;
153 bool m_isCameraMoving = false;
154 bool m_needZoomToFit = true;
155 QPoint m_mousePosition;
156 QPoint m_globalpos;
157 QPointF m_mousePositionF;
158 Camera m_camera;
159 GLuint m_axeslist;
160 int m_totalMouseMove;
161 QColor m_backgroundColor;
162 GLuint m_axesVbo;
163 GLuint m_axesColorVbo;
164
165 void calcCameraIcons();
166 void drawVbos (VboClass surface, VboSubclass colors, GLenum type);
167 void zoomToFit();
168 void zoomAllToFit();
169
170 private slots:
171 void showCameraIconTooltip();
172 void initializeAxes();
173 void initializeLighting();
174 };

mercurial