BlurringNode -> TextureFilterNode

This commit is contained in:
Uwe Rathmann 2023-12-18 09:39:17 +01:00
parent 0df5775e3e
commit 361b5d532e
4 changed files with 38 additions and 38 deletions

View File

@ -5,7 +5,7 @@
set(SOURCES set(SOURCES
Overlay.h Overlay.cpp Overlay.h Overlay.cpp
BlurringNode.h BlurringNode.cpp TextureFilterNode.h TextureFilterNode.cpp
main.cpp) main.cpp)
qt_add_resources(SOURCES images.qrc shaders.qrc) qt_add_resources(SOURCES images.qrc shaders.qrc)

View File

@ -4,7 +4,7 @@
*****************************************************************************/ *****************************************************************************/
#include "Overlay.h" #include "Overlay.h"
#include "BlurringNode.h" #include "TextureFilterNode.h"
#include <QskSkinlet.h> #include <QskSkinlet.h>
#include <QskSceneTexture.h> #include <QskSceneTexture.h>
@ -23,11 +23,11 @@ namespace
using Inherited = QskSkinlet; using Inherited = QskSkinlet;
public: public:
enum NodeRole { EffectRole, BorderRole }; enum NodeRole { FillRole, BorderRole };
Skinlet() Skinlet()
{ {
setNodeRoles( { EffectRole, BorderRole } ); setNodeRoles( { FillRole, BorderRole } );
} }
QRectF subControlRect( const QskSkinnable*, QRectF subControlRect( const QskSkinnable*,
@ -43,8 +43,8 @@ namespace
switch ( nodeRole ) switch ( nodeRole )
{ {
case EffectRole: case FillRole:
return updateClippedEffectNode( overlay, node ); return updateFillNode( overlay, node );
case BorderRole: case BorderRole:
return updateBoxNode( skinnable, node, Overlay::Panel ); return updateBoxNode( skinnable, node, Overlay::Panel );
@ -55,31 +55,31 @@ namespace
} }
private: private:
QSGNode* updateClippedEffectNode( const Overlay* overlay, QSGNode* node ) const QSGNode* updateFillNode( const Overlay* overlay, QSGNode* node ) const
{ {
/* /*
There should be a way to avoid the clip node by passing the There should be a way to avoid the clip node by passing the
vertex list directly to the effect node. TODO ... vertex list directly to the texture node. TODO ...
*/ */
using Q = Overlay; using Q = Overlay;
QSGNode* clipNode = nullptr; QSGNode* clipNode = nullptr;
QSGNode* effectNode = nullptr; QSGNode* textureNode = nullptr;
if ( node ) if ( node )
{ {
if ( node->firstChild() ) if ( node->firstChild() )
{ {
clipNode = node; clipNode = node;
effectNode = node->firstChild(); textureNode = node->firstChild();
} }
else else
{ {
effectNode = node; textureNode = node;
} }
} }
effectNode = updateEffectNode( overlay, effectNode ); textureNode = updateTextureNode( overlay, textureNode );
if ( overlay->boxShapeHint( Q::Panel ).isRectangle() ) if ( overlay->boxShapeHint( Q::Panel ).isRectangle() )
{ {
@ -91,12 +91,12 @@ namespace
clipNode = updateBoxClipNode( overlay, clipNode, Q::Panel ); clipNode = updateBoxClipNode( overlay, clipNode, Q::Panel );
} }
QskSGNode::setParentNode( effectNode, clipNode ); QskSGNode::setParentNode( textureNode, clipNode );
return clipNode ? clipNode : effectNode; return clipNode ? clipNode : textureNode;
} }
QSGNode* updateEffectNode( const Overlay* overlay, QSGNode* node ) const QSGNode* updateTextureNode( const Overlay* overlay, QSGNode* node ) const
{ {
const auto window = overlay->window(); const auto window = overlay->window();
@ -107,20 +107,20 @@ namespace
if ( rootNode == nullptr ) if ( rootNode == nullptr )
return nullptr; return nullptr;
auto effectNode = static_cast< BlurringNode* >( node ); auto textureNode = static_cast< TextureFilterNode* >( node );
if ( effectNode == nullptr ) if ( textureNode == nullptr )
{ {
auto texture = new QskSceneTexture( window ); auto texture = new QskSceneTexture( window );
QObject::connect( texture, &QskSceneTexture::updateRequested, QObject::connect( texture, &QskSceneTexture::updateRequested,
overlay, &QQuickItem::update ); overlay, &QQuickItem::update );
effectNode = new BlurringNode(); textureNode = new TextureFilterNode();
effectNode->setTexture( texture ); textureNode->setTexture( texture );
} }
{ {
auto texture = qobject_cast< QskSceneTexture* >( effectNode->texture() ); auto texture = qobject_cast< QskSceneTexture* >( textureNode->texture() );
Q_ASSERT( texture ); Q_ASSERT( texture );
texture->setFiltering( texture->setFiltering(
@ -132,10 +132,10 @@ namespace
{ {
const auto rect = overlay->subControlRect( Overlay::Panel ); const auto rect = overlay->subControlRect( Overlay::Panel );
effectNode->setRect( rect ); textureNode->setRect( rect );
} }
return effectNode; return textureNode;
} }
}; };
} }

View File

@ -3,7 +3,7 @@
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/ *****************************************************************************/
#include "BlurringNode.h" #include "TextureFilterNode.h"
#include <qsgmaterialshader.h> #include <qsgmaterialshader.h>
#include <qsgmaterial.h> #include <qsgmaterial.h>
@ -122,10 +122,10 @@ QSGMaterialShader* Material::createShader(
return new MaterialShader(); return new MaterialShader();
} }
class BlurringNodePrivate final : public QSGGeometryNodePrivate class TextureFilterNodePrivate final : public QSGGeometryNodePrivate
{ {
public: public:
BlurringNodePrivate() TextureFilterNodePrivate()
: geometry( QSGGeometry::defaultAttributes_TexturedPoint2D(), 4 ) : geometry( QSGGeometry::defaultAttributes_TexturedPoint2D(), 4 )
{ {
} }
@ -136,32 +136,32 @@ class BlurringNodePrivate final : public QSGGeometryNodePrivate
QRectF rect; QRectF rect;
}; };
BlurringNode::BlurringNode() TextureFilterNode::TextureFilterNode()
: QSGGeometryNode( *new BlurringNodePrivate ) : QSGGeometryNode( *new TextureFilterNodePrivate )
{ {
Q_D( BlurringNode ); Q_D( TextureFilterNode );
setMaterial( &d->material ); setMaterial( &d->material );
setGeometry( &d->geometry ); setGeometry( &d->geometry );
} }
BlurringNode::~BlurringNode() TextureFilterNode::~TextureFilterNode()
{ {
} }
void BlurringNode::setTexture( QSGTexture* texture ) void TextureFilterNode::setTexture( QSGTexture* texture )
{ {
d_func()->material.texture = texture; d_func()->material.texture = texture;
} }
QSGTexture* BlurringNode::texture() QSGTexture* TextureFilterNode::texture()
{ {
return d_func()->material.texture; return d_func()->material.texture;
} }
void BlurringNode::setRect( const QRectF& rect ) void TextureFilterNode::setRect( const QRectF& rect )
{ {
Q_D( BlurringNode ); Q_D( TextureFilterNode );
if ( rect != d->rect ) if ( rect != d->rect )
{ {

View File

@ -10,15 +10,15 @@
class QRect; class QRect;
class QSGTexture; class QSGTexture;
class BlurringNodePrivate; class TextureFilterNodePrivate;
class BlurringNode : public QSGGeometryNode class TextureFilterNode : public QSGGeometryNode
{ {
using Inherited = QSGGeometryNode; using Inherited = QSGGeometryNode;
public: public:
BlurringNode(); TextureFilterNode();
~BlurringNode(); ~TextureFilterNode();
void setTexture( QSGTexture* ); void setTexture( QSGTexture* );
QSGTexture* texture(); QSGTexture* texture();
@ -26,5 +26,5 @@ class BlurringNode : public QSGGeometryNode
void setRect( const QRectF& ); void setRect( const QRectF& );
private: private:
Q_DECLARE_PRIVATE( BlurringNode ) Q_DECLARE_PRIVATE( TextureFilterNode )
}; };