diff --git a/ArchitectureColoredPainting/src/Library/LibraryWidget.cpp b/ArchitectureColoredPainting/src/Library/LibraryWidget.cpp index 03b4fa7..41990c7 100644 --- a/ArchitectureColoredPainting/src/Library/LibraryWidget.cpp +++ b/ArchitectureColoredPainting/src/Library/LibraryWidget.cpp @@ -5,6 +5,7 @@ #include #include #include "../util/PaintingUtil.h" +#include using namespace Library; @@ -20,8 +21,6 @@ LibraryWidget::LibraryWidget(QWidget* parent) connect(ui.classComboBox, &QComboBox::textActivated, this, &LibraryWidget::onClassChanged); Renderer::PaintingRenderer::instance(); - - onClassChanged(ui.classComboBox->currentText()); } QSize LibraryWidget::getPaintingAdjustedSize(const QString& path) @@ -103,3 +102,13 @@ void Library::LibraryWidget::onClassChanged(const QString& name) loadingThread = std::jthread([this](std::stop_token stop) {loadIcons(stop); }); } + +void Library::LibraryWidget::currentTabChanged(int index) +{ + static bool firstChange = true; + if (qobject_cast(sender())->currentWidget() == this && firstChange) + { + onClassChanged(ui.classComboBox->currentText()); + firstChange = false; + } +} diff --git a/ArchitectureColoredPainting/src/Library/LibraryWidget.h b/ArchitectureColoredPainting/src/Library/LibraryWidget.h index 35681fb..f0746dc 100644 --- a/ArchitectureColoredPainting/src/Library/LibraryWidget.h +++ b/ArchitectureColoredPainting/src/Library/LibraryWidget.h @@ -29,6 +29,9 @@ namespace Library LibraryWidget(QWidget* parent = nullptr); + public slots: + void currentTabChanged(int index); + signals: void openPaintingFile(QString path); diff --git a/ArchitectureColoredPainting/src/MainWindow.cpp b/ArchitectureColoredPainting/src/MainWindow.cpp index c5f04d0..c144e7c 100644 --- a/ArchitectureColoredPainting/src/MainWindow.cpp +++ b/ArchitectureColoredPainting/src/MainWindow.cpp @@ -20,7 +20,8 @@ CentralWidget::CentralWidget(QWidget* parent) : QWidget(parent) NavigationBarWidget* navigationBarWidget = new NavigationBarWidget(this); ui.gridLayout->addWidget(navigationBarWidget, 0, 0, 1, 1, Qt::AlignTop | Qt::AlignHCenter); QObject::connect(navigationBarWidget->tabs, &QtMaterialTabs::currentChanged, ui.stackedWidget, &QStackedWidget::setCurrentIndex); - QObject::connect(ui.stackedWidget, &QStackedWidget::currentChanged, ui.rendererWidget, &Renderer::RendererWidget::currentTabChanged); + QObject::connect(ui.stackedWidget, &QStackedWidget::currentChanged, ui.rendererWidget, &Renderer::RendererWidget::currentTabChanged); + QObject::connect(ui.stackedWidget, &QStackedWidget::currentChanged, ui.libraryWidget, &Library::LibraryWidget::currentTabChanged); QObject::connect(ui.rendererWidget, &Renderer::RendererWidget::openPaintingFile, [&, navigationBarWidget](QString path) { navigationBarWidget->tabs->setCurrentTab(0); ui.stackedWidget->setCurrentWidget(ui.editorWidget); diff --git a/ArchitectureColoredPainting/src/Renderer/Light.cpp b/ArchitectureColoredPainting/src/Renderer/Light.cpp index 257d70e..1780035 100644 --- a/ArchitectureColoredPainting/src/Renderer/Light.cpp +++ b/ArchitectureColoredPainting/src/Renderer/Light.cpp @@ -5,6 +5,12 @@ Light::Light(Camera* camera) : camera(camera) //, shadowCascadeLevels{ camera->FarPlane / 25.0f, camera->FarPlane / 12.0f, camera->FarPlane / 6.0f, camera->FarPlane / 3.0f } { + updateShadowCascadeLevels(); +} + +void Renderer::Light::updateShadowCascadeLevels() +{ + shadowCascadeLevels.clear(); const float levelCount = 5; const float lambda = 0.5; for (int i = 1; i < levelCount; i++) diff --git a/ArchitectureColoredPainting/src/Renderer/Light.h b/ArchitectureColoredPainting/src/Renderer/Light.h index 4177898..679fc8b 100644 --- a/ArchitectureColoredPainting/src/Renderer/Light.h +++ b/ArchitectureColoredPainting/src/Renderer/Light.h @@ -20,6 +20,7 @@ namespace Renderer std::vector frustumSizes; Model* model = nullptr; Light(Camera* camera); + void updateShadowCascadeLevels(); std::vector getFrustumCornersWorldSpace(const QMatrix4x4& projview); std::vector getFrustumCornersWorldSpace(const QMatrix4x4& proj, const QMatrix4x4& view); QMatrix4x4 getLightSpaceMatrix(const float nearPlane, const float farPlane); diff --git a/ArchitectureColoredPainting/src/Renderer/Model.h b/ArchitectureColoredPainting/src/Renderer/Model.h index c90060f..24eb8e1 100644 --- a/ArchitectureColoredPainting/src/Renderer/Model.h +++ b/ArchitectureColoredPainting/src/Renderer/Model.h @@ -19,6 +19,8 @@ namespace Renderer std::vector AABB; + glm::vec3 minPos = glm::vec3(std::numeric_limits::max()); + glm::vec3 maxPos = glm::vec3(std::numeric_limits::min()); private: QOpenGLContext* context = nullptr; QOpenGLFunctions_4_5_Core* glFunc = nullptr; @@ -38,9 +40,7 @@ namespace Renderer QDir directory; /// 模型所在路径 QString name; /// 模型文件名 - - glm::vec3 minPos = glm::vec3(std::numeric_limits::max()); - glm::vec3 maxPos = glm::vec3(std::numeric_limits::min()); + /// 递归遍历结点 void processNode(aiNode* node, const aiScene* scene, aiMatrix4x4 mat4 = aiMatrix4x4()); diff --git a/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.cpp b/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.cpp index 35421cc..3245753 100644 --- a/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.cpp +++ b/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.cpp @@ -84,8 +84,12 @@ void RendererGLWidget::setModel(QString path) //model->loadModel("Models/Sponza/Sponza.gltf"); //model->loadModel("E:\\3D Objects\\Gate\\gltf\\Gate.gltf"); model->loadModel(path); - light.model = model; qDebug() << model->AABB; + light.model = model; + auto extent = model->maxPos - model->minPos; + camera.FarPlane = glm::sqrt(extent.x * extent.x + extent.y * extent.y + extent.z * extent.z); + camera.NearPlane = camera.FarPlane / 500.f; + light.updateShadowCascadeLevels(); doneCurrent(); } @@ -689,6 +693,10 @@ void RendererGLWidget::keyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Escape) clearFocus(); + else if (event->key() == Qt::Key_Up) + camera.MovementSpeed += 50; + else if (event->key() == Qt::Key_Down) + camera.MovementSpeed = glm::max(50.f, camera.MovementSpeed - 50); else if (!event->isAutoRepeat()) pressedKeys.insert(event->key()); QOpenGLWidget::keyPressEvent(event);