Revision control

Copy as Markdown

// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
// Qt-Security score:significant reason:default
#ifndef QSSGREFLECTIONPROBE_H
#define QSSGREFLECTIONPROBE_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtQuick3D/private/qquick3dnode_p.h>
#include <QtQuick3D/private/qquick3dgeometry_p.h>
#include <QtQuick3D/private/qquick3dmodel_p.h>
#include <QtQuick3D/private/qquick3ddefaultmaterial_p.h>
#include <QtQuick3D/private/qquick3dviewport_p.h>
#include <QtQuick3D/private/qquick3dcubemaptexture_p.h>
#include <QColor>
QT_BEGIN_NAMESPACE
class Q_QUICK3D_EXPORT QQuick3DReflectionProbe : public QQuick3DNode
{
Q_OBJECT
Q_PROPERTY(ReflectionQuality quality READ quality WRITE setQuality NOTIFY qualityChanged)
Q_PROPERTY(QColor clearColor READ clearColor WRITE setClearColor NOTIFY clearColorChanged)
Q_PROPERTY(ReflectionRefreshMode refreshMode READ refreshMode WRITE setRefreshMode NOTIFY refreshModeChanged)
Q_PROPERTY(ReflectionTimeSlicing timeSlicing READ timeSlicing WRITE setTimeSlicing NOTIFY timeSlicingChanged)
Q_PROPERTY(bool parallaxCorrection READ parallaxCorrection WRITE setParallaxCorrection NOTIFY parallaxCorrectionChanged)
Q_PROPERTY(QVector3D boxSize READ boxSize WRITE setBoxSize NOTIFY boxSizeChanged)
Q_PROPERTY(QVector3D boxOffset READ boxOffset WRITE setBoxOffset NOTIFY boxOffsetChanged REVISION(6, 4))
Q_PROPERTY(bool debugView READ debugView WRITE setDebugView NOTIFY debugViewChanged REVISION(6, 4))
Q_PROPERTY(QQuick3DCubeMapTexture *texture READ texture WRITE setTexture NOTIFY textureChanged REVISION(6, 5))
QML_NAMED_ELEMENT(ReflectionProbe)
QML_ADDED_IN_VERSION(6, 3)
public:
enum class ReflectionQuality {
VeryLow,
Low,
Medium,
High,
VeryHigh
};
Q_ENUM(ReflectionQuality)
enum class ReflectionRefreshMode {
FirstFrame,
EveryFrame
};
Q_ENUM(ReflectionRefreshMode)
enum class ReflectionTimeSlicing {
None,
AllFacesAtOnce,
IndividualFaces,
};
Q_ENUM(ReflectionTimeSlicing)
explicit QQuick3DReflectionProbe(QQuick3DNode *parent = nullptr);
~QQuick3DReflectionProbe() override { }
ReflectionQuality quality() const;
QColor clearColor() const;
ReflectionRefreshMode refreshMode() const;
ReflectionTimeSlicing timeSlicing() const;
bool parallaxCorrection() const;
QVector3D boxSize() const;
Q_REVISION(6, 4) bool debugView() const;
Q_REVISION(6, 4) QVector3D boxOffset() const;
Q_REVISION(6, 4) Q_INVOKABLE void scheduleUpdate();
Q_REVISION(6, 5) QQuick3DCubeMapTexture *texture() const;
public Q_SLOTS:
void setQuality(ReflectionQuality reflectionQuality);
void setClearColor(const QColor &clearColor);
void setRefreshMode(ReflectionRefreshMode newRefreshMode);
void setTimeSlicing(ReflectionTimeSlicing newTimeSlicing);
void setParallaxCorrection(bool parallaxCorrection);
void setBoxSize(const QVector3D &newBoxSize);
Q_REVISION(6, 4) void setDebugView(bool debugView);
Q_REVISION(6, 4) void setBoxOffset(const QVector3D &boxOffset);
Q_REVISION(6, 5) void setTexture(QQuick3DCubeMapTexture *newTexture);
Q_SIGNALS:
void qualityChanged();
void clearColorChanged();
void refreshModeChanged();
void timeSlicingChanged();
void parallaxCorrectionChanged();
void boxSizeChanged();
Q_REVISION(6, 4) void debugViewChanged();
Q_REVISION(6, 4) void boxOffsetChanged();
Q_REVISION(6, 5) void textureChanged();
protected:
QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
void markAllDirty() override;
void itemChange(ItemChange, const ItemChangeData &) override;
enum class DirtyFlag {
QualityDirty = (1 << 0),
ClearColorDirty = (1 << 1),
RefreshModeDirty = (1 << 2),
ParallaxCorrectionDirty = (1 << 3),
BoxDirty = (1 << 4),
TimeSlicingDirty = (1 << 5),
TextureDirty = (1 << 6)
};
Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
static constexpr DirtyFlags AllDirty = DirtyFlags(DirtyFlag::QualityDirty)
| DirtyFlags(DirtyFlag::ClearColorDirty)
| DirtyFlags(DirtyFlag::RefreshModeDirty)
| DirtyFlags(DirtyFlag::ParallaxCorrectionDirty)
| DirtyFlags(DirtyFlag::BoxDirty)
| DirtyFlags(DirtyFlag::TimeSlicingDirty)
| DirtyFlags(DirtyFlag::TextureDirty);
DirtyFlags m_dirtyFlags = QQuick3DReflectionProbe::AllDirty;
private:
quint32 mapToReflectionResolution(ReflectionQuality quality);
void findSceneView();
void createDebugView();
void updateDebugView();
void updateSceneManager(QQuick3DSceneManager *window);
ReflectionQuality m_quality = ReflectionQuality::Low;
QColor m_clearColor = Qt::transparent;
ReflectionRefreshMode m_refreshMode = ReflectionRefreshMode::EveryFrame;
bool m_parallaxCorrection = false;
QVector3D m_boxSize = QVector3D(0, 0, 0);
ReflectionTimeSlicing m_timeSlicing = ReflectionTimeSlicing::None;
bool m_debugView = false;
// These objects are used to visualize the reflection probe box.
QQuick3DGeometry *m_debugViewGeometry = nullptr;
QQuick3DModel *m_debugViewModel = nullptr;
QQuick3DDefaultMaterial *m_debugViewMaterial = nullptr;
QVector3D m_boxOffset;
QQuick3DViewport* m_sceneView = nullptr;
QQuick3DCubeMapTexture *m_texture = nullptr;
};
QT_END_NAMESPACE
#endif // QSSGREFLECTIONPROBE_H