Qt Quick 3D - Volumetric Rendering Example
// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #ifndef VOLUMETEXTUREDATA_H #define VOLUMETEXTUREDATA_H #include "qthread.h" #include <QMutex> #include <QtQuick3D/QQuick3DTextureData> #include <QtQml/QQmlEngine> #include <QtGui/QColor> #include <QtCore/QByteArray> #include <QUrl> #include <QVector3D> class VolumeTextureData : public QQuick3DTextureData { Q_OBJECT QML_ELEMENT public: struct AsyncLoaderData { QUrl source; qsizetype width = 0; qsizetype height = 0; qsizetype depth = 0; QString dataType; QByteArray volumeData = {}; bool success = false; }; VolumeTextureData(); ~VolumeTextureData(); Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(qsizetype width READ width WRITE setWidth NOTIFY widthChanged FINAL) Q_PROPERTY(qsizetype height READ height WRITE setHeight NOTIFY heightChanged FINAL) Q_PROPERTY(qsizetype depth READ depth WRITE setDepth NOTIFY depthChanged FINAL) Q_PROPERTY(QString dataType READ dataType WRITE setDataType NOTIFY dataTypeChanged FINAL) QUrl source() const; void setSource(const QUrl &newSource); qsizetype width() const; void setWidth(qsizetype newWidth); qsizetype height() const; void setHeight(qsizetype newHeight); qsizetype depth() const; void setDepth(qsizetype newDepth); QString dataType() const; void setDataType(const QString &newDataType); Q_INVOKABLE void loadAsync(QUrl source, qsizetype width, qsizetype height, qsizetype depth, QString dataType); signals: void sourceChanged(); void widthChanged(); void heightChanged(); void depthChanged(); void dataTypeChanged(); void loadSucceeded(QUrl source, qsizetype width, qsizetype height, qsizetype depth, QString dataType); void loadFailed(QUrl source, qsizetype width, qsizetype height, qsizetype depth, QString dataType); public slots: void handleResults(VolumeTextureData::AsyncLoaderData result); private: signals: void startWorker(VolumeTextureData::AsyncLoaderData data); private: void updateTextureDimensions(); void initWorker(); QUrl m_source; qsizetype m_width = 0; qsizetype m_height = 0; qsizetype m_depth = 0; qsizetype m_currentDataSize = 0; QString m_dataType; // Async variables AsyncLoaderData loaderData; bool m_isLoading = false; bool m_isAborting = false; QThread workerThread; }; #endif // VOLUMETEXTUREDATA_H