From d818ccd4692a8bbf3c2f35b310a93c9dea88cf73 Mon Sep 17 00:00:00 2001 From: Linloir <3145078758@qq.com> Date: Sat, 17 Dec 2022 11:41:55 +0800 Subject: [PATCH] [UI][ADD] Model thumbnail widget --- FinalProject/modelthumbnailwidget.cpp | 75 +++++++++++++++++++++++++++ FinalProject/modelthumbnailwidget.h | 30 +++++++++++ 2 files changed, 105 insertions(+) create mode 100644 FinalProject/modelthumbnailwidget.cpp create mode 100644 FinalProject/modelthumbnailwidget.h diff --git a/FinalProject/modelthumbnailwidget.cpp b/FinalProject/modelthumbnailwidget.cpp new file mode 100644 index 0000000..b6e1fcf --- /dev/null +++ b/FinalProject/modelthumbnailwidget.cpp @@ -0,0 +1,75 @@ +#include +#include + +#include "modelthumbnailwidget.h" + +ModelThumbnailWidget::ModelThumbnailWidget(Model* model, QWidget* parent) : + QOpenGLWidget(parent), _model(model) +{ + // OpenGL initialize + QSurfaceFormat format; + format.setProfile(QSurfaceFormat::CoreProfile); + format.setVersion(4, 3); + setFormat(format); + + // Create a folder + QDir dir("./temp/shaders"); + if (!dir.exists()) { + dir.mkpath("."); + } + + // Copy the shaders to the folder + if (QFile::exists("./temp/shaders/vertexshader.vs")) { + QFile::remove("./temp/shaders/vertexshader.vs"); + } + QFile::copy(":/shaders/vertexshader.vs", "./temp/shaders/vertexshader.vs"); + QFile::setPermissions("./temp/shaders/vertexshader.vs", QFileDevice::ReadOwner | QFileDevice::WriteOwner); + if (QFile::exists("./temp/shaders/fragmentshader.fs")) { + QFile::remove("./temp/shaders/fragmentshader.fs"); + } + QFile::copy(":/shaders/fragmentshader.fs", "./temp/shaders/fragmentshader.fs"); + QFile::setPermissions("./temp/shaders/fragmentshader.fs", QFile::ReadOwner | QFile::WriteOwner); +} + +ModelThumbnailWidget::~ModelThumbnailWidget() { +} + +void ModelThumbnailWidget::initializeGL() { + initializeOpenGLFunctions(); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glEnable(GL_DEPTH_TEST); + + _shaderProgram.ensureInitialized(); + + VertexShader vertexShader("./temp/shaders/vertexshader.vs"); + FragmentShader fragmentShader("./temp/shaders/fragmentshader.fs"); + _shaderProgram.attachShader(vertexShader); + _shaderProgram.attachShader(fragmentShader); + vertexShader.dispose(); + fragmentShader.dispose(); + + _object.setModel(_model->copyToCurrentContext()); + _camera.setPosition(glm::vec3(0.0f, 0.0f, 7.0f)); +} + +void ModelThumbnailWidget::paintGL() { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + _shaderProgram.bind(); + + glm::mat4 view = _camera.viewMatrix(); + glm::mat4 projection = glm::perspective(glm::radians(_camera.zoomVal()), (float)width() / (float)height(), 0.1f, 100.0f); + _shaderProgram.setUniform("view", view); + _shaderProgram.setUniform("projection", projection); + + _object.render(_shaderProgram); + + _shaderProgram.unbind(); +} + +void ModelThumbnailWidget::resizeGL(int w, int h) { + glViewport(0, 0, w, h); +} \ No newline at end of file diff --git a/FinalProject/modelthumbnailwidget.h b/FinalProject/modelthumbnailwidget.h new file mode 100644 index 0000000..05377ed --- /dev/null +++ b/FinalProject/modelthumbnailwidget.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include + +#include "model.h" +#include "camera.h" +#include "shader.h" +#include "renderable.h" + +class ModelThumbnailWidget : public QOpenGLWidget, protected QOpenGLFunctions +{ + Q_OBJECT + +public: + ModelThumbnailWidget(Model* model, QWidget* parent = 0); + ~ModelThumbnailWidget(); + +private: + Model* _model = nullptr; + Renderable _object = Renderable::empty(); + ShaderProgram _shaderProgram = ShaderProgram::empty(); + Camera _camera; + +protected: + virtual void initializeGL() override; + virtual void paintGL() override; + virtual void resizeGL(int w, int h) override; +};