mirror of
https://github.com/Linloir/SceneEditor.git
synced 2025-12-17 07:28:12 +08:00
[UI][ADD] Model thumbnail widget
This commit is contained in:
parent
5ff60b1e86
commit
d818ccd469
75
FinalProject/modelthumbnailwidget.cpp
Normal file
75
FinalProject/modelthumbnailwidget.cpp
Normal file
@ -0,0 +1,75 @@
|
||||
#include <qfile.h>
|
||||
#include <qdir.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
30
FinalProject/modelthumbnailwidget.h
Normal file
30
FinalProject/modelthumbnailwidget.h
Normal file
@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
#include <QtOpenGLWidgets/qopenglwidget.h>
|
||||
#include <qopenglfunctions.h>
|
||||
#include <qevent.h>
|
||||
|
||||
#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;
|
||||
};
|
||||
Loading…
x
Reference in New Issue
Block a user