#pragma once #include "blobgroup2.hpp" #include #include class BlobGroup2; 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; } virtual bool isMoving() const { return false; } virtual bool isCornerExcluded(const BlobShape2* /*other*/) const { return false; } virtual void cornerRadii(float out[4]) const; virtual void outerCornerRadii(float out[4]) const { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 0; } virtual void updatePhysics() {} virtual bool needsFrame() const { return false; } virtual void registerWithGroup(); virtual void unregisterFromGroup(); void updateCenteredDeformMatrix(); virtual void resetDeformMatrix(); BlobGroup2* m_group = nullptr; qreal m_radius = 0; QMatrix4x4 m_deformMatrix; // identity by default QMatrix4x4 m_centeredDeformMatrix; };