diff --git a/FinalProject/FinalProject.vcxproj b/FinalProject/FinalProject.vcxproj index 48f579f..f3f0de1 100644 --- a/FinalProject/FinalProject.vcxproj +++ b/FinalProject/FinalProject.vcxproj @@ -115,12 +115,13 @@ + - + @@ -148,15 +149,16 @@ - + + - - + + diff --git a/FinalProject/FinalProject.vcxproj.filters b/FinalProject/FinalProject.vcxproj.filters index 8b472f3..7638a20 100644 --- a/FinalProject/FinalProject.vcxproj.filters +++ b/FinalProject/FinalProject.vcxproj.filters @@ -59,6 +59,24 @@ {1351d841-7665-48d3-9850-da0738823396} + + {5e6e1e89-1c77-4a89-92cc-d64ea2546961} + + + {d2b9abbc-ef10-4990-96a1-a88f9c217dcf} + + + {d6a38868-baed-45d5-9cbf-3faa3b563fa9} + + + {4b5e61f5-3dfe-44d7-bfcc-cf5b70528b16} + + + {995296ff-ac0c-4996-9692-c0e017e5fc03} + + + {6c5ac0df-26ad-40ad-860c-3d0372b81094} + @@ -108,25 +126,13 @@ Source Files\Qt Widgets\Pages\Scene Editor - - Source Files\Qt Widgets\Pages\Scene Editor - - - Source Files\Qt Widgets\Pages\Scene Editor - - - Source Files\Qt Widgets\Pages\Scene Editor - - - Source Files\Qt Widgets\Pages\Scene Editor - Source Files\Qt Widgets\GUI Components Source Files\Qt Widgets\GUI Components - + Source Files\Qt Widgets\GUI Components @@ -144,6 +150,21 @@ Source Files\Qt Widgets\GUI Components + + Source Files\Qt Widgets\Pages\Scene Editor\Object Selector + + + Source Files\Qt Widgets\Pages\Scene Editor\Object Selector + + + Source Files\Qt Widgets\Pages\Scene Editor\Object Setter + + + Source Files\Qt Widgets\Pages\Scene Editor\Scene Viewer + + + Source Files\Qt Widgets\Pages\Scene Editor\Object Selector + @@ -182,26 +203,14 @@ Header Files\Utils - - Header Files\Qt Widgets\Pages\Scene Editor - - Header Files\Qt Widgets\Pages\Scene Editor - - - Header Files\Qt Widgets\Pages\Scene Editor - - - Header Files\Qt Widgets\GUI Components + Header Files\Qt Widgets\Pages\Scene Editor\Object Setter Header Files\Qt Widgets - - Header Files\Qt Widgets\Pages\Scene Editor - Header Files\Qt Widgets\GUI Components @@ -226,6 +235,21 @@ Header Files\Qt Widgets\GUI Components + + Header Files\Qt Widgets\GUI Components + + + Header Files\Qt Widgets\Pages\Scene Editor\Scene Viewer + + + Header Files\Qt Widgets\Pages\Scene Editor\Object Selector + + + Header Files\Qt Widgets\Pages\Scene Editor\Object Selector + + + Header Files\Qt Widgets\Pages\Scene Editor\Object Selector + diff --git a/FinalProject/editorpage.cpp b/FinalProject/editorpage.cpp index 94ae9df..a10bc68 100644 --- a/FinalProject/editorpage.cpp +++ b/FinalProject/editorpage.cpp @@ -31,6 +31,11 @@ EditorPage::EditorPage(QWidget* parent) : _mainWidget->setLayout(_mainLayout); _titleLayout->addWidget(_mainWidget); _mainWidget->show(); + + // Generate model selector + _modelSelector = new ModelSelector(_mainWidget); + _mainLayout->addWidget(_modelSelector); + _modelSelector->show(); // Generate scene viewer _sceneViewerContainer = new RoundedCornerWidget(_mainWidget); diff --git a/FinalProject/editorpage.h b/FinalProject/editorpage.h index ac2a645..acf41cf 100644 --- a/FinalProject/editorpage.h +++ b/FinalProject/editorpage.h @@ -7,6 +7,7 @@ #include "pagewidget.h" #include "sceneviewer.h" #include "roundedcornerwidget.h" +#include "modelselector.h" class EditorPage : public PageWidget { @@ -32,6 +33,8 @@ private: QWidget* _mainWidget = nullptr; QHBoxLayout* _mainLayout = nullptr; + ModelSelector* _modelSelector = nullptr; + RoundedCornerWidget* _sceneViewerContainer = nullptr; QVBoxLayout* _sceneViewerContainerLayout = nullptr; SceneViewer* _sceneViewer = nullptr; diff --git a/FinalProject/framelesswindow.cpp b/FinalProject/framelesswindow.cpp index 8bcfbc0..bd77c39 100644 --- a/FinalProject/framelesswindow.cpp +++ b/FinalProject/framelesswindow.cpp @@ -13,6 +13,7 @@ FramelessWindow::FramelessWindow(int cornerRadius, unsigned int attributes, QWid { setAttribute(Qt::WA_TranslucentBackground); setWindowFlags(Qt::FramelessWindowHint); + setFocusPolicy(Qt::StrongFocus); setMouseTracking(true); setFocus(); @@ -27,7 +28,7 @@ FramelessWindow::FramelessWindow(int cornerRadius, unsigned int attributes, QWid setLayout(_stretchLayout); // Set style sheet for window widget - QString windowWidgetStyleSheet = "QWidget#windowWidget{background-color:" + _backgroundColor.name() + ";border-radius:" + QString::number(_cornerRadius) + "px;}"; + QString windowWidgetStyleSheet = "QWidget#windowWidget{background-color:" + _backgroundColor.name(QColor::HexArgb) + ";border-radius:" + QString::number(_cornerRadius) + "px;}"; _windowWidget->setStyleSheet(windowWidgetStyleSheet); // Set shadow for window widget @@ -119,7 +120,7 @@ void FramelessWindow::initializeWindowUI() { _windowBorder = new QWidget(this); _windowBorder->setObjectName("windowBorder"); QString windowBorderStyleSheet = - "QWidget#windowBorder{background-color:#00FFFFFF;border:1.5px solid " + _borderColor.name() + ";border-radius:" + QString::number(_cornerRadius) + "px;}"; + "QWidget#windowBorder{background-color:#00FFFFFF;border:1.5px solid " + _borderColor.name(QColor::HexArgb) + ";border-radius:" + QString::number(_cornerRadius) + "px;}"; _windowBorder->setStyleSheet(windowBorderStyleSheet); _windowBorder->setAttribute(Qt::WA_TransparentForMouseEvents); _windowBorder->move(_windowWidget->pos() - QPoint(1, 1)); @@ -170,7 +171,7 @@ void FramelessWindow::controlWindowScale() { _windowShadow->setEnabled(false); _windowBorder->hide(); - QString windowWidgetStyleSheet = "QWidget#windowWidget{background-color:" + _backgroundColor.name() + ";}"; + QString windowWidgetStyleSheet = "QWidget#windowWidget{background-color:" + _backgroundColor.name(QColor::HexArgb) + ";}"; _windowWidget->setStyleSheet(windowWidgetStyleSheet); _stretchLayout->setContentsMargins(0, 0, 0, 0); @@ -194,7 +195,7 @@ void FramelessWindow::controlWindowScale() { _windowShadow->setEnabled(true); _windowBorder->show(); - QString windowWidgetStyleSheet = "QWidget#windowWidget{background-color:" + _backgroundColor.name() + ";border-radius:" + QString::number(_cornerRadius) + "px;}"; + QString windowWidgetStyleSheet = "QWidget#windowWidget{background-color:" + _backgroundColor.name(QColor::HexArgb) + ";border-radius:" + QString::number(_cornerRadius) + "px;}"; _windowWidget->setStyleSheet(windowWidgetStyleSheet); QPainterPath path; diff --git a/FinalProject/model.cpp b/FinalProject/model.cpp index 1809c28..db5f75a 100644 --- a/FinalProject/model.cpp +++ b/FinalProject/model.cpp @@ -13,6 +13,13 @@ Model::~Model() { // TODO: Maybe delete all meshes? } +Model::Model(std::vector&& meshes, std::vector&& textures, std::string directory) { + _meshes = std::move(meshes); + _texturesLoaded = std::move(textures); + _directory = directory; + _status = LOADED; +} + // file path is ...\\...\\.obj, and processnode & processmesh have been called here void Model::loadModel(std::string path) { Logger::info("Loading model from path: " + path); @@ -177,3 +184,25 @@ void Model::render(const ShaderProgram& shader) const { _meshes[i].render(shader); } } + +Model* Model::copyToCurrentContext() const { + // Reload all textures + std::vector newTextures; + for (unsigned int i = 0; i < _texturesLoaded.size(); i++) { + // Load texture + Texture newTexture = Texture(_texturesLoaded[i].type(), _directory + '/' + _texturesLoaded[i].path()); + newTextures.push_back(newTexture); + } + + // Copy all meshes + std::vector newMeshes; + for (unsigned int i = 0; i < _meshes.size(); i++) { + // Copy mesh + Mesh newMesh = Mesh(_meshes[i].vertices(), _meshes[i].indices(), newTextures); + newMeshes.push_back(newMesh); + } + + // Create new model + Model* newModel = new Model(std::move(newMeshes), std::move(newTextures), _directory); + return newModel; +} diff --git a/FinalProject/model.h b/FinalProject/model.h index 2e319d2..5b86343 100644 --- a/FinalProject/model.h +++ b/FinalProject/model.h @@ -23,8 +23,16 @@ public: Model(std::string path); ~Model(); +private: + Model(std::vector&& meshes, std::vector&& textures, std::string directory); + public: inline MODELSTATUS status() const { return _status; } + inline int meshCount() const { return _meshes.size(); } + inline int textureCount() const { return _texturesLoaded.size(); } + inline std::string directory() const { return _directory; } + + Model* copyToCurrentContext() const; private: void loadModel(std::string path); diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index 98198f8..ede88ab 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include "vbo.h" #include "vao.h" @@ -66,11 +65,6 @@ void SceneViewer::initializeGL() { _shaderProgram.attachShader(fragmentShader); vertexShader.dispose(); fragmentShader.dispose(); - - Model* backpackModel = new Model("E:\\Repositories\\CollegeProjects\\CGAssignments\\FinalProject\\Models\\backpack\\backpack.obj"); - Logger::info("Model loaded"); - Renderable backpack(backpackModel); - _objects.push_back(backpack); _camera.setPosition(glm::vec3(0.0f, 0.0f, 10.0f)); }