From a0355c9b897281d0bfea48bec9d490724ecabd96 Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Sun, 12 Apr 2026 17:54:45 -0500 Subject: Add NIF previewer plugin with Linux-specific fixes Vendored from github.com/Parapets/mo2-preview_nif and adapted for Linux: - BSA texture resolution via MO2 virtual tree with case-insensitive fallback walk (Linux FS is case-sensitive; NIFs reference textures with arbitrary case against files on disk) - Process-wide cached BSA candidate list, keyed by profile path, priority-sorted, filtering disabled mods - Path backslash normalization before loose-file lookup - Polygon offset on SLSF1_Decal-flagged shapes to break z-ties with coincident base meshes (road decals, moss overlays) - Opaque framebuffer via glColorMask alpha lock so alpha-blended shapes can't bleed the dialog background through the preview area - QMouseEvent::globalPosition().toPoint() for Qt6 compatibility Preview dialog behavior (organizercore.cpp): - Switch previewFile and previewFileWithAlternatives from stack-allocated exec() to heap + ApplicationModal + show() + WA_DeleteOnClose. - Parent passed as nullptr so preview lifetime is decoupled from the stack-allocated ModInfoDialog that spawns it. Nested exec() inside the enclosing dialog's exec() was softlocking on close. Co-Authored-By: Claude Opus 4.6 (1M context) --- libs/preview_nif/src/NifWidget.h | 71 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 libs/preview_nif/src/NifWidget.h (limited to 'libs/preview_nif/src/NifWidget.h') diff --git a/libs/preview_nif/src/NifWidget.h b/libs/preview_nif/src/NifWidget.h new file mode 100644 index 0000000..34f2de0 --- /dev/null +++ b/libs/preview_nif/src/NifWidget.h @@ -0,0 +1,71 @@ +#pragma once + +#include "Camera.h" +#include "OpenGLShape.h" +#include "ShaderManager.h" +#include "TextureManager.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +class NifWidget : public QOpenGLWidget +{ + Q_OBJECT + +public: + NifWidget( + std::shared_ptr nifFile, + MOBase::IOrganizer* organizer, + bool debugContext = false, + QWidget* parent = nullptr, + Qt::WindowFlags f = {0}); + + ~NifWidget(); + NifWidget(const NifWidget&) = delete; + NifWidget(NifWidget&&) = delete; + NifWidget& operator=(const NifWidget&) = delete; + NifWidget& operator=(NifWidget&&) = delete; + +protected: + void mousePressEvent(QMouseEvent* event) override; + void mouseMoveEvent(QMouseEvent* event) override; + void wheelEvent(QWheelEvent* event) override; + + void initializeGL() override; + void paintGL() override; + void resizeGL(int w, int h) override; + +private: + void cleanup(); + void updateCamera(); + + inline static QWeakPointer SharedCamera; + + std::shared_ptr m_NifFile; + MOBase::IOrganizer* m_MOInfo = nullptr; + + std::unique_ptr m_TextureManager; + std::unique_ptr m_ShaderManager; + + QOpenGLDebugLogger* m_Logger = nullptr; + + std::vector m_GLShapes; + + QSharedPointer m_Camera; + + QMatrix4x4 m_ViewMatrix; + QMatrix4x4 m_ProjectionMatrix; + + int m_ViewportWidth; + int m_ViewportHeight; + QPoint m_MousePos; +}; -- cgit v1.3.1