mirror of
https://github.com/Linloir/SceneEditor.git
synced 2025-12-17 15:38:11 +08:00
75 lines
2.3 KiB
C++
75 lines
2.3 KiB
C++
#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);
|
|
} |