gldemo
widget.h
1 #ifndef WIDGET_H
2 #define WIDGET_H
3 
4 #include <QWidget>
5 #include <QOpenGLWidget>
6 #include <qtimer.h>
7 
8 #include <vector>
9 #include <map>
10 
11 // OpenGL
12 //#include <QOpenGLExtraFunctions>
13 #include <qopenglshaderprogram.h>
14 #include <qopenglvertexarrayobject.h>
15 #include <qopenglbuffer.h>
16 // GLM
17 #include <glm/glm.hpp>
18 #include <glm/gtc/matrix_transform.hpp>
19 #include <glm/gtc/type_ptr.hpp>
20 #include <glm/gtx/quaternion.hpp>
21 
22 #include <QDebug>
23 #include <QKeyEvent>
24 
25 #include "vertex.h"
26 //#include "pointcloud.h"
27 #include "futils.h"
28 #include "HierarchyModel.h"
29 #include "HierarchyObject.h"
30 #include "Renderer.h"
31 #include "PointCloudRenderer.h"
32 #include "LineRenderer.h"
33 #include "SkyboxRenderer.h"
34 #include "commondefs.h"
35 #include "Input.h"
36 #include "Trail.h"
37 
38 #include <QDragEnterEvent>
39 #include <string>
40 #include <QMimeData>
41 #include <QDropEvent>
42 #include <QUrl>
43 #include <qcoreapplication.h>
44 #include <qdir.h> //拖拽文件所需的库函数
45 
46 //保存图片的引用
47 #include <Qt3Drender/qcamera.h>
48 #include <Qt3Drender/qrendercapture.h>
49 #include <QPixmap>
50 #include <QImage>
51 #include <QDateTime>
52 #include <QMessageBox>
53 #include <QDesktopWidget>
54 #include <QFileDialog>
55 #include <QMovie>
56 
57 
58 //回放视频
59 #include "mainwindow.h"
60 #include <QLabel>
61 
62 //保存视频
63 #include <opencv2\opencv.hpp>
64 #include <opencv2\core\core.hpp>
65 #include <opencv2\highgui\highgui.hpp>
66 #include "qttoopencv.h"
67 #include <opencv2/videoio.hpp>
68 
69 
74 class Widget : public QOpenGLWidget, protected OpenGLFunctions
75 {
76  Q_OBJECT
77 
78 public:
79  Widget(QWidget *parent = nullptr);
80  ~Widget();
81 
83  OpenGLFunctions* functions() const;
84 
86  std::map<QString, QOpenGLShaderProgram*> shaders;
87 
90 
93 
96 
99 
103  float currentTrailTime = 0;
104 
108  int LMBMode = 0;
109 
111  std::vector<QPixmap> video;
112 
114  void setHierarchy(HierarchyModel* hierarchy) {
115  hierarchy->widget = this;
116  this->hierarchy = hierarchy;
117  }
118 
119 private:
120  // 记录屏幕长宽
121  unsigned int screenWidth, screenHeight;
122  // 相机姿态相关
123  glm::vec3 camPos, camTarget;
124  glm::quat camRot;
125  glm::mat4 view, projection;
126  //wasd 摄像机漫游
127  int camDx = 0, camDy = 0;
128  float distance = 5;
129  int windowX = 0,windowY = 0;
130  float videoRecordSpeed = 0.01;
131  bool videoRecordFlag = false;
132 
133 
134 private slots:
136  void fixedUpdate();
138  void onRecordVideo1Wigdet(float speed, bool RecordOrPreview);
140  void onSaveVideo1Widget(QString savePath);
141  void changedaytime(int value);
142 
143 signals:
145  void onSelection(HierarchyObject* obj);
149  void drag_signal(QString re_path);
151  void videoRecordFinish(bool RecordOrPreview);
153  void videoSaveFinish();
154 
155 private:
156  bool mousepick(int mousex, int mousey, HierarchyObject*& objout, int& iout);
157  glm::vec3 get_ray(int mousex, int mousey, int screenWidth, int screenHeight,
158  glm::mat4 matModel, glm::vec4& init_point);
159  void getRayWorld(int mousex, int mousey, glm::vec3 out_source, glm::vec3 out_direction);
160 
161 protected:
162  void initializeGL() override;
163  void resizeGL(int w, int h) override;
164  void handleDefaultShader(Renderer * renderer);
165  void renderObjectRecursively(const glm::mat4 & proj, const glm::mat4 & view, const glm::mat4 & parentTransform, HierarchyObject * obj);
166  void paintGL() override;
167 
168 
169  void mousePressEvent(QMouseEvent * e);
170  void mouseMoveEvent(QMouseEvent * e);
171  void mouseReleaseEvent(QMouseEvent * e);
172 
173  void wheelEvent(QWheelEvent* wheel);
174 
175  void keyPressEvent(QKeyEvent* key);
176  void keyReleaseEvent(QKeyEvent* key);
177 
178  void dropEvent(QDropEvent * e);
179  void dragEnterEvent(QDragEnterEvent * e); //实现拖拽的函数
180 };
181 #endif // WIDGET_H
HierarchyObject * gizmosRoot
显示辅助信息用的根节点
Definition: widget.h:92
void onSelection(HierarchyObject *obj)
发送用户鼠标选取模型的信号
Trail * currentTrail
当前播放的路径
Definition: widget.h:101
Definition: Renderer.h:18
继承自Renderer,用于渲染天空
Definition: SkyboxRenderer.h:8
int LMBMode
鼠标左键编辑模式
Definition: widget.h:108
void onRecordVideo1Wigdet(float speed, bool RecordOrPreview)
接收录制视频信号
Definition: widget.cpp:546
对场景树的ui显示进行统一的管理
Definition: HierarchyModel.h:19
void videoRecordFinish(bool RecordOrPreview)
视频录制结束信号
HierarchyModel * hierarchy
要渲染的场景
Definition: widget.h:89
void fixedUpdate()
接收时钟信号,更新帧
Definition: widget.cpp:246
表示场景树中的节点
Definition: HierarchyObject.h:27
SkyboxRenderer * skybox
天空渲染(单独处理)
Definition: widget.h:95
OpenGLFunctions * functions() const
获取含有OpenGL各种函数的对象
Definition: widget.cpp:84
HierarchyObject * handleObj
局部坐标轴节点(单独处理)
Definition: widget.h:98
float currentTrailTime
当前播放的路径进度
Definition: widget.h:103
std::map< QString, QOpenGLShaderProgram * > shaders
储存加载好的shader
Definition: widget.h:86
void drag_signal(QString re_path)
实现拖拽的信号函数
OpenGL渲染窗口
Definition: widget.h:74
Widget * widget
对应的widget
Definition: HierarchyModel.h:36
void setHierarchy(HierarchyModel *hierarchy)
将场景管理器绑定到此渲染窗口
Definition: widget.h:114
void videoSaveFinish()
视频保存结束信号
void onSaveVideo1Widget(QString savePath)
接收保存视频信号
Definition: widget.cpp:555
Definition: Trail.h:11
std::vector< QPixmap > video
储存视频录制结果
Definition: widget.h:111
void onTransformEdited(HierarchyObject *obj)
发送用户鼠标编辑物体信号