/* SPDX-FileCopyrightText: 2025 Vlad Zahorodnii SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include class SplitMaterial : public QSGMaterial { public: SplitMaterial(); QSGMaterialType *type() const override; QSGMaterialShader *createShader(QSGRendererInterface::RenderMode renderMode) const override; int compare(const QSGMaterial *other) const override; QSGTexture *texture1 = nullptr; QSGTexture *texture2 = nullptr; QVector2D tilt; }; class SplitShader : public QSGMaterialShader { public: SplitShader(); bool updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override; void updateSampledImage(RenderState &state, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override; }; class SplitNode : public QObject, public QSGNode { Q_OBJECT public: explicit SplitNode(); void preprocess() override; void setFirst(QSGTextureProvider *provider); void setSecond(QSGTextureProvider *provider); void setRect(const QRectF &rect); void setShutter(qreal shutter); private: void markMaterialDirty(); QPointer m_first; QPointer m_second; QRectF m_rect; qreal m_shutter = 0.0; QSGGeometryNode m_contentNode; SplitMaterial *m_material = nullptr; }; class SoftwareSplitNode : public QObject, public QSGNode { Q_OBJECT public: explicit SoftwareSplitNode(); void preprocess() override; void setFirst(QSGTextureProvider *provider); void setSecond(QSGTextureProvider *provider); void setRect(const QRectF &rect); void setWindow(QQuickWindow *window); private: void markMaterialDirty(); QQuickWindow *m_window = nullptr; QPointer m_first; QSGImageNode *m_firstNode = nullptr; QPointer m_second; QSGImageNode *m_secondNode = nullptr; QRectF m_rect; };