From cf5baa0684f87d54c51c70f437cef841807df6b8 Mon Sep 17 00:00:00 2001 From: Digital Artifex <7929434+DigitalArtifex@users.noreply.github.com> Date: Tue, 25 Aug 2026 11:00:04 -0400 Subject: [PATCH] Cleanup unused assets and finished comments --- KomplexHubPlugin/packcompiler.cpp | 62 ++------ KomplexHubPlugin/packcompiler.h | 229 ++++++++++++++++++++++++++---- 2 files changed, 214 insertions(+), 77 deletions(-) diff --git a/KomplexHubPlugin/packcompiler.cpp b/KomplexHubPlugin/packcompiler.cpp index f9cbe24..24ca72c 100644 --- a/KomplexHubPlugin/packcompiler.cpp +++ b/KomplexHubPlugin/packcompiler.cpp @@ -24,17 +24,17 @@ PackCompiler::PackCompiler(QObject *parent) auto PackCompiler::reset() -> void { - setError({}, {}); setProgress(std::numeric_limits::infinity()); setTotalSteps(0); setCurrentStep(0); - setCompilerOutput({}); - setStatus({}); setState(Idle); } auto PackCompiler::build(const QUrl &uri) -> QUrl { + setState(Compiling); + setStatus(QStringLiteral("Preparing Komplex Pack For Building")); + BuildContext *context = new BuildContext; QUrl extractedUri = extract(uri); @@ -42,6 +42,8 @@ auto PackCompiler::build(const QUrl &uri) -> QUrl context->commonData = loadCommonData(extractedUri); processShaders(extractedUri, context); + setState(Complete); + setStatus(QStringLiteral("Complete")); delete context; return extractedUri; @@ -50,6 +52,7 @@ auto PackCompiler::build(const QUrl &uri) -> QUrl auto PackCompiler::extract(const QUrl &sourceUri) noexcept(false) -> const QUrl { validateUri(sourceUri); + setStatus(QStringLiteral("Extracting Komplex Pack")); QFileInfo info(sourceUri.toLocalFile()); @@ -77,7 +80,6 @@ auto PackCompiler::extract(const QUrl &sourceUri) noexcept(false) -> const QUrl } run(QStringLiteral("tar"), arguments); - QFile::remove(sourceUri.toLocalFile()); return std::move(outputUri); @@ -101,6 +103,7 @@ auto PackCompiler::validatePack(const QUrl &uri) const noexcept(false) -> void auto PackCompiler::loadCommonData(const QUrl &uri) -> QMap { validateUri(uri); + setStatus(QStringLiteral("Loading Common Data")); QMap commonData; @@ -166,18 +169,21 @@ auto PackCompiler::processShaders(const QUrl &uri, BuildContext *context) -> voi const QStringList entries = shaderDirectory.entryList(); + setTotalSteps(entries.count()); + setProgress(0); + for(const QString &entry : entries) { QFileInfo entryInfo(shaderDirectory.absoluteFilePath(entry)); - QByteArray shaderData; QUrl entryUri = QStringLiteral("file://%1").arg ( entryInfo.absoluteFilePath() ); - shaderData += readFile(entryUri); + setStatus(QStringLiteral("Compiling: %1").arg(entry)); QShader::Stage stage = getStageFromSuffix(entryInfo.suffix()); + QByteArray shaderData = readFile(entryUri); appendCommonData(&shaderData, entryInfo.suffix().toUtf8(), context); replaceUniformVariables(&shaderData); @@ -195,6 +201,7 @@ auto PackCompiler::processShaders(const QUrl &uri, BuildContext *context) -> voi save(outputUri, shader); QFile::remove(entryUri.toLocalFile()); + incrementCompileStep(); } } @@ -237,13 +244,6 @@ auto PackCompiler::compile(const QByteArray &data, const QString &filename, cons if(!shader.isValid()) { - QUrl errorUri - ( - QStringLiteral("file://tmp/_err") - ); - - writeFile(errorUri, data); - throw shader::logic_error ( std::string("Compiler Error"), @@ -541,42 +541,6 @@ auto PackCompiler::setProgress(qreal progress) -> void Q_EMIT progressChanged(); } -void PackCompiler::setCompilerOutput(const QString &compilerOutput) -{ - if (m_compilerOutput == compilerOutput) - { - return; - } - - m_compilerOutput = compilerOutput; - emit compilerOutputChanged(); -} - -auto PackCompiler::setError(const QString &title, const QString &message, const QUrl &uri) -> void -{ - if(title == m_errorTitle && message == m_errorMessage) - { - return; - } - - m_errorMessage = std::move(message); - m_errorTitle = std::move(title); - - if(uri.isValid() && uri.isLocalFile()) - { - QFile errorFile(uri.toLocalFile()); - - if(errorFile.open(QFile::ReadWrite | QFile::Append)) - { - errorFile.write(message.toLocal8Bit() + QByteArray("\n")); - } - } - - Q_EMIT errorTitleChanged(); - Q_EMIT errorMessageChanged(); - Q_EMIT errorOcurred(); -} - auto PackCompiler::setState(State state) -> void { if(state == m_state) diff --git a/KomplexHubPlugin/packcompiler.h b/KomplexHubPlugin/packcompiler.h index 0e37d66..5130ed2 100644 --- a/KomplexHubPlugin/packcompiler.h +++ b/KomplexHubPlugin/packcompiler.h @@ -59,7 +59,6 @@ struct KOMPLEX_EXPORT BuildContext { QMap commonData; - QPromise promise; }; /** @@ -83,6 +82,10 @@ class PackCompiler : public QObject Q_OBJECT public: + /** + * @brief The State enum + * Enum of the possible states of the compiler + */ enum State { Idle, @@ -94,23 +97,59 @@ public: explicit PackCompiler(QObject *parent = nullptr); - auto compilerOutput() const -> const QString & { return m_compilerOutput; } + /** + * @brief progress + * Current compiler progress + * @return + */ auto progress() -> qreal { return m_progress; } + + /** + * @brief currentStep + * Current compiler step + * @return + */ auto currentStep() -> qint64 { return m_currentStep; } + + /** + * @brief totalSteps + * Total steps in the current compile + * @return + */ auto totalSteps() -> qint64 { return m_totalSteps; } - auto errorTitle() const -> const QString & { return m_errorTitle; } - auto errorMessage() const -> const QString & { return m_errorMessage; } + + /** + * @brief status + * Current status message + * @return + */ auto status() const -> const QString & { return m_status; } + + /** + * @brief state + * Current compiler state + * @return + */ auto state() const -> State { return m_state; } + + /** + * @brief reset + * Resets the compiler state + */ auto reset() -> void; + /** + * @brief build + * Builds a Komplex pack from a tar.gz file + * @param uri + * Uri of the tar.gz + * @return + * Uri of the built pack + */ auto build(const QUrl &uri) -> QUrl; signals: auto compilerOutputChanged() -> void; - auto errorOcurred() -> void; - auto errorTitleChanged() -> void; - auto errorMessageChanged() -> void; auto stateChanged() -> void; auto progressChanged() -> void; auto currentStepChanged() -> void; @@ -230,36 +269,161 @@ private: auto compile(const QByteArray &data, const QString &filename, const QShader::Stage stage) noexcept(false) -> QShader; //[13] + /** + * @brief save + * Saves a serialized version of the shader to the specified uri + * @param uri + * Uri of the file to create + * @param shader + * The compiled shader + */ auto save(const QUrl &uri, const QShader &shader) noexcept(false) -> void; - //helpers +//@BEGIN helpers + /** + * @brief validateUri + * Validates that the uri is a local file or direcotry + * @param uri + */ auto validateUri(const QUrl &uri) const noexcept(false) -> void; + + /** + * @brief run + * Runs the supplied command with the given arguments as a QProcess. If + * data is supplied, it is written to the standard input channel after the + * process has started + * @param command + * System command or program to run + * @param arguments + * QStringList of the given arguments. Minimal wildcard expansion available. + * @param data + * Optional data to write + * @return + * Standard non-error output + */ auto run(const QString &command, const QStringList &arguments, const QByteArray &data = {}) noexcept(false) -> QByteArray; + + /** + * @brief readFile + * Reads the file at the given uri and returns its data + * @param uri + * Uri of the file + * @return + * File contents + */ auto readFile(const QUrl &uri) noexcept(false) -> QByteArray; + + /** + * @brief writeFile + * Writes the supplied data to the given uri + * @param uri + * Uri of the file + * @param data + * Data to write + */ auto writeFile(const QUrl &uri, const QByteArray &data) noexcept(false) -> void; + + /** + * @brief copyFile + * Copys file to new uri + * @param sourceUri + * File to copy + * @param destinationUri + * New file location/name + */ auto copyFile(const QUrl &sourceUri, const QUrl &destinationUri) noexcept(false) -> void; + + /** + * @brief createDirectory + * QDir::mkpath was failing, so this helper function calls mkdir -p + * @param uri + * Directory path to create + */ auto createDirectory(const QUrl &uri) noexcept(false) -> void; + + /** + * @brief removeDirectory + * Calls rm -rf, but should be replaced with an agnostic solution + * @param uri + * Directory to remove + */ auto removeDirectory(const QUrl &uri) noexcept(false) -> void; + + /** + * @brief getStageFromSuffix + * Supplies the stage/type of shader based on the shaders file extension + * @param suffix + * @return + */ auto getStageFromSuffix(const QString &suffix) const -> QShader::Stage; - auto setError(const QString &title, const QString &message, const QUrl &uri = {}) -> void; - auto setCompilerOutput(const QString &compilerOutput) -> void; + /** + * @brief setState + * Sets the current state of the compiler + * @param state + */ auto setState(State state) -> void; + + /** + * @brief setProgress + * Sets the current progress of the compiler + * @param progress + */ auto setProgress(qreal progress) -> void; + + /** + * @brief setTotalSteps + * Sets the total steps pack will take to build + * @param steps + */ auto setTotalSteps(qint64 steps) -> void; + + /** + * @brief setCurrentStep + * Sets the current step + * @param step + */ auto setCurrentStep(qint64 step) -> void; + + /** + * @brief setStatus + * Sets the current status message + * @param status + */ auto setStatus(const QString &status) -> void; + + /** + * @brief incrementCompileStep + * Increments the current step and updates progress + */ auto incrementCompileStep() -> void; +//@END helpers + #ifdef HAS_VULKAN + /** + * @brief vulkanVersion + * Returns the current version reported by the vulkan api + * @return + */ auto vulkanVersion() const -> qint32; #endif #ifdef HAS_OPENGL + /** + * @brief openGlVersion + * Returns the current version reported by the opengl api + * @return + */ auto openGlVersion() const -> qint32; #endif //members + /** + * @brief m_updateVariables + * Standard variables expected by most online shaders, mainly + * shadertoy and similar. + */ static inline const QStringList m_updateVariables { QStringLiteral("iTime"), @@ -275,6 +439,16 @@ private: QStringLiteral("iChannelResolution") }; + /** + * @brief m_variableExpressions + * Regular expressions of standardized variables. Built at runtime + */ + static inline QList m_variableExpressions; + + /** + * @brief m_shaderNameFilters + * Name filters for supported shader types + */ static inline const QStringList m_shaderNameFilters { QStringLiteral("*.frag"), @@ -286,6 +460,10 @@ private: QStringLiteral("*.glsl") }; + /** + * @brief m_shaderStages + * Map of supported file suffix to their QShader::Stage + */ static inline const QMap m_shaderStages { { @@ -314,11 +492,19 @@ private: } }; + /** + * @brief m_version + * Version to be appended to the shader before build + */ static inline const QByteArray m_version { R"(#version 450)" }; + /** + * @brief m_header + * Header to be appended to the shader before build + */ static inline const QByteArray m_header { R"(layout(location = 0) in vec2 qt_TexCoord0; @@ -348,6 +534,10 @@ layout(binding = 4) uniform sampler2D iChannel3; vec2 fragCoord = vec2(qt_TexCoord0.x, 1.0 - qt_TexCoord0.y) * ubuf.iResolution.xy;)" }; + /** + * @brief m_footer + * Footer to be appended to the shader before build + */ static inline const QByteArray m_footer { R"( @@ -358,29 +548,12 @@ void main() { })" }; - QMap m_commonData; - QMap m_shaders; - - QString m_compilerOutput; - QString m_errorMessage; - QString m_errorTitle; - QString m_status; - State m_state; - qreal m_currentStep = 0; qreal m_progress = 0; qreal m_totalSteps = 0; + QString m_status; - QMutex m_downloadMutex; - - QFuture m_buildFuture; - - static inline QList m_variableExpressions; - - Q_PROPERTY(QString compilerOutput READ compilerOutput WRITE setCompilerOutput NOTIFY compilerOutputChanged FINAL) - Q_PROPERTY(QString errorTitle READ errorTitle NOTIFY errorTitleChanged FINAL) - Q_PROPERTY(QString errorMessage READ errorMessage NOTIFY errorMessageChanged FINAL) Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged FINAL) Q_PROPERTY(qint64 totalSteps READ totalSteps NOTIFY totalStepsChanged FINAL) Q_PROPERTY(qint64 currentStep READ currentStep NOTIFY currentStepChanged FINAL)