added Qt Example, next change it to fit my project
This commit is contained in:
		
							
								
								
									
										32
									
								
								QtMeshViewer/Form Files/MainWindow.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								QtMeshViewer/Form Files/MainWindow.ui
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>MainWindowClass</class> | ||||
|  <widget class="QMainWindow" name="MainWindowClass"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>600</width> | ||||
|     <height>400</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>MainWindow</string> | ||||
|   </property> | ||||
|   <widget class="QWidget" name="centralWidget"/> | ||||
|   <widget class="QToolBar" name="mainToolBar"> | ||||
|    <attribute name="toolBarArea"> | ||||
|     <enum>TopToolBarArea</enum> | ||||
|    </attribute> | ||||
|    <attribute name="toolBarBreak"> | ||||
|     <bool>false</bool> | ||||
|    </attribute> | ||||
|   </widget> | ||||
|   <widget class="QStatusBar" name="statusBar"/> | ||||
|  </widget> | ||||
|  <layoutdefault spacing="6" margin="11"/> | ||||
|  <resources> | ||||
|   <include location="../Resources/Resources.qrc"/> | ||||
|  </resources> | ||||
|  <connections/> | ||||
| </ui> | ||||
							
								
								
									
										73
									
								
								QtMeshViewer/Header/GeometryEngine.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								QtMeshViewer/Header/GeometryEngine.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| /**************************************************************************** | ||||
| ** | ||||
| ** Copyright (C) 2016 The Qt Company Ltd. | ||||
| ** Contact: https://www.qt.io/licensing/ | ||||
| ** | ||||
| ** This file is part of the QtCore module of the Qt Toolkit. | ||||
| ** | ||||
| ** $QT_BEGIN_LICENSE:BSD$ | ||||
| ** Commercial License Usage | ||||
| ** Licensees holding valid commercial Qt licenses may use this file in | ||||
| ** accordance with the commercial license agreement provided with the | ||||
| ** Software or, alternatively, in accordance with the terms contained in | ||||
| ** a written agreement between you and The Qt Company. For licensing terms | ||||
| ** and conditions see https://www.qt.io/terms-conditions. For further | ||||
| ** information use the contact form at https://www.qt.io/contact-us. | ||||
| ** | ||||
| ** BSD License Usage | ||||
| ** Alternatively, you may use this file under the terms of the BSD license | ||||
| ** as follows: | ||||
| ** | ||||
| ** "Redistribution and use in source and binary forms, with or without | ||||
| ** modification, are permitted provided that the following conditions are | ||||
| ** met: | ||||
| **   * Redistributions of source code must retain the above copyright | ||||
| **     notice, this list of conditions and the following disclaimer. | ||||
| **   * Redistributions in binary form must reproduce the above copyright | ||||
| **     notice, this list of conditions and the following disclaimer in | ||||
| **     the documentation and/or other materials provided with the | ||||
| **     distribution. | ||||
| **   * Neither the name of The Qt Company Ltd nor the names of its | ||||
| **     contributors may be used to endorse or promote products derived | ||||
| **     from this software without specific prior written permission. | ||||
| ** | ||||
| ** | ||||
| ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." | ||||
| ** | ||||
| ** $QT_END_LICENSE$ | ||||
| ** | ||||
| ****************************************************************************/ | ||||
|  | ||||
| #ifndef GEOMETRYENGINE_H | ||||
| #define GEOMETRYENGINE_H | ||||
|  | ||||
| #include <QOpenGLFunctions> | ||||
| #include <QOpenGLShaderProgram> | ||||
| #include <QOpenGLBuffer> | ||||
|  | ||||
| class GeometryEngine : protected QOpenGLFunctions | ||||
| { | ||||
| public: | ||||
|     GeometryEngine(); | ||||
|     virtual ~GeometryEngine(); | ||||
|  | ||||
|     void drawCubeGeometry(QOpenGLShaderProgram *program); | ||||
|  | ||||
| private: | ||||
|     void initCubeGeometry(); | ||||
|  | ||||
|     QOpenGLBuffer arrayBuf; | ||||
|     QOpenGLBuffer indexBuf; | ||||
| }; | ||||
|  | ||||
| #endif // GEOMETRYENGINE_H | ||||
							
								
								
									
										16
									
								
								QtMeshViewer/Header/MainWindow.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								QtMeshViewer/Header/MainWindow.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <QtWidgets/QMainWindow> | ||||
| #include "ui_MainWindow.h" | ||||
|  | ||||
| class MainWindow : public QMainWindow | ||||
| { | ||||
| 	Q_OBJECT | ||||
|  | ||||
| public: | ||||
| 	MainWindow(QWidget *parent = Q_NULLPTR); | ||||
| 	~MainWindow(); | ||||
|  | ||||
| private: | ||||
| 	Ui::MainWindowClass* ui; | ||||
| }; | ||||
							
								
								
									
										50
									
								
								QtMeshViewer/Header/OglViewerWidget.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								QtMeshViewer/Header/OglViewerWidget.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "geometryengine.h" | ||||
|  | ||||
| #include <QOpenGLWidget> | ||||
| #include <QOpenGLFunctions> | ||||
| #include <QMatrix4x4> | ||||
| #include <QQuaternion> | ||||
| #include <QVector2D> | ||||
| #include <QBasicTimer> | ||||
| #include <QOpenGLShaderProgram> | ||||
| #include <QOpenGLTexture> | ||||
|  | ||||
| class GeometryEngine; | ||||
|  | ||||
| class OglViewerWidget : public QOpenGLWidget, protected QOpenGLFunctions | ||||
| { | ||||
| 	Q_OBJECT | ||||
|  | ||||
| public: | ||||
| 	explicit OglViewerWidget(QWidget *parent = 0); | ||||
| 	~OglViewerWidget(); | ||||
|  | ||||
| protected: | ||||
| 	void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE; | ||||
| 	void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE; | ||||
| 	void timerEvent(QTimerEvent *e) Q_DECL_OVERRIDE; | ||||
|  | ||||
| 	void initializeGL() Q_DECL_OVERRIDE; | ||||
| 	void resizeGL(int w, int h) Q_DECL_OVERRIDE; | ||||
| 	void paintGL() Q_DECL_OVERRIDE; | ||||
|  | ||||
| 	void initShaders(); | ||||
| 	void initTextures(); | ||||
|  | ||||
| private: | ||||
| 	QBasicTimer timer; | ||||
| 	QOpenGLShaderProgram program; | ||||
| 	GeometryEngine *geometries; | ||||
|  | ||||
| 	QOpenGLTexture *texture; | ||||
|  | ||||
| 	QMatrix4x4 projection; | ||||
|  | ||||
| 	QVector2D mousePressPosition; | ||||
| 	QVector3D rotationAxis; | ||||
| 	qreal angularSpeed; | ||||
| 	QQuaternion rotation; | ||||
| }; | ||||
|  | ||||
							
								
								
									
										9
									
								
								QtMeshViewer/Resources/Resources.qrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								QtMeshViewer/Resources/Resources.qrc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| <RCC> | ||||
|     <qresource prefix="/shaders"> | ||||
|         <file>fshader.glsl</file> | ||||
|         <file>vshader.glsl</file> | ||||
|     </qresource> | ||||
|     <qresource prefix="/images"> | ||||
|         <file>cube.png</file> | ||||
|     </qresource> | ||||
| </RCC> | ||||
							
								
								
									
										
											BIN
										
									
								
								QtMeshViewer/Resources/cube.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								QtMeshViewer/Resources/cube.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 30 KiB | 
							
								
								
									
										18
									
								
								QtMeshViewer/Resources/fshader.glsl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								QtMeshViewer/Resources/fshader.glsl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| #ifdef GL_ES | ||||
| // Set default precision to medium | ||||
| precision mediump int; | ||||
| precision mediump float; | ||||
| #endif | ||||
|  | ||||
| uniform sampler2D texture; | ||||
|  | ||||
| varying vec2 v_texcoord; | ||||
|  | ||||
| //! [0] | ||||
| void main() | ||||
| { | ||||
|     // Set fragment color from texture | ||||
|     gl_FragColor = texture2D(texture, v_texcoord); | ||||
| } | ||||
| //! [0] | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								QtMeshViewer/Resources/icon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								QtMeshViewer/Resources/icon.ico
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 264 KiB | 
							
								
								
									
										24
									
								
								QtMeshViewer/Resources/vshader.glsl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								QtMeshViewer/Resources/vshader.glsl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| #ifdef GL_ES | ||||
| // Set default precision to medium | ||||
| precision mediump int; | ||||
| precision mediump float; | ||||
| #endif | ||||
|  | ||||
| uniform mat4 mvp_matrix; | ||||
|  | ||||
| attribute vec4 a_position; | ||||
| attribute vec2 a_texcoord; | ||||
|  | ||||
| varying vec2 v_texcoord; | ||||
|  | ||||
| //! [0] | ||||
| void main() | ||||
| { | ||||
|     // Calculate vertex position in screen space | ||||
|     gl_Position = mvp_matrix * a_position; | ||||
|  | ||||
|     // Pass texture coordinate to fragment shader | ||||
|     // Value will be automatically interpolated to fragments inside polygon faces | ||||
|     v_texcoord = a_texcoord; | ||||
| } | ||||
| //! [0] | ||||
							
								
								
									
										179
									
								
								QtMeshViewer/Source/GeometryEngine.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								QtMeshViewer/Source/GeometryEngine.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,179 @@ | ||||
| /**************************************************************************** | ||||
| ** | ||||
| ** Copyright (C) 2016 The Qt Company Ltd. | ||||
| ** Contact: https://www.qt.io/licensing/ | ||||
| ** | ||||
| ** This file is part of the QtCore module of the Qt Toolkit. | ||||
| ** | ||||
| ** $QT_BEGIN_LICENSE:BSD$ | ||||
| ** Commercial License Usage | ||||
| ** Licensees holding valid commercial Qt licenses may use this file in | ||||
| ** accordance with the commercial license agreement provided with the | ||||
| ** Software or, alternatively, in accordance with the terms contained in | ||||
| ** a written agreement between you and The Qt Company. For licensing terms | ||||
| ** and conditions see https://www.qt.io/terms-conditions. For further | ||||
| ** information use the contact form at https://www.qt.io/contact-us. | ||||
| ** | ||||
| ** BSD License Usage | ||||
| ** Alternatively, you may use this file under the terms of the BSD license | ||||
| ** as follows: | ||||
| ** | ||||
| ** "Redistribution and use in source and binary forms, with or without | ||||
| ** modification, are permitted provided that the following conditions are | ||||
| ** met: | ||||
| **   * Redistributions of source code must retain the above copyright | ||||
| **     notice, this list of conditions and the following disclaimer. | ||||
| **   * Redistributions in binary form must reproduce the above copyright | ||||
| **     notice, this list of conditions and the following disclaimer in | ||||
| **     the documentation and/or other materials provided with the | ||||
| **     distribution. | ||||
| **   * Neither the name of The Qt Company Ltd nor the names of its | ||||
| **     contributors may be used to endorse or promote products derived | ||||
| **     from this software without specific prior written permission. | ||||
| ** | ||||
| ** | ||||
| ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." | ||||
| ** | ||||
| ** $QT_END_LICENSE$ | ||||
| ** | ||||
| ****************************************************************************/ | ||||
|  | ||||
| #include "..\Header\GeometryEngine.h" | ||||
|  | ||||
| #include <QVector2D> | ||||
| #include <QVector3D> | ||||
|  | ||||
| struct VertexData | ||||
| { | ||||
|     QVector3D position; | ||||
|     QVector2D texCoord; | ||||
| }; | ||||
|  | ||||
| //! [0] | ||||
| GeometryEngine::GeometryEngine() | ||||
|     : indexBuf(QOpenGLBuffer::IndexBuffer) | ||||
| { | ||||
|     initializeOpenGLFunctions(); | ||||
|  | ||||
|     // Generate 2 VBOs | ||||
|     arrayBuf.create(); | ||||
|     indexBuf.create(); | ||||
|  | ||||
|     // Initializes cube geometry and transfers it to VBOs | ||||
|     initCubeGeometry(); | ||||
| } | ||||
|  | ||||
| GeometryEngine::~GeometryEngine() | ||||
| { | ||||
|     arrayBuf.destroy(); | ||||
|     indexBuf.destroy(); | ||||
| } | ||||
| //! [0] | ||||
|  | ||||
| void GeometryEngine::initCubeGeometry() | ||||
| { | ||||
|     // For cube we would need only 8 vertices but we have to | ||||
|     // duplicate vertex for each face because texture coordinate | ||||
|     // is different. | ||||
|     VertexData vertices[] = { | ||||
|         // Vertex data for face 0 | ||||
|         {QVector3D(-1.0f, -1.0f,  1.0f), QVector2D(0.0f, 0.0f)},  // v0 | ||||
|         {QVector3D( 1.0f, -1.0f,  1.0f), QVector2D(0.33f, 0.0f)}, // v1 | ||||
|         {QVector3D(-1.0f,  1.0f,  1.0f), QVector2D(0.0f, 0.5f)},  // v2 | ||||
|         {QVector3D( 1.0f,  1.0f,  1.0f), QVector2D(0.33f, 0.5f)}, // v3 | ||||
|  | ||||
|         // Vertex data for face 1 | ||||
|         {QVector3D( 1.0f, -1.0f,  1.0f), QVector2D( 0.0f, 0.5f)}, // v4 | ||||
|         {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.33f, 0.5f)}, // v5 | ||||
|         {QVector3D( 1.0f,  1.0f,  1.0f), QVector2D(0.0f, 1.0f)},  // v6 | ||||
|         {QVector3D( 1.0f,  1.0f, -1.0f), QVector2D(0.33f, 1.0f)}, // v7 | ||||
|  | ||||
|         // Vertex data for face 2 | ||||
|         {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.5f)}, // v8 | ||||
|         {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(1.0f, 0.5f)},  // v9 | ||||
|         {QVector3D( 1.0f,  1.0f, -1.0f), QVector2D(0.66f, 1.0f)}, // v10 | ||||
|         {QVector3D(-1.0f,  1.0f, -1.0f), QVector2D(1.0f, 1.0f)},  // v11 | ||||
|  | ||||
|         // Vertex data for face 3 | ||||
|         {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.0f)}, // v12 | ||||
|         {QVector3D(-1.0f, -1.0f,  1.0f), QVector2D(1.0f, 0.0f)},  // v13 | ||||
|         {QVector3D(-1.0f,  1.0f, -1.0f), QVector2D(0.66f, 0.5f)}, // v14 | ||||
|         {QVector3D(-1.0f,  1.0f,  1.0f), QVector2D(1.0f, 0.5f)},  // v15 | ||||
|  | ||||
|         // Vertex data for face 4 | ||||
|         {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(0.33f, 0.0f)}, // v16 | ||||
|         {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.0f)}, // v17 | ||||
|         {QVector3D(-1.0f, -1.0f,  1.0f), QVector2D(0.33f, 0.5f)}, // v18 | ||||
|         {QVector3D( 1.0f, -1.0f,  1.0f), QVector2D(0.66f, 0.5f)}, // v19 | ||||
|  | ||||
|         // Vertex data for face 5 | ||||
|         {QVector3D(-1.0f,  1.0f,  1.0f), QVector2D(0.33f, 0.5f)}, // v20 | ||||
|         {QVector3D( 1.0f,  1.0f,  1.0f), QVector2D(0.66f, 0.5f)}, // v21 | ||||
|         {QVector3D(-1.0f,  1.0f, -1.0f), QVector2D(0.33f, 1.0f)}, // v22 | ||||
|         {QVector3D( 1.0f,  1.0f, -1.0f), QVector2D(0.66f, 1.0f)}  // v23 | ||||
|     }; | ||||
|  | ||||
|     // Indices for drawing cube faces using triangle strips. | ||||
|     // Triangle strips can be connected by duplicating indices | ||||
|     // between the strips. If connecting strips have opposite | ||||
|     // vertex order then last index of the first strip and first | ||||
|     // index of the second strip needs to be duplicated. If | ||||
|     // connecting strips have same vertex order then only last | ||||
|     // index of the first strip needs to be duplicated. | ||||
|     GLushort indices[] = { | ||||
|          0,  1,  2,  3,  3,     // Face 0 - triangle strip ( v0,  v1,  v2,  v3) | ||||
|          4,  4,  5,  6,  7,  7, // Face 1 - triangle strip ( v4,  v5,  v6,  v7) | ||||
|          8,  8,  9, 10, 11, 11, // Face 2 - triangle strip ( v8,  v9, v10, v11) | ||||
|         12, 12, 13, 14, 15, 15, // Face 3 - triangle strip (v12, v13, v14, v15) | ||||
|         16, 16, 17, 18, 19, 19, // Face 4 - triangle strip (v16, v17, v18, v19) | ||||
|         20, 20, 21, 22, 23      // Face 5 - triangle strip (v20, v21, v22, v23) | ||||
|     }; | ||||
|  | ||||
| //! [1] | ||||
|     // Transfer vertex data to VBO 0 | ||||
|     arrayBuf.bind(); | ||||
|     arrayBuf.allocate(vertices, 24 * sizeof(VertexData)); | ||||
|  | ||||
|     // Transfer index data to VBO 1 | ||||
|     indexBuf.bind(); | ||||
|     indexBuf.allocate(indices, 34 * sizeof(GLushort)); | ||||
| //! [1] | ||||
| } | ||||
|  | ||||
| //! [2] | ||||
| void GeometryEngine::drawCubeGeometry(QOpenGLShaderProgram *program) | ||||
| { | ||||
|     // Tell OpenGL which VBOs to use | ||||
|     arrayBuf.bind(); | ||||
|     indexBuf.bind(); | ||||
|  | ||||
|     // Offset for position | ||||
|     quintptr offset = 0; | ||||
|  | ||||
|     // Tell OpenGL programmable pipeline how to locate vertex position data | ||||
|     int vertexLocation = program->attributeLocation("a_position"); | ||||
|     program->enableAttributeArray(vertexLocation); | ||||
|     program->setAttributeBuffer(vertexLocation, GL_FLOAT, offset, 3, sizeof(VertexData)); | ||||
|  | ||||
|     // Offset for texture coordinate | ||||
|     offset += sizeof(QVector3D); | ||||
|  | ||||
|     // Tell OpenGL programmable pipeline how to locate vertex texture coordinate data | ||||
|     int texcoordLocation = program->attributeLocation("a_texcoord"); | ||||
|     program->enableAttributeArray(texcoordLocation); | ||||
|     program->setAttributeBuffer(texcoordLocation, GL_FLOAT, offset, 2, sizeof(VertexData)); | ||||
|  | ||||
|     // Draw cube geometry using indices from VBO 1 | ||||
|     glDrawElements(GL_TRIANGLE_STRIP, 34, GL_UNSIGNED_SHORT, 0); | ||||
| } | ||||
| //! [2] | ||||
							
								
								
									
										24
									
								
								QtMeshViewer/Source/MainWindow.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								QtMeshViewer/Source/MainWindow.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| #include "..\Header\MainWindow.h" | ||||
| #include "..\Header\OglViewerWidget.h" | ||||
| #include <QSurfaceFormat> | ||||
|  | ||||
| MainWindow::MainWindow(QWidget *parent) | ||||
| 	: QMainWindow(parent) | ||||
| 	, ui(new Ui::MainWindowClass) | ||||
| { | ||||
| 	ui->setupUi(this); | ||||
|  | ||||
| 	QSurfaceFormat format; | ||||
| 	format.setDepthBufferSize(24); | ||||
| 	QSurfaceFormat::setDefaultFormat(format); | ||||
|  | ||||
| 	this->setCentralWidget(new OglViewerWidget(this)); | ||||
|  | ||||
| 	ui->statusBar->showMessage("haha vbgf"); | ||||
| } | ||||
|  | ||||
|  | ||||
| MainWindow::~MainWindow() | ||||
| { | ||||
| 	delete ui; | ||||
| } | ||||
							
								
								
									
										157
									
								
								QtMeshViewer/Source/OglViewerWidget.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								QtMeshViewer/Source/OglViewerWidget.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,157 @@ | ||||
| #include "..\Header\OglViewerWidget.h" | ||||
|  | ||||
| #include <QMouseEvent> | ||||
| #include <math.h> | ||||
|  | ||||
| OglViewerWidget::OglViewerWidget(QWidget *parent) : | ||||
| 	QOpenGLWidget(parent), | ||||
| 	geometries(0), | ||||
| 	texture(0), | ||||
| 	angularSpeed(0) | ||||
| { | ||||
| } | ||||
|  | ||||
| OglViewerWidget::~OglViewerWidget() | ||||
| { | ||||
| 	// Make sure the context is current when deleting the texture | ||||
| 	// and the buffers. | ||||
| 	makeCurrent(); | ||||
| 	delete texture; | ||||
| 	delete geometries; | ||||
| 	doneCurrent(); | ||||
| } | ||||
|  | ||||
| void OglViewerWidget::mousePressEvent(QMouseEvent *e) | ||||
| { | ||||
| 	// Save mouse press position | ||||
| 	mousePressPosition = QVector2D(e->localPos()); | ||||
| } | ||||
|  | ||||
| void OglViewerWidget::mouseReleaseEvent(QMouseEvent *e) | ||||
| { | ||||
| 	// Mouse release position - mouse press position | ||||
| 	QVector2D diff = QVector2D(e->localPos()) - mousePressPosition; | ||||
|  | ||||
| 	// Rotation axis is perpendicular to the mouse position difference | ||||
| 	// vector | ||||
| 	QVector3D n = QVector3D(diff.y(), diff.x(), 0.0).normalized(); | ||||
|  | ||||
| 	// Accelerate angular speed relative to the length of the mouse sweep | ||||
| 	qreal acc = diff.length() / 100.0; | ||||
|  | ||||
| 	// Calculate new rotation axis as weighted sum | ||||
| 	rotationAxis = (rotationAxis * angularSpeed + n * acc).normalized(); | ||||
|  | ||||
| 	// Increase angular speed | ||||
| 	angularSpeed += acc; | ||||
| } | ||||
|  | ||||
| void OglViewerWidget::timerEvent(QTimerEvent *) | ||||
| { | ||||
| 	// Decrease angular speed (friction) | ||||
| 	angularSpeed *= 0.99; | ||||
|  | ||||
| 	// Stop rotation when speed goes below threshold | ||||
| 	if (angularSpeed < 0.01) { | ||||
| 		angularSpeed = 0.0; | ||||
| 	} else { | ||||
| 		// Update rotation | ||||
| 		rotation = QQuaternion::fromAxisAndAngle(rotationAxis, angularSpeed) * rotation; | ||||
|  | ||||
| 		// Request an update | ||||
| 		update(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void OglViewerWidget::initializeGL() | ||||
| { | ||||
| 	initializeOpenGLFunctions(); | ||||
|  | ||||
| 	glClearColor(0, 0, 0, 1); | ||||
|  | ||||
| 	initShaders(); | ||||
| 	initTextures(); | ||||
|  | ||||
| 	// Enable depth buffer | ||||
| 	glEnable(GL_DEPTH_TEST); | ||||
|  | ||||
| 	// Enable back face culling | ||||
| 	glEnable(GL_CULL_FACE); | ||||
|  | ||||
| 	geometries = new GeometryEngine; | ||||
|  | ||||
| 	// Use QBasicTimer because its faster than QTimer | ||||
| 	timer.start(12, this); | ||||
| } | ||||
|  | ||||
| void OglViewerWidget::initShaders() | ||||
| { | ||||
| 	// Compile vertex shader | ||||
| 	if (!program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/vshader.glsl")) | ||||
| 		close(); | ||||
|  | ||||
| 	// Compile fragment shader | ||||
| 	if (!program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/fshader.glsl")) | ||||
| 		close(); | ||||
|  | ||||
| 	// Link shader pipeline | ||||
| 	if (!program.link()) | ||||
| 		close(); | ||||
|  | ||||
| 	// Bind shader pipeline for use | ||||
| 	if (!program.bind()) | ||||
| 		close(); | ||||
| } | ||||
|  | ||||
| void OglViewerWidget::initTextures() | ||||
| { | ||||
| 	// Load cube.png image | ||||
| 	texture = new QOpenGLTexture(QImage(":images/cube.png").mirrored()); | ||||
|  | ||||
| 	// Set nearest filtering mode for texture minification | ||||
| 	texture->setMinificationFilter(QOpenGLTexture::Nearest); | ||||
|  | ||||
| 	// Set bilinear filtering mode for texture magnification | ||||
| 	texture->setMagnificationFilter(QOpenGLTexture::Linear); | ||||
|  | ||||
| 	// Wrap texture coordinates by repeating | ||||
| 	// f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2) | ||||
| 	texture->setWrapMode(QOpenGLTexture::Repeat); | ||||
| } | ||||
|  | ||||
| void OglViewerWidget::resizeGL(int w, int h) | ||||
| { | ||||
| 	// Calculate aspect ratio | ||||
| 	qreal aspect = qreal(w) / qreal(h ? h : 1); | ||||
|  | ||||
| 	// Set near plane to 3.0, far plane to 7.0, field of view 45 degrees | ||||
| 	const qreal zNear = 3.0, zFar = 7.0, fov = 45.0; | ||||
|  | ||||
| 	// Reset projection | ||||
| 	projection.setToIdentity(); | ||||
|  | ||||
| 	// Set perspective projection | ||||
| 	projection.perspective(fov, aspect, zNear, zFar); | ||||
| } | ||||
|  | ||||
| void OglViewerWidget::paintGL() | ||||
| { | ||||
| 	// Clear color and depth buffer | ||||
| 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | ||||
|  | ||||
| 	texture->bind(); | ||||
|  | ||||
| 	// Calculate model view transformation | ||||
| 	QMatrix4x4 matrix; | ||||
| 	matrix.translate(0.0, 0.0, -5.0); | ||||
| 	matrix.rotate(rotation); | ||||
|  | ||||
| 	// Set modelview-projection matrix | ||||
| 	program.setUniformValue("mvp_matrix", projection * matrix); | ||||
|  | ||||
| 	// Use texture unit 0 which contains cube.png | ||||
| 	program.setUniformValue("texture", 0); | ||||
|  | ||||
| 	// Draw cube geometry | ||||
| 	geometries->drawCubeGeometry(&program); | ||||
| } | ||||
							
								
								
									
										12
									
								
								QtMeshViewer/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								QtMeshViewer/main.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| #include "Header\MainWindow.h" | ||||
| #include <QtWidgets/QApplication> | ||||
|  | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
| 	QApplication a(argc, argv); | ||||
|  | ||||
| 	MainWindow w; | ||||
| 	w.show(); | ||||
| 	return a.exec(); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Anakin
					Anakin