#pragma once #include "blobgroup2.hpp" #include #include class BlobGroup2; // Data-only shape. // // The group draws a single node for the whole group, so a shape here contributes // only what the shader needs: position, radii, exclusion, physics. A shape does // not create a render node, so no pixel can be evaluated by one shape and missed // by another. class BlobShape2 : public QQuickItem { Q_OBJECT Q_PROPERTY(BlobGroup2* group READ group WRITE setGroup NOTIFY groupChanged) Q_PROPERTY(qreal radius READ radius WRITE setRadius NOTIFY radiusChanged) Q_PROPERTY( QMatrix4x4 deformMatrix READ deformMatrix NOTIFY deformMatrixChanged) Q_PROPERTY( QMatrix4x4 rawDeformMatrix READ rawDeformMatrix NOTIFY rawDeformMatrixChanged) friend class BlobGroup2; public: explicit BlobShape2(QQuickItem* parent = nullptr); ~BlobShape2() override = default; [[nodiscard]] BlobGroup2* group() const { return m_group; } void setGroup(BlobGroup2* g); [[nodiscard]] qreal radius() const { return m_radius; } void setRadius(qreal r); [[nodiscard]] QMatrix4x4 deformMatrix() const { return m_centeredDeformMatrix; } [[nodiscard]] QMatrix4x4 rawDeformMatrix() const { return m_deformMatrix; } signals: void groupChanged(); void radiusChanged(); void deformMatrixChanged(); void rawDeformMatrixChanged(); protected: void componentComplete() override; void geometryChange( const QRectF& newGeometry, const QRectF& oldGeometry) override; virtual bool isExcluded(const BlobShape2*) const { return false; } // Whether this shape is currently pushing on a border. Only the shape that is pushing // can shape the bar edge, so this decides the source flag. virtual bool isMoving() const { return false; } virtual bool isCornerExcluded(const BlobShape2* /*other*/) const { return false; } virtual void cornerRadii(float out[4]) const; // Called by the group when it rebuilds the shared data, once per frame. virtual void updatePhysics() {} virtual void registerWithGroup(); virtual void unregisterFromGroup(); void updateCenteredDeformMatrix(); BlobGroup2* m_group = nullptr; qreal m_radius = 0; QMatrix4x4 m_deformMatrix; // identity by default QMatrix4x4 m_centeredDeformMatrix; };