From 5c907b63da9d81d872722f51e63e3b24874954e0 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sun, 14 Apr 2024 14:09:40 -0400 Subject: [PATCH] Add a wireframe checkbox to MDLViewer --- mdlviewer/src/mainwindow.cpp | 9 +++++++++ parts/mdl/mdlpart.cpp | 10 ++++++++++ parts/mdl/mdlpart.h | 3 +++ renderer/include/renderer.hpp | 3 +++ renderer/src/renderer.cpp | 20 ++++++++++++++++++-- 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/mdlviewer/src/mainwindow.cpp b/mdlviewer/src/mainwindow.cpp index 5bd6837..201daf7 100644 --- a/mdlviewer/src/mainwindow.cpp +++ b/mdlviewer/src/mainwindow.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -46,6 +47,14 @@ MainWindow::MainWindow(GameData *data) tabWidget->setMaximumHeight(150); auto renderWidget = new QWidget(); + auto renderLayout = new QVBoxLayout(); + renderWidget->setLayout(renderLayout); + + auto wireframeCheckbox = new QCheckBox(i18n("Wireframe")); + connect(wireframeCheckbox, &QCheckBox::clicked, this, [this](bool checked) { + part->setWireframe(checked); + }); + renderLayout->addWidget(wireframeCheckbox); tabWidget->addTab(renderWidget, i18nc("@title:tab", "Render")); tabWidget->setDocumentMode(true); // hide borders diff --git a/parts/mdl/mdlpart.cpp b/parts/mdl/mdlpart.cpp index 9b0ebb1..22e9fb8 100644 --- a/parts/mdl/mdlpart.cpp +++ b/parts/mdl/mdlpart.cpp @@ -310,4 +310,14 @@ void MDLPart::removeModel(const physis_MDL &mdl) Q_EMIT modelChanged(); } +void MDLPart::setWireframe(bool wireframe) +{ + renderer->wireframe = wireframe; +} + +bool MDLPart::wireframe() const +{ + return renderer->wireframe; +} + #include "moc_mdlpart.cpp" \ No newline at end of file diff --git a/parts/mdl/mdlpart.h b/parts/mdl/mdlpart.h index eca533c..154f405 100644 --- a/parts/mdl/mdlpart.h +++ b/parts/mdl/mdlpart.h @@ -44,6 +44,9 @@ public: std::function requestUpdate; + void setWireframe(bool wireframe); + bool wireframe() const; + Q_SIGNALS: void modelChanged(); void skeletonChanged(); diff --git a/renderer/include/renderer.hpp b/renderer/include/renderer.hpp index d905dae..21bff39 100644 --- a/renderer/include/renderer.hpp +++ b/renderer/include/renderer.hpp @@ -111,7 +111,10 @@ public: VkPipeline pipeline; VkPipeline skinnedPipeline; + VkPipeline pipelineWireframe; + VkPipeline skinnedPipelineWireframe; VkPipelineLayout pipelineLayout; + bool wireframe = false; std::tuple createBuffer(size_t size, VkBufferUsageFlags usageFlags); diff --git a/renderer/src/renderer.cpp b/renderer/src/renderer.cpp index f603e48..2c5ca21 100644 --- a/renderer/src/renderer.cpp +++ b/renderer/src/renderer.cpp @@ -474,9 +474,17 @@ void Renderer::render(const std::vector &models) for (auto model : models) { if (model.skinned) { - vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedPipeline); + if (wireframe) { + vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedPipelineWireframe); + } else { + vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedPipeline); + } } else { - vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); + if (wireframe) { + vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineWireframe); + } else { + vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); + } } // copy bone data @@ -881,6 +889,14 @@ void Renderer::initPipeline() shaderStages[0] = skinnedVertexShaderStageInfo; vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &createInfo, nullptr, &skinnedPipeline); + + rasterizer.polygonMode = VK_POLYGON_MODE_LINE; + + vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &createInfo, nullptr, &skinnedPipelineWireframe); + + shaderStages[0] = vertexShaderStageInfo; + + vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &createInfo, nullptr, &pipelineWireframe); } VkShaderModule Renderer::createShaderModule(const uint32_t *code, const int length)